lemmy/crates/federate/src/main.rs

58 lines
2 KiB
Rust

use activitypub_federation::config::FederationConfig;
use clap::Parser;
use lemmy_api_common::request::build_user_agent;
use lemmy_apub::{VerifyUrlData, FEDERATION_HTTP_FETCH_LIMIT};
use lemmy_db_schema::utils::build_db_pool;
use lemmy_federate::Opts;
use lemmy_utils::{error::LemmyErrorExt2, settings::SETTINGS, REQWEST_TIMEOUT};
use reqwest::Client;
use reqwest_middleware::ClientBuilder;
use reqwest_tracing::TracingMiddleware;
use tokio::signal::unix::SignalKind;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt::init();
let opts = Opts::parse();
let settings = SETTINGS.to_owned();
// TODO: wait until migrations are applied? or are they safe from race conditions and i can just call run_migrations here as well?
let pool = build_db_pool(&settings).await.into_anyhow()?;
let user_agent = build_user_agent(&settings);
let reqwest_client = Client::builder()
.user_agent(user_agent.clone())
.timeout(REQWEST_TIMEOUT)
.connect_timeout(REQWEST_TIMEOUT)
.build()?;
let client = ClientBuilder::new(reqwest_client.clone())
.with(TracingMiddleware::default())
.build();
let federation_config = FederationConfig::builder()
.domain(settings.hostname.clone())
.app_data(())
.client(client.clone())
.http_fetch_limit(FEDERATION_HTTP_FETCH_LIMIT)
.http_signature_compat(true)
.url_verifier(Box::new(VerifyUrlData(pool.clone())))
.build()
.await?;
let mut interrupt = tokio::signal::unix::signal(SignalKind::interrupt())?;
let mut terminate = tokio::signal::unix::signal(SignalKind::terminate())?;
let task =
lemmy_federate::start_stop_federation_workers_cancellable(opts, pool, federation_config);
tokio::select! {
_ = tokio::signal::ctrl_c() => {
tracing::warn!("Received ctrl-c, shutting down gracefully...");
}
_ = interrupt.recv() => {
tracing::warn!("Received interrupt, shutting down gracefully...");
}
_ = terminate.recv() => {
tracing::warn!("Received terminate, shutting down gracefully...");
}
}
task.cancel().await?;
Ok(())
}