From 0208f2b41dd5798497936b6ff93de9b9904a5a77 Mon Sep 17 00:00:00 2001 From: Thomas <28439359+thoda-dev@users.noreply.github.com> Date: Fri, 21 Aug 2026 16:53:48 +0200 Subject: [PATCH] Update set_new_nginx_docker_app.sh --- set_new_nginx_docker_app.sh | 222 +++++++++++++++++++++++------------- 1 file changed, 145 insertions(+), 77 deletions(-) mode change 100644 => 100755 set_new_nginx_docker_app.sh diff --git a/set_new_nginx_docker_app.sh b/set_new_nginx_docker_app.sh old mode 100644 new mode 100755 index 8770597..752d848 --- a/set_new_nginx_docker_app.sh +++ b/set_new_nginx_docker_app.sh @@ -1,35 +1,59 @@ #!/bin/bash # ------------------------------ -# Script réutilisable Node.js LTS + pnpm + Nginx + Certbot Cloudflare +# Script réutilisable Docker + Nginx + Certbot Cloudflare # Arguments : # $1 = Domaine (ex: exemple.com) -# $2 = Port Node.js (ex: 3000) +# $2 = Port de l'app principale (ex: 3000) # $3 = Email pour SSL (ex: email@example.com) +# $4+ = (optionnel) sous-domaines supplémentaires, au format sous-domaine:port +# +# Exemples : +# set_new_nginx_docker_app.sh exemple.com 3000 moi@exemple.com +# set_new_nginx_docker_app.sh exemple.com 3000 moi@exemple.com docs:3001 api:3002 +# +# Variables d'environnement : +# MAX_BODY_SIZE taille max du corps des requêtes (défaut: 10m) # ------------------------------ -if [ "$#" -ne 3 ]; then - echo "Usage: $0 " +# Un provisionnement qui continue après une erreur laisse un serveur à moitié configuré, +# plus difficile à diagnostiquer qu'un arrêt net. +set -euo pipefail + +if [ "$#" -lt 3 ]; then + echo "Usage: $0 [sous-domaine:port ...]" exit 1 fi DOMAIN="$1" APP_PORT="$2" EMAIL="$3" +shift 3 +EXTRA_APPS=("$@") +MAX_BODY_SIZE="${MAX_BODY_SIZE:-10m}" CLOUDFLARE_CREDENTIALS="$HOME/.secrets/certbot/cloudflare.ini" echo "⚙️ Configuration pour :" echo "Domaine: $DOMAIN" -echo "Port Node.js: $APP_PORT" +echo "Port principal: $APP_PORT" echo "Email SSL: $EMAIL" +if [ ${#EXTRA_APPS[@]} -gt 0 ]; then + echo "Sous-domaines: ${EXTRA_APPS[*]+"${EXTRA_APPS[*]}"}" +fi + +if [ ! -f "$CLOUDFLARE_CREDENTIALS" ]; then + echo "❌ Identifiants Cloudflare absents : $CLOUDFLARE_CREDENTIALS" + echo " Crée le fichier avec dns_cloudflare_api_token = , puis chmod 600." + exit 1 +fi # ------------------------------ # Fonction pour installer un paquet si absent # ------------------------------ install_if_missing() { - if ! command -v $1 &> /dev/null; then + if ! command -v "$1" &> /dev/null; then echo "Installation de $1..." - sudo apt install -y $2 + sudo apt install -y "$2" else echo "$1 déjà installé, skipping..." fi @@ -40,117 +64,161 @@ install_if_missing() { # ------------------------------ sudo apt update && sudo apt upgrade -y -# Installer dépendances de base install_if_missing curl curl install_if_missing git git -install_if_missing build-essential build-essential -install_if_missing software-properties-common software-properties-common -# Installer Node.js LTS si absent -if ! command -v node &> /dev/null; then - curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - - sudo apt install -y nodejs +# ------------------------------ +# Docker +# ------------------------------ +# Le script officiel plutôt que docker.io d'apt : celui-ci installe une version souvent ancienne et +# le paquet docker-compose d'Ubuntu est la v1 Python, abandonnée, incapable de lire un fichier +# compose moderne. get.docker.com pose docker-ce et le plugin compose v2 ensemble. +if ! command -v docker &> /dev/null; then + echo "Installation de Docker..." + curl -fsSL https://get.docker.com | sudo sh + # Sans ça, docker n'est utilisable qu'en sudo. Prend effet à la prochaine session. + sudo usermod -aG docker "$USER" + echo "ℹ️ $USER ajouté au groupe docker — reconnecte-toi pour que ça prenne effet." else - echo "Node.js déjà installé, skipping..." + echo "Docker déjà installé, skipping..." fi -# Installer pnpm si absent -if ! command -v pnpm &> /dev/null; then - sudo npm install -g pnpm -else - echo "pnpm déjà installé, skipping..." +if ! docker compose version &> /dev/null; then + echo "Installation du plugin compose v2..." + sudo apt install -y docker-compose-plugin fi -# Installer docker et docker-compose si absent -install_if_missing docker docker.io -install_if_missing docker-compose docker-compose - -# Installer Nginx si absent +# ------------------------------ +# Nginx +# ------------------------------ install_if_missing nginx nginx sudo systemctl enable nginx sudo systemctl start nginx # ------------------------------ -# Configurer Nginx pour l'app (wildcard) sur port 80 only le temps de mettre en place SSL +# Bloc de proxy partagé par tous les vhosts # ------------------------------ -NGINX_CONF="/etc/nginx/sites-available/$DOMAIN" -sudo tee $NGINX_CONF > /dev/null < /dev/null < /dev/null; then + sudo apt install -y python3-certbot-dns-cloudflare +fi -# Générer certificat wildcard SSL via Cloudflare si absent +# Wildcard via DNS-01 : aucun port à exposer, et un seul certificat pour tous les sous-domaines. +# Attention, un wildcard ne couvre qu'un niveau : *.exemple.com vaut pour a.exemple.com mais pas +# pour b.a.exemple.com. if [ ! -d "/etc/letsencrypt/live/$DOMAIN" ]; then sudo certbot certonly \ --dns-cloudflare \ - --dns-cloudflare-credentials $CLOUDFLARE_CREDENTIALS \ - -d $DOMAIN -d *.$DOMAIN \ - -m $EMAIL \ + --dns-cloudflare-credentials "$CLOUDFLARE_CREDENTIALS" \ + -d "$DOMAIN" -d "*.$DOMAIN" \ + -m "$EMAIL" \ --agree-tos \ --non-interactive else echo "Certificat SSL déjà existant pour $DOMAIN, skipping..." fi -# Configurer Nginx pour SSL -sudo tee /etc/nginx/sites-available/$DOMAIN > /dev/null <&2 + exit 1 + fi + echo "" + echo "server {" + echo " listen 443 ssl;" + echo " http2 on;" + echo " server_name $sub.$DOMAIN;" + echo "" + echo " ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem;" + echo " ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem;" + echo "" + proxy_block "$port" + echo "}" + done + + echo "" + echo "server {" + echo " listen 443 ssl;" + echo " http2 on;" + echo " server_name $DOMAIN *.$DOMAIN;" + echo "" + echo " ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem;" + echo " ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem;" + echo "" + proxy_block "$APP_PORT" + echo "}" +} | sudo tee "$NGINX_CONF" > /dev/null sudo nginx -t && sudo systemctl reload nginx echo "✅ Installation terminée !" -echo "Port Node.js: $APP_PORT" -echo "Nginx configuré avec SSL wildcard pour $DOMAIN et *.$DOMAIN" \ No newline at end of file +echo " $DOMAIN et *.$DOMAIN → port $APP_PORT" +for app in ${EXTRA_APPS[@]+"${EXTRA_APPS[@]}"}; do + echo " ${app%%:*}.$DOMAIN → port ${app##*:}" +done -- 2.51.2