Maintenance
Sauvegardes
Le plus simple : les scripts fournis (Docker)
./scripts/backup.sh /backups # dump PostgreSQL + volume médias + .env/compose/nginx
./scripts/restore.sh <prefixe> # restauration complète, interactive
backup.sh purge de lui-même les archives de plus de 7 jours. restore.sh détruit et recrée la base avant de restaurer : il demande confirmation.
Le reste de cette section décrit les opérations équivalentes à la main, utiles hors Docker.
Base de données
Docker :
# Sauvegarde
docker compose exec db pg_dump -U suddenly suddenly > backup_$(date +%Y%m%d).sql
# Restauration
cat backup.sql | docker compose exec -T db psql -U suddenly suddenly
VPS (bare metal) :
# Sauvegarde
sudo -u postgres pg_dump suddenly > backup_$(date +%Y%m%d).sql
# Restauration
sudo -u postgres psql suddenly < backup.sql
Automatiser avec cron (quotidien à 3h) :
0 3 * * * pg_dump -U suddenly suddenly > /backups/suddenly_$(date +\%Y\%m\%d).sql
Fichiers médias
Les uploads utilisateurs (avatars, images) sont dans le dossier media/.
Docker — sauvegarder le volume :
docker run --rm \
-v suddenly_media:/data \
-v /backups:/backup \
alpine tar czf /backup/media_$(date +%Y%m%d).tar.gz /data
VPS :
tar czf /backups/media_$(date +%Y%m%d).tar.gz /opt/suddenly/app/media/
Mise à jour
Docker
git pull origin main
docker compose build
docker compose up -d
Les migrations sont appliquées par scripts/entrypoint.sh au démarrage du conteneur web — pas besoin de les lancer à la main.
VPS
sudo -u suddenly bash << 'EOF'
cd /opt/suddenly/app
git pull origin main
source venv/bin/activate
pip install --upgrade pip && pip install -e ".[federation]"
python manage.py migrate
python manage.py collectstatic --noinput
EOF
sudo systemctl restart suddenly
sudo systemctl restart suddenly-celery suddenly-celery-beat # si Celery actif
Logs
Docker
docker compose logs -f web
docker compose logs -f celery
docker compose logs --tail=100 nginx
VPS
# Application
sudo journalctl -u suddenly -f
sudo tail -f /var/log/suddenly/error.log
# Nginx
sudo tail -f /var/log/nginx/suddenly_error.log
# PostgreSQL
sudo tail -f /var/log/postgresql/postgresql-16-main.log
Rotation des logs (VPS)
sudo tee /etc/logrotate.d/suddenly << 'EOF'
/var/log/suddenly/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 suddenly suddenly
sharedscripts
postrotate
systemctl reload suddenly > /dev/null 2>&1 || true
endscript
}
EOF
Monitoring
Health check
curl https://votre-instance.example.com/health/
# → {"status": "ok"}
Cet endpoint confirme seulement que Django répond : il ne teste ni la base, ni Redis. Une instance dont PostgreSQL est tombé renverra quand même
ok. Surveillez les services séparément.
Indicateurs à surveiller
| Indicateur | Seuil d'alerte |
|---|---|
| Utilisation CPU | > 80% soutenu |
| RAM disponible | < 200 Mo |
| Espace disque | < 20% libre |
| Queue Celery (Redis) | > 1000 tâches en attente |
| Taux d'erreur 5xx (Nginx) | > 1% |
Statut des services (VPS)
sudo systemctl status suddenly
sudo systemctl status suddenly-celery
sudo systemctl status postgresql
sudo systemctl status nginx
sudo systemctl status redis-server
Taches planifiees
Quand Celery Beat tourne, il planifie exactement deux tâches :
| Tâche | Fréquence | Effet |
|---|---|---|
cleanup_expired_quotes | toutes les heures | Supprime les citations éphémères arrivées à expiration |
refresh_remote_actors | une fois par jour | Rafraîchit les acteurs distants connus |
Si Celery n'est pas activé (petites instances), lancez-les via cron — sinon elles ne tournent jamais :
# Nettoyage des sessions expirées (quotidien)
0 3 * * * /opt/suddenly/app/venv/bin/python /opt/suddenly/app/manage.py clearsessions
# Nettoyage des citations ephemeres (toutes les heures)
0 * * * * /opt/suddenly/app/venv/bin/python /opt/suddenly/app/manage.py shell -c \
"from suddenly.activitypub.tasks import cleanup_expired_quotes; cleanup_expired_quotes()"
# Rafraichissement des acteurs distants (quotidien)
30 4 * * * /opt/suddenly/app/venv/bin/python /opt/suddenly/app/manage.py shell -c \
"from suddenly.activitypub.tasks import refresh_remote_actors; refresh_remote_actors()"
Infrastructure recommandee
| Taille | CPU | RAM | Disque | Redis | Celery |
|---|---|---|---|---|---|
| < 50 utilisateurs | 1 vCPU | 1 Go | 20 Go SSD | Non | Non |
| 50–500 utilisateurs | 2 vCPU | 2 Go | 50 Go SSD | Oui | Recommande |
| 500+ utilisateurs | 4 vCPU | 4 Go | 100 Go SSD | Oui | Oui |
OS supportés : Ubuntu 22.04 LTS ou 24.04 LTS, Debian 12+. Python 3.11 minimum.