NixOS-VPS-small/services/forgejo.nix
2026-05-12 10:08:32 +02:00

94 lines
3.4 KiB
Nix
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ 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 = true;
};
# 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 ];
}