瀏覽代碼

feat(server): Support TypeSense High-Availibility configuration (#2146)

* feat(server): Support TypeSense High-Availibility configuration.

* Lint fixes

* Address comments.
Skyler Mäntysaari 2 年之前
父節點
當前提交
fc585bffcc
共有 2 個文件被更改,包括 40 次插入13 次删除
  1. 8 0
      docker/example.env
  2. 32 13
      server/libs/infra/src/infra.config.ts

+ 8 - 0
docker/example.env

@@ -47,6 +47,14 @@ UPLOAD_LOCATION=absolute_location_on_your_machine_where_you_want_to_store_the_ba
 ###################################################################################
 TYPESENSE_API_KEY=some-random-text
 # TYPESENSE_ENABLED=false
+# TYPESENSE_URL uses base64 encoding for the nodes json.
+# Example JSON that was used:
+# [
+#      { 'host': 'typesense-1.example.net', 'port': '443', 'protocol': 'https' },
+#      { 'host': 'typesense-2.example.net', 'port': '443', 'protocol': 'https' },
+#      { 'host': 'typesense-3.example.net', 'port': '443', 'protocol': 'https' },
+#  ]
+# TYPESENSE_URL=ha://WwogICAgeyAnaG9zdCc6ICd0eXBlc2Vuc2UtMS5leGFtcGxlLm5ldCcsICdwb3J0JzogJzQ0MycsICdwcm90b2NvbCc6ICdodHRwcycgfSwKICAgIHsgJ2hvc3QnOiAndHlwZXNlbnNlLTIuZXhhbXBsZS5uZXQnLCAncG9ydCc6ICc0NDMnLCAncHJvdG9jb2wnOiAnaHR0cHMnIH0sCiAgICB7ICdob3N0JzogJ3R5cGVzZW5zZS0zLmV4YW1wbGUubmV0JywgJ3BvcnQnOiAnNDQzJywgJ3Byb3RvY29sJzogJ2h0dHBzJyB9LApd
 
 ###################################################################################
 # Reverse Geocoding

+ 32 - 13
server/libs/infra/src/infra.config.ts

@@ -37,16 +37,35 @@ export const bullConfig: BullModuleOptions = {
 
 export const bullQueues: BullModuleOptions[] = Object.values(QueueName).map((name) => ({ name }));
 
-export const typesenseConfig: ConfigurationOptions = {
-  nodes: [
-    {
-      host: process.env.TYPESENSE_HOST || 'typesense',
-      port: Number(process.env.TYPESENSE_PORT) || 8108,
-      protocol: process.env.TYPESENSE_PROTOCOL || 'http',
-    },
-  ],
-  apiKey: process.env.TYPESENSE_API_KEY as string,
-  numRetries: 15,
-  retryIntervalSeconds: 4,
-  connectionTimeoutSeconds: 10,
-};
+function parseTypeSenseConfig(): ConfigurationOptions {
+  const typesenseURL = process.env.TYPESENSE_URL;
+  const common = {
+    apiKey: process.env.TYPESENSE_API_KEY as string,
+    numRetries: 15,
+    retryIntervalSeconds: 4,
+    connectionTimeoutSeconds: 10,
+  };
+  if (typesenseURL && typesenseURL.startsWith('ha://')) {
+    try {
+      const decodedString = Buffer.from(typesenseURL.slice(5), 'base64').toString();
+      return {
+        nodes: JSON.parse(decodedString),
+        ...common,
+      };
+    } catch (error) {
+      throw new Error(`Failed to decode typesense options: ${error}`);
+    }
+  }
+  return {
+    nodes: [
+      {
+        host: process.env.TYPESENSE_HOST || 'typesense',
+        port: Number(process.env.TYPESENSE_PORT) || 8108,
+        protocol: process.env.TYPESENSE_PROTOCOL || 'http',
+      },
+    ],
+    ...common,
+  };
+}
+
+export const typesenseConfig: ConfigurationOptions = parseTypeSenseConfig();