This commit is contained in:
Mateusz Gruszczyński committed 2026-10-08 09:42:10 +02:00
1 parent c24bc4279b
commit 3b3f0db377
84 files changed
+2686 -392

No files matched your search

+7 -29
View File
@@ -145,7 +145,8 @@ async fn run(
authentication.remove_bootstrap_files().await;
}
let renewal_observations = store.load_certificate_renewals().await?;
let geoip = match rust_proxy::geoip::Database::load(&data_dir.join("geoip")) {
let geoip_format = snapshot.envelope.config.geoip_updates.format;
let geoip = match rust_proxy::geoip::Database::load_format(&data_dir.join("geoip"), geoip_format) {
Ok(database) => std::sync::Arc::new(database),
Err(error) => {
tracing::warn!(%error, "GeoIP country database unavailable; country allow lists fail closed");
@@ -166,7 +167,6 @@ async fn run(
geoip,
);
state.acme.restore_renewals(renewal_observations);
state.start_update_check(update_check);
// Bind EVERY listener before spawning servers: a missing private IP or
// occupied port fails startup atomically, never falling back to 0.0.0.0.
let mut public_listeners = Vec::new();
@@ -254,6 +254,11 @@ async fn run(
} else {
None
};
// Release checks are control-plane best effort only. Start them after every
// socket has bound successfully so DNS/network failures can never obscure or
// interfere with listener startup failures.
state.start_geoip_updates();
state.start_update_check(update_check);
let shutdown = state.shutdown.clone();
let grace = Duration::from_secs(options.shutdown_timeout_secs);
let mut tasks = JoinSet::new();
@@ -396,35 +401,8 @@ async fn run(
} else {
println!(" Sign in with your administrator account.");
}
let certificate_runtime = state.acme.runtime_view();
let runtime_pending = matches!(certificate_runtime.status, "checking" | "initializing");
let component_state = |available: bool| {
if available {
"available"
} else if runtime_pending {
"checking"
} else {
"unavailable"
}
};
let managed_python_directory = certificate_runtime
.managed_directory
.clone()
.unwrap_or_else(|| data_dir.join("acme-python").to_string_lossy().into_owned());
println!(" Source: https://git.linuxiarz.pl/gru/RustProxy");
println!(" Packages: https://rustproxy.linuxiarz.pl/");
println!(
" Python: {} (ACME mode: {}, pip: {}, Certbot: {}; managed env: {})",
component_state(certificate_runtime.python),
if runtime_pending {
"preparing"
} else {
certificate_runtime.mode
},
component_state(certificate_runtime.pip),
component_state(certificate_runtime.certbot),
managed_python_directory
);
println!(" Data: {}\n Stop: Ctrl+C\n", data_dir.display());
if state
.active_listeners
+2 -2
View File
@@ -41,14 +41,14 @@ use zeroize::Zeroizing;
#[command(
name = "rust-proxy",
version,
about = "RustProxy - independent Rust reverse proxy and static Web Server 0.27.3"
about = "RustProxy - independent Rust reverse proxy and static Web Server 0.28.0"
)]
struct Cli {
#[arg(
long,
global = true,
env = "RUST_PROXY_DATA_DIR",
default_value = "./data"
default_value = "/var/lib/rustproxy"
)]
data_dir: PathBuf,
#[arg(
+1 -1
View File
@@ -239,7 +239,7 @@ async fn live_logs_command(dir: PathBuf, addr: SocketAddr) -> Result<()> {
}
});
let interactive = io::stdin().is_terminal() && io::stdout().is_terminal();
println!("RustProxy live logs 0.27.3 - all vhosts. Type 'help' for interactive filters; Ctrl-C or 'quit' exits.");
println!("RustProxy live logs 0.28.0 - all vhosts. Type 'help' for interactive filters; Ctrl-C or 'quit' exits.");
if interactive { print!("> "); io::stdout().flush()?; }
let mut filters = LiveLogFilters::default();
let mut history = std::collections::BTreeMap::<u64, serde_json::Value>::new();