fix: DockerSecretsResolver - don't normalize absolute paths like /var/www/html/...
Some checks failed
Deploy Application / deploy (push) Has been cancelled
Some checks failed
Deploy Application / deploy (push) Has been cancelled
This commit is contained in:
328
deployment/MIGRATION.md
Normal file
328
deployment/MIGRATION.md
Normal file
@@ -0,0 +1,328 @@
|
||||
# Migration Guide: Legacy System → Two-Layer Deployment
|
||||
|
||||
Diese Anleitung beschreibt die Migration vom alten Deployment-System zum neuen Two-Layer Deployment-System.
|
||||
|
||||
## Übersicht
|
||||
|
||||
Das neue System trennt klar zwischen:
|
||||
- **Infrastruktur-Layer**: Traefik, Gitea, PostgreSQL (läuft dauerhaft)
|
||||
- **Application-Layer**: PHP-App mit Nginx, Redis, Queue Workers (wird häufig deployt)
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- Backup aller Daten (PostgreSQL, Gitea, Volumes)
|
||||
- SSH-Zugriff auf Production-Server
|
||||
- Docker und Docker Compose installiert
|
||||
- Ausreichend Disk-Space für Migration
|
||||
|
||||
## Schritt 1: Backup erstellen
|
||||
|
||||
### PostgreSQL Backup
|
||||
|
||||
```bash
|
||||
# Auf dem Server
|
||||
cd ~/deployment/legacy/stacks/postgresql-production
|
||||
docker compose exec postgres pg_dump -U postgres michaelschiemer_production > /tmp/postgres_backup_$(date +%Y%m%d_%H%M%S).sql
|
||||
|
||||
# Staging-Datenbank (falls vorhanden)
|
||||
docker compose exec postgres pg_dump -U postgres michaelschiemer_staging > /tmp/postgres_staging_backup_$(date +%Y%m%d_%H%M%S).sql
|
||||
```
|
||||
|
||||
### Gitea Backup
|
||||
|
||||
```bash
|
||||
# Gitea-Daten Volume sichern
|
||||
docker run --rm -v gitea-data:/data -v $(pwd):/backup alpine tar czf /backup/gitea_backup_$(date +%Y%m%d_%H%M%S).tar.gz /data
|
||||
```
|
||||
|
||||
### Application Volumes Backup
|
||||
|
||||
```bash
|
||||
# Production-Code Volume
|
||||
docker run --rm -v production-code:/data -v $(pwd):/backup alpine tar czf /backup/production_code_backup_$(date +%Y%m%d_%H%M%S).tar.gz /data
|
||||
|
||||
# Production-Storage Volume
|
||||
docker run --rm -v production-storage:/data -v $(pwd):/backup alpine tar czf /backup/production_storage_backup_$(date +%Y%m%d_%H%M%S).tar.gz /data
|
||||
```
|
||||
|
||||
## Schritt 2: Infrastruktur deployen
|
||||
|
||||
### 2.1 Verzeichnisstruktur erstellen
|
||||
|
||||
```bash
|
||||
# Auf dem Server
|
||||
mkdir -p /home/deploy/infrastructure/{traefik,gitea,postgresql}/secrets
|
||||
```
|
||||
|
||||
### 2.2 Secrets erstellen
|
||||
|
||||
```bash
|
||||
# Traefik ACME E-Mail
|
||||
echo "your-email@example.com" > /home/deploy/infrastructure/traefik/secrets/acme_email.txt
|
||||
chmod 600 /home/deploy/infrastructure/traefik/secrets/acme_email.txt
|
||||
|
||||
# Gitea PostgreSQL Passwort
|
||||
openssl rand -base64 32 > /home/deploy/infrastructure/gitea/secrets/postgres_password.txt
|
||||
chmod 600 /home/deploy/infrastructure/gitea/secrets/postgres_password.txt
|
||||
|
||||
# Gitea Redis Passwort
|
||||
openssl rand -base64 32 > /home/deploy/infrastructure/gitea/secrets/redis_password.txt
|
||||
chmod 600 /home/deploy/infrastructure/gitea/secrets/redis_password.txt
|
||||
|
||||
# Application PostgreSQL Passwort (aus altem System übernehmen oder neu generieren)
|
||||
# Altes Passwort aus Legacy-System extrahieren oder neu generieren:
|
||||
openssl rand -base64 32 > /home/deploy/infrastructure/postgresql/secrets/postgres_password.txt
|
||||
chmod 600 /home/deploy/infrastructure/postgresql/secrets/postgres_password.txt
|
||||
```
|
||||
|
||||
### 2.3 Infrastructure Stacks deployen
|
||||
|
||||
**Reihenfolge ist wichtig:**
|
||||
|
||||
```bash
|
||||
# 1. Traefik (muss zuerst laufen)
|
||||
cd /home/deploy/infrastructure/traefik
|
||||
docker compose up -d
|
||||
|
||||
# Warten bis Traefik läuft
|
||||
sleep 10
|
||||
docker compose ps
|
||||
|
||||
# 2. PostgreSQL (wird von Application benötigt)
|
||||
cd /home/deploy/infrastructure/postgresql
|
||||
docker compose up -d
|
||||
|
||||
# Warten bis PostgreSQL läuft
|
||||
sleep 10
|
||||
docker compose ps
|
||||
|
||||
# 3. Gitea (nutzt Traefik für SSL)
|
||||
cd /home/deploy/infrastructure/gitea
|
||||
docker compose up -d
|
||||
|
||||
# Warten bis Gitea läuft
|
||||
sleep 10
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
### 2.4 Verifikation
|
||||
|
||||
```bash
|
||||
# Traefik Dashboard
|
||||
curl -k https://traefik.michaelschiemer.de
|
||||
|
||||
# PostgreSQL erreichbar
|
||||
docker network inspect app-internal
|
||||
|
||||
# Gitea erreichbar
|
||||
curl -k https://git.michaelschiemer.de
|
||||
```
|
||||
|
||||
## Schritt 3: Daten migrieren
|
||||
|
||||
### 3.1 PostgreSQL-Daten migrieren
|
||||
|
||||
```bash
|
||||
# Neue Datenbanken erstellen (falls nicht vorhanden)
|
||||
docker compose exec -T postgres psql -U postgres << EOF
|
||||
CREATE DATABASE michaelschiemer;
|
||||
CREATE DATABASE michaelschiemer_staging;
|
||||
EOF
|
||||
|
||||
# Production-Datenbank wiederherstellen
|
||||
docker compose exec -T postgres psql -U postgres michaelschiemer < /tmp/postgres_backup_*.sql
|
||||
|
||||
# Staging-Datenbank wiederherstellen (falls vorhanden)
|
||||
docker compose exec -T postgres psql -U postgres michaelschiemer_staging < /tmp/postgres_staging_backup_*.sql
|
||||
```
|
||||
|
||||
### 3.2 Gitea-Daten migrieren
|
||||
|
||||
```bash
|
||||
# Altes Gitea stoppen
|
||||
cd ~/deployment/legacy/stacks/gitea
|
||||
docker compose down
|
||||
|
||||
# Gitea-Daten Volume kopieren
|
||||
docker run --rm \
|
||||
-v gitea-data:/source:ro \
|
||||
-v gitea-data-new:/dest \
|
||||
alpine sh -c "cp -a /source/. /dest/"
|
||||
|
||||
# Neues Gitea starten (nutzt gitea-data Volume)
|
||||
cd /home/deploy/infrastructure/gitea
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## Schritt 4: Application deployen
|
||||
|
||||
### 4.1 Application-Code auf Server deployen
|
||||
|
||||
```bash
|
||||
# Auf dem Server
|
||||
mkdir -p /home/deploy/michaelschiemer/current
|
||||
cd /home/deploy/michaelschiemer/current
|
||||
|
||||
# Code klonen (oder von altem System kopieren)
|
||||
git clone https://git.michaelschiemer.de/michael/michaelschiemer.git .
|
||||
|
||||
# Oder: Code von altem System kopieren
|
||||
# cp -r ~/deployment/legacy/stacks/production/current/* .
|
||||
```
|
||||
|
||||
### 4.2 Secrets konfigurieren
|
||||
|
||||
```bash
|
||||
# Secrets-Verzeichnis erstellen
|
||||
mkdir -p deployment/secrets/{staging,production}
|
||||
|
||||
# Production Secrets (aus altem System übernehmen oder neu generieren)
|
||||
openssl rand -base64 32 > deployment/secrets/production/db_password.txt
|
||||
openssl rand -base64 32 > deployment/secrets/production/redis_password.txt
|
||||
openssl rand -base64 32 > deployment/secrets/production/app_key.txt
|
||||
chmod 600 deployment/secrets/production/*.txt
|
||||
|
||||
# Staging Secrets
|
||||
openssl rand -base64 32 > deployment/secrets/staging/db_password.txt
|
||||
openssl rand -base64 32 > deployment/secrets/staging/redis_password.txt
|
||||
openssl rand -base64 32 > deployment/secrets/staging/app_key.txt
|
||||
chmod 600 deployment/secrets/staging/*.txt
|
||||
```
|
||||
|
||||
**Wichtig:** Passwörter müssen mit denen in der PostgreSQL-Infrastruktur übereinstimmen!
|
||||
|
||||
### 4.3 Application deployen
|
||||
|
||||
```bash
|
||||
# Production deployen
|
||||
./deployment/scripts/deploy.sh production
|
||||
|
||||
# Oder Staging deployen
|
||||
./deployment/scripts/deploy.sh staging
|
||||
```
|
||||
|
||||
## Schritt 5: Altes System stoppen
|
||||
|
||||
**Nur nach erfolgreicher Migration!**
|
||||
|
||||
```bash
|
||||
# Alte Stacks stoppen
|
||||
cd ~/deployment/legacy/stacks/production
|
||||
docker compose down
|
||||
|
||||
cd ~/deployment/legacy/stacks/staging
|
||||
docker compose down
|
||||
|
||||
# Alte Networks prüfen (können gelöscht werden, wenn nicht mehr benötigt)
|
||||
docker network ls
|
||||
```
|
||||
|
||||
## Schritt 6: Verifikation
|
||||
|
||||
### 6.1 Application erreichbar
|
||||
|
||||
```bash
|
||||
# Production
|
||||
curl -I https://michaelschiemer.de
|
||||
|
||||
# Staging
|
||||
curl -I https://staging.michaelschiemer.de
|
||||
```
|
||||
|
||||
### 6.2 Database-Verbindung testen
|
||||
|
||||
```bash
|
||||
# Von Application-Container aus
|
||||
docker compose exec php php console.php db:status
|
||||
```
|
||||
|
||||
### 6.3 Health Checks
|
||||
|
||||
```bash
|
||||
# Application Health Endpoint
|
||||
curl https://michaelschiemer.de/health
|
||||
|
||||
# Container-Status
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
## Rollback-Plan
|
||||
|
||||
Falls Migration fehlschlägt:
|
||||
|
||||
1. **Altes System wieder starten:**
|
||||
```bash
|
||||
cd ~/deployment/legacy/stacks/production
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
2. **Daten aus Backup wiederherstellen:**
|
||||
```bash
|
||||
# PostgreSQL
|
||||
docker compose exec -T postgres psql -U postgres michaelschiemer < /tmp/postgres_backup_*.sql
|
||||
```
|
||||
|
||||
3. **Probleme analysieren:**
|
||||
- Logs prüfen: `docker compose logs`
|
||||
- Network-Verbindungen prüfen: `docker network inspect`
|
||||
- Secrets prüfen
|
||||
|
||||
4. **Anpassungen vornehmen und erneut migrieren**
|
||||
|
||||
## Checkliste
|
||||
|
||||
- [ ] Backup aller Daten erstellt
|
||||
- [ ] Infrastruktur-Stacks deployt (Traefik, PostgreSQL, Gitea)
|
||||
- [ ] Networks korrekt konfiguriert
|
||||
- [ ] Secrets erstellt und konfiguriert
|
||||
- [ ] PostgreSQL-Daten migriert
|
||||
- [ ] Gitea-Daten migriert
|
||||
- [ ] Application deployt
|
||||
- [ ] Health Checks erfolgreich
|
||||
- [ ] Application erreichbar
|
||||
- [ ] Database-Verbindung funktioniert
|
||||
- [ ] Altes System gestoppt (nach Verifikation)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Network-Probleme
|
||||
|
||||
```bash
|
||||
# Networks prüfen
|
||||
docker network ls
|
||||
docker network inspect traefik-public
|
||||
docker network inspect app-internal
|
||||
docker network inspect infrastructure
|
||||
```
|
||||
|
||||
### Secrets-Probleme
|
||||
|
||||
```bash
|
||||
# Secrets-Dateien prüfen
|
||||
ls -la deployment/secrets/production/
|
||||
ls -la deployment/infrastructure/*/secrets/
|
||||
|
||||
# Berechtigungen prüfen
|
||||
stat deployment/secrets/production/db_password.txt
|
||||
```
|
||||
|
||||
### Container startet nicht
|
||||
|
||||
```bash
|
||||
# Logs prüfen
|
||||
docker compose logs -f <service-name>
|
||||
|
||||
# Container-Status
|
||||
docker compose ps
|
||||
|
||||
# Network-Verbindungen
|
||||
docker network inspect <network-name>
|
||||
```
|
||||
|
||||
## Support
|
||||
|
||||
Bei Problemen während der Migration:
|
||||
1. Logs sammeln: `docker compose logs > migration_logs.txt`
|
||||
2. Container-Status: `docker compose ps > container_status.txt`
|
||||
3. Network-Status: `docker network ls > network_status.txt`
|
||||
|
||||
Reference in New Issue
Block a user