{ pkgs, lib, config, ... }: let inherit (lib) mkEnableOption; cfg = config.mods.server.lemmy; port = config.mods.server.local.ports.lemmy-api; port-ui = config.mods.server.local.ports.lemmy-ui; port-pict = config.mods.server.local.ports.pict-rs; hostname = "lemmy.muon.host"; bind = "0.0.0.0"; in { options.mods.server.lemmy = { enable = mkEnableOption { default = false; description = "enables lemmy engine server"; }; }; config = { services.lemmy = lib.mkIf cfg.enable { enable = true; ui.port = port-ui; settings = { inherit port hostname bind; }; database.createLocally = true; }; systemd.services.lemmy-ui = lib.mkIf cfg.enable { environment = lib.mkForce { LEMMY_UI_HOST = "${bind}:${toString port-ui}"; LEMMY_UI_LEMMY_INTERNAL_HOST = "${bind}:${toString port}"; LEMMY_UI_LEMMY_EXTERNAL_HOST = hostname; LEMMY_UI_HTTPS = "false"; NODE_ENV = "production"; }; }; services.pict-rs = lib.mkIf cfg.enable { enable = true; port = port-pict; address = "0.0.0.0"; }; services.nginx.virtualHosts."${hostname}" = let ui = "http://10.0.0.3:${toString port-ui}"; backend = "http://10.0.0.3:${toString port}"; in lib.mkIf config.mods.server.nginx.enable { forceSSL = true; enableACME = true; locations = { "~ ^/(api|pictrs|feeds|nodeinfo|.well-known)" = { # backend requests proxyPass = backend; proxyWebsockets = true; recommendedProxySettings = true; }; "/" = { # mixed frontend and backend requests, based on the request headers extraConfig = '' set $proxpass "${ui}"; if ($http_accept = "application/activity+json") { set $proxpass "${backend}"; } if ($http_accept = "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") { set $proxpass "${backend}"; } if ($request_method = POST) { set $proxpass "${backend}"; } # Cuts off the trailing slash on URLs to make them valid rewrite ^(.+)/+$ $1 permanent; proxy_pass $proxpass; # Proxied `Host` header is required to validate ActivityPub HTTP signatures for incoming events. # The other headers are optional, for the sake of better log data. proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ''; }; }; }; }; }