Rustwarden
Framework Rust pour la gestion d'utilisateurs et l'authentification securisee. Permet de creer rapidement des applications web avec authentification JWT, RBAC granulaire, gestion d'emails, et panneau d'administration.
Fonctionnalites
- Authentification JWT avec refresh tokens et blacklist automatique
- RBAC granulaire (roles + permissions par ressource)
- Panneau d'administration complet (CRUD users, roles, permissions, settings)
- Validation d'email avec token
- Reset de mot de passe par email (confirmation double-etape)
- File d'attente d'emails avec retry automatique
- Detection de bounces IMAP
- Protection CSRF
- Rate limiting configurable
- Internationalisation (fr, en, de, es)
- Middleware d'authentification et d'autorisation
- Mode headless (API-only) cle en main : routeur d'auth JSON canonique
rustwarden_core::auth::auth_api_routes()monte en une ligne, comportement d'echec d'auth configurable (redirection verslogin_pathou401JSON) - Outil
screen-select: genere le plan des ecrans UI a coder selon les fonctionnalites activees (docs/plans/ui-screens.md) puis recoche le realise par analyse statique (-- --check) — pour les UIs custom/headless - Conformite ANSSI (complexite des mots de passe, HttpOnly cookies, etc.)
- OAuth2 / OpenID Connect (Google, GitHub, Discord, Microsoft) avec architecture extensible
- Federation ActivityPub optionnelle (RFC 0001+) : WebFinger, NodeInfo, login AP-native, invitations d'equipe cross-instance, modele de confiance allowlist/blocklist — fournie par le crate
rustwarden-fediverse - Variable
APP_NAMEpour personnaliser le branding partout dans l'UI
Architecture
rustwarden/ ├── crates/ │ ├── rustwarden-core/ # Library : auth, RBAC, services, middleware, i18n, hooks │ ├── rustwarden-ui/ # UI optionnelle : templates HTML, admin panel, handlers │ ├── rustwarden-fediverse/ # Federation ActivityPub optionnelle (RFC 0001+) │ ├── rustwarden-fediverse-ui/ # UI HTML de reference pour la federation │ └── rustwarden-fediverse-guard/ # Detection d'abus et bans pour la federation (RFC 0028+) ├── app/ # Application de reference (12 lignes de main.rs) ├── tools/ │ └── rustwarden-cli/ # Wizard interactif pour creer ou updater de nouveaux projets ├── locales/ # Fichiers de traduction (YAML) ├── static/ # Fichiers statiques (CSS, JS, images) ├── database/ # Docker Compose pour PostgreSQL └── docs/ # Documentation complementaire └── .env # Variable d'environnement
Crates
| Crate | Description |
|---|---|
rustwarden-core | Authentification JWT, modeles SeaORM, services (users, roles, permissions, email), middleware (auth, admin, CSRF, rate-limit), i18n, background tasks, hooks |
rustwarden-ui | Interface HTML par defaut (login, profil, admin panel) avec Askama, DaisyUI, HTMX |
rustwarden-fediverse | Federation ActivityPub (WebFinger, NodeInfo, actor, inbox, signatures HTTP, auth AP-native, invitations cross-instance, worker outbound, modele de confiance allowlist/blocklist) — optionnel via feature Cargo fediverse |
rustwarden-fediverse-ui | UI HTML de reference pour la federation : handlers admin/login/consent/invite, templates Askama, carte dashboard injectable |
rustwarden-fediverse-guard | Detection d'abus temps reel et gestion de bans pour la couche federation (RFC 0028+) — optionnel |
rustwarden-app | Binaire de reference utilisant le builder |
rustwarden-cli | Wizard CLI interactif pour scaffolder des applications autonomes |
Stack technique
- Backend : Rust, Axum 0.8, SeaORM 2.0, Tokio
- Auth : JWT (HS256), bcrypt, sessions en memoire ou SeaORM
- Database : PostgreSQL
- Frontend (UI) : Askama, Tailwind CSS, DaisyUI, HTMX, Alpine.js
- Email : Lettre (SMTP), IMAP bounce detection
Demarrage rapide
Option 1 : Wizard CLI (recommande)
Le wizard interactif genere un projet autonome avec toute la configuration deja remplie.
# Compiler le wizard cargo build -p rustwarden-cli # Lancer le wizard cargo run -p rustwarden-cli -- start-project
Le wizard demande interactivement :
- Nom du projet (nom technique du crate)
- Nom affiche (APP_NAME dans l'interface)
- Description
- Dossier cible
- Mode (interface web ou API seule, federation optionnelle : aucune / headless / avec UI de reference)
- Migrations automatiques (oui/non)
- Port du serveur
- Base de donnees (nom, utilisateur, mot de passe)
- Administrateur (username, email, mot de passe)
- SMTP (optionnel : host, port, identifiants)
Il genere un projet autonome avec :
- Les crates
rustwarden-coreetrustwarden-uicopies localement .envconfigure avec vos identifiantsdatabase/.envpour Docker PostgreSQL- Un
README.mdet unDEVELOPER.mddetaille - Une page d'accueil personnalisee avec le nom de votre application
- Les templates HTML rebrandes automatiquement
# Apres generation cd mon-app # PostgreSQL n'ecoute que 127.0.0.1:5432. Copier database/env.sample vers # database/.env et definir POSTGRES_PASSWORD (obligatoire, pas de repli). cp database/env.sample database/.env cd database && docker compose up -d && cd .. cargo run # Ouvrir http://localhost:3000
Option 2 : Comme dependance dans un projet existant
[dependencies] rustwarden-core = { path = "../rustwarden/crates/rustwarden-core" } rustwarden-ui = { path = "../rustwarden/crates/rustwarden-ui" } # optionnel
use rustwarden_core::prelude::*; #[tokio::main] async fn main() -> anyhow::Result<()> { RustwardenApp::builder() .from_env() .with_ui(rustwarden_ui::default_routes) .auto_migrate(true) .merge_routes(my_routes()) .build() .await? .run() .await }
Option 3 : Mode headless (API-only)
RustwardenApp::builder() .from_env() .headless() // API-only : echec d'auth = 401 JSON (au lieu d'une redirection) .merge_machine_routes(rustwarden_core::auth::auth_api_routes()) // API d'auth /api/v1/auth/* prete a l'emploi .merge_routes(my_api_routes()) // vos routes metier .build() .await? .run() .await
En mode headless, aucun prefixe protege n'est enregistre par defaut : declarez
les votres via .register_protected_prefix("/…"). Le chemin de login (login_path)
et le mode d'echec (auth_failure_mode) sont configurables — voir la section
Configuration.
Pour planifier les ecrans d'une UI custom, le binaire screen-select (livre avec
rustwarden-core) genere docs/plans/ui-screens.md — la liste des ecrans a coder
selon les fonctionnalites activees — puis recoche le realise par analyse statique
des routes :
cargo run -p rustwarden-core --bin screen-select # wizard : selection des fonctionnalites → plan cargo run -p rustwarden-core --bin screen-select -- --check # controle de couverture (recoche le realise)
Catalogue des ecrans et limites de detection : docs/SERVICES_REFERENCE.md §22.
Builder API
RustwardenApp::builder() .from_env() // charge .env + init logging .database_url("postgres://...") // ou .database(db_connection) .address("0.0.0.0:8080") // adresse du serveur .with_ui(rustwarden_ui::browser_routes) // UI SSR (canal browser, CSRF) .merge_machine_routes(rustwarden_ui::api_routes()) // API JSON de l'UI (canal machine, sans CSRF) .headless() // OU mode API-only (pas d'UI) → echec d'auth = 401 JSON .login_path("/connexion") // chemin de redirection de login (defaut "/login") .auth_failure_mode(AuthFailureMode::Json401) // Redirect (defaut UI) ou Json401 (defaut headless) .merge_browser_routes(custom_ui_router) // pages SSR mutantes → CSRF applique .merge_machine_routes(custom_api_router) // API JSON / webhooks → sans CSRF .register_protected_prefix("/espace") // auth requise sur ce prefixe .hooks(MyHooks) // lifecycle hooks personnalises .auto_migrate(true) // migrations auto au demarrage .without_email() // desactiver l'email .without_background_tasks() // desactiver les taches de fond .locale_dir("my_locales") // repertoire de traductions .supported_locales(vec!["fr", "en"]) // locales supportees .default_locale("fr") // locale par defaut .build().await? .run().await
with_ui/merge_browser_routes= canal browser (CSRF applique) ;merge_machine_routes= canal machine (API Bearer/JSON, sans CSRF).rustwarden_ui::default_routesest deprecie (remettrait/api/v1/*sous CSRF) → utiliserbrowser_routes()+api_routes().
Sequencement interne du builder
- Connexion a la base PostgreSQL
- Migrations automatiques (si active)
- Creation admin par defaut + initialisation app_settings
- Configuration auth (JWT, sessions)
- Demarrage des taches de fond (email queue, IMAP bounce, JWT cleanup)
- Chargement i18n
- Assemblage du router (UI + routes custom + middleware)
- Demarrage du serveur HTTP
Mise a jour du framework (projets generes)
Les projets generes par le wizard embarquent les crates du framework en local (vendored). Pour les resynchroniser sur une version plus recente :
# Depuis le depot Rustwarden (le wizard demande le dossier du projet cible) cargo run -p rustwarden-cli -- update-project
La commande synchronise les crates presentes dans le projet (rustwarden-core,
rustwarden-ui, rustwarden-fediverse* selon le cas — binaire screen-select inclus),
preserve les templates personnalises, supprime les fichiers retires du framework,
propose d'ajouter la federation si elle est absente, puis rappelle les actions
post-update (cargo check, migrations, screen-select).
Procedure manuelle (fallback)
# Depuis le dossier du projet consommateur rm -rf crates/rustwarden-core crates/rustwarden-ui cp -r /chemin/vers/Rustwarden/crates/rustwarden-core crates/ cp -r /chemin/vers/Rustwarden/crates/rustwarden-ui crates/ # Fichiers partages (si modifies) cp -r /chemin/vers/Rustwarden/locales ./ cp -r /chemin/vers/Rustwarden/static ./
Verifier ensuite les breaking changes :
- exports du prelude (signatures de
RustwardenApp,AuthUser,Claims, etc.) - migrations :
core_migrations()danssrc/migrations.rsa jour - contrat des templates (variables
LayoutContext) - versions des dependances dans
Cargo.toml(les versions recentes ont change : thiserror 2.0, askama 0.15, jsonwebtoken 10, rand 0.9, etc.)
Puis compiler :
cargo check cargo clippy -- -D warnings
Routes disponibles
Routes publiques
| Methode | Chemin | Description |
|---|---|---|
| GET | / | Redirection vers /home ou /login |
| GET | /login | Page de connexion / inscription |
| GET | /resend-verification | Renvoi de l'email de verification |
| GET | /reset-password | Page de reinitialisation du mot de passe |
| GET | /confirm-password-change | Confirmation de changement de mot de passe |
| GET | /health | Health check |
API REST (authentification)
| Methode | Chemin | Description |
|---|---|---|
| POST | /api/v1/auth/login | Connexion (retourne JWT + refresh token) |
| POST | /api/v1/auth/register | Inscription |
| POST | /api/v1/auth/refresh | Rafraichir le JWT |
| POST | /api/v1/auth/logout | Deconnexion (blacklist le JWT) |
| GET | /api/v1/auth/me | Profil de l'utilisateur connecte |
| POST | /api/v1/auth/forgot-password | Demander un reset de mot de passe |
| POST | /api/v1/auth/reset-password | Executer le reset |
| GET | /api/v1/auth/verify-email/{token} | Verifier l'adresse email |
| POST | /api/v1/auth/resend-verification | Renvoyer le mail de verification |
| POST | /api/v1/auth/resend-verification/by-username | Idem, par username |
| POST | /api/v1/auth/2fa/verify | Verifier le code 2FA (challenge de login) |
Cet ensemble est fourni cle en main par
rustwarden_core::auth::auth_api_routes()(a monter viamerge_machine_routes). En mode UI,rustwarden_ui::api_routes()monte exactement le meme jeu de routes.
API REST (OAuth) (feature oauth)
| Methode | Chemin | Description |
|---|---|---|
| GET | /api/v1/auth/oauth/{provider}/redirect | Redirige vers le provider OAuth |
| GET | /api/v1/auth/oauth/{provider}/callback | Callback du provider OAuth |
| GET | /api/v1/auth/oauth/providers | Liste les providers actifs (JSON) |
| GET | /api/v1/auth/oauth/accounts | Liste les comptes OAuth de l'utilisateur |
| DELETE | /api/v1/auth/oauth/accounts/{id} | Delie un compte OAuth |
API REST (utilisateurs)
| Methode | Chemin | Description |
|---|---|---|
| GET | /api/v1/users | Lister les utilisateurs |
| POST | /api/v1/users | Creer un utilisateur |
Pages UI (authentification requise)
| Methode | Chemin | Description |
|---|---|---|
| GET | /home | Page d'accueil |
| GET | /profile | Page profil |
| PUT | /profile | Mettre a jour le profil |
| GET | /settings/password | Page changement de mot de passe |
| PUT | /settings/password | Changer le mot de passe |
| DELETE | /settings/password/pending | Annuler un changement en attente |
| GET | /settings/sessions | Page des sessions actives |
| DELETE | /settings/sessions/{id} | Revoquer une session |
| GET | /settings/preferences | Page des preferences |
| PUT | /settings/preferences | Mettre a jour les preferences |
Pages admin (role admin requis)
| Methode | Chemin | Description |
|---|---|---|
| GET | /admin | Dashboard d'administration |
| GET | /admin/users | Liste des utilisateurs |
| GET | /admin/users/create | Formulaire de creation |
| POST | /admin/users | Creer un utilisateur |
| GET | /admin/users/{id} | Formulaire d'edition |
| PUT | /admin/users/{id} | Mettre a jour un utilisateur |
| DELETE | /admin/users/{id} | Supprimer un utilisateur |
| POST | /admin/users/{id}/reset-password | Reinitialiser le mot de passe |
| POST | /admin/users/{id}/reset-password-email | Envoyer un email de reinitialisation |
| GET | /admin/roles | Liste des roles |
| GET | /admin/roles/create | Formulaire de creation de role |
| POST | /admin/roles | Creer un role |
| GET | /admin/roles/{id} | Formulaire d'edition de role |
| PUT | /admin/roles/{id} | Mettre a jour un role |
| DELETE | /admin/roles/{id} | Supprimer un role |
| GET | /admin/settings | Parametres de l'application |
| PUT | /admin/settings | Mettre a jour les parametres |
| GET | /admin/errors | Page de test d'erreurs |
Pages admin federation (feature fediverse)
Quand le binaire est compile avec --features fediverse, le dashboard admin affiche une carte "Federation ActivityPub" qui pointe vers /admin/fediverse/settings. Depuis ce hub :
| Methode | Chemin | Description |
|---|---|---|
| GET | /admin/fediverse/settings | Toggle d'activation + selecteurs (mode de confiance, scope d'interop, authorized-fetch) |
| POST | /admin/fediverse/settings | Sauvegarder les reglages |
| GET | /admin/fediverse/trust_list | Liste de confiance (allowlist ou blocklist selon le mode) |
| POST | /admin/fediverse/trust_list/add | Ajouter un domaine |
| POST | /admin/fediverse/trust_list/delete | Retirer un domaine |
| GET | /admin/fediverse/queue | Dashboard de la file d'envoi outbound (RFC 0011) |
| GET | /admin/fediverse/sessions_remote | Sessions distantes actives |
| POST | /admin/fediverse/sessions_remote/revoke | Revoquer une session distante |
| POST | /admin/fediverse/sessions_remote/kill_domain | Kill-switch par domaine |
| GET | /admin/fediverse/nodeinfo | Stats NodeInfo humanisees |
| GET | /admin/teams/{id}/invites | Invitations d'equipe cross-instance |
Cote utilisateur final, le flow de connexion federee est expose sur /login/fediverse (et son SSE /login/fediverse/sse/{id}), l'ecran de consentement IdP sur /fediverse/consent/{id}, et la page d'acceptation d'invitation sur /fediverse/invite/{id}. Le profil utilisateur expose /profile/connected_apps pour lister les instances qu'il a autorisees.
Endpoints protocole (publics, hors UI) (feature fediverse)
| Methode | Chemin | Description |
|---|---|---|
| GET | /.well-known/webfinger?resource=acct:user@domain | Resolution WebFinger RFC 7033 |
| GET | /.well-known/nodeinfo | Discovery NodeInfo |
| GET | /nodeinfo/2.1 | Document NodeInfo 2.1 |
| GET | /users/{username} | Person actor JSON (avec content negotiation) |
| POST | /inbox | Inbox AP (Update / Delete / Revoke) |
| POST | /fediverse/auth/inbox | Inbox AP-native pour AuthRequest / Accept / Reject |
Hooks (extension)
Implementez RustwardenHooks pour ajouter de la logique metier aux evenements du framework :
use rustwarden_core::prelude::*; use async_trait::async_trait; use sea_orm::DatabaseConnection; use uuid::Uuid; struct MyHooks; #[async_trait] impl RustwardenHooks for MyHooks { async fn on_user_registered(&self, db: &DatabaseConnection, user_id: Uuid, username: &str) -> anyhow::Result<()> { // Creer un workspace par defaut pour le nouvel utilisateur Ok(()) } async fn on_user_login(&self, db: &DatabaseConnection, user_id: Uuid, username: &str) -> anyhow::Result<()> { // Logger l'activite, envoyer une notification... Ok(()) } }
Activez les hooks dans le builder :
RustwardenApp::builder() .from_env() .hooks(MyHooks) .build() .await? .run() .await
Hooks disponibles
| Hook | Declencheur |
|---|---|
on_user_registered | Apres inscription d'un utilisateur |
on_user_login | Apres connexion reussie |
on_user_logout | Apres deconnexion |
on_password_changed | Apres changement de mot de passe |
on_email_verified | Apres verification de l'email |
on_role_changed | Apres modification des roles |
on_resource_shared | Apres partage d'une ressource |
on_resource_unshared | Apres revocation d'un partage |
on_oauth_login | Apres login OAuth reussi (provider + is_new_user) |
RBAC (Roles et Permissions)
Le systeme RBAC permet de definir des roles avec des permissions granulaires.
Modele
- Role : nom unique (ex:
admin,editor,viewer) - Permission : nom unique (ex:
users.read,users.create,articles.publish) - Role-Permission : table de liaison many-to-many
- User-Role : table de liaison many-to-many
Utilisation dans les handlers
use rustwarden_core::services::permission_service::PermissionService; use rustwarden_core::services::role_service::RoleService; // Verifier si un utilisateur a une permission specifique let has_perm = PermissionService::user_has_permission(&db, user_id, "articles.publish").await?; // Recuperer les roles d'un utilisateur let roles = RoleService::get_user_roles(&db, user_id).await?;
Administration
Le panneau d'administration (/admin/roles) permet de :
- Creer / modifier / supprimer des roles
- Attribuer des permissions aux roles
- Assigner des roles aux utilisateurs
Configuration (.env)
Application
| Variable | Description | Defaut |
|---|---|---|
APP_NAME | Nom affiche dans l'interface et les emails | My App |
APP_THEME | Theme de l'application | light |
APP_DEBUG | Mode debug | false |
DEFAULT_LOCALE | Locale par defaut | fr |
Base de donnees
| Variable | Description | Defaut |
|---|---|---|
DATABASE_URL | URL PostgreSQL | requis |
Serveur
| Variable | Description | Defaut |
|---|---|---|
SERVER_HOST | Adresse d'ecoute | 0.0.0.0 |
SERVER_PORT | Port | 3000 |
RUST_LOG | Niveau de logging | debug |
JWT
| Variable | Description | Defaut |
|---|---|---|
JWT_SECRET | Cle secrete JWT (min 32 chars) | requis |
JWT_EXPIRATION_MINUTES | Duree de vie du token | 15 |
JWT_ISSUER | Issuer du JWT | nom du projet |
REFRESH_TOKEN_EXPIRATION_DAYS | Duree de vie du refresh token | 7 |
Sessions
| Variable | Description | Defaut |
|---|---|---|
SESSION_TIMEOUT_MINUTES | Duree de la session | 30 |
SESSION_BACKEND | Backend de session (memory, seaorm, redis) | memory |
REDIS_URL | URL Redis (si SESSION_BACKEND=redis) | — |
Rate limiting
| Variable | Description | Defaut |
|---|---|---|
RATE_LIMIT_LOGIN_PER_MINUTE | Tentatives de login | 5 |
RATE_LIMIT_REFRESH_PER_MINUTE | Rafraichissements JWT | 10 |
RATE_LIMIT_GENERAL_PER_MINUTE | Requetes generales | 100 |
Cookies
| Variable | Description | Defaut |
|---|---|---|
COOKIE_SECURE | Cookies securises (HTTPS only) | false |
COOKIE_SAME_SITE | Politique SameSite | Lax |
Comportement d'authentification
| Variable | Description | Defaut |
|---|---|---|
LOGIN_PATH | Chemin de redirection de login emis par le middleware d'auth (decouple de l'UI) | /login |
AUTH_FAILURE_MODE | Reponse sur route protegee sans auth : redirect (302 vers LOGIN_PATH) ou json401 (401 JSON). .headless() bascule le defaut sur json401 | redirect |
Admin initial
| Variable | Description | Defaut |
|---|---|---|
ADMIN_USERNAME | Login admin par defaut | admin |
ADMIN_EMAIL | Email admin | requis |
ADMIN_PASSWORD | Mot de passe admin | requis |
Email SMTP
| Variable | Description | Defaut |
|---|---|---|
SMTP_HOST | Serveur SMTP | — (optionnel) |
SMTP_PORT | Port SMTP | 587 |
SMTP_USER | Utilisateur SMTP | — |
SMTP_PASSWORD | Mot de passe SMTP | — |
SMTP_FROM | Adresse expediteur | — |
SMTP_FROM_NAME | Nom expediteur | valeur de APP_NAME |
SMTP_USE_TLS | Utiliser TLS | true |
SMTP_USE_STARTTLS | Utiliser STARTTLS | true |
SMTP_ACCEPT_INVALID_CERTS | Accepter certificats invalides | false |
EMAIL_BASE_URL | URL de base pour les liens dans les emails | http://localhost:3000 |
File d'attente email
| Variable | Description | Defaut |
|---|---|---|
EMAIL_QUEUE_BATCH_SIZE | Taille du batch | 10 |
EMAIL_QUEUE_RETRY_ATTEMPTS | Nombre de tentatives | 5 |
EMAIL_QUEUE_RETRY_DELAY_SECONDS | Delai entre tentatives | 300 |
EMAIL_VALIDATION_REQUIRED | Exiger la validation email | true |
ALLOW_REGISTRATION | Autoriser l'inscription publique | false |
IMAP (detection de bounces)
| Variable | Description | Defaut |
|---|---|---|
IMAP_HOST | Serveur IMAP | — (optionnel) |
IMAP_PORT | Port IMAP | 993 |
IMAP_USER | Utilisateur IMAP | — |
IMAP_PASSWORD | Mot de passe IMAP | — |
IMAP_USE_TLS | Utiliser TLS | true |
IMAP_USE_STARTTLS | Utiliser STARTTLS | false |
IMAP_ACCEPT_INVALID_CERTS | Accepter certificats invalides | false |
IMAP_MAILBOX | Boite mail a surveiller | INBOX |
IMAP_POLL_INTERVAL_SECONDS | Intervalle de verification | 300 |
OAuth / SSO (feature oauth)
| Variable | Description | Defaut |
|---|---|---|
OAUTH_ENCRYPTION_KEY | Cle AES-256-GCM (hex 64 chars) pour chiffrer les secrets en DB | — |
OAUTH_ENABLED | Active globalement OAuth | false |
OAUTH_REDIRECT_BASE_URL | URL de base pour les callbacks | http://localhost:3000 |
OAUTH_GOOGLE_CLIENT_ID | Google Client ID | — |
OAUTH_GOOGLE_CLIENT_SECRET | Google Client Secret | — |
OAUTH_GOOGLE_ENABLED | Active Google | false |
OAUTH_GITHUB_CLIENT_ID | GitHub Client ID | — |
OAUTH_GITHUB_CLIENT_SECRET | GitHub Client Secret | — |
OAUTH_GITHUB_ENABLED | Active GitHub | false |
OAUTH_DISCORD_CLIENT_ID | Discord Client ID | — |
OAUTH_DISCORD_CLIENT_SECRET | Discord Client Secret | — |
OAUTH_DISCORD_ENABLED | Active Discord | false |
OAUTH_MICROSOFT_CLIENT_ID | Microsoft Client ID | — |
OAUTH_MICROSOFT_CLIENT_SECRET | Microsoft Client Secret | — |
OAUTH_MICROSOFT_ENABLED | Active Microsoft | false |
OAUTH_MICROSOFT_TENANT | Azure AD tenant | common |
Les credentials OAuth peuvent etre configures via l'interface Admin (
/admin/settings) ou via ces variables d'environnement (fallback).
Federation ActivityPub (feature fediverse)
| Variable | Description | Defaut |
|---|---|---|
FEDIVERSE_DOMAIN | Domaine federe expose, ex. example.org. Refuse les placeholders type example.com, your.tld, change-me.tld. | requis |
FEDIVERSE_DEBUG_LOCAL_FEDERATION | Autorise les base URLs http:// (tests locaux multi-instances). Ne jamais activer en production. | false |
FEDIVERSE_AUTHORIZED_FETCH | Mode "secure fetch" Mastodon : exige une signature HTTP pour resoudre un acteur. Activer apres audit. | false |
FEDIVERSE_OUTBOUND_WORKERS | Nombre de workers concurrents qui drainent la file de delivery. | 4 |
FEDIVERSE_OUTBOUND_MAX_ATTEMPTS | Tentatives maximum avant qu'un job soit marque dead. | 8 |
FEDIVERSE_OUTBOUND_REQUEST_TIMEOUT_SECS | Timeout par requete outbound. | 30 |
FEDIVERSE_FETCH_ACTOR_CACHE_TTL_SECS | TTL du cache des documents acteur distants. | 86400 |
FEDIVERSE_AUTH_CHALLENGE_TTL_SECS | TTL des challenges d'auth AP-native (RFC 0006). | 300 |
La feature est opt-in a la compilation : ajouter
--features fediverseau binaire. Le craterustwarden-corene tire aucune des deps lourdes (activitypub_federation,rsa,reqwest,ammonia) tant que le binaire n'active pas la feature. Cote runtime, deux flags supplementaires dansapp_settingscontrolent l'experience admin :fediverse_enabled(toggle global, defautfalse) etfediverse_trust_mode(allowlist/open_with_blocklist). Reglage via/admin/fediverse/settingsou directement en SQL.
Wiring minimal dans main.rs (extrait de app/src/main.rs) :
#[cfg(feature = "fediverse")] let builder = { use std::sync::Arc; let db = sea_orm::Database::connect(&std::env::var("DATABASE_URL")?).await?; let config = rustwarden_fediverse::FediverseConfig::from_env()?; let router = rustwarden_fediverse::routes::router(config, db.clone()); let checker: Arc<dyn rustwarden_core::middleware::revocation::RemoteIdentityRevocationChecker> = Arc::new( rustwarden_fediverse::services::revocation::SeaOrmRemoteIdentityRevocationChecker::new( db.clone(), ), ); builder .database(db) .register_protected_prefix("/fediverse/consent") .register_protected_prefix("/fediverse/invite") .register_revocation_checker(checker) .merge_routes(router) };
Pour un essai local multi-instances (3 noeuds federes via Docker Compose), voir tests/fediverse-testbed/README.md. Guide operateur complet : docs/fediverse-operations.md.
Migrations
Les migrations sont gerees avec SeaORM Migration :
# Manuellement cargo run --bin migrate # Automatiquement au demarrage (via le builder) .auto_migrate(true)
Pour combiner avec vos propres migrations :
use rustwarden_core::migrations::core_migrations; struct AppMigrator; impl MigratorTrait for AppMigrator { fn migrations() -> Vec<Box<dyn MigrationTrait>> { let mut all = core_migrations(); all.push(Box::new(MyCustomMigration)); all } }
Internationalisation (i18n)
Les traductions sont dans locales/ au format YAML. 4 langues incluses : fr, en, de, es.
# locales/fr.yml products: title: "Produits" empty: "Aucun produit trouve"
Utilisation dans un handler :
use rustwarden_core::i18n::service::I18nService; use rustwarden_core::i18n::extractor::Locale; use std::sync::Arc; use axum::extract::Extension; async fn my_page( locale: Locale, Extension(i18n): Extension<Arc<I18nService>>, ) -> String { i18n.t(&locale.0, "products.title") }
La locale est detectee automatiquement dans cet ordre :
- Cookie
locale - Header
Accept-Language DEFAULT_LOCALE(env var)
Commandes utiles
| Commande | Description |
|---|---|
cargo run -p rustwarden-app | Lancer l'application de reference |
cargo run -p rustwarden-cli -- start-project | Wizard de creation de projet |
cargo run -p rustwarden-cli -- update-project | Resynchroniser le framework vendored d'un projet genere |
cargo run --bin migrate | Executer les migrations |
cargo run --bin seed | Creer/mettre a jour l'admin initial |
cargo run --bin hash_password | Hasher un mot de passe bcrypt |
cargo run --bin change_password | Changer le mot de passe d'un utilisateur (ex. cargo run --bin change_password -- admin "Admin123!") |
cargo run -p rustwarden-core --bin screen-select | Generer le plan des ecrans UI a coder (depuis un projet consommateur) |
cargo run -p rustwarden-core --bin screen-select -- --check | Recocher les ecrans realises par analyse statique |
cargo test | Lancer les tests |
cargo build --release | Build optimise pour la production |
Documentation complementaire
| Document | Description |
|---|---|
| DEVELOPER.md | Guide detaille pour les developpeurs (architecture, hooks, ajout de routes/modeles) |
| docs/SERVICES_REFERENCE.md | Reference exhaustive des services et API pour projets consommateurs (§22 : binaire screen-select) |
| docs/ANSSI_COMPLIANCE_REPORT.md | Rapport de conformite aux recommandations ANSSI |
| docs/CSS_STYLE_GUIDE.md | Guide de style CSS/DaisyUI |
| docs/configuration-flows.md | Diagrammes des flux de configuration |
| docs/fediverse-operations.md | Guide operateur de la federation ActivityPub (10 sections : activation, env vars, app_settings, trust/block list, incidents, observabilite, GC, promotion stable, URLs, limites) |
| docs/rfcs/ | 25 RFCs documentant la conception de la couche federation (0001–0025) |
| tests/fediverse-testbed/README.md | Banc d'essai Docker tri-instance (alpha/beta/gamma) pour valider la federation Rustwarden↔Rustwarden |
.env.sample | Fichier de reference pour toutes les variables d'environnement |
GitRust