From 2e5dcec05c404bb08f746bc0a415716ef72e6356 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 19 Nov 2025 18:27:42 +0100 Subject: [PATCH] fix --- .github/workflows/ci.yml | 4 +- ARM64_SUPPORT.md | 176 +++++++++++++++++++ CICD_REGISTRY_SETUP.md | 257 ++++++++++++++++++++++++++++ DEPLOYMENT_READY.md | 199 ++++++++++++++++++++++ DOCKER_ARM64_FIX.md | 145 ++++++++++++++++ PORTAINER_YAML_FIX.md | 149 ++++++++++++++++ REGISTRY_PUSH_GUIDE.md | 340 +++++++++++++++++++++++++++++++++++++ docker/portainer-stack.yml | 20 +-- 8 files changed, 1278 insertions(+), 12 deletions(-) create mode 100644 ARM64_SUPPORT.md create mode 100644 CICD_REGISTRY_SETUP.md create mode 100644 DEPLOYMENT_READY.md create mode 100644 DOCKER_ARM64_FIX.md create mode 100644 PORTAINER_YAML_FIX.md create mode 100644 REGISTRY_PUSH_GUIDE.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03c436b..7e78141 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,7 +70,7 @@ jobs: labels: ${{ steps.meta.outputs.labels }} cache-from: type=registry,ref=${{ env.REGISTRY }}/xpeditis-backend:buildcache cache-to: type=registry,ref=${{ env.REGISTRY }}/xpeditis-backend:buildcache,mode=max - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 # ============================================ # Frontend Build, Test & Deploy @@ -138,7 +138,7 @@ jobs: labels: ${{ steps.meta.outputs.labels }} cache-from: type=registry,ref=${{ env.REGISTRY }}/xpeditis-frontend:buildcache cache-to: type=registry,ref=${{ env.REGISTRY }}/xpeditis-frontend:buildcache,mode=max - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 build-args: | NEXT_PUBLIC_API_URL=${{ secrets.NEXT_PUBLIC_API_URL || 'http://localhost:4000' }} NEXT_PUBLIC_APP_URL=${{ secrets.NEXT_PUBLIC_APP_URL || 'http://localhost:3000' }} diff --git a/ARM64_SUPPORT.md b/ARM64_SUPPORT.md new file mode 100644 index 0000000..c967251 --- /dev/null +++ b/ARM64_SUPPORT.md @@ -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 diff --git a/CICD_REGISTRY_SETUP.md b/CICD_REGISTRY_SETUP.md new file mode 100644 index 0000000..f0fefd1 --- /dev/null +++ b/CICD_REGISTRY_SETUP.md @@ -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 diff --git a/DEPLOYMENT_READY.md b/DEPLOYMENT_READY.md new file mode 100644 index 0000000..97bd8f1 --- /dev/null +++ b/DEPLOYMENT_READY.md @@ -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 diff --git a/DOCKER_ARM64_FIX.md b/DOCKER_ARM64_FIX.md new file mode 100644 index 0000000..7dc7a74 --- /dev/null +++ b/DOCKER_ARM64_FIX.md @@ -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 diff --git a/PORTAINER_YAML_FIX.md b/PORTAINER_YAML_FIX.md new file mode 100644 index 0000000..985a963 --- /dev/null +++ b/PORTAINER_YAML_FIX.md @@ -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 diff --git a/REGISTRY_PUSH_GUIDE.md b/REGISTRY_PUSH_GUIDE.md new file mode 100644 index 0000000..fff20fa --- /dev/null +++ b/REGISTRY_PUSH_GUIDE.md @@ -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: +# Password: +``` + +**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