docs: prioritize nginx, fix sample config and use certbot snap
This commit is contained in:
+47
-21
@@ -37,9 +37,9 @@ NOTE: Sur un hébergement mutualisé (pas d'accès root), adaptez : les fichiers
|
|||||||
|
|
||||||
[source,bash]
|
[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 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 \
|
php-curl php-intl php-mbstring php-xml \
|
||||||
git curl unzip
|
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
|
cd /var/www/annu-kute-ced
|
||||||
sudo -u deploy cp includes/config.local.php.sample includes/config.local.php
|
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 site.webmanifest.sample site.webmanifest
|
||||||
sudo -u deploy cp robots.txt.sample robots.txt
|
sudo -u deploy cp robots.txt.sample robots.txt
|
||||||
sudo -u deploy cp sitemap.xml.sample sitemap.xml
|
sudo -u deploy cp sitemap.xml.sample sitemap.xml
|
||||||
sudo -u deploy cp mentions-legales.php.sample mentions-legales.php
|
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) :
|
# Facultatif (page de dons) :
|
||||||
# sudo -u deploy cp dons.php.sample dons.php
|
# 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
|
== 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]
|
[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
|
a2enmod rewrite headers
|
||||||
cat > /etc/apache2/sites-available/annu-kute-ced.conf <<'EOF'
|
cat > /etc/apache2/sites-available/annu-kute-ced.conf <<'EOF'
|
||||||
<VirtualHost *:80>
|
<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`.
|
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)
|
== 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]
|
[source,bash]
|
||||||
----
|
----
|
||||||
apt install -y certbot python3-certbot-apache # ou python3-certbot-nginx
|
# 1. Installer snapd (Ubuntu : déjà présent. Debian : apt + support classic)
|
||||||
certbot --apache -d example.com -d www.example.com
|
apt install -y snapd
|
||||||
# ou : certbot --nginx -d example.com -d www.example.com
|
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
|
== 7️⃣ Vérification du site
|
||||||
|
|
||||||
[source,bash]
|
[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/`
|
| `cache/` non accessible en écriture : `chown -R www-data:www-data cache/`
|
||||||
|
|
||||||
| `php-intl` manquant
|
| `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é
|
== 🔒 Notes de sécurité
|
||||||
|
|||||||
+26
-26
@@ -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
|
* `intl` — dates internationales et fuseaux horaires
|
||||||
* `mbstring` — chaînes multi-octets
|
* `mbstring` — chaînes multi-octets
|
||||||
* `xml` (SimpleXML) — recommandée pour Castopod (un fallback regex existe)
|
* `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
|
- 🔒 *HTTPS* : requis pour les fonctionnalités PWA
|
||||||
|
|
||||||
.Installation de l'extension `intl`
|
.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-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)
|
- *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]
|
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.
|
||||||
----
|
|
||||||
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)
|
|
||||||
|
|
||||||
[source,bash]
|
[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
|
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)
|
=== 📱 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
|
* `intl` — international dates and timezones
|
||||||
* `mbstring` — multi-byte strings
|
* `mbstring` — multi-byte strings
|
||||||
* `xml` (SimpleXML) — recommended for Castopod (a regex fallback exists)
|
* `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
|
- 🔒 *HTTPS*: required for PWA features
|
||||||
|
|
||||||
.Installing the `intl` extension
|
.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-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)
|
- *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]
|
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.
|
||||||
----
|
|
||||||
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)
|
|
||||||
|
|
||||||
[source,bash]
|
[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
|
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)
|
=== 📱 Progressive Web App (PWA)
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,10 @@ server {
|
|||||||
# ======================
|
# ======================
|
||||||
|
|
||||||
# Bloquer l'accès aux fichiers de configuration
|
# 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;
|
deny all;
|
||||||
return 404;
|
return 404;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user