From ae25ea265c8ab40bcd80221d4406e1711589d0ce Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 3 Aug 2025 16:52:43 -0600 Subject: [PATCH] feat(databases): enhance database service configuration by integrating health checks, restart policies, and additional settings across MariaDB, MongoDB, MySQL, Postgres, and Redis --- .../server/src/utils/databases/mariadb.ts | 28 ++++++++++++------ packages/server/src/utils/databases/mongo.ts | 29 +++++++++++++------ packages/server/src/utils/databases/mysql.ts | 29 +++++++++++++------ .../server/src/utils/databases/postgres.ts | 29 +++++++++++++------ packages/server/src/utils/databases/redis.ts | 29 +++++++++++++------ 5 files changed, 99 insertions(+), 45 deletions(-) diff --git a/packages/server/src/utils/databases/mariadb.ts b/packages/server/src/utils/databases/mariadb.ts index be18425aa..9a197f333 100644 --- a/packages/server/src/utils/databases/mariadb.ts +++ b/packages/server/src/utils/databases/mariadb.ts @@ -34,6 +34,17 @@ export const buildMariadb = async (mariadb: MariadbNested) => { const defaultMariadbEnv = `MARIADB_DATABASE="${databaseName}"\nMARIADB_USER="${databaseUser}"\nMARIADB_PASSWORD="${databasePassword}"\nMARIADB_ROOT_PASSWORD="${databaseRootPassword}"${ env ? `\n${env}` : "" }`; + + const { + HealthCheck, + RestartPolicy, + Placement, + Labels, + Mode, + RollbackConfig, + UpdateConfig, + Networks, + } = generateConfigContainer(mariadb); const resources = calculateResources({ memoryLimit, memoryReservation, @@ -54,6 +65,7 @@ export const buildMariadb = async (mariadb: MariadbNested) => { Name: appName, TaskTemplate: { ContainerSpec: { + HealthCheck, Image: dockerImage, Env: envVariables, Mounts: [...volumesMount, ...bindsMount, ...filesMount], @@ -63,20 +75,17 @@ export const buildMariadb = async (mariadb: MariadbNested) => { Args: ["-c", command], } : {}), + Labels, }, - Networks: [{ Target: "dokploy-network" }], + Networks, + RestartPolicy, + Placement, Resources: { ...resources, }, - Placement: { - Constraints: ["node.role==manager"], - }, - }, - Mode: { - Replicated: { - Replicas: 1, - }, }, + Mode, + RollbackConfig, EndpointSpec: { Mode: "dnsrr", Ports: externalPort @@ -90,6 +99,7 @@ export const buildMariadb = async (mariadb: MariadbNested) => { ] : [], }, + UpdateConfig, }; try { const service = docker.getService(appName); diff --git a/packages/server/src/utils/databases/mongo.ts b/packages/server/src/utils/databases/mongo.ts index 5330c018e..ae5a1103b 100644 --- a/packages/server/src/utils/databases/mongo.ts +++ b/packages/server/src/utils/databases/mongo.ts @@ -3,6 +3,7 @@ import type { CreateServiceOptions } from "dockerode"; import { calculateResources, generateBindMounts, + generateConfigContainer, generateFileMounts, generateVolumeMounts, prepareEnvironmentVariables, @@ -81,6 +82,17 @@ ${command ?? "wait $MONGOD_PID"}`; env ? `\n${env}` : "" }`; + const { + HealthCheck, + RestartPolicy, + Placement, + Labels, + Mode, + RollbackConfig, + UpdateConfig, + Networks, + } = generateConfigContainer(mongo); + const resources = calculateResources({ memoryLimit, memoryReservation, @@ -102,6 +114,7 @@ ${command ?? "wait $MONGOD_PID"}`; Name: appName, TaskTemplate: { ContainerSpec: { + HealthCheck, Image: dockerImage, Env: envVariables, Mounts: [...volumesMount, ...bindsMount, ...filesMount], @@ -116,20 +129,17 @@ ${command ?? "wait $MONGOD_PID"}`; Args: ["-c", command], }), }), + Labels, }, - Networks: [{ Target: "dokploy-network" }], + Networks, + RestartPolicy, + Placement, Resources: { ...resources, }, - Placement: { - Constraints: ["node.role==manager"], - }, - }, - Mode: { - Replicated: { - Replicas: 1, - }, }, + Mode, + RollbackConfig, EndpointSpec: { Mode: "dnsrr", Ports: externalPort @@ -143,6 +153,7 @@ ${command ?? "wait $MONGOD_PID"}`; ] : [], }, + UpdateConfig, }; try { diff --git a/packages/server/src/utils/databases/mysql.ts b/packages/server/src/utils/databases/mysql.ts index fe6a81609..015f5abe7 100644 --- a/packages/server/src/utils/databases/mysql.ts +++ b/packages/server/src/utils/databases/mysql.ts @@ -3,6 +3,7 @@ import type { CreateServiceOptions } from "dockerode"; import { calculateResources, generateBindMounts, + generateConfigContainer, generateFileMounts, generateVolumeMounts, prepareEnvironmentVariables, @@ -40,6 +41,17 @@ export const buildMysql = async (mysql: MysqlNested) => { : `MYSQL_DATABASE="${databaseName}"\nMYSQL_ROOT_PASSWORD="${databaseRootPassword}"${ env ? `\n${env}` : "" }`; + + const { + HealthCheck, + RestartPolicy, + Placement, + Labels, + Mode, + RollbackConfig, + UpdateConfig, + Networks, + } = generateConfigContainer(mysql); const resources = calculateResources({ memoryLimit, memoryReservation, @@ -60,6 +72,7 @@ export const buildMysql = async (mysql: MysqlNested) => { Name: appName, TaskTemplate: { ContainerSpec: { + HealthCheck, Image: dockerImage, Env: envVariables, Mounts: [...volumesMount, ...bindsMount, ...filesMount], @@ -69,20 +82,17 @@ export const buildMysql = async (mysql: MysqlNested) => { Args: ["-c", command], } : {}), + Labels, }, - Networks: [{ Target: "dokploy-network" }], + Networks, + RestartPolicy, + Placement, Resources: { ...resources, }, - Placement: { - Constraints: ["node.role==manager"], - }, - }, - Mode: { - Replicated: { - Replicas: 1, - }, }, + Mode, + RollbackConfig, EndpointSpec: { Mode: "dnsrr", Ports: externalPort @@ -96,6 +106,7 @@ export const buildMysql = async (mysql: MysqlNested) => { ] : [], }, + UpdateConfig, }; try { const service = docker.getService(appName); diff --git a/packages/server/src/utils/databases/postgres.ts b/packages/server/src/utils/databases/postgres.ts index 36ac09aea..83a83361d 100644 --- a/packages/server/src/utils/databases/postgres.ts +++ b/packages/server/src/utils/databases/postgres.ts @@ -3,6 +3,7 @@ import type { CreateServiceOptions } from "dockerode"; import { calculateResources, generateBindMounts, + generateConfigContainer, generateFileMounts, generateVolumeMounts, prepareEnvironmentVariables, @@ -33,6 +34,17 @@ export const buildPostgres = async (postgres: PostgresNested) => { const defaultPostgresEnv = `POSTGRES_DB="${databaseName}"\nPOSTGRES_USER="${databaseUser}"\nPOSTGRES_PASSWORD="${databasePassword}"${ env ? `\n${env}` : "" }`; + + const { + HealthCheck, + RestartPolicy, + Placement, + Labels, + Mode, + RollbackConfig, + UpdateConfig, + Networks, + } = generateConfigContainer(postgres); const resources = calculateResources({ memoryLimit, memoryReservation, @@ -53,6 +65,7 @@ export const buildPostgres = async (postgres: PostgresNested) => { Name: appName, TaskTemplate: { ContainerSpec: { + HealthCheck, Image: dockerImage, Env: envVariables, Mounts: [...volumesMount, ...bindsMount, ...filesMount], @@ -62,20 +75,17 @@ export const buildPostgres = async (postgres: PostgresNested) => { Args: ["-c", command], } : {}), + Labels, }, - Networks: [{ Target: "dokploy-network" }], + Networks, + RestartPolicy, + Placement, Resources: { ...resources, }, - Placement: { - Constraints: ["node.role==manager"], - }, - }, - Mode: { - Replicated: { - Replicas: 1, - }, }, + Mode, + RollbackConfig, EndpointSpec: { Mode: "dnsrr", Ports: externalPort @@ -89,6 +99,7 @@ export const buildPostgres = async (postgres: PostgresNested) => { ] : [], }, + UpdateConfig, }; try { const service = docker.getService(appName); diff --git a/packages/server/src/utils/databases/redis.ts b/packages/server/src/utils/databases/redis.ts index b2f2ce3c2..a1a1257b4 100644 --- a/packages/server/src/utils/databases/redis.ts +++ b/packages/server/src/utils/databases/redis.ts @@ -3,6 +3,7 @@ import type { CreateServiceOptions } from "dockerode"; import { calculateResources, generateBindMounts, + generateConfigContainer, generateFileMounts, generateVolumeMounts, prepareEnvironmentVariables, @@ -31,6 +32,17 @@ export const buildRedis = async (redis: RedisNested) => { const defaultRedisEnv = `REDIS_PASSWORD="${databasePassword}"${ env ? `\n${env}` : "" }`; + + const { + HealthCheck, + RestartPolicy, + Placement, + Labels, + Mode, + RollbackConfig, + UpdateConfig, + Networks, + } = generateConfigContainer(redis); const resources = calculateResources({ memoryLimit, memoryReservation, @@ -51,6 +63,7 @@ export const buildRedis = async (redis: RedisNested) => { Name: appName, TaskTemplate: { ContainerSpec: { + HealthCheck, Image: dockerImage, Env: envVariables, Mounts: [...volumesMount, ...bindsMount, ...filesMount], @@ -59,20 +72,17 @@ export const buildRedis = async (redis: RedisNested) => { "-c", command ? command : `redis-server --requirepass ${databasePassword}`, ], + Labels, }, - Networks: [{ Target: "dokploy-network" }], + Networks, + RestartPolicy, + Placement, Resources: { ...resources, }, - Placement: { - Constraints: ["node.role==manager"], - }, - }, - Mode: { - Replicated: { - Replicas: 1, - }, }, + Mode, + RollbackConfig, EndpointSpec: { Mode: "dnsrr", Ports: externalPort @@ -86,6 +96,7 @@ export const buildRedis = async (redis: RedisNested) => { ] : [], }, + UpdateConfig, }; try {