Compare commits
3
Commits
ec737536db
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aed16efdfc | ||
|
|
e91d644531 | ||
|
|
585946f2a0 |
@@ -34,6 +34,13 @@ Modifier `.env.exemple` en `.env`
|
|||||||
### publish.sh
|
### publish.sh
|
||||||
`./script/publish.sh` : Publie le site dans le _PUBLISH_DIR_ de _.env_
|
`./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
|
## Spécificités
|
||||||
### Page 404 et Yunohost
|
### 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
|
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
|
Document does not have a meta description
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Idées d'évolutions
|
## Idées d'évolutions
|
||||||
|
|
||||||
- Témoignages
|
- Témoignages
|
||||||
|
|||||||
@@ -2,14 +2,13 @@
|
|||||||
|
|
||||||
## À faire
|
## À faire
|
||||||
|
|
||||||
### Sécurité
|
|
||||||
|
|
||||||
- [ ] Permissions (fichiers : 644 - dossiers : 755)
|
|
||||||
- [ ] .htaccess
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Fait
|
## Fait
|
||||||
|
### Sécurité
|
||||||
|
- [x] Permissions (fichiers : 644 - dossiers : 755)
|
||||||
|
- [x] .htaccess
|
||||||
|
|
||||||
### Légal
|
### Légal
|
||||||
- [x] Rédiger les mentions légales
|
- [x] Rédiger les mentions légales
|
||||||
- [x] Rédiger la politique de confidentialité
|
- [x] Rédiger la politique de confidentialité
|
||||||
|
|||||||
Executable
+56
@@ -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}/"
|
||||||
@@ -1,3 +1,13 @@
|
|||||||
:root {
|
: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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user