Add support for env vars
This commit is contained in:
parent
1bc7317b24
commit
62c9be5b56
4 changed files with 81 additions and 13 deletions
10
Cargo.lock
generated
10
Cargo.lock
generated
|
@ -1103,15 +1103,6 @@ dependencies = [
|
||||||
"termcolor",
|
"termcolor",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "envy"
|
|
||||||
version = "0.4.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3f47e0157f2cb54f5ae1bd371b30a2ae4311e1c028f575cd4e81de7353215965"
|
|
||||||
dependencies = [
|
|
||||||
"serde",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "event-listener"
|
name = "event-listener"
|
||||||
version = "2.5.1"
|
version = "2.5.1"
|
||||||
|
@ -1964,7 +1955,6 @@ dependencies = [
|
||||||
"comrak",
|
"comrak",
|
||||||
"deser-hjson",
|
"deser-hjson",
|
||||||
"diesel",
|
"diesel",
|
||||||
"envy",
|
|
||||||
"futures",
|
"futures",
|
||||||
"http",
|
"http",
|
||||||
"itertools",
|
"itertools",
|
||||||
|
|
|
@ -34,4 +34,3 @@ diesel = "1.4.5"
|
||||||
http = "0.2.3"
|
http = "0.2.3"
|
||||||
jsonwebtoken = "7.2.0"
|
jsonwebtoken = "7.2.0"
|
||||||
deser-hjson = "0.1.12"
|
deser-hjson = "0.1.12"
|
||||||
envy = "0.4"
|
|
||||||
|
|
73
crates/utils/src/settings/environment.rs
Normal file
73
crates/utils/src/settings/environment.rs
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
use crate::settings::structs_opt::{
|
||||||
|
CaptchaConfigOpt,
|
||||||
|
DatabaseConfigOpt,
|
||||||
|
EmailConfigOpt,
|
||||||
|
FederationConfigOpt,
|
||||||
|
RateLimitConfigOpt,
|
||||||
|
SettingsOpt,
|
||||||
|
SetupOpt,
|
||||||
|
};
|
||||||
|
use std::{env, str::FromStr};
|
||||||
|
|
||||||
|
pub(in crate::settings) fn parse_from_env() -> SettingsOpt {
|
||||||
|
SettingsOpt {
|
||||||
|
hostname: env_var("HOSTNAME"),
|
||||||
|
bind: env_var("BIND"),
|
||||||
|
port: env_var("PORT"),
|
||||||
|
tls_enabled: env_var("TLS_ENABLED"),
|
||||||
|
jwt_secret: env_var("JWT_SECRET"),
|
||||||
|
pictrs_url: env_var("PICTRS_URL"),
|
||||||
|
iframely_url: env_var("IFRAMELY_URL"),
|
||||||
|
rate_limit: Some(RateLimitConfigOpt {
|
||||||
|
message: env_var("RATE_LIMIT__MESSAGE"),
|
||||||
|
message_per_second: env_var("RATE_LIMIT__MESSAGE_PER_SECOND"),
|
||||||
|
post: env_var("RATE_LIMIT__POST"),
|
||||||
|
post_per_second: env_var("RATE_LIMIT__POST_PER_SECOND"),
|
||||||
|
register: env_var("RATE_LIMIT__REGISTER"),
|
||||||
|
register_per_second: env_var("RATE_LIMIT__REGISTER_PER_SECOND"),
|
||||||
|
image: env_var("RATE_LIMIT__IMAGE"),
|
||||||
|
image_per_second: env_var("RATE_LIMIT__IMAGE_PER_SECOND"),
|
||||||
|
}),
|
||||||
|
email: Some(EmailConfigOpt {
|
||||||
|
smtp_server: env_var("EMAIL__SMTP_SERVER"),
|
||||||
|
smtp_login: Some(env_var("EMAIL__SMTP_LOGIN")),
|
||||||
|
smtp_password: Some(env_var("EMAIL__SMTP_PASSWORD")),
|
||||||
|
smtp_from_address: env_var("EMAIL__SMTP_FROM_ADDRESS"),
|
||||||
|
use_tls: env_var("EMAIL__USE_TLS"),
|
||||||
|
}),
|
||||||
|
federation: Some(FederationConfigOpt {
|
||||||
|
enabled: env_var("FEDERATION__ENABLED"),
|
||||||
|
allowed_instances: env_var("FEDERATION__ALLOWED_INSTANCES"),
|
||||||
|
blocked_instances: env_var("FEDERATION__BLOCKED_INSTANCES"),
|
||||||
|
}),
|
||||||
|
captcha: Some(CaptchaConfigOpt {
|
||||||
|
enabled: env_var("CAPTCHA__ENABLED"),
|
||||||
|
difficulty: env_var("CAPTCHA__DIFFICULTY"),
|
||||||
|
}),
|
||||||
|
setup: Some(SetupOpt {
|
||||||
|
admin_username: env_var("SETUP__ADMIN_USERNAME"),
|
||||||
|
admin_password: env_var("SETUP__ADMIN_PASSWORD"),
|
||||||
|
admin_email: Some(env_var("SETUP__ADMIN_EMAIL")),
|
||||||
|
site_name: env_var("SETUP__ADMIN_SITE_NAME"),
|
||||||
|
}),
|
||||||
|
database: Some(DatabaseConfigOpt {
|
||||||
|
user: env_var("DATABASE__USER"),
|
||||||
|
password: env_var("DATABASE__PASSWORD"),
|
||||||
|
host: env_var("DATABASE__HOST"),
|
||||||
|
port: env_var("DATABASE__PORT"),
|
||||||
|
database: env_var("DATABASE__DATABASE"),
|
||||||
|
pool_size: env_var("DATABASE__POOL_SIZE"),
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn env_var<T>(name: &str) -> Option<T>
|
||||||
|
where
|
||||||
|
T: FromStr,
|
||||||
|
<T as FromStr>::Err: std::fmt::Debug,
|
||||||
|
{
|
||||||
|
// TODO: probably remove the unwrap
|
||||||
|
env::var(format!("LEMMY_{}", name))
|
||||||
|
.ok()
|
||||||
|
.map(|v| T::from_str(&v).unwrap())
|
||||||
|
}
|
|
@ -1,6 +1,11 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
location_info,
|
location_info,
|
||||||
settings::{merge::Merge, structs::Settings, structs_opt::SettingsOpt},
|
settings::{
|
||||||
|
environment::parse_from_env,
|
||||||
|
merge::Merge,
|
||||||
|
structs::Settings,
|
||||||
|
structs_opt::SettingsOpt,
|
||||||
|
},
|
||||||
LemmyError,
|
LemmyError,
|
||||||
};
|
};
|
||||||
use anyhow::{anyhow, Context};
|
use anyhow::{anyhow, Context};
|
||||||
|
@ -8,6 +13,7 @@ use deser_hjson::from_str;
|
||||||
use std::{env, fs, io::Error, sync::RwLock};
|
use std::{env, fs, io::Error, sync::RwLock};
|
||||||
|
|
||||||
pub mod defaults;
|
pub mod defaults;
|
||||||
|
mod environment;
|
||||||
mod merge;
|
mod merge;
|
||||||
pub mod structs;
|
pub mod structs;
|
||||||
mod structs_opt;
|
mod structs_opt;
|
||||||
|
@ -36,7 +42,7 @@ impl Settings {
|
||||||
config.merge(from_str::<SettingsOpt>(&Self::read_config_file()?)?);
|
config.merge(from_str::<SettingsOpt>(&Self::read_config_file()?)?);
|
||||||
|
|
||||||
// Read env vars
|
// Read env vars
|
||||||
config.merge(envy::prefixed("LEMMY_").from_env::<SettingsOpt>()?);
|
config.merge(parse_from_env());
|
||||||
|
|
||||||
if config.hostname == Settings::default().hostname {
|
if config.hostname == Settings::default().hostname {
|
||||||
return Err(anyhow!("Hostname variable is not set!").into());
|
return Err(anyhow!("Hostname variable is not set!").into());
|
||||||
|
|
Loading…
Reference in a new issue