Files
dokploy/server/utils/docker/compose.ts
2024-07-15 01:08:18 +02:00

46 lines
1.5 KiB
TypeScript

import crypto from "node:crypto";
import { findComposeById } from "@/server/api/services/compose";
import { dump, load } from "js-yaml";
import { addPrefixToAllConfigs } from "./compose/configs";
import { addPrefixToAllNetworks } from "./compose/network";
import { addPrefixToAllSecrets } from "./compose/secrets";
import { addPrefixToAllServiceNames } from "./compose/service";
import { addPrefixToAllVolumes } from "./compose/volume";
import type { ComposeSpecification } from "./types";
export const generateRandomHash = (): string => {
return crypto.randomBytes(4).toString("hex");
};
export const randomizeComposeFile = async (
composeId: string,
prefix?: string,
) => {
const compose = await findComposeById(composeId);
const composeFile = compose.composeFile;
const composeData = load(composeFile) as ComposeSpecification;
const randomPrefix = prefix || generateRandomHash();
const newComposeFile = addPrefixToAllProperties(composeData, randomPrefix);
return dump(newComposeFile);
};
export const addPrefixToAllProperties = (
composeData: ComposeSpecification,
prefix: string,
): ComposeSpecification => {
let updatedComposeData = { ...composeData };
updatedComposeData = addPrefixToAllServiceNames(updatedComposeData, prefix);
updatedComposeData = addPrefixToAllVolumes(updatedComposeData, prefix);
updatedComposeData = addPrefixToAllNetworks(updatedComposeData, prefix);
updatedComposeData = addPrefixToAllConfigs(updatedComposeData, prefix);
updatedComposeData = addPrefixToAllSecrets(updatedComposeData, prefix);
return updatedComposeData;
};