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
- 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
436 lines
11 KiB
Markdown
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
|