"Wer hat eigentlich diese Zeile in der nginx.conf geändert?" — "Wann wurde der Cronjob deaktiviert?" — "Die Datei war gestern noch anders, ich weiß nur nicht mehr wie."
Solche Fragen kennt jeder, der Server administriert. Die Antwort heißt Git. Nicht nur für Entwickler, sondern für jeden, der Konfigurationsdateien anfasst.
Warum Sysadmins Git brauchen
Versionskontrolle für Code ist selbstverständlich. Für Serverkonfigurationen? Überraschend selten. Dabei passiert hier genau dasselbe:
- Jemand ändert etwas in
/etc/nginx/nginx.conf - Drei Wochen später bricht etwas
- Niemand weiß mehr, was sich verändert hat
Mit Git hat man:
- Vollständige Änderungshistorie: Wann wurde was geändert, von wem, mit welchem Kommentar
- Einfaches Rückgängigmachen:
git revertodergit checkoutbringen eine Datei in den Vorstand - Differenzansicht:
git diffzeigt genau, was sich zwischen zwei Versionen verändert hat - Nachvollziehbarkeit: Pflicht-Dokumentation nach BSI-Grundschutz, ISO 27001 und NIS2
Git Basics für den Serveralltag
Keine Angst vor der Lernkurve — für den Anfang braucht man nur sieben Befehle.
Repository initialisieren:
cd /etc
git init
git config user.name "Systemadmin"
git config user.email "admin@intern.local"
Dateien zum Tracking hinzufügen:
git add nginx/nginx.conf
git add ssh/sshd_config
git add fail2ban/jail.local
Ersten Commit erstellen:
git commit -m "Initiale Konfiguration: nginx, sshd, fail2ban"
Nach einer Änderung:
# Was hat sich verändert?
git diff /etc/nginx/nginx.conf
# Änderungen stagen und committen
git add /etc/nginx/nginx.conf
git commit -m "nginx: client_max_body_size auf 100MB erhöht für Nextcloud"
Historie anzeigen:
git log --oneline /etc/nginx/nginx.conf
Datei auf früheren Stand zurücksetzen:
git checkout abc1234 -- /etc/nginx/nginx.conf
Was versionieren?
Nicht alle Dateien in /etc gehören ins Repo. Empfehlenswert:
| Versionieren | Nicht versionieren |
|---|---|
/etc/nginx/ | /etc/shadow (Passwort-Hashes!) |
/etc/ssh/sshd_config | Private Keys |
/etc/fail2ban/ | Zertifikatsdateien |
/etc/docker/daemon.json | Log-Dateien |
docker-compose.yml-Dateien | Temporäre Dateien |
/etc/crontab, /etc/cron.d/ |
Wichtig: Eine .gitignore-Datei anlegen und sensitive Dateien ausschließen:
cat /etc/.gitignore
shadow
passwd
gshadow
group
*.key
*.pem
*_rsa
*_ecdsa
Gitea / Forgejo: Self-Hosted Git-Server
Wer Konfigurationen nicht lokal im /etc-Repository belassen, sondern zentral für mehrere Server verwalten möchte, braucht einen Git-Server. Die einfachste Option: Gitea oder sein Community-Fork Forgejo — beide laufen als Docker-Container und bieten eine GitHub-ähnliche Web-Oberfläche.
# docker-compose.yml für Forgejo
services:
forgejo:
image: codeberg.org/forgejo/forgejo:latest
restart: unless-stopped
ports:
- "3000:3000"
- "222:22"
volumes:
- forgejo_data:/data
environment:
- USER_UID=1000
- USER_GID=1000
volumes:
forgejo_data:
Nach der Einrichtung (Admin-Account, SSH-Key hinterlegen) kann man:
# Remote auf dem Gitea/Forgejo-Server hinzufügen
cd /etc
git remote add origin ssh://git@gitea.intern.local:222/admin/server-configs.git
git push -u origin main
Jetzt sind alle Konfigurationsänderungen zentral gespeichert, mit Web-UI durchsuchbar und können per Pull Request reviewed werden — auch wenn man alleine arbeitet.
Praktischer Workflow für die tägliche Arbeit
Vor jeder Änderung:
cd /etc
git pull # Falls remote konfiguriert
git status # Was ist aktuell ungetrackt oder geändert?
Änderung durchführen und dokumentieren:
# Konfiguration bearbeiten
nano /etc/nginx/sites-available/nextcloud
# Änderung prüfen
git diff
# Committen mit aussagekräftiger Nachricht
git add nginx/sites-available/nextcloud
git commit -m "nextcloud: proxy_read_timeout auf 300s erhöht (Timeout bei großen Uploads)"
git push
Bei einem Produktionsproblem:
# Letzte fünf Commits anzeigen
git log --oneline -5
# Was hat sich in den letzten 24 Stunden geändert?
git log --since="24 hours ago" --oneline
# Datei auf Stand von gestern zurücksetzen
git checkout HEAD~1 -- /etc/nginx/sites-available/nextcloud
nginx -t && systemctl reload nginx
Automatische Commits mit etckeeper
Wer den manuellen Commit-Schritt vergisst, kann etckeeper einsetzen. Das Tool konfiguriert automatisch ein Git-Repository in /etc und erstellt täglich sowie vor jedem apt-Lauf automatisch Commits:
apt install etckeeper
etckeeper initialisiert /etc automatisch als Git-Repository und committet bei Paketupdates. Als Backup-Netz ideal — ersetzt aber keine aussagekräftigen manuellen Commits.
Docker-Compose-Dateien versionieren
Wer Docker einsetzt, sollte alle docker-compose.yml-Dateien ebenfalls unter Versionskontrolle stellen. Empfehlenswert ist ein separates Repository:
mkdir ~/docker-configs
cd ~/docker-configs
git init
# Alle compose-Dateien kopieren oder verlinken
git add .
git commit -m "Initiale Docker-Compose-Sammlung: nginx, nextcloud, forgejo"
Vorteil: Bei einem Serverumzug oder nach einem Hardwareausfall ist die gesamte Containerinfrastruktur in wenigen Minuten wiederhergestellt — git clone und docker compose up -d.
Fazit
Git ist kein Entwickler-Tool. Es ist ein Werkzeug für jeden, der Dateien verändert, die wichtig sind. Im Serverkontext sorgt es für Nachvollziehbarkeit, schnelle Fehleranalyse und sicheres Rückgängigmachen von Änderungen — drei Dinge, die in jeder professionellen IT-Umgebung unverzichtbar sind.
Wer Gitea oder Forgejo hinter einem Nginx Reverse Proxy betreiben möchte, findet die passende Anleitung im Artikel Nginx Reverse Proxy einrichten.