diff --git a/flake.lock b/flake.lock index 03b59bd..23fe00c 100644 --- a/flake.lock +++ b/flake.lock @@ -171,11 +171,11 @@ ] }, "locked": { - "lastModified": 1773422513, - "narHash": "sha256-MPjR48roW7CUMU6lu0+qQGqj92Kuh3paIulMWFZy+NQ=", + "lastModified": 1773608492, + "narHash": "sha256-QZteyExJYSQzgxqdsesDPbQgjctGG7iKV/6ooyQPITk=", "owner": "nix-community", "repo": "home-manager", - "rev": "ef12a9a2b0f77c8fa3dda1e7e494fca668909056", + "rev": "9a40ec3b78fc688d0908485887d355caa5666d18", "type": "github" }, "original": { @@ -276,11 +276,11 @@ "xwayland-satellite-unstable": "xwayland-satellite-unstable" }, "locked": { - "lastModified": 1773501701, - "narHash": "sha256-+0LBAEm8F5h9Nm+hdS07aoS1W4oTtW6c8lltb66oOYQ=", + "lastModified": 1773646853, + "narHash": "sha256-9xzEP9ExGPYOg9Oa4CCQo3kGCwxVQ9oSjmB897XWiF0=", "owner": "sodiboo", "repo": "niri-flake", - "rev": "39ac039250a4a32bf8691405cac04864fc66a70d", + "rev": "7b3fd75b0a117bc247cb5183ed22cf7d5e3e135a", "type": "github" }, "original": { @@ -367,11 +367,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1773519908, - "narHash": "sha256-vAIRk0ZY1j8H0pbD4TuAgPg/JWQjhMdCcLOp4juiIJw=", + "lastModified": 1773606071, + "narHash": "sha256-bSE8hvgov+kUXf8PImfk1uAKFZPAl/VuRdUp0+pkDs0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "af0e797284377c938d90601b50003415e97bf132", + "rev": "6a8a6f7ee38cbf7ed50d1e6e2b50d94c96bb2d15", "type": "github" }, "original": { @@ -383,11 +383,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1773375660, - "narHash": "sha256-SEzUWw2Rf5Ki3bcM26nSKgbeoqi2uYy8IHVBqOKjX3w=", + "lastModified": 1773524153, + "narHash": "sha256-Jms57zzlFf64ayKzzBWSE2SGvJmK+NGt8Gli71d9kmY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3e20095fe3c6cbb1ddcef89b26969a69a1570776", + "rev": "e9f278faa1d0c2fc835bd331d4666b59b505a410", "type": "github" }, "original": { @@ -456,11 +456,11 @@ ] }, "locked": { - "lastModified": 1773096132, - "narHash": "sha256-M3zEnq9OElB7zqc+mjgPlByPm1O5t2fbUrH3t/Hm5Ag=", + "lastModified": 1773550941, + "narHash": "sha256-wa/++bL2QeMUreNFBZEWluQfOYB0MnQIeGNMuaX9sfs=", "owner": "Mic92", "repo": "sops-nix", - "rev": "d1ff3b1034d5bab5d7d8086a7803c5a5968cd784", + "rev": "c469b6885f0dcd5c7c56bd935a0f08dbcd9e79e1", "type": "github" }, "original": { @@ -561,11 +561,11 @@ "xwayland-satellite-unstable": { "flake": false, "locked": { - "lastModified": 1773499041, - "narHash": "sha256-XZ4/tVdLeAYDgKe4JD4C7yYUKydMxwt8c2j6APFWcIc=", + "lastModified": 1773622265, + "narHash": "sha256-wToKwH7IgWdGLMSIWksEDs4eumR6UbbsuPQ42r0oTXQ=", "owner": "Supreeeme", "repo": "xwayland-satellite", - "rev": "309d8e2a29953f7465dc14c939e2afe4682c0aa9", + "rev": "a879e5e0896a326adc79c474bf457b8b99011027", "type": "github" }, "original": { diff --git a/modules/server/kanboard.nix b/modules/server/kanboard.nix index a52f305..fa3dfeb 100644 --- a/modules/server/kanboard.nix +++ b/modules/server/kanboard.nix @@ -1,4 +1,4 @@ -{ config, ... }: +{ config, lib, ... }: { services.kanboard = { enable = false; @@ -16,4 +16,8 @@ DB_NAME = "kanboard"; }; }; + + forest.postgresqlUsers = [ + (lib.mkIf config.services.kanboard.enable "kanboard") + ]; } diff --git a/modules/server/postgresql-users.nix b/modules/server/postgresql-users.nix new file mode 100644 index 0000000..58aede6 --- /dev/null +++ b/modules/server/postgresql-users.nix @@ -0,0 +1,7 @@ +{ lib, ... }: +{ + options.forest.postgresqlUsers = lib.mkOption { + description = "PostgreSQL users and databases to create."; + type = with lib.types; listOf str; + }; +} diff --git a/modules/server/postgresql.nix b/modules/server/postgresql.nix index d734585..6d8b12f 100644 --- a/modules/server/postgresql.nix +++ b/modules/server/postgresql.nix @@ -7,23 +7,12 @@ { services.postgresql = { enable = true; - ensureDatabases = [ - "nextcloud" - "kanboard" - ]; + ensureDatabases = config.forest.postgresqlUsers; package = pkgs.postgresql_18; - ensureUsers = [ - { - name = "nextcloud"; - ensureDBOwnership = true; - } - ] - ++ lib.optionals (config.services.kanboard.enable) [ - { - name = "kanboard"; - ensureDBOwnership = true; - } - ]; + ensureUsers = lib.forEach config.forest.postgresqlUsers (user: { + name = user; + ensureDBOwnership = true; + }); settings = { max_connections = 5000; }; diff --git a/modules/server/vikunja.nix b/modules/server/vikunja.nix new file mode 100644 index 0000000..3192342 --- /dev/null +++ b/modules/server/vikunja.nix @@ -0,0 +1,64 @@ +{ config, lib, ... }: +let + hostname = "tasks.forest.monke"; + port = 3456; +in +{ + sops = { + secrets = { + "vikunja/jwtSecret" = { }; + "vikunja/smtpHost" = { }; + "vikunja/smtpUser" = { }; + "vikunja/smtpPass" = { }; + }; + templates.vikunja-env.content = '' + VIKUNJA_SERVICE_JWTSECRET=${config.sops.placeholder."vikunja/jwtSecret"} + VIKUNJA_MAILER_HOST=${config.sops.placeholder."vikunja/smtpHost"} + VIKUNJA_MAILER_USERNAME=${config.sops.placeholder."vikunja/smtpUser"} + VIKUNJA_MAILER_PASSWORD=${config.sops.placeholder."vikunja/smtpPass"} + ''; + }; + + services.vikunja = { + inherit port; + enable = true; + frontendScheme = "http"; + frontendHostname = hostname; + environmentFiles = [ config.sops.templates.vikunja-env.path ]; + database = { + type = "postgres"; + host = "/run/postgresql"; + }; + settings = { + enableRegistration = false; + publicurl = "https://${hostname}"; + maxavatarsize = 4096; + mailer.enabled = true; + }; + }; + + forest.nginxHosts = [ + (lib.mkIf config.services.vikunja.enable { + "${hostname}" = { + onlySSL = true; + http2 = true; + sslCertificate = config.sops.secrets."ssl/cert".path; + sslCertificateKey = config.sops.secrets."ssl/key".path; + locations."/" = { + proxyPass = "http://127.0.0.1:${toString port}"; + proxyWebsockets = true; + extraConfig = '' + client_max_body_size 5000M; + proxy_read_timeout 600s; + proxy_send_timeout 600s; + send_timeout 600s; + ''; + }; + }; + }) + ]; + + forest.postgresqlUsers = [ + (lib.mkIf config.services.vikunja.enable "vikunja") + ]; +} diff --git a/secrets/forest.yaml b/secrets/forest.yaml index cbce034..482a863 100644 --- a/secrets/forest.yaml +++ b/secrets/forest.yaml @@ -39,6 +39,11 @@ pds: adminPass: ENC[AES256_GCM,data:5AU6oszoSe5SpTkpUG9bpiyiXiN2jKmfqcBQmf5lpeK5slLn4WvFygxy5vLrnzCUStkGeufroU6CGVfo7V5Ep44wt1Xal/mrW+J5MYepyeX1Qr43tSDjsrhi09BhBlIjIzYN9wAy3bSZS/wmr0CWOteHemd9Z2ndxYK5JEUTTb3QB0wpchQpBdJmZiKESsxx29aGHkXkesP9MzPYbdn5Xet3lSx9lQikPF/fCrJjhysjxVOlwGqe0kWFGKqj36r37KeLRVkNwUAidYJHLXgmUQ2BM9U/ghIbZ6I6YiUhNfehq1z4n504lEoUialIuFu8Z53KLvT/lkMZxCaAHQxQpQ==,iv:ZqAGDHP8HjWj4Af/AxskopXUAorVDaQIyQ4hiHQuTbQ=,tag:iGUJ4gSB2s8UVLa+RZrXyA==,type:str] plcRotKey: ENC[AES256_GCM,data:ukotWdd7ICOB5DbbmlL/kcewsL9N59XnftR4b4T8T6w2kn7hyKefyC875FS/rgyiTD0dPVSw5P7rDI5WrByybw==,iv:hNAS8NI8kZfR+QuNElzX9qayB1LRN11eVBjQxmuKv1w=,tag:8rPcnPe7qTM2ui+pv20zYg==,type:str] smtpUrl: ENC[AES256_GCM,data:NvmCt+9SA8UcJV1HnTmZ4txQdMP0B+nMxMJwFHL/A1llMlz96XgSDWnnZnUs7RgGdYFApuYxLWRttgyEV8N+SOvb6ZQYd/Jm7YxCIRA61yeGsDntY0wG0IA/OIsaiSkxwimrSSF+7SGKFA==,iv:P7wCSq6pcqXnt6aw1BGxnmjCD2lyLDatiXI4WPY7c0A=,tag:dMuN4qzVoPUG1B8EP/XTSg==,type:str] +vikunja: + jwtSecret: ENC[AES256_GCM,data:+Y7bDamQv1t8/ptliZRojiIrog9ACIhtCOHO3N8n6AohjpUTcBAiGYrYG2iNo2SXsaxFjZcSKb26d6ODfAlCeY7J9rLmxJDWHlqHA3gwjPq+meGhIhQ=,iv:U55EQS2bZXobaaRN31NmSPKwEqYhf7ByIEk4W+Vjs8U=,tag:EIyLPmWo+S2rjvWd0AbLwg==,type:str] + smtpHost: ENC[AES256_GCM,data:csxZIty2NutwBaazqP/74Q2grw==,iv:fKM+GXqk/TUco0nF74TyNwOjmdCK5lOg7xDbrTsd/NA=,tag:esBdIE/e5NKm5zmxBD+aiQ==,type:str] + smtpUser: ENC[AES256_GCM,data:DFJGiqZAytOHYW3GUhJ9,iv:zriDODVqQ9PmCQgVQizPYt5lVg7Jl+5tn3xX+esMs48=,tag:zD2FYXq3l3s/LCYR5UE+5w==,type:str] + smtpPass: ENC[AES256_GCM,data:4BUfykNwmVNzmCtoPKb0hIyNgrGk/IxU2E+/RCPhOkmeeOmwdfb3kOJk0ponN4cN9mFPWS1UIv4jN75mLhPq0w==,iv:3c6FdGeJJcyf4ch0UtVYoPVDb3mrCbI/tOuvDN2geUk=,tag:nzHTVtISQEj/rTg0Un8dVA==,type:str] ssl: cert: ENC[AES256_GCM,data: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,iv:Q60z0N6AluZl81nwX3QuTY6mOqHcql8viakARLYOc6Y=,tag:BDOr3ozlSiAWMPSecdEPTA==,type:str] key: ENC[AES256_GCM,data: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,iv:jokrMWx6iyXA5xPdU8SBVp3JUXyHHAFw7I/8UbLOxns=,tag:8x/iGXomMCA4+zDKlxZd9Q==,type:str] @@ -53,7 +58,7 @@ sops: Q0hjS2ZHamZXUHhCWE5MOHJIZ2xNa0kKUrtOBXmsBhwmDfehU0kDymfTCGaCSoBm fwzrYdaF72+lxgvuqm8t6KK+x3yrz3/ksuVRvHPfgvM0cKp1D2vNKA== -----END AGE ENCRYPTED FILE----- - lastmodified: "2026-02-04T09:16:14Z" - mac: ENC[AES256_GCM,data:Yt8I3SKSrn7U2wJlAsDww9gYlKuiO6KgWdwSN0QOtHOPg0jEMxx2zyl3EhPrprn3cuR6S2f96A1KC8xoNXDXBauq8/2lspsIDIHUBceVYNrENH/9HwTZzBB4llsuhmRIvG0GIcuRlz2eRvsGp+cA5O19dEC5qd9OFGu/5xqHOKw=,iv:pJfFHrpdzw3SHc4GAXV9DS5NBD1J50LFavtsQcKwPqg=,tag:LwDhzB77oD8z7Tt/iRnIRg==,type:str] + lastmodified: "2026-03-16T09:34:45Z" + mac: ENC[AES256_GCM,data:yPHJ6/wvE7dG8DFHWM11TvuOO7jvB1ob4TIjFISWJUSXnErozhV2cF5yN1SN+DPl6tTtjDF64gl3/tQrAEFs5AMgjSacvmyXb9MPrOJ1Uo1iPuPb/4/B+pgQHhFXJBlOl3aU6AQ6BIu70Ac4M8+LVu6eZTCUB1kmWSDpOUm2XoE=,iv:NsOALTQXdpdaoU8LAh5OzTvUbmLMVC1JBWG/aANQcBk=,tag:Yh0dXdzgig8EvPh8Sg/uVQ==,type:str] unencrypted_suffix: _unencrypted - version: 3.11.0 + version: 3.12.1