From c654872d9c972948508a82cca02530827978155d Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 25 Apr 2025 16:09:02 -0700 Subject: [PATCH] single init script --- docker/prod/docker-compose.yaml | 3 +- docker/prod/mongo/init/01_init_replica_set.js | 16 ----- docker/prod/mongo/init/02_create_users.js | 16 ----- docker/prod/mongo/init/init.js | 59 +++++++++++++++++++ 4 files changed, 60 insertions(+), 34 deletions(-) delete mode 100644 docker/prod/mongo/init/01_init_replica_set.js delete mode 100755 docker/prod/mongo/init/02_create_users.js create mode 100644 docker/prod/mongo/init/init.js diff --git a/docker/prod/docker-compose.yaml b/docker/prod/docker-compose.yaml index 91d5e2643..d5465d170 100755 --- a/docker/prod/docker-compose.yaml +++ b/docker/prod/docker-compose.yaml @@ -52,7 +52,6 @@ services: - "27017:27017" volumes: - ./mongo/data:/data/db - - ./mongo/init/01_init_replica_set.js:/docker-entrypoint-initdb.d/01_init_replica_set.js - - ./mongo/init/02_create_users.js:/docker-entrypoint-initdb.d/02_create_users.js + - ./mongo/init/init.js:/docker-entrypoint-initdb.d/init.js env_file: - mongo.env diff --git a/docker/prod/mongo/init/01_init_replica_set.js b/docker/prod/mongo/init/01_init_replica_set.js deleted file mode 100644 index 2886c27aa..000000000 --- a/docker/prod/mongo/init/01_init_replica_set.js +++ /dev/null @@ -1,16 +0,0 @@ -function waitForPrimary() { - while (true) { - try { - rs.initiate({ - _id: "rs0", - members: [{ _id: 0, host: "localhost:27017" }], - }); - break; - } catch (e) { - print("Replica set initiation failed, retrying in 2s..."); - sleep(2000); - } - } -} - -waitForPrimary(); diff --git a/docker/prod/mongo/init/02_create_users.js b/docker/prod/mongo/init/02_create_users.js deleted file mode 100755 index adb2bf078..000000000 --- a/docker/prod/mongo/init/02_create_users.js +++ /dev/null @@ -1,16 +0,0 @@ -var username = process.env.USERNAME_ENV_VAR; -var password = process.env.PASSWORD_ENV_VAR; - -db = db.getSiblingDB("uptime_db"); - -db.createUser({ - user: username, - pwd: password, - roles: [ - { - role: "readWrite", - db: "uptime_db", - }, - ], -}); -print("User uptime_user created successfully"); diff --git a/docker/prod/mongo/init/init.js b/docker/prod/mongo/init/init.js new file mode 100644 index 000000000..74c9a830f --- /dev/null +++ b/docker/prod/mongo/init/init.js @@ -0,0 +1,59 @@ +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +async function initReplicaSet() { + while (true) { + try { + rs.initiate({ + _id: "rs0", + members: [{ _id: 0, host: "localhost:27017" }], + }); + print("Replica set initiated."); + break; + } catch (e) { + print("Replica set initiation failed, retrying in 2s..."); + await sleep(2000); + } + } + + // Wait until the node becomes primary + while (true) { + try { + const status = rs.status(); + if (status.myState === 1) { + print("Node is now PRIMARY."); + break; + } + } catch (e) { + print("⏳ Waiting for PRIMARY state..."); + } + await sleep(1000); + } +} + +async function createAppUser() { + const username = process.env.USERNAME_ENV_VAR; + const password = process.env.PASSWORD_ENV_VAR; + + if (!username || !password) { + throw new Error("USERNAME_ENV_VAR or PASSWORD_ENV_VAR not set."); + } + + const dbName = "uptime_db"; + const userDb = db.getSiblingDB(dbName); + + try { + userDb.createUser({ + user: username, + pwd: password, + roles: [{ role: "readWrite", db: dbName }], + }); + print(`✅ User '${username}' created successfully.`); + } catch (e) { + print(`⚠️ Failed to create user '${username}': ${e.message}`); + } +} + +await initReplicaSet(); +await createAppUser();