Configuration
Toute la configuration se fait via des variables d'environnement (fichier .env ou variables système).
Variables requises
| Variable | Description | Exemple |
|---|---|---|
SECRET_KEY | Clé secrète Django (64+ caractères) | voir ci-dessous |
DOMAIN | Domaine de l'instance | then.suddenly.social |
DATABASE_URL | URL de connexion PostgreSQL | postgres://user:pass@host:5432/db |
En production, ces trois variables sont obligatoires : leur absence fait échouer le démarrage.
Générer une SECRET_KEY :
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
Variables optionnelles
Sécurité
| Variable | Défaut | Description |
|---|---|---|
ALLOWED_HOSTS | valeur de DOMAIN | Hôtes autorisés (virgule-séparés) |
DEBUG,SECURE_SSL_REDIRECT,SESSION_COOKIE_SECUREetCSRF_COOKIE_SECUREne sont pas des variables d'environnement. Le durcissement est décidé par le fichier de settings :config.settings.productionforceDEBUG=False, les cookiesSecureet HSTS (1 an, sous-domaines inclus). La redirection HTTPS est assurée par nginx, pas par Django. Il suffit donc de pointerDJANGO_SETTINGS_MODULEsurconfig.settings.production.
Cache et workers
| Variable | Défaut | Description |
|---|---|---|
REDIS_URL | None | URL Redis — absent = DB cache + Celery synchrone |
DJANGO_LOG_LEVEL | INFO | Verbosité des logs |
Si
REDIS_URLest absent, Suddenly bascule automatiquement sur le cache base de données etCELERY_TASK_ALWAYS_EAGER=True. Pensez seulement à créer la table de cache (manage.py createcachetable).
Stockage des médias
| Variable | Défaut | Description |
|---|---|---|
AWS_STORAGE_BUCKET_NAME | None | Absent = stockage sur le disque local (media/) |
AWS_S3_ENDPOINT_URL | None | Endpoint S3 / Cloudflare R2 |
AWS_S3_REGION_NAME | auto | Région |
AWS_ACCESS_KEY_ID | — | Requis si un bucket est défini |
AWS_SECRET_ACCESS_KEY | — | Requis si un bucket est défini |
Fédération et divers
| Variable | Défaut | Description |
|---|---|---|
AP_SIGNATURE_MAX_SKEW | 300 | Tolérance d'horloge (s) pour les signatures HTTP |
AP_ALLOW_INSECURE_HTTP | 0 | N'autoriser le HTTP non chiffré qu'en développement |
INGEST_TOKEN | "" | Jeton d'ingestion des comptes rendus externes — vide = endpoint désactivé |
FEED_PROMO_EVERY | 6 | Fréquence des cartes « personnage à faire circuler » dans le fil |
LANGUAGE_CODE | fr | Langue par défaut de l'instance |
| Variable | Défaut | Description |
|---|---|---|
EMAIL_HOST | None | Serveur SMTP |
EMAIL_PORT | 587 | Port SMTP |
EMAIL_HOST_USER | None | Identifiant SMTP |
EMAIL_HOST_PASSWORD | None | Mot de passe SMTP |
EMAIL_USE_TLS | True | TLS activé |
DEFAULT_FROM_EMAIL | None | Adresse expéditeur |
Exemple de fichier .env complet
Le dépôt fournit un .env.example à copier. Version minimale annotée :
# Requis
SECRET_KEY=votre-cle-tres-longue-generee-avec-django
DOMAIN=mon-instance.example.com
DATABASE_URL=postgres://suddenly:motdepasse-fort@localhost:5432/suddenly
ALLOWED_HOSTS=mon-instance.example.com
# Redis (optionnel — absent = DB cache + Celery synchrone)
REDIS_URL=redis://localhost:6379/0
# Email (absent = les mails partent dans le vide)
EMAIL_HOST=smtp.example.com
EMAIL_PORT=587
EMAIL_HOST_USER=noreply@example.com
EMAIL_HOST_PASSWORD=mdp-email
DEFAULT_FROM_EMAIL=noreply@example.com
# Logs
DJANGO_LOG_LEVEL=INFO
Si aucun
EMAIL_HOSTn'est défini, Django utilise le backenddummy: les mails de confirmation d'inscription sont silencieusement jetés. Configurez le SMTP avant d'ouvrir les inscriptions.
Initialisation post-installation
Après chaque déploiement ou mise à jour :
# Migrations de base de données
python manage.py migrate
# Cache table (si pas de Redis)
python manage.py createcachetable
# Fichiers statiques
python manage.py collectstatic --noinput
Les clés ActivityPub n'ont pas à être créées à la main : les clés d'instance sont générées au premier besoin, celles des acteurs à leur création.
Configuration de l'instance
Deux interfaces, deux rôles.
Le panel d'instance (/gmh/) — réservé aux comptes marqués administrateurs d'instance (manage.py set_admin) :
- Réglages : nom de l'instance, description, langue, inscriptions ouvertes ou fermées, appels aux dons
- Instances distantes : consulter les serveurs fédérés connus et en bloquer un
- Utilisateurs : consulter et suspendre un compte
L'admin Django (/admin) — accès bas niveau à tous les modèles, y compris les signalements de contenu et les blocages entre utilisateurs.
Les inscriptions sont un simple booléen : ouvertes ou fermées. Il n'existe pas de mode « sur invitation ». Côté fédération, il n'y a pas de whitelist : on ne peut que bloquer une instance connue.
Checklist post-déploiement
[ ] HTTPS fonctionne
[ ] WebFinger répond : /.well-known/webfinger?resource=acct:admin@domain
[ ] NodeInfo accessible : /.well-known/nodeinfo
[ ] Endpoint de sante : GET /health/ → {"status": "ok"}
[ ] Création de compte fonctionne
[ ] Upload de media fonctionne
[ ] Federation testee avec une autre instance Suddenly ou Mastodon