]> Untitled Git - lemmy.git/commitdiff
allow specifying db uri in config file (#2956)
authorCharles Hall <charles@computer.surgery>
Fri, 9 Jun 2023 12:18:22 +0000 (05:18 -0700)
committerGitHub <noreply@github.com>
Fri, 9 Jun 2023 12:18:22 +0000 (08:18 -0400)
* allow specifying db uri in config file

* succumb to a bug in doku

See <https://github.com/anixe/doku/issues/33>.

config/defaults.hjson
crates/utils/src/settings/mod.rs
crates/utils/src/settings/structs.rs

index 2f4fc57a08a0f34784df4e13ed4117d877bf5566..a686cdfedd59c258506e6c1ab7439a1200e99ec7 100644 (file)
@@ -1,16 +1,39 @@
 {
   # 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
   }
index cd181ffb5cfa33fadd383949f62a3f84deebd375..b0389a52045123a80044d2e345fe52b47b015e17 100644 (file)
@@ -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<Settings> = Lazy::new(|| {
@@ -43,15 +45,19 @@ 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(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 {
index c135c3a8ca3896234a7be686cacada73b91c2071..6e200b224dcac4514f36a5c486081caab7b51583 100644 (file)
@@ -55,8 +55,49 @@ pub struct PictrsConfig {
 }
 
 #[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,
@@ -72,9 +113,6 @@ pub struct DatabaseConfig {
   /// 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)]