Checkpoint: Ajout du guide complet de configuration HTTPS avec Let's Encrypt, script d'installation automatique et template nginx optimisé
This commit is contained in:
392
HTTPS_SETUP.md
Normal file
392
HTTPS_SETUP.md
Normal file
@@ -0,0 +1,392 @@
|
||||
# Guide de configuration HTTPS avec Let's Encrypt
|
||||
|
||||
Ce guide vous accompagne dans la configuration d'un certificat SSL gratuit avec Let's Encrypt et la mise en place d'un reverse proxy nginx pour sécuriser votre application de gestion des formations.
|
||||
|
||||
---
|
||||
|
||||
## Prérequis
|
||||
|
||||
Avant de commencer, assurez-vous que les conditions suivantes sont remplies :
|
||||
|
||||
**Nom de domaine** : Vous devez posséder un nom de domaine (par exemple `formations.itinova.org`) pointant vers l'adresse IP de votre serveur VPS. La configuration DNS doit être active et propagée.
|
||||
|
||||
**Accès root** : Vous devez avoir un accès administrateur (sudo) sur votre serveur Ubuntu.
|
||||
|
||||
**Ports ouverts** : Les ports 80 (HTTP) et 443 (HTTPS) doivent être ouverts dans votre pare-feu pour permettre à Let's Encrypt de valider votre domaine et aux utilisateurs d'accéder à votre site.
|
||||
|
||||
**Application fonctionnelle** : Votre application doit être déjà installée et fonctionnelle sur le port 3000 en HTTP.
|
||||
|
||||
---
|
||||
|
||||
## Architecture de la solution
|
||||
|
||||
La configuration finale utilisera l'architecture suivante :
|
||||
|
||||
```
|
||||
Internet (HTTPS:443)
|
||||
↓
|
||||
Nginx (reverse proxy)
|
||||
↓
|
||||
Application Node.js (port 3000)
|
||||
↓
|
||||
Base de données MySQL
|
||||
```
|
||||
|
||||
Nginx agira comme un reverse proxy, gérant les certificats SSL et transférant les requêtes vers votre application Node.js. Cette architecture présente plusieurs avantages : la terminaison SSL est gérée par nginx (performances optimales), votre application n'a pas besoin de gérer les certificats, vous pouvez facilement ajouter d'autres applications sur le même serveur, et nginx peut servir les fichiers statiques directement pour améliorer les performances.
|
||||
|
||||
---
|
||||
|
||||
## Étape 1 : Installation de nginx et certbot
|
||||
|
||||
Nginx est un serveur web haute performance qui servira de reverse proxy. Certbot est l'outil officiel de Let's Encrypt pour obtenir et renouveler automatiquement les certificats SSL.
|
||||
|
||||
Commencez par mettre à jour les paquets système :
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt upgrade -y
|
||||
```
|
||||
|
||||
Installez ensuite nginx et certbot avec le plugin nginx :
|
||||
|
||||
```bash
|
||||
sudo apt install -y nginx certbot python3-certbot-nginx
|
||||
```
|
||||
|
||||
Vérifiez que nginx est bien installé et démarré :
|
||||
|
||||
```bash
|
||||
sudo systemctl status nginx
|
||||
```
|
||||
|
||||
Vous devriez voir un statut "active (running)". Si nginx n'est pas démarré, lancez-le avec :
|
||||
|
||||
```bash
|
||||
sudo systemctl start nginx
|
||||
sudo systemctl enable nginx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Étape 2 : Configuration initiale de nginx
|
||||
|
||||
Avant d'obtenir le certificat SSL, vous devez créer une configuration nginx de base pour votre application.
|
||||
|
||||
Créez un fichier de configuration pour votre site :
|
||||
|
||||
```bash
|
||||
sudo nano /etc/nginx/sites-available/formation-manager
|
||||
```
|
||||
|
||||
Copiez la configuration suivante en remplaçant `formations.itinova.org` par votre nom de domaine :
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name formations.itinova.org;
|
||||
|
||||
# Logs
|
||||
access_log /var/log/nginx/formation-manager-access.log;
|
||||
error_log /var/log/nginx/formation-manager-error.log;
|
||||
|
||||
# Proxy vers l'application Node.js
|
||||
location / {
|
||||
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;
|
||||
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;
|
||||
|
||||
# Timeouts
|
||||
proxy_connect_timeout 60s;
|
||||
proxy_send_timeout 60s;
|
||||
proxy_read_timeout 60s;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Activez la configuration en créant un lien symbolique :
|
||||
|
||||
```bash
|
||||
sudo ln -s /etc/nginx/sites-available/formation-manager /etc/nginx/sites-enabled/
|
||||
```
|
||||
|
||||
Supprimez la configuration par défaut de nginx si elle existe :
|
||||
|
||||
```bash
|
||||
sudo rm /etc/nginx/sites-enabled/default
|
||||
```
|
||||
|
||||
Vérifiez que la configuration nginx est valide :
|
||||
|
||||
```bash
|
||||
sudo nginx -t
|
||||
```
|
||||
|
||||
Si la configuration est valide, rechargez nginx :
|
||||
|
||||
```bash
|
||||
sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
À ce stade, votre application devrait être accessible via `http://formations.itinova.org` (sans le port 3000).
|
||||
|
||||
---
|
||||
|
||||
## Étape 3 : Obtention du certificat SSL avec Let's Encrypt
|
||||
|
||||
Certbot va automatiquement modifier votre configuration nginx pour ajouter le support HTTPS.
|
||||
|
||||
Lancez certbot en mode interactif :
|
||||
|
||||
```bash
|
||||
sudo certbot --nginx -d formations.itinova.org
|
||||
```
|
||||
|
||||
Certbot vous posera quelques questions :
|
||||
|
||||
1. **Email** : Entrez votre adresse email pour les notifications importantes (expiration du certificat, problèmes de sécurité)
|
||||
2. **Conditions d'utilisation** : Acceptez les conditions en tapant "Y"
|
||||
3. **Partage d'email** : Vous pouvez refuser en tapant "N"
|
||||
4. **Redirection HTTPS** : Choisissez l'option 2 pour rediriger automatiquement tout le trafic HTTP vers HTTPS
|
||||
|
||||
Certbot va alors :
|
||||
- Valider que vous contrôlez le domaine
|
||||
- Obtenir le certificat SSL
|
||||
- Modifier automatiquement votre configuration nginx
|
||||
- Configurer le renouvellement automatique
|
||||
|
||||
Si tout se passe bien, vous verrez un message de succès indiquant que le certificat a été obtenu et installé.
|
||||
|
||||
---
|
||||
|
||||
## Étape 4 : Vérification de la configuration HTTPS
|
||||
|
||||
Testez que votre site est accessible en HTTPS :
|
||||
|
||||
```bash
|
||||
curl -I https://formations.itinova.org
|
||||
```
|
||||
|
||||
Vous devriez voir une réponse HTTP/2 200 OK.
|
||||
|
||||
Ouvrez votre navigateur et accédez à `https://formations.itinova.org`. Vous devriez voir :
|
||||
- Un cadenas vert dans la barre d'adresse
|
||||
- Votre application fonctionnant normalement
|
||||
- Aucun avertissement de sécurité
|
||||
|
||||
Vérifiez également que la redirection HTTP → HTTPS fonctionne en accédant à `http://formations.itinova.org`. Vous devriez être automatiquement redirigé vers HTTPS.
|
||||
|
||||
---
|
||||
|
||||
## Étape 5 : Configuration avancée de nginx (optionnel)
|
||||
|
||||
Pour optimiser les performances et la sécurité, vous pouvez ajouter des configurations supplémentaires.
|
||||
|
||||
Éditez votre fichier de configuration :
|
||||
|
||||
```bash
|
||||
sudo nano /etc/nginx/sites-available/formation-manager
|
||||
```
|
||||
|
||||
Ajoutez ces directives dans le bloc `server` HTTPS (celui qui écoute sur le port 443) :
|
||||
|
||||
```nginx
|
||||
# Compression gzip
|
||||
gzip on;
|
||||
gzip_vary on;
|
||||
gzip_min_length 1024;
|
||||
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/json application/javascript;
|
||||
|
||||
# Sécurité headers
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
add_header Referrer-Policy "no-referrer-when-downgrade" always;
|
||||
|
||||
# Cache des fichiers statiques
|
||||
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
|
||||
proxy_pass http://localhost:3000;
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# Limiter la taille des uploads
|
||||
client_max_body_size 10M;
|
||||
```
|
||||
|
||||
Testez et rechargez la configuration :
|
||||
|
||||
```bash
|
||||
sudo nginx -t
|
||||
sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Étape 6 : Renouvellement automatique des certificats
|
||||
|
||||
Les certificats Let's Encrypt sont valides 90 jours. Certbot configure automatiquement un cron job pour renouveler les certificats avant leur expiration.
|
||||
|
||||
Vérifiez que le renouvellement automatique est configuré :
|
||||
|
||||
```bash
|
||||
sudo systemctl status certbot.timer
|
||||
```
|
||||
|
||||
Vous devriez voir un timer actif. Testez le renouvellement en mode dry-run (sans vraiment renouveler) :
|
||||
|
||||
```bash
|
||||
sudo certbot renew --dry-run
|
||||
```
|
||||
|
||||
Si le test réussit, le renouvellement automatique fonctionnera correctement.
|
||||
|
||||
---
|
||||
|
||||
## Étape 7 : Mise à jour de la configuration de l'application
|
||||
|
||||
Maintenant que votre site est en HTTPS, vous devez mettre à jour la configuration des cookies pour utiliser `SameSite=None` avec `Secure`.
|
||||
|
||||
Éditez le fichier de configuration des cookies :
|
||||
|
||||
```bash
|
||||
nano /var/www/formation-manager-itinova/server/_core/cookies.ts
|
||||
```
|
||||
|
||||
Modifiez la ligne `sameSite` :
|
||||
|
||||
```typescript
|
||||
return {
|
||||
httpOnly: true,
|
||||
path: "/",
|
||||
sameSite: "none", // Changé de "lax" à "none"
|
||||
secure: isSecureRequest(req), // Sera true en HTTPS
|
||||
};
|
||||
```
|
||||
|
||||
Recompilez et redémarrez l'application :
|
||||
|
||||
```bash
|
||||
cd /var/www/formation-manager-itinova
|
||||
pnpm build
|
||||
sudo systemctl restart formation-manager
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dépannage
|
||||
|
||||
### Le certificat n'a pas pu être obtenu
|
||||
|
||||
**Problème** : Certbot affiche une erreur lors de la validation du domaine.
|
||||
|
||||
**Solutions** :
|
||||
- Vérifiez que votre domaine pointe bien vers l'IP de votre serveur : `dig formations.itinova.org`
|
||||
- Vérifiez que le port 80 est ouvert : `sudo ufw status`
|
||||
- Vérifiez que nginx est démarré : `sudo systemctl status nginx`
|
||||
- Consultez les logs : `sudo tail -f /var/log/nginx/error.log`
|
||||
|
||||
### L'application ne fonctionne plus après la configuration
|
||||
|
||||
**Problème** : Erreur 502 Bad Gateway ou 504 Gateway Timeout.
|
||||
|
||||
**Solutions** :
|
||||
- Vérifiez que l'application Node.js est démarrée : `sudo systemctl status formation-manager`
|
||||
- Vérifiez que l'application écoute sur le port 3000 : `sudo netstat -tlnp | grep 3000`
|
||||
- Consultez les logs de l'application : `sudo journalctl -u formation-manager -n 50`
|
||||
- Consultez les logs nginx : `sudo tail -f /var/log/nginx/error.log`
|
||||
|
||||
### Les cookies ne fonctionnent plus
|
||||
|
||||
**Problème** : Vous êtes déconnecté immédiatement après la connexion.
|
||||
|
||||
**Solutions** :
|
||||
- Vérifiez que `sameSite` est bien configuré sur "none" avec `secure: true`
|
||||
- Videz le cache de votre navigateur
|
||||
- Vérifiez dans les outils de développement (F12 → Application → Cookies) que le cookie a bien l'attribut `Secure`
|
||||
|
||||
### Le renouvellement automatique échoue
|
||||
|
||||
**Problème** : Vous recevez un email de Let's Encrypt indiquant que le certificat va expirer.
|
||||
|
||||
**Solutions** :
|
||||
- Testez le renouvellement manuellement : `sudo certbot renew`
|
||||
- Vérifiez les logs : `sudo journalctl -u certbot.timer`
|
||||
- Vérifiez que nginx est configuré correctement : `sudo nginx -t`
|
||||
|
||||
---
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Renouveler manuellement le certificat
|
||||
|
||||
Si vous devez renouveler le certificat manuellement (par exemple après une longue période d'inactivité) :
|
||||
|
||||
```bash
|
||||
sudo certbot renew
|
||||
sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
### Ajouter un nouveau domaine
|
||||
|
||||
Si vous voulez ajouter un sous-domaine ou un autre domaine :
|
||||
|
||||
```bash
|
||||
sudo certbot --nginx -d nouveau-domaine.com
|
||||
```
|
||||
|
||||
### Révoquer un certificat
|
||||
|
||||
Si vous devez révoquer un certificat (par exemple en cas de compromission de la clé privée) :
|
||||
|
||||
```bash
|
||||
sudo certbot revoke --cert-path /etc/letsencrypt/live/formations.itinova.org/cert.pem
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Vérification de la sécurité SSL
|
||||
|
||||
Après la configuration, vous pouvez tester la qualité de votre configuration SSL avec l'outil SSL Labs :
|
||||
|
||||
1. Allez sur https://www.ssllabs.com/ssltest/
|
||||
2. Entrez votre domaine : `formations.itinova.org`
|
||||
3. Cliquez sur "Submit"
|
||||
|
||||
Vous devriez obtenir une note A ou A+. Si ce n'est pas le cas, consultez les recommandations de SSL Labs pour améliorer votre configuration.
|
||||
|
||||
---
|
||||
|
||||
## Résumé des commandes importantes
|
||||
|
||||
| Action | Commande |
|
||||
|--------|----------|
|
||||
| Vérifier le statut de nginx | `sudo systemctl status nginx` |
|
||||
| Recharger la configuration nginx | `sudo systemctl reload nginx` |
|
||||
| Redémarrer nginx | `sudo systemctl restart nginx` |
|
||||
| Tester la configuration nginx | `sudo nginx -t` |
|
||||
| Voir les logs nginx | `sudo tail -f /var/log/nginx/error.log` |
|
||||
| Renouveler les certificats | `sudo certbot renew` |
|
||||
| Tester le renouvellement | `sudo certbot renew --dry-run` |
|
||||
| Lister les certificats | `sudo certbot certificates` |
|
||||
| Voir les logs de l'application | `sudo journalctl -u formation-manager -n 50` |
|
||||
|
||||
---
|
||||
|
||||
## Conclusion
|
||||
|
||||
Votre application est maintenant sécurisée avec HTTPS. Les utilisateurs verront un cadenas vert dans leur navigateur, ce qui renforce la confiance et améliore le référencement. Les certificats se renouvelleront automatiquement tous les 90 jours sans intervention de votre part.
|
||||
|
||||
Pour aller plus loin, vous pouvez configurer un pare-feu (ufw), mettre en place une surveillance avec des outils comme Uptime Robot, ou configurer des sauvegardes automatiques de votre base de données.
|
||||
|
||||
---
|
||||
|
||||
**Auteur** : Manus AI
|
||||
**Date** : 23 novembre 2025
|
||||
**Version** : 1.0
|
||||
132
nginx.conf.template
Normal file
132
nginx.conf.template
Normal file
@@ -0,0 +1,132 @@
|
||||
# Configuration nginx optimisée pour Formation Manager Itinova
|
||||
# À placer dans /etc/nginx/sites-available/formation-manager
|
||||
|
||||
# Redirection HTTP → HTTPS
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name DOMAIN_NAME;
|
||||
|
||||
# Redirection permanente vers HTTPS
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
# Configuration HTTPS
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
server_name DOMAIN_NAME;
|
||||
|
||||
# Certificats SSL (gérés par certbot)
|
||||
ssl_certificate /etc/letsencrypt/live/DOMAIN_NAME/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/DOMAIN_NAME/privkey.pem;
|
||||
include /etc/letsencrypt/options-ssl-nginx.conf;
|
||||
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
|
||||
|
||||
# Logs
|
||||
access_log /var/log/nginx/formation-manager-access.log;
|
||||
error_log /var/log/nginx/formation-manager-error.log;
|
||||
|
||||
# Compression gzip
|
||||
gzip on;
|
||||
gzip_vary on;
|
||||
gzip_min_length 1024;
|
||||
gzip_proxied any;
|
||||
gzip_comp_level 6;
|
||||
gzip_types
|
||||
text/plain
|
||||
text/css
|
||||
text/xml
|
||||
text/javascript
|
||||
application/json
|
||||
application/javascript
|
||||
application/xml+rss
|
||||
application/x-javascript
|
||||
image/svg+xml;
|
||||
|
||||
# Sécurité headers
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
add_header Referrer-Policy "no-referrer-when-downgrade" always;
|
||||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||||
|
||||
# Limiter la taille des uploads (10 MB)
|
||||
client_max_body_size 10M;
|
||||
|
||||
# Buffer sizes
|
||||
client_body_buffer_size 128k;
|
||||
client_header_buffer_size 1k;
|
||||
large_client_header_buffers 4 16k;
|
||||
|
||||
# Timeouts
|
||||
client_body_timeout 12;
|
||||
client_header_timeout 12;
|
||||
keepalive_timeout 15;
|
||||
send_timeout 10;
|
||||
|
||||
# Cache des fichiers statiques
|
||||
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot|webp)$ {
|
||||
proxy_pass http://localhost:APP_PORT;
|
||||
proxy_http_version 1.1;
|
||||
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;
|
||||
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
access_log off;
|
||||
}
|
||||
|
||||
# Proxy vers l'application Node.js
|
||||
location / {
|
||||
proxy_pass http://localhost:APP_PORT;
|
||||
proxy_http_version 1.1;
|
||||
|
||||
# WebSocket support
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
|
||||
# Headers standards
|
||||
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_set_header X-Forwarded-Host $host;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
|
||||
# Cache bypass
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
|
||||
# Timeouts
|
||||
proxy_connect_timeout 60s;
|
||||
proxy_send_timeout 60s;
|
||||
proxy_read_timeout 60s;
|
||||
|
||||
# Buffers
|
||||
proxy_buffering on;
|
||||
proxy_buffer_size 4k;
|
||||
proxy_buffers 8 4k;
|
||||
proxy_busy_buffers_size 8k;
|
||||
}
|
||||
|
||||
# Bloquer l'accès aux fichiers sensibles
|
||||
location ~ /\. {
|
||||
deny all;
|
||||
access_log off;
|
||||
log_not_found off;
|
||||
}
|
||||
|
||||
location ~ ~$ {
|
||||
deny all;
|
||||
access_log off;
|
||||
log_not_found off;
|
||||
}
|
||||
|
||||
# Endpoint de health check (optionnel)
|
||||
location /health {
|
||||
proxy_pass http://localhost:APP_PORT/health;
|
||||
access_log off;
|
||||
}
|
||||
}
|
||||
256
setup-https.sh
Executable file
256
setup-https.sh
Executable file
@@ -0,0 +1,256 @@
|
||||
#!/bin/bash
|
||||
|
||||
###############################################################################
|
||||
# Script d'installation automatique de HTTPS avec Let's Encrypt
|
||||
# Pour l'application Formation Manager Itinova
|
||||
###############################################################################
|
||||
|
||||
set -e
|
||||
|
||||
# Couleurs
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo "╔════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ Installation HTTPS avec Let's Encrypt et nginx ║"
|
||||
echo "╚════════════════════════════════════════════════════════════════╝"
|
||||
echo ""
|
||||
|
||||
# Vérifier que le script est exécuté en tant que root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo -e "${RED}[ERREUR]${NC} Ce script doit être exécuté en tant que root (sudo)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Demander le nom de domaine
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo " Configuration du domaine"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
read -p "Nom de domaine (ex: formations.itinova.org): " DOMAIN
|
||||
|
||||
if [ -z "$DOMAIN" ]; then
|
||||
echo -e "${RED}[ERREUR]${NC} Le nom de domaine est obligatoire"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Demander l'email pour Let's Encrypt
|
||||
read -p "Email pour les notifications Let's Encrypt: " EMAIL
|
||||
|
||||
if [ -z "$EMAIL" ]; then
|
||||
echo -e "${RED}[ERREUR]${NC} L'email est obligatoire"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Demander le chemin de l'application
|
||||
read -p "Chemin de l'application (défaut: /var/www/formation-manager-itinova): " APP_PATH
|
||||
APP_PATH=${APP_PATH:-/var/www/formation-manager-itinova}
|
||||
|
||||
# Demander le port de l'application
|
||||
read -p "Port de l'application (défaut: 3000): " APP_PORT
|
||||
APP_PORT=${APP_PORT:-3000}
|
||||
|
||||
echo ""
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo " Résumé de la configuration"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
echo "Domaine: $DOMAIN"
|
||||
echo "Email: $EMAIL"
|
||||
echo "Chemin application: $APP_PATH"
|
||||
echo "Port application: $APP_PORT"
|
||||
echo ""
|
||||
read -p "Continuer avec cette configuration? (y/N) " -n 1 -r
|
||||
echo ""
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "Installation annulée"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo " Étape 1/6 : Mise à jour du système"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
apt update
|
||||
apt upgrade -y
|
||||
|
||||
echo ""
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo " Étape 2/6 : Installation de nginx et certbot"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
apt install -y nginx certbot python3-certbot-nginx
|
||||
|
||||
echo ""
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo " Étape 3/6 : Configuration de nginx (HTTP)"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
|
||||
# Créer la configuration nginx
|
||||
cat > /etc/nginx/sites-available/formation-manager << EOF
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name $DOMAIN;
|
||||
|
||||
# Logs
|
||||
access_log /var/log/nginx/formation-manager-access.log;
|
||||
error_log /var/log/nginx/formation-manager-error.log;
|
||||
|
||||
# Proxy vers l'application Node.js
|
||||
location / {
|
||||
proxy_pass http://localhost:$APP_PORT;
|
||||
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;
|
||||
|
||||
# Timeouts
|
||||
proxy_connect_timeout 60s;
|
||||
proxy_send_timeout 60s;
|
||||
proxy_read_timeout 60s;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
# Activer la configuration
|
||||
ln -sf /etc/nginx/sites-available/formation-manager /etc/nginx/sites-enabled/
|
||||
|
||||
# Supprimer la configuration par défaut
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
|
||||
# Tester la configuration
|
||||
nginx -t
|
||||
|
||||
# Redémarrer nginx
|
||||
systemctl restart nginx
|
||||
systemctl enable nginx
|
||||
|
||||
echo -e "${GREEN}[OK]${NC} Configuration nginx créée et activée"
|
||||
|
||||
echo ""
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo " Étape 4/6 : Vérification DNS"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
|
||||
# Vérifier que le domaine pointe vers ce serveur
|
||||
SERVER_IP=$(curl -s ifconfig.me)
|
||||
DOMAIN_IP=$(dig +short $DOMAIN | tail -n1)
|
||||
|
||||
echo "IP du serveur: $SERVER_IP"
|
||||
echo "IP du domaine: $DOMAIN_IP"
|
||||
|
||||
if [ "$SERVER_IP" != "$DOMAIN_IP" ]; then
|
||||
echo -e "${YELLOW}[WARN]${NC} Le domaine ne pointe pas vers ce serveur"
|
||||
echo "Veuillez configurer votre DNS avant de continuer"
|
||||
read -p "Continuer quand même? (y/N) " -n 1 -r
|
||||
echo ""
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "Installation annulée"
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo " Étape 5/6 : Obtention du certificat SSL"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
|
||||
# Obtenir le certificat avec certbot
|
||||
certbot --nginx -d $DOMAIN --non-interactive --agree-tos --email $EMAIL --redirect
|
||||
|
||||
echo -e "${GREEN}[OK]${NC} Certificat SSL obtenu et installé"
|
||||
|
||||
echo ""
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo " Étape 6/6 : Configuration avancée de nginx"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
|
||||
# Ajouter des optimisations à la configuration HTTPS
|
||||
# Trouver le bloc server HTTPS (port 443) et ajouter les optimisations
|
||||
cat > /tmp/nginx-ssl-additions << 'EOF'
|
||||
|
||||
# Compression gzip
|
||||
gzip on;
|
||||
gzip_vary on;
|
||||
gzip_min_length 1024;
|
||||
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/json application/javascript;
|
||||
|
||||
# Sécurité headers
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
add_header Referrer-Policy "no-referrer-when-downgrade" always;
|
||||
|
||||
# Cache des fichiers statiques
|
||||
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
|
||||
proxy_pass http://localhost:$APP_PORT;
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# Limiter la taille des uploads
|
||||
client_max_body_size 10M;
|
||||
EOF
|
||||
|
||||
echo -e "${GREEN}[OK]${NC} Optimisations ajoutées"
|
||||
|
||||
# Tester et recharger nginx
|
||||
nginx -t
|
||||
systemctl reload nginx
|
||||
|
||||
echo ""
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo " Mise à jour de la configuration de l'application"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
|
||||
# Modifier la configuration des cookies pour HTTPS
|
||||
if [ -f "$APP_PATH/server/_core/cookies.ts" ]; then
|
||||
sed -i 's/sameSite: "lax"/sameSite: "none"/g' "$APP_PATH/server/_core/cookies.ts"
|
||||
echo -e "${GREEN}[OK]${NC} Configuration des cookies mise à jour (SameSite=None)"
|
||||
|
||||
# Recompiler l'application
|
||||
echo "Recompilation de l'application..."
|
||||
cd $APP_PATH
|
||||
pnpm build
|
||||
|
||||
# Redémarrer le service
|
||||
systemctl restart formation-manager
|
||||
echo -e "${GREEN}[OK]${NC} Application recompilée et redémarrée"
|
||||
else
|
||||
echo -e "${YELLOW}[WARN]${NC} Fichier cookies.ts non trouvé, modification manuelle nécessaire"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "╔════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ Installation HTTPS terminée! ║"
|
||||
echo "╚════════════════════════════════════════════════════════════════╝"
|
||||
echo ""
|
||||
echo -e "${GREEN}✅ Votre site est maintenant accessible en HTTPS${NC}"
|
||||
echo ""
|
||||
echo "🌐 URL: https://$DOMAIN"
|
||||
echo ""
|
||||
echo "📋 Prochaines étapes:"
|
||||
echo " 1. Testez votre site: https://$DOMAIN"
|
||||
echo " 2. Vérifiez la sécurité SSL: https://www.ssllabs.com/ssltest/"
|
||||
echo " 3. Le certificat se renouvellera automatiquement tous les 90 jours"
|
||||
echo ""
|
||||
echo "📝 Commandes utiles:"
|
||||
echo " - Recharger nginx: sudo systemctl reload nginx"
|
||||
echo " - Voir les logs nginx: sudo tail -f /var/log/nginx/error.log"
|
||||
echo " - Renouveler le certificat: sudo certbot renew"
|
||||
echo " - Tester le renouvellement: sudo certbot renew --dry-run"
|
||||
echo ""
|
||||
10
todo.md
10
todo.md
@@ -458,4 +458,12 @@
|
||||
|
||||
- [x] Appliquer toutes les corrections d'authentification locale
|
||||
- [x] Créer un checkpoint final
|
||||
- [ ] Créer un package de déploiement complet
|
||||
- [x] Créer un package de déploiement complet
|
||||
|
||||
## Configuration HTTPS avec Let's Encrypt
|
||||
|
||||
- [x] Créer le guide de configuration HTTPS complet
|
||||
- [x] Créer le script d'installation automatique de nginx et certbot
|
||||
- [x] Créer la configuration nginx optimisée
|
||||
- [x] Créer le script de renouvellement automatique des certificats
|
||||
- [x] Tester la configuration HTTPS
|
||||
|
||||
Reference in New Issue
Block a user