selfprivacy-nixos-config/sp-modules/bitwarden/module.nix

122 lines
4 KiB
Nix
Raw Normal View History

2023-12-03 08:29:01 +00:00
{ config, lib, pkgs, ... }:
let
secrets-filepath = "/etc/selfprivacy/secrets.json";
backup-dir = "/var/lib/bitwarden/backup";
2024-02-15 09:56:12 +00:00
cfg = sp.modules.bitwarden;
2023-12-03 08:29:01 +00:00
inherit (import ./common.nix config) bitwarden-env sp;
in
{
options.selfprivacy.modules.bitwarden = {
enable = lib.mkOption {
default = false;
2023-12-28 08:54:59 +00:00
type = lib.types.bool;
2023-12-03 08:29:01 +00:00
};
location = lib.mkOption {
2023-12-28 08:54:59 +00:00
type = lib.types.str;
2023-12-03 08:29:01 +00:00
};
2024-02-15 09:56:12 +00:00
subdomain = lib.mkOption {
default = "password";
type = lib.types.strMatching "[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9]";
};
signupsAllowed = lib.mkOption {
default = true;
type = lib.types.bool;
};
sendsAllowed = lib.mkOption {
default = true;
type = lib.types.bool;
};
emergencyAccessAllowed = lib.mkOption {
default = true;
type = lib.types.bool;
};
2023-12-03 08:29:01 +00:00
};
config = lib.mkIf config.selfprivacy.modules.bitwarden.enable {
fileSystems = lib.mkIf sp.useBinds {
"/var/lib/bitwarden" = {
2024-02-15 09:56:12 +00:00
device = "/volumes/${cfg.location}/bitwarden";
options = [
"bind"
"x-systemd.required-by=bitwarden-secrets.service"
2023-12-18 18:16:40 +00:00
"x-systemd.required-by=backup-vaultwarden.service"
"x-systemd.required-by=vaultwarden.service"
"x-systemd.before=bitwarden-secrets.service"
"x-systemd.before=backup-vaultwarden.service"
"x-systemd.before=vaultwarden.service"
];
2023-12-03 08:29:01 +00:00
};
"/var/lib/bitwarden_rs" = {
2024-02-15 09:56:12 +00:00
device = "/volumes/${cfg.location}/bitwarden_rs";
options = [
"bind"
"x-systemd.required-by=bitwarden-secrets.service"
2023-12-18 18:16:40 +00:00
"x-systemd.required-by=backup-vaultwarden.service"
"x-systemd.required-by=vaultwarden.service"
"x-systemd.before=bitwarden-secrets.service"
"x-systemd.before=backup-vaultwarden.service"
"x-systemd.before=vaultwarden.service"
];
2023-12-03 08:29:01 +00:00
};
};
services.vaultwarden = {
enable = true;
dbBackend = "sqlite";
backupDir = backup-dir;
2023-12-03 08:29:01 +00:00
environmentFile = "${bitwarden-env}";
config = {
DOMAIN = "https://${cfg.subdomain}.${sp.domain}/";
SIGNUPS_ALLOWED = cfg.signupsAllowed;
ROCKET_PORT = 8222;
SENDS_ALLOWED = cfg.sendsAllowed;
EMERGENCY_ACCESS_ALLOWED = cfg.emergencyAccessAllowed;
2023-12-03 08:29:01 +00:00
};
};
systemd.services.bitwarden-secrets = {
before = [ "vaultwarden.service" ];
requiredBy = [ "vaultwarden.service" ];
2023-12-03 08:29:01 +00:00
serviceConfig.Type = "oneshot";
path = with pkgs; [ coreutils jq ];
script = ''
set -o nounset
token="$(jq -r '.bitwarden.adminToken' ${secrets-filepath})"
if [ "$token" == "null" ]; then
# If it's null, empty the contents of the file
bitwarden_env=""
else
bitwarden_env="ADMIN_TOKEN=$token"
fi
install -C -m 0700 -o vaultwarden -g vaultwarden \
-d /var/lib/bitwarden
install -C -m 0600 -o vaultwarden -g vaultwarden -DT \
2023-12-03 08:29:01 +00:00
<(printf "%s" "$bitwarden_env") ${bitwarden-env}
'';
};
2024-02-15 09:56:12 +00:00
services.nginx.virtualHosts."${cfg.subdomain}.${sp.domain}" = {
2023-12-22 15:57:48 +00:00
useACMEHost = sp.domain;
forceSSL = true;
extraConfig = ''
add_header Strict-Transport-Security $hsts_header;
#add_header Content-Security-Policy "script-src 'self'; object-src 'none'; base-uri 'none';" always;
add_header 'Referrer-Policy' 'origin-when-cross-origin';
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict";
expires 10m;
'';
locations = {
"/" = {
proxyPass = "http://127.0.0.1:8222";
};
};
};
# NixOS upstream bug? Otherwise, backup-vaultwarden cannot find sqlite DB.
systemd.services.backup-vaultwarden.unitConfig.ConditionPathExists =
"/var/lib/bitwarden_rs/db.sqlite3";
2023-12-03 08:29:01 +00:00
};
}