fix
All checks were successful
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 6m17s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 14m45s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Successful in 2s
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Successful in 2s

This commit is contained in:
David 2025-11-19 18:27:42 +01:00
parent 7dadd951bb
commit 2e5dcec05c
8 changed files with 1278 additions and 12 deletions

View File

@ -70,7 +70,7 @@ jobs:
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
cache-from: type=registry,ref=${{ env.REGISTRY }}/xpeditis-backend:buildcache cache-from: type=registry,ref=${{ env.REGISTRY }}/xpeditis-backend:buildcache
cache-to: type=registry,ref=${{ env.REGISTRY }}/xpeditis-backend:buildcache,mode=max cache-to: type=registry,ref=${{ env.REGISTRY }}/xpeditis-backend:buildcache,mode=max
platforms: linux/amd64 platforms: linux/amd64,linux/arm64
# ============================================ # ============================================
# Frontend Build, Test & Deploy # Frontend Build, Test & Deploy
@ -138,7 +138,7 @@ jobs:
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
cache-from: type=registry,ref=${{ env.REGISTRY }}/xpeditis-frontend:buildcache cache-from: type=registry,ref=${{ env.REGISTRY }}/xpeditis-frontend:buildcache
cache-to: type=registry,ref=${{ env.REGISTRY }}/xpeditis-frontend:buildcache,mode=max cache-to: type=registry,ref=${{ env.REGISTRY }}/xpeditis-frontend:buildcache,mode=max
platforms: linux/amd64 platforms: linux/amd64,linux/arm64
build-args: | build-args: |
NEXT_PUBLIC_API_URL=${{ secrets.NEXT_PUBLIC_API_URL || 'http://localhost:4000' }} NEXT_PUBLIC_API_URL=${{ secrets.NEXT_PUBLIC_API_URL || 'http://localhost:4000' }}
NEXT_PUBLIC_APP_URL=${{ secrets.NEXT_PUBLIC_APP_URL || 'http://localhost:3000' }} NEXT_PUBLIC_APP_URL=${{ secrets.NEXT_PUBLIC_APP_URL || 'http://localhost:3000' }}

176
ARM64_SUPPORT.md Normal file
View File

