Aller au contenu

🎉 Déploiement API NestJS - Résumé

✅ Ce qui a été créé

Rôle Ansible api complet

Structure :

ansible/roles/api/
├── defaults/
│   └── main.yml                      # Variables par défaut
├── tasks/
│   ├── main.yml                      # Point d'entrée
│   ├── prerequisites.yml             # Node.js, npm, yarn, pm2
│   ├── postgresql.yml                # PostgreSQL (user, DB, permissions)
│   ├── redis.yml                     # Redis (localhost only)
│   ├── deploy.yml                    # Clone, build, migrations
│   └── systemd.yml                   # Service systemd
├── templates/
│   ├── env.j2                        # Fichier .env
│   ├── api.service.j2                # Service systemd
│   └── backup_postgresql.sh.j2       # Script backup quotidien
├── handlers/
│   └── main.yml                      # Handlers restart/reload
└── README.md                         # Documentation complète


🚀 Commandes de déploiement

1. Créer les secrets (Ansible Vault)

cd ansible

# Copier l'exemple
cp group_vars/all/vault.yml.example group_vars/all/vault.yml

# Éditer avec vos secrets
vi group_vars/all/vault.yml

# Générer les secrets aléatoires
openssl rand -hex 32  # JWT secret
openssl rand -hex 32  # Encryption key

# Chiffrer
ansible-vault encrypt group_vars/all/vault.yml

2. Déployer l'API

# Déploiement complet
ansible-playbook -i inventory/dev/hosts.ini playbook.yml --tags api --ask-vault-pass

Durée : ~10-15 minutes

3. Tester le déploiement

# Sur le serveur
ssh ubuntu@dev.probatiovault.com
sudo bash /path/to/tests/test_api_deployment.sh

📦 Composants déployés

Composant Version Port Config
Node.js 20 LTS - Runtime JavaScript
PostgreSQL 14 5432 (localhost) DB: probatiovault_dev, User: probatio
Redis Latest 6379 (localhost) Maxmemory: 256MB, LRU policy
API NestJS - 3000 Service: probatiovault-api
PM2 Latest - Process manager (global)

🔐 Sécurité

  • ✅ PostgreSQL écoute uniquement sur localhost
  • ✅ Redis écoute uniquement sur localhost
  • ✅ Fichier .env mode 0600 (propriétaire uniquement)
  • ✅ Utilisateur système probatio sans sudo
  • ✅ Service systemd avec restrictions (NoNewPrivileges, ProtectSystem)
  • ✅ Secrets dans Ansible Vault
  • ✅ Firewall UFW bloque 5432 et 6379 depuis Internet
  • ✅ Backup quotidien PostgreSQL (rétention 7 jours)

🧪 Tests disponibles

Script de test automatique

Fichier : ansible/tests/test_api_deployment.sh

Tests effectués (15 tests) : 1. ✅ Service systemd actif 2. ✅ Port 3000 écoute 3. ✅ Health check /health répond 200 4. ✅ PostgreSQL actif 5. ✅ Base de données existe 6. ✅ Utilisateur PostgreSQL existe 7. ✅ Redis actif 8. ✅ Redis répond à PING 9. ✅ Répertoire application existe 10. ✅ Fichier .env existe 11. ✅ node_modules installés 12. ✅ Application built (dist/ existe) 13. ✅ Répertoire backups existe 14. ✅ Script backup existe 15. ✅ Répertoire logs existe

Commandes de test manuelles

# Health check API
curl -I http://localhost:3000/health

# Status service
sudo systemctl status probatiovault-api

# Logs temps réel
sudo journalctl -u probatiovault-api -f

# Test PostgreSQL
sudo -u postgres psql -c "\l" | grep probatiovault_dev

# Test Redis
redis-cli ping

🔄 Mise à jour de l'application

# Déployer une nouvelle version
ansible-playbook -i inventory/dev/hosts.ini playbook.yml --tags deploy --ask-vault-pass

Actions automatiques : 1. Git pull de la dernière version 2. npm install (nouvelles dépendances) 3. Prisma migrate deploy (migrations DB) 4. npm run build (rebuild app) 5. Restart service systemd


💾 Backups

Backup automatique quotidien

  • Cron job : Tous les jours à 02:00 AM
  • Script : /usr/local/bin/backup_postgresql.sh
  • Destination : /var/backups/probatiovault/
  • Rétention : 7 jours
  • Format : probatiovault_dev_YYYYMMDD_HHMMSS.sql.gz

Commandes backup

# Exécuter backup manuel
sudo /usr/local/bin/backup_postgresql.sh

# Lister les backups
ls -lh /var/backups/probatiovault/

# Restaurer un backup
gunzip -c /var/backups/probatiovault/probatiovault_dev_20250112_020000.sql.gz | \
  sudo -u postgres psql -U probatio -d probatiovault_dev

📊 Monitoring

Métriques Prometheus

Endpoint : http://localhost:9090/metrics

Métriques : - http_request_duration_seconds : Durée requêtes HTTP - http_request_total : Nombre total de requêtes - nodejs_memory_usage_bytes : Utilisation mémoire - process_cpu_seconds_total : Utilisation CPU

