main
 1{lib, ...}: {
 2  den.aspects.services.vaultwarden = {
 3    settings.host = {
 4      domain = lib.mkOption {
 5        type = lib.types.str;
 6      };
 7      address = lib.mkOption {
 8        type = lib.types.str;
 9        default = "127.0.0.1";
10      };
11      port = lib.mkOption {
12        type = lib.types.port;
13        default = 8222;
14      };
15    };
16
17    persist = {
18      directories = [
19        {
20          directory = "/var/lib/vaultwarden";
21          user = "vaultwarden";
22          group = "vaultwarden";
23          mode = "0700";
24        }
25      ];
26    };
27
28    reverseProxy = {host, ...}: let
29      cfg = host.settings.services.vaultwarden;
30    in {
31      ${cfg.domain} = {
32        port = cfg.port;
33      };
34    };
35
36    backup = {
37      pkgs,
38      lib,
39      ...
40    }: {
41      vaultwarden = let
42        backupDir = "/tmp/backups/vaultwarden";
43      in {
44        paths = [backupDir];
45
46        # See https://github.com/dani-garcia/vaultwarden/wiki/Backing-up-your-vault
47        backupPrepareCommand = lib.getExe (pkgs.writeShellApplication {
48          name = "backup-vaultwarden-prepare";
49          runtimeInputs = [
50            pkgs.sqlite
51          ];
52          text = ''
53            set -euo pipefail
54
55            DATA_DIR="/var/lib/vaultwarden"
56
57            mkdir -p "${backupDir}"
58
59            sqlite3 "$DATA_DIR/db.sqlite3" ".backup '${backupDir}/db.sqlite3'"
60
61            if [ -d "$DATA_DIR/attachments" ]; then
62              cp -a "$DATA_DIR/attachments" "${backupDir}/"
63            fi
64          '';
65        });
66        backupCleanupCommand = ''
67          rm -r "${backupDir}"
68        '';
69      };
70    };
71
72    nixos = {host, ...}: let
73      cfg = host.settings.services.vaultwarden;
74    in {
75      services.vaultwarden = {
76        enable = true;
77
78        inherit (cfg) domain;
79        dbBackend = "sqlite";
80        config = {
81          SIGNUPS_ALLOWED = false;
82          ENABLE_WEBSOCKET = true;
83          ROCKET_ADDRESS = cfg.address;
84          ROCKET_PORT = cfg.port;
85        };
86      };
87    };
88  };
89}