🎉 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¶
📦 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
.envmode0600(propriétaire uniquement) - ✅ Utilisateur système
probatiosans 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¶
📚 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¶
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
apicréé - 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 :
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 SMTPhost: 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¶
Voir DEPLOYMENT_STATUS.md pour tous les détails.
Version : 1.0.0 Date : 2025-11-12 Auteur : Claude Code