NeahStable/docs/DEPLOYMENT.md
2026-01-13 22:17:19 +01:00

9.8 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

  1. Connectez-vous à Vercel
  2. Importez votre repository GitHub/GitLab
  3. 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>
ROCKET_CHAT_CREATE_TOKEN_SECRET=<secret> # Required for RocketChat 8.0.2+ (must match CREATE_TOKENS_FOR_USERS_SECRET on RocketChat server)
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)

  1. Dans Vercel Dashboard → Settings → Domains
  2. Ajoutez votre domaine
  3. 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

  1. Accédez à votre application Vercel
  2. Testez la connexion
  3. 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

  1. Dans Vercel Dashboard → Deployments
  2. Trouvez le déploiement précédent
  3. 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_URL est 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_URL correspond à votre domaine Vercel
  • Vérifiez que NEXTAUTH_SECRET est défini
  • Vérifiez la configuration Keycloak

Ressources