[DockerCompose] Add healthchecks for all applicable containers

This commit is contained in:
Aaro Koivukangas
2026-07-04 10:41:26 +03:00
parent d8d34a58b1
commit f734c0db38
7 changed files with 153 additions and 30 deletions
+26 -9
View File
@@ -1,6 +1,11 @@
x-defaults: &defaults
restart: unless-stopped
x-healthcheck-defaults: &healthcheck-defaults
interval: 1s
timeout: 3s
retries: 30
services:
kone-db:
<<: *defaults
@@ -10,6 +15,21 @@ services:
POSTGRES_DB: kone-db
POSTGRES_HOST_AUTH_METHOD: trust
image: postgres:15.10
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'kone-db']
<<: *healthcheck-defaults
user-db:
<<: *defaults
container_name: oodikone-user-db
environment:
PGDATA: /data
POSTGRES_DB: user-db
POSTGRES_HOST_AUTH_METHOD: trust
image: postgres:15.10
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'user-db']
<<: *healthcheck-defaults
sis-db:
<<: *defaults
@@ -20,6 +40,9 @@ services:
POSTGRES_HOST_AUTH_METHOD: trust
image: postgres:15.10
shm_size: 2gb
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'sis-db']
<<: *healthcheck-defaults
sis-importer-db:
<<: *defaults
@@ -29,12 +52,6 @@ services:
POSTGRES_DB: sis-importer-db
POSTGRES_HOST_AUTH_METHOD: trust
image: postgres:15.10
user-db:
<<: *defaults
container_name: oodikone-user-db
environment:
PGDATA: /data
POSTGRES_DB: user-db
POSTGRES_HOST_AUTH_METHOD: trust
image: postgres:15.10
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'sis-importer-db']
<<: *healthcheck-defaults
+54 -11
View File
@@ -3,6 +3,11 @@ name: oodikone
x-defaults: &defaults
restart: unless-stopped
x-healthcheck-defaults: &healthcheck-defaults
interval: 1s
timeout: 3s
retries: 30
services:
backend:
<<: *defaults
@@ -12,10 +17,14 @@ services:
context: services
dockerfile: backend/Dockerfile
depends_on:
- kone-db
- redis
- sis-db
- user-db
kone-db:
condition: service_healthy
redis:
condition: service_healthy
sis-db:
condition: service_healthy
user-db:
condition: service_healthy
environment:
CI: 'true'
DB_URL_USER: postgres://postgres@user-db:5432/user-db
@@ -30,6 +39,9 @@ services:
CRYPT_KEY: 'e16730fce263d5270ba8dcf84d068a32556542455e71331880d6c1c5e4db9b4e'
profiles:
- oodikone
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:8080/api/health']
<<: *healthcheck-defaults
frontend:
<<: *defaults
@@ -38,6 +50,9 @@ services:
build:
context: services
dockerfile: frontend/Dockerfile
depends_on:
backend:
condition: service_healthy
profiles:
- oodikone
@@ -51,6 +66,9 @@ services:
POSTGRES_HOST_AUTH_METHOD: trust
ports:
- 4321:5432
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'kone-db']
<<: *healthcheck-defaults
user-db:
<<: *defaults
@@ -62,6 +80,9 @@ services:
POSTGRES_HOST_AUTH_METHOD: trust
ports:
- 4320:5432
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'user-db']
<<: *healthcheck-defaults
redis:
<<: *defaults
@@ -71,6 +92,9 @@ services:
sh -c 'redis-server --appendonly yes && redis-cli flushall'
ports:
- 6379:6379
healthcheck:
test: ['CMD-SHELL', 'redis-cli ping | grep PONG']
<<: *healthcheck-defaults
sis-db:
<<: *defaults
@@ -83,6 +107,9 @@ services:
shm_size: 2gb
ports:
- 12345:5432
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'sis-db']
<<: *healthcheck-defaults
sis-importer-db:
<<: *defaults
@@ -92,6 +119,9 @@ services:
- updater
ports:
- 12346:5432
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'sis-importer-db']
<<: *healthcheck-defaults
jami:
<<: *defaults
@@ -114,13 +144,18 @@ services:
- POSTGRES_PASSWORD=postgres
ports:
- 5433:5432
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'postgres']
<<: *healthcheck-defaults
nginx:
container_name: oodikone-nginx
image: nginx:latest
depends_on:
- frontend
- backend
frontend:
condition: service_healthy
backend:
condition: service_healthy
ports:
- 1337:80
profiles:
@@ -135,8 +170,10 @@ services:
build:
context: updater/sis-updater-scheduler
depends_on:
- redis
- sis-importer-db
redis:
condition: service_healthy
sis-importer-db:
condition: service_healthy
environment:
CI: 'true'
REDIS_HOST: redis
@@ -151,6 +188,9 @@ services:
- 8082:8082
profiles:
- updater
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:8082/health']
<<: *healthcheck-defaults
sis-updater-worker:
<<: *defaults
@@ -158,9 +198,12 @@ services:
build:
context: updater/sis-updater-worker
depends_on:
- redis
- sis-db
- sis-importer-db
redis:
condition: service_healthy
sis-db:
condition: service_healthy
sis-importer-db:
condition: service_healthy
environment:
CI: 'true'
DB_URL: postgres://postgres@sis-db:5432/sis-db
+50 -9
View File
@@ -6,6 +6,11 @@ x-defaults: &defaults
x-build_defaults: &build_defaults
dockerfile: dev.Dockerfile
x-healthcheck-defaults: &healthcheck-defaults
interval: 1s
timeout: 3s
retries: 30
services:
adminer:
<<: *defaults
@@ -25,10 +30,14 @@ services:
dockerfile: backend/dev.Dockerfile
context: services
depends_on:
- kone-db
- redis
- sis-db
- user-db
kone-db:
condition: service_healthy
redis:
condition: service_healthy
sis-db:
condition: service_healthy
user-db:
condition: service_healthy
env_file:
- .env
tty: true
@@ -51,6 +60,9 @@ services:
- ./services/shared/:/opt/app-root/shared
- shared-nodemod:/opt/app-root/shared/node_modules
- backend-nodemod:/opt/app-root/backend/node_modules
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:8080/api/health']
<<: *healthcheck-defaults
frontend:
<<: *defaults
@@ -58,6 +70,9 @@ services:
build:
dockerfile: frontend/dev.Dockerfile
context: services
depends_on:
backend:
condition: service_healthy
ports:
- 3000:3000
profiles:
@@ -78,6 +93,9 @@ services:
- 4321:5432
volumes:
- kone-db-data:/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'kone-db']
<<: *healthcheck-defaults
user-db:
<<: *defaults
@@ -89,6 +107,9 @@ services:
- 4320:5432
volumes:
- user-db-data:/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'user-db']
<<: *healthcheck-defaults
redis:
<<: *defaults
@@ -99,6 +120,9 @@ services:
- 6379:6379
volumes:
- redis-data:/data
healthcheck:
test: ['CMD-SHELL', 'redis-cli ping | grep PONG']
<<: *healthcheck-defaults
sis-db:
<<: *defaults
@@ -109,6 +133,9 @@ services:
shm_size: 2gb
ports:
- 12345:5432
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'sis-db']
<<: *healthcheck-defaults
sis-importer-db:
<<: *defaults
@@ -120,6 +147,9 @@ services:
- sis-importer-db-data:/data
ports:
- 12346:5432
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'sis-importer-db']
<<: *healthcheck-defaults
jami:
<<: *defaults
@@ -146,6 +176,9 @@ services:
- 5433:5432
volumes:
- jami-data:/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready', '-d', 'jami-db-real']
<<: *healthcheck-defaults
sis-updater-scheduler:
<<: *defaults
@@ -154,8 +187,10 @@ services:
<<: *build_defaults
context: updater/sis-updater-scheduler
depends_on:
- redis
- sis-importer-db
redis:
condition: service_healthy
sis-importer-db:
condition: service_healthy
environment:
REDIS_HOST: redis
SECRET_TOKEN: dev
@@ -170,6 +205,9 @@ services:
volumes:
- sis-updater-scheduler-nodemod:/opt/app-root/src/node_modules
- ./updater/sis-updater-scheduler/:/opt/app-root/src
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:8082/health']
<<: *healthcheck-defaults
sis-updater-worker:
<<: *defaults
@@ -178,9 +216,12 @@ services:
<<: *build_defaults
context: updater/sis-updater-worker
depends_on:
- redis
- sis-db
- sis-importer-db
redis:
condition: service_healthy
sis-db:
condition: service_healthy
sis-importer-db:
condition: service_healthy
environment:
DB_URL: postgres://postgres@sis-db:5432/sis-db
REDIS_HOST: redis
@@ -2,7 +2,7 @@ import * as Sentry from '@sentry/node'
import { NextFunction, Request, Response } from 'express'
import { intersection } from 'lodash-es'
import { requiredGroup } from '../config'
import { requiredGroup, baseUrl } from '../config'
import { getMockedUser, getOrganizationAccess, getUser } from '../services/userService'
import { ApplicationError } from '../util/customErrors'
import logger from '../util/logger'
@@ -36,6 +36,11 @@ export default async (req: Request, _: Response, next: NextFunction) => {
uid: username,
} = req.headers as Headers
if (req.path === `${baseUrl}/health`) {
next()
return
}
if (!username || !sessionId)
throw new ApplicationError(
`${username ?? 'Anonymous user'} requested ${req.url} without authorization headers.`,
+2
View File
@@ -18,6 +18,7 @@ import curriculumPeriods from './routes/curriculumPeriods'
import customPopulationSearch from './routes/customPopulationSearch'
import faculties from './routes/faculties'
import feedback from './routes/feedback'
import health from './routes/health'
import languageCenterData from './routes/languageCenterData'
import login from './routes/login'
import population from './routes/population'
@@ -70,6 +71,7 @@ const routes = (app: Express, url: string) => {
app.use(`${url}/close-to-graduation`, auth.roles(['fullSisuAccess', 'studyGuidanceGroups']), closeToGraduation)
app.use(`${url}/study-programme-pins`, studyProgrammePins)
app.use(`${url}/curriculum-periods`, curriculumPeriods)
app.use(`${url}/health`, health)
app.get('', (_, res) => {
res.status(404).json({ error: 'unknown endpoint' })
})
+10
View File
@@ -0,0 +1,10 @@
import { Router } from 'express'
const router = Router()
/** Used for checking if backend is up eg. Docker healthchecks */
router.get<never, { status: string }>('/', (_, res) => {
return res.status(200).json({ status: 'healthy' })
})
export default router
@@ -42,6 +42,11 @@ const app = express()
app.use(express.json())
app.use(message)
/** Used for checking if backend is up eg. Docker healthchecks */
app.get('/health', (_, res) => {
return res.status(200).json({ status: 'healthy' })
})
app.get('/healthcheck', async (_, res) => {
const latestMessage = await redisClient.get(REDIS_LATEST_MESSAGE_RECEIVED)
const threshold = new Date().getTime() - 1000 * 60 * 60 * 6 // 6 hours ago