128 lines
4.6 KiB
JavaScript
128 lines
4.6 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.getContainerByOrganization = exports.removeContainer = exports.createContainer = exports.stopContainer = exports.startContainer = exports.getAvailablePort = exports.getOrganizationBotPort = exports.existsContainer = exports.listContainers = void 0;
|
|
const dockerode_1 = __importDefault(require("dockerode"));
|
|
const docker = new dockerode_1.default();
|
|
/**
|
|
* Listar todos los contenedores.
|
|
*/
|
|
const listContainers = async () => {
|
|
return docker.listContainers({ all: true });
|
|
};
|
|
exports.listContainers = listContainers;
|
|
const existsContainer = async (organizationId) => {
|
|
const contenedores = await (0, exports.listContainers)();
|
|
const contenedoresNombres = Array.from(contenedores, (item) => item.Names[0].split("_bot")[0].substring(1));
|
|
if (contenedoresNombres.includes(organizationId)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
exports.existsContainer = existsContainer;
|
|
const getOrganizationBotPort = async (organizationId) => {
|
|
const contenedores = await (0, exports.listContainers)();
|
|
for (const contenedor of contenedores) {
|
|
if (contenedor.Names.includes(organizationId)) {
|
|
const port = contenedor.Ports[0].PublicPort;
|
|
return port;
|
|
}
|
|
}
|
|
return -1;
|
|
};
|
|
exports.getOrganizationBotPort = getOrganizationBotPort;
|
|
const getAvailablePort = async () => {
|
|
const contenedores = await (0, exports.listContainers)();
|
|
let defaultPort = process.env.DEFAULT_BOT_START_PORT ? parseInt(process.env.DEFAULT_BOT_START_PORT) : -1;
|
|
if (contenedores.length == 0) {
|
|
return defaultPort;
|
|
}
|
|
contenedores.sort((a, b) => b.Created - a.Created);
|
|
//Obtengo el contenedor mas reciente.
|
|
const lastContainerCreated = contenedores.shift();
|
|
if (!lastContainerCreated) {
|
|
return defaultPort;
|
|
}
|
|
const lastPort = lastContainerCreated.Ports;
|
|
if (!lastPort) {
|
|
return defaultPort;
|
|
}
|
|
if (lastPort.length == 0) {
|
|
return defaultPort;
|
|
}
|
|
return lastPort[0].PublicPort + 1;
|
|
};
|
|
exports.getAvailablePort = getAvailablePort;
|
|
/**
|
|
* Iniciar un contenedor por ID.
|
|
*/
|
|
const startContainer = async (containerId) => {
|
|
const container = docker.getContainer(containerId);
|
|
await container.start();
|
|
};
|
|
exports.startContainer = startContainer;
|
|
/**
|
|
* Detener un contenedor por ID.
|
|
*/
|
|
const stopContainer = async (containerId) => {
|
|
const container = docker.getContainer(containerId);
|
|
await container.stop();
|
|
};
|
|
exports.stopContainer = stopContainer;
|
|
const createContainer = async (port, name, image) => {
|
|
try {
|
|
// Crear un contenedor con las configuraciones especificadas
|
|
const container = await docker.createContainer({
|
|
Image: image,
|
|
name,
|
|
Env: [`PORT=${port}`],
|
|
ExposedPorts: {
|
|
[`${port}/tcp`]: {}, // Define el puerto expuesto
|
|
},
|
|
HostConfig: {
|
|
PortBindings: {
|
|
[`${port}/tcp`]: [{ HostPort: `${port}` }], // Mapea el puerto entre el host y el contenedor
|
|
},
|
|
},
|
|
});
|
|
// Iniciar el contenedor creado
|
|
await container.start();
|
|
// Devolver el ID del contenedor como resultado
|
|
return container.id;
|
|
}
|
|
catch (error) {
|
|
throw new Error(`Error al crear el contenedor: ${error.message}`);
|
|
}
|
|
};
|
|
exports.createContainer = createContainer;
|
|
const removeContainer = async (containerId) => {
|
|
try {
|
|
// Obtiene el contenedor por su ID
|
|
const container = docker.getContainer(containerId);
|
|
// Verifica si el contenedor existe antes de intentar eliminarlo
|
|
const containerInfo = await container.inspect();
|
|
if (containerInfo.State.Running) {
|
|
// Si el contenedor está corriendo, debe detenerse primero
|
|
await container.stop();
|
|
}
|
|
// Elimina el contenedor
|
|
await container.remove();
|
|
}
|
|
catch (error) {
|
|
throw new Error(`Error al eliminar el contenedor: ${error.message}`);
|
|
}
|
|
};
|
|
exports.removeContainer = removeContainer;
|
|
const getContainerByOrganization = async (organizationId) => {
|
|
const contenedores = await (0, exports.listContainers)();
|
|
for (const contenedor of contenedores) {
|
|
if (contenedor.Names.some((item) => item.includes(organizationId))) {
|
|
return contenedor;
|
|
}
|
|
}
|
|
throw new Error("Container not found");
|
|
};
|
|
exports.getContainerByOrganization = getContainerByOrganization;
|