My Nix Configuration
1{ 2 pkgs, 3 config, 4 lib, 5 ... 6}: 7let 8 9 d = lib.py.data.services.vaultwarden; 10 11 vaultwardenSecret = { 12 owner = "vaultwarden"; 13 group = "vaultwarden"; 14 }; 15in 16{ 17 services.vaultwarden = { 18 enable = true; 19 dbBackend = "postgresql"; 20 webVaultPackage = pkgs.vaultwarden-vault; 21 config = { 22 # Web Server Settings 23 domain = "https://${d.extUrl}"; 24 webVaultFolder = "${pkgs.vaultwarden-vault}/share/vaultwarden/vault"; 25 rocketAddress = "0.0.0.0"; 26 rocketCliColors = false; 27 rocketPort = d.port; 28 websocketEnabled = true; 29 ipHeader = "X-Real-IP"; 30 reloadTemplates = false; 31 logTimestampFormat = "%Y-%m-%d %H:%M:%S.%3f"; 32 # # Ratelimiting 33 loginRatelimitSeconds = 60; 34 loginRatelimitMaxBurst = 10; 35 adminRatelimitSeconds = 120; 36 adminRatelimitMaxBurst = 2; 37 adminSessionLifetime = 10; 38 39 # Logging 40 useSyslog = true; 41 logLevel = "info"; 42 extendedLogging = true; 43 44 # Features 45 sendsAllowed = true; 46 emailChangeAllowed = true; 47 emergencyAccessAllowed = true; 48 49 # Invitations 50 invitationsAllowed = true; 51 invitationOrgName = "PyroNet Vault"; 52 invitationExpirationHours = 168; 53 54 # Database 55 databaseUrl = "postgresql://localhost:5432/vaultwarden"; 56 57 # Signups 58 signupsAllowed = false; 59 signupsVerify = true; 60 signupsVerifyResendTime = 3600; 61 signupsVerifyResendLimit = 5; 62 signupsDomainWhitelist = "pyrox.dev"; 63 64 # Passwords 65 # # 1 Mil hash iterations by default 66 passwordIterations = 1000000; 67 passwordHintsAllowed = true; 68 showPasswordHint = true; 69 70 # Mail 71 smtpFrom = "vault@pyrox.dev"; 72 smtpFromName = "PyroNet Vault <vault@pyrox.dev>"; 73 smtpUsername = "vault@pyrox.dev"; 74 smtpSecurity = "force_tls"; 75 smtpPort = 465; 76 smtpHost = "mail.pyrox.dev"; 77 smtpAuthMechanism = "Login"; 78 smtpTimeout = 20; 79 smtpEmbedImages = true; 80 useSendmail = false; 81 smtpDebug = false; 82 smtpAcceptInvalidCerts = false; 83 smtpAcceptInvalidHostnames = false; 84 85 # Authentication 86 authenticatorDisableTimeDrift = false; 87 disable2faRemember = false; 88 incomplete2faTimeLimit = 5; 89 # # Email 2FA 90 emailAttemptsLimit = 3; 91 emailExpirationTime = 180; 92 emailTokenSize = 7; 93 requireDeviceEmail = true; 94 95 # Icons 96 disableIconDownload = false; 97 iconService = "internal"; 98 iconRedirectCode = 302; 99 iconDownloadTimeout = 10; 100 iconBlacklistNonGlobalIps = true; 101 # # 30 Day TTL 102 iconCacheTtl = 30 * 24 * 60 * 60; 103 iconCacheNegttl = 30 * 24 * 60 * 60; 104 105 # Misc Settings 106 trashAutoDeleteDays = 14; 107 }; 108 environmentFile = config.age.secrets.vaultwarden-vars.path; 109 }; 110 systemd.services.vaultwarden.environment.PGPASSFILE = config.age.secrets.vaultwarden-pgpass.path; 111 environment.systemPackages = with pkgs; [ vaultwarden-vault ]; 112 age.secrets.vaultwarden-vars = vaultwardenSecret // { 113 file = ./secrets/vaultwarden-vars.age; 114 }; 115 age.secrets.vaultwarden-pgpass = vaultwardenSecret // { 116 file = ./secrets/vaultwarden-pgpass.age; 117 }; 118 services.anubis.instances.vaultwarden = { 119 settings = { 120 BIND = ":${toString d.anubis}"; 121 POLICY_FNAME = "${pkgs.py.anubis-files}/policies/vaultwarden.yaml"; 122 TARGET = "http://localhost:${toString d.port}"; 123 }; 124 }; 125}