316 lines
7.2 KiB
Markdown
316 lines
7.2 KiB
Markdown
# GitHub Actions → Docker Registry → Portainer Deployment
|
|
|
|
Automatisch Docker images bouwen via GitHub en deployen op Portainer.
|
|
|
|
## 📋 Setup Stappen
|
|
|
|
### 1. GitHub Repository voorbereiding
|
|
|
|
```bash
|
|
# Push je code naar GitHub (met .github/workflows/docker-build.yml)
|
|
git add .
|
|
git commit -m "Add Docker build workflow"
|
|
git push origin main
|
|
```
|
|
|
|
**Controleer:** https://github.com/YOUR_USERNAME/YOUR_REPO/actions
|
|
|
|
### 2. GitHub Container Registry inschakelen
|
|
|
|
✅ Automatisch als je private repo hebt. Voor public repos:
|
|
|
|
1. Ga naar GitHub repo → **Settings → Packages and registries**
|
|
2. Of gewoon eerste push doen → workflow doet dit automatisch
|
|
|
|
### 3. GitHub Token configureren (optioneel)
|
|
|
|
Standaard gebruikt GitHub Actions je `GITHUB_TOKEN` (automatisch).
|
|
|
|
Voor meer controle, maak Personal Access Token (PAT):
|
|
1. GitHub → **Settings → Developer settings → Personal access tokens**
|
|
2. New token → Scopes: `write:packages`, `read:packages`
|
|
3. Token kopieren
|
|
|
|
### 4. Docker Login op Portainer Server
|
|
|
|
```bash
|
|
# Op je remote server waar Portainer draait
|
|
docker login ghcr.io
|
|
# Username: je GitHub username
|
|
# Password: GITHUB_TOKEN of PAT token
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 Image Bouwen & Pushen
|
|
|
|
### Automatisch (via GitHub Actions)
|
|
|
|
1. **Je code pushen naar main/develop:**
|
|
```bash
|
|
git push origin main
|
|
```
|
|
|
|
2. **GitHub Actions bouwt automatisch:**
|
|
- ✅ Checkout code
|
|
- ✅ Build Docker images
|
|
- ✅ Push naar ghcr.io
|
|
- ✅ Tags: `latest`, branch name, git SHA
|
|
|
|
3. **Bekijk workflow:**
|
|
- GitHub → **Actions tab** → Zie voortgang
|
|
- Logs klikken voor debug info
|
|
|
|
### Images checken in registry
|
|
|
|
```bash
|
|
# List available images/tags
|
|
docker pull ghcr.io/YOUR_USERNAME/YOUR_REPO/auth_api:latest --dry-run
|
|
|
|
# of via GitHub CLI:
|
|
gh api user/packages --jq '.[] | select(.package_type=="container")'
|
|
```
|
|
|
|
---
|
|
|
|
## 🐳 Portainer Deployment
|
|
|
|
### Methode 1: Via Docker Compose (aanbevolen)
|
|
|
|
**Op je Portainer server:**
|
|
|
|
1. **Clone repo of kopie bestand:**
|
|
```bash
|
|
git clone https://github.com/YOUR_USERNAME/YOUR_REPO.git
|
|
cd YOUR_REPO
|
|
```
|
|
|
|
2. **Login bij registry:**
|
|
```bash
|
|
docker login ghcr.io
|
|
# Credentials: GitHub username + token
|
|
```
|
|
|
|
3. **Start via docker-compose:**
|
|
```bash
|
|
docker-compose -f docker-compose.portainer.yml up -d
|
|
```
|
|
|
|
### Methode 2: Via Portainer UI
|
|
|
|
1. **Portainer Web Dashboard → Stacks**
|
|
2. **"Add Stack" → "Compose"**
|
|
3. **Paste inhoud van `docker-compose.portainer.yml`**
|
|
4. **Voeg environment vars toe:**
|
|
- `POSTGRES_PASSWORD=...`
|
|
- `JWT_SECRET=...`
|
|
5. **Deploy**
|
|
|
|
### Methode 3: Private Registry in Portainer
|
|
|
|
1. **Portainer → Registries → Add Registry**
|
|
- **Provider:** GitHub Container Registry
|
|
- **URL:** `ghcr.io`
|
|
- **Username:** je GitHub username
|
|
- **Password:** GITHUB_TOKEN
|
|
|
|
2. **In docker-compose, images gebruiken:**
|
|
```yaml
|
|
image: ghcr.io/YOUR_USERNAME/YOUR_REPO/auth_api:latest
|
|
```
|
|
|
|
---
|
|
|
|
## 🔄 Workflow Overzicht
|
|
|
|
```
|
|
┌─────────────────┐
|
|
│ Push to GitHub │
|
|
└────────┬────────┘
|
|
│
|
|
▼
|
|
┌──────────────────────────────┐
|
|
│ GitHub Actions Workflow: │
|
|
│ - Checkout │
|
|
│ - Build images │
|
|
│ - Push to ghcr.io │
|
|
└────────┬─────────────────────┘
|
|
│
|
|
▼
|
|
┌──────────────────────────────┐
|
|
│ ghcr.io Registry │
|
|
│ - auth_api:latest │
|
|
│ - employee_api:latest │
|
|
│ - transit_api:latest │
|
|
└────────┬─────────────────────┘
|
|
│
|
|
▼
|
|
┌──────────────────────────────┐
|
|
│ Portainer (Remote Server) │
|
|
│ docker-compose pull & up │
|
|
└──────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 Image Tags Automatisering
|
|
|
|
GitHub Actions genereert automatisch tags:
|
|
|
|
| Event | Tag |
|
|
|-------|-----|
|
|
| Push naar main | `latest`, `main-{SHA}` |
|
|
| Push naar develop | `develop-{SHA}` |
|
|
| Release/Tag | `v1.0.0`, `1.0`, `1` |
|
|
|
|
**Voorbeeld:**
|
|
```
|
|
ghcr.io/sven/transit_project/auth_api:latest
|
|
ghcr.io/sven/transit_project/auth_api:main-a1b2c3d
|
|
ghcr.io/sven/transit_project/auth_api:v1.0.0
|
|
```
|
|
|
|
---
|
|
|
|
## ⚙️ Configuratie
|
|
|
|
### docker-compose.portainer.yml aanpassen
|
|
|
|
1. **Vervang dit:**
|
|
```
|
|
ghcr.io/YOUR_USERNAME/YOUR_REPO/auth_api:latest
|
|
```
|
|
|
|
2. **Met jouw gegevens:**
|
|
```
|
|
ghcr.io/sven/transit_project/auth_api:latest
|
|
```
|
|
|
|
3. **Voor private image, pull policy toevoegen:**
|
|
```yaml
|
|
auth_api:
|
|
image: ghcr.io/sven/transit_project/auth_api:latest
|
|
pull_policy: always
|
|
```
|
|
|
|
### Environment variabelen
|
|
|
|
**Maak .env file op Portainer server:**
|
|
```bash
|
|
POSTGRES_DB=transit_db
|
|
POSTGRES_USER=transit_user
|
|
POSTGRES_PASSWORD=super_secure_password
|
|
JWT_SECRET=your_secret_key_here
|
|
```
|
|
|
|
**Dan starten:**
|
|
```bash
|
|
docker-compose --env-file .env -f docker-compose.portainer.yml up -d
|
|
```
|
|
|
|
---
|
|
|
|
## 🔐 Veiligheid
|
|
|
|
### GitHub Token limieten
|
|
- Standaard `GITHUB_TOKEN` werkt goed
|
|
- Verloopt na 60 minuten (genoeg voor build)
|
|
|
|
### Private Registry
|
|
Als je Portainer server geen internet heeft:
|
|
- Use **Portainer Registry Mirror**
|
|
- Of **Private Registry** (Harbor, Nexus)
|
|
|
|
### Credentials in Portainer
|
|
**Nooit credentials in docker-compose zetten!**
|
|
|
|
✅ Juist: Environment file
|
|
```bash
|
|
docker-compose --env-file .env up -d
|
|
```
|
|
|
|
❌ Fout:
|
|
```yaml
|
|
environment:
|
|
POSTGRES_PASSWORD: password123 # DON'T DO THIS
|
|
```
|
|
|
|
---
|
|
|
|
## 🐛 Troubleshooting
|
|
|
|
### "Image not found"
|
|
```bash
|
|
# Check of image in registry staat
|
|
docker pull ghcr.io/USERNAME/REPO/auth_api:latest
|
|
|
|
# Kijk in GitHub Actions logs
|
|
# Check je IMAGE naam in workflow
|
|
```
|
|
|
|
### "Unauthorized: authentication required"
|
|
```bash
|
|
# Login opnieuw
|
|
docker login ghcr.io
|
|
|
|
# Check token permissies (scope: write:packages)
|
|
```
|
|
|
|
### "Connection refused" naar database
|
|
```bash
|
|
# Check Docker network
|
|
docker network ls
|
|
docker network inspect YOUR_NETWORK
|
|
|
|
# Check database running
|
|
docker ps | grep postgres
|
|
```
|
|
|
|
### Logs bekijken
|
|
```bash
|
|
# Via docker
|
|
docker logs auth_api
|
|
|
|
# Via Portainer: Containers → Select → Logs
|
|
```
|
|
|
|
---
|
|
|
|
## 📚 Nuttige Commando's
|
|
|
|
```bash
|
|
# Check beschikbare images/tags
|
|
curl -s -H "Authorization: Bearer TOKEN" \
|
|
https://ghcr.io/v2/USERNAME/REPO/auth_api/tags/list | jq
|
|
|
|
# Manual image build (als je workflow debug)
|
|
docker build -t ghcr.io/USERNAME/REPO/auth_api:test ./auth_api
|
|
docker push ghcr.io/USERNAME/REPO/auth_api:test
|
|
|
|
# Pull latest images
|
|
docker-compose -f docker-compose.portainer.yml pull
|
|
|
|
# Recreate containers (na pull)
|
|
docker-compose -f docker-compose.portainer.yml up -d --force-recreate
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 Samenvatting
|
|
|
|
| Stap | Wat | Waar |
|
|
|------|-----|------|
|
|
| 1 | Code pushen | GitHub |
|
|
| 2 | Images bouwen | GitHub Actions |
|
|
| 3 | Images pushen | ghcr.io registry |
|
|
| 4 | Images pullen | Portainer server |
|
|
| 5 | Containers starten | Docker Compose |
|
|
|
|
**Voordelen:**
|
|
- ✅ Volledig geautomatiseerd
|
|
- ✅ Versiebeheer via git tags
|
|
- ✅ Makkelijk rollback
|
|
- ✅ Geen lokale builds nodig
|
|
- ✅ CI/CD best practices
|
|
|