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

IndicateurSeuil 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âcheFréquenceEffet
cleanup_expired_quotestoutes les heuresSupprime les citations éphémères arrivées à expiration
refresh_remote_actorsune fois par jourRafraî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

TailleCPURAMDisqueRedisCelery
< 50 utilisateurs1 vCPU1 Go20 Go SSDNonNon
50–500 utilisateurs2 vCPU2 Go50 Go SSDOuiRecommande
500+ utilisateurs4 vCPU4 Go100 Go SSDOuiOui

OS supportés : Ubuntu 22.04 LTS ou 24.04 LTS, Debian 12+. Python 3.11 minimum.