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}