6.5 KiB
Best Practices - Dos and Don'ts
Empfehlungen fuer den sicheren und effizienten Betrieb des Container Spawners.
Inhaltsverzeichnis
Produktions-Checkliste
Vor dem Go-Live
| Kategorie | Aufgabe | Status |
|---|---|---|
| Sicherheit | SECRET_KEY generiert (min. 32 Bytes) | [ ] |
.env nicht im Repository |
[ ] | |
| HTTPS aktiviert | [ ] | |
| Docker Socket Proxy konfiguriert | [ ] | |
| Konfiguration | BASE_DOMAIN korrekt | [ ] |
| TRAEFIK_NETWORK existiert | [ ] | |
| Resource-Limits angemessen | [ ] | |
| Infrastruktur | DNS-Eintraege (Wildcard) | [ ] |
| Traefik laeuft stabil | [ ] | |
| Firewall konfiguriert | [ ] | |
| Monitoring | Health-Check funktioniert | [ ] |
| Logs werden geschrieben | [ ] | |
| Backup-Strategie | [ ] | |
| Testing | Login/Signup funktioniert | [ ] |
| Container wird erstellt | [ ] | |
| Subdomain erreichbar | [ ] |
Dos - Empfohlene Praktiken
Konfiguration
DO: SECRET_KEY sicher generieren
# Guter Key (32 Bytes = 64 Hex-Zeichen)
python3 -c "import secrets; print(secrets.token_hex(32))"
DO: Umgebungsvariablen fuer sensible Daten
# In .env (nie committen!)
SECRET_KEY=abc123...
DATABASE_URL=postgresql://...
DO: Resource-Limits setzen
# In .env
DEFAULT_MEMORY_LIMIT=512m
DEFAULT_CPU_QUOTA=50000
Deployment
DO: Docker Compose fuer Orchestrierung
# Nicht einzelne docker run Befehle
docker-compose up -d
docker-compose logs -f
docker-compose down
DO: Images taggen
# Versionierte Tags statt :latest in Produktion
docker build -t spawner:0.1.0 .
docker build -t spawner:latest .
DO: Health-Checks nutzen
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000/health"]
interval: 30s
timeout: 10s
retries: 3
Monitoring
DO: Logs zentralisieren
# docker-compose.yml
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
DO: Regelmaessige Backups
# Cronjob fuer taegliches Backup
0 2 * * * /pfad/zu/spawner/backup.sh
DO: Disk-Space ueberwachen
# Docker-Ressourcen pruefen
docker system df
docker system prune -f # Vorsicht in Produktion!
Sicherheit
DO: HTTPS erzwingen
# Traefik-Labels
- "traefik.http.routers.spawner.entrypoints=websecure"
- "traefik.http.routers.spawner.tls=true"
DO: Minimale Berechtigungen
# Docker Socket Proxy statt direktem Zugriff
DOCKER_HOST: tcp://docker-proxy:2375
DO: Container als Non-Root
# Im User-Template
USER nginx
# oder
RUN useradd -m appuser && chown -R appuser /app
USER appuser
Don'ts - Zu vermeiden
Konfiguration
DON'T: Hardcoded Secrets
# NIEMALS!
SECRET_KEY = "supersecret123"
DON'T: Debug-Mode in Produktion
# NIEMALS in Produktion!
app.run(debug=True)
FLASK_DEBUG=1
DON'T: Schwache Keys
# ZU KURZ / ZU EINFACH
SECRET_KEY=test
SECRET_KEY=12345
Deployment
DON'T: Manuelles Container-Management
# Vermeiden - besser docker-compose
docker run -d --name spawner ...
docker stop spawner
docker rm spawner
DON'T: Unversionierte Images in Produktion
# Vermeiden
USER_TEMPLATE_IMAGE=user-service-template:latest
# Besser
USER_TEMPLATE_IMAGE=user-service-template:0.1.0
DON'T: Ohne Health-Checks deployen
Sicherheit
DON'T: Docker Socket direkt exponieren
# NIEMALS!
ports:
- "2375:2375" # Docker API oeffentlich
DON'T: .env committen
# .gitignore MUSS enthalten:
.env
*.db
DON'T: Container ohne Resource-Limits
# Vermeiden - DoS-Risiko
container = client.containers.run(image)
# Besser
container = client.containers.run(
image,
mem_limit='512m',
cpu_quota=50000
)
DON'T: Root-Container in Produktion
Wartung
DON'T: Logs ignorieren
# Regelmaessig pruefen!
docker-compose logs --tail=100 spawner
DON'T: Backups vergessen
DON'T: Updates aufschieben
# Regelmaessig aktualisieren
git pull origin main
docker-compose build
docker-compose up -d
Haeufige Fehler
1. "Connection refused" beim Health-Check
Ursache: Container noch nicht bereit
Loesung: Warten oder start_period erhoehen:
healthcheck:
start_period: 30s
2. "Network not found"
Ursache: Traefik-Netzwerk existiert nicht
Loesung:
docker network create web
# Oder TRAEFIK_NETWORK in .env anpassen
3. "Permission denied" bei Docker Socket
Ursache: Spawner-Container hat keinen Zugriff
Loesung:
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
Oder Docker-Gruppe:
sudo usermod -aG docker $USER
4. "Image not found"
Ursache: User-Template nicht gebaut
Loesung:
docker build -t user-service-template:latest ./user-template/
5. Subdomain nicht erreichbar
Ursache: DNS oder Traefik-Konfiguration
Diagnose:
# DNS pruefen
nslookup username.example.com
# Traefik-Routes pruefen (Dashboard)
# Container-Labels pruefen
docker inspect user-xxx | jq '.[0].Config.Labels'
6. "Database locked"
Ursache: SQLite-Konkurrenzzugriff
Loesung fuer Produktion: PostgreSQL verwenden:
DATABASE_URL=postgresql://spawner:pass@postgres:5432/spawner
7. Container startet, aber Service nicht erreichbar
Ursache: Falscher Port in Labels
Loesung: Port in container_manager.py pruefen:
# Muss mit EXPOSE im Dockerfile uebereinstimmen
f'traefik.http.services.user{user_id}.loadbalancer.server.port': '8080'
Quick Reference
Nuetzliche Befehle
# Status
docker-compose ps
docker ps --filter 'label=spawner.managed=true'
# Logs
docker-compose logs -f spawner
docker logs user-xxx-1
# Neustart
docker-compose restart spawner
# Komplett neu
docker-compose down
docker-compose up -d --build
# Cleanup
docker system prune -f
docker volume prune -f
Debugging
# In Container einsteigen
docker exec -it spawner bash
# Python-Shell
docker exec -it spawner python
# Datenbank
docker exec spawner sqlite3 /app/data/users.db ".tables"
Zurueck zur Dokumentations-Uebersicht