# 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 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= 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