From 3a7a4fcffab65f9e592ad111a19cbffdbb01e55f Mon Sep 17 00:00:00 2001 From: Nio Date: Tue, 12 May 2026 09:38:54 +0200 Subject: [PATCH] Forgejo --- configuration.nix | 1 + forgejo.nix | 94 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 forgejo.nix diff --git a/configuration.nix b/configuration.nix index 9522a31..6424a93 100644 --- a/configuration.nix +++ b/configuration.nix @@ -5,6 +5,7 @@ ./hardware-configuration.nix # Add further modules here later, e.g.: ./programs.nix + ./forgejo.nix # ./modules/nextcloud.nix # ./modules/wireguard.nix # ./modules/docker.nix diff --git a/forgejo.nix b/forgejo.nix new file mode 100644 index 0000000..b4755ce --- /dev/null +++ b/forgejo.nix @@ -0,0 +1,94 @@ +{ 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 ]; +}