diff --git a/config/defaults.hjson b/config/defaults.hjson index 2f4fc57a08..900ad52a01 100644 --- a/config/defaults.hjson +++ b/config/defaults.hjson @@ -1,16 +1,37 @@ { # settings related to the postgresql database database: { - # Username to connect to postgres - user: "lemmy" - # Password to connect to postgres - password: "password" - # Host where postgres is running - host: "localhost" - # Port where postgres can be accessed - port: 5432 - # Name of the postgres database for lemmy - database: "lemmy" + + # Configure the database by specifying a URI + # + # This is the preferred method to specify database connection details since + # it is the most flexible. + # Connection URI pointing to a postgres instance + # + # This example uses peer authentication to obviate the need for creating, + # configuring, and managing passwords. + # + # For an explanation of how to use connection URIs, see [here][0] in + # PostgreSQL's documentation. + # + # [0]: https://www.postgresql.org/docs/current/libpq-connect.html#id-1.7.3.8.3.6 + uri: "postgresql:///lemmy?user=lemmy&host=/var/run/postgresql" + // or + # Configure the database by specifying parts of a URI + # + # Note that specifying the `uri` field should be preferred since it provides + # greater control over how the connection is made. This merely exists for + # backwards-compatibility. + # Username to connect to postgres + user: "string" + # Password to connect to postgres + password: "string" + # Host where postgres is running + host: "string" + # Port where postgres can be accessed + port: 123 + # Name of the postgres database for lemmy + database: "string" # Maximum number of active sql connections pool_size: 5 } diff --git a/crates/utils/src/settings/mod.rs b/crates/utils/src/settings/mod.rs index cd181ffb5c..0f310209c4 100644 --- a/crates/utils/src/settings/mod.rs +++ b/crates/utils/src/settings/mod.rs @@ -12,6 +12,8 @@ use std::{env, fs, io::Error}; pub mod structs; +use structs::DatabaseConnection; + static DEFAULT_CONFIG_FILE: &str = "config/config.hjson"; pub static SETTINGS: Lazy = Lazy::new(|| { @@ -43,15 +45,25 @@ impl Settings { } pub fn get_database_url(&self) -> String { - let conf = &self.database; - format!( - "postgres://{}:{}@{}:{}/{}", - utf8_percent_encode(&conf.user, NON_ALPHANUMERIC), - utf8_percent_encode(&conf.password, NON_ALPHANUMERIC), - conf.host, - conf.port, - utf8_percent_encode(&conf.database, NON_ALPHANUMERIC), - ) + match &self.database.connection { + DatabaseConnection::Uri { uri } => uri.clone(), + DatabaseConnection::Parts { + user, + password, + host, + port, + database, + } => { + format!( + "postgres://{}:{}@{}:{}/{}", + utf8_percent_encode(user, NON_ALPHANUMERIC), + utf8_percent_encode(password, NON_ALPHANUMERIC), + host, + port, + utf8_percent_encode(database, NON_ALPHANUMERIC), + ) + } + } } fn get_config_location() -> String { diff --git a/crates/utils/src/settings/structs.rs b/crates/utils/src/settings/structs.rs index c135c3a8ca..20a3b2bc46 100644 --- a/crates/utils/src/settings/structs.rs +++ b/crates/utils/src/settings/structs.rs @@ -55,28 +55,62 @@ pub struct PictrsConfig { } #[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)] -#[serde(default, deny_unknown_fields)] +#[serde(default)] pub struct DatabaseConfig { - /// Username to connect to postgres - #[default("lemmy")] - pub(super) user: String, - /// Password to connect to postgres - #[default("password")] - pub password: String, - #[default("localhost")] - /// Host where postgres is running - pub host: String, - /// Port where postgres can be accessed - #[default(5432)] - pub(super) port: i32, - /// Name of the postgres database for lemmy - #[default("lemmy")] - pub(super) database: String, + #[serde(flatten, default)] + pub connection: DatabaseConnection, + /// Maximum number of active sql connections #[default(5)] pub pool_size: usize, } +#[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)] +#[serde(untagged)] +pub enum DatabaseConnection { + /// Configure the database by specifying a URI + /// + /// This is the preferred method to specify database connection details since + /// it is the most flexible. + Uri { + /// Connection URI pointing to a postgres instance + /// + /// This example uses peer authentication to obviate the need for creating, + /// configuring, and managing passwords. + /// + /// For an explanation of how to use connection URIs, see [here][0] in + /// PostgreSQL's documentation. + /// + /// [0]: https://www.postgresql.org/docs/current/libpq-connect.html#id-1.7.3.8.3.6 + #[doku(example = "postgresql:///lemmy?user=lemmy&host=/var/run/postgresql")] + uri: String, + }, + + /// Configure the database by specifying parts of a URI + /// + /// Note that specifying the `uri` field should be preferred since it provides + /// greater control over how the connection is made. This merely exists for + /// backwards-compatibility. + #[default] + Parts { + /// Username to connect to postgres + #[default("lemmy")] + user: String, + /// Password to connect to postgres + #[default("password")] + password: String, + #[default("localhost")] + /// Host where postgres is running + host: String, + /// Port where postgres can be accessed + #[default(5432)] + port: i32, + /// Name of the postgres database for lemmy + #[default("lemmy")] + database: String, + }, +} + #[derive(Debug, Deserialize, Serialize, Clone, Document, SmartDefault)] #[serde(deny_unknown_fields)] pub struct EmailConfig {