Files
komodo/bin/core/src/main.rs
T
Maxwell Becker 5fc0a87dea 1.14 - Rename to Komodo - Docker Management (#56)
* setup network page

* add Network, Image, Container

* Docker ListItems and Inspects

* frontend build

* dev0

* network info working

* fix cargo lock

* dev1

* pages for the things

* implement Active in dashboard

* RunBuild update trigger list refresh

* rename deployment executions to StartDeployment etc

* add server level container control

* dev2

* add Config field to Image

* can get image labels from Config.Labels

* mount container page

* server show resource count

* add GetContainerLog api

* add _AllContainers api

* dev3

* move ResourceTarget to entities mod

* GetResourceMatchingContainer api

* connect container to resource

* dev4 add volume names to container list items

* ts types

* volume / image / network unused management

* add image history to image page

* fix PruneContainers incorret Operation

* update cache for server for server after server actions

* dev5

* add singapore to Hetzner

* implement delete single network / image / volume api

* dev6

* include "in use" on Docker Lists

* add docker resource delete buttons

* is nice

* fix volume all in use

* remove google font dependency

* use host networking in test compose

* implement Secret Variables (hidden in logs)

* remove unneeded borrow

* interpolate variables / secrets into extra args / onclone / onpull / command etc

* validate empty strings before SelectItem

* rename everything to Komodo

* rename workspace to komodo

* rc1
2024-09-01 15:38:40 -07:00

110 lines
2.8 KiB
Rust

#[macro_use]
extern crate tracing;
use std::{net::SocketAddr, str::FromStr};
use anyhow::Context;
use axum::Router;
use tower_http::{
cors::{Any, CorsLayer},
services::{ServeDir, ServeFile},
};
use crate::config::{core_config, frontend_path};
mod api;
mod auth;
mod cloud;
mod config;
mod db;
mod helpers;
mod listener;
mod monitor;
mod resource;
mod state;
mod ws;
async fn app() -> anyhow::Result<()> {
dotenvy::dotenv().ok();
let config = core_config();
logger::init(&config.logging)?;
info!("Komodo Core version: v{}", env!("CARGO_PKG_VERSION"));
info!("config: {:?}", config.sanitized());
// includes init db_client check to crash on db init failure
helpers::startup_cleanup().await;
// Maybe initialize default server in All In One deployment.
helpers::ensure_server().await;
// init jwt client to crash on failure
state::jwt_client();
// Spawn tasks
monitor::spawn_monitor_loop();
helpers::prune::spawn_prune_loop();
helpers::stack::spawn_stack_refresh_loop();
helpers::sync::spawn_sync_refresh_loop();
helpers::build::spawn_build_refresh_loop();
helpers::repo::spawn_repo_refresh_loop();
resource::spawn_build_state_refresh_loop();
resource::spawn_repo_state_refresh_loop();
resource::spawn_procedure_state_refresh_loop();
resource::spawn_resource_sync_state_refresh_loop();
// Setup static frontend services
let frontend_path = frontend_path();
let frontend_index =
ServeFile::new(format!("{frontend_path}/index.html"));
let serve_dir = ServeDir::new(frontend_path)
.not_found_service(frontend_index.clone());
let app = Router::new()
.nest("/auth", api::auth::router())
.nest("/user", api::user::router())
.nest("/read", api::read::router())
.nest("/write", api::write::router())
.nest("/execute", api::execute::router())
.nest("/listener", listener::router())
.nest("/ws", ws::router())
.nest_service("/", serve_dir)
.fallback_service(frontend_index)
.layer(cors()?);
let socket_addr =
SocketAddr::from_str(&format!("0.0.0.0:{}", core_config().port))
.context("failed to parse socket addr")?;
let listener = tokio::net::TcpListener::bind(&socket_addr)
.await
.context("failed to bind to tcp listener")?;
info!("Komodo Core listening on {socket_addr}");
axum::serve(listener, app).await.context("server crashed")?;
Ok(())
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let mut term_signal = tokio::signal::unix::signal(
tokio::signal::unix::SignalKind::terminate(),
)?;
let app = tokio::spawn(app());
tokio::select! {
res = app => return res?,
_ = term_signal.recv() => {},
}
Ok(())
}
fn cors() -> anyhow::Result<CorsLayer> {
let cors = CorsLayer::new()
.allow_origin(Any)
.allow_methods(Any)
.allow_headers(Any);
Ok(cors)
}