grace/dots
dotfiles/nix configs
git clone https://git.gae.moe/grace/dots
44ae0ad
wafrn-testing
1{ 2config , 3pkgs , 4lib , 5 ... 6} : 7 8let 9domain = "wafrn.gae.moe" ; 10mediaDomain = "media.wafrn.gae.moe" ; 11cacheDomain = "cache.wafrn.gae.moe" ; 12 13pdsDomain = "pds.gae.moe" ; 14 15wafrnDir = "/mnt/ext/wafrn" ; 16secretsFile = "/etc/secrets/wafrn" ; 17 18wafrnPort = 8123 ; 19 20wafrnEnvironment = { 21COMPOSE_PROJECT_NAME = "wafrn" ; 22COMPOSE_PROFILES = "bluesky" ; 23 24DOMAIN_NAME = domain ; 25MEDIA_DOMAIN = mediaDomain ; 26CACHE_DOMAIN = cacheDomain ; 27 28FRONTEND_MEDIA_URL = "https:// ${ mediaDomain } " ; 29FRONTEND_CACHE_URL = 30"https:// ${ cacheDomain } /api/cache?media=" ; 31 32ADMIN_USER = "admin" ; 33ADMIN_EMAIL = "admin@example.com" ; 34 35POSTGRES_USER = "wafrn" ; 36POSTGRES_DBNAME = "wafrn" ; 37 38POSTGRES_METRICS_USER = "wafrn_metrics" ; 39POSTGRES_METRICS_DBNAME = "wafrn_metrics" ; 40 41ENABLE_BSKY = "true" ; 42 43PDS_DOMAIN_NAME = pdsDomain ; 44PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX = "unused-external-pds" ; 45 46USE_WORKERS = "true" ; 47REVIEW_REGISTRATIONS = "true" ; 48 49UPLOAD_LIMIT = "52428800" ; 50LOG_LEVEL = "info" ; 51 52ACME_EMAIL = "invalid@example.com" ; 53 54DISABLE_REQUIRE_SEND_EMAIL = "true" ; 55 56SMTP_HOST = "" ; 57SMTP_USER = "" ; 58SMTP_PORT = "587" ; 59SMTP_FROM = "" ; 60 61WEBPUSH_EMAIL = "mailto:admin@example.com" ; 62}; 63 64publicEnv = pkgs . writeText "wafrn-public.env" ( 65lib . concatStringsSep "\n" ( 66lib . mapAttrsToList 67( name :value :" ${ name } = ${ value } " ) 68wafrnEnvironment 69) 70+ "\n" 71); 72 73internalCaddyfile = pkgs . writeText "wafrn-Caddyfile" '' 74{ 75admin 0.0.0.0:2019 76auto_https off 77} 78 79http:// ${ mediaDomain } { 80root * /var/www/html/uploads/ 81file_server 82} 83 84http:// ${ cacheDomain } { 85reverse_proxy backend:9000 86} 87 88http:// ${ domain } { 89@websocket path /api/websocket/* 90 91handle @websocket { 92reverse_proxy websocket:9000 93} 94 95@backend path \ 96/api* \ 97/fediverse* \ 98/contexts* \ 99/post* \ 100/blog* \ 101/.well-known* 102 103handle @backend { 104reverse_proxy backend:9000 105} 106 107handle { 108root * /var/www/html/frontend/ 109try_files {path} /index.html 110file_server 111} 112} 113'' ; 114 115composeOverride = pkgs . writeText "wafrn-nixos.yml" '' 116services: 117frontend: 118ports: !override 119- "127.0.0.1: ${ toString wafrnPort } :80" 120volumes: 121- " ${ internalCaddyfile } :/etc/caddy-nixos/Caddyfile:ro" 122command: 123- caddy 124- run 125- --config 126- /etc/caddy-nixos/Caddyfile 127- --adapter 128- caddyfile 129 130backend: 131deploy: 132replicas: 1 133 134workers: 135profiles: !override 136- separate-workers 137 138adminer: 139profiles: !override 140- tools 141 142bullboard: 143profiles: !override 144- tools 145 146pds: 147profiles: !override 148- local-pds 149'' ; 150 151docker = " ${ config . virtualisation . docker . package } /bin/docker" ; 152 153stopWafrn = pkgs . writeShellScript "wafrn-stop" '' 154cd ${ wafrnDir } 155 156exec ${ docker } compose \ 157-f docker-compose.default.yml \ 158-f ${ composeOverride } \ 159down 160'' ; 161in 162{ 163virtualisation . docker = { 164enable = true ; 165 166daemon . settings = { 167"data-root" = "/mnt/ext/docker" ; 168 169features = { 170buildkit = true ; 171}; 172}; 173}; 174 175systemd . tmpfiles . rules = [ 176"d /mnt/ext/docker 0710 root root - -" 177"d ${ wafrnDir } 0750 root root - -" 178]; 179 180systemd . services . docker . unitConfig . RequiresMountsFor = [ 181"/mnt/ext/docker" 182]; 183 184environment . systemPackages = with pkgs ; [ 185git 186]; 187 188services . caddy = { 189enable = true ; 190 191virtualHosts = { 192" ${ domain } " . extraConfig = '' 193reverse_proxy 127.0.0.1: ${ toString wafrnPort } 194'' ; 195 196" ${ mediaDomain } " . extraConfig = '' 197reverse_proxy 127.0.0.1: ${ toString wafrnPort } 198'' ; 199 200" ${ cacheDomain } " . extraConfig = '' 201reverse_proxy 127.0.0.1: ${ toString wafrnPort } 202'' ; 203}; 204}; 205 206systemd . services . wafrn = { 207description = "Wafrn" ; 208 209wantedBy = [ 210"multi-user.target" 211]; 212 213wants = [ 214"network-online.target" 215]; 216 217after = [ 218"network-online.target" 219"docker.service" 220"caddy.service" 221]; 222 223requires = [ 224"docker.service" 225]; 226 227unitConfig . RequiresMountsFor = [ 228wafrnDir 229]; 230 231path = with pkgs ; [ 232git 233coreutils 234bash 235]; 236 237environment = wafrnEnvironment // { 238DOCKER_BUILDKIT = "1" ; 239COMPOSE_BAKE = "true" ; 240}; 241 242preStart = '' 243if [ ! -d .git ]; then 244${ pkgs . git } /bin/git clone \ 245--branch main \ 246--single-branch \ 247https://codeberg.org/wafrn/wafrn.git \ 248. 249fi 250 251cat \ 252${ publicEnv } \ 253${ secretsFile } \ 254> /run/wafrn/.env 255 256chmod 600 /run/wafrn/.env 257 258ln -sfn \ 259/run/wafrn/.env \ 260${ wafrnDir } /.env 261'' ; 262 263script = '' 264exec ${ docker } compose \ 265-f docker-compose.default.yml \ 266-f ${ composeOverride } \ 267up \ 268--build \ 269--detach \ 270--remove-orphans 271'' ; 272 273serviceConfig = { 274Type = "oneshot" ; 275RemainAfterExit = true ; 276 277WorkingDirectory = wafrnDir ; 278EnvironmentFile = secretsFile ; 279 280RuntimeDirectory = "wafrn" ; 281RuntimeDirectoryMode = "0700" ; 282 283ExecStop = stopWafrn ; 284 285TimeoutStartSec = 0 ; 286TimeoutStopSec = 120 ; 287}; 288}; 289}