Skip to content

Configuration

How Configuration Works

AxumKit uses LazyLock for static configuration that's initialized once on first access.

rust
static CONFIG: LazyLock<ServerConfig> = LazyLock::new(|| {
    dotenv().ok();  // Load .env file
    // ... parse environment variables
});

impl ServerConfig {
    pub fn get() -> &'static ServerConfig {
        &CONFIG
    }
}

This means:

  • Configuration is loaded from environment variables (via .env or system env)
  • All required variables are validated at startup — missing ones cause a panic with a clear error listing
  • ServerConfig::get() returns a &'static reference — zero-cost after initialization

Two Configs

ConfigUsed byFile
ServerConfigaxumkit-servercrates/axumkit-config/src/server_config.rs
WorkerConfigaxumkit-workercrates/axumkit-worker/src/config/worker_config.rs

Both follow the same LazyLock pattern but load different sets of variables.

Required vs Optional Variables

Required variables use the require! macro — the server won't start without them:

rust
macro_rules! require {
    ($name:expr) => {
        env::var($name).unwrap_or_else(|_| {
            errors.push(format!("  - {} (missing)", $name));
            String::new()
        })
    };
}

Optional variables use .unwrap_or() with defaults:

rust
redis_session_host: env::var("REDIS_SESSION_HOST")
    .unwrap_or_else(|_| "redis-session".to_string()),

Variable Categories

Server

VariableRequiredDefaultDescription
ENVIRONMENTNoprodSet to dev or development for dev mode
HOSTYesServer bind address
PORTYesServer bind port

Authentication

VariableRequiredDefaultDescription
TOTP_SECRETYesSecret for TOTP backup code hashing
AUTH_SESSION_MAX_LIFETIME_HOURSYesAbsolute session expiration (hours)
AUTH_SESSION_SLIDING_TTL_HOURSYesActivity-based TTL extension (hours)
AUTH_SESSION_REFRESH_THRESHOLDYesTTL refresh threshold (%)
AUTH_EMAIL_VERIFICATION_TOKEN_EXPIRE_TIMENo1Email verification token TTL (minutes)
AUTH_PASSWORD_RESET_TOKEN_EXPIRE_TIMENo15Password reset token TTL (minutes)
AUTH_EMAIL_CHANGE_TOKEN_EXPIRE_TIMENo15Email change token TTL (minutes)
OAUTH_PENDING_SIGNUP_TTL_MINUTESNo10OAuth pending signup TTL (minutes)

Database

VariableRequiredDefaultDescription
POSTGRES_WRITE_HOSTYesPrimary DB host
POSTGRES_WRITE_PORTYesPrimary DB port
POSTGRES_WRITE_NAMEYesPrimary DB name
POSTGRES_WRITE_USERYesPrimary DB user
POSTGRES_WRITE_PASSWORDYesPrimary DB password
POSTGRES_WRITE_MAX_CONNECTIONNo100Max pool connections
POSTGRES_WRITE_MIN_CONNECTIONNo10Min pool connections
POSTGRES_READ_*YesSame set for read replica

Redis

VariableRequiredDefaultDescription
REDIS_SESSION_HOSTNoredis-sessionSession Redis host
REDIS_SESSION_PORTNo6379Session Redis port
REDIS_CACHE_HOSTNoredis-cacheCache Redis host
REDIS_CACHE_PORTNo6379Cache Redis port
REDIS_CACHE_TTLNo3600Cache TTL (seconds)

Stability Layer

VariableRequiredDefaultDescription
STABILITY_CONCURRENCY_LIMITNo500Max concurrent requests
STABILITY_BUFFER_SIZENo1024Request queue size
STABILITY_TIMEOUT_SECSNo30Per-request timeout (seconds)

See Environment Variables for the full list including OAuth, R2, CORS, SMTP, and more.

Released under the MIT License.