2021-09-18 17:55:39 +00:00
|
|
|
use actix_web::{web, App, HttpServer};
|
2021-09-18 18:55:11 +00:00
|
|
|
use opentelemetry::{sdk::Resource, KeyValue};
|
2021-09-18 18:40:47 +00:00
|
|
|
use opentelemetry_otlp::WithExportConfig;
|
2021-09-18 17:55:39 +00:00
|
|
|
use tracing_actix_web::TracingLogger;
|
|
|
|
use tracing_error::ErrorLayer;
|
|
|
|
use tracing_log::LogTracer;
|
|
|
|
use tracing_subscriber::{fmt::format::FmtSpan, layer::SubscriberExt, EnvFilter};
|
2020-03-15 02:05:40 +00:00
|
|
|
|
|
|
|
mod apub;
|
2020-03-20 00:55:11 +00:00
|
|
|
mod args;
|
|
|
|
mod config;
|
2020-03-23 22:17:53 +00:00
|
|
|
mod data;
|
2020-03-16 17:56:26 +00:00
|
|
|
mod db;
|
2020-03-16 03:36:46 +00:00
|
|
|
mod error;
|
2020-03-21 20:24:05 +00:00
|
|
|
mod jobs;
|
2020-03-23 17:38:39 +00:00
|
|
|
mod middleware;
|
2020-03-17 17:15:16 +00:00
|
|
|
mod requests;
|
2020-03-23 17:38:39 +00:00
|
|
|
mod routes;
|
2020-03-15 02:05:40 +00:00
|
|
|
|
2020-03-20 18:40:18 +00:00
|
|
|
use self::{
|
2020-03-21 20:24:05 +00:00
|
|
|
args::Args,
|
|
|
|
config::Config,
|
2021-02-10 04:05:06 +00:00
|
|
|
data::{ActorCache, MediaCache, State},
|
2020-03-21 20:24:05 +00:00
|
|
|
db::Db,
|
|
|
|
jobs::{create_server, create_workers},
|
2020-07-10 20:07:47 +00:00
|
|
|
middleware::{DebugPayload, RelayResolver},
|
2020-03-23 17:38:39 +00:00
|
|
|
routes::{actor, inbox, index, nodeinfo, nodeinfo_meta, statics},
|
2020-03-20 18:40:18 +00:00
|
|
|
};
|
2020-03-20 04:06:16 +00:00
|
|
|
|
2020-03-15 02:05:40 +00:00
|
|
|
#[actix_rt::main]
|
|
|
|
async fn main() -> Result<(), anyhow::Error> {
|
|
|
|
dotenv::dotenv().ok();
|
|
|
|
|
2021-09-18 18:40:47 +00:00
|
|
|
let config = Config::build()?;
|
|
|
|
|
2021-09-18 17:55:39 +00:00
|
|
|
LogTracer::init()?;
|
2020-03-15 22:37:53 +00:00
|
|
|
|
2021-09-18 17:55:39 +00:00
|
|
|
let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
|
2020-03-20 00:55:11 +00:00
|
|
|
|
2021-09-18 17:55:39 +00:00
|
|
|
let format_layer = tracing_subscriber::fmt::layer()
|
|
|
|
.with_span_events(FmtSpan::NEW | FmtSpan::CLOSE)
|
|
|
|
.pretty();
|
|
|
|
|
|
|
|
let subscriber = tracing_subscriber::Registry::default()
|
|
|
|
.with(env_filter)
|
|
|
|
.with(ErrorLayer::default())
|
|
|
|
.with(format_layer);
|
|
|
|
|
2021-09-18 18:40:47 +00:00
|
|
|
if let Some(url) = config.opentelemetry_url() {
|
2021-09-18 18:55:11 +00:00
|
|
|
let tracer =
|
|
|
|
opentelemetry_otlp::new_pipeline()
|
|
|
|
.tracing()
|
|
|
|
.with_trace_config(opentelemetry::sdk::trace::config().with_resource(
|
|
|
|
Resource::new(vec![KeyValue::new("service.name", config.software_name())]),
|
|
|
|
))
|
|
|
|
.with_exporter(
|
|
|
|
opentelemetry_otlp::new_exporter()
|
|
|
|
.tonic()
|
|
|
|
.with_endpoint(url.as_str()),
|
|
|
|
)
|
2021-09-18 20:47:10 +00:00
|
|
|
.install_batch(opentelemetry::runtime::Tokio)?;
|
2021-09-18 17:55:39 +00:00
|
|
|
|
2021-09-18 18:40:47 +00:00
|
|
|
let otel_layer = tracing_opentelemetry::layer().with_tracer(tracer);
|
|
|
|
|
|
|
|
let subscriber = subscriber.with(otel_layer);
|
|
|
|
tracing::subscriber::set_global_default(subscriber)?;
|
|
|
|
} else {
|
|
|
|
tracing::subscriber::set_global_default(subscriber)?;
|
|
|
|
}
|
2020-03-20 00:55:11 +00:00
|
|
|
|
2020-04-21 17:07:39 +00:00
|
|
|
let db = Db::build(&config)?;
|
2020-03-15 02:05:40 +00:00
|
|
|
|
2020-03-20 00:55:11 +00:00
|
|
|
let args = Args::new();
|
|
|
|
|
2021-02-10 04:05:06 +00:00
|
|
|
if !args.blocks().is_empty() || !args.allowed().is_empty() {
|
2020-03-20 00:55:11 +00:00
|
|
|
if args.undo() {
|
2021-02-10 04:05:06 +00:00
|
|
|
db.remove_blocks(args.blocks().to_vec()).await?;
|
|
|
|
db.remove_allows(args.allowed().to_vec()).await?;
|
2020-03-20 00:55:11 +00:00
|
|
|
} else {
|
2021-02-10 04:05:06 +00:00
|
|
|
db.add_blocks(args.blocks().to_vec()).await?;
|
|
|
|
db.add_allows(args.allowed().to_vec()).await?;
|
2020-03-20 00:55:11 +00:00
|
|
|
}
|
|
|
|
return Ok(());
|
|
|
|
}
|
|
|
|
|
2021-02-10 04:05:06 +00:00
|
|
|
let media = MediaCache::new(db.clone());
|
|
|
|
let state = State::build(config.clone(), db.clone()).await?;
|
2020-03-23 22:17:53 +00:00
|
|
|
let actors = ActorCache::new(db.clone());
|
2020-07-11 01:00:31 +00:00
|
|
|
let job_server = create_server();
|
2020-03-15 02:05:40 +00:00
|
|
|
|
2021-02-10 04:05:06 +00:00
|
|
|
create_workers(
|
|
|
|
db.clone(),
|
|
|
|
state.clone(),
|
|
|
|
actors.clone(),
|
|
|
|
job_server.clone(),
|
|
|
|
media.clone(),
|
|
|
|
config.clone(),
|
|
|
|
);
|
2020-03-23 00:07:36 +00:00
|
|
|
|
2020-03-20 00:55:11 +00:00
|
|
|
let bind_address = config.bind_address();
|
2020-03-15 02:05:40 +00:00
|
|
|
HttpServer::new(move || {
|
|
|
|
App::new()
|
2021-09-18 17:55:39 +00:00
|
|
|
.wrap(TracingLogger::default())
|
2021-06-26 23:14:43 +00:00
|
|
|
.app_data(web::Data::new(db.clone()))
|
|
|
|
.app_data(web::Data::new(state.clone()))
|
|
|
|
.app_data(web::Data::new(state.requests()))
|
|
|
|
.app_data(web::Data::new(actors.clone()))
|
|
|
|
.app_data(web::Data::new(config.clone()))
|
|
|
|
.app_data(web::Data::new(job_server.clone()))
|
|
|
|
.app_data(web::Data::new(media.clone()))
|
2020-03-15 02:05:40 +00:00
|
|
|
.service(web::resource("/").route(web::get().to(index)))
|
2020-03-26 03:26:45 +00:00
|
|
|
.service(web::resource("/media/{path}").route(web::get().to(routes::media)))
|
2020-03-16 04:26:31 +00:00
|
|
|
.service(
|
|
|
|
web::resource("/inbox")
|
2020-03-20 00:55:11 +00:00
|
|
|
.wrap(config.digest_middleware())
|
2020-12-23 18:30:19 +00:00
|
|
|
.wrap(config.signature_middleware(
|
|
|
|
state.requests(),
|
|
|
|
actors.clone(),
|
|
|
|
state.clone(),
|
|
|
|
))
|
2020-07-10 20:34:18 +00:00
|
|
|
.wrap(DebugPayload(config.debug()))
|
2020-03-23 17:38:39 +00:00
|
|
|
.route(web::post().to(inbox)),
|
2020-03-16 04:26:31 +00:00
|
|
|
)
|
2020-03-23 17:38:39 +00:00
|
|
|
.service(web::resource("/actor").route(web::get().to(actor)))
|
|
|
|
.service(web::resource("/nodeinfo/2.0.json").route(web::get().to(nodeinfo)))
|
2020-03-19 19:05:16 +00:00
|
|
|
.service(
|
|
|
|
web::scope("/.well-known")
|
2020-04-21 19:12:10 +00:00
|
|
|
.service(actix_webfinger::scoped::<RelayResolver>())
|
2020-03-23 17:38:39 +00:00
|
|
|
.service(web::resource("/nodeinfo").route(web::get().to(nodeinfo_meta))),
|
2020-03-19 19:05:16 +00:00
|
|
|
)
|
2020-03-23 17:38:39 +00:00
|
|
|
.service(web::resource("/static/{filename}").route(web::get().to(statics)))
|
2020-03-15 02:05:40 +00:00
|
|
|
})
|
2020-03-20 00:55:11 +00:00
|
|
|
.bind(bind_address)?
|
2020-03-15 02:05:40 +00:00
|
|
|
.run()
|
|
|
|
.await?;
|
|
|
|
Ok(())
|
|
|
|
}
|
2020-03-20 18:40:18 +00:00
|
|
|
|
|
|
|
include!(concat!(env!("OUT_DIR"), "/templates.rs"));
|