🔥 Okibi

yuki / okibi

焚き火の仲間だけの自前Gitホスティング(このサイト自身)

git clone https://okibi.fly.dev/yuki/okibi.git

okibi / src / config.rs

use std::path::PathBuf;

/// Runtime configuration, sourced from env with sane local defaults.
#[derive(Clone)]
pub struct Config {
    /// Public base URL (used in magic links). e.g. https://okibi.fly.dev
    pub base_url: String,
    /// Directory holding bare git repos: `<data>/repos/<owner>/<name>.git`
    pub repos_dir: PathBuf,
    /// SQLite file path.
    pub db_path: PathBuf,
    /// Path to the `git` binary.
    pub git_bin: String,
    /// Path to `git-http-backend` CGI.
    pub git_http_backend: String,
    /// Resend API key (optional; if absent, magic links are logged to stdout).
    pub resend_key: Option<String>,
    /// From address for outgoing mail.
    pub mail_from: String,
    /// Comma-separated seed member emails (always allowed + admin).
    pub seed_members: Vec<String>,
    /// Secret token enabling no-email admin bootstrap login (optional).
    pub admin_bootstrap: Option<String>,
    pub bind: String,
}

fn env(key: &str) -> Option<String> {
    std::env::var(key).ok().filter(|v| !v.is_empty())
}

impl Config {
    pub fn from_env() -> Self {
        let data = env("OKIBI_DATA").unwrap_or_else(|| "./data".into());
        let data = PathBuf::from(data);
        let default_backend = if std::path::Path::new(
            "/opt/homebrew/opt/git/libexec/git-core/git-http-backend",
        )
        .exists()
        {
            "/opt/homebrew/opt/git/libexec/git-core/git-http-backend".to_string()
        } else {
            "/usr/lib/git-core/git-http-backend".to_string()
        };
        Config {
            base_url: env("OKIBI_BASE_URL").unwrap_or_else(|| "http://localhost:8787".into()),
            repos_dir: data.join("repos"),
            db_path: data.join("okibi.db"),
            git_bin: env("OKIBI_GIT_BIN").unwrap_or_else(|| "git".into()),
            git_http_backend: env("OKIBI_GIT_HTTP_BACKEND").unwrap_or(default_backend),
            resend_key: env("RESEND_API_KEY"),
            mail_from: env("OKIBI_MAIL_FROM").unwrap_or_else(|| "Okibi <info@enablerdao.com>".into()),
            seed_members: env("OKIBI_SEED_MEMBERS")
                .unwrap_or_else(|| "yuki@hamada.tokyo,mail@yukihamada.jp".into())
                .split(',')
                .map(|s| s.trim().to_lowercase())
                .filter(|s| !s.is_empty())
                .collect(),
            admin_bootstrap: env("OKIBI_ADMIN_BOOTSTRAP"),
            bind: env("OKIBI_BIND").unwrap_or_else(|| "0.0.0.0:8787".into()),
        }
    }
}