diff --git a/nym-data-observatory/Cargo.toml b/nym-data-observatory/Cargo.toml index b4a1ea8619..0ef35d100f 100644 --- a/nym-data-observatory/Cargo.toml +++ b/nym-data-observatory/Cargo.toml @@ -17,6 +17,7 @@ readme.workspace = true anyhow = { workspace = true } axum = { workspace = true, features = ["tokio"] } chrono = { workspace = true } +clap = { workspace = true, features = ["derive", "env"] } nym-bin-common = { path = "../common/bin-common" } nym-network-defaults = { path = "../common/network-defaults" } nym-task = { path = "../common/task" } diff --git a/nym-data-observatory/Dockerfile b/nym-data-observatory/Dockerfile new file mode 100644 index 0000000000..2fb545f4d9 --- /dev/null +++ b/nym-data-observatory/Dockerfile @@ -0,0 +1,21 @@ +FROM rust:latest AS builder + +COPY ./ /usr/src/nym +WORKDIR /usr/src/nym/nym-data-observatory + +RUN cargo build --release + +FROM debian:12-slim + +RUN echo "Acquire::http::Pipeline-Depth 0;" > /etc/apt/apt.conf.d/99custom && \ + echo "Acquire::http::No-Cache true;" >> /etc/apt/apt.conf.d/99custom && \ + echo "Acquire::BrokenProxy true;" >> /etc/apt/apt.conf.d/99custom + +RUN apt update + +RUN apt install -yy curl + +WORKDIR /nym + +COPY --from=builder /usr/src/nym/target/release/nym-data-observatory ./ +CMD [ "/nym/nym-data-observatory" ] diff --git a/nym-data-observatory/docker-compose.yml b/nym-data-observatory/docker-compose.yml index 3d93d058f3..1877e1979e 100644 --- a/nym-data-observatory/docker-compose.yml +++ b/nym-data-observatory/docker-compose.yml @@ -2,12 +2,22 @@ services: postgres: image: postgres:13 container_name: nym-data-observatory-pg - env_file: - - .env + environment: + POSTGRES_PASSWORD: password ports: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data + data-observatory: + image: nym-data-observatory:latest + build: + context: ../ + dockerfile: nym-data-observatory/Dockerfile + container_name: nym-data-observatory + environment: + NYM_DATA_OBSERVATORY_CONNECTION_URL: "postgres://postgres:password@postgres:5432" + NYM_DATA_OBSERVATORY_HTTP_PORT: 8000 + volumes: pgdata: diff --git a/nym-data-observatory/src/db/mod.rs b/nym-data-observatory/src/db/mod.rs index 307d2a97b3..ef90996da8 100644 --- a/nym-data-observatory/src/db/mod.rs +++ b/nym-data-observatory/src/db/mod.rs @@ -16,8 +16,8 @@ pub(crate) struct Storage { } impl Storage { - pub async fn init() -> Result { - let connection_url = std::env::var(DATABASE_URL_ENV_VAR).map_err(anyhow::Error::from)?; + pub async fn init(connection_url: Option) -> Result { + let connection_url = connection_url.unwrap(); let connect_options = { let mut connect_options = PgConnectOptions::from_str(&connection_url)?; let connect_options = connect_options.disable_statement_logging(); diff --git a/nym-data-observatory/src/main.rs b/nym-data-observatory/src/main.rs index 074279d2ed..8fed033503 100644 --- a/nym-data-observatory/src/main.rs +++ b/nym-data-observatory/src/main.rs @@ -1,3 +1,4 @@ +use clap::Parser; use nym_network_defaults::setup_env; use nym_task::signal::wait_for_signal; @@ -8,29 +9,44 @@ mod db; mod http; mod logging; +#[derive(Parser, Debug)] +#[command(version, about, long_about = None)] +struct Args { + /// Port to listen on + #[arg(long, default_value_t = 8000, env = "NYM_DATA_OBSERVATORY_HTTP_PORT")] + http_port: u16, + + /// Path to the environment file + #[arg(short, long, default_value = None, env = "NYM_DATA_OBSERVATORY_ENV_FILE")] + env_file: Option, + + /// DB connection url + #[arg(short, long, default_value = None, env = "NYM_DATA_OBSERVATORY_CONNECTION_URL")] + connection_url: Option, +} + #[tokio::main] async fn main() -> anyhow::Result<()> { logging::setup_tracing_logger(); - // if dotenv file is present, load its values - // otherwise, default to mainnet - setup_env(Some(".env")); + let args = Args::parse(); + + setup_env(args.env_file); // Defaults to mainnet if empty let conf = config::Config::from_env(); tracing::debug!("Using config:\n{:?}", conf); - let storage = db::Storage::init().await?; + let storage = db::Storage::init(args.connection_url).await?; let db_pool = storage.pool_owned().await; tokio::spawn(async move { background_task::spawn_in_background(db_pool).await; tracing::info!("Started task"); }); - let shutdown_handles = - http::server::start_http_api(storage.pool_owned().await, conf.http_port()) - .await - .expect("Failed to start server"); - tracing::info!("Started HTTP server on port {}", conf.http_port()); + let shutdown_handles = http::server::start_http_api(storage.pool_owned().await, args.http_port) + .await + .expect("Failed to start server"); + tracing::info!("Started HTTP server on port {}", args.http_port); wait_for_signal().await;