- Remove redundant `$container` parameter in `RedisPoolInitializer` instantiation. - Streamline container interactions for improved clarity and maintainability.
263 lines
8.2 KiB
Markdown
263 lines
8.2 KiB
Markdown
# Plan: Konsolidierung der Production Docker-Compose Konfiguration
|
|
|
|
**Datum**: 2025-11-04
|
|
**Ziel**: `docker-compose.production.yml` im Root verwenden statt `deployment/stacks/application/docker-compose.yml`
|
|
|
|
## Aktuelle Situation
|
|
|
|
### Datei 1: `docker-compose.production.yml` (Repository Root)
|
|
**Typ**: Override-Datei f?r `docker-compose.base.yml`
|
|
**Status**: ? Aktiv verwendet in Deployment-Skripten
|
|
**Services**: `web`, `php`, `db`, `redis`, `queue-worker`, `certbot`
|
|
**Struktur**: Base + Override Pattern
|
|
|
|
**Verwendung**:
|
|
```bash
|
|
docker compose -f docker-compose.base.yml -f docker-compose.production.yml up -d
|
|
```
|
|
|
|
### Datei 2: `deployment/stacks/application/docker-compose.yml`
|
|
**Typ**: Vollst?ndige Docker-Compose-Definition
|
|
**Status**: ?? Wird noch in einigen Dokumenten referenziert, aber vermutlich nicht mehr aktiv verwendet
|
|
**Services**: `app`, `nginx`, `redis`, `queue-worker`, `scheduler`
|
|
**Struktur**: Standalone-Definition
|
|
|
|
**Referenzen gefunden in**:
|
|
- `deployment/ansible/inventory/production.yml`
|
|
- `deployment/docs/reference/application-stack.md`
|
|
- `deployment/README.md`
|
|
- Verschiedene Test-Dokumente
|
|
|
|
## Vergleich der Services
|
|
|
|
| Service | docker-compose.production.yml | application/docker-compose.yml |
|
|
|---------|-------------------------------|-------------------------------|
|
|
| **PHP Runtime** | `php` | `app` |
|
|
| **Web Server** | `web` | `nginx` |
|
|
| **Database** | `db` | ? (nicht definiert, nutzt externen PostgreSQL) |
|
|
| **Redis** | `redis` | `redis` |
|
|
| **Queue Worker** | `queue-worker` | `queue-worker` |
|
|
| **Scheduler** | ? (nicht definiert) | `scheduler` ? |
|
|
| **Certbot** | `certbot` ? | ? |
|
|
|
|
## Unterschiede
|
|
|
|
### 1. Service-Namen
|
|
- **production.yml**: `web`, `php` (konsistent mit base.yml)
|
|
- **application.yml**: `nginx`, `app` (eigene Namenskonvention)
|
|
|
|
### 2. Scheduler Service
|
|
- **production.yml**: ? Fehlt
|
|
- **application.yml**: ? Vorhanden (`scheduler`)
|
|
|
|
### 3. Certbot Service
|
|
- **production.yml**: ? Vorhanden (f?r Let's Encrypt)
|
|
- **application.yml**: ? Fehlt
|
|
|
|
### 4. Database Service
|
|
- **production.yml**: ? Definiert (`db`)
|
|
- **application.yml**: ? Nutzt externen PostgreSQL-Stack (`postgres`)
|
|
|
|
### 5. Netzwerk-Konfiguration
|
|
- **production.yml**: Nutzt `frontend`, `backend`, `cache` (aus base.yml)
|
|
- **application.yml**: Nutzt `app-internal`, `traefik-public` (external networks)
|
|
|
|
## Problemanalyse
|
|
|
|
### Problem 1: Service-Namen-Mismatch
|
|
Die Service-Namen sind unterschiedlich, was zu Verwirrung f?hrt:
|
|
- `php` vs `app`
|
|
- `web` vs `nginx`
|
|
|
|
### Problem 2: Fehlender Scheduler
|
|
`docker-compose.production.yml` hat keinen `scheduler` Service, der in `application/docker-compose.yml` vorhanden ist.
|
|
|
|
### Problem 3: Unterschiedliche Architektur
|
|
- **production.yml**: Nutzt Base+Override Pattern mit `db` Service
|
|
- **application.yml**: Nutzt externen PostgreSQL-Stack (`postgres`)
|
|
|
|
## L?sungsplan
|
|
|
|
### Phase 1: Scheduler zu production.yml hinzuf?gen
|
|
|
|
**Ziel**: `scheduler` Service in `docker-compose.production.yml` hinzuf?gen
|
|
|
|
**Begr?ndung**: Der Scheduler ist wichtig f?r Cron-Jobs und sollte in Production verf?gbar sein.
|
|
|
|
**Implementierung**:
|
|
```yaml
|
|
# In docker-compose.production.yml hinzuf?gen:
|
|
scheduler:
|
|
# Production restart policy
|
|
restart: always
|
|
|
|
# Use same build as php service
|
|
image: git.michaelschiemer.de:5000/framework:latest
|
|
|
|
# Production volumes
|
|
volumes:
|
|
- /home/deploy/michaelschiemer/current:/var/www/html:ro
|
|
- storage:/var/www/html/storage:rw
|
|
- var-data:/var/www/html/var:rw
|
|
- /home/deploy/michaelschiemer/shared/.env.production:/var/www/html/.env:ro
|
|
|
|
environment:
|
|
- APP_ENV=production
|
|
- APP_DEBUG=false
|
|
# Use Docker Secrets
|
|
- DB_PASSWORD_FILE=/run/secrets/db_user_password
|
|
- REDIS_PASSWORD_FILE=/run/secrets/redis_password
|
|
- APP_KEY_FILE=/run/secrets/app_key
|
|
- VAULT_ENCRYPTION_KEY_FILE=/run/secrets/vault_encryption_key
|
|
secrets:
|
|
- db_user_password
|
|
- redis_password
|
|
- app_key
|
|
- vault_encryption_key
|
|
|
|
command: php console.php scheduler:run
|
|
|
|
# Health checks
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "php -r 'exit(0);' && test -f /var/www/html/console.php || exit 1"]
|
|
interval: 60s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 30s
|
|
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
redis:
|
|
condition: service_healthy
|
|
php:
|
|
condition: service_healthy
|
|
```
|
|
|
|
### Phase 2: Referenzen aktualisieren
|
|
|
|
**Ziel**: Alle Referenzen auf `application/docker-compose.yml` entfernen/aktualisieren
|
|
|
|
**Dateien zu aktualisieren**:
|
|
1. `deployment/ansible/inventory/production.yml` - `compose_file` entfernen/aktualisieren
|
|
2. `deployment/docs/reference/application-stack.md` - Dokumentation aktualisieren
|
|
3. `deployment/README.md` - Referenzen aktualisieren
|
|
4. Test-Dokumente - Referenzen aktualisieren
|
|
|
|
### Phase 3: application/docker-compose.yml entfernen
|
|
|
|
**Voraussetzungen**:
|
|
- ? Alle Referenzen aktualisiert
|
|
- ? Scheduler in production.yml hinzugef?gt
|
|
- ? Deployment-Skripte testen
|
|
- ? Production-Deployment erfolgreich
|
|
|
|
**Aktion**:
|
|
- `deployment/stacks/application/docker-compose.yml` l?schen
|
|
- `deployment/stacks/application/docker-compose.base.yml` pr?fen (falls redundant)
|
|
- Backup erstellen vor L?schung
|
|
|
|
### Phase 4: PostgreSQL-Stack Integration
|
|
|
|
**Wichtig**: Da `docker-compose.production.yml` aktuell einen eigenen `db` Service definiert, aber wir zum PostgreSQL-Stack verbinden wollen:
|
|
|
|
**Option A**: `db` Service aus production.yml entfernen
|
|
- Nutzt externen PostgreSQL-Stack (`postgres`)
|
|
- F?gt `app-internal` Netzwerk hinzu (via `docker-compose.postgres-override.yml`)
|
|
|
|
**Option B**: `db` Service behalten (wenn separate Production-DB gew?nscht)
|
|
- Nutzt eigenen `db` Service
|
|
- Keine Verbindung zum PostgreSQL-Stack n?tig
|
|
|
|
**Empfehlung**: Option A - Nutze externen PostgreSQL-Stack f?r Konsistenz
|
|
|
|
## Migrationspfad
|
|
|
|
### Schritt 1: Scheduler hinzuf?gen
|
|
```bash
|
|
# 1. Scheduler zu docker-compose.production.yml hinzuf?gen
|
|
# 2. Testen lokal
|
|
docker compose -f docker-compose.base.yml -f docker-compose.production.yml config
|
|
```
|
|
|
|
### Schritt 2: Referenzen pr?fen
|
|
```bash
|
|
# Alle Referenzen finden
|
|
grep -r "stacks/application/docker-compose" deployment/
|
|
grep -r "application/docker-compose" deployment/
|
|
```
|
|
|
|
### Schritt 3: Referenzen aktualisieren
|
|
- Dokumentation aktualisieren
|
|
- Ansible-Playbooks pr?fen
|
|
- Deployment-Skripte aktualisieren
|
|
|
|
### Schritt 4: Testing
|
|
```bash
|
|
# Test Production-Deployment
|
|
docker compose -f docker-compose.base.yml \
|
|
-f docker-compose.production.yml \
|
|
-f docker-compose.postgres-override.yml \
|
|
config
|
|
|
|
# Alle Services pr?fen
|
|
docker compose -f docker-compose.base.yml \
|
|
-f docker-compose.production.yml \
|
|
-f docker-compose.postgres-override.yml \
|
|
ps
|
|
```
|
|
|
|
### Schritt 5: Cleanup
|
|
```bash
|
|
# Backup erstellen
|
|
cp deployment/stacks/application/docker-compose.yml \
|
|
deployment/stacks/application/docker-compose.yml.backup
|
|
|
|
# Datei entfernen
|
|
rm deployment/stacks/application/docker-compose.yml
|
|
```
|
|
|
|
## Checkliste
|
|
|
|
- [ ] Scheduler Service zu `docker-compose.production.yml` hinzuf?gen
|
|
- [ ] Alle Referenzen auf `application/docker-compose.yml` finden
|
|
- [ ] Dokumentation aktualisieren
|
|
- [ ] Ansible-Playbooks aktualisieren
|
|
- [ ] Deployment-Skripte testen
|
|
- [ ] Production-Deployment testen
|
|
- [ ] Backup von `application/docker-compose.yml` erstellen
|
|
- [ ] `application/docker-compose.yml` entfernen
|
|
- [ ] `docker-compose.postgres-override.yml` integrieren (f?r PostgreSQL-Stack)
|
|
|
|
## Risiken
|
|
|
|
### Risiko 1: Service-Namen-?nderungen
|
|
**Problem**: Services haben unterschiedliche Namen (`php` vs `app`, `web` vs `nginx`)
|
|
|
|
**L?sung**:
|
|
- Deployment-Skripte m?ssen Service-Namen aktualisieren
|
|
- `php` statt `app`, `web` statt `nginx`
|
|
|
|
### Risiko 2: Fehlende Features
|
|
**Problem**: `application/docker-compose.yml` k?nnte Features haben, die in `production.yml` fehlen
|
|
|
|
**L?sung**:
|
|
- Vergleich durchf?hren
|
|
- Scheduler bereits identifiziert und wird hinzugef?gt
|
|
- Weitere Features pr?fen
|
|
|
|
### Risiko 3: Referenzen vergessen
|
|
**Problem**: Versteckte Referenzen k?nnten zu Fehlern f?hren
|
|
|
|
**L?sung**:
|
|
- Systematische Suche nach allen Referenzen
|
|
- Tests durchf?hren
|
|
|
|
## N?chste Schritte
|
|
|
|
1. ? Plan erstellt
|
|
2. ? Scheduler zu `docker-compose.production.yml` hinzuf?gen
|
|
3. ? Referenzen systematisch finden und aktualisieren
|
|
4. ? Testing durchf?hren
|
|
5. ? Cleanup: `application/docker-compose.yml` entfernen
|