{
# 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
}
pub mod structs;
+use structs::DatabaseConnection;
+
static DEFAULT_CONFIG_FILE: &str = "config/config.hjson";
pub static SETTINGS: Lazy<Settings> = Lazy::new(|| {
}
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(parts) => {
+ format!(
+ "postgres://{}:{}@{}:{}/{}",
+ utf8_percent_encode(&parts.user, NON_ALPHANUMERIC),
+ utf8_percent_encode(&parts.password, NON_ALPHANUMERIC),
+ parts.host,
+ parts.port,
+ utf8_percent_encode(&parts.database, NON_ALPHANUMERIC),
+ )
+ }
+ }
}
fn get_config_location() -> String {
}
#[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)]
-#[serde(default, deny_unknown_fields)]
+#[serde(default)]
pub struct DatabaseConfig {
+ #[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(DatabaseConnectionParts),
+}
+
+#[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)]
+#[serde(default)]
+pub struct DatabaseConnectionParts {
/// Username to connect to postgres
#[default("lemmy")]
pub(super) user: String,
/// Name of the postgres database for lemmy
#[default("lemmy")]
pub(super) database: String,
- /// Maximum number of active sql connections
- #[default(5)]
- pub pool_size: usize,
}
#[derive(Debug, Deserialize, Serialize, Clone, Document, SmartDefault)]