yuki / okibi
焚き火の仲間だけの自前Gitホスティング(このサイト自身)
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()),
}
}
}