docs: prioritize nginx, fix sample config and use certbot snap

This commit is contained in:
2026-07-25 16:44:24 +04:00
parent dafb5e5753
commit 84013376f2
3 changed files with 77 additions and 48 deletions
+47 -21
View File
@@ -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'
<VirtualHost *:80>
@@ -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é
+26 -26
View File
@@ -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 120)
==== 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 120)
==== 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)
+4 -1
View File
@@ -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;
}