From 84013376f23ffd5aed4281286d76f44b21339919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Sat, 25 Jul 2026 16:44:24 +0400 Subject: [PATCH] docs: prioritize nginx, fix sample config and use certbot snap --- DEPLOY.adoc | 68 +++++++++++++++++++++++++++++------------- README.adoc | 52 ++++++++++++++++---------------- conf/nginx.conf.sample | 5 +++- 3 files changed, 77 insertions(+), 48 deletions(-) diff --git a/DEPLOY.adoc b/DEPLOY.adoc index 63a49e1..3f725a4 100644 --- a/DEPLOY.adoc +++ b/DEPLOY.adoc @@ -37,9 +37,9 @@ NOTE: Sur un hébergement mutualisé (pas d'accès root), adaptez : les fichiers [source,bash] ---- -# Apache + PHP (choix retenu pour ce guide ; Nginx possible, voir §5) +# Nginx + PHP-FPM (choix recommandé ; Apache possible, voir §5 option B) apt update && apt upgrade -y -apt install -y apache2 php libapache2-mod-php \ +apt install -y nginx php-fpm \ php-curl php-intl php-mbstring php-xml \ git curl unzip @@ -90,11 +90,12 @@ Ces fichiers sont ignorés par Git : ils vivent *uniquement sur le serveur* et n ---- cd /var/www/annu-kute-ced sudo -u deploy cp includes/config.local.php.sample includes/config.local.php -sudo -u deploy cp conf/.htaccess.sample .htaccess sudo -u deploy cp site.webmanifest.sample site.webmanifest sudo -u deploy cp robots.txt.sample robots.txt sudo -u deploy cp sitemap.xml.sample sitemap.xml sudo -u deploy cp mentions-legales.php.sample mentions-legales.php +# Uniquement si vous utilisez Apache (option B de l'étape 5) : +# sudo -u deploy cp conf/.htaccess.sample .htaccess # Facultatif (page de dons) : # sudo -u deploy cp dons.php.sample dons.php ---- @@ -114,10 +115,27 @@ chown -R www-data:www-data /var/www/annu-kute-ced/cache == 5️⃣ VirtualHost -=== Option A — Apache (recommandée, `.htaccess` fourni) +=== Option A — Nginx + PHP-FPM (recommandée, configuration fournie) + +Le fichier `conf/nginx.conf.sample` est l'équivalent Nginx complet du `.htaccess` : mêmes protections (fichiers de configuration, répertoires sensibles, dotfiles, pas de listing), masquage de l'extension `.php`, HTTPS forcé, `no-cache` pour `sw.js` et `site.webmanifest`, plus le cache des assets et gzip. [source,bash] ---- +# Adapter conf/nginx.conf.sample : +# - server_name : votre domaine +# - root : /var/www/annu-kute-ced +# - fastcgi_pass : socket de votre version PHP (ex. /var/run/php/php8.3-fpm.sock) +# - ssl_certificate(_key) : chemins de vos certificats (étape 6) +cp conf/nginx.conf.sample /etc/nginx/sites-available/annu-kute-ced +ln -s /etc/nginx/sites-available/annu-kute-ced /etc/nginx/sites-enabled/ +nginx -t && systemctl reload nginx +---- + +=== Option B — Apache + +[source,bash] +---- +apt install -y apache2 php libapache2-mod-php a2enmod rewrite headers cat > /etc/apache2/sites-available/annu-kute-ced.conf <<'EOF' @@ -137,28 +155,36 @@ systemctl reload apache2 Le `.htaccess` copié à l'étape 4 applique les règles de sécurité, le HTTPS forcé (actif après l'étape 6) et le `no-cache` de `sw.js`. -=== Option B — Nginx + PHP-FPM - -[source,bash] ----- -apt install -y nginx php-fpm -# Adapter conf/nginx.conf.sample : server_name, root, socket php-fpm, -# chemins des certificats. ⚠️ Le bloc "location ~* \.(php|inc|...)$ { deny all; }" -# de l'exemple correspond à TOUS les .php : le restreindre à ^/includes/. -cp conf/nginx.conf.sample /etc/nginx/sites-available/annu-kute-ced -ln -s /etc/nginx/sites-available/annu-kute-ced /etc/nginx/sites-enabled/ -nginx -t && systemctl reload nginx ----- - == 6️⃣ HTTPS (obligatoire pour la PWA) +Méthode recommandée par l'EFF : *Certbot via snap* (https://certbot.eff.org/instructions?ws=nginx&os=snap[instructions officielles^]). Prérequis : le domaine pointe vers le serveur et le site répond déjà en HTTP sur le port 80 (étape 5 terminée). + [source,bash] ---- -apt install -y certbot python3-certbot-apache # ou python3-certbot-nginx -certbot --apache -d example.com -d www.example.com -# ou : certbot --nginx -d example.com -d www.example.com +# 1. Installer snapd (Ubuntu : déjà présent. Debian : apt + support classic) +apt install -y snapd +snap install core && snap refresh core + +# 2. Retirer tout certbot installé via apt (évite les conflits de commande) +apt-get remove -y certbot || true + +# 3. Installer Certbot et préparer la commande +snap install --classic certbot +ln -s /snap/bin/certbot /usr/local/bin/certbot + +# 4. Obtenir le certificat ET laisser Certbot configurer Nginx automatiquement +certbot --nginx -d example.com -d www.example.com +# Variante prudente (ne fait qu'émettre le certificat, vhost édité à la main) : +# certbot certonly --nginx -d example.com -d www.example.com + +# 5. Vérifier le renouvellement automatique (timer systemd/cron inclus avec le snap) +certbot renew --dry-run ---- +NOTE: Pour Apache (option B), la méthode snap est identique, avec `certbot --apache` à l'étape 4. + +Ouvrez ensuite `https://example.com` dans un navigateur : le cadenas doit apparaître dans la barre d'URL. + == 7️⃣ Vérification du site [source,bash] @@ -263,7 +289,7 @@ Le bump de version dans `sw.js` est fait *sur le serveur uniquement* : le dépô | `cache/` non accessible en écriture : `chown -R www-data:www-data cache/` | `php-intl` manquant -| `apt install php-intl && systemctl restart apache2` +| `apt install php-intl` puis `systemctl restart php*-fpm` (Nginx) ou `systemctl restart apache2` (Apache) |=== == 🔒 Notes de sécurité diff --git a/README.adoc b/README.adoc index 753eef0..db8d2c0 100644 --- a/README.adoc +++ b/README.adoc @@ -229,7 +229,7 @@ NOTE: Les fichiers marqués « legacy » sont conservés pour référence mais n * `intl` — dates internationales et fuseaux horaires * `mbstring` — chaînes multi-octets * `xml` (SimpleXML) — recommandée pour Castopod (un fallback regex existe) -- 🌐 *Serveur web* : Apache ou Nginx +- 🌐 *Serveur web* : Nginx (recommandé) ou Apache - 🔒 *HTTPS* : requis pour les fonctionnalités PWA .Installation de l'extension `intl` @@ -783,18 +783,9 @@ NOTE: L'en-tête COEP a été *volontairement retiré* (commit `62d4d99`) : `req - *Anti-SSRF* : validation des URLs d'instances (schéma http/https, blocage IP privées et `localhost`), liste blanche des endpoints de l'API PeerTube, cURL sans redirections - *Anti-XSS* : échappement systématique des sorties ; validation des entrées (UUID vidéo, requête de recherche ≤ 200 car., numéros de page, ID de catégorie 1–20) -==== Configuration serveur (Apache) +==== Configuration serveur (Nginx, recommandé) -[source,bash] ----- -cp conf/.htaccess.sample .htaccess ----- - -Protections incluses : blocage des fichiers de configuration et `.sample`, des dossiers `/includes/`, `/cache/`, `/docs/`, `/conf/` ; pas de listing de répertoires ; fichiers cachés bloqués ; HTTPS forcé ; masquage de l'extension `.php` (URLs propres `/video` au lieu de `/video.php`). - -WARNING: Cette configuration est *essentielle* : sans elle, vos fichiers de configuration sont exposés aux visiteurs. - -==== Configuration serveur (Nginx) +Le fichier `conf/nginx.conf.sample` est l'équivalent Nginx complet du `.htaccess` : mêmes protections (fichiers de configuration et `.sample`, dossiers `/includes/`, `/cache/`, `/docs/`, `/conf/`, fichiers cachés, pas de listing), HTTPS forcé, masquage de l'extension `.php` (URLs propres `/video` au lieu de `/video.php`), `no-cache` pour `sw.js` et `site.webmanifest`, plus le cache des assets et gzip. [source,bash] ---- @@ -804,7 +795,16 @@ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx ---- -WARNING: Le bloc `location ~* \.(php|inc|conf|config|local)$ { deny all; }` de l'exemple correspond tel quel à *tous* les fichiers `.php`. Ajustez-le pour ne cibler que les chemins sensibles (par exemple `^/includes/`), sous peine de rendre l'application inaccessible. +==== Configuration serveur (Apache, alternative) + +[source,bash] +---- +cp conf/.htaccess.sample .htaccess +---- + +Protections incluses : blocage des fichiers de configuration et `.sample`, des dossiers `/includes/`, `/cache/`, `/docs/`, `/conf/` ; pas de listing de répertoires ; fichiers cachés bloqués ; HTTPS forcé ; masquage de l'extension `.php`. + +WARNING: Cette configuration est *essentielle* : sans elle, vos fichiers de configuration sont exposés aux visiteurs. === 📱 Progressive Web App (PWA) @@ -1157,7 +1157,7 @@ NOTE: Files marked "legacy" are kept for reference but are not included by any p * `intl` — international dates and timezones * `mbstring` — multi-byte strings * `xml` (SimpleXML) — recommended for Castopod (a regex fallback exists) -- 🌐 *Web server*: Apache or Nginx +- 🌐 *Web server*: Nginx (recommended) or Apache - 🔒 *HTTPS*: required for PWA features .Installing the `intl` extension @@ -1711,18 +1711,9 @@ NOTE: The COEP header was *deliberately removed* (commit `62d4d99`): `require-co - *Anti-SSRF*: instance URL validation (http/https scheme, blocking private IPs and `localhost`), allowlist of PeerTube API endpoints, cURL without redirects - *Anti-XSS*: systematic output escaping; input validation (video UUID, search query ≤ 200 chars, page numbers, category ID 1–20) -==== Server configuration (Apache) +==== Server configuration (Nginx, recommended) -[source,bash] ----- -cp conf/.htaccess.sample .htaccess ----- - -Included protections: blocking of configuration and `.sample` files, of the `/includes/`, `/cache/`, `/docs/`, `/conf/` directories; no directory listing; hidden files blocked; HTTPS enforced; `.php` extension masking (clean URLs `/video` instead of `/video.php`). - -WARNING: This configuration is *essential*: without it, your configuration files are exposed to visitors. - -==== Server configuration (Nginx) +The `conf/nginx.conf.sample` file is the complete Nginx equivalent of the `.htaccess`: same protections (configuration and `.sample` files, `/includes/`, `/cache/`, `/docs/`, `/conf/` directories, hidden files, no directory listing), HTTPS enforced, `.php` extension masking (clean URLs `/video` instead of `/video.php`), `no-cache` for `sw.js` and `site.webmanifest`, plus asset caching and gzip. [source,bash] ---- @@ -1732,7 +1723,16 @@ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx ---- -WARNING: The sample's `location ~* \.(php|inc|conf|config|local)$ { deny all; }` block as written matches *all* `.php` files. Adjust it to target only sensitive paths (e.g. `^/includes/`), or the whole application will become unreachable. +==== Server configuration (Apache, alternative) + +[source,bash] +---- +cp conf/.htaccess.sample .htaccess +---- + +Included protections: blocking of configuration and `.sample` files, of the `/includes/`, `/cache/`, `/docs/`, `/conf/` directories; no directory listing; hidden files blocked; HTTPS enforced; `.php` extension masking. + +WARNING: This configuration is *essential*: without it, your configuration files are exposed to visitors. === 📱 Progressive Web App (PWA) diff --git a/conf/nginx.conf.sample b/conf/nginx.conf.sample index 878b100..0b99125 100644 --- a/conf/nginx.conf.sample +++ b/conf/nginx.conf.sample @@ -19,7 +19,10 @@ server { # ====================== # Bloquer l'accès aux fichiers de configuration - location ~* \.(php|inc|conf|config|local)$ { + # (les .php de includes/ sont déjà bloqués par le bloc "répertoires + # sensibles" ci-dessous ; ne PAS ajouter php ici, sinon toute + # l'application serait inaccessible) + location ~* \.(inc|conf|config|local)$ { deny all; return 404; }