@ -0,0 +1,176 @@
# Support Multi-Architecture (ARM64 + AMD64)
## 🎯 Problème Résolu
Le serveur Portainer tourne sur architecture **ARM64**, mais la CI/CD buildait uniquement des images **AMD64**. Cela causait des erreurs de compatibilité lors du déploiement.
## ✅ Solution Implémentée
La CI/CD build maintenant des images **multi-architecture** compatibles ARM64 et AMD64.
### Modifications dans `.github/workflows/ci.yml`
**Backend (ligne 73)** :
```yaml
platforms: linux/amd64,linux/arm64
```
**Frontend (ligne 141)** :
```yaml
platforms: linux/amd64,linux/arm64
```
## 📦 Images Multi-Architecture
Lorsque la CI/CD push vers le registry Scaleway, elle crée des **manifests multi-architecture** :
```bash
# Backend
rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
├── linux/amd64
└── linux/arm64
# Frontend
rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod
├── linux/amd64
└── linux/arm64
```
Docker/Portainer sélectionne automatiquement l'architecture correcte lors du pull.
## ⚙️ Comment Ça Fonctionne
**Docker Buildx** utilise **QEMU emulation** sur GitHub Actions pour compiler les images ARM64 sur des runners AMD64 :
1. `docker/setup-buildx-action@v3` active Buildx
2. Buildx détecte les plateformes `linux/amd64,linux/arm64`
3. Compile nativement pour AMD64
4. Utilise QEMU pour cross-compiler vers ARM64
5. Crée un manifest avec les deux architectures
6. Push tout vers le registry
## 🚀 Déploiement
### Sur Serveur ARM64 (Portainer)
```bash
docker pull rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
# ✅ Pull automatiquement l'image linux/arm64
```
### Sur Serveur AMD64 (Cloud classique)
```bash
docker pull rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
# ✅ Pull automatiquement l'image linux/amd64
```
## 📊 Impact sur le Build Time
Le build multi-architecture prend environ **2x plus de temps** :
- Build AMD64 seul : ~5-7 min
- Build AMD64 + ARM64 : ~10-15 min
C'est normal car il compile deux fois l'image (une pour chaque architecture).
## 🔍 Vérifier l'Architecture d'une Image
```bash
# Voir les architectures disponibles
docker manifest inspect rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
# Output attendu :
# {
# "manifests": [
# { "platform": { "architecture": "amd64", "os": "linux" } },
# { "platform": { "architecture": "arm64", "os": "linux" } }
# ]
# }
```
## 📝 Checklist de Déploiement (Mise à Jour)
### 1. Configurer GitHub Secret `REGISTRY_TOKEN`
- Aller sur [Scaleway Console](https://console.scaleway.com/registry/namespaces)
- Container Registry → weworkstudio → Push/Pull credentials
- Copier le token
- GitHub → Settings → Secrets → Actions → New repository secret
- Nom : `REGISTRY_TOKEN`
### 2. Commit et Push vers `preprod`
```bash
git add .
git commit -m "feat: add ARM64 support for multi-architecture builds"
git push origin preprod
```
### 3. Vérifier le Build CI/CD
Aller sur [GitHub Actions](https://github.com/VOTRE_USERNAME/xpeditis/actions) et attendre :
- ✅ Backend - Build, Test & Push (10-15 min)
- ✅ Frontend - Build, Test & Push (10-15 min)
### 4. Vérifier les Images dans le Registry
```bash
# Lister les images
docker manifest inspect rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
# Devrait montrer linux/amd64 ET linux/arm64
```
### 5. Déployer sur Portainer (ARM64)
1. Copier le contenu de `docker/portainer-stack.yml`
2. Aller sur Portainer → Stacks → Update stack
3. Cocher "Re-pull image and redeploy"
4. Click "Update"
Portainer va automatiquement pull les images ARM64 compatibles ! 🎉
## 🛠️ Troubleshooting
### Erreur : "no matching manifest for linux/arm64"
**Cause** : L'image a été buildée avant l'ajout du support ARM64.
**Solution** : Re-trigger la CI/CD pour rebuild avec les deux architectures.
### Build Timeout sur GitHub Actions
**Cause** : Le build ARM64 via QEMU peut être lent.
**Solution** : Augmenter le timeout dans `.github/workflows/ci.yml` :
```yaml
jobs:
backend:
timeout-minutes: 30 # Défaut est 360, mais on peut réduire à 30
```
### Image ARM64 Trop Lente au Démarrage
**Cause** : C'est normal, QEMU émulation est plus lent que natif.
**Alternative** : Utiliser des runners ARM64 natifs (GitHub n'en propose pas gratuitement, mais Scaleway/AWS oui).
## 📚 Ressources
- [Docker Buildx Multi-Platform](https://docs.docker.com/build/building/multi-platform/)
- [GitHub Actions ARM64 Support](https://github.blog/changelog/2024-06-03-github-actions-arm64-linux-and-windows-runners-are-now-generally-available/)
- [Scaleway Container Registry](https://www.scaleway.com/en/docs/containers/container-registry/)
## ✅ Résumé
| Avant | Après |
|-------|-------|
| ❌ Build AMD64 uniquement | ✅ Build AMD64 + ARM64 |
| ❌ Incompatible avec serveur ARM | ✅ Compatible tous serveurs |
| ⚡ Build rapide (~7 min) | 🐢 Build plus lent (~15 min) |
| 📦 1 image par tag | 📦 2 images par tag (manifest) |
---
**Date** : 2025-01-19
**Status** : ✅ Implémenté et prêt pour déploiement

257
CICD_REGISTRY_SETUP.md Normal file
View File

@ -0,0 +1,257 @@
# 🔧 Configuration CI/CD - Registry Scaleway
## ✅ Bonne Nouvelle !
La CI/CD est **déjà configurée** dans `.github/workflows/ci.yml` pour :
- ✅ Build les images Docker (backend + frontend)
- ✅ **Support multi-architecture (AMD64 + ARM64)** 🎉
- ✅ Push vers le registry Scaleway
- ✅ Créer les tags corrects (`preprod`)
## ⚙️ Configuration Requise
Pour que la CI/CD puisse push vers le registry Scaleway, il faut configurer le secret GitHub.
### Étape 1 : Obtenir le Token Scaleway
1. Aller sur [console.scaleway.com](https://console.scaleway.com)
2. **Container Registry**`weworkstudio`
3. Cliquer sur **Push/Pull credentials**
4. Créer ou copier un token d'accès
### Étape 2 : Ajouter le Secret dans GitHub
1. Aller sur votre repo GitHub : https://github.com/VOTRE_USERNAME/xpeditis
2. **Settings****Secrets and variables** → **Actions**
3. Cliquer sur **New repository secret**
4. Créer le secret :
- **Name** : `REGISTRY_TOKEN`
- **Value** : Coller le token Scaleway
5. Cliquer **Add secret**
### Étape 3 : Vérifier les Autres Secrets (Optionnels)
Pour le frontend, vérifier ces secrets (si vous utilisez des URLs différentes) :
| Secret Name | Description | Exemple |
|-------------|-------------|---------|
| `NEXT_PUBLIC_API_URL` | URL de l'API backend | `https://api.preprod.xpeditis.com` |
| `NEXT_PUBLIC_APP_URL` | URL du frontend | `https://app.preprod.xpeditis.com` |
| `DISCORD_WEBHOOK_URL` | Webhook Discord pour notifications | `https://discord.com/api/webhooks/...` |
**Note** : Si ces secrets ne sont pas définis, la CI/CD utilisera les valeurs par défaut (`http://localhost:4000` et `http://localhost:3000`).
---
## 🚀 Déclencher la CI/CD
Une fois le secret `REGISTRY_TOKEN` configuré :
### Option 1 : Push sur preprod (Recommandé)
```bash
# Committer les derniers changements
git add .
git commit -m "feat: add automatic migrations and Docker fixes"
# Push sur la branche preprod
git push origin preprod
```
La CI/CD se déclenchera automatiquement et :
1. ✅ Build l'image backend (AMD64 + ARM64)
2. ✅ Build l'image frontend (AMD64 + ARM64)
3. ✅ Push vers le registry Scaleway
4. ✅ Envoie une notification Discord (si configuré)
**Note** : Le build multi-architecture prend ~10-15 min (au lieu de ~5-7 min pour AMD64 seul). Voir [ARM64_SUPPORT.md](ARM64_SUPPORT.md) pour plus de détails.
### Option 2 : Re-run un Workflow Existant
1. Aller sur GitHub → **Actions**
2. Sélectionner le dernier workflow
3. Cliquer sur **Re-run all jobs**
---
## 📊 Vérifier que ça fonctionne
### 1. Vérifier les Logs GitHub Actions
1. GitHub → **Actions**
2. Cliquer sur le workflow en cours
3. Vérifier les étapes :
- ✅ `Build and push Backend Docker image`
- ✅ `Build and push Frontend Docker image`
**Logs attendus** :
```
Building image...
Pushing to rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
✓ Image pushed successfully
```
### 2. Vérifier sur Scaleway Console
1. [console.scaleway.com](https://console.scaleway.com)
2. **Container Registry**`weworkstudio`
3. Vérifier que vous voyez :
- ✅ `xpeditis-backend:preprod`
- ✅ `xpeditis-frontend:preprod`
### 3. Vérifier avec Docker CLI
```bash
# Login au registry
docker login rg.fr-par.scw.cloud/weworkstudio
# Vérifier que les images existent (multi-architecture)
docker manifest inspect rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
docker manifest inspect rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod
# Si vous voyez du JSON avec "manifests": [{ "platform": { "architecture": "amd64" }}, { "platform": { "architecture": "arm64" }}]
# Les images multi-architecture existent ✅
```
---
## 🔍 Tags Créés par la CI/CD
La CI/CD crée automatiquement ces tags :
| Image | Tag | Quand |
|-------|-----|-------|
| `xpeditis-backend` | `preprod` | À chaque push sur `preprod` |
| `xpeditis-frontend` | `preprod` | À chaque push sur `preprod` |
| `xpeditis-backend` | `latest` | Si `preprod` est la branche par défaut |
| `xpeditis-frontend` | `latest` | Si `preprod` est la branche par défaut |
**Configuration actuelle dans `.github/workflows/ci.yml`** :
```yaml
tags: |
type=ref,event=branch # Tag avec le nom de la branche
type=raw,value=latest,enable={{is_default_branch}} # Tag 'latest' si branche par défaut
```
Pour la branche `preprod`, cela crée :
- `rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod`
- `rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod`
---
## ⚠️ Problèmes Courants
### Erreur : "denied: requested access to the resource is denied"
**Cause** : Le secret `REGISTRY_TOKEN` n'est pas configuré ou invalide
**Solution** :
1. Vérifier que le secret existe : GitHub → Settings → Secrets → Actions
2. Régénérer un token sur Scaleway Console
3. Mettre à jour le secret dans GitHub
---
### Erreur : "manifest unknown: manifest unknown"
**Cause** : L'image n'existe pas dans le registry
**Solution** :
1. Vérifier que la CI/CD s'est exécutée sans erreur
2. Vérifier les logs de l'étape `Build and push Docker image`
3. Re-run le workflow si nécessaire
---
### Erreur : "server gave HTTP response to HTTPS client"
**Cause** : Configuration Docker incorrecte
**Solution** :
Le registry Scaleway utilise toujours HTTPS. Si vous voyez cette erreur, vérifier que l'URL du registry est correcte :
```yaml
registry: rg.fr-par.scw.cloud/weworkstudio # ✅ Correct
registry: rg.fr-par.scw.cloud # ❌ Incorrect
```
---
## 🎯 Après Configuration
Une fois le secret configuré et la CI/CD exécutée :
### 1. Portainer Pourra Pull les Images
Dans Portainer, lors de l'update du stack :
```yaml
xpeditis-backend:
image: rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
# ✅ Cette image existe maintenant dans le registry
xpeditis-frontend:
image: rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod
# ✅ Cette image existe maintenant dans le registry
```
### 2. Workflow Automatique
À chaque push sur `preprod` :
1. ✅ CI/CD build les images
2. ✅ CI/CD push vers le registry
3. ✅ Portainer peut pull les nouvelles images
4. ✅ Notification Discord envoyée
**Plus besoin de build et push manuellement !**
---
## 📝 Résumé des Actions à Faire
- [ ] **Étape 1** : Obtenir le token Scaleway (Console → Container Registry → Push/Pull credentials)
- [ ] **Étape 2** : Ajouter le secret `REGISTRY_TOKEN` dans GitHub (Settings → Secrets → Actions)
- [ ] **Étape 3** : Push sur `preprod` pour déclencher la CI/CD
- [ ] **Étape 4** : Vérifier sur GitHub Actions que le workflow réussit
- [ ] **Étape 5** : Vérifier sur Scaleway Console que les images sont là
- [ ] **Étape 6** : Update le stack Portainer avec re-pull image
---
## 🔗 Liens Utiles
- [Scaleway Console](https://console.scaleway.com/registry/namespaces)
- [GitHub Actions (votre repo)](https://github.com/VOTRE_USERNAME/xpeditis/actions)
- [Docker Login Action](https://github.com/docker/login-action)
- [Docker Build Push Action](https://github.com/docker/build-push-action)
- [ARM64 Support Documentation](ARM64_SUPPORT.md) - Multi-architecture builds
---
## ✅ Confirmation que tout fonctionne
Une fois tout configuré, vous devriez voir dans GitHub Actions :
```
✓ Checkout code
✓ Setup Node.js
✓ Install dependencies
✓ Lint code
✓ Run unit tests
✓ Build application
✓ Set up Docker Buildx
✓ Login to Scaleway Registry
✓ Extract metadata for Docker
✓ Build and push Backend Docker image
→ Pushing to rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
→ Image pushed successfully
✓ Deployment Summary
✓ Discord Notification (Success)
```
Et dans Portainer, l'update du stack réussira sans erreur de pull ! 🎉
---
**Date** : 2025-11-19
**Version** : 1.0
**Statut** : Configuration requise pour activer la CI/CD

199
DEPLOYMENT_READY.md Normal file
View File

@ -0,0 +1,199 @@
# 🚀 Xpeditis - Prêt pour Déploiement
## ✅ Tous les Problèmes Résolus
### 1. Migrations Automatiques ✅
- **Problème** : Tables manquantes (`notifications`, `webhooks`, etc.)
- **Solution** : Script `apps/backend/startup.js` exécute les migrations au démarrage Docker
- **Fichiers** :
- [apps/backend/startup.js](apps/backend/startup.js) - Script Node.js qui attend PostgreSQL + lance migrations
- [apps/backend/Dockerfile](apps/backend/Dockerfile) - Modifié pour utiliser `startup.js`
### 2. Configuration Portainer Synchronisée ✅
- **Problème** : Variables d'environnement manquantes dans Portainer stack
- **Solution** : Ajout de toutes les variables depuis `docker-compose.dev.yml`
- **Fichiers** :
- [docker/portainer-stack.yml](docker/portainer-stack.yml) - Configuration complète et corrigée
### 3. Erreurs YAML Corrigées ✅
- **Problème** : `DATABASE_LOGGING must be a string, number or null`
- **Solution** : Conversion de tous les booléens et nombres en strings
- **Documentation** : [PORTAINER_YAML_FIX.md](PORTAINER_YAML_FIX.md)
### 4. Support ARM64 Ajouté ✅
- **Problème** : Serveur Portainer est ARM64, images CI/CD étaient AMD64 uniquement
- **Solution** : Build multi-architecture (AMD64 + ARM64)
- **Fichiers** :
- [.github/workflows/ci.yml](.github/workflows/ci.yml) - Ajout `platforms: linux/amd64,linux/arm64`
- **Documentation** : [ARM64_SUPPORT.md](ARM64_SUPPORT.md), [DOCKER_ARM64_FIX.md](DOCKER_ARM64_FIX.md)
## 📋 Checklist de Déploiement
### Préparation (Local)
- [x] ✅ Migrations automatiques implémentées
- [x] ✅ Configuration Portainer synchronisée
- [x] ✅ YAML type errors corrigés
- [x] ✅ Support ARM64 ajouté
- [x] ✅ Documentation complète créée
### Configuration GitHub (À FAIRE)
- [ ] **Configurer le secret `REGISTRY_TOKEN`** (REQUIS)
1. Aller sur [Scaleway Console](https://console.scaleway.com/registry/namespaces)
2. Container Registry → `weworkstudio` → Push/Pull credentials
3. Copier le token
4. GitHub → Settings → Secrets → Actions → New repository secret
5. Name: `REGISTRY_TOKEN`, Value: [token Scaleway]
- [ ] **Optionnel : Autres secrets**
- `NEXT_PUBLIC_API_URL` : `https://api.preprod.xpeditis.com`
- `NEXT_PUBLIC_APP_URL` : `https://app.preprod.xpeditis.com`
- `DISCORD_WEBHOOK_URL` : URL webhook Discord
### Déploiement (À FAIRE)
- [ ] **Commit et push**
```bash
git add .
git commit -m "feat: automatic migrations + ARM64 support + Portainer fixes"
git push origin preprod
```
- [ ] **Vérifier CI/CD (GitHub Actions)**
- Aller sur [GitHub Actions](https://github.com/VOTRE_USERNAME/xpeditis/actions)
- Attendre ~10-15 min (build multi-architecture)
- Vérifier que les jobs réussissent :
- ✅ Backend - Build, Test & Push
- ✅ Frontend - Build, Test & Push
- [ ] **Vérifier le Registry Scaleway**
- Aller sur [Scaleway Console](https://console.scaleway.com/registry/namespaces)
- Vérifier que les images existent :
- ✅ `xpeditis-backend:preprod`
- ✅ `xpeditis-frontend:preprod`
- Vérifier qu'elles sont multi-architecture :
```bash
docker manifest inspect rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
# Doit montrer "amd64" ET "arm64"
```
- [ ] **Déployer sur Portainer**
1. Copier le contenu de [docker/portainer-stack.yml](docker/portainer-stack.yml)
2. Aller sur Portainer → Stacks → Votre stack
3. Click "Editor"
4. Remplacer tout le contenu
5. Cocher "Re-pull image and redeploy"
6. Click "Update the stack"
- [ ] **Vérifier le déploiement**
- Backend : `https://api.preprod.xpeditis.com/api/v1/health`
- Frontend : `https://app.preprod.xpeditis.com`
- Vérifier les logs Portainer :
```
✅ PostgreSQL is ready
✅ Successfully ran X migration(s)
✅ Database migrations completed
🚀 Starting NestJS application...
```
## 📚 Documentation
### Guides Techniques
- [ARM64_SUPPORT.md](ARM64_SUPPORT.md) - Support multi-architecture détaillé
- [DOCKER_ARM64_FIX.md](DOCKER_ARM64_FIX.md) - Résumé du fix ARM64
- [PORTAINER_YAML_FIX.md](PORTAINER_YAML_FIX.md) - Fix des erreurs YAML
- [CICD_REGISTRY_SETUP.md](CICD_REGISTRY_SETUP.md) - Configuration CI/CD complète
- [REGISTRY_PUSH_GUIDE.md](REGISTRY_PUSH_GUIDE.md) - Guide push manuel (fallback)
### Fichiers Modifiés (Session Actuelle)
```
.github/workflows/ci.yml # ARM64 support (2 lignes)
docker/portainer-stack.yml # Variables + type fixes
apps/backend/startup.js # Migrations automatiques (NEW)
apps/backend/Dockerfile # CMD vers startup.js
```
### Documentation Précédente (Toujours Valide)
- [PORTAINER_MIGRATION_AUTO.md](PORTAINER_MIGRATION_AUTO.md) - Migrations automatiques
- [DEPLOYMENT_CHECKLIST.md](DEPLOYMENT_CHECKLIST.md) - Checklist déploiement
- [CHANGES_SUMMARY.md](CHANGES_SUMMARY.md) - Résumé exhaustif
- [DEPLOY_README.md](DEPLOY_README.md) - Guide déploiement rapide
## 🎯 Résumé des Images Docker
### Backend
```yaml
Image: rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
Architectures: linux/amd64, linux/arm64
Features:
- Migrations automatiques au démarrage
- Wait for PostgreSQL (30 retries)
- NestJS avec TypeORM
- Support multi-architecture
```
### Frontend
```yaml
Image: rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod
Architectures: linux/amd64, linux/arm64
Features:
- Next.js 14 production build
- Tailwind CSS compilé
- Support multi-architecture
```
## ⚡ Performance Attendue
| Métrique | Valeur |
|----------|--------|
| Build CI/CD (multi-arch) | ~10-15 min |
| Démarrage backend (avec migrations) | ~30-60s |
| Démarrage frontend | ~5-10s |
| Temps déploiement Portainer | ~2-3 min |
## 🔧 Troubleshooting
### Erreur : "no matching manifest for linux/arm64"
**Cause** : Images pas encore buildées avec ARM64 support
**Solution** : Attendre que la CI/CD se termine après le push
### Erreur : "relation does not exist"
**Cause** : Migrations pas exécutées
**Solution** : Vérifier les logs backend, le script `startup.js` doit s'exécuter
### Erreur : "denied: requested access to the resource is denied"
**Cause** : Secret `REGISTRY_TOKEN` pas configuré ou invalide
**Solution** : Vérifier le secret dans GitHub Settings → Secrets → Actions
### Portainer ne peut pas pull les images
**Cause 1** : Images pas encore dans le registry (CI/CD pas terminée)
**Cause 2** : Registry credentials Portainer invalides
**Solution** : Vérifier Portainer → Registries → Scaleway credentials
## 📊 État du Projet
| Composant | Status | Version |
|-----------|--------|---------|
| Backend API | ✅ Prêt | NestJS 10+ |
| Frontend | ✅ Prêt | Next.js 14+ |
| Database | ✅ PostgreSQL 15 | Migrations auto |
| Cache | ✅ Redis 7 | TTL 15min |
| Storage | ✅ MinIO/S3 | Compatible |
| CI/CD | ✅ GitHub Actions | Multi-arch |
| Portainer | ⏳ Attente déploiement | ARM64 ready |
## 🎉 Prochaine Étape
**URGENT** : Configurer le secret `REGISTRY_TOKEN` sur GitHub pour débloquer le déploiement.
Une fois fait :
1. Push sur `preprod` → CI/CD build les images → Images disponibles dans registry
2. Update stack Portainer → Pull images ARM64 → Déploiement réussi ✅
---
**Date** : 2025-11-19
**Status** : ✅ Prêt pour déploiement (attente configuration secret GitHub)
**Blocage** : Secret `REGISTRY_TOKEN` requis
**ETA Déploiement** : ~30 min après configuration secret

145
DOCKER_ARM64_FIX.md Normal file
View File

@ -0,0 +1,145 @@
# 🔧 Fix Critique : Support ARM64 pour Portainer
## 🚨 Problème Identifié
Votre serveur Portainer tourne sur architecture **ARM64**, mais la CI/CD buildait uniquement des images **AMD64**, causant des erreurs :
```
ERROR: no matching manifest for linux/arm64/v8
```
## ✅ Solution Implémentée
### Modification de `.github/workflows/ci.yml`
**Changement Backend (ligne 73)** :
```yaml
# Avant
platforms: linux/amd64
# Après
platforms: linux/amd64,linux/arm64
```
**Changement Frontend (ligne 141)** :
```yaml
# Avant
platforms: linux/amd64
# Après
platforms: linux/amd64,linux/arm64
```
## 📦 Résultat
Les images Docker sont maintenant **multi-architecture** et fonctionnent sur :
- ✅ Serveurs AMD64 (x86_64) - Cloud classique
- ✅ Serveurs ARM64 (aarch64) - Raspberry Pi, Apple Silicon, serveurs ARM
Docker/Portainer détecte automatiquement l'architecture du serveur et pull la bonne image.
## 🚀 Prochaines Étapes
### 1. Configurer GitHub Secret
```bash
# Sur Scaleway Console
1. Container Registry → weworkstudio → Push/Pull credentials
2. Copier le token
# Sur GitHub
1. Settings → Secrets → Actions → New repository secret
2. Name: REGISTRY_TOKEN
3. Value: [coller le token Scaleway]
```
### 2. Commit et Push
```bash
git add .
git commit -m "feat: add ARM64 support for multi-architecture Docker builds"
git push origin preprod
```
### 3. Attendre la CI/CD (~10-15 min)
GitHub Actions va :
1. Build l'image backend pour AMD64 + ARM64
2. Build l'image frontend pour AMD64 + ARM64
3. Push vers le registry Scaleway
### 4. Déployer sur Portainer
```yaml
# Portainer Stack (déjà configuré dans docker/portainer-stack.yml)
xpeditis-backend:
image: rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
# ✅ Pull automatiquement l'image ARM64
xpeditis-frontend:
image: rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod
# ✅ Pull automatiquement l'image ARM64
```
1. Copier le contenu de `docker/portainer-stack.yml`
2. Update stack dans Portainer
3. Cocher "Re-pull image and redeploy"
4. ✅ Déploiement réussi !
## 📊 Impact
| Métrique | Avant | Après |
|----------|-------|-------|
| Architectures supportées | AMD64 uniquement | AMD64 + ARM64 |
| Compatible serveur ARM | ❌ Non | ✅ Oui |
| Temps de build CI/CD | ~7 min | ~15 min |
| Taille registry | 1x | 2x (manifest) |
## 🔍 Vérification
```bash
# Vérifier que les deux architectures sont disponibles
docker manifest inspect rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
# Output attendu :
{
"manifests": [
{
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"platform": {
"architecture": "arm64",
"os": "linux"
}
}
]
}
```
## 📚 Documentation Complète
- [ARM64_SUPPORT.md](ARM64_SUPPORT.md) - Documentation technique complète
- [CICD_REGISTRY_SETUP.md](CICD_REGISTRY_SETUP.md) - Configuration CI/CD
- [docker/portainer-stack.yml](docker/portainer-stack.yml) - Stack Portainer
## ✅ Checklist de Déploiement
- [x] Modifier `.github/workflows/ci.yml` pour ARM64
- [x] Créer documentation ARM64_SUPPORT.md
- [x] Mettre à jour CICD_REGISTRY_SETUP.md
- [ ] Configurer secret `REGISTRY_TOKEN` sur GitHub
- [ ] Push sur `preprod` pour trigger CI/CD
- [ ] Vérifier build réussi sur GitHub Actions
- [ ] Vérifier images dans Scaleway Registry
- [ ] Update stack Portainer
- [ ] Vérifier déploiement réussi
---
**Date** : 2025-11-19
**Status** : ✅ Fix implémenté, prêt pour déploiement
**Impact** : 🎯 Critique - Résout incompatibilité architecture

149
PORTAINER_YAML_FIX.md Normal file
View File

@ -0,0 +1,149 @@
# 🔧 Fix Portainer YAML - Types de Variables d'Environnement
## ❌ Problème
Lors du déploiement sur Portainer, vous pouvez rencontrer cette erreur :
```
Deployment error
services.xpeditis-backend.environment.DATABASE_LOGGING must be a string, number or null
```
## 📝 Explication
Dans Docker Compose version 3.x (utilisé par Portainer), **toutes les variables d'environnement doivent être des strings**.
Les valeurs **booléennes** (`true`, `false`) et **numériques** sans guillemets (`5432`, `10`, `0`) ne sont **PAS acceptées** par Portainer, même si elles fonctionnent en local avec `docker-compose`.
### Pourquoi ça fonctionne en local ?
Docker Compose CLI (utilisé en local) est plus permissif et convertit automatiquement les types. Portainer est plus strict et applique la spécification YAML à la lettre.
## ✅ Solution
Convertir **toutes** les valeurs non-string en strings avec des guillemets :
### ❌ Avant (ne fonctionne pas sur Portainer)
```yaml
environment:
PORT: 4000 # ❌ Number
DATABASE_PORT: 5432 # ❌ Number
DATABASE_SYNC: false # ❌ Boolean
DATABASE_LOGGING: false # ❌ Boolean
REDIS_DB: 0 # ❌ Number
BCRYPT_ROUNDS: 10 # ❌ Number
SESSION_TIMEOUT_MS: 7200000 # ❌ Number
RATE_LIMIT_TTL: 60 # ❌ Number
RATE_LIMIT_MAX: 100 # ❌ Number
```
### ✅ Après (fonctionne sur Portainer)
```yaml
environment:
PORT: "4000" # ✅ String
DATABASE_PORT: "5432" # ✅ String
DATABASE_SYNC: "false" # ✅ String
DATABASE_LOGGING: "false" # ✅ String
REDIS_DB: "0" # ✅ String
BCRYPT_ROUNDS: "10" # ✅ String
SESSION_TIMEOUT_MS: "7200000" # ✅ String
RATE_LIMIT_TTL: "60" # ✅ String
RATE_LIMIT_MAX: "100" # ✅ String
```
## 🔍 Variables Modifiées
Dans `docker/portainer-stack.yml`, les variables suivantes ont été converties en strings :
| Variable | Avant | Après |
|----------|-------|-------|
| `PORT` | `4000` | `"4000"` |
| `DATABASE_PORT` | `5432` | `"5432"` |
| `DATABASE_SYNC` | `false` | `"false"` |
| `DATABASE_LOGGING` | `false` | `"false"` |
| `REDIS_PORT` | `6379` | `"6379"` |
| `REDIS_DB` | `0` | `"0"` |
| `BCRYPT_ROUNDS` | `10` | `"10"` |
| `SESSION_TIMEOUT_MS` | `7200000` | `"7200000"` |
| `RATE_LIMIT_TTL` | `60` | `"60"` |
| `RATE_LIMIT_MAX` | `100` | `"100"` |
## 💡 Comment l'application interprète les valeurs ?
Ne vous inquiétez pas ! Même si les variables sont des **strings**, l'application NestJS les convertira automatiquement au bon type :
```typescript
// Dans le code NestJS
const port = parseInt(process.env.PORT, 10); // "4000" → 4000
const dbPort = parseInt(process.env.DATABASE_PORT, 10); // "5432" → 5432
const dbSync = process.env.DATABASE_SYNC === 'true'; // "false" → false
const redisDb = parseInt(process.env.REDIS_DB, 10); // "0" → 0
```
Le module `@nestjs/config` et les validateurs `class-validator` gèrent cette conversion automatiquement.
## 🧪 Test de Validation
Pour vérifier que votre `portainer-stack.yml` est correct :
```bash
# 1. Vérifier la syntaxe YAML
docker-compose -f docker/portainer-stack.yml config
# 2. Vérifier qu'il n'y a pas d'erreurs de validation
# (Devrait afficher la configuration sans erreur)
```
Si vous voyez des erreurs comme :
- `must be a string`
- `must be a number`
- `must be null`
Alors il faut ajouter des guillemets autour de la valeur.
## 📋 Checklist de Vérification
Avant de déployer sur Portainer, vérifier que :
- [ ] Tous les **ports** sont entre guillemets : `"4000"`, `"5432"`, `"6379"`
- [ ] Tous les **booléens** sont entre guillemets : `"true"`, `"false"`
- [ ] Tous les **nombres** sont entre guillemets : `"10"`, `"0"`, `"7200000"`
- [ ] Les **strings** peuvent rester sans guillemets ou avec : `preprod` ou `"preprod"`
- [ ] Les **URLs** peuvent rester sans guillemets : `https://api.preprod.xpeditis.com`
## ⚠️ Exception : PostgreSQL et Redis
Pour les services PostgreSQL et Redis, certaines valeurs peuvent rester sans guillemets car elles sont utilisées par les images officielles qui sont plus permissives :
```yaml
# PostgreSQL - OK sans guillemets
environment:
POSTGRES_DB: xpeditis_preprod
POSTGRES_USER: xpeditis
POSTGRES_PASSWORD: 9Lc3M9qoPBeHLKHDXGUf1
# Redis - Commande avec guillemets pour la sécurité
command: redis-server --requirepass hXiy5GMPswMtxMZujjS2O --appendonly yes
```
Mais pour **votre application backend**, utilisez **toujours des guillemets** pour les valeurs non-string.
## 🔗 Références
- [Docker Compose Environment Variables](https://docs.docker.com/compose/environment-variables/)
- [Portainer Stack Deployment](https://docs.portainer.io/user/docker/stacks/add)
- [YAML Specification](https://yaml.org/spec/1.2/spec.html)
## 📄 Fichier Corrigé
Le fichier `docker/portainer-stack.yml` a été corrigé avec toutes les valeurs en strings.
**Avant déploiement**, vérifier que le fichier ne contient plus de valeurs booléennes ou numériques brutes dans la section `environment` du service `xpeditis-backend`.
---
**Date** : 2025-11-19
**Version** : 1.1
**Statut** : ✅ Corrigé et prêt pour déploiement

340
REGISTRY_PUSH_GUIDE.md Normal file
View File

@ -0,0 +1,340 @@
# 🚀 Guide Push Images vers Registry Scaleway
## ❌ Problème
Portainer ne peut pas pull les images car elles n'existent pas dans le registry Scaleway :
- `rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod`
- `rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod`
## 📋 Checklist Avant de Push
- [ ] Docker Desktop est démarré
- [ ] Vous avez accès au registry Scaleway
- [ ] Les images locales sont à jour avec les dernières modifications
---
## 🔧 Solution Étape par Étape
### Étape 1 : Login au Registry Scaleway
```bash
# Login avec les credentials Scaleway
docker login rg.fr-par.scw.cloud/weworkstudio
# Vous serez invité à entrer :
# Username: <votre_username_scaleway>
# Password: <votre_token_scaleway>
```
**Si vous n'avez pas les credentials** :
1. Aller sur [console.scaleway.com](https://console.scaleway.com)
2. Container Registry → weworkstudio
3. Generate API token
4. Copier le token
---
### Étape 2 : Build Backend avec le bon tag
```bash
# Se positionner dans le dossier backend
cd apps/backend
# Build l'image avec le tag Scaleway
docker build \
--platform linux/amd64 \
-t rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod \
.
# Vérifier que l'image est créée
docker images | grep xpeditis-backend
# Devrait afficher :
# rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend preprod <IMAGE_ID> <TIME> 337MB
```
⏱️ **Temps estimé** : 2-3 minutes
---
### Étape 3 : Push Backend vers Registry
```bash
# Push l'image backend
docker push rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
# Vous devriez voir :
# The push refers to repository [rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend]
# preprod: digest: sha256:... size: ...
```
⏱️ **Temps estimé** : 3-5 minutes (selon connexion)
---
### Étape 4 : Build Frontend avec le bon tag
```bash
# Retour à la racine
cd ../..
# Se positionner dans le dossier frontend
cd apps/frontend
# Build l'image avec le tag Scaleway
docker build \
--platform linux/amd64 \
-t rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod \
.
# Vérifier que l'image est créée
docker images | grep xpeditis-frontend
# Devrait afficher :
# rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend preprod <IMAGE_ID> <TIME> 165MB
```
⏱️ **Temps estimé** : 2-3 minutes
---
### Étape 5 : Push Frontend vers Registry
```bash
# Push l'image frontend
docker push rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod
# Vous devriez voir :
# The push refers to repository [rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend]
# preprod: digest: sha256:... size: ...
```
⏱️ **Temps estimé** : 2-3 minutes
---
### Étape 6 : Vérifier sur Scaleway Console
1. Aller sur [console.scaleway.com](https://console.scaleway.com)
2. Container Registry → weworkstudio
3. Vérifier que vous voyez :
- ✅ `xpeditis-backend:preprod`
- ✅ `xpeditis-frontend:preprod`
---
## 🤖 Utilisation du Script Automatisé
**Option recommandée** : Utiliser le script fourni
```bash
# Rendre le script exécutable
chmod +x deploy-to-portainer.sh
# Option 1 : Build et push tout
./deploy-to-portainer.sh all
# Option 2 : Backend seulement
./deploy-to-portainer.sh backend
# Option 3 : Frontend seulement
./deploy-to-portainer.sh frontend
```
Le script fait automatiquement :
1. ✅ Vérifie que Docker est démarré
2. 🔨 Build les images avec le bon tag
3. 📤 Push vers le registry
4. 📋 Affiche un résumé
---
## 🔍 Vérification des Images sur le Registry
### Via Docker CLI
```bash
# Vérifier que l'image backend existe
docker manifest inspect rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
# Vérifier que l'image frontend existe
docker manifest inspect rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod
# Si les commandes retournent un JSON, les images existent ✅
# Si erreur "manifest unknown", les images n'existent pas ❌
```
### Via Scaleway Console
1. Console Scaleway → Container Registry
2. Sélectionner `weworkstudio`
3. Chercher `xpeditis-backend` et `xpeditis-frontend`
4. Vérifier le tag `preprod`
---
## ⚠️ Erreurs Courantes
### Erreur 1 : "denied: requested access to the resource is denied"
**Cause** : Pas authentifié au registry
**Solution** :
```bash
docker login rg.fr-par.scw.cloud/weworkstudio
# Entrer username et token Scaleway
```
---
### Erreur 2 : "no such host"
**Cause** : URL du registry incorrecte
**Solution** : Vérifier l'URL exacte dans la console Scaleway
---
### Erreur 3 : "server gave HTTP response to HTTPS client"
**Cause** : Docker essaie d'utiliser HTTP au lieu de HTTPS
**Solution** :
```bash
# Vérifier que le registry est en HTTPS
# Le registry Scaleway utilise toujours HTTPS
# Vérifier votre configuration Docker
```
---
### Erreur 4 : Build échoue avec "no space left on device"
**Cause** : Pas assez d'espace disque
**Solution** :
```bash
# Nettoyer les images inutilisées
docker system prune -a
# Vérifier l'espace disponible
docker system df
```
---
## 🎯 Après le Push
Une fois les images pushées :
1. **Aller sur Portainer** : https://portainer.weworkstudio.com
2. **Stacks**`xpeditis-preprod`
3. Cliquer sur **Editor**
4. Vérifier que le YAML contient :
```yaml
xpeditis-backend:
image: rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
xpeditis-frontend:
image: rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod
```
5. Cocher **✅ Re-pull image and redeploy**
6. Cliquer **Update the stack**
---
## 📊 Résumé des Commandes
### Build et Push - Version Complète
```bash
# 1. Login
docker login rg.fr-par.scw.cloud/weworkstudio
# 2. Backend
cd apps/backend
docker build --platform linux/amd64 -t rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod .
docker push rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
# 3. Frontend
cd ../frontend
docker build --platform linux/amd64 -t rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod .
docker push rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod
# 4. Vérification
cd ../..
docker images | grep rg.fr-par.scw.cloud
```
### Build et Push - Version Script
```bash
# Plus simple et recommandé
chmod +x deploy-to-portainer.sh
./deploy-to-portainer.sh all
```
---
## 🔐 Sécurité
### Token Scaleway
**Ne jamais** commit ou partager votre token Scaleway !
Le token doit être stocké :
- ✅ Dans Docker credentials (après `docker login`)
- ✅ Dans un gestionnaire de mots de passe
- ❌ PAS dans Git
- ❌ PAS en clair dans un fichier
### Rotation des Tokens
Recommandé de changer le token tous les 90 jours :
1. Console Scaleway → API Tokens
2. Révoquer l'ancien token
3. Créer un nouveau token
4. Faire un nouveau `docker login`
---
## 📞 Besoin d'Aide ?
Si les images ne peuvent toujours pas être pullées après ces étapes :
1. **Vérifier les logs Portainer** :
- Stacks → xpeditis-preprod → Logs
- Chercher "manifest unknown" ou "access denied"
2. **Vérifier les permissions** :
- Console Scaleway → IAM
- Vérifier que votre compte a accès au registry
3. **Tester manuellement** :
```bash
# Sur votre machine
docker pull rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
# Si ça fonctionne localement mais pas sur Portainer,
# le problème vient de l'accès de Portainer au registry
```
---
## ✅ Checklist Finale
Avant de dire que c'est résolu :
- [ ] `docker login` réussi
- [ ] Images backend et frontend buildées
- [ ] Images pushées vers le registry Scaleway
- [ ] Images visibles sur console.scaleway.com
- [ ] `docker manifest inspect` retourne du JSON (pas d'erreur)
- [ ] Portainer peut pull les images (pas d'erreur dans les logs)
---
**Date** : 2025-11-19
**Version** : 1.0
**Statut** : Guide complet pour résoudre les problèmes de pull

View File

@ -81,23 +81,23 @@ services:
- xpeditis-redis - xpeditis-redis
environment: environment:
NODE_ENV: preprod NODE_ENV: preprod
PORT: 4000 PORT: "4000"
API_PREFIX: api/v1 API_PREFIX: api/v1
# Database # Database
DATABASE_HOST: xpeditis-db DATABASE_HOST: xpeditis-db
DATABASE_PORT: 5432 DATABASE_PORT: "5432"
DATABASE_USER: xpeditis DATABASE_USER: xpeditis
DATABASE_PASSWORD: 9Lc3M9qoPBeHLKHDXGUf1 DATABASE_PASSWORD: 9Lc3M9qoPBeHLKHDXGUf1
DATABASE_NAME: xpeditis_preprod DATABASE_NAME: xpeditis_preprod
DATABASE_SYNC: false DATABASE_SYNC: "false"
DATABASE_LOGGING: false DATABASE_LOGGING: "false"
# Redis # Redis
REDIS_HOST: xpeditis-redis REDIS_HOST: xpeditis-redis
REDIS_PORT: 6379 REDIS_PORT: "6379"
REDIS_PASSWORD: hXiy5GMPswMtxMZujjS2O REDIS_PASSWORD: hXiy5GMPswMtxMZujjS2O
REDIS_DB: 0 REDIS_DB: "0"
# JWT # JWT
JWT_SECRET: 4C4tQC8qym/evv4zI5DaUE1yy3kilEnm6lApOGD0GgNBLA0BLm2tVyUr1Lr0mTnV JWT_SECRET: 4C4tQC8qym/evv4zI5DaUE1yy3kilEnm6lApOGD0GgNBLA0BLm2tVyUr1Lr0mTnV
@ -120,12 +120,12 @@ services:
API_URL: https://api.preprod.xpeditis.com API_URL: https://api.preprod.xpeditis.com
# Security # Security
BCRYPT_ROUNDS: 10 BCRYPT_ROUNDS: "10"
SESSION_TIMEOUT_MS: 7200000 SESSION_TIMEOUT_MS: "7200000"
# Rate Limiting # Rate Limiting
RATE_LIMIT_TTL: 60 RATE_LIMIT_TTL: "60"
RATE_LIMIT_MAX: 100 RATE_LIMIT_MAX: "100"
networks: networks:
- xpeditis_internal - xpeditis_internal