DEV Community

Georges HELOUSSATO
Georges HELOUSSATO

Posted on

Guide Complet : Déployer une API NestJS avec PostgreSQL sur AWS Lightsail

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
Enter fullscreen mode Exit fullscreen mode

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"]
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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],
}),
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Configuration de l'environnement

# Créer le fichier .env pour la production
cp .env.production .env

# Ou créer manuellement
nano .env
Enter fullscreen mode Exit fullscreen mode

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...
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Vérification de l'API

# Tester l'API
curl http://localhost:3000

# Vérifier Swagger
curl http://localhost:3000/docs
Enter fullscreen mode Exit fullscreen mode

4. 🌐 Configuration du Sous-domaine

Configuration DNS dans Cloudflare

  1. Connectez-vous à votre dashboard Cloudflare
  2. Allez dans DNSRecords
  3. Cliquez sur Add record
  4. Configurez :
    • Type : A
    • Name : api
    • IPv4 address : VOTRE_IP_LIGHTSAIL
    • Proxy status : 🟠 Proxied
    • TTL : Auto

Installation et configuration de Nginx

# Installer Nginx
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
Enter fullscreen mode Exit fullscreen mode

Configuration du reverse proxy

# Créer la configuration
sudo nano /etc/nginx/sites-available/api.votredomaine.com
Enter fullscreen mode Exit fullscreen mode

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;
    }
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Configuration du pare-feu

# Autoriser HTTP et HTTPS
sudo ufw allow 'Nginx Full'

# Vérifier les règles
sudo ufw status
Enter fullscreen mode Exit fullscreen mode

5. 🔒 Configuration SSL avec Cloudflare

Dans le dashboard Cloudflare

  1. SSL/TLSOverview → Mode : Flexible
  2. SSL/TLSEdge CertificatesAlways Use HTTPS : ON
  3. 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
Enter fullscreen mode Exit fullscreen mode

6. 🚀 Script de Déploiement Automatique

Créez un script pour faciliter les mises à jour futures :

# Créer le script
nano deploy.sh
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode
# Rendre exécutable
chmod +x deploy.sh
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

🎉 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

  1. Changez tous les mots de passe par défaut
  2. Utilisez des JWT secrets longs et aléatoires
  3. Configurez le pare-feu correctement
  4. Ne commitez jamais les fichiers .env sur GitLab
  5. Surveillez régulièrement les logs

🔄 Déploiements Futurs

Pour les mises à jour :

  1. Pousser le code sur GitLab
  2. Sur le serveur : ./deploy.sh
  3. Vérifier que tout fonctionne

Votre infrastructure est maintenant prête pour la production ! 🚀

Top comments (0)