fix: initialization retry to avoid DB startup race condition
Build & Deployment / Build & Deploy (push) Failing after 30s
Build & Deployment / Build & Deploy (push) Failing after 30s
This commit is contained in:
@@ -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
@@ -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
@@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user