Files
AFC-Demo/SYNOLOGY_DEPLOYMENT.md
T
cbazza 94d02736f7
Build and Deploy to Synology NAS / test (push) Failing after 1h20m56s
Build and Deploy to Synology NAS / build (push) Failing after 11m7s
Build and Deploy to Synology NAS / deploy (push) Has been cancelled
Build and Deploy to Synology NAS / notify (push) Has been cancelled
ci: add automated Gitea Actions deployment workflow for Synology NAS
- Add Gitea Actions workflow for automated build and deployment
- Add deployment script for Synology NAS
- Add Docker Compose configurations for production deployment
- Add Gitea runner setup
- Add comprehensive documentation for CI/CD setup
- Add health check endpoint for deployment verification
- Update .gitignore for CI/CD artifacts
2025-12-17 13:02:38 +01:00

436 lines
11 KiB
Markdown

# Synology NAS Deployment Anleitung
Diese Anleitung beschreibt, wie du diese Laravel-Anwendung auf deiner Synology NAS mit Portainer deployen kannst.
## 📋 Inhaltsverzeichnis
1. [Voraussetzungen](#voraussetzungen)
2. [Manuelles Deployment](#-vorbereitung)
3. [Automatisches CI/CD Deployment](#-automatisches-deployment-mit-gitea-actions)
4. [Monitoring & Wartung](#-monitoring--wartung)
5. [Troubleshooting](#-troubleshooting)
## Voraussetzungen
- Synology NAS mit Docker-Unterstützung
- Portainer läuft bereits auf deiner NAS
- SSH-Zugriff auf die Synology NAS (optional, aber empfohlen)
- Mindestens 2GB freier RAM
- Mindestens 5GB freier Speicherplatz
- (Optional) Gitea für automatisches CI/CD Deployment
## 📦 Vorbereitung
### 1. Projekt-Dateien auf die NAS übertragen
Es gibt mehrere Möglichkeiten, die Dateien auf deine Synology zu übertragen:
#### Option A: Via Git (empfohlen)
```bash
# SSH auf die Synology NAS
ssh admin@your-synology-ip
# Navigiere zu einem geeigneten Verzeichnis (z.B. /volume1/docker/laravel)
cd /volume1/docker
git clone <dein-repository-url> laravel-app
cd laravel-app
```
#### Option B: Via File Station
1. Öffne die Synology File Station
2. Erstelle einen Ordner: `/docker/laravel-app`
3. Lade alle Projekt-Dateien in diesen Ordner hoch
#### Option C: Via rsync/scp
```bash
# Vom lokalen Rechner aus
rsync -avz --exclude 'node_modules' --exclude 'vendor' \
/Users/sebastianfrohlich/Herd/frontend/ \
admin@your-synology-ip:/volume1/docker/laravel-app/
```
### 2. Umgebungsvariablen konfigurieren
```bash
# SSH auf der NAS
cd /volume1/docker/laravel-app
# Kopiere die Synology-Beispiel-Datei
cp .env.synology.example .env.synology
# Bearbeite die Datei mit deinen spezifischen Einstellungen
nano .env.synology
```
**Wichtige Anpassungen in `.env.synology`:**
```env
# Ersetze mit deiner Synology IP-Adresse
APP_URL=http://192.168.1.100:8080
# Setze APP_DEBUG auf false für Produktion
APP_DEBUG=false
# Generiere einen neuen APP_KEY (wichtig für Sicherheit!)
# Dies kann später mit: docker exec laravel_app php artisan key:generate gemacht werden
# PostgreSQL Passwort - ändere dies!
DB_PASSWORD2=dein_sicheres_passwort_hier
```
## 🚀 Deployment mit Portainer
### Methode 1: Docker Compose Stack (empfohlen)
1. **Öffne Portainer** in deinem Browser: `http://your-synology-ip:9000`
2. **Navigiere zu "Stacks"**:
- Klicke auf "Stacks" im linken Menü
- Klicke auf "+ Add stack"
3. **Stack konfigurieren**:
- **Name**: `laravel-app`
- **Build method**: Wähle "Repository"
- **Repository URL**: Gib deine Git-Repository-URL ein (falls vorhanden)
- Oder wähle "Upload" und lade `docker-compose.synology.yml` hoch
- Oder wähle "Web editor" und kopiere den Inhalt von `docker-compose.synology.yml`
4. **Umgebungsvariablen setzen**:
Klicke auf "Add an environment variable" und füge folgende Variablen hinzu:
```
APP_NAME=Laravel
APP_ENV=production
APP_KEY=base64:L9RVZ3pNFyAvTbMqicT1rL5GbgE+7lJerkU9wyc95H8=
APP_DEBUG=false
APP_URL=http://your-synology-ip:8080
DB_CONNECTION2=pgsql
DB_HOST2=postgres
DB_PORT2=5432
DB_DATABASE2=ingest_db
DB_USERNAME2=ingest_user
DB_PASSWORD2=dein_sicheres_passwort
```
5. **Stack deployen**:
- Klicke auf "Deploy the stack"
- Warte, bis der Build-Prozess abgeschlossen ist (kann 5-10 Minuten dauern)
### Methode 2: Build und Deploy manuell via SSH
```bash
# SSH auf die Synology
ssh admin@your-synology-ip
# Navigiere zum Projekt-Verzeichnis
cd /volume1/docker/laravel-app
# Baue das Docker Image
docker build -t laravel-app:latest .
# Starte die Services mit docker-compose
docker-compose -f docker-compose.synology.yml up -d
```
## 🔍 Verifikation
### 1. Überprüfe den Container-Status
In Portainer:
- Gehe zu "Containers"
- Du solltest zwei laufende Container sehen:
- `laravel_app` (Status: running, Port: 0.0.0.0:8080->80/tcp)
- `laravel_postgres` (Status: running, Port: 5432/tcp)
Via SSH:
```bash
docker ps
```
### 2. Überprüfe die Logs
In Portainer:
- Klicke auf den Container `laravel_app`
- Wähle "Logs"
- Du solltest keine Fehler sehen
Via SSH:
```bash
# Laravel App Logs
docker logs laravel_app
# PostgreSQL Logs
docker logs laravel_postgres
```
### 3. Teste die Anwendung
Öffne deinen Browser und navigiere zu:
```
http://your-synology-ip:8080
```
Du solltest die Laravel-Anwendung sehen!
## 🔧 Nützliche Befehle
### Artisan-Befehle ausführen
```bash
# Laravel Cache leeren
docker exec laravel_app php artisan cache:clear
# Neuen APP_KEY generieren
docker exec laravel_app php artisan key:generate
# Migrationen ausführen
docker exec laravel_app php artisan migrate
# Seeder ausführen
docker exec laravel_app php artisan db:seed
```
### Container neustarten
Via Portainer:
- Gehe zu "Containers"
- Wähle den Container aus
- Klicke auf "Restart"
Via SSH:
```bash
docker-compose -f docker-compose.synology.yml restart
```
### Container stoppen und entfernen
Via Portainer:
- Gehe zu "Stacks"
- Wähle den Stack "laravel-app"
- Klicke auf "Stop" oder "Delete"
Via SSH:
```bash
docker-compose -f docker-compose.synology.yml down
# Mit Volumes löschen (Achtung: Löscht die Datenbank!)
docker-compose -f docker-compose.synology.yml down -v
```
### Logs live verfolgen
```bash
# Alle Container
docker-compose -f docker-compose.synology.yml logs -f
# Nur Laravel App
docker logs -f laravel_app
# Nur PostgreSQL
docker logs -f laravel_postgres
```
## 🔐 Sicherheitshinweise
1. **APP_KEY ändern**: Generiere einen neuen APP_KEY für die Produktion:
```bash
docker exec laravel_app php artisan key:generate
```
2. **Datenbank-Passwort**: Ändere das Standard-PostgreSQL-Passwort in `.env.synology`
3. **APP_DEBUG**: Stelle sicher, dass `APP_DEBUG=false` in der Produktion
4. **Firewall**: Konfiguriere die Synology-Firewall, um nur benötigte Ports zu öffnen
5. **SSL/HTTPS**: Für den Produktionsbetrieb solltest du einen Reverse Proxy (z.B. Synology DSM Reverse Proxy) mit SSL-Zertifikat einrichten
## 🌐 Reverse Proxy einrichten (optional, aber empfohlen)
Für den Zugriff über eine Domain mit HTTPS:
1. **In Synology DSM**:
- Gehe zu "Systemsteuerung" → "Anmeldungsportal" → "Erweitert"
- Klicke auf "Reverse Proxy" → "Erstellen"
2. **Konfiguration**:
- **Protokoll**: HTTPS
- **Hostname**: your-domain.com
- **Port**: 443
- **Zielprotokoll**: HTTP
- **Zielhost**: localhost
- **Zielport**: 8080
3. **SSL-Zertifikat**:
- Gehe zu "Systemsteuerung" → "Sicherheit" → "Zertifikat"
- Füge ein Let's Encrypt-Zertifikat hinzu
## 📊 Monitoring & Wartung
### Container-Ressourcen überwachen
In Portainer:
- Gehe zu "Containers"
- Wähle einen Container
- Klicke auf "Stats" für Echtzeit-Metriken (CPU, RAM, Netzwerk)
### Backup
```bash
# PostgreSQL Datenbank sichern
docker exec laravel_postgres pg_dump -U ingest_user ingest_db > backup_$(date +%Y%m%d).sql
# Gesamten Stack sichern (inkl. Volumes)
docker run --rm \
-v laravel-app_postgres-data:/data \
-v /volume1/docker/backups:/backup \
alpine tar czf /backup/postgres-backup-$(date +%Y%m%d).tar.gz /data
```
### Updates
```bash
# Projekt-Code aktualisieren (wenn via Git)
cd /volume1/docker/laravel-app
git pull
# Neu bauen und deployen
docker-compose -f docker-compose.synology.yml up -d --build
# Migrationen ausführen
docker exec laravel_app php artisan migrate --force
```
## ❓ Troubleshooting
### Problem: Container startet nicht
```bash
# Logs prüfen
docker logs laravel_app
# Container interaktiv starten für Debugging
docker exec -it laravel_app sh
```
### Problem: Datenbank-Verbindung fehlgeschlagen
```bash
# PostgreSQL-Container prüfen
docker exec laravel_postgres pg_isready -U ingest_user
# Umgebungsvariablen prüfen
docker exec laravel_app env | grep DB_
```
### Problem: Permissions-Fehler
```bash
# Storage-Permissions korrigieren
docker exec laravel_app chmod -R 775 storage bootstrap/cache
docker exec laravel_app chown -R nginx:nginx storage bootstrap/cache
```
### Problem: Port bereits belegt
Wenn Port 8080 bereits verwendet wird:
1. Öffne `docker-compose.synology.yml`
2. Ändere die Port-Mapping: `"8081:80"` statt `"8080:80"`
3. Aktualisiere `APP_URL` in `.env.synology` entsprechend
## 🤖 Automatisches Deployment mit Gitea Actions
Wenn du Gitea auf deiner Synology NAS verwendest, kannst du den gesamten Build- und Deployment-Prozess automatisieren!
### Vorteile von CI/CD
- ✅ Automatischer Build bei jedem Git Push
- ✅ Automatische Tests vor Deployment
- ✅ Automatisches Deployment auf die NAS
- ✅ Rollback bei Fehlern
- ✅ Keine manuellen Schritte mehr nötig
### Quick Start
1. **Gitea Runner einrichten**
- Siehe detaillierte Anleitung: [GITEA_RUNNER_SETUP.md](GITEA_RUNNER_SETUP.md)
- Kurz: Runner Docker Container auf NAS deployen
- Runner in Gitea registrieren
2. **Repository Secrets konfigurieren**
Gehe in Gitea zu: **Repository → Settings → Secrets**
Füge folgende Secrets hinzu:
```
SYNOLOGY_HOST=192.168.1.100
SYNOLOGY_USER=admin
SYNOLOGY_SSH_KEY=<dein-ssh-private-key>
APP_KEY=<dein-laravel-app-key>
```
3. **Workflow pushen**
Der Workflow in [`.gitea/workflows/deploy-synology.yml`](.gitea/workflows/deploy-synology.yml) ist bereits vorkonfiguriert.
```bash
git add .gitea/workflows/deploy-synology.yml
git commit -m "ci: add automated deployment workflow"
git push origin main
```
4. **Automatisches Deployment genießen! 🎉**
Bei jedem Push auf `main` oder `develop`:
- Tests werden ausgeführt
- Docker Image wird gebaut
- Deployment auf NAS erfolgt automatisch
- Health Check verifiziert Deployment
### Workflow-Ablauf
```mermaid
graph LR
A[Git Push] --> B[Run Tests]
B --> C{Tests OK?}
C -->|Ja| D[Build Docker Image]
C -->|Nein| E[Abbruch]
D --> F[Transfer zu NAS]
F --> G[Deploy auf NAS]
G --> H[Health Check]
H --> I{Healthy?}
I -->|Ja| J[✅ Success]
I -->|Nein| K[Rollback]
```
### Workflow überwachen
1. Gehe zu deinem Repository in Gitea
2. Klicke auf **Actions**
3. Siehe alle Workflow-Runs mit Status
4. Klicke auf einen Run für Details und Logs
### Erweiterte Konfiguration
Weitere Details zur CI/CD-Konfiguration findest du in:
- [GITEA_RUNNER_SETUP.md](GITEA_RUNNER_SETUP.md) - Detaillierte Runner-Setup Anleitung
- [`.gitea/workflows/deploy-synology.yml`](.gitea/workflows/deploy-synology.yml) - Workflow-Konfiguration
- [`scripts/deploy-synology.sh`](scripts/deploy-synology.sh) - Deployment-Script
## 📝 Weitere Ressourcen
- [Laravel Dokumentation](https://laravel.com/docs)
- [Docker Dokumentation](https://docs.docker.com/)
- [Portainer Dokumentation](https://docs.portainer.io/)
- [Synology Docker Anleitung](https://www.synology.com/en-us/dsm/packages/Docker)
- [Gitea Actions Dokumentation](https://docs.gitea.com/usage/actions/overview)
## 🆘 Support
Bei Problemen:
1. Prüfe die Container-Logs
2. Überprüfe die Umgebungsvariablen
3. Stelle sicher, dass alle Ports verfügbar sind
4. Prüfe die Synology-Firewall-Einstellungen
5. Bei CI/CD: Prüfe Gitea Actions Logs und Runner Status