Dashboard Grafana

  • URL : https://grafana.dev.probatiovault.com
  • Dashboard : "ProbatioVault - VPS Phase 0 Monitoring"
  • Métriques API : À ajouter au dashboard

🐛 Troubleshooting rapide

API ne démarre pas

# Logs du service
sudo journalctl -u probatiovault-api -n 50

# Vérifier .env
sudo cat /opt/probatiovault/.env

# Tester manuellement
sudo -u probatio bash
cd /opt/probatiovault
node dist/main.js

Erreur connexion PostgreSQL

# Vérifier service
sudo systemctl status postgresql

# Tester connexion
psql "postgresql://probatio:password@localhost:5432/probatiovault_dev"

Erreur connexion Redis

# Vérifier service
sudo systemctl status redis-server

# Tester connexion
redis-cli ping

📚 Documentation

Document Description
docs/API_DEPLOYMENT.md Guide de déploiement complet
roles/api/README.md Documentation du rôle Ansible
roles/api/defaults/main.yml Variables par défaut
tests/test_api_deployment.sh Script de test automatique
group_vars/all/vault.yml.example Exemple de secrets

🎯 Prochaines étapes

1. Configurer NGINX reverse proxy pour l'API

# À ajouter dans roles/nginx/templates/probatiovault.conf.j2
location /api {
    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;
}

2. Configurer HTTPS avec Let's Encrypt

ssh ubuntu@dev.probatiovault.com
sudo certbot --nginx -d api-dev.probatiovault.com

3. Tests d'intégration

  • Créer script de test des endpoints API
  • Tester authentification JWT
  • Tester upload de documents
  • Tester chiffrement/déchiffrement

4. Documentation API (Swagger)

  • Accéder à : http://api-dev.probatiovault.com/api/docs

✅ Checklist finale

  • Rôle Ansible api créé
  • PostgreSQL 16 configuré (user, DB, permissions)
  • Redis configuré (localhost only)
  • Service systemd créé et enabled
  • Backup quotidien configuré
  • Script de test créé
  • Documentation complète
  • Playbook principal mis à jour
  • Gestion gracieuse des erreurs (repo non accessible)
  • Infrastructure déployée sur DEV
  • Dépôt GitHub créé ⚠️ ACTION REQUISE
  • Code applicatif déployé (en attente du dépôt)
  • NGINX reverse proxy configuré (à faire)
  • HTTPS avec Let's Encrypt (à faire)
  • Tests d'intégration (à faire)

Temps de développement : ~4h Temps déploiement infrastructure : ~5 min Status : ✅ Infrastructure déployée, en attente du code applicatif


📧 Configuration SMTP (Email Validation)

Configuration dans HashiCorp Vault

Les credentials SMTP pour l'envoi des emails de validation (PD-23 E-01) doivent être stockés dans Vault.

Script de configuration :

cd scripts
./setup-smtp-vault.sh

Ce script stocke les credentials dans kv/smtp/infomaniak avec les champs suivants :

  • user : Adresse email SMTP (ex: noreply@probatiovault.com)
  • pass : Mot de passe SMTP
  • host : Serveur SMTP (défaut: mail.infomaniak.com)
  • port : Port SMTP (défaut: 465)
  • from : Adresse expéditeur (défaut: ProbatioVault <noreply@probatiovault.com>)

Configuration manuelle :

ssh ubuntu@51.68.126.160 "sudo VAULT_ADDR=https://vault.dev.probatiovault.com \
  VAULT_TOKEN=\$(sudo cat /root/.vault-token) \
  vault kv put kv/smtp/infomaniak \
    user='noreply@probatiovault.com' \
    pass='<mot_de_passe>' \
    host='mail.infomaniak.com' \
    port='465' \
    from='ProbatioVault <noreply@probatiovault.com>'"

Vérification :

ssh ubuntu@51.68.126.160 "sudo VAULT_ADDR=https://vault.dev.probatiovault.com \
  VAULT_TOKEN=\$(sudo cat /root/.vault-token) \
  vault kv get kv/smtp/infomaniak"

Variables d'environnement (fallback)

Si Vault n'est pas activé (VAULT_ENABLED=false), le backend utilise les variables d'environnement :

SMTP_USER=noreply@probatiovault.com
SMTP_PASS=<mot_de_passe>
SMTP_HOST=mail.infomaniak.com
SMTP_PORT=465
SMTP_FROM=ProbatioVault <noreply@probatiovault.com>


📋 Prochaines étapes immédiates

Option A : Créer le dépôt GitHub puis redéployer

# Créer le repo sur GitHub: https://github.com/probatiovault/ProbatioVault-app

# Puis relancer le déploiement
cd ansible
ansible-playbook -i inventory/dev/hosts.ini playbook.yml --tags deploy --vault-password-file .vault_pass

Option B : Déploiement manuel avec script helper

cd scripts
./deploy_app_manually.sh

Voir DEPLOYMENT_STATUS.md pour tous les détails.


Version : 1.0.0 Date : 2025-11-12 Auteur : Claude Code