# Gitea Runner Setup auf Synology NAS Diese Anleitung erklärt, wie du einen Gitea Actions Runner auf deiner Synology NAS einrichtest, um automatische Deployments durchzuführen. ## Voraussetzungen - Gitea läuft auf deiner Synology NAS - Docker ist auf der Synology NAS installiert - SSH-Zugriff auf die Synology NAS - Portainer läuft (optional, aber empfohlen für Container-Management) ## Option 1: Gitea Runner mit Docker Compose (empfohlen) ### 1. Runner Docker Compose Datei erstellen Erstelle eine Datei `/volume1/docker/gitea-runner/docker-compose.yml`: ```yaml version: "3.9" services: runner: image: gitea/act_runner:latest container_name: gitea-runner restart: unless-stopped environment: - GITEA_INSTANCE_URL=http://your-gitea-url:3000 - GITEA_RUNNER_REGISTRATION_TOKEN=${RUNNER_TOKEN} - GITEA_RUNNER_NAME=synology-runner - GITEA_RUNNER_LABELS=ubuntu-latest:docker://node:20-bullseye volumes: - ./data:/data - /var/run/docker.sock:/var/run/docker.sock networks: - gitea-network networks: gitea-network: external: true ``` ### 2. Runner Token generieren 1. Öffne deine Gitea-Instanz im Browser 2. Navigiere zu deinem Repository 3. Gehe zu **Settings** → **Actions** → **Runners** 4. Klicke auf **Create new Runner** 5. Kopiere den generierten Token ### 3. Environment Variables setzen Erstelle eine `.env` Datei im selben Verzeichnis: ```env RUNNER_TOKEN=dein_gitea_runner_token_hier ``` ### 4. Runner starten ```bash cd /volume1/docker/gitea-runner docker-compose up -d ``` ### 5. Runner verifizieren ```bash # Logs anschauen docker logs -f gitea-runner # Status prüfen docker ps | grep gitea-runner ``` In Gitea solltest du nun unter **Settings** → **Actions** → **Runners** deinen registrierten Runner sehen. ## Option 2: Runner direkt in Portainer deployen ### 1. In Portainer einloggen Öffne Portainer: `http://your-synology-ip:9000` ### 2. Stack erstellen 1. Gehe zu **Stacks** → **+ Add stack** 2. Name: `gitea-runner` 3. Wähle **Web editor** 4. Füge die obige docker-compose.yml ein ### 3. Environment Variables Füge folgende Environment Variable hinzu: - **RUNNER_TOKEN**: Dein Gitea Runner Token ### 4. Deploy Klicke auf **Deploy the stack** ## Runner Konfiguration ### Custom Runner Labels Um spezifische Workflows auszuführen, kannst du Custom Labels hinzufügen: ```yaml environment: - GITEA_RUNNER_LABELS=ubuntu-latest:docker://node:20-bullseye,ubuntu-22.04:docker://ubuntu:22.04,php-8.4:docker://php:8.4-cli ``` ### Mehrere Runner Für parallele Builds kannst du mehrere Runner starten: ```yaml services: runner-1: image: gitea/act_runner:latest container_name: gitea-runner-1 # ... config ... runner-2: image: gitea/act_runner:latest container_name: gitea-runner-2 # ... config ... ``` ## Repository Secrets konfigurieren Um das automatische Deployment zu ermöglichen, musst du Secrets in deinem Gitea-Repository hinterlegen: ### 1. In Gitea Repository Settings 1. Gehe zu deinem Repository 2. Klicke auf **Settings** → **Secrets** 3. Füge folgende Secrets hinzu: | Secret Name | Beschreibung | Beispiel | |------------|--------------|----------| | `SYNOLOGY_HOST` | IP oder Hostname deiner Synology | `192.168.1.100` | | `SYNOLOGY_USER` | SSH-Benutzername | `admin` | | `SYNOLOGY_SSH_KEY` | Privater SSH-Key für Zugriff | `-----BEGIN OPENSSH PRIVATE KEY-----...` | | `APP_KEY` | Laravel Application Key | `base64:xyz...` | ### 2. SSH-Key generieren (falls nicht vorhanden) Auf deiner Synology NAS: ```bash # SSH-Key-Pair generieren ssh-keygen -t ed25519 -C "gitea-runner@synology" -f ~/.ssh/gitea_deploy # Public Key zum authorized_keys hinzufügen cat ~/.ssh/gitea_deploy.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys # Private Key anzeigen (für Secret) cat ~/.ssh/gitea_deploy ``` Kopiere den **gesamten** Private Key (inklusive `-----BEGIN` und `-----END` Zeilen) und füge ihn als `SYNOLOGY_SSH_KEY` Secret hinzu. ### 3. Secrets verifizieren Stelle sicher, dass alle benötigten Secrets gesetzt sind: ```bash # In Gitea Repository Settings → Secrets ✅ SYNOLOGY_HOST ✅ SYNOLOGY_USER ✅ SYNOLOGY_SSH_KEY ✅ APP_KEY ``` ## Workflow aktivieren ### 1. Workflow-Datei pushen ```bash # Lokal im Projekt git add .gitea/workflows/deploy-synology.yml git commit -m "ci: add automated deployment workflow" git push origin main ``` ### 2. Workflow ausführen Gitea Actions wird automatisch bei jedem Push auf `main` oder `develop` ausgelöst. ### 3. Workflow Status prüfen 1. Gehe zu deinem Repository in Gitea 2. Klicke auf **Actions** 3. Du siehst alle Workflow-Runs mit Status (Success/Failure) 4. Klicke auf einen Run, um Details und Logs zu sehen ## Workflow manuell auslösen Falls du den Workflow manuell starten möchtest: ### 1. Workflow-Datei erweitern Füge in `.gitea/workflows/deploy-synology.yml` hinzu: ```yaml on: push: branches: - main - develop workflow_dispatch: # Ermöglicht manuelles Auslösen ``` ### 2. Manuell auslösen 1. Gehe zu **Actions** in deinem Repository 2. Wähle den Workflow aus 3. Klicke auf **Run workflow** ## Monitoring & Logs ### Runner Logs ```bash # Live Logs docker logs -f gitea-runner # Letzte 100 Zeilen docker logs --tail 100 gitea-runner ``` ### Workflow Logs In Gitea UI: 1. **Actions** Tab 2. Wähle einen Workflow Run 3. Klicke auf die einzelnen Jobs, um Logs zu sehen ### Deployment Logs auf Synology ```bash # Laravel App Logs docker logs -f laravel_app # Deployment Script Logs # Diese werden in der Workflow-Ausgabe angezeigt ``` ## Troubleshooting ### Problem: Runner verbindet sich nicht ```bash # Logs prüfen docker logs gitea-runner # Runner neu registrieren docker-compose down docker-compose up -d ``` ### Problem: Workflow startet nicht 1. **Runner Status prüfen**: Gehe zu Repository → Settings → Actions → Runners 2. **Runner Labels prüfen**: Stelle sicher, dass `runs-on: ubuntu-latest` mit den Runner Labels übereinstimmt 3. **Secrets prüfen**: Alle benötigten Secrets müssen gesetzt sein ### Problem: SSH-Verbindung fehlschlägt ```bash # SSH-Key Permissions prüfen chmod 600 ~/.ssh/gitea_deploy chmod 644 ~/.ssh/gitea_deploy.pub chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys # SSH-Verbindung testen (lokal auf der NAS) ssh -i ~/.ssh/gitea_deploy admin@localhost ``` ### Problem: Deployment schlägt fehl ```bash # Prüfe deployment script permissions cd /volume1/docker/laravel-app ls -la deploy-synology.sh # Mache es executable chmod +x deploy-synology.sh # Teste deployment script manuell ./deploy-synology.sh ``` ### Problem: Health Check fehlschlägt ```bash # Prüfe ob Container läuft docker ps | grep laravel_app # Prüfe Logs docker logs laravel_app # Teste Health Endpoint manuell curl http://localhost:8080/health ``` ## Best Practices ### 1. Separate Runner für Production und Staging ```yaml services: runner-production: environment: - GITEA_RUNNER_LABELS=production:docker://ubuntu:22.04 runner-staging: environment: - GITEA_RUNNER_LABELS=staging:docker://ubuntu:22.04 ``` Im Workflow: ```yaml jobs: deploy-production: runs-on: production if: github.ref == 'refs/heads/main' ``` ### 2. Workflow nur für Conventional Commits Der aktuelle Workflow filtert bereits nach Conventional Commits: - `feat:` - Neue Features - `fix:` - Bugfixes - `docs:` - Dokumentation - `chore:` - Wartungsarbeiten - etc. ### 3. Notifications Erweitere den Workflow um Benachrichtigungen: ```yaml - name: Send Notification if: always() run: | # Telegram, Discord, Email, etc. curl -X POST https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage \ -d chat_id=${{ secrets.TELEGRAM_CHAT_ID }} \ -d text="Deployment status: ${{ job.status }}" ``` ### 4. Rollback-Strategie Im deployment script ist bereits ein Backup-Mechanismus implementiert: - Datenbank-Backups vor jedem Deployment - Letzte 5 Backups werden aufbewahrt - Automatischer Rollback bei Fehlern ## Erweiterte Konfiguration ### Multi-Stage Deployments Für staging und production environments: ```yaml jobs: deploy-staging: if: github.ref == 'refs/heads/develop' # ... deploy to staging ... deploy-production: if: github.ref == 'refs/heads/main' needs: [test, deploy-staging] # ... deploy to production ... ``` ### Caching Um Build-Zeiten zu verkürzen: ```yaml - name: Cache Composer uses: actions/cache@v3 with: path: vendor key: ${{ runner.os }}-composer-${{ hashFiles('composer.lock') }} - name: Cache NPM uses: actions/cache@v3 with: path: node_modules key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} ``` ## Weitere Ressourcen - [Gitea Actions Dokumentation](https://docs.gitea.com/usage/actions/overview) - [Act Runner Dokumentation](https://gitea.com/gitea/act_runner) - [Docker Compose Dokumentation](https://docs.docker.com/compose/) ## Support Bei Problemen: 1. Prüfe Runner Logs: `docker logs gitea-runner` 2. Prüfe Workflow Logs in Gitea Actions Tab 3. Verifiziere alle Secrets sind korrekt gesetzt 4. Teste SSH-Verbindung zur Synology manuell