This commit is contained in:
Nio 2026-05-12 09:38:54 +02:00
parent cc60ac8fbd
commit 3a7a4fcffa
2 changed files with 95 additions and 0 deletions

94
forgejo.nix Normal file
View file

@ -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 ];
}