Installation VPS sans reverse proxy : Caddy + Let's Encrypt en surcouche Compose

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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B8UUiQtBWYWNFcsea8spnX
This commit is contained in:
Claude committed 2026-09-05 15:08:45 +00:00
1 parent a8adb9ae6a
commit 0562d07254
5 files changed
+97

No files matched your search

+6
View File
@@ -39,6 +39,12 @@ SEED_DEMO=false
NODE_ENV=production NODE_ENV=production
PORT=3000 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 ; # 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). # cette variable ne sert que de repli (puis AUTH_URL en dernier recours).
NEXT_PUBLIC_SITE_URL= NEXT_PUBLIC_SITE_URL=
+11
View File
@@ -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
}
+29
View File
@@ -45,6 +45,35 @@ charge des données de démonstration. Ensuite :
> **Postgres déjà existant ?** Supprimez le service `postgres` de `docker-compose.yml` > **Postgres déjà existant ?** Supprimez le service `postgres` de `docker-compose.yml`
> et pointez `DATABASE_URL` vers votre instance. > 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) ## Comptes de démonstration (seed)
| E-mail | Mot de passe | Rôle | | E-mail | Mot de passe | Rôle |
+50
View File
@@ -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
+1
View File
@@ -93,5 +93,6 @@ networks:
proxy: proxy:
# The reverse proxy's existing network. Must already exist (created by the # The reverse proxy's existing network. Must already exist (created by the
# NPM/nginx stack). Override the name with PROXY_NETWORK if it differs. # NPM/nginx stack). Override the name with PROXY_NETWORK if it differs.
# Sans proxy existant : voir docker-compose.caddy.yml (README).
external: true external: true
name: ${PROXY_NETWORK:-nginx_default} name: ${PROXY_NETWORK:-nginx_default}