83 lines
2.3 KiB
TypeScript
83 lines
2.3 KiB
TypeScript
|
import { asyncExecShell, createDirectories, getEngine, getUserDetails } from '$lib/common';
|
||
|
import * as db from '$lib/database';
|
||
|
import { generateDatabaseConfiguration, PrismaErrorHandler } from '$lib/database';
|
||
|
import { promises as fs } from 'fs';
|
||
|
import yaml from 'js-yaml';
|
||
|
import type { RequestHandler } from '@sveltejs/kit';
|
||
|
import { makeLabelForStandaloneDatabase } from '$lib/buildPacks/common';
|
||
|
import { startTcpProxy } from '$lib/haproxy';
|
||
|
|
||
|
export const post: RequestHandler = async (event) => {
|
||
|
const { teamId, status, body } = await getUserDetails(event);
|
||
|
if (status === 401) return { status, body };
|
||
|
|
||
|
const { id } = event.params;
|
||
|
|
||
|
try {
|
||
|
const database = await db.getDatabase({ id, teamId });
|
||
|
const {
|
||
|
type,
|
||
|
destinationDockerId,
|
||
|
destinationDocker,
|
||
|
publicPort,
|
||
|
settings: { isPublic }
|
||
|
} = database;
|
||
|
const { privatePort, environmentVariables, image, volume, ulimits } =
|
||
|
generateDatabaseConfiguration(database);
|
||
|
|
||
|
const network = destinationDockerId && destinationDocker.network;
|
||
|
const host = getEngine(destinationDocker.engine);
|
||
|
const engine = destinationDocker.engine;
|
||
|
const volumeName = volume.split(':')[0];
|
||
|
const labels = await makeLabelForStandaloneDatabase({ id, image, volume });
|
||
|
|
||
|
const { workdir } = await createDirectories({ repository: type, buildId: id });
|
||
|
|
||
|
const composeFile = {
|
||
|
version: '3.8',
|
||
|
services: {
|
||
|
[id]: {
|
||
|
container_name: id,
|
||
|
image,
|
||
|
networks: [network],
|
||
|
environment: environmentVariables,
|
||
|
volumes: [volume],
|
||
|
ulimits,
|
||
|
labels,
|
||
|
restart: 'always'
|
||
|
}
|
||
|
},
|
||
|
networks: {
|
||
|
[network]: {
|
||
|
external: true
|
||
|
}
|
||
|
},
|
||
|
volumes: {
|
||
|
[volumeName]: {
|
||
|
external: true
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
const composeFileDestination = `${workdir}/docker-compose.yaml`;
|
||
|
await fs.writeFile(composeFileDestination, yaml.dump(composeFile));
|
||
|
try {
|
||
|
await asyncExecShell(`DOCKER_HOST=${host} docker volume create ${volumeName}`);
|
||
|
} catch (error) {
|
||
|
console.log(error);
|
||
|
}
|
||
|
try {
|
||
|
await asyncExecShell(`DOCKER_HOST=${host} docker compose -f ${composeFileDestination} up -d`);
|
||
|
if (isPublic) await startTcpProxy(destinationDocker, id, publicPort, privatePort);
|
||
|
return {
|
||
|
status: 200
|
||
|
};
|
||
|
} catch (error) {
|
||
|
throw {
|
||
|
error
|
||
|
};
|
||
|
}
|
||
|
} catch (error) {
|
||
|
return PrismaErrorHandler(error);
|
||
|
}
|
||
|
};
|