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
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:
parent
7dadd951bb
commit
2e5dcec05c
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
@ -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
176
ARM64_SUPPORT.md
Normal 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
257
CICD_REGISTRY_SETUP.md
Normal 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
199
DEPLOYMENT_READY.md
Normal 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
145
DOCKER_ARM64_FIX.md
Normal 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
149
PORTAINER_YAML_FIX.md
Normal 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
340
REGISTRY_PUSH_GUIDE.md
Normal 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
|
||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user