Date : 11/02/2026 Status : IMPLEMENTEE Priorite : HAUTE Duree estimee : 30 min
L'investigation a revele 3 problemes dans le pipeline de logs :
sync-logs-o2switch.sh ne fonctionne pas — Le script utilise nowhere84@ssh-nowhere84.o2switch.net (FQDN qui ne resout pas). L'alias SSH o2switch fonctionne (deas8499@yellow.o2switch.net). Consequence : aucun log Loki n'a jamais ete archive sur O2switch. Le cold storage 90 jours n'existe pas.
Logrotate ne s'execute jamais sur nginx — Le package cron n'est pas installe. La config logrotate existe (/etc/logrotate.d/nginx : daily, 14 rotations, compress) mais n'est jamais declenchee. Les logs grossissent indefiniment (1.1 Go actuellement, dont 519 Mo pour gitlab.access.log seul).
nginx-logs-archive.sh ne produit rien d'utile — L'archive locale est quasi vide. Ce script est redondant avec Loki + O2switch une fois les 2 premiers fixes appliques.
{host="nginx"})ssh gouroubleu@192.168.1.104
sudo apt update && sudo apt install -y cron
sudo systemctl enable --now cron
Verification :
sudo systemctl status cron
# Attendre le lendemain puis verifier :
ls -la /var/log/nginx/*.gz # Fichiers comprimes = logrotate fonctionne
Effet : logrotate s'executera quotidiennement (config existante : daily, 14 rotations, compress). Les 1.1 Go de logs actuels seront comprimes et rotatés automatiquement. Les vieux logs (>14 jours) seront supprimes.
Note : Certbot fonctionne deja via systemd timer, pas impacte.
Modifier le script sur PVE : /stock_8to/33800-stack/scripts/logs/sync-logs-o2switch.sh
Changement : Remplacer la variable SSH cassee par l'alias qui fonctionne.
- O2SWITCH="nowhere84@ssh-nowhere84.o2switch.net"
+ O2SWITCH="o2switch"
Et aussi remplacer set -e par une gestion d'erreur plus souple pour ne pas quitter au premier echec non critique :
- set -e
+ set -euo pipefail
Puis remplacer REMOTE_DIR="logs" par un sous-dossier dedie pour ne pas melanger avec les logs cPanel :
- REMOTE_DIR="logs"
+ REMOTE_DIR="backup/logs"
Test manuel apres modification :
/stock_8to/33800-stack/scripts/logs/sync-logs-o2switch.sh
cat /var/log/sync-logs-o2switch.log
ssh o2switch 'ls -la ~/backup/logs/prod/nginx/'
Effet : Le cron de 3h du matin exportera les logs de la veille depuis Loki, les compressera et les enverra sur O2switch. Retention 90 jours avec nettoyage automatique.
Ce script copie les logs bruts nginx via scp vers stock_8to. Avec Promtail→Loki (30j hot) + sync-logs-o2switch (90j cold), il est redondant.
Supprimer le cron sur PVE :
sudo rm /etc/cron.d/nginx-logs-archive
Nettoyer l'archive vide :
rm -rf /stock_8to/33800-stack/monitoring/downloads/logs/nginx-archive/
Garder le script dans le repo (au cas ou) mais le marquer deprecie.
Commit + push du script modifie vers GitLab (pas de CI/CD pour ce projet, push manuel).
nginx logs ──► Promtail ──► Loki (30j hot) ← consultation Grafana temps reel
│
▼
sync-logs-o2switch.sh (3h AM) ← cron PVE quotidien
│
▼
O2switch ~/backup/logs/ (90j) ← cold storage compresse
nginx logs ──► logrotate (quotidien) ← empeche les fichiers de grossir
daily, 14 rotations, compress
Logs recents (< 30 jours) : directement dans Grafana via Loki
{host="nginx", type="access"}
{host="nginx", type="vhost-access"} |= "gitlab"
{host="nginx", type="error"} |~ "5[0-9]{2}"
Logs archives (30-90 jours) : sur O2switch en .gz, consultables en SSH
ssh o2switch 'zcat ~/backup/logs/prod/nginx/access/2026-01-15.log.gz | grep "pattern"'
Note : Grafana ne peut pas interroger directement les archives O2switch. Si besoin d'un dashboard unifie hot+cold, il faudrait une datasource supplementaire (ex: re-ingerer ponctuellement dans Loki, ou ajouter un backend PHP sur O2switch avec une API de recherche). A evaluer en backlog si le besoin se confirme.
| Risque | Mitigation |
|---|---|
| Logrotate coupe un fichier pendant que Promtail le lit | Promtail utilise des positions, il reprend la lecture apres rotation. Le postrotate fait nginx rotate qui rouvre les fichiers proprement. |
| Loki query_range timeout sur gros volumes | Le script a limit=100000 lignes. Si insuffisant pour certains jours charges, augmenter ou paginer. |
| O2switch espace disque | Les logs gzip sont tres compresses (~95%). 90 jours de tous les hosts ≈ quelques centaines de Mo. |
systemctl status cron sur nginx VM = active/var/log/sync-logs-o2switch.log montre une execution reussiessh o2switch 'ls ~/backup/logs/prod/' montre les sous-dossiersls /var/log/nginx/*.gz montre les logs comprimes