From e99fc2e388041104f2f4b592e98fe2b7decdd422 Mon Sep 17 00:00:00 2001 From: Raul Lugo Date: Mon, 10 Aug 2026 18:08:32 +0200 Subject: [PATCH] fix: initialization retry to avoid DB startup race condition --- .github/workflows/deployment.yaml | 2 +- docker-compose.yml | 10 ++-------- scripts/migrate-sql.mjs | 21 ++++++++++++++++++++- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/.github/workflows/deployment.yaml b/.github/workflows/deployment.yaml index 28bf51c..6e6578b 100644 --- a/.github/workflows/deployment.yaml +++ b/.github/workflows/deployment.yaml @@ -54,7 +54,7 @@ jobs: cd ${{ env.REMOTE_WORKING_DIRECTORY }} docker compose build docker compose up -d wedding-db wedding-minio wedding-minio-init - docker compose up --force-recreate --no-deps --abort-on-container-exit --exit-code-from wedding-migrate wedding-migrate + docker compose up --force-recreate --abort-on-container-exit --exit-code-from wedding-migrate wedding-migrate docker compose up -d wedding-app docker compose images docker image prune --all --force diff --git a/docker-compose.yml b/docker-compose.yml index d11b9d4..98f0b6f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,7 +8,7 @@ services: POSTGRES_USER: ${POSTGRES_USER:-wedding} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-wedding} volumes: - - wedding-db-data:/var/lib/postgresql/data + - ./wedding-db-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-wedding} -d ${POSTGRES_DB:-wedding}"] interval: 5s @@ -26,7 +26,7 @@ services: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin} volumes: - - wedding-minio-data:/data + - ./wedding-minio-data:/data labels: - traefik.enable=true - traefik.docker.network=${TRAEFIK_NETWORK:-traefik} @@ -130,12 +130,6 @@ services: - wedding-private - traefik-public -volumes: - wedding-db-data: - name: wedding-db-data - wedding-minio-data: - name: wedding-minio-data - networks: wedding-private: name: wedding-private diff --git a/scripts/migrate-sql.mjs b/scripts/migrate-sql.mjs index f13e19a..67ed048 100644 --- a/scripts/migrate-sql.mjs +++ b/scripts/migrate-sql.mjs @@ -47,7 +47,7 @@ async function main() { } const client = new Client({ connectionString: url }); - await client.connect(); + await connectWithRetry(client); try { const files = listSqlFiles(migrationsDir); @@ -68,3 +68,22 @@ main().catch((error) => { console.error(error); process.exit(1); }); + +async function connectWithRetry(client) { + const maxAttempts = Number(process.env.DB_MIGRATION_CONNECT_ATTEMPTS ?? 30); + const delayMs = Number(process.env.DB_MIGRATION_CONNECT_DELAY_MS ?? 2000); + + for (let attempt = 1; attempt <= maxAttempts; attempt += 1) { + try { + await client.connect(); + return; + } catch (error) { + if (attempt === maxAttempts) throw error; + + console.log( + `Database is not ready yet. Retrying migration connection (${attempt}/${maxAttempts})...`, + ); + await new Promise((resolve) => setTimeout(resolve, delayMs)); + } + } +}