Compare commits

...
3 Commits
Author SHA1 Message Date
mathieuandClaude Sonnet 5 aed16efdfc Ajoute le script de publication vers akbar (SFTP via rclone)
Le compte SSH de déploiement est restreint au SFTP côté serveur
(ForceCommand internal-sftp, YunoHost) : rsync/scp échouent car ils ont
besoin d'exécuter une commande shell distante. rclone en backend SFTP
ne parle que le protocole SFTP et fonctionne avec ce type de compte.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-08 01:25:47 +02:00
Mathieu Limonier e91d644531 Rendre encore plus visible les liens web 2026-07-23 00:35:40 +02:00
Mathieu Limonier 585946f2a0 ### Sécurité
- [x] Permissions (fichiers : 644 - dossiers : 755)
- [x] .htaccess
2026-07-23 00:35:20 +02:00
5 changed files with 215 additions and 7 deletions
+7 -1
View File
@@ -34,6 +34,13 @@ Modifier `.env.exemple` en `.env`
### publish.sh
`./script/publish.sh` : Publie le site dans le _PUBLISH_DIR_ de _.env_
### publish-akbar.sh
`./script/publish-akbar.sh` : build (`publish.sh`) puis déploiement de `PUBLISH_DIR` vers akbar via `rclone`/SFTP (`SSH_USER`, `SSH_HOST`, `SSH_PORT`, `SSH_REMOTE_PATH` dans `.env`). Le compte de déploiement est restreint au SFTP côté serveur (YunoHost), d'où `rclone` plutôt que `rsync`/`scp` qui nécessitent un shell distant.
Ne pas oublier de vérifier que les
- dossiers sont en 755 (`find /var/www -type d -exec chmod 755 {} \;`)
- fichiers sont en 644 (`find /var/www -type f -exec chmod 644 {} \;`)
## Spécificités
### Page 404 et Yunohost
La page 404.html, si l'option _Activer l'utilisation du fichier d'erreur personnalisé_ est activée, doit être déplacée sur www/error/404.html
@@ -81,7 +88,6 @@ En mode incognito sur Chromium, <kbd>F12</kbd> puis Lighthouse. Tester smartphon
Document does not have a meta description
## Idées d'évolutions
- Témoignages
+4 -5
View File
@@ -2,14 +2,13 @@
## À faire
### Sécurité
- [ ] Permissions (fichiers : 644 - dossiers : 755)
- [ ] .htaccess
---
## Fait
### Sécurité
- [x] Permissions (fichiers : 644 - dossiers : 755)
- [x] .htaccess
### Légal
- [x] Rédiger les mentions légales
- [x] Rédiger la politique de confidentialité
+56
View File
@@ -0,0 +1,56 @@
#!/usr/bin/env bash
#
# Build le site (publish.sh) puis déploie le résultat vers akbar en une
# seule commande.
#
# Le compte SSH de déploiement (webapp YunoHost) est restreint au SFTP
# (ForceCommand internal-sftp côté serveur) : ni scp, ni rsync-sur-ssh ne
# fonctionnent (la commande distante est refusée, la connexion est coupée).
# On utilise donc rclone en backend SFTP, qui ne parle que le protocole
# SFTP et ne tente jamais d'exécuter de commande shell distante.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "${SCRIPT_DIR}")"
if ! command -v rclone >/dev/null 2>&1; then
echo "Erreur : rclone est requis (apt install rclone)."
exit 1
fi
if [[ ! -f "${PROJECT_DIR}/.env" ]]; then
echo "Erreur : fichier .env introuvable."
exit 1
fi
set -a
source "${PROJECT_DIR}/.env"
set +a
: "${SSH_USER:?Variable SSH_USER manquante dans .env}"
: "${SSH_HOST:?Variable SSH_HOST manquante dans .env}"
: "${SSH_PORT:=22}"
: "${SSH_REMOTE_PATH:?Variable SSH_REMOTE_PATH manquante dans .env}"
PUBLISH_PATH="${PROJECT_DIR}/${PUBLISH_DIR}"
echo "=== Étape 1/2 : build du site ==="
(cd "${PROJECT_DIR}" && "${SCRIPT_DIR}/publish.sh")
echo
echo "=== Étape 2/2 : déploiement (SFTP) vers ${SSH_USER}@${SSH_HOST}:${SSH_REMOTE_PATH} ==="
rclone sync \
"${PUBLISH_PATH}" \
":sftp:${SSH_REMOTE_PATH}" \
--sftp-host "${SSH_HOST}" \
--sftp-user "${SSH_USER}" \
--sftp-port "${SSH_PORT}" \
--sftp-ask-password \
--sftp-shell-type none \
--sftp-disable-hashcheck \
--progress
echo
echo "Déployé. Site visible sur :"
echo " https://${SSH_HOST}/"
+11 -1
View File
@@ -1,3 +1,13 @@
:root {
--link: light-dark(#005a9c, #8cc8ff);
--link: light-dark(#005fcc, #8ab4f8);
/* --link: light-dark(#005a9c, #8cc8ff); */
a {
text-decoration: underline;
}
a:hover,
a:focus {
text-decoration-thickness: 2px;
}
}
+137
View File
@@ -0,0 +1,137 @@
# =====================================================
# Sillycone Village
# Configuration Apache sécurisée pour site statique Hugo
# =====================================================
# -----------------------------------------------------
# 1. Forcer HTTPS
# -----------------------------------------------------
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# -----------------------------------------------------
# 2. Protection contre accès fichiers sensibles
# -----------------------------------------------------
<FilesMatch "(^\.|\.git|\.env|\.bak|\.backup|\.old|\.sql|\.log|composer\.json|package\.json)">
Require all denied
</FilesMatch>
# Bloquer l'accès au fichier .htaccess lui-même
<Files ".htaccess">
Require all denied
</Files>
# -----------------------------------------------------
# 3. Headers de sécurité HTTP
# -----------------------------------------------------
<IfModule mod_headers.c>
# Empêche le navigateur de deviner les types MIME
Header always set X-Content-Type-Options "nosniff"
# Protection contre certaines attaques XSS anciennes
Header always set X-XSS-Protection "1; mode=block"
# Contrôle des informations envoyées aux sites externes
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Désactive les fonctionnalités navigateur inutiles
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=()"
# Protection contre l'intégration dans une iframe externe
Header always set X-Frame-Options "SAMEORIGIN"
# Politique de sécurité du contenu
# - pas de JS
# - pas de CDN
# - pas de police externe
# - CSS local uniquement
Header always set Content-Security-Policy "default-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'"
</IfModule>
# -----------------------------------------------------
# 4. Compression
# -----------------------------------------------------
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE \
text/html \
text/plain \
text/css \
text/javascript \
application/javascript \
application/json \
application/xml \
image/svg+xml
</IfModule>
# -----------------------------------------------------
# 5. Cache navigateur
# -----------------------------------------------------
<IfModule mod_expires.c>
ExpiresActive On
# HTML : court pour faciliter les mises à jour
ExpiresByType text/html "access plus 1 hour"
# CSS
ExpiresByType text/css "access plus 1 month"
# SVG
ExpiresByType image/svg+xml "access plus 1 month"
# Fichiers statiques
ExpiresByType application/javascript "access plus 1 month"
</IfModule>
# -----------------------------------------------------
# 6. Désactiver le listing des répertoires
# -----------------------------------------------------
Options -Indexes
# -----------------------------------------------------
# 7. Bloquer certains robots agressifs
# -----------------------------------------------------
<IfModule mod_setenvif.c>
SetEnvIfNoCase User-Agent "MJ12bot" bad_bot
SetEnvIfNoCase User-Agent "AhrefsBot" bad_bot
<RequireAll>
Require all granted
Require not env bad_bot
</RequireAll>
</IfModule>