UNPKG

@platypus-stack/platypus-infra-tools

Version:

Tools & utils to manage infrastructure aspects of platypus projects

1 lines 15.4 kB
{"version":3,"sources":["../src/index.ts","../src/lib/docker.ts","../src/lib/dockerNetwork.ts","../src/lib/startPlatypusProject.ts","../src/lib/nodeProcess.ts","../src/lib/stopPlatypusProject.ts"],"sourcesContent":["import { isDockerRunning } from './lib/docker.js';\nimport { getDockerNetworkContainers, getDockerNetworkGatewayIP, isDockerNetworkExisting } from './lib/dockerNetwork.js';\nimport { default as startPlatypusProject } from './lib/startPlatypusProject.js';\nimport { default as stopPlatypusProject } from './lib/stopPlatypusProject.js';\n\nexport {\n startPlatypusProject,\n stopPlatypusProject,\n isDockerRunning,\n isDockerNetworkExisting,\n getDockerNetworkGatewayIP,\n getDockerNetworkContainers,\n};\n","// eslint-disable-next-line import/default\nimport shell from 'shelljs';\n\nexport const isDockerRunning = (): boolean => {\n const dockerRunning = shell.exec('docker info', { silent: true });\n return !(dockerRunning.code === 0);\n};\n","// eslint-disable-next-line import/default\nimport shell from 'shelljs';\n\n/** solves problem with internal https routing\n * https://github.com/flexguse/traefik-inter-container-routing\n * https://stackoverflow.com/questions/68022116/how-to-request-to-api-server-from-frontend-app-between-docker-containers\n * https://stackoverflow.com/questions/46446541/traefik-https-access-between-applications-does-not-work\n */\nexport async function getDockerNetworkGatewayIP(dockerNetwork: string): Promise<string> {\n return new Promise((resolve) => {\n shell.exec(\n `docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' \"${dockerNetwork}\"`,\n { silent: true },\n function (code: number, stdout: string, stderr: string) {\n if (stderr) {\n throw new Error('docker network inspect error: ' + stderr);\n }\n resolve(stdout);\n }\n );\n });\n}\n\n/**\n * Gets array of docker container attached to docker network\n */\nexport async function getDockerNetworkContainers(dockerNetwork: string): Promise<string[]> {\n return new Promise((resolve) => {\n shell.exec(\n `docker network inspect --format '{{range .Containers}}{{.EndpointID}}|{{end}}' \"${dockerNetwork}\"`,\n { silent: true },\n function (code: number, stdout: string, stderr: string) {\n if (stderr) {\n throw new Error('docker network inspect error: ' + stderr);\n }\n resolve(stdout.split('|').slice(0, -1));\n }\n );\n });\n}\n\n/**\n * checks if docker network with given name exists\n */\nexport async function isDockerNetworkExisting(dockerNetwork: string): Promise<boolean> {\n return new Promise((resolve) => {\n shell.exec(\n `docker network ls | grep -w \"${dockerNetwork}\"`,\n { silent: true },\n function (code: number, stdout: string, stderr: string) {\n if (stderr) {\n throw new Error('docker network inspect error: ' + stderr);\n }\n if (!stdout) {\n resolve(false);\n }\n resolve(true);\n }\n );\n });\n}\n","import { existsSync } from 'fs';\nimport { errorLog, getErrorMessage, infoLog } from '@platypus-stack/platypus-app-tools'; // TODO: fix missing dependency before dev task\n\n// eslint-disable-next-line import/default\nimport shell from 'shelljs';\nimport { getDockerNetworkGatewayIP, isDockerNetworkExisting, isDockerRunning } from '../index.js';\nimport { getGID, getUID } from './nodeProcess.js';\n\ninterface IStartPlatypusProject {\n /** name of the docker network to create */\n dockerNetworkName: string;\n /** absolute path to the docker-compose file */\n dockerComposePath: string;\n /** whether to pull the images before starting the containers */\n pull?: boolean;\n /** path to the project directory */\n projectDirectory?: string; // path to the project directory\n /** additional args to docker compose command like --env-file */\n additionalArgs?: string;\n}\n\nasync function startPlatypusProject({\n dockerNetworkName,\n dockerComposePath,\n pull = false,\n projectDirectory,\n additionalArgs,\n}: IStartPlatypusProject): Promise<void> {\n console.log('--- Starting platypus project ---');\n if (pull) {\n infoLog('Pulling images before starting containers.');\n }\n\n if (!existsSync(dockerComposePath)) {\n errorLog('docker-compose file not found');\n errorLog(`File ${dockerComposePath} not found.`);\n return;\n }\n\n if (isDockerRunning()) {\n errorLog('Docker not running. Start Docker first');\n return;\n }\n\n if (!(await isDockerNetworkExisting(dockerNetworkName))) {\n infoLog(`Docker network ${dockerNetworkName} not found. Creating new docker network.`);\n try {\n const creatingNewDockerNetwork = shell.exec(`docker network create ${dockerNetworkName}`);\n if (creatingNewDockerNetwork.code !== 0) {\n throw Error(creatingNewDockerNetwork.stderr);\n }\n } catch (e) {\n errorLog(`Error while creating docker network ${dockerNetworkName}.`);\n errorLog(getErrorMessage(e));\n return;\n }\n }\n\n try {\n shell.env['CURRENT_UID'] = `${getUID()}:${getGID()}`; // backwards compatibility\n shell.env['MY_UID'] = `${getUID()}`;\n shell.env['MY_GID'] = `${getGID()}`;\n } catch (e) {\n errorLog(getErrorMessage(e));\n }\n\n try {\n const gatewayIP = await getDockerNetworkGatewayIP(dockerNetworkName);\n infoLog('exporting gatewayIP as DOCKER_NETWORK_GATEWAY');\n infoLog(gatewayIP);\n shell.env['DOCKER_NETWORK_GATEWAY'] = String(gatewayIP).trim();\n } catch (e) {\n errorLog(`Error while getting docker network gateway IP && exporting it for shelljs process.`);\n errorLog(getErrorMessage(e));\n return;\n }\n\n const composeCMD = `docker compose ${projectDirectory ? `--project-directory ${projectDirectory}` : ''} ${\n additionalArgs ? additionalArgs : ''\n } -f ${dockerComposePath}`;\n\n console.log('Docker compose args:');\n console.log(composeCMD);\n\n try {\n if (pull) {\n const pullCMD = shell.exec(`${composeCMD} pull`, { silent: true });\n if (pullCMD.code !== 0) {\n throw Error(pullCMD.stderr);\n }\n }\n const creating = shell.exec(`${composeCMD} up -d`, { silent: true });\n if (creating.code !== 0) {\n throw Error(creating.stderr);\n }\n } catch (e) {\n errorLog(`Error while starting docker containers`);\n errorLog(getErrorMessage(e));\n }\n}\n\nexport default startPlatypusProject;\n","export const getUID = (): string => {\n if (!process.getuid) {\n throw Error('process.getuid is not defined');\n }\n return process.getuid().toString();\n};\n\nexport const getGID = (): string => {\n if (!process.getgid) {\n throw Error('process.getgid is not defined');\n }\n return process.getgid().toString();\n};\n","import { existsSync } from 'fs';\nimport { errorLog, getErrorMessage, infoLog } from '@platypus-stack/platypus-app-tools';\n// eslint-disable-next-line import/default\nimport shell from 'shelljs';\nimport { getDockerNetworkContainers, getDockerNetworkGatewayIP, isDockerNetworkExisting } from '../index.js';\nimport { getGID, getUID } from './nodeProcess';\n\ninterface IStopPlatypusProject {\n /** name of the docker network to create */\n dockerNetworkName: string;\n /** absolute path to the docker-compose file */\n dockerComposePath: string;\n /** path to the project directory */\n projectDirectory?: string; // path to the project directory\n /** additional args to docker compose command like --env-file */\n additionalArgs?: string;\n /** whether to remove orphan containers */\n removeOrphans?: boolean;\n}\n\nconst stopPlatypusProject = async ({\n dockerComposePath,\n dockerNetworkName,\n projectDirectory,\n additionalArgs,\n removeOrphans,\n}: IStopPlatypusProject) => {\n if (!existsSync(dockerComposePath)) {\n errorLog('docker-compose file not found');\n errorLog(`File ${dockerComposePath} not found.`);\n return;\n }\n\n if (!(await isDockerNetworkExisting(dockerNetworkName))) {\n errorLog(`Docker network ${dockerNetworkName} not found.`);\n return;\n }\n\n try {\n shell.env['CURRENT_UID'] = `${getUID()}:${getGID()}`;\n } catch (e) {\n errorLog(getErrorMessage(e));\n }\n\n try {\n const gatewayIP = await getDockerNetworkGatewayIP(dockerNetworkName);\n infoLog('exporting gatewayIP as DOCKER_NETWORK_GATEWAY');\n infoLog(gatewayIP);\n shell.env['DOCKER_NETWORK_GATEWAY'] = String(gatewayIP).trim();\n } catch (e) {\n errorLog(`Error while getting docker network gateway IP && exporting it for shelljs process.`);\n errorLog(getErrorMessage(e));\n return;\n }\n\n const composeCMD = `docker compose ${projectDirectory ? `--project-directory ${projectDirectory}` : ''} ${\n additionalArgs ? additionalArgs : ''\n } -f ${dockerComposePath} down ${removeOrphans ? '--remove-orphans' : ''}`;\n\n console.log('Docker compose args:');\n console.log(composeCMD);\n\n try {\n infoLog(`Stopping docker containers`);\n const stopping = shell.exec(composeCMD);\n if (stopping.code !== 0) {\n throw Error(stopping.stderr);\n }\n } catch (e) {\n errorLog(`Error while stopping docker containers.`);\n errorLog(getErrorMessage(e));\n return;\n }\n\n try {\n if (await isDockerNetworkExisting(dockerNetworkName)) {\n if ((await getDockerNetworkContainers(dockerNetworkName)).length === 0) {\n infoLog(`Removing docker network ${dockerNetworkName}`);\n const networkRemoving = shell.exec(`docker network rm ${dockerNetworkName}`, { silent: true });\n if (networkRemoving.code !== 0) {\n throw Error(networkRemoving.stderr);\n }\n infoLog(`Docker network ${dockerNetworkName} removed`);\n } else {\n infoLog(`Docker network ${dockerNetworkName} not empty.`);\n }\n }\n } catch (e) {\n errorLog(`Error while removing docker network ${dockerNetworkName}.`);\n errorLog(getErrorMessage(e));\n return;\n }\n};\n\nexport default stopPlatypusProject;\n"],"mappings":"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","names":["shell","import_shelljs","shell","import_shelljs","shell","import_fs","import_platypus_app_tools","import_shelljs","shell"]}