mirror of
https://github.com/moghtech/komodo.git
synced 2026-09-13 16:01:21 +00:00
* 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
110 lines
2.8 KiB
Rust
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)
|
|
}
|