import { execAsync } from "@/server/utils/process/execAsync"; export const getContainers = async () => { try { const { stdout, stderr } = await execAsync( "docker ps -a --format 'CONTAINER ID : {{.ID}} | Name: {{.Names}} | Image: {{.Image}} | Ports: {{.Ports}} | State: {{.State}} | Status: {{.Status}}'", ); if (stderr) { console.error(`Error: ${stderr}`); return; } const lines = stdout.trim().split("\n"); const containers = lines .map((line) => { const parts = line.split(" | "); const containerId = parts[0] ? parts[0].replace("CONTAINER ID : ", "").trim() : "No container id"; const name = parts[1] ? parts[1].replace("Name: ", "").trim() : "No container name"; const image = parts[2] ? parts[2].replace("Image: ", "").trim() : "No image"; const ports = parts[3] ? parts[3].replace("Ports: ", "").trim() : "No ports"; const state = parts[4] ? parts[4].replace("State: ", "").trim() : "No state"; const status = parts[5] ? parts[5].replace("Status: ", "").trim() : "No status"; return { containerId, name, image, ports, state, status, }; }) .filter((container) => !container.name.includes("dokploy")); return containers; } catch (error) { console.error(`Execution error: ${error}`); } }; export const getConfig = async (containerId: string) => { try { const { stdout, stderr } = await execAsync( `docker inspect ${containerId} --format='{{json .}}'`, ); if (stderr) { console.error(`Error: ${stderr}`); return; } const config = JSON.parse(stdout); return config; } catch (error) { console.error(`Execution error: ${error}`); } }; export const getContainersByAppNameMatch = async (appName: string) => { try { const { stdout, stderr } = await execAsync( `docker ps -a --format 'CONTAINER ID : {{.ID}} | Name: {{.Names}} | State: {{.State}}' | grep ${appName}`, ); if (stderr) { return []; } if (!stdout) return []; const lines = stdout.trim().split("\n"); const containers = lines.map((line) => { const parts = line.split(" | "); const containerId = parts[0] ? parts[0].replace("CONTAINER ID : ", "").trim() : "No container id"; const name = parts[1] ? parts[1].replace("Name: ", "").trim() : "No container name"; const state = parts[2] ? parts[2].replace("State: ", "").trim() : "No state"; return { containerId, name, state, }; }); return containers || []; } catch (error) { console.error(`Execution error: ${error}`); } return []; }; export const getContainersByAppLabel = async (appName: string) => { try { const { stdout, stderr } = await execAsync( `docker ps --filter "label=com.docker.swarm.service.name=${appName}" --format 'CONTAINER ID : {{.ID}} | Name: {{.Names}} | State: {{.State}}'`, ); if (stderr) { console.error(`Error: ${stderr}`); return; } if (!stdout) return []; const lines = stdout.trim().split("\n"); const containers = lines.map((line) => { const parts = line.split(" | "); const containerId = parts[0] ? parts[0].replace("CONTAINER ID : ", "").trim() : "No container id"; const name = parts[1] ? parts[1].replace("Name: ", "").trim() : "No container name"; const state = parts[2] ? parts[2].replace("State: ", "").trim() : "No state"; return { containerId, name, state, }; }); return containers || []; } catch (error) { console.error(`Execution error: ${error}`); } return []; };