//! # REST API server for the Mentalo application mod env; mod standard_static_files; mod tls; use actix_files::Files; use actix_web::{ middleware::Logger, web::{get, resource, to}, App, HttpResponse, HttpServer, }; use actix_web_middleware_redirect_https::RedirectHTTPS; use env::get_log_level; use env_logger::Env; use standard_static_files::{favicon, robots, sitemap}; use std::env::var as env_var; use tls::get_tls_config; #[actix_web::main] async fn main() -> std::io::Result<()> { env_logger::Builder::from_env(Env::default().default_filter_or(get_log_level())).init(); let server_port = env_var("SERVER_PORT").expect("SERVER_PORT is not defined."); let server_port_tls = env_var("SERVER_PORT_TLS").expect("SERVER_PORT_TLS is not defined."); let public_dir = std::path::PathBuf::from(env_var("RESOURCES_DIR").expect("RESOURCES_DIR is not defined")) .join("public"); HttpServer::new(move || { App::new() .wrap(Logger::default()) // Redirect all requests to https .wrap(RedirectHTTPS::with_replacements(&[( format!(":{}", server_port), format!(":{}", server_port_tls), )])) // .wrap(NormalizePath::new(TrailingSlash::Trim)) // Allow json payload to have size until ~32MB // .app_data(JsonConfig::default().limit(1 << 25u8)) ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // STANDARD FILES /////////////////////////////////////////////////////////////////////////////////////////// .service(resource("/favicon.ico").route(get().to(favicon))) .service(resource("/robots.txt").route(get().to(robots))) .service(resource("/sitemap.xml").route(get().to(sitemap))) ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // PUBLIC WEBSITE ////////////////////////////////////////////////////////////////////////////////////////////// .service(Files::new("/", &public_dir).index_file("index.html")) ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // empty 404 //////////////////////////////////////////////////////////////////////////////////////////////// .default_service(to(|| { HttpResponse::NotFound().body("<h1>404 - Page not found</h1>") })) }) .bind(format!("0.0.0.0:{}", env_var("SERVER_PORT").unwrap()))? .bind_rustls( format!("0.0.0.0:{}", env_var("SERVER_PORT_TLS").unwrap()), get_tls_config(), )? .run() .await }