Ce guide vous accompagne étape par étape pour déployer votre application NestJS avec une base de données PostgreSQL sur AWS Lightsail, avec un sous-domaine personnalisé géré par Cloudflare.
🎯 Objectif Final
- API NestJS accessible via
https://api.votredomaine.com
- Base de données PostgreSQL containerisée
- SSL géré par Cloudflare
- Documentation Swagger accessible
📋 Prérequis
- Un serveur AWS Lightsail (Ubuntu)
- Un domaine configuré avec Cloudflare
- Votre projet NestJS sur GitLab
- Accès SSH à votre serveur
1. 📁 Préparation du Projet
Structure des fichiers nécessaires
Votre projet doit contenir ces fichiers à la racine :
votre-projet/
├── src/ # Code NestJS
├── package.json
├── Dockerfile # Configuration Docker
├── docker-compose.yml # Orchestration des services
├── .env.production # Variables d'environnement production
├── .dockerignore
└── .gitignore
Fichier Dockerfile
FROM node:20
WORKDIR /app
# Copier package.json et package-lock.json
COPY package*.json ./
# Installer toutes les dépendances
RUN npm ci
# Copier le code source
COPY . .
# Build de l'application
RUN npm run build
# Supprimer les dev dependencies
RUN npm prune --production
# Exposer le port
EXPOSE 3000
# Commande de démarrage
CMD ["npm", "run", "start:prod"]
Fichier docker-compose.yml
version: '3.8'
services:
postgres:
image: postgres:15
container_name: postgres_db
restart: always
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app_network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME} -d ${DB_NAME}"]
interval: 10s
timeout: 5s
retries: 5
nestjs_app:
build: .
container_name: nestjs_container
restart: always
environment:
NODE_ENV: ${NODE_ENV}
DB_HOST: postgres
DB_PORT: ${DB_PORT}
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
DB_NAME: ${DB_NAME}
PORT: ${PORT}
JWT_SECRET: ${JWT_SECRET}
SWAGGER_PASSWORD: ${SWAGGER_PASSWORD}
# Ajoutez toutes vos autres variables d'environnement ici
ports:
- "127.0.0.1:3000:3000"
depends_on:
postgres:
condition: service_healthy
networks:
- app_network
volumes:
postgres_data:
networks:
app_network:
driver: bridge
Configuration NestJS (app.module.ts
)
Assurez-vous que votre module principal utilise les bonnes variables d'environnement :
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useFactory: (configService: ConfigService) => ({
type: 'postgres',
host: configService.get('DB_HOST', 'localhost'),
port: configService.get('DB_PORT', 5432),
username: configService.get('DB_USERNAME', 'postgres'),
password: configService.get('DB_PASSWORD', ''),
database: configService.get('DB_NAME', 'dabaseName'),
entities: [__dirname + '/**/*.entity{.ts,.js}'],
autoLoadEntities: true,
synchronize: configService.get('NODE_ENV') !== 'production',
}),
inject: [ConfigService],
}),
2. 🔧 Configuration du Serveur Lightsail
Connexion et mise à jour
# Se connecter au serveur
ssh -i votre-cle.pem ubuntu@votre-ip-lightsail
# Mettre à jour le système
sudo apt update && sudo apt upgrade -y
Installation de Docker
# Installer Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Ajouter votre utilisateur au groupe docker
sudo usermod -aG docker $USER
# Installer Docker Compose
sudo apt install docker-compose -y
# Installer Git
sudo apt install git -y
# Redémarrer la session
exit
# Reconnectez-vous
3. 📦 Déploiement de l'Application
Cloner le projet
# Cloner depuis GitLab
git clone https://gitlab.com/votre-username/votre-repo.git
cd votre-repo
Configuration de l'environnement
# Créer le fichier .env pour la production
cp .env.production .env
# Ou créer manuellement
nano .env
Exemple de fichier .env
:
# Database Configuration
DB_HOST=postgres
DB_PORT=5432
DB_USERNAME=dabaseName
DB_PASSWORD=VotreMotDePasseSecure2024!
DB_NAME=spidcash
# Application Configuration
PORT=3000
NODE_ENV=production
# JWT Secret
JWT_SECRET=votre_jwt_secret_super_long_et_secure_pour_production_123456789
# Swagger Configuration
SWAGGER_PASSWORD=admin_prod_secure
# Vos autres variables d'environnement...
Construire et démarrer les services
# Construire et démarrer
docker-compose up -d --build
# Vérifier que tout fonctionne
docker-compose ps
docker-compose logs -f
Vérification de l'API
# Tester l'API
curl http://localhost:3000
# Vérifier Swagger
curl http://localhost:3000/docs
4. 🌐 Configuration du Sous-domaine
Configuration DNS dans Cloudflare
- Connectez-vous à votre dashboard Cloudflare
- Allez dans DNS → Records
- Cliquez sur Add record
- Configurez :
-
Type :
A
-
Name :
api
-
IPv4 address :
VOTRE_IP_LIGHTSAIL
- Proxy status : 🟠 Proxied
- TTL : Auto
-
Type :
Installation et configuration de Nginx
# Installer Nginx
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
Configuration du reverse proxy
# Créer la configuration
sudo nano /etc/nginx/sites-available/api.votredomaine.com
Contenu du fichier :
server {
listen 80;
server_name api.votredomaine.com;
location / {
proxy_pass http://127.0.0.1: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;
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
}
location /docs {
proxy_pass http://127.0.0.1:3000/docs;
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;
}
}
Activer la configuration
# Créer le lien symbolique
sudo ln -s /etc/nginx/sites-available/api.votredomaine.com /etc/nginx/sites-enabled/
# Tester la configuration
sudo nginx -t
# Recharger Nginx
sudo systemctl reload nginx
Configuration du pare-feu
# Autoriser HTTP et HTTPS
sudo ufw allow 'Nginx Full'
# Vérifier les règles
sudo ufw status
5. 🔒 Configuration SSL avec Cloudflare
Dans le dashboard Cloudflare
- SSL/TLS → Overview → Mode : Flexible
- SSL/TLS → Edge Certificates → Always Use HTTPS : ON
- Vérifiez que votre enregistrement DNS est en mode Proxied (🟠)
Test final
# Tester HTTP
curl http://api.votredomaine.com
# Tester HTTPS
curl https://api.votredomaine.com
# Tester Swagger
curl https://api.votredomaine.com/docs
6. 🚀 Script de Déploiement Automatique
Créez un script pour faciliter les mises à jour futures :
# Créer le script
nano deploy.sh
Contenu :
#!/bin/bash
echo "🚀 Déploiement en cours..."
# Pull du code depuis GitLab
git pull origin main
# Copier le fichier d'environnement de production
cp .env.production .env
# Arrêter les services existants
docker-compose down
# Reconstruire et redémarrer
docker-compose up -d --build
echo "✅ Déploiement terminé!"
echo "🌐 API disponible sur : https://api.$(hostname -I | awk '{print $1}' | xargs dig +short -x | sed 's/\.$//').com"
# Rendre exécutable
chmod +x deploy.sh
7. 🔧 Commandes de Maintenance
Surveillance des logs
# Voir tous les logs
docker-compose logs -f
# Logs spécifiques
docker-compose logs -f nestjs_app
docker-compose logs -f postgres
Gestion des services
# Redémarrer un service
docker-compose restart nestjs_app
# Reconstruire après modification
docker-compose up -d --build
# Arrêter tous les services
docker-compose down
Sauvegarde de la base de données
# Créer une sauvegarde
docker exec postgres_db pg_dump -U votre_username votre_db_name > backup.sql
# Restaurer une sauvegarde
cat backup.sql | docker exec -i postgres_db psql -U votre_username -d votre_db_name
🎉 Résultat Final
Votre API NestJS est maintenant accessible via :
-
API :
https://api.votredomaine.com
-
Documentation :
https://api.votredomaine.com/docs
- SSL automatique via Cloudflare
- Base de données PostgreSQL containerisée et persistante
🛡️ Points de Sécurité Importants
- Changez tous les mots de passe par défaut
- Utilisez des JWT secrets longs et aléatoires
- Configurez le pare-feu correctement
- Ne commitez jamais les fichiers .env sur GitLab
- Surveillez régulièrement les logs
🔄 Déploiements Futurs
Pour les mises à jour :
- Pousser le code sur GitLab
- Sur le serveur :
./deploy.sh
- Vérifier que tout fonctionne
Votre infrastructure est maintenant prête pour la production ! 🚀
Top comments (0)