9.7 KiB
9.7 KiB
Guide de Déploiement en Production - Neah
Ce document décrit les procédures pour déployer Neah en production avec Vercel (Next.js) et PostgreSQL auto-hébergé.
Architecture de Production
┌─────────────────┐
│ Utilisateurs │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Vercel (Next.js)│
│ - Frontend │
│ - API Routes │
└────────┬────────┘
│
├─────────────────┐
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ PostgreSQL │ │ Redis │
│ (Auto-hébergé) │ │ (Auto-hébergé) │
└─────────────────┘ └─────────────────┘
Prérequis
- Un compte Vercel
- Un serveur pour PostgreSQL et Redis (VPS, VM, ou conteneur Docker)
- Accès SSH au serveur de base de données
- Node.js 22+ installé localement (pour les migrations)
Étape 1: Configuration PostgreSQL en Production
1.1 Déployer PostgreSQL avec Docker Compose
Sur votre serveur de production:
# Copier le fichier docker-compose.prod.yml
scp docker-compose.prod.yml user@your-server:/opt/neah/
# Se connecter au serveur
ssh user@your-server
# Créer un fichier .env pour les secrets
cd /opt/neah
cat > .env << EOF
POSTGRES_USER=neah_prod_user
POSTGRES_PASSWORD=$(openssl rand -base64 32)
POSTGRES_DB=calendar_db
REDIS_PASSWORD=$(openssl rand -base64 32)
EOF
# Démarrer les services
docker-compose -f docker-compose.prod.yml up -d
# Vérifier que les services sont en cours d'exécution
docker-compose -f docker-compose.prod.yml ps
1.2 Configurer l'accès réseau
Option A: Tunnel SSH (Recommandé pour Vercel)
Depuis votre machine locale ou un serveur bastion:
# Créer un tunnel SSH vers PostgreSQL
ssh -L 5432:localhost:5432 -N user@your-server
# Dans un autre terminal, tester la connexion
psql postgresql://neah_prod_user:password@localhost:5432/calendar_db
Option B: Exposer PostgreSQL avec SSL
Modifiez docker-compose.prod.yml pour activer SSL:
db:
environment:
POSTGRES_INITDB_ARGS: "-E UTF8 --locale=C"
command: >
postgres
-c ssl=on
-c ssl_cert_file=/var/lib/postgresql/server.crt
-c ssl_key_file=/var/lib/postgresql/server.key
volumes:
- postgres_data:/var/lib/postgresql/data
- ./ssl:/var/lib/postgresql
Puis exposez le port avec un firewall configuré pour n'accepter que les IPs Vercel.
1.3 Créer la base de données et appliquer les migrations
# Se connecter au conteneur PostgreSQL
docker exec -it neah-postgres-prod psql -U neah_prod_user -d calendar_db
# Ou depuis l'extérieur (si accessible)
export DATABASE_URL="postgresql://neah_prod_user:password@your-server:5432/calendar_db"
npx prisma migrate deploy
Étape 2: Configuration Vercel
2.1 Créer un projet Vercel
- Connectez-vous à Vercel
- Importez votre repository GitHub/GitLab
- Configurez le projet:
- Framework Preset: Next.js
- Build Command:
npm run build - Output Directory:
.next(par défaut) - Install Command:
npm ci
2.2 Configurer les variables d'environnement
Dans Vercel Dashboard → Project Settings → Environment Variables, ajoutez:
Variables obligatoires
# Environnement
NODE_ENV=production
NEXTAUTH_URL=https://votre-domaine.vercel.app
NEXTAUTH_SECRET=<généré avec: openssl rand -base64 32>
# Base de données (via tunnel SSH ou URL publique avec SSL)
DATABASE_URL=postgresql://user:password@host:5432/calendar_db?sslmode=require
# Keycloak
KEYCLOAK_BASE_URL=https://keycloak.example.com
KEYCLOAK_REALM=neah
KEYCLOAK_CLIENT_ID=neah-app
KEYCLOAK_CLIENT_SECRET=<secret depuis Keycloak>
KEYCLOAK_ISSUER=https://keycloak.example.com/realms/neah
NEXT_PUBLIC_KEYCLOAK_ISSUER=https://keycloak.example.com/realms/neah
# Redis (si accessible depuis Vercel)
REDIS_URL=redis://:password@your-server:6379
# OU
REDIS_HOST=your-server
REDIS_PORT=6379
REDIS_PASSWORD=<password>
REDIS_ENCRYPTION_KEY=<généré avec: openssl rand -base64 32>
Variables optionnelles (selon vos intégrations)
# Leantime
LEANTIME_API_URL=https://leantime.example.com
LEANTIME_TOKEN=<token>
# RocketChat
ROCKET_CHAT_TOKEN=<token>
ROCKET_CHAT_USER_ID=<user-id>
NEXT_PUBLIC_IFRAME_PAROLE_URL=https://rocketchat.example.com/channel/general
# N8N
N8N_API_KEY=<api-key>
N8N_WEBHOOK_URL=https://brain.slm-lab.net/webhook/mission-created
N8N_ROLLBACK_WEBHOOK_URL=https://brain.slm-lab.net/webhook/mission-rollback
N8N_DELETE_WEBHOOK_URL=https://brain.slm-lab.net/webhook/mission-delete
NEXT_PUBLIC_API_URL=https://api.slm-lab.net/api
# Dolibarr
DOLIBARR_API_URL=https://dolibarr.example.com
DOLIBARR_API_KEY=<api-key>
# S3 / MinIO
S3_BUCKET=missions
MINIO_S3_UPLOAD_BUCKET_URL=https://dome-api.slm-lab.net
MINIO_AWS_REGION=us-east-1
MINIO_AWS_S3_UPLOAD_BUCKET_NAME=missions
MINIO_ACCESS_KEY=<access-key>
MINIO_SECRET_KEY=<secret-key>
# Iframes (selon vos besoins)
NEXT_PUBLIC_IFRAME_CARNET_URL=https://carnet.example.com
NEXT_PUBLIC_IFRAME_DRIVE_URL=https://drive.example.com
# ... (voir .env.example pour la liste complète)
2.3 Configurer le domaine personnalisé (optionnel)
- Dans Vercel Dashboard → Settings → Domains
- Ajoutez votre domaine
- Configurez les enregistrements DNS selon les instructions Vercel
Étape 3: Migrations Prisma en Production
3.1 Préparer les migrations
# Vérifier l'état des migrations
npx prisma migrate status
# Créer une nouvelle migration (si nécessaire)
npx prisma migrate dev --name nom_de_la_migration
3.2 Appliquer les migrations en production
Méthode 1: Via Vercel Build Hook (Recommandé)
Créez un script de migration dans package.json:
{
"scripts": {
"migrate:deploy": "prisma migrate deploy",
"postbuild": "npm run migrate:deploy"
}
}
Méthode 2: Manuellement avant chaque déploiement
# Depuis votre machine locale (avec tunnel SSH actif)
export DATABASE_URL="postgresql://user:password@localhost:5432/calendar_db"
npx prisma migrate deploy
Méthode 3: Via GitHub Actions (CI/CD)
Créez .github/workflows/migrate.yml:
name: Database Migrations
on:
push:
branches: [main]
jobs:
migrate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '22'
- run: npm ci
- run: npx prisma migrate deploy
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
Étape 4: Vérification et Tests
4.1 Vérifier la connexion à la base de données
# Tester la connexion PostgreSQL
psql $DATABASE_URL -c "SELECT version();"
# Vérifier les tables Prisma
npx prisma db pull
4.2 Vérifier les services externes
- Testez l'authentification Keycloak
- Vérifiez la connexion Redis (si utilisée)
- Testez les intégrations (Leantime, RocketChat, etc.)
4.3 Tests de bout en bout
- Accédez à votre application Vercel
- Testez la connexion
- Testez les fonctionnalités critiques:
- Création de compte
- Authentification
- Création de mission
- Upload de fichiers
- Notifications
Étape 5: Monitoring et Maintenance
5.1 Logs Vercel
- Consultez les logs dans Vercel Dashboard → Deployments → [Déploiement] → Logs
- Configurez des alertes pour les erreurs
5.2 Monitoring PostgreSQL
# Vérifier l'état de PostgreSQL
docker exec neah-postgres-prod pg_isready
# Vérifier l'utilisation des ressources
docker stats neah-postgres-prod
# Vérifier les connexions actives
docker exec neah-postgres-prod psql -U neah_prod_user -d calendar_db -c "SELECT count(*) FROM pg_stat_activity;"
5.3 Sauvegardes
Sauvegarde PostgreSQL:
# Sauvegarde complète
docker exec neah-postgres-prod pg_dump -U neah_prod_user calendar_db > backup_$(date +%Y%m%d).sql
# Sauvegarde avec compression
docker exec neah-postgres-prod pg_dump -U neah_prod_user calendar_db | gzip > backup_$(date +%Y%m%d).sql.gz
Restauration:
# Restaurer depuis une sauvegarde
cat backup_20240112.sql | docker exec -i neah-postgres-prod psql -U neah_prod_user calendar_db
Procédures de Rollback
Rollback Vercel
- Dans Vercel Dashboard → Deployments
- Trouvez le déploiement précédent
- Cliquez sur "..." → "Promote to Production"
Rollback de migration Prisma
# Lister les migrations
npx prisma migrate status
# Rollback manuel (si nécessaire)
# ATTENTION: Testez d'abord en staging !
psql $DATABASE_URL -f prisma/migrations/[migration_to_rollback]/migration.sql
Dépannage
Problème: Connexion PostgreSQL échoue depuis Vercel
- Vérifiez que le tunnel SSH est actif (si utilisé)
- Vérifiez les credentials dans Vercel
- Vérifiez les règles de firewall
- Testez la connexion depuis votre machine locale
Problème: Migrations échouent
- Vérifiez que
DATABASE_URLest correcte - Vérifiez les permissions de l'utilisateur PostgreSQL
- Consultez les logs:
npx prisma migrate deploy --verbose
Problème: Erreurs NextAuth
- Vérifiez que
NEXTAUTH_URLcorrespond à votre domaine Vercel - Vérifiez que
NEXTAUTH_SECRETest défini - Vérifiez la configuration Keycloak