fix: initialization retry to avoid DB startup race condition
Build & Deployment / Build & Deploy (push) Failing after 30s

This commit is contained in:
Raul Lugo
2026-08-10 18:08:32 +02:00
parent 52a883ef07
commit e99fc2e388
3 changed files with 23 additions and 10 deletions
+1 -1
View File
@@ -54,7 +54,7 @@ jobs:
cd ${{ env.REMOTE_WORKING_DIRECTORY }} cd ${{ env.REMOTE_WORKING_DIRECTORY }}
docker compose build docker compose build
docker compose up -d wedding-db wedding-minio wedding-minio-init 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 up -d wedding-app
docker compose images docker compose images
docker image prune --all --force docker image prune --all --force
+2 -8
View File
@@ -8,7 +8,7 @@ services:
POSTGRES_USER: ${POSTGRES_USER:-wedding} POSTGRES_USER: ${POSTGRES_USER:-wedding}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-wedding} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-wedding}
volumes: volumes:
- wedding-db-data:/var/lib/postgresql/data - ./wedding-db-data:/var/lib/postgresql/data
healthcheck: healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-wedding} -d ${POSTGRES_DB:-wedding}"] test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-wedding} -d ${POSTGRES_DB:-wedding}"]
interval: 5s interval: 5s
@@ -26,7 +26,7 @@ services:
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin}
volumes: volumes:
- wedding-minio-data:/data - ./wedding-minio-data:/data
labels: labels:
- traefik.enable=true - traefik.enable=true
- traefik.docker.network=${TRAEFIK_NETWORK:-traefik} - traefik.docker.network=${TRAEFIK_NETWORK:-traefik}
@@ -130,12 +130,6 @@ services:
- wedding-private - wedding-private
- traefik-public - traefik-public
volumes:
wedding-db-data:
name: wedding-db-data
wedding-minio-data:
name: wedding-minio-data
networks: networks:
wedding-private: wedding-private:
name: wedding-private name: wedding-private
+20 -1
View File
@@ -47,7 +47,7 @@ async function main() {
} }
const client = new Client({ connectionString: url }); const client = new Client({ connectionString: url });
await client.connect(); await connectWithRetry(client);
try { try {
const files = listSqlFiles(migrationsDir); const files = listSqlFiles(migrationsDir);
@@ -68,3 +68,22 @@ main().catch((error) => {
console.error(error); console.error(error);
process.exit(1); 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));
}
}
}