daily-tracker.nix (3223B)
1 { 2 config, 3 lib, 4 pkgs, 5 ... 6 }: 7 8 let 9 cfg = config.services.local.daily-tracker; 10 in 11 { 12 options.services.local.daily-tracker = { 13 enable = lib.mkEnableOption "Daily Tracker"; 14 15 package = lib.mkOption { 16 type = lib.types.package; 17 description = "The daily_tracker release package"; 18 }; 19 20 domain = lib.mkOption { 21 type = lib.types.str; 22 description = "Domain for the daily tracker"; 23 }; 24 25 port = lib.mkOption { 26 type = lib.types.int; 27 default = 4000; 28 description = "Port for the Phoenix server"; 29 }; 30 31 secretKeyBaseSecretName = lib.mkOption { 32 type = lib.types.str; 33 description = "Sops secret name for SECRET_KEY_BASE"; 34 }; 35 36 mailPasswordSecretName = lib.mkOption { 37 type = lib.types.str; 38 description = "Sops secret name for MAIL_PASSWORD"; 39 }; 40 41 databaseName = lib.mkOption { 42 type = lib.types.str; 43 default = "daily_tracker"; 44 description = "PostgreSQL database name"; 45 }; 46 }; 47 48 config = lib.mkIf cfg.enable { 49 services.postgresql = { 50 enable = true; 51 ensureDatabases = [ cfg.databaseName ]; 52 ensureUsers = [ 53 { 54 name = "daily_tracker"; 55 ensureDBOwnership = true; 56 } 57 ]; 58 authentication = '' 59 local ${cfg.databaseName} daily_tracker trust 60 host ${cfg.databaseName} daily_tracker 127.0.0.1/32 trust 61 ''; 62 }; 63 64 systemd.services.daily-tracker = { 65 wantedBy = [ "multi-user.target" ]; 66 description = "Daily Tracker Phoenix app"; 67 after = [ "network.target" "postgresql.service" ]; 68 requires = [ "postgresql.service" ]; 69 serviceConfig = { 70 Type = "exec"; 71 ExecStartPre = "${cfg.package}/bin/daily_tracker eval 'DailyTracker.Release.migrate()'"; 72 ExecStart = "${cfg.package}/bin/daily_tracker start"; 73 Restart = "on-failure"; 74 User = "daily_tracker"; 75 Group = "daily_tracker"; 76 StateDirectory = "daily-tracker"; 77 WorkingDirectory = "/var/lib/daily-tracker"; 78 }; 79 environment = { 80 PHX_SERVER = "true"; 81 PHX_HOST = cfg.domain; 82 PORT = builtins.toString cfg.port; 83 DATABASE_URL = "ecto://daily_tracker@127.0.0.1/${cfg.databaseName}"; 84 MAIL_HOST = "localhost"; 85 RELEASE_COOKIE = "daily-tracker-cookie"; 86 }; 87 }; 88 89 # Load secrets into the service environment 90 systemd.services.daily-tracker.serviceConfig.EnvironmentFile = [ 91 config.sops.templates."daily-tracker-env".path 92 ]; 93 94 sops.templates."daily-tracker-env" = { 95 content = '' 96 SECRET_KEY_BASE=${config.sops.placeholder.${cfg.secretKeyBaseSecretName}} 97 MAIL_PASSWORD=${config.sops.placeholder.${cfg.mailPasswordSecretName}} 98 ''; 99 owner = "daily_tracker"; 100 }; 101 102 users.users.daily_tracker = { 103 isSystemUser = true; 104 group = "daily_tracker"; 105 }; 106 users.groups.daily_tracker = { }; 107 108 services.nginx.virtualHosts.${cfg.domain} = { 109 forceSSL = true; 110 enableACME = true; 111 locations."/" = { 112 proxyPass = "http://127.0.0.1:${builtins.toString cfg.port}"; 113 recommendedProxySettings = true; 114 proxyWebsockets = true; 115 }; 116 }; 117 }; 118 }