{ config, pkgs, lib, ... }: let # Kurzreferenzen damit du nicht immer den vollen Pfad schreiben musst. # "cfg" zeigt auf den gesamten forgejo-Konfigurationsblock. # "srv" zeigt auf den server-Unterblock innerhalb von forgejo. cfg = config.services.forgejo; srv = cfg.settings.server; in { # ============================================================ # FORGEJO SERVICE # ============================================================ services.forgejo = { enable = true; # PostgreSQL ist stabiler und performanter als SQLite für den echten Betrieb. # NixOS legt die Datenbank und den User automatisch an. database.type = "postgres"; # LFS = Large File Storage. Ermöglicht das Versionieren großer Dateien # (z.B. Binaries, Bilder) über Git. Schadet nicht, also aktivieren. lfs.enable = true; # Wo Forgejo seine Repositories auf dem Dateisystem speichert. # Standardmäßig /var/lib/forgejo/repositories – das ist gut so. # repositoryRoot = "/var/lib/forgejo/repositories"; # optional überschreiben settings = { server = { DOMAIN = "git.nikolai-linschmann.de"; # ROOT_URL muss gesetzt sein, sonst erscheint der Port in allen URLs im Web-UI. # srv.DOMAIN referenziert den Wert der DOMAIN-Option direkt oben. ROOT_URL = "https://${srv.DOMAIN}/"; HTTP_PORT = 3000; # Interner Port, nach außen kommt nur Nginx }; service = { # Registrierung deaktivieren – du bist der einzige Nutzer. # Nach dem ersten Start temporär auf false setzen (siehe Schritt 4), # dann wieder auf true. DISABLE_REGISTRATION = false; }; # Sicherheit: Sessions und Tokens laufen nach 7 Tagen ab. security = { LOGIN_REMEMBER_DAYS = 7; }; }; }; # ============================================================ # NGINX REVERSE PROXY # ============================================================ # Nginx nimmt HTTPS-Anfragen von außen entgegen und leitet # sie intern an Forgejo auf Port 3000 weiter. services.nginx.virtualHosts.${srv.DOMAIN} = { forceSSL = true; # HTTP → HTTPS Redirect enableACME = true; # Let's Encrypt Zertifikat automatisch holen und erneuern extraConfig = '' # Erlaubt große Uploads (z.B. Git-Pushes mit vielen Dateien). # 512M ist ein guter Standardwert für eine persönliche Instanz. client_max_body_size 512M; ''; locations."/" = { # srv.HTTP_PORT ist 3000 – toString wandelt die Zahl in einen String um. proxyPass = "http://127.0.0.1:${toString srv.HTTP_PORT}"; }; }; # ============================================================ # SSH-INTEGRATION # ============================================================ # Damit "git clone git@git.nikolai-linschmann.de:user/repo.git" funktioniert. # Forgejo braucht zu wissen auf welchem Port OpenSSH läuft. services.forgejo.settings.server.SSH_PORT = lib.head config.services.openssh.ports; # lib.head nimmt das erste Element der Liste der SSH-Ports (normalerweise 22). # ============================================================ # FIREWALL # ============================================================ # Port 80 (HTTP) und 443 (HTTPS) müssen offen sein. # Falls das schon zentral in configuration.nix steht, diesen Block weglassen. networking.firewall.allowedTCPPorts = [ 80 443 ]; }