59 lines
1.7 KiB
Rust
59 lines
1.7 KiB
Rust
pub mod serve;
|
|
|
|
use anyhow::Context;
|
|
use clap::{Parser, Subcommand};
|
|
use post3::{FilesystemBackend, PostgresBackend};
|
|
use sqlx::PgPool;
|
|
|
|
use crate::state::State;
|
|
|
|
#[derive(Parser)]
|
|
#[command(name = "post3-server", about = "S3-compatible storage server")]
|
|
struct App {
|
|
#[command(subcommand)]
|
|
command: Commands,
|
|
}
|
|
|
|
#[derive(Subcommand)]
|
|
enum Commands {
|
|
Serve(serve::ServeCommand),
|
|
}
|
|
|
|
pub async fn execute() -> anyhow::Result<()> {
|
|
let app = App::parse();
|
|
|
|
match app.command {
|
|
Commands::Serve(cmd) => match cmd.backend {
|
|
serve::BackendType::Pg => {
|
|
let database_url =
|
|
std::env::var("DATABASE_URL").context("DATABASE_URL not set")?;
|
|
let pool = PgPool::connect(&database_url).await?;
|
|
|
|
sqlx::migrate!("../post3/migrations/")
|
|
.set_locking(false)
|
|
.run(&pool)
|
|
.await?;
|
|
|
|
tracing::info!("database migrations applied");
|
|
|
|
let backend = PostgresBackend::new(pool);
|
|
let state = State { store: backend };
|
|
cmd.run(&state).await
|
|
}
|
|
serve::BackendType::Fs => {
|
|
let data_dir = cmd
|
|
.data_dir
|
|
.as_ref()
|
|
.context("--data-dir is required when using --backend fs")?;
|
|
|
|
std::fs::create_dir_all(data_dir)?;
|
|
tracing::info!(path = %data_dir.display(), "using filesystem backend");
|
|
|
|
let backend = FilesystemBackend::new(data_dir);
|
|
let state = State { store: backend };
|
|
cmd.run(&state).await
|
|
}
|
|
},
|
|
}
|
|
}
|