94 lines
3.4 KiB
Nix
94 lines
3.4 KiB
Nix
{ 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 ];
|
||
}
|