From 0562d072543669f961e4494697e182c771ff344f Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 5 Sep 2026 15:08:45 +0000 Subject: [PATCH] Installation VPS sans reverse proxy : Caddy + Let's Encrypt en surcouche Compose MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajoute docker-compose.caddy.yml et un Caddyfile pour servir le site sur un nom de domaine en 80/443 avec certificat automatique, sans Nginx Proxy Manager. Le port 8413 n'est plus publié dans ce mode et le réseau proxy est créé par Compose. Procédure documentée dans le README et .env.example. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01B8UUiQtBWYWNFcsea8spnX --- .env.example | 6 +++++ Caddyfile | 11 +++++++++ README.md | 29 +++++++++++++++++++++++ docker-compose.caddy.yml | 50 ++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 1 + 5 files changed, 97 insertions(+) create mode 100644 Caddyfile create mode 100644 docker-compose.caddy.yml diff --git a/.env.example b/.env.example index 5103808..4bc887c 100644 --- a/.env.example +++ b/.env.example @@ -39,6 +39,12 @@ SEED_DEMO=false NODE_ENV=production PORT=3000 +# ---- VPS sans reverse proxy : Caddy + Let's Encrypt (voir README) ---- +# Décommentez pour ajouter docker-compose.caddy.yml (ports 80/443, HTTPS auto). +#COMPOSE_FILE=docker-compose.yml:docker-compose.caddy.yml +#SITE_DOMAIN=pleinr.example.fr +#CADDY_EMAIL=vous@example.fr + # URL publique du site. Se règle normalement dans Backend › Réseaux sociaux ; # cette variable ne sert que de repli (puis AUTH_URL en dernier recours). NEXT_PUBLIC_SITE_URL= diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000..6a9e2bd --- /dev/null +++ b/Caddyfile @@ -0,0 +1,11 @@ +# Reverse proxy Caddy pour Plein R (voir docker-compose.caddy.yml). +# Caddy gère seul le certificat Let's Encrypt et la redirection HTTP -> HTTPS. + +{ + email {$CADDY_EMAIL} +} + +{$SITE_DOMAIN} { + encode zstd gzip + reverse_proxy pleinr-app:3000 +} diff --git a/README.md b/README.md index 790dcf9..4277167 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,35 @@ charge des données de démonstration. Ensuite : > **Postgres déjà existant ?** Supprimez le service `postgres` de `docker-compose.yml` > et pointez `DATABASE_URL` vers votre instance. +## Installation sur un VPS sans reverse proxy (domaine + HTTPS) + +Le `docker-compose.yml` suppose un Nginx Proxy Manager déjà en place. Sur un +serveur nu, `docker-compose.caddy.yml` ajoute **Caddy** devant l'application : +il écoute en 80 et 443, obtient et renouvelle seul le certificat Let's Encrypt +et redirige HTTP vers HTTPS. + +1. Faire pointer le DNS du domaine (enregistrement A / AAAA) vers l'IP du VPS et + ouvrir les ports 80 et 443 (`ufw allow 80,443/tcp`). +2. Installer Docker : `curl -fsSL https://get.docker.com | sh` +3. Cloner le dépôt, copier `.env.example` en `.env` et renseigner : + + ```dotenv + COMPOSE_FILE=docker-compose.yml:docker-compose.caddy.yml + SITE_DOMAIN=pleinr.example.fr + CADDY_EMAIL=vous@example.fr + AUTH_URL=https://pleinr.example.fr + POSTGRES_PASSWORD=un-vrai-mot-de-passe + SEED_ADMIN_EMAIL=vous@example.fr + ``` + +4. Lancer : `docker compose up -d --build` +5. Récupérer le mot de passe administrateur généré au premier démarrage : + `docker logs pleinr-app 2>&1 | grep -i -A2 "mot de passe"` + +Le site est alors servi sur `https://pleinr.example.fr`. Le port 8413 n'est +plus publié : tout passe par Caddy. Les certificats vivent dans le volume +`caddy_data`. Mise à jour : `git pull && docker compose up -d --build`. + ## Comptes de démonstration (seed) | E-mail | Mot de passe | Rôle | diff --git a/docker-compose.caddy.yml b/docker-compose.caddy.yml new file mode 100644 index 0000000..f90bd96 --- /dev/null +++ b/docker-compose.caddy.yml @@ -0,0 +1,50 @@ +# Plein R — variante « VPS sans reverse proxy existant ». +# +# Ajoute Caddy devant l'application : il écoute en 80 et 443, obtient et +# renouvelle tout seul le certificat Let's Encrypt pour SITE_DOMAIN, et +# redirige automatiquement HTTP vers HTTPS. +# +# Utilisation : dans .env, poser +# COMPOSE_FILE=docker-compose.yml:docker-compose.caddy.yml +# SITE_DOMAIN=pleinr.example.fr +# CADDY_EMAIL=vous@example.fr +# AUTH_URL=https://pleinr.example.fr +# puis `docker compose up -d --build` comme d'habitude. +# +# Pré-requis : le DNS du domaine pointe vers le VPS et les ports 80/443 sont +# ouverts dans le pare-feu. + +services: + caddy: + image: caddy:2-alpine + container_name: pleinr-caddy + restart: unless-stopped + depends_on: + - app + environment: + SITE_DOMAIN: ${SITE_DOMAIN:?SITE_DOMAIN manquant dans .env} + CADDY_EMAIL: ${CADDY_EMAIL:?CADDY_EMAIL manquant dans .env (alertes d expiration Let's Encrypt)} + ports: + - "80:80" + - "443:443" + - "443:443/udp" + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile:ro + - caddy_data:/data + - caddy_config:/config + networks: + - proxy + + app: + # L'application n'est plus publiée directement sur l'hôte : tout passe + # par Caddy (sinon http://IP:8413 contournerait le HTTPS). + ports: !reset [] + +volumes: + caddy_data: + caddy_config: + +networks: + # Sans Nginx Proxy Manager, personne ne crée ce réseau : Compose s'en charge. + proxy: + external: false diff --git a/docker-compose.yml b/docker-compose.yml index a59f4f8..8464b06 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -93,5 +93,6 @@ networks: proxy: # The reverse proxy's existing network. Must already exist (created by the # NPM/nginx stack). Override the name with PROXY_NETWORK if it differs. + # Sans proxy existant : voir docker-compose.caddy.yml (README). external: true name: ${PROXY_NETWORK:-nginx_default}