Aller au contenu

Sauvegardes self-hosting

cenaclo-backup.sh est le backup applicatif de reference pour une instance Cenaclo auto-hebergee. Il produit une archive .tar.gz.age chiffree avec la passphrase de l’installation, distincte des backups natifs Coolify ou Postgres. Ces backups natifs restent utiles pour l’operateur, mais ils ne remplacent pas l’archive Cenaclo : ils ne portent pas le meme chiffrement applicatif et ne couvrent pas toute la strategie SeaweedFS. Cette page suit ADR-016 pour le chiffrement age et ADR-019 pour le deploiement Coolify ou Docker Compose sans script d’installation separe.

Par defaut, le script inclut le dump Postgres, le snapshot de configuration et les objets SeaweedFS accessibles via l’endpoint S3-compatible configure pour l’instance. C’est le mode le plus simple pour les petites communautes ou les instances dont les attachments et replays restent modestes. Pour une communaute avec beaucoup de replays, ce mode copie tout le bucket localement avant chiffrement : verifie l’espace disque disponible ou utilise l’archive legere ci-dessous.

Dans Coolify, ajoute la passphrase comme secret du service backend, puis cree une scheduled task quotidienne :

Fenêtre de terminal
/usr/local/bin/cenaclo-backup.sh --output-dir /var/backups/cenaclo

Dans un deploiement Docker Compose standalone, lance la meme commande depuis le service backend :

Fenêtre de terminal
docker compose --env-file infra/compose/.env -f infra/compose/docker-compose.yml exec -T backend \
/usr/local/bin/cenaclo-backup.sh --output-dir /var/backups/cenaclo

La source recommandee est CENACLO_BACKUP_PASSPHRASE_FILE, qui pointe vers un fichier hors Git monte en lecture seule, mode 0600, lisible uniquement par le processus qui lance le backup. CENACLO_BACKUP_PASSPHRASE reste supporte pour les environnements qui n’ont pas de montage de fichier, mais doit etre gere comme un secret d’environnement, jamais comme une variable normale de tache planifiee. Ne colle jamais la passphrase dans Git, dans une commande shell ou dans les logs Coolify.

Les replays video peuvent depasser 10 Go par communaute active. Dans ce cas, le mode recommande est de garder le backup applicatif quotidien pour Postgres et la configuration, puis de synchroniser les objets SeaweedFS vers un stockage S3 externe dedie.

Commande quotidienne pour l’archive legere :

Fenêtre de terminal
/usr/local/bin/cenaclo-backup.sh --output-dir /var/backups/cenaclo --no-storage

--no-storage exclut uniquement les objets SeaweedFS de l’archive. Le dump Postgres, le snapshot de configuration et le chiffrement age restent actifs.

Ajoute ensuite une synchronisation hebdomadaire rclone vers un bucket externe controle par l’operateur, par exemple Scaleway Object Storage, OVH Object Storage ou Garage. Le remote source cenaclo_storage: doit etre configure dans un rclone.conf hors depot, mode 0600, pointe via RCLONE_CONFIG au moment de la tache planifiee. Ce remote pointe vers le gateway S3 SeaweedFS de l’instance. Le bucket source doit correspondre a la valeur S3_BUCKET de l’installation.

rclone sync supprime sur la destination les objets qui n’existent plus dans SeaweedFS. Active le versioning/retention cote fournisseur quand c’est disponible et garde un --backup-dir date pour les objets remplaces ou supprimes :

Fenêtre de terminal
rclone sync cenaclo_storage:<S3_BUCKET> scaleway:cenaclo-storage/prod \
--fast-list \
--checksum \
--backup-dir "scaleway:cenaclo-storage/deleted/$(date +%Y-%m-%d)" \
--transfers 8 \
--checkers 16

Garde les credentials rclone dans les secrets Coolify ou dans un fichier de configuration hors depot. Ne passe pas les secrets S3 dans la ligne de commande et evite les variables d’environnement longues si un fichier rclone.conf protege est possible.

Le script peut aussi envoyer l’archive chiffree vers une destination rclone apres creation locale :

Fenêtre de terminal
/usr/local/bin/cenaclo-backup.sh \
--output-dir /var/backups/cenaclo \
--rclone-remote cenaclo_backup_offsite:cenaclo-backups/prod

Cette option deplace l’archive .tar.gz.age, pas les objets SeaweedFS bruts. Pour les grosses communautes, combine-la avec --no-storage et la synchronisation hebdomadaire des objets.

Restaure d’abord l’archive applicative avec la passphrase d’origine :

Fenêtre de terminal
/usr/local/bin/cenaclo-restore.sh /var/backups/cenaclo/cenaclo-backup-YYYYMMDDTHHMMSSZ.tar.gz.age

Si les objets SeaweedFS ont ete conserves par rclone externe, restaure-les avec la commande inverse avant de rouvrir le trafic utilisateur :

Fenêtre de terminal
rclone sync scaleway:cenaclo-storage/prod cenaclo_storage:<S3_BUCKET> \
--fast-list \
--checksum \
--transfers 8 \
--checkers 16

Dans ce mode, lance le restore applicatif avec --skip-storage si l’archive ne contient pas de repertoire storage/seaweedfs ou si tu veux laisser rclone reprendre explicitement la restauration objet.