Skip to content

Exploitation

Codex edited this page Oct 14, 2026 · 5 revisions

Exploitation

Sauvegarde

Tout l'état du site est dans STORAGE_DIR : la base SQLite (avec les jetons d'horodatage, les statistiques et la file Instagram), les originaux, le logo du filigrane, les fichiers de marque et les variantes. Les variantes se recalculent et peuvent être exclues de la sauvegarde. Les originaux doivent être sauvegardés à l'identique : une preuve d'antériorité ne vaut qu'avec le fichier exact qu'elle désigne.

En déploiement Docker, le service backup s'en charge chaque jour : voir Déploiement. Hors Docker : BACKUP_DIR=… npm run backup (même format que le service backup, voir Configuration), ou à la main :

sqlite3 storage/site.db ".backup 'sauvegarde/site-$(date +%F).db'"
rsync -a storage/originals storage/watermarks storage/brand sauvegarde/

Pour restaurer :

  1. Arrêter le serveur.
  2. Remettre site.db (et supprimer site.db-wal et site.db-shm s'ils traînent), originals/, watermarks/ et brand/ en place.
  3. Démarrer : les variantes manquantes sont recalculées au démarrage (ou d'avance avec npm run variants).

Le jeton Instagram est chiffré avec INSTAGRAM_TOKEN_KEY, ou à défaut avec COOKIE_SECRET : restaurer la base sur un serveur qui a une autre clé impose de reconnecter le compte Instagram.

Journaux

Le serveur écrit en JSON sur la sortie standard (pino, via Fastify). Les adresses IP y sont tronquées (/24 en IPv4, /48 en IPv6) ; le code et le state OIDC et le jeton d'image Instagram sont masqués dans les URL. En Docker, les journaux sont bornés à 3 × 10 Mo par conteneur. À surveiller :

Message Signification
connexion admin ouverture de session (sub)
connexion sans le rôle admin tentative refusée
connexion refusée par le fournisseur, échec de la vérification OIDC connexion annulée chez Zitadel, ou réponse invalide
OIDC_ORG_ID non défini : … au démarrage : définir OIDC_ORG_ID
variantes régénérées fin d'un recalcul (changed : nombre de photos)
rendu des variantes impossible original illisible (photo indiquée)
fournisseur OIDC injoignable Zitadel ne répond pas
originaux horodatés jetons obtenus (done : nombre)
action admin journal d'audit : sub, action, paramètres, statut
erreur inattendue erreur serveur (le visiteur ne voit qu'un message générique)
horodatage impossible, nouvel essai plus tard autorité d'horodatage injoignable ou jeton refusé
authentification locale de test active ne doit jamais apparaître en production
import de photos, photo envoyée, rendu impossible à l’import imports (nombre importé / refusé, photo, fichier illisible)
publié sur Instagram, publication Instagram impossible, jeton Instagram non renouvelé file Instagram
base de données indisponible /healthz répond 503
sauvegarde terminée, sauvegarde en échec conteneur backup (même contenu que last.json)

Opérations courantes

Les marches à suivre ponctuelles (mise à jour, chiffrement, deux facteurs, e-mails, app iPhone, demande RGPD, violation, restauration) sont dans Procédures.

Besoin Action
Recalculer les images npm run variants (-- --force pour tout)
Changer le nom du site Admin → Réglages, ou SITE_NAME
Retirer l'accès à quelqu'un retirer son rôle admin dans Zitadel (effet sous 24 h) ; pour un effet immédiat, supprimer ses sessions : DELETE FROM sessions WHERE sub = '…'
Déconnecter tout le monde DELETE FROM sessions
Appliquer les migrations automatique au démarrage, ou npm run migrate

Dépannage

Symptôme Piste
Le serveur refuse de démarrer : COOKIE_SECRET site « en ligne » (HTTPS ou production) : définir un secret de 32 caractères ou plus
LOCAL_AUTH_TOKEN est réservé aux tests retirer cette variable en ligne
… n'est pas un montage : les données seraient perdues REQUIRE_PERSISTENT_STORAGE=1 (image Docker) et /data non monté : monter le dossier de l'hôte (DATA_DIR)
Dossier des données introuvable, erreur d'accès en écriture dossier absent, ou propriétaire différent de l'utilisateur du conteneur (APP_UID/APP_GID, 99:100 sur Unraid)
/auth/login répond 503 OIDC non configuré (OIDC_ISSUER, OIDC_CLIENT_ID)
502 à la connexion Zitadel injoignable depuis le serveur
« Connexion expirée » retour de Zitadel après plus de 10 minutes, ou cookies bloqués
« Trop de tentatives » (429) limite de connexions atteinte pour cette IP : attendre 10 minutes, ou ajuster AUTH_RATE_LIMIT
Image absente sur le site photo en brouillon, ou recalcul en cours (voir le bandeau dans l'admin)
Filigrane dans une police inattendue vérifier que assets/fonts/ est bien déployé
Photos « en attente » d'horodatage accès sortant vers TSA_URL bloqué, ou autorité indisponible ; reprise automatique, ou bouton « Réessayer maintenant »

Clone this wiki locally