Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,8 @@ pub mod environments;
pub mod error;
pub mod models;
pub mod routes;
pub mod server;
pub mod services;
pub mod state;

pub use server::run;
58 changes: 1 addition & 57 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -1,62 +1,6 @@
use edge_proxy::config::logging::setup_logging;
use edge_proxy::config::settings::get_settings;
use edge_proxy::routes::create_router;
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use tracing::{info, warn};

const DEFAULT_HOST: IpAddr = IpAddr::V4(Ipv4Addr::UNSPECIFIED);

#[tokio::main]
async fn main() -> anyhow::Result<()> {
let settings = get_settings()?;

setup_logging(&settings.logging);

info!("Starting Edge Proxy server...");
info!("API URL: {}", settings.api_url);
info!(
"Polling frequency: {}s",
settings.api_poll_frequency_seconds
);

// serde defaults these fields, so a typo'd field name parses as an
// empty set and the proxy would report healthy while rejecting every
// request — make that state loud.
if settings.environment_key_pairs.is_empty() && settings.proxy_key.is_none() {
warn!(
"No environments configured: environment_key_pairs and proxy_key \
are both empty or missing, so every request will be rejected \
with 401"
);
}

let (app, environment_service) = create_router(settings.clone());

// Refreshes must never overlap: a delayed older poll finishing after a
// newer one could restore removed environments or rotated keys. The
// poll loop is serial, so it just has to start after the initial
// refresh completes.
info!("Loading initial environment data...");
environment_service.refresh_environment_caches().await;

let polling_service = environment_service.clone();
tokio::spawn(async move {
polling_service.poll_environments().await;
});

let addr = SocketAddr::from((
settings
.server
.host
.parse::<IpAddr>()
.unwrap_or(DEFAULT_HOST),
settings.server.port,
));

info!("Listening on {}", addr);

let listener = tokio::net::TcpListener::bind(addr).await?;
axum::serve(listener, app).await?;

Ok(())
edge_proxy::run(get_settings()?).await
}
59 changes: 59 additions & 0 deletions src/server.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
use crate::config::AppSettings;
use crate::config::logging::setup_logging;
use crate::routes::create_router;
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use tracing::{info, warn};

const DEFAULT_HOST: IpAddr = IpAddr::V4(Ipv4Addr::UNSPECIFIED);

pub async fn run(settings: AppSettings) -> anyhow::Result<()> {
setup_logging(&settings.logging);

info!("Starting Edge Proxy server...");
info!("API URL: {}", settings.api_url);
info!(
"Polling frequency: {}s",
settings.api_poll_frequency_seconds
);

// serde defaults these fields, so a typo'd field name parses as an
// empty set and the proxy would report healthy while rejecting every
// request — make that state loud.
if settings.environment_key_pairs.is_empty() && settings.proxy_key.is_none() {
warn!(
"No environments configured: environment_key_pairs and proxy_key \
are both empty or missing, so every request will be rejected \
with 401"
);
}

let (app, environment_service) = create_router(settings.clone());

// Refreshes must never overlap: a delayed older poll finishing after a
// newer one could restore removed environments or rotated keys. The
// poll loop is serial, so it just has to start after the initial
// refresh completes.
info!("Loading initial environment data...");
environment_service.refresh_environment_caches().await;

let polling_service = environment_service.clone();
tokio::spawn(async move {
polling_service.poll_environments().await;
});

let addr = SocketAddr::from((
settings
.server
.host
.parse::<IpAddr>()
.unwrap_or(DEFAULT_HOST),
settings.server.port,
));

info!("Listening on {}", addr);

let listener = tokio::net::TcpListener::bind(addr).await?;
axum::serve(listener, app).await?;

Ok(())
}
Loading