Selbst gehosteter, S3-kompatibler Objektspeicher für Backups: MinIO hinter einem Nginx-Proxy, dazu ein rclone-basierter Backup-Agent mit versionierten Buckets. Ihre Offsite-Backups ohne Cloud-Rechnung
Selbst gehosteter, S3-kompatibler Objektspeicher für Backups: MinIO hinter einem Nginx-Proxy, dazu ein rclone-basierter Backup-Agent mit versionierten Buckets. Ihre Offsite-Backups ohne Cloud-Rechnung
Das Eingangstür-Muster: Nginx terminiert TLS mit automatischer Let's-Encrypt-Erneuerung über Certbot, gehärtet durch CrowdSec als WAF/IPS mit dem Nginx-Bouncer, aktuell gehalten von Watchtower. Eine Compose-Datei vor jedem anderen Stack hier.
Ein Deployment-Guide mit lauffähigen Beispielen — kein herunterladbares Produkt. Alles unten ist die tatsächlich eingesetzte Konfiguration, gekürzt auf das, worauf es ankommt.
services:
nginx:
image: nginx:${NGINX_VERSION:-1.27-alpine}
container_name: ssl-nginx
restart: unless-stopped
ports:
- ${HTTP_PORT:-80}:80
- ${HTTPS_PORT:-443}:443
volumes:
- ./config/nginx.conf:/etc/nginx/nginx.conf:ro
- ./config/conf.d:/etc/nginx/conf.d:ro
- certbot-www:/var/www/certbot
- certbot-certs:/etc/letsencrypt
- ${LOG_DIR:-./logs}:/var/log/nginx
depends_on:
certbot:
condition: service_completed_successfully
networks:
- proxy
healthcheck:
test:
- CMD
- nginx
- -t
interval: 30s
timeout: 5s
retries: 3
crowdsec:
image: crowdsecurity/crowdsec:${CROWDSEC_VERSION:-v1.6.8}
container_name: ssl-crowdsec
restart: unless-stopped
environment:
- COLLECTIONS=crowdsecurity/nginx
- GID=${PGID:-1000}
- UID=${PUID:-1000}
volumes:
- crowdsec-db:/var/lib/crowdsec/data
- crowdsec-config:/etc/crowdsec
- ${LOG_DIR:-./logs}:/var/log/nginx:ro
networks:
- proxy
Auszug — nginx, crowdsec aus der Compose-Datei. Die übrigen Services (proxies, init jobs, exporters) folgen demselben Muster und binden ihre Konfiguration aus einem config/-Verzeichnis ein.
Kopieren Sie .env.example zu .env und setzen Sie mindestens:
HTTP_PORT=80
HTTPS_PORT=443
NGINX_VERSION=1.27-alpine
LOG_DIR=./logs
PROXY_NETWORK=ssl-reverse-proxy
CERTBOT_VERSION=latest
.env setzen — niemals die Beispielwerte übernehmenJede eingehende Verbindung landet zuerst auf Nginx: Es terminiert TLS, liefert Statisches direkt aus und reicht den Rest an den Upstream-Stack im gemeinsamen Proxy-Netzwerk weiter. Bevor der Request irgendwo hin proxyt, prüft der CrowdSec-Bouncer die Client-IP gegen die lokale Decision-List — auffällige IPs bekommen ein 403 und erreichen nie einen Upstream. Diese Reihenfolge ist das gesamte Sicherheitsmodell: Erkennung passiert in Logs, die Nginx ohnehin schreibt, und Durchsetzung am Rand, wo sie am günstigsten ist.
Zertifikats-Traffic ist die eine Ausnahme vom Proxy-Pfad.
Let's-Encrypt-Validierungen unter /.well-known/acme-challenge/ werden direkt
aus dem gemeinsamen Certbot-Volume ausgeliefert, sodass Erneuerungen
funktionieren, während fast alle Routen bereits proxyen.
Drei Fehler machen den Großteil der Edge-Vorfälle in der Praxis aus.
Stilles Zertifikats-Ablaufen: Der Certbot-Container beendet sich erfolgreich,
hat aber nichts erneuert — prüfen mit echo | openssl s_client -connect ihre.domain:443 2>/dev/null | openssl x509 -noenddate und sicherstellen, dass
der Webroot-Pfad im vhost zum Certbot-Volume-Mount passt. CrowdSec-Fehlalarme:
Die eigene Büro-IP löst nach einem fehlkonfigurierten Cron ein Szenario aus —
cscli decisions list zeigt, wer gesperrt ist und warum, und der Whitelist-Eintrag
beendet die Überraschung. 502er nach einem Upstream-Redeploy: Der neue Container
ist einem anderen Compose-Netzwerk beigetreten als dem, in das Nginx proxyt —
Upstream-Stacks müssen dem gemeinsamen Proxy-Netzwerk namentlich beitreten,
nicht neu anlegen.
Jedes Image-Tag in der Compose-Datei löst sich über die .env auf, und die
.env.example pinnt konkrete Versionen aus Grund: Ein Edge-Stack aktualisiert
sich, wenn Sie es entscheiden — nicht, wenn Upstream publiziert. Der in der
Praxis funktionierende Takt ist monatlich: Nginx- und CrowdSec-Changelogs
lesen, Pins anheben, docker compose up -d, Healthchecks beobachten. Certbot
ist die eine Komponente, die sofort dran ist, wenn sich eine Renewal-API
ändert. Halten Sie eine Rollback-Zeile in den Notizen: die vorherigen
Pin-Werte, einen Kopierschritt entfernt.
Warum Nginx mit CrowdSec statt Caddy oder Traefik? Caddy und Traefik automatisieren Zertifikate elegant, aber beide bringen keine Intrusion-Prevention-Schicht mit. CrowdSec liest die Nginx-Access-Logs, erkennt Scan- und Brute-Force-Verhalten, und der Nginx-Bouncer blockiert auffällige IPs am Rand, bevor sie Ihre Anwendungen erreichen. Zertifikats-Automatisierung kommt weiterhin von Certbot — Sie verlieren also nichts.
Wie werden Zertifikate ohne Downtime erneuert?
Certbot läuft im Webroot-Modus: Nginx serviert das Verzeichnis
.well-known/acme-challenge aus einem gemeinsamen Volume, Certbot legt die
Validierungsdatei dort ab, und die Compose-Datei startet Nginx erst, wenn
Certbot fertig ist (depends_on mit service_completed_successfully).
Erneuerungen starten einfach den Certbot-Container neu und laden Nginx nach.
Kann das mehrere Domains und Stacks bedienen?
Ja, genau dafür ist das Muster da. Jeder Upstream-Stack bekommt eine
Virtual-Host-Datei in config/conf.d und wird über das gemeinsame
Docker-Proxy-Netzwerk erreicht. Zertifikate werden pro Server-Block
ausgestellt, und CrowdSec überwacht alle aus einem Log-Stream.
Was macht Watchtower, und soll ich es behalten? Watchtower zieht neuere Images und startet Container nach Zeitplan, damit die Edge-Komponenten ohne Handarbeit gepatcht bleiben. Wenn Sie kontrollierte Upgrades bevorzugen — und bei einem öffentlichen Rand sollten Sie das — entfernen Sie das Watchtower-Profil und aktualisieren Sie im eigenen Takt.
Ein Guide, kein Produkt. Diese Seite ist Deployment-Dokumentation mit lauffähigen Beispielen — kein Zip, kein Download, kein Supportvertrag. Sie adaptieren die Muster auf Ihre eigene Umgebung, und das Ergebnis gehört Ihnen.
Wenn Sie das produktionsreif in Ihrer Infrastruktur wollen: Edge-Sicherheit dieser Art ist Teil meines Infrastruktur-Consultings — Details auf der Consulting-Seite.