diff --git a/hosts/fwminex/configuration.nix b/hosts/fwminex/configuration.nix index 5afdcea..47996f0 100644 --- a/hosts/fwminex/configuration.nix +++ b/hosts/fwminex/configuration.nix @@ -27,6 +27,7 @@ in syncthing-key.file = ../../secrets/fwminex/syncthing/key.pem.age; syncthing-cert.file = ../../secrets/fwminex/syncthing/cert.pem.age; frigate.file = ../../secrets/frigate.age; + timelapse.file = ../../secrets/timelapse.age; r1-htpasswd = { file = ../../secrets/r1-htpasswd.age; owner = "nginx"; @@ -503,6 +504,12 @@ in secretsEnv = config.age.secrets.frigate.path; }; + timelapse-r11 = { + enable = true; + onCalendar = "*:0/5"; + secretsEnv = config.age.secrets.timelapse.path; + }; + immich = { enable = true; bindPaths = { diff --git a/modules/services/default.nix b/modules/services/default.nix index af7d8cf..769b018 100644 --- a/modules/services/default.nix +++ b/modules/services/default.nix @@ -25,6 +25,7 @@ ./syncthing ./syncthing-relay ./tailscale + ./timelapse-r11 ./vaultwarden ./wifibackup ]; diff --git a/modules/services/frigate/default.nix b/modules/services/frigate/default.nix index ca0a4f5..9a00757 100644 --- a/modules/services/frigate/default.nix +++ b/modules/services/frigate/default.nix @@ -30,31 +30,6 @@ let done ''; }; - timelapseScript = pkgs.writeShellApplication { - name = "timelapse-r11"; - runtimeInputs = with pkgs; [ ffmpeg ]; - text = '' - set -x - NOW=$(date +%F_%T) - DATE=''${NOW%_*} - TIME=''${NOW#*_} - mkdir -p /var/lib/timelapse-r11/"''${DATE}" - EXITCODE=0 - ffmpeg -hide_banner -y \ - -rtsp_transport tcp \ - -i "rtsp://frigate:''${FRIGATE_RTSP_PASSWORD}@192.168.188.10/cam/realmonitor?channel=2&subtype=0" \ - -vframes 1 \ - /var/lib/timelapse-r11/"''${DATE}"/"ptz-''${DATE}_''${TIME}.jpg" || EXITCODE=$? - - ffmpeg -hide_banner -y \ - -rtsp_transport tcp \ - -i "rtsp://frigate:''${FRIGATE_RTSP_PASSWORD}@192.168.188.10/cam/realmonitor?channel=1&subtype=0" \ - -vframes 1 \ - /var/lib/timelapse-r11/"''${DATE}"/"panorama-''${DATE}_''${TIME}.jpg" || EXITCODE=$? - - exit "$EXITCODE" - ''; - }; in { options.mj.services.frigate = with lib.types; { @@ -64,17 +39,10 @@ in config = lib.mkIf cfg.enable { mj.base.unitstatus.units = [ - "timelapse-r11" "go2rtc" "frigate" ]; - systemd.timers.timelapse-r11 = { - #timerConfig.OnCalendar = "*-*-* 7..19:00/5 Europe/Vilnius"; - timerConfig.OnCalendar = "*:0/5"; - wantedBy = [ "timers.target" ]; - }; - systemd.services = { go2rtc-prober = { wantedBy = [ "multi-user.target" ]; @@ -84,17 +52,6 @@ in Restart = "always"; }; }; - timelapse-r11 = { - preStart = "ln -sf $CREDENTIALS_DIRECTORY/secrets.env /run/timelapse-r11/secrets.env"; - serviceConfig = { - ExecStart = lib.getExe timelapseScript; - EnvironmentFile = [ "-/run/timelapse-r11/secrets.env" ]; - LoadCredential = [ "secrets.env:${cfg.secretsEnv}" ]; - RuntimeDirectory = "timelapse-r11"; - StateDirectory = "timelapse-r11"; - DynamicUser = true; - }; - }; go2rtc = { preStart = "ln -sf $CREDENTIALS_DIRECTORY/secrets.env /run/go2rtc/secrets.env"; serviceConfig = { diff --git a/modules/services/timelapse-r11/default.nix b/modules/services/timelapse-r11/default.nix new file mode 100644 index 0000000..28f8e1d --- /dev/null +++ b/modules/services/timelapse-r11/default.nix @@ -0,0 +1,69 @@ +{ + lib, + pkgs, + config, + ... +}: + +let + cfg = config.mj.services.timelapse-r11; + + timelapseScript = pkgs.writeShellApplication { + name = "timelapse-r11"; + runtimeInputs = with pkgs; [ ffmpeg ]; + text = '' + set -x + NOW=$(date +%F_%T) + DATE=''${NOW%_*} + TIME=''${NOW#*_} + mkdir -p /var/lib/timelapse-r11/"''${DATE}" + EXITCODE=0 + ffmpeg -hide_banner -y \ + -rtsp_transport tcp \ + -i "rtsp://timelapse:''${TIMELAPSE_RTSP_PASSWORD}@192.168.188.10/cam/realmonitor?channel=2&subtype=0" \ + -vframes 1 \ + /var/lib/timelapse-r11/"''${DATE}"/"ptz-''${DATE}_''${TIME}.jpg" || EXITCODE=$? + + ffmpeg -hide_banner -y \ + -rtsp_transport tcp \ + -i "rtsp://timelapse:''${TIMELAPSE_RTSP_PASSWORD}@192.168.188.10/cam/realmonitor?channel=1&subtype=0" \ + -vframes 1 \ + /var/lib/timelapse-r11/"''${DATE}"/"panorama-''${DATE}_''${TIME}.jpg" || EXITCODE=$? + + exit "$EXITCODE" + ''; + }; + +in +{ + options.mj.services.timelapse-r11 = with lib.types; { + enable = lib.mkEnableOption "enable timelapse-r11"; + secretsEnv = lib.mkOption { type = path; }; + onCalendar = lib.mkOption { type = string; }; + }; + + config = lib.mkIf cfg.enable { + mj.base.unitstatus.units = [ + "timelapse-r11" + ]; + + systemd.timers.timelapse-r11 = { + timerConfig.OnCalendar = cfg.onCalendar; + wantedBy = [ "timers.target" ]; + }; + + systemd.services.timelapse-r11 = { + preStart = "ln -sf $CREDENTIALS_DIRECTORY/secrets.env /run/timelapse-r11/secrets.env"; + serviceConfig = { + ExecStart = lib.getExe timelapseScript; + EnvironmentFile = [ "-/run/timelapse-r11/secrets.env" ]; + LoadCredential = [ "secrets.env:${cfg.secretsEnv}" ]; + RuntimeDirectory = "timelapse-r11"; + StateDirectory = "timelapse-r11"; + DynamicUser = true; + }; + }; + + }; + +} diff --git a/secrets.nix b/secrets.nix index 56a44f3..05466fa 100644 --- a/secrets.nix +++ b/secrets.nix @@ -57,6 +57,18 @@ in "secrets/motiejus_server_passwd_hash.age" "secrets/root_server_passwd_hash.age" ] +// + mk + ( + [ + fwminex + vno3-nk + ] + ++ motiejus + ) + [ + "secrets/timelapse.age" + ] // mk ([ fwminex ] ++ motiejus) [ "secrets/vaultwarden/secrets.env.age" "secrets/letsencrypt/account.key.age" diff --git a/secrets/timelapse.age b/secrets/timelapse.age new file mode 100644 index 0000000..c30b86b --- /dev/null +++ b/secrets/timelapse.age @@ -0,0 +1,15 @@ +age-encryption.org/v1 +-> ssh-ed25519 fqSa6A RaHedr8hIYY83BuNxRINc7AGQ0yDJi5xV4HWRGapMGQ +Mk1kgkNDk8+31Nx637PzlUcKyw8q3w2yVm248xl2QrM +-> ssh-ed25519 wPuT4Q qd3bj/9z+ecSCuH+j/a2FSssmtcWSLb+WkCRXKuTChg +EQli68ji83hHWXzvVBQiP1ACjLiWn1wmxirO4cwO7Ho +-> X25519 cTPqAPg5zSMhOvTQkDRlhOL+Pq313ufspUY1pDIKCjE +G9PAVK2L/YT2V6YNN5jl7TgAaTKvQzQJW3TRFKWdUlI +-> X25519 7RUfwNMxkzKJD3tb33Po1/bIfgYYK3IX0m1OnF2xEk8 +IrmfivIAOYtbY4U1L47oGWcrS8+W+By3hcc/XM2npUs +-> piv-p256 +y2G/w AuJDqViqxav1CIegvrrGLoFMBeyxNPqpusBJYJOf928S +rXwF6MLf8DxnCLVMLGRt/50WHVmaqJWxTM4hdqu0yKk +-> piv-p256 jNqd3A AohNcJaL73Uv6JpkJ0GoR/QOcuSeelpgBVEItZU3ibrn +jaSdOtYF20Foimt8swq3BfB1RoQ6BTk8bKXbd7E7ycU +--- Q6+uCbwIC7YyPQJlyx30HytdbpWxww2kPplM22nVpKU +Q��Gq���i�\rӔt/��d�z{ޓ�]�� p�'"qG��=$U��ⴡ@��tɂm ���F_�#} \ No newline at end of file