Files
michaelschiemer/docs/deployment/quick-deploy.md

4.5 KiB

Quick Deploy Guide

Schnellanleitung für Production Deployments.

Voraussetzungen

  • WireGuard VPN aktiv: sudo wg-quick up wg0-production
  • SSH-Zugang konfiguriert
  • Docker Registry läuft auf Production Server

Deployment in 5 Schritten

1. Image bauen und pushen

# Im Projekt-Root
docker build -f Dockerfile.production -t 94.16.110.151:5000/framework:latest .
docker push 94.16.110.151:5000/framework:latest

Verify Push:

curl http://94.16.110.151:5000/v2/framework/tags/list

2. Config-Files auf Server kopieren

# Falls docker-compose.prod.yml oder .env geändert wurden
scp docker-compose.prod.yml deploy@94.16.110.151:/home/deploy/framework/
scp .env.production deploy@94.16.110.151:/home/deploy/framework/.env

3. Auf Server deployen

ssh deploy@94.16.110.151
cd /home/deploy/framework

# Pull und Deploy
docker-compose -f docker-compose.yml -f docker-compose.prod.yml pull
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

4. Status checken

# Container Status
docker-compose -f docker-compose.yml -f docker-compose.prod.yml ps

# Logs anschauen
docker-compose -f docker-compose.yml -f docker-compose.prod.yml logs -f web php

# Supervisor Status (im web container)
docker exec web supervisorctl status

5. Application testen

# Von lokaler Maschine (via WireGuard)
curl -k -I https://94.16.110.151:8443/

# Erwartetes Ergebnis:
# HTTP/2 200
# server: nginx

Rollback

Falls Probleme auftreten:

# Auf Server
cd /home/deploy/framework

# Vorheriges Image ID finden
docker images 94.16.110.151:5000/framework

# Zu spezifischem Image wechseln
docker-compose -f docker-compose.yml -f docker-compose.prod.yml down
docker tag 94.16.110.151:5000/framework@sha256:<old-digest> 94.16.110.151:5000/framework:latest
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

Monitoring URLs

Zugang nur via WireGuard VPN (10.8.0.1):

Watchtower Auto-Updates

Watchtower überwacht automatisch und updated Container mit neuem Image (alle 5 Minuten).

Status checken:

docker logs watchtower

Manuell triggern:

# Watchtower neu starten (triggert sofortigen Check)
docker restart watchtower

Troubleshooting

Container nicht healthy

# Logs anschauen
docker logs web
docker logs php

# Im Container debuggen
docker exec -it web sh
docker exec -it php sh

# Supervisor Status
docker exec web supervisorctl status

# Nginx/PHP-FPM Prozesse
docker exec web ps aux | grep -E 'nginx|php-fpm'

Database Connection Issues

# PostgreSQL Connection testen
docker exec php php -r "new PDO('pgsql:host=db;dbname=framework_db', 'framework_user', 'password');"

# Database Logs
docker logs db

# In Database connecten
docker exec -it db psql -U framework_user -d framework_db

Redis Connection Issues

# Redis Connection testen
docker exec php php -r "var_dump((new Redis())->connect('redis', 6379));"

# Redis Logs
docker logs redis

# Redis CLI
docker exec -it redis redis-cli

Maintenance Commands

Database Backup

# Manual Backup
docker exec db pg_dump -U framework_user framework_db > backup_$(date +%Y%m%d_%H%M%S).sql

Logs Cleanup

# Storage Logs leeren (auf Server)
docker exec web sh -c 'rm -rf /var/www/html/storage/logs/*.log'

# Docker Logs cleanup
docker system prune -f
docker volume prune -f

Image Cleanup

# Alte Images entfernen
docker image prune -a -f

# Nur untagged images
docker image prune -f

Performance Check

# Container Resource Usage
docker stats

# PHP-FPM Status
docker exec web curl http://localhost/php-fpm-status

# Nginx Status
docker exec web curl http://localhost/nginx-status

# Database Connections
docker exec db psql -U framework_user -d framework_db -c "SELECT count(*) FROM pg_stat_activity;"

SSL Certificate Renewal

# Let's Encrypt Renewal (auf Server als root)
certbot renew
docker exec web nginx -s reload

Nützliche Aliases

Füge zu ~/.bashrc auf Production Server hinzu:

alias dc='docker-compose -f docker-compose.yml -f docker-compose.prod.yml'
alias dcup='dc up -d'
alias dcdown='dc down'
alias dcps='dc ps'
alias dclogs='dc logs -f'
alias dcrestart='dc restart'

Dann kannst du einfach verwenden:

dcup     # Deploy
dcps     # Status
dclogs   # Logs anschauen