Logo

Configuration builder

RuniqueApp::builder(), middlewares, secrets, assets.

main.rs — builder complet main.rs
use runique::prelude::*;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    init_logging();
    password_init(PasswordConfig::auto_with(Manual::Argon2));
    set_lang(Lang::Fr);

    let config = RuniqueConfig::from_env();
    let db     = DatabaseConfig::from_env()?.build().connect().await?;

    RuniqueApp::builder(config)
        .routes(url::routes())
        .with_database(db)
        .statics()
        .middleware(|m| {
            m.with_session_memory_limit(5 * 1024 * 1024, 10 * 1024 * 1024)
             .with_session_cleanup_interval(5)
             .with_allowed_hosts(|h| {
                 h.enabled(!is_debug())
                  .host("monsite.fr")
                  .host("www.monsite.fr")
             })
             .with_csp(|c| {
                 c.policy(SecurityPolicy::strict())
                  .with_upgrade_insecure(!is_debug())
                  .images(vec!["''self''", "data:"])
             })
        })
        .with_admin(|a| {
            a.site_title("Administration")
             .auth(RuniqueAdminAuth::new())
             .routes(admins::routes("/admin"))
        })
        .build().await?
        .run().await?;

    Ok(())
}
main.rs — builder complet main.rs
use runique::prelude::*;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    init_logging();
    password_init(PasswordConfig::auto_with(Manual::Argon2));
    set_lang(Lang::Fr);

    let config = RuniqueConfig::from_env();
    let db     = DatabaseConfig::from_env()?.build().connect().await?;

    RuniqueApp::builder(config)
        .routes(url::routes())
        .with_database(db)
        .statics()
        .middleware(|m| {
            m.with_session_memory_limit(5 * 1024 * 1024, 10 * 1024 * 1024)
             .with_session_cleanup_interval(5)
             .with_allowed_hosts(|h| {
                 h.enabled(!is_debug())
                  .host("monsite.fr")
                  .host("www.monsite.fr")
             })
             .with_csp(|c| {
                 c.policy(SecurityPolicy::strict())
                  .with_upgrade_insecure(!is_debug())
                  .images(vec!["''self''", "data:"])
             })
        })
        .with_admin(|a| {
            a.site_title("Administration")
             .auth(RuniqueAdminAuth::new())
             .routes(admins::routes("/admin"))
        })
        .build().await?
        .run().await?;

    Ok(())
}
RuniqueConfig — variables .env .env
# Obligatoires
SECRET_KEY=cle_secrete_256_bits
DATABASE_URL=postgres://user:pass@localhost/db

# Optionnels
DEBUG=true           # active le hot reload templates + traces debug
HOST=127.0.0.1       # defaut 127.0.0.1
PORT=3000            # defaut 3000
RuniqueConfig — variables .env .env
# Obligatoires
SECRET_KEY=cle_secrete_256_bits
DATABASE_URL=postgres://user:pass@localhost/db

# Optionnels
DEBUG=true           # active le hot reload templates + traces debug
HOST=127.0.0.1       # defaut 127.0.0.1
PORT=3000            # defaut 3000
Middleware — options disponibles builder
m.with_session_duration(Duration::hours(24))
 .with_session_memory_limit(soft, hard)   // octets
 .with_session_cleanup_interval(minutes)

 .with_allowed_hosts(|h| h.host("...").enabled(true))
 .with_csp(|c| c.policy(SecurityPolicy::strict()))
 .with_https_redirect(true)
Middleware — options disponibles builder
m.with_session_duration(Duration::hours(24))
 .with_session_memory_limit(soft, hard)   // octets
 .with_session_cleanup_interval(minutes)

 .with_allowed_hosts(|h| h.host("...").enabled(true))
 .with_csp(|c| c.policy(SecurityPolicy::strict()))
 .with_https_redirect(true)