Variables d'environnement
Documentation / Variables d'environnement / Application, Serveur & Base de données

Application, Serveur & Base de données

Application

VariableDéfautDescription
RUNIQUE_ENVproddev ou prod, quelle que soit la casse ; absente ou inconnue, c'est prod (avec un avertissement si la valeur est inconnue). Lue une seule fois au démarrage. En dev : cookie de session sans Secure, niveau de log debug (sauf RUST_LOG), templates relus à chaque requête, en-têtes no-cache sur localhost, page d'accueil par défaut si / n'est pas déclaré, URL publique à http://127.0.0.1:{PORT} (.with_public_url() ignorée), hôtes autorisés non validés, pas de upgrade-insecure-requests, pas de SRI et fichiers statiques en no-cache pour que le CSS modifié se recharge sans redémarrer. En prod : contrôles de sécurité au démarrage (SECRET_KEY, with_public_url, mailer du reset, ACME).
DEBUGfalseAffiche les pages d'erreur détaillées et ne change rien d'autre — lu une seule fois au démarrage. Accepte true/1/yes/on et false/0/no/off, quelle que soit la casse. Fonctionne aussi avec RUNIQUE_ENV=prod pour diagnostiquer un problème en direct : déconseillé, car tous les visiteurs voient alors ces pages (un avertissement s'affiche au démarrage).
BASE_DIR.Répertoire racine de l'application
TZUTCFuseau horaire IANA de l'application (ex : Europe/Paris, America/New_York). Accessible via config.timezone — à parser avec chrono-tz dans le projet.
LANGlocale systèmeLangue de la CLI (fr, en, de, es, it, pt, ja, zh, ru). Priorité : LANG / LC_ALL / LC_MESSAGES du .env > locale système > en. La langue de l'application se règle dans le code (set_lang(Lang::Fr))

Serveur

VariableDéfautDescription
IP_SERVER127.0.0.1Adresse IP d'écoute
PORT3000Port d'écoute
SECRET_KEYdefault_secret_keyClé secrète (CSRF, signatures, chiffrement des sessions en base : la changer déconnecte leurs utilisateurs au redémarrage). runique new en génère une aléatoire (64 caractères hexadécimaux) dans le .env du projet. Pour la remplacer : n'importe quelle chaîne aléatoire d'au moins 32 caractères (openssl rand -hex 32). En production (RUNIQUE_ENV=prod), le démarrage échoue si elle est vide, égale au défaut, ou fait moins de 32 caractères ; en développement, un avertissement est affiché si elle est absente

Base de données

Connexion

VariableDéfautDescription
DATABASE_URL—URL complète. Lue en premier : quand elle est définie, DB_ENGINE, DB_USER, DB_PASSWORD, DB_HOST, DB_PORT et DB_NAME sont ignorés, et le moteur est déduit du schéma de l'URL (postgres://, mysql://, mariadb://, sqlite://)
DB_ENGINEsqliteMoteur, quand DATABASE_URL est absente : postgres, mysql, mariadb, sqlite. Doit correspondre à la feature de runique compilée, sinon « driver not enabled » au démarrage
DB_USER—Utilisateur (requis sauf SQLite)
DB_PASSWORD—Mot de passe (requis sauf SQLite)
DB_HOSTlocalhostHost
DB_PORT5432 / 3306Port (défaut selon le moteur)
DB_NAMElocal_base.sqlite (SQLite uniquement)Nom de la base — requis pour postgres/mysql/mariadb, échec au démarrage si absent

Pool de connexions

VariableDéfautDescription
DB_MAX_CONNECTIONS100Taille maximale du pool
DB_MIN_CONNECTIONS20Taille minimale du pool

Timeouts

VariableDéfautUnitéDescription
DB_CONNECT_TIMEOUT2secondesTimeout d'établissement de connexion
DB_ACQUIRE_TIMEOUT500millisecondesTimeout d'acquisition depuis le pool
DB_IDLE_TIMEOUT300secondesDurée d'inactivité avant fermeture
DB_MAX_LIFETIME3600secondesDurée de vie maximale d'une connexion

Logging SQL

VariableDéfautDescription
DB_LOGGINGfalseActive les logs SQL (true, 1, yes)

Connexions secondaires — `with_custom_db`

Pour attacher une connexion additionnelle (pool Redis, PostgreSQL secondaire, client MongoDB, etc.), utilisez .with_custom_db() sur le builder. La valeur est stockée dans une HashMap<TypeId, Arc<dyn Any>> interne à RuniqueEngine — pas injectée comme Extension Axum. Accès dans les handlers via engine.custom_db::<T>() (ou son alias engine.extension::<T>()), qui retourne Option<Arc<T>>.

// main.rs
let redis = redis::Client::open("redis://127.0.0.1/")?;
let db = DatabaseConfig::from_env()?.build().connect().await?;

RuniqueApp::builder(config)
    .with_database(db)
    .with_custom_db(redis)   // T: Any + Send + Sync + 'static
    .routes(url::routes())
    .build().await?
    .run().await
// handler
use redis::Client;

pub async fn mon_handler(mut req: Request) -> AppResult<Response> {
    let redis = req.engine.custom_db::<Client>().expect("redis non configuré");
    let mut conn = redis.get_async_connection().await?;
    // ...
}

Tout type implémentant Any + Send + Sync + 'static est accepté. Plusieurs connexions secondaires de types différents peuvent être enregistrées avec des appels .with_custom_db() répétés.