mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-11-05 04:00:02 +00:00
Riley
a074564458
* Asyncify more * I guess these changed * Clean PR a bit * Convert more away from failure error * config changes for testing federation * It was DNS So actix-web's client relies on TRust DNS Resolver to figure out where to send data, but TRust DNS Resolver seems to not play nice with docker, which expressed itself as not resolving the name to an IP address _the first time_ when making a request. The fix was literally to make the request again (which I limited to 3 times total, and not exceeding the request timeout in total) * Only retry for connecterror Since TRust DNS Resolver was causing ConnectError::Timeout, this change limits the retry to only this error, returning immediately for any other error * Use http sig norm 0.4.0-alpha for actix-web 3.0 support * Blocking function, retry http requests * cargo +nightly fmt * Only create one pictrs dir * Don't yarn build * cargo +nightly fmt
133 lines
3.6 KiB
Rust
133 lines
3.6 KiB
Rust
extern crate lemmy_server;
|
|
#[macro_use]
|
|
extern crate diesel_migrations;
|
|
#[macro_use]
|
|
pub extern crate lazy_static;
|
|
|
|
pub type DbPool = Pool<ConnectionManager<PgConnection>>;
|
|
|
|
use crate::lemmy_server::actix_web::dev::Service;
|
|
use actix::prelude::*;
|
|
use actix_web::{
|
|
body::Body,
|
|
client::Client,
|
|
dev::{ServiceRequest, ServiceResponse},
|
|
http::{
|
|
header::{CACHE_CONTROL, CONTENT_TYPE},
|
|
HeaderValue,
|
|
},
|
|
*,
|
|
};
|
|
use diesel::{
|
|
r2d2::{ConnectionManager, Pool},
|
|
PgConnection,
|
|
};
|
|
use lemmy_server::{
|
|
blocking,
|
|
db::code_migrations::run_advanced_migrations,
|
|
rate_limit::{rate_limiter::RateLimiter, RateLimit},
|
|
routes::{api, federation, feeds, index, nodeinfo, webfinger},
|
|
settings::Settings,
|
|
websocket::server::*,
|
|
LemmyError,
|
|
};
|
|
use regex::Regex;
|
|
use std::sync::Arc;
|
|
use tokio::sync::Mutex;
|
|
|
|
lazy_static! {
|
|
static ref CACHE_CONTROL_REGEX: Regex =
|
|
Regex::new("^((text|image)/.+|application/javascript)$").unwrap();
|
|
// static ref CACHE_CONTROL_VALUE: String = format!("public, max-age={}", 365 * 24 * 60 * 60);
|
|
// Test out 1 hour here, this is breaking some things
|
|
static ref CACHE_CONTROL_VALUE: String = format!("public, max-age={}", 60 * 60);
|
|
}
|
|
|
|
embed_migrations!();
|
|
|
|
#[actix_rt::main]
|
|
async fn main() -> Result<(), LemmyError> {
|
|
env_logger::init();
|
|
let settings = Settings::get();
|
|
|
|
// Set up the r2d2 connection pool
|
|
let manager = ConnectionManager::<PgConnection>::new(&settings.get_database_url());
|
|
let pool = Pool::builder()
|
|
.max_size(settings.database.pool_size)
|
|
.build(manager)
|
|
.unwrap_or_else(|_| panic!("Error connecting to {}", settings.get_database_url()));
|
|
|
|
// Run the migrations from code
|
|
blocking(&pool, move |conn| {
|
|
embedded_migrations::run(conn)?;
|
|
run_advanced_migrations(conn)?;
|
|
Ok(()) as Result<(), LemmyError>
|
|
})
|
|
.await??;
|
|
|
|
// Set up the rate limiter
|
|
let rate_limiter = RateLimit {
|
|
rate_limiter: Arc::new(Mutex::new(RateLimiter::default())),
|
|
};
|
|
|
|
// Set up websocket server
|
|
let server = ChatServer::startup(pool.clone(), rate_limiter.clone(), Client::default()).start();
|
|
|
|
println!(
|
|
"Starting http server at {}:{}",
|
|
settings.bind, settings.port
|
|
);
|
|
|
|
// Create Http server with websocket support
|
|
HttpServer::new(move || {
|
|
let settings = Settings::get();
|
|
let rate_limiter = rate_limiter.clone();
|
|
App::new()
|
|
.wrap_fn(add_cache_headers)
|
|
.wrap(middleware::Logger::default())
|
|
.data(pool.clone())
|
|
.data(server.clone())
|
|
.data(Client::default())
|
|
// The routes
|
|
.configure(move |cfg| api::config(cfg, &rate_limiter))
|
|
.configure(federation::config)
|
|
.configure(feeds::config)
|
|
.configure(index::config)
|
|
.configure(nodeinfo::config)
|
|
.configure(webfinger::config)
|
|
// static files
|
|
.service(actix_files::Files::new(
|
|
"/static",
|
|
settings.front_end_dir.to_owned(),
|
|
))
|
|
.service(actix_files::Files::new(
|
|
"/docs",
|
|
settings.front_end_dir + "/documentation",
|
|
))
|
|
})
|
|
.bind((settings.bind, settings.port))?
|
|
.run()
|
|
.await?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn add_cache_headers<S>(
|
|
req: ServiceRequest,
|
|
srv: &mut S,
|
|
) -> impl Future<Output = Result<ServiceResponse, Error>>
|
|
where
|
|
S: Service<Request = ServiceRequest, Response = ServiceResponse<Body>, Error = Error>,
|
|
{
|
|
let fut = srv.call(req);
|
|
async move {
|
|
let mut res = fut.await?;
|
|
if let Some(content_type) = res.headers().get(CONTENT_TYPE) {
|
|
if CACHE_CONTROL_REGEX.is_match(content_type.to_str().unwrap()) {
|
|
let header_val = HeaderValue::from_static(&CACHE_CONTROL_VALUE);
|
|
res.headers_mut().insert(CACHE_CONTROL, header_val);
|
|
}
|
|
}
|
|
Ok(res)
|
|
}
|
|
}
|