feat: CI/CD pipeline setup complete - Ansible playbooks updated, secrets configured, workflow ready
This commit is contained in:
227
docs/deployment/quick-deploy.md
Normal file
227
docs/deployment/quick-deploy.md
Normal file
@@ -0,0 +1,227 @@
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# 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**:
|
||||
```bash
|
||||
curl http://94.16.110.151:5000/v2/framework/tags/list
|
||||
```
|
||||
|
||||
### 2. Config-Files auf Server kopieren
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
# 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)**:
|
||||
|
||||
- Prometheus: http://10.8.0.1:9090
|
||||
- Grafana: http://10.8.0.1:3000 (admin / $GRAFANA_PASSWORD)
|
||||
- Portainer: https://10.8.0.1:9443
|
||||
|
||||
## Watchtower Auto-Updates
|
||||
|
||||
Watchtower überwacht automatisch und updated Container mit neuem Image (alle 5 Minuten).
|
||||
|
||||
**Status checken**:
|
||||
```bash
|
||||
docker logs watchtower
|
||||
```
|
||||
|
||||
**Manuell triggern**:
|
||||
```bash
|
||||
# Watchtower neu starten (triggert sofortigen Check)
|
||||
docker restart watchtower
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Container nicht healthy
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# Manual Backup
|
||||
docker exec db pg_dump -U framework_user framework_db > backup_$(date +%Y%m%d_%H%M%S).sql
|
||||
```
|
||||
|
||||
### Logs Cleanup
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# Alte Images entfernen
|
||||
docker image prune -a -f
|
||||
|
||||
# Nur untagged images
|
||||
docker image prune -f
|
||||
```
|
||||
|
||||
## Performance Check
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
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:
|
||||
```bash
|
||||
dcup # Deploy
|
||||
dcps # Status
|
||||
dclogs # Logs anschauen
|
||||
```
|
||||
Reference in New Issue
Block a user