135 lines · 3.1 KB · TypeScript
RawDownload
import type { InferResultType } from "@dokploy/server/types/with";import type { CreateServiceOptions } from "dockerode";import { resolveServiceNetworks } from "../../services/network";import {	calculateResources,	generateBindMounts,	generateConfigContainer,	generateFileMounts,	generateVolumeMounts,	prepareEnvironmentVariables,} from "../docker/utils";import { getRemoteDocker } from "../servers/remote-docker"; export type PostgresNested = InferResultType<	"postgres",	{ mounts: true; environment: { with: { project: true } } }>;export const buildPostgres = async (postgres: PostgresNested) => {	const {		appName,		env,		externalPort,		dockerImage,		memoryLimit,		memoryReservation,		cpuLimit,		cpuReservation,		databaseName,		databaseUser,		databasePassword,		command,		args,		mounts,	} = postgres; 	const defaultPostgresEnv = `POSTGRES_DB="${databaseName}"\nPOSTGRES_USER="${databaseUser}"\nPOSTGRES_PASSWORD="${databasePassword}"${		env ? `\n${env}` : ""	}`; 	const resolvedNetworks = await resolveServiceNetworks(postgres); 	const {		HealthCheck,		RestartPolicy,		Placement,		Labels,		Mode,		RollbackConfig,		UpdateConfig,		StopGracePeriod,		EndpointSpec,		Ulimits,	} = generateConfigContainer(postgres);	const resources = calculateResources({		memoryLimit,		memoryReservation,		cpuLimit,		cpuReservation,	});	const envVariables = prepareEnvironmentVariables(		defaultPostgresEnv,		postgres.environment.project.env,		postgres.environment.env,	);	const volumesMount = generateVolumeMounts(mounts);	const bindsMount = generateBindMounts(mounts);	const filesMount = generateFileMounts(appName, postgres); 	const docker = await getRemoteDocker(postgres.serverId); 	const settings: CreateServiceOptions = {		Name: appName,		TaskTemplate: {			ContainerSpec: {				HealthCheck,				Image: dockerImage,				Env: envVariables,				Mounts: [...volumesMount, ...bindsMount, ...filesMount],				StopGracePeriod: StopGracePeriod ?? 30_000_000_000,				...(command && {					Command: command.split(" "),				}),				...(args &&					args.length > 0 && {						Args: args,					}),				...(Ulimits && { Ulimits }),				Labels,			},			Networks: resolvedNetworks,			RestartPolicy,			Placement,			Resources: {				...resources,			},		},		Mode,		RollbackConfig,		EndpointSpec: EndpointSpec			? EndpointSpec			: {					Mode: "dnsrr" as const,					Ports: externalPort						? [								{									Protocol: "tcp" as const,									TargetPort: 5432,									PublishedPort: externalPort,									PublishMode: "host" as const,								},							]						: [],				},		UpdateConfig: postgres.updateConfigSwarm ?? {			Parallelism: 1,			Order: "stop-first" as const,			FailureAction: "rollback" as const,		},	};	try {		const service = docker.getService(appName);		const inspect = await service.inspect();		await service.update({			version: Number.parseInt(inspect.Version.Index),			...settings,			TaskTemplate: {				...settings.TaskTemplate,				ForceUpdate: inspect.Spec.TaskTemplate.ForceUpdate + 1,			},		});	} catch (error) {		console.log("error", error);		await docker.createService(settings);	}};