A minimal self-hosted git browser on Rust axum: bare repos rendered as a website with commits, diffs, syntax-highlighted blobs, atom feeds, and clone over HTTPS.
axumdockergitgit-browsergitoxidegixrustself-hosted
1mod app;
2mod git;
3
4pub use app::AppState;
5mod highlight;
6mod http_backend;
7mod markdown;
8mod middleware;
9mod render;
10mod routes;
11mod templates;
12
13use std::net::SocketAddr;
14
15#[tokio::main]
16async fn main() -> anyhow::Result<()> {
17 dotenvy::dotenv().ok();
18 tracing_subscriber::fmt()
19 .with_env_filter(
20 tracing_subscriber::EnvFilter::try_from_default_env()
21 .unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
22 )
23 .init();
24
25 let port: u16 = std::env::var("PORT")
26 .ok()
27 .and_then(|v| v.parse().ok())
28 .unwrap_or(8000);
29
30 let state = app::AppState::from_env();
31 let router = app::router(state);
32
33 let addr = SocketAddr::from(([0, 0, 0, 0], port));
34 let listener = tokio::net::TcpListener::bind(addr).await?;
35 tracing::info!("repos listening on http://{addr}");
36 // ConnectInfo so clone routes can pass REMOTE_ADDR to git http-backend.
37 axum::serve(
38 listener,
39 router.into_make_service_with_connect_info::<SocketAddr>(),
40 )
41 .await?;
42 Ok(())
43}