111 lines
3 KiB
Nix
111 lines
3 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
|
|
# search also generates ddclient entries for all other logs
|
|
|
|
with import <stockholm/lib>;
|
|
let
|
|
#primary-itf = "eth0";
|
|
#primary-itf = "wlp2s0";
|
|
primary-itf = config.makefu.server.primary-itf;
|
|
elch-sock = "${config.services.uwsgi.runDir}/uwsgi-elch.sock";
|
|
ddclientUser = "ddclient";
|
|
sec = toString <secrets>;
|
|
nsupdate = import "${sec}/nsupdate-search.nix";
|
|
stateDir = "/var/spool/ddclient";
|
|
cfg = "${stateDir}/cfg";
|
|
ddclientPIDFile = "${stateDir}/ddclient.pid";
|
|
|
|
# TODO: correct cert generation requires a `real` internet ip address
|
|
|
|
gen-cfg = dict: ''
|
|
ssl=yes
|
|
cache=${stateDir}/ddclient.cache
|
|
pid=${ddclientPIDFile}
|
|
${concatStringsSep "\n" (mapAttrsToList (user: pass: ''
|
|
|
|
use=if, if=${primary-itf}
|
|
protocol=dyndns2, server=ipv4.nsupdate.info, login=${user}, password='${pass}' ${user}
|
|
#usev6=if, if=${primary-itf}
|
|
#protocol=dyndns2, server=ipv6.nsupdate.info, login=${user}, password='${pass}' ${user}
|
|
'') dict)}
|
|
'';
|
|
|
|
in {
|
|
users.extraUsers = singleton {
|
|
name = ddclientUser;
|
|
uid = genid "ddclient";
|
|
description = "ddclient daemon user";
|
|
home = stateDir;
|
|
createHome = true;
|
|
};
|
|
services.redis.enable = mkForce true;
|
|
services.redis.bind = "127.0.0.1";
|
|
|
|
services.uwsgi = {
|
|
enable = true;
|
|
user = "nginx";
|
|
plugins = [ "python3" ];
|
|
instance = {
|
|
type = "emperor";
|
|
vassals = {
|
|
elchhub = {
|
|
type = "normal";
|
|
pythonPackages = self: with self; [ pkgs.elchhub ];
|
|
socket = elch-sock;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
services.nginx = {
|
|
enable = mkDefault true;
|
|
virtualHosts = {
|
|
"search.nsupdate.info" = {
|
|
enableACME = true;
|
|
forceSSL = true;
|
|
locations = {
|
|
"/".extraConfig = ''
|
|
uwsgi_pass unix://${elch-sock};
|
|
uwsgi_param UWSGI_CHDIR ${pkgs.elchhub}/${pkgs.python3.sitePackages};
|
|
uwsgi_param UWSGI_MODULE elchhub.wsgi;
|
|
uwsgi_param UWSGI_CALLABLE app;
|
|
|
|
include ${pkgs.nginx}/conf/uwsgi_params;
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
systemd.services = {
|
|
redis.serviceConfig.LimitNOFILE=10032;
|
|
elchos-ftp-scanner = {
|
|
wantedBy = [ "multi-user.target" ];
|
|
after = [ "ip-up.target" ];
|
|
serviceConfig = {
|
|
User = "nginx";
|
|
ExecStart = "${pkgs.elchhub}/bin/elch-manager";
|
|
};
|
|
};
|
|
ddclient-nsupdate-elchos = {
|
|
wantedBy = [ "multi-user.target" ];
|
|
after = [ "ip-up.target" ];
|
|
serviceConfig = {
|
|
Type = "forking";
|
|
User = ddclientUser;
|
|
PIDFile = ddclientPIDFile;
|
|
ExecStartPre = pkgs.writeDash "init-nsupdate" ''
|
|
cp -vf ${pkgs.writeText "ddclient-config" (gen-cfg nsupdate)} ${cfg}
|
|
chmod 700 ${cfg}
|
|
'';
|
|
ExecStart = "${pkgs.ddclient}/bin/ddclient -verbose -daemon 1 -noquiet -file ${cfg}";
|
|
};
|
|
};
|
|
};
|
|
|
|
networking.firewall = {
|
|
allowedTCPPorts = [ 80 443 ];
|
|
allowedUDPPorts = [ ];
|
|
};
|
|
}
|