Configuration

Toute la configuration se fait via des variables d'environnement (fichier .env ou variables système).

Variables requises

VariableDescriptionExemple
SECRET_KEYClé secrète Django (64+ caractères)voir ci-dessous
DOMAINDomaine de l'instancethen.suddenly.social
DATABASE_URLURL de connexion PostgreSQLpostgres://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é

VariableDéfautDescription
ALLOWED_HOSTSvaleur de DOMAINHôtes autorisés (virgule-séparés)

DEBUG, SECURE_SSL_REDIRECT, SESSION_COOKIE_SECURE et CSRF_COOKIE_SECURE ne sont pas des variables d'environnement. Le durcissement est décidé par le fichier de settings : config.settings.production force DEBUG=False, les cookies Secure et HSTS (1 an, sous-domaines inclus). La redirection HTTPS est assurée par nginx, pas par Django. Il suffit donc de pointer DJANGO_SETTINGS_MODULE sur config.settings.production.

Cache et workers

VariableDéfautDescription
REDIS_URLNoneURL Redis — absent = DB cache + Celery synchrone
DJANGO_LOG_LEVELINFOVerbosité des logs

Si REDIS_URL est absent, Suddenly bascule automatiquement sur le cache base de données et CELERY_TASK_ALWAYS_EAGER=True. Pensez seulement à créer la table de cache (manage.py createcachetable).

Stockage des médias

VariableDéfautDescription
AWS_STORAGE_BUCKET_NAMENoneAbsent = stockage sur le disque local (media/)
AWS_S3_ENDPOINT_URLNoneEndpoint S3 / Cloudflare R2
AWS_S3_REGION_NAMEautoRégion
AWS_ACCESS_KEY_IDRequis si un bucket est défini
AWS_SECRET_ACCESS_KEYRequis si un bucket est défini

Fédération et divers

VariableDéfautDescription
AP_SIGNATURE_MAX_SKEW300Tolérance d'horloge (s) pour les signatures HTTP
AP_ALLOW_INSECURE_HTTP0N'autoriser le HTTP non chiffré qu'en développement
INGEST_TOKEN""Jeton d'ingestion des comptes rendus externes — vide = endpoint désactivé
FEED_PROMO_EVERY6Fréquence des cartes « personnage à faire circuler » dans le fil
LANGUAGE_CODEfrLangue par défaut de l'instance

Email

VariableDéfautDescription
EMAIL_HOSTNoneServeur SMTP
EMAIL_PORT587Port SMTP
EMAIL_HOST_USERNoneIdentifiant SMTP
EMAIL_HOST_PASSWORDNoneMot de passe SMTP
EMAIL_USE_TLSTrueTLS activé
DEFAULT_FROM_EMAILNoneAdresse 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_HOST n'est défini, Django utilise le backend dummy : 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