Files
healthcheck/server.js
zyxd 4ad63abcd9
All checks were successful
Build and push Docker image / build (push) Successful in 41s
sdf
2025-10-01 01:02:11 +04:00

55 lines
1.3 KiB
JavaScript

import express from 'express'
import Docker from 'dockerode'
const app = express()
const PORT = 8080
const docker = new Docker({ socketPath: '/var/run/docker.sock' })
async function getServiceStatusCode(service_name) {
try {
const service = docker.getService(service_name)
const tasks = await service.tasks({ filters: { service: [service_name] } })
if (tasks.length === 0) {
return 503
}
const isHealthy = tasks.some(task => {
const state = task.Status.State
const healthStatus = task.Status.ContainerStatus?.Health?.Status
if (healthStatus === 'healthy' || (state === 'running' && !healthStatus)) {
return true
}
return false
})
return isHealthy ? 200 : 503
} catch (error) {
console.error(error.message)
if (error.statusCode === 404) {
return 404
}
return 503
}
}
app.get('/health/:service', async (req, res) => {
const service = req.params.service
if (!service || !/^[a-zA-Z0-9_-]+$/.test(service)) {
return res.sendStatus(400)
}
const statusCode = await getServiceStatusCode(service)
res.sendStatus(statusCode)
})
app.use((_, response) => response.sendStatus(404))
app.listen(PORT, () => {
console.log(`Health Check Proxy listening on port ${PORT}`)
})