Some checks failed
Build and Push Docker Image / build-and-push (push) Has been cancelled
Lageplan — CI/CD & Portainer Deployment
Übersicht
┌─────────────┐ Push ┌─────────────────┐ Build + Push ┌─────────────────┐
│ Dein PC │ ────────────► │ Gitea (git) │ ──────────────────► │ Gitea Registry │
│ (VS Code) │ │ git.purepixel │ │ (Docker Image) │
└─────────────┘ └─────────────────┘ └────────┬────────┘
│
│ Pull
▼
┌─────────────────┐
│ Portainer │
│ (Stack Deploy) │
└─────────────────┘
- Push auf
main→ Gitea Actions baut Docker Image - Image wird gepusht → Gitea Container Registry (
git.purepixel.ch) - Watchtower (in Portainer) → prüft alle 60s auf neue Images und startet Container neu
Voraussetzungen
- Gitea läuft mit Container Registry aktiviert
- Gitea Actions Runner ist registriert (
deploy/docker-compose.runner.yml) - Portainer Stack ist deployed mit korrekten Environment-Variablen
Schritt 1: Gitea Container Registry aktivieren
In Gitea:
- Admin-Konsole → Konfiguration → Pakete
- Container Registry auf
Aktiviertsetzen - Speichern
Oder direkt in der app.ini:
[packages]
ENABLED = true
[package.container_registry]
ENABLED = true
Schritt 2: Gitea Actions Runner registrieren
- In Gitea: Admin → Actions → Runners → Neuen Runner erstellen
- Token kopieren
- In Portainer: Stack
gitea-runnerdeployen mitdeploy/docker-compose.runner.yml - Environment Variable
RUNNER_TOKEN= das kopierte Token
Schritt 3: Gitea Access Token erstellen
Das CI/CD Workflow braucht einen Token um Images in die Registry zu pushen:
- Gitea → Einstellungen → Anwendungen → Token erstellen
- Name:
registry-push - Berechtigungen:
package:write(mindestens) - Token kopieren und als Repository Secret hinterlegen:
- Repo → Einstellungen → Secrets → Neues Secret
- Name:
GITEA_TOKEN - Wert: das kopierte Token
Schritt 4: Portainer Stack deployen
- Portainer →
Stacks→+ Add stack - Name:
lageplan - Build method:
Repository - Git-URL:
https://git.purepixel.ch/adminpepe/Lageplan.git - Compose path:
docker-compose.portainer.yml - GitOps updates: ✅ Aktivieren
- Mechanism:
Webhook - Webhook URL kopieren (für später)
Environment Variables setzen:
| Variable | Wert | Beschreibung |
|---|---|---|
POSTGRES_USER |
lageplan |
DB User |
POSTGRES_PASSWORD |
(sicheres Passwort) | DB Passwort |
POSTGRES_DB |
lageplan |
DB Name |
NEXTAUTH_URL |
https://lageplan.ch |
Deine Domain |
NEXTAUTH_SECRET |
(openssl rand -base64 32) | Auth Secret |
MINIO_ROOT_USER |
minioadmin |
MinIO User |
MINIO_ROOT_PASSWORD |
(sicheres Passwort) | MinIO Passwort |
MINIO_BUCKET |
lageplan-icons |
Bucket Name |
MINIO_PUBLIC_URL |
https://s3.deinedomain.ch |
MinIO externe URL |
GITEA_REGISTRY_USER |
adminpepe |
Gitea User für Watchtower |
GITEA_REGISTRY_PASS |
(Token oder Passwort) | Gitea Passwort/Token |
- Deploy the stack
Schritt 5: Webhook in Gitea eintragen
Damit Portainer bei jedem Push automatisch neu deployed:
- Gitea Repo → Einstellungen → Webhooks → Neuer Webhook →
Gitea - Ziel-URL: Die kopierte Portainer Webhook URL
- HTTP-Methode:
POST - Trigger: Nur
Push events(oder auchBranch filter: main) - Webhook aktivieren → Hinzufügen
Schritt 6: Erstes Deployment testen
- Lokal einen Push auf
mainmachen:git add . git commit -m "Test CI/CD" git push origin main - In Gitea: Actions Tab → Build-Job sollte laufen
- Wenn grün → Image wurde in Registry gepusht
- Watchtower (in Portainer) holt neues Image innerhalb von 60s
- App ist unter
NEXTAUTH_URLerreichbar
Troubleshooting
Gitea Actions startet nicht
- Prüfen ob Runner registriert ist: Gitea → Admin → Actions → Runners
- Runner muss
IdleoderActivezeigen
Image Push schlägt fehl (401 Unauthorized)
GITEA_TOKENSecret im Repo korrekt hinterlegt?- Token hat Berechtigung
package:write? - Registry in Gitea aktiviert?
Watchtower zieht kein neues Image
GITEA_REGISTRY_USERundGITEA_REGISTRY_PASSin Portainer gesetzt?- Image-Name in
docker-compose.portainer.ymlkorrekt? - Watchtower Logs prüfen: Portainer → Container
watchtower→ Logs
App startet nicht / DB-Fehler
- Environment Variables in Portainer korrekt?
DATABASE_URLwird automatisch gebaut, nurPOSTGRES_*muss gesetzt werden- Bei erstem Start: Prisma Migrations/Seed im Web-Container ausführen:
docker exec -it lageplan-web-1 npx prisma db push docker exec -it lageplan-web-1 npx prisma db seed
Manuelles Update (falls nötig)
Wenn Watchtower mal nicht greift:
# Auf dem Portainer-Host
docker pull git.purepixel.ch/adminpepe/lageplan:latest
docker compose -f docker-compose.portainer.yml up -d web
Ports
| Service | Port | Extern? |
|---|---|---|
| Web App | 3000 | ✅ Ja (WEB_PORT) |
| PostgreSQL | 5432 | ❌ Nur intern |
| MinIO API | 9000 | ❌ Nur intern |
| MinIO Console | 9001 | ❌ Nur intern |