]> Untitled Git - lemmy.git/blob - src/main.rs
Merge remote-tracking branch 'yerba/main' into main
[lemmy.git] / src / main.rs
1 #[macro_use]
2 extern crate diesel_migrations;
3
4 use actix::prelude::*;
5 use actix_web::*;
6 use diesel::{
7   r2d2::{ConnectionManager, Pool},
8   PgConnection,
9 };
10 use lemmy_api::match_websocket_operation;
11 use lemmy_apub::activity_queue::create_activity_queue;
12 use lemmy_db::get_database_url_from_env;
13 use lemmy_rate_limit::{rate_limiter::RateLimiter, RateLimit};
14 use lemmy_server::{code_migrations::run_advanced_migrations, routes::*};
15 use lemmy_structs::blocking;
16 use lemmy_utils::{settings::Settings, LemmyError};
17 use lemmy_websocket::{chat_server::ChatServer, LemmyContext};
18 use reqwest::Client;
19 use std::sync::Arc;
20 use tokio::sync::Mutex;
21
22 embed_migrations!();
23
24 #[actix_web::main]
25 async fn main() -> Result<(), LemmyError> {
26   env_logger::init();
27   let settings = Settings::get();
28
29   // Set up the r2d2 connection pool
30   let db_url = match get_database_url_from_env() {
31     Ok(url) => url,
32     Err(_) => settings.get_database_url(),
33   };
34   let manager = ConnectionManager::<PgConnection>::new(&db_url);
35   let pool = Pool::builder()
36     .max_size(settings.database.pool_size)
37     .build(manager)
38     .unwrap_or_else(|_| panic!("Error connecting to {}", db_url));
39
40   // Run the migrations from code
41   blocking(&pool, move |conn| {
42     embedded_migrations::run(conn)?;
43     run_advanced_migrations(conn)?;
44     Ok(()) as Result<(), LemmyError>
45   })
46   .await??;
47
48   // Set up the rate limiter
49   let rate_limiter = RateLimit {
50     rate_limiter: Arc::new(Mutex::new(RateLimiter::default())),
51   };
52
53   println!(
54     "Starting http server at {}:{}",
55     settings.bind, settings.port
56   );
57
58   let activity_queue = create_activity_queue();
59   let chat_server = ChatServer::startup(
60     pool.clone(),
61     rate_limiter.clone(),
62     |c, i, o, d| Box::pin(match_websocket_operation(c, i, o, d)),
63     Client::default(),
64     activity_queue.clone(),
65   )
66   .start();
67
68   // Create Http server with websocket support
69   HttpServer::new(move || {
70     let context = LemmyContext::create(
71       pool.clone(),
72       chat_server.to_owned(),
73       Client::default(),
74       activity_queue.to_owned(),
75     );
76     let rate_limiter = rate_limiter.clone();
77     App::new()
78       .wrap(middleware::Logger::default())
79       .data(context)
80       // The routes
81       .configure(|cfg| api::config(cfg, &rate_limiter))
82       .configure(federation::config)
83       .configure(feeds::config)
84       .configure(|cfg| images::config(cfg, &rate_limiter))
85       .configure(nodeinfo::config)
86       .configure(webfinger::config)
87       .service(actix_files::Files::new("/docs", "/app/documentation"))
88   })
89   .bind((settings.bind, settings.port))?
90   .run()
91   .await?;
92
93   Ok(())
94 }