{ lib, config, pkgs, ... }: let cfg = config.services.vaultwarden; domain = "vaultwarden.sorre.internal"; in { services.vaultwarden = { enable = true; configureNginx = false; dbBackend = "sqlite"; backupDir = null; # I handle backups myself, see services below inherit domain; config = { SIGNUPS_ALLOWED = false; ROCKET_ADDRESS = "127.0.0.1"; ROCKET_PORT = 8222; LOG_LEVEL = "debug"; }; }; systemd.services.vaultwarden = lib.mkIf cfg.enable { serviceConfig.EnvironmentFile = [ # For admin token. # Leave disabled unless you need the /admin page. # "/var/lib/secrets/vaultwarden.env" ]; }; systemd.services.backup-vaultwarden = lib.mkIf cfg.enable { serviceConfig = { Type = "exec"; User = config.systemd.services.vaultwarden.serviceConfig.User; Group = config.systemd.services.vaultwarden.serviceConfig.Group; StateDirectory = "backups/vaultwarden"; StateDirectoryMode = "0700"; Umask = "077"; }; description = "Back up vaultwarden data"; conflicts = [ "vaultwarden.service" ]; path = [ pkgs.gnutar ]; enableStrictShellChecks = true; script = '' #!/usr/bin/env bash set -euo pipefail TIMESTAMP="$(date +%Y%m%d%H%M%S)" BACKUP_PATH="$STATE_DIRECTORY/$TIMESTAMP.backup.tar" echo "Backing up Vaultwarden to $BACKUP_PATH" >&2 tar cf "$BACKUP_PATH" /var/lib/vaultwarden chmod u=r,go-rwx "$BACKUP_PATH" find "$STATE_DIRECTORY" -type f -name '*.backup.tar' -print0 | sort --zero-terminated --reverse | tail --zero-terminated --lines=+6 | xargs --null --no-run-if-empty rm -- ''; }; # See: https://unix.stackexchange.com/a/804263 systemd.services.backup-vaultwarden-restart-service = { unitConfig = { StopPropagatedFrom = "backup-vaultwarden.service"; Before = "backup-vaultwarden.service"; User = "root"; }; path = [ pkgs.systemdMinimal ]; serviceConfig = { Type = "oneshot"; User = "root"; RemainAfterExit = true; ExecStop = "systemctl start vaultwarden.service"; }; wantedBy = [ "backup-vaultwarden.service" ]; }; systemd.timers.backup-vaultwarden = { description = "Back up vaultwarden every morning"; timerConfig.OnCalendar = "*-*-* 05:00:00"; wantedBy = [ "timers.target" ]; }; }