dockerisation
This commit is contained in:
parent
f769d15bb1
commit
70c5f754c5
64
.dockerignore
Normal file
64
.dockerignore
Normal file
@ -0,0 +1,64 @@
|
||||
# Dependencies
|
||||
node_modules
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Next.js
|
||||
.next
|
||||
out
|
||||
dist
|
||||
build
|
||||
|
||||
# Environment variables
|
||||
.env
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# Testing
|
||||
coverage
|
||||
.nyc_output
|
||||
|
||||
# IDE
|
||||
.vscode
|
||||
.idea
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Git
|
||||
.git
|
||||
.gitignore
|
||||
.gitattributes
|
||||
|
||||
# Docker
|
||||
Dockerfile
|
||||
Dockerfile.prod
|
||||
docker-compose.yml
|
||||
docker-compose.prod.yml
|
||||
.dockerignore
|
||||
|
||||
# Documentation
|
||||
*.md
|
||||
!README.md
|
||||
|
||||
# Scripts (optionnel - gardez-les si vous en avez besoin dans le conteneur)
|
||||
# scripts/
|
||||
|
||||
# Prisma migrations (seront copiés mais exécutés séparément)
|
||||
# prisma/migrations
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
logs
|
||||
|
||||
# Temporary files
|
||||
tmp
|
||||
temp
|
||||
.cache
|
||||
346
DEPLOYMENT.md
Normal file
346
DEPLOYMENT.md
Normal file
@ -0,0 +1,346 @@
|
||||
# Guide de Déploiement Docker - Production
|
||||
|
||||
Ce guide explique comment déployer l'application Neah en production avec Docker.
|
||||
|
||||
## 📋 Prérequis
|
||||
|
||||
- Docker Engine 20.10+
|
||||
- Docker Compose 2.0+
|
||||
- Au moins 4GB de RAM disponible
|
||||
- Au moins 10GB d'espace disque
|
||||
|
||||
## 🚀 Déploiement Rapide
|
||||
|
||||
### 1. Préparation de l'environnement
|
||||
|
||||
```bash
|
||||
# Cloner le repository (si ce n'est pas déjà fait)
|
||||
git clone <repository-url>
|
||||
cd NeahStable
|
||||
|
||||
# Créer le fichier .env.production avec vos variables
|
||||
cp .env.example .env.production
|
||||
nano .env.production # Éditez avec vos valeurs
|
||||
```
|
||||
|
||||
### 2. Configuration des variables d'environnement
|
||||
|
||||
Créez un fichier `.env.production` avec toutes les variables nécessaires :
|
||||
|
||||
```env
|
||||
# Database
|
||||
POSTGRES_USER=neah_user
|
||||
POSTGRES_PASSWORD=VOTRE_MOT_DE_PASSE_SECURISE
|
||||
POSTGRES_DB=calendar_db
|
||||
DATABASE_URL=postgresql://neah_user:VOTRE_MOT_DE_PASSE_SECURISE@db:5432/calendar_db?schema=public
|
||||
|
||||
# Redis
|
||||
REDIS_PASSWORD=VOTRE_MOT_DE_PASSE_REDIS_SECURISE
|
||||
REDIS_URL=redis://:VOTRE_MOT_DE_PASSE_REDIS_SECURISE@redis:6379
|
||||
|
||||
# NextAuth
|
||||
NEXTAUTH_URL=https://hub.slm-lab.net
|
||||
NEXTAUTH_SECRET=VOTRE_SECRET_NEXTAUTH_TRES_LONG_ET_SECURISE
|
||||
|
||||
# Keycloak
|
||||
KEYCLOAK_ISSUER=https://connect.slm-lab.net/realms/cercle
|
||||
KEYCLOAK_CLIENT_ID=lab
|
||||
KEYCLOAK_CLIENT_SECRET=VOTRE_CLIENT_SECRET
|
||||
KEYCLOAK_REALM=cercle
|
||||
NEXT_PUBLIC_KEYCLOAK_ISSUER=https://connect.slm-lab.net/realms/cercle
|
||||
|
||||
# Application
|
||||
APP_PORT=3000
|
||||
NODE_ENV=production
|
||||
```
|
||||
|
||||
### 3. Build et démarrage
|
||||
|
||||
```bash
|
||||
# Build l'image Docker
|
||||
docker-compose -f docker-compose.prod.yml build
|
||||
|
||||
# Démarrer les services (base de données et Redis)
|
||||
docker-compose -f docker-compose.prod.yml up -d db redis
|
||||
|
||||
# Attendre que les services soient prêts (environ 10 secondes)
|
||||
sleep 10
|
||||
|
||||
# Appliquer les migrations Prisma
|
||||
docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy
|
||||
|
||||
# Démarrer l'application
|
||||
docker-compose -f docker-compose.prod.yml up -d app
|
||||
|
||||
# Vérifier les logs
|
||||
docker-compose -f docker-compose.prod.yml logs -f app
|
||||
```
|
||||
|
||||
## 🔧 Configuration Avancée
|
||||
|
||||
### Variables d'environnement importantes
|
||||
|
||||
#### Base de données PostgreSQL
|
||||
- `POSTGRES_USER` : Utilisateur PostgreSQL
|
||||
- `POSTGRES_PASSWORD` : **Changez absolument le mot de passe par défaut !**
|
||||
- `POSTGRES_DB` : Nom de la base de données
|
||||
|
||||
#### Redis
|
||||
- `REDIS_PASSWORD` : **Changez absolument le mot de passe par défaut !**
|
||||
|
||||
#### NextAuth
|
||||
- `NEXTAUTH_URL` : URL publique de votre application (ex: `https://hub.slm-lab.net`)
|
||||
- `NEXTAUTH_SECRET` : Secret pour signer les tokens JWT (générez avec `openssl rand -base64 32`)
|
||||
|
||||
#### Keycloak
|
||||
- `KEYCLOAK_ISSUER` : URL de votre instance Keycloak
|
||||
- `KEYCLOAK_CLIENT_ID` : ID du client OAuth
|
||||
- `KEYCLOAK_CLIENT_SECRET` : Secret du client OAuth
|
||||
- `KEYCLOAK_REALM` : Nom du realm Keycloak
|
||||
|
||||
### Ports exposés
|
||||
|
||||
Par défaut, les ports suivants sont exposés :
|
||||
- **3000** : Application Next.js
|
||||
- **5432** : PostgreSQL (uniquement sur localhost)
|
||||
- **6379** : Redis (uniquement sur localhost)
|
||||
|
||||
Pour modifier les ports, éditez `docker-compose.prod.yml` :
|
||||
|
||||
```yaml
|
||||
app:
|
||||
ports:
|
||||
- "80:3000" # Exposer sur le port 80
|
||||
```
|
||||
|
||||
### Volumes et persistance
|
||||
|
||||
Les données sont stockées dans des volumes Docker :
|
||||
- `postgres_data` : Base de données PostgreSQL
|
||||
- `redis_data` : Données Redis
|
||||
|
||||
Pour sauvegarder :
|
||||
|
||||
```bash
|
||||
# Sauvegarder PostgreSQL
|
||||
docker exec neah-postgres-prod pg_dump -U neah_user calendar_db > backup.sql
|
||||
|
||||
# Restaurer PostgreSQL
|
||||
docker exec -i neah-postgres-prod psql -U neah_user calendar_db < backup.sql
|
||||
```
|
||||
|
||||
## 🔄 Mises à jour
|
||||
|
||||
### Mettre à jour l'application
|
||||
|
||||
```bash
|
||||
# Arrêter l'application
|
||||
docker-compose -f docker-compose.prod.yml stop app
|
||||
|
||||
# Rebuild l'image
|
||||
docker-compose -f docker-compose.prod.yml build app
|
||||
|
||||
# Appliquer les migrations si nécessaire
|
||||
docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy
|
||||
|
||||
# Redémarrer
|
||||
docker-compose -f docker-compose.prod.yml up -d app
|
||||
```
|
||||
|
||||
### Appliquer les migrations Prisma
|
||||
|
||||
```bash
|
||||
# Vérifier le statut des migrations
|
||||
docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate status
|
||||
|
||||
# Appliquer les migrations
|
||||
docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy
|
||||
```
|
||||
|
||||
## 📊 Monitoring et Logs
|
||||
|
||||
### Voir les logs
|
||||
|
||||
```bash
|
||||
# Tous les services
|
||||
docker-compose -f docker-compose.prod.yml logs -f
|
||||
|
||||
# Un service spécifique
|
||||
docker-compose -f docker-compose.prod.yml logs -f app
|
||||
docker-compose -f docker-compose.prod.yml logs -f db
|
||||
docker-compose -f docker-compose.prod.yml logs -f redis
|
||||
```
|
||||
|
||||
### Health Check
|
||||
|
||||
L'application expose un endpoint de health check :
|
||||
- `GET http://localhost:3000/api/health`
|
||||
|
||||
Réponse :
|
||||
```json
|
||||
{
|
||||
"status": "ok",
|
||||
"timestamp": "2024-01-01T00:00:00.000Z",
|
||||
"uptime": 3600,
|
||||
"checks": {
|
||||
"database": { "status": "ok", "latency": 5 },
|
||||
"redis": { "status": "ok", "latency": 2 }
|
||||
},
|
||||
"latency": 7
|
||||
}
|
||||
```
|
||||
|
||||
## 🔒 Sécurité
|
||||
|
||||
### Checklist de sécurité
|
||||
|
||||
- [ ] Tous les mots de passe par défaut ont été changés
|
||||
- [ ] `NEXTAUTH_SECRET` est un secret fort et unique
|
||||
- [ ] Les ports ne sont exposés que si nécessaire
|
||||
- [ ] Un reverse proxy (Nginx/Traefik) est configuré avec SSL/TLS
|
||||
- [ ] Les volumes sont sauvegardés régulièrement
|
||||
- [ ] Les logs sont surveillés pour détecter les anomalies
|
||||
|
||||
### Reverse Proxy avec Nginx
|
||||
|
||||
Exemple de configuration Nginx :
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name hub.slm-lab.net;
|
||||
|
||||
# Redirection HTTPS
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name hub.slm-lab.net;
|
||||
|
||||
ssl_certificate /path/to/cert.pem;
|
||||
ssl_certificate_key /path/to/key.pem;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🛠️ Dépannage
|
||||
|
||||
### L'application ne démarre pas
|
||||
|
||||
```bash
|
||||
# Vérifier les logs
|
||||
docker-compose -f docker-compose.prod.yml logs app
|
||||
|
||||
# Vérifier que les services dépendants sont démarrés
|
||||
docker-compose -f docker-compose.prod.yml ps
|
||||
|
||||
# Vérifier la santé des services
|
||||
docker-compose -f docker-compose.prod.yml exec app curl http://localhost:3000/api/health
|
||||
```
|
||||
|
||||
### Problèmes de connexion à la base de données
|
||||
|
||||
```bash
|
||||
# Tester la connexion PostgreSQL
|
||||
docker-compose -f docker-compose.prod.yml exec db psql -U neah_user -d calendar_db -c "SELECT 1;"
|
||||
|
||||
# Vérifier les variables d'environnement
|
||||
docker-compose -f docker-compose.prod.yml exec app env | grep DATABASE
|
||||
```
|
||||
|
||||
### Problèmes de connexion Redis
|
||||
|
||||
```bash
|
||||
# Tester Redis
|
||||
docker-compose -f docker-compose.prod.yml exec redis redis-cli -a VOTRE_MOT_DE_PASSE ping
|
||||
```
|
||||
|
||||
### Rebuild complet
|
||||
|
||||
Si vous avez des problèmes persistants :
|
||||
|
||||
```bash
|
||||
# Arrêter tous les services
|
||||
docker-compose -f docker-compose.prod.yml down
|
||||
|
||||
# Supprimer les volumes (⚠️ PERDREZ LES DONNÉES)
|
||||
docker-compose -f docker-compose.prod.yml down -v
|
||||
|
||||
# Rebuild tout
|
||||
docker-compose -f docker-compose.prod.yml build --no-cache
|
||||
|
||||
# Redémarrer
|
||||
docker-compose -f docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
## 📦 Sauvegardes
|
||||
|
||||
### Script de sauvegarde automatique
|
||||
|
||||
Créez un script `backup.sh` :
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
BACKUP_DIR="/backups/neah"
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
|
||||
# Créer le dossier de backup
|
||||
mkdir -p $BACKUP_DIR
|
||||
|
||||
# Sauvegarder PostgreSQL
|
||||
docker exec neah-postgres-prod pg_dump -U neah_user calendar_db | gzip > $BACKUP_DIR/db_$DATE.sql.gz
|
||||
|
||||
# Sauvegarder Redis (optionnel)
|
||||
docker exec neah-redis-prod redis-cli --rdb - | gzip > $BACKUP_DIR/redis_$DATE.rdb.gz
|
||||
|
||||
# Garder seulement les 7 derniers jours
|
||||
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
|
||||
|
||||
echo "Backup completed: $DATE"
|
||||
```
|
||||
|
||||
Ajoutez dans crontab pour exécution quotidienne :
|
||||
```bash
|
||||
0 2 * * * /path/to/backup.sh
|
||||
```
|
||||
|
||||
## 🚀 Déploiement avec Traefik (Optionnel)
|
||||
|
||||
Pour un déploiement avec Traefik comme reverse proxy :
|
||||
|
||||
```yaml
|
||||
# Ajoutez dans docker-compose.prod.yml
|
||||
app:
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.neah.rule=Host(`hub.slm-lab.net`)"
|
||||
- "traefik.http.routers.neah.entrypoints=websecure"
|
||||
- "traefik.http.routers.neah.tls.certresolver=letsencrypt"
|
||||
- "traefik.http.services.neah.loadbalancer.server.port=3000"
|
||||
```
|
||||
|
||||
## 📝 Notes importantes
|
||||
|
||||
1. **Migrations Prisma** : Toujours exécuter `prisma migrate deploy` avant de démarrer l'application en production
|
||||
2. **Secrets** : Ne jamais commiter les fichiers `.env` dans Git
|
||||
3. **Ports** : Limiter l'exposition des ports aux services nécessaires uniquement
|
||||
4. **Monitoring** : Configurer des alertes pour les health checks
|
||||
5. **Sauvegardes** : Automatiser les sauvegardes de la base de données
|
||||
|
||||
## 🔗 Ressources
|
||||
|
||||
- [Documentation Docker](https://docs.docker.com/)
|
||||
- [Documentation Next.js](https://nextjs.org/docs)
|
||||
- [Documentation Prisma](https://www.prisma.io/docs)
|
||||
@ -45,13 +45,20 @@ RUN adduser --system --uid 1001 nextjs
|
||||
|
||||
# Copier les fichiers nécessaires depuis le builder
|
||||
COPY --from=builder /app/public ./public
|
||||
COPY --from=builder /app/.next/standalone ./
|
||||
COPY --from=builder /app/.next/static ./.next/static
|
||||
COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma
|
||||
COPY --from=builder /app/node_modules/@prisma ./node_modules/@prisma
|
||||
|
||||
# Changer les permissions
|
||||
RUN chown -R nextjs:nodejs /app
|
||||
# Copier le build standalone de Next.js
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||||
|
||||
# Copier Prisma (nécessaire pour le runtime)
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/.prisma ./node_modules/.prisma
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/@prisma ./node_modules/@prisma
|
||||
|
||||
# Copier le schéma Prisma (nécessaire pour certaines opérations)
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma
|
||||
|
||||
# Copier package.json pour les scripts Prisma
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/package.json ./package.json
|
||||
|
||||
USER nextjs
|
||||
|
||||
@ -60,6 +67,10 @@ EXPOSE 3000
|
||||
ENV PORT=3000
|
||||
ENV HOSTNAME="0.0.0.0"
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
|
||||
CMD node -e "require('http').get('http://localhost:3000/api/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" || exit 1
|
||||
|
||||
# Note: Les migrations Prisma doivent être appliquées séparément avant le démarrage
|
||||
# Utilisez: docker exec <container> npx prisma migrate deploy
|
||||
CMD ["node", "server.js"]
|
||||
|
||||
65
QUICK_START_PRODUCTION.md
Normal file
65
QUICK_START_PRODUCTION.md
Normal file
@ -0,0 +1,65 @@
|
||||
# 🚀 Démarrage Rapide - Production Docker
|
||||
|
||||
## Installation en 5 minutes
|
||||
|
||||
### 1. Préparer l'environnement
|
||||
|
||||
```bash
|
||||
# Copier le fichier d'exemple
|
||||
cp env.production.example .env.production
|
||||
|
||||
# Éditer avec vos valeurs
|
||||
nano .env.production
|
||||
```
|
||||
|
||||
**⚠️ IMPORTANT** : Changez au minimum :
|
||||
- `POSTGRES_PASSWORD`
|
||||
- `REDIS_PASSWORD`
|
||||
- `NEXTAUTH_SECRET` (générez avec `openssl rand -base64 32`)
|
||||
|
||||
### 2. Déployer
|
||||
|
||||
```bash
|
||||
# Option A: Utiliser le script automatique
|
||||
./scripts/deploy-prod.sh
|
||||
|
||||
# Option B: Commandes manuelles
|
||||
docker-compose -f docker-compose.prod.yml build
|
||||
docker-compose -f docker-compose.prod.yml up -d db redis
|
||||
sleep 15
|
||||
docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy
|
||||
docker-compose -f docker-compose.prod.yml up -d app
|
||||
```
|
||||
|
||||
### 3. Vérifier
|
||||
|
||||
```bash
|
||||
# Vérifier que tout fonctionne
|
||||
curl http://localhost:3000/api/health
|
||||
|
||||
# Voir les logs
|
||||
docker-compose -f docker-compose.prod.yml logs -f app
|
||||
```
|
||||
|
||||
## Commandes utiles
|
||||
|
||||
```bash
|
||||
# Arrêter
|
||||
docker-compose -f docker-compose.prod.yml down
|
||||
|
||||
# Redémarrer
|
||||
docker-compose -f docker-compose.prod.yml restart app
|
||||
|
||||
# Voir les logs
|
||||
docker-compose -f docker-compose.prod.yml logs -f
|
||||
|
||||
# Appliquer les migrations
|
||||
docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy
|
||||
|
||||
# Accéder à la base de données
|
||||
docker-compose -f docker-compose.prod.yml exec db psql -U neah_user -d calendar_db
|
||||
```
|
||||
|
||||
## 📖 Documentation complète
|
||||
|
||||
Voir `DEPLOYMENT.md` pour la documentation complète.
|
||||
@ -1,11 +1,10 @@
|
||||
# ============================================
|
||||
# Docker Compose pour Production Neah
|
||||
# ============================================
|
||||
# Ce fichier est optimisé pour un déploiement en production.
|
||||
# Il configure PostgreSQL et Redis pour être utilisés avec Vercel (Next.js déployé séparément).
|
||||
# Ce fichier configure l'application complète pour la production
|
||||
#
|
||||
# Usage:
|
||||
# docker-compose -f docker-compose.prod.yml up -d
|
||||
# docker-compose -f docker-compose.prod.yml --env-file .env.production up -d
|
||||
#
|
||||
# IMPORTANT:
|
||||
# - Modifiez les mots de passe par défaut avant le déploiement !
|
||||
@ -42,9 +41,6 @@ services:
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
# Configuration réseau (optionnel: créer un réseau isolé)
|
||||
# networks:
|
||||
# - neah_network
|
||||
# Sécurité: limiter les ressources
|
||||
deploy:
|
||||
resources:
|
||||
@ -116,6 +112,66 @@ services:
|
||||
# cpus: '1'
|
||||
# memory: 1G
|
||||
|
||||
# ============================================
|
||||
# Application Next.js
|
||||
# ============================================
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.prod
|
||||
container_name: neah-app-prod
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${APP_PORT:-3000}:3000"
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
# Database
|
||||
DATABASE_URL: ${DATABASE_URL:-postgresql://${POSTGRES_USER:-neah_user}:${POSTGRES_PASSWORD:-CHANGE_ME_IN_PRODUCTION}@db:5432/${POSTGRES_DB:-calendar_db}?schema=public}
|
||||
|
||||
# Redis
|
||||
REDIS_URL: ${REDIS_URL:-redis://:${REDIS_PASSWORD:-CHANGE_ME_IN_PRODUCTION}@redis:6379}
|
||||
|
||||
# NextAuth
|
||||
NEXTAUTH_URL: ${NEXTAUTH_URL:-https://hub.slm-lab.net}
|
||||
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET:-CHANGE_ME_IN_PRODUCTION}
|
||||
|
||||
# Keycloak
|
||||
KEYCLOAK_ISSUER: ${KEYCLOAK_ISSUER}
|
||||
KEYCLOAK_CLIENT_ID: ${KEYCLOAK_CLIENT_ID}
|
||||
KEYCLOAK_CLIENT_SECRET: ${KEYCLOAK_CLIENT_SECRET}
|
||||
KEYCLOAK_REALM: ${KEYCLOAK_REALM}
|
||||
NEXT_PUBLIC_KEYCLOAK_ISSUER: ${NEXT_PUBLIC_KEYCLOAK_ISSUER}
|
||||
|
||||
# Node environment
|
||||
NODE_ENV: production
|
||||
NEXT_TELEMETRY_DISABLED: 1
|
||||
|
||||
# Autres variables d'environnement (ajoutez les vôtres)
|
||||
# MINIO_S3_UPLOAD_BUCKET_URL: ${MINIO_S3_UPLOAD_BUCKET_URL}
|
||||
# MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY}
|
||||
# MINIO_SECRET_KEY: ${MINIO_SECRET_KEY}
|
||||
volumes:
|
||||
# Optionnel: monter des fichiers de configuration ou des uploads
|
||||
# - ./uploads:/app/uploads
|
||||
healthcheck:
|
||||
test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000/api/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '2'
|
||||
memory: 2G
|
||||
reservations:
|
||||
cpus: '1'
|
||||
memory: 1G
|
||||
|
||||
volumes:
|
||||
# Volume pour PostgreSQL - persistance des données
|
||||
postgres_data:
|
||||
@ -174,6 +230,6 @@ volumes:
|
||||
#
|
||||
# 5. MIGRATIONS PRISMA:
|
||||
# - Exécutez les migrations avant chaque déploiement:
|
||||
# DATABASE_URL="postgresql://..." npx prisma migrate deploy
|
||||
# docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy
|
||||
# - Testez les migrations en staging avant la production
|
||||
# - Gardez un plan de rollback pour chaque migration
|
||||
|
||||
59
env.production.example
Normal file
59
env.production.example
Normal file
@ -0,0 +1,59 @@
|
||||
# ============================================
|
||||
# Configuration Production Neah
|
||||
# ============================================
|
||||
# Copiez ce fichier vers .env.production et remplissez les valeurs
|
||||
# ⚠️ NE COMMITEZ JAMAIS .env.production DANS GIT !
|
||||
|
||||
# ============================================
|
||||
# Base de données PostgreSQL
|
||||
# ============================================
|
||||
POSTGRES_USER=neah_user
|
||||
POSTGRES_PASSWORD=CHANGEZ_CE_MOT_DE_PASSE
|
||||
POSTGRES_DB=calendar_db
|
||||
DATABASE_URL=postgresql://neah_user:CHANGEZ_CE_MOT_DE_PASSE@db:5432/calendar_db?schema=public
|
||||
|
||||
# ============================================
|
||||
# Redis
|
||||
# ============================================
|
||||
REDIS_PASSWORD=CHANGEZ_CE_MOT_DE_PASSE
|
||||
REDIS_URL=redis://:CHANGEZ_CE_MOT_DE_PASSE@redis:6379
|
||||
|
||||
# ============================================
|
||||
# NextAuth
|
||||
# ============================================
|
||||
NEXTAUTH_URL=https://hub.slm-lab.net
|
||||
# Générez un secret avec: openssl rand -base64 32
|
||||
NEXTAUTH_SECRET=GENERER_UN_SECRET_TRES_LONG_ET_SECURISE
|
||||
|
||||
# ============================================
|
||||
# Keycloak
|
||||
# ============================================
|
||||
KEYCLOAK_ISSUER=https://connect.slm-lab.net/realms/cercle
|
||||
KEYCLOAK_CLIENT_ID=lab
|
||||
KEYCLOAK_CLIENT_SECRET=VOTRE_CLIENT_SECRET_KEYCLOAK
|
||||
KEYCLOAK_REALM=cercle
|
||||
NEXT_PUBLIC_KEYCLOAK_ISSUER=https://connect.slm-lab.net/realms/cercle
|
||||
|
||||
# ============================================
|
||||
# Application
|
||||
# ============================================
|
||||
APP_PORT=3000
|
||||
NODE_ENV=production
|
||||
NEXT_TELEMETRY_DISABLED=1
|
||||
|
||||
# ============================================
|
||||
# MinIO / S3 (si utilisé)
|
||||
# ============================================
|
||||
# MINIO_S3_UPLOAD_BUCKET_URL=http://minio:9000
|
||||
# MINIO_AWS_REGION=us-east-1
|
||||
# MINIO_AWS_S3_UPLOAD_BUCKET_NAME=missions
|
||||
# MINIO_ACCESS_KEY=minioadmin
|
||||
# MINIO_SECRET_KEY=CHANGEZ_CE_MOT_DE_PASSE
|
||||
|
||||
# ============================================
|
||||
# Autres services (ajoutez selon vos besoins)
|
||||
# ============================================
|
||||
# LEANTIME_API_URL=https://leantime.example.com/api
|
||||
# LEANTIME_TOKEN=votre_token
|
||||
# N8N_API_KEY=votre_api_key
|
||||
# N8N_WEBHOOK_URL=https://brain.slm-lab.net/webhook/mission-created
|
||||
@ -1,5 +1,8 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
// Enable standalone output for Docker
|
||||
output: 'standalone',
|
||||
|
||||
// Note: ESLint configuration is now done via .eslintrc.json or next lint command
|
||||
// The eslint option in next.config.mjs is deprecated in Next.js 16
|
||||
typescript: {
|
||||
|
||||
90
scripts/deploy-prod.sh
Executable file
90
scripts/deploy-prod.sh
Executable file
@ -0,0 +1,90 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ============================================
|
||||
# Script de déploiement en production
|
||||
# ============================================
|
||||
# Usage: ./scripts/deploy-prod.sh
|
||||
|
||||
set -e # Arrêter en cas d'erreur
|
||||
|
||||
echo "🚀 Déploiement Neah en production..."
|
||||
|
||||
# Vérifier que Docker est installé
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "❌ Docker n'est pas installé. Veuillez l'installer d'abord."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v docker-compose &> /dev/null; then
|
||||
echo "❌ Docker Compose n'est pas installé. Veuillez l'installer d'abord."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier que le fichier .env.production existe
|
||||
if [ ! -f .env.production ]; then
|
||||
echo "❌ Le fichier .env.production n'existe pas."
|
||||
echo "📝 Créez-le à partir de env.production.example"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Charger les variables d'environnement
|
||||
export $(cat .env.production | grep -v '^#' | xargs)
|
||||
|
||||
echo "📦 Build de l'image Docker..."
|
||||
docker-compose -f docker-compose.prod.yml build --no-cache app
|
||||
|
||||
echo "🔄 Démarrage des services de base (PostgreSQL, Redis)..."
|
||||
docker-compose -f docker-compose.prod.yml up -d db redis
|
||||
|
||||
echo "⏳ Attente que les services soient prêts (15 secondes)..."
|
||||
sleep 15
|
||||
|
||||
echo "🔍 Vérification de la santé des services..."
|
||||
# Vérifier PostgreSQL
|
||||
if ! docker-compose -f docker-compose.prod.yml exec -T db pg_isready -U ${POSTGRES_USER:-neah_user} > /dev/null 2>&1; then
|
||||
echo "❌ PostgreSQL n'est pas prêt"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ PostgreSQL est prêt"
|
||||
|
||||
# Vérifier Redis
|
||||
if ! docker-compose -f docker-compose.prod.yml exec -T redis redis-cli -a ${REDIS_PASSWORD} ping > /dev/null 2>&1; then
|
||||
echo "❌ Redis n'est pas prêt"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ Redis est prêt"
|
||||
|
||||
echo "🗄️ Application des migrations Prisma..."
|
||||
docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy
|
||||
|
||||
echo "🚀 Démarrage de l'application..."
|
||||
docker-compose -f docker-compose.prod.yml up -d app
|
||||
|
||||
echo "⏳ Attente que l'application démarre (10 secondes)..."
|
||||
sleep 10
|
||||
|
||||
echo "🔍 Vérification de la santé de l'application..."
|
||||
# Attendre jusqu'à 60 secondes que l'application réponde
|
||||
for i in {1..12}; do
|
||||
if curl -f http://localhost:${APP_PORT:-3000}/api/health > /dev/null 2>&1; then
|
||||
echo "✅ L'application est en ligne et répond"
|
||||
break
|
||||
fi
|
||||
if [ $i -eq 12 ]; then
|
||||
echo "⚠️ L'application ne répond pas encore. Vérifiez les logs:"
|
||||
echo " docker-compose -f docker-compose.prod.yml logs app"
|
||||
exit 1
|
||||
fi
|
||||
echo " Tentative $i/12..."
|
||||
sleep 5
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "✅ Déploiement terminé avec succès!"
|
||||
echo ""
|
||||
echo "📊 Commandes utiles:"
|
||||
echo " - Voir les logs: docker-compose -f docker-compose.prod.yml logs -f app"
|
||||
echo " - Arrêter: docker-compose -f docker-compose.prod.yml down"
|
||||
echo " - Redémarrer: docker-compose -f docker-compose.prod.yml restart app"
|
||||
echo " - Health check: curl http://localhost:${APP_PORT:-3000}/api/health"
|
||||
echo ""
|
||||
Loading…
Reference in New Issue
Block a user