diff --git a/Cargo.toml b/Cargo.toml index 981fc76..985f80b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ codegen-units = 1 [dependencies] actix-web = "4.10" argon2 = { version = "0.5.3", features = ["std"] } +clap = { version = "4.5.37", features = ["derive"] } futures = "0.3" regex = "1.11" serde = { version = "1.0", features = ["derive"] } diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f224deb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM debian:12 + +RUN apt update && apt install libssl3 && rm -rf /var/lib/apt/lists/* /var/cache/apt/* /tmp/* + +COPY target/release/backend /usr/bin/gorb-backend + +COPY entrypoint.sh /usr/bin/entrypoint.sh + +RUN useradd --create-home --home-dir /gorb gorb + +USER gorb + +ENV DATABASE_USERNAME="gorb" +ENV DATABASE_PASSWORD="gorb" +ENV DATABASE="gorb" +ENV DATABASE_HOST="localhost" +ENV DATABASE_PORT="5432" + +ENTRYPOINT ["/usr/bin/entrypoint.sh"] diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..edc06eb --- /dev/null +++ b/compose.yml @@ -0,0 +1,33 @@ +version: '3.5' +volumes: + gorb-backend: + gorb-database: +networks: + gorb: +services: + backend: + image: gorb/backend:latest + restart: always + ports: + - 8080:8080 + networks: + - gorb + volumes: + - gorb-backend:/gorb + environment: + - DATABASE_USERNAME=gorb + - DATABASE_PASSWORD=gorb + - DATABASE=gorb + - DATABASE_HOST=database + - DATABASE_PORT=5432 + database: + image: postgres:16 + restart: always + networks: + - gorb + volumes: + - gorb-database:/var/lib/postgresql/data + environment: + - POSTGRES_USER=gorb + - POSTGRES_PASSWORD=gorb + - POSTGRES_DB=gorb diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..07e8618 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +if [ ! -d "/gorb/config" ]; then + mkdir /gorb/config +fi + +if [ ! -d "/gorb/logs" ]; then + mkdir /gorb/logs +fi + +if [ ! -f "/gorb/config/config.toml" ]; then +cat > /gorb/config/config.toml < /gorb/logs/stdout.log 2> /gorb/logs/stderr.log diff --git a/src/config.rs b/src/config.rs index 27a426e..d5bddb1 100644 --- a/src/config.rs +++ b/src/config.rs @@ -26,8 +26,8 @@ struct WebBuilder { } impl ConfigBuilder { - pub async fn load() -> Result { - let raw = read_to_string("./config.toml").await?; + pub async fn load(path: String) -> Result { + let raw = read_to_string(path).await?; let config = toml::from_str(&raw)?; @@ -39,13 +39,11 @@ impl ConfigBuilder { Web { url: web.url.unwrap_or(String::from("0.0.0.0")), port: web.port.unwrap_or(8080), - ssl: web.ssl.unwrap_or_default(), } } else { Web { url: String::from("0.0.0.0"), port: 8080, - ssl: false, } }; @@ -66,7 +64,6 @@ pub struct Config { pub struct Web { pub url: String, pub port: u16, - pub ssl: bool, } impl Database { diff --git a/src/main.rs b/src/main.rs index 5077e7e..3b036d3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use actix_web::{App, HttpServer, web}; use argon2::Argon2; +use clap::Parser; use sqlx::{PgPool, Pool, Postgres}; use std::time::SystemTime; mod config; @@ -8,6 +9,14 @@ mod api; type Error = Box; +/// Simple program to greet a person +#[derive(Parser, Debug)] +#[command(version, about, long_about = None)] +struct Args { + #[arg(short, long, default_value_t = String::from("/etc/gorb/config.toml"))] + config: String, +} + #[derive(Clone)] struct Data { pub pool: Pool, @@ -18,7 +27,9 @@ struct Data { #[tokio::main] async fn main() -> Result<(), Error> { - let config = ConfigBuilder::load().await?.build(); + let args = Args::parse(); + + let config = ConfigBuilder::load(args.config).await?.build(); let web = config.web.clone();