Add support for env vars

This commit is contained in:
Felix Ableitner 2021-02-19 19:37:04 +01:00
parent 1bc7317b24
commit 62c9be5b56
4 changed files with 81 additions and 13 deletions

10
Cargo.lock generated
View file

@ -1103,15 +1103,6 @@ dependencies = [
"termcolor",
]
[[package]]
name = "envy"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f47e0157f2cb54f5ae1bd371b30a2ae4311e1c028f575cd4e81de7353215965"
dependencies = [
"serde",
]
[[package]]
name = "event-listener"
version = "2.5.1"
@ -1964,7 +1955,6 @@ dependencies = [
"comrak",
"deser-hjson",
"diesel",
"envy",
"futures",
"http",
"itertools",

View file

@ -34,4 +34,3 @@ diesel = "1.4.5"
http = "0.2.3"
jsonwebtoken = "7.2.0"
deser-hjson = "0.1.12"
envy = "0.4"

View 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())
}

View file

@ -1,6 +1,11 @@
use crate::{
location_info,
settings::{merge::Merge, structs::Settings, structs_opt::SettingsOpt},
settings::{
environment::parse_from_env,
merge::Merge,
structs::Settings,
structs_opt::SettingsOpt,
},
LemmyError,
};
use anyhow::{anyhow, Context};
@ -8,6 +13,7 @@ use deser_hjson::from_str;
use std::{env, fs, io::Error, sync::RwLock};
pub mod defaults;
mod environment;
mod merge;
pub mod structs;
mod structs_opt;
@ -36,7 +42,7 @@ impl Settings {
config.merge(from_str::<SettingsOpt>(&Self::read_config_file()?)?);
// Read env vars
config.merge(envy::prefixed("LEMMY_").from_env::<SettingsOpt>()?);
config.merge(parse_from_env());
if config.hostname == Settings::default().hostname {
return Err(anyhow!("Hostname variable is not set!").into());