🔌 Add Docker API endpoints for container management

This commit is contained in:
2025-06-22 13:35:45 +02:00
parent c1ec89c855
commit 93db3c10f0
5 changed files with 120 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
import { NextResponse } from 'next/server';
export async function POST(request, { params }) {
try {
const Docker = require('dockerode');
const docker = new Docker({ socketPath: '/var/run/docker.sock' });
const container = docker.getContainer(params.id);
await container.restart({ t: 10 }); // 10 second timeout
return NextResponse.json({
success: true,
message: 'Container restarted successfully'
});
} catch (error) {
console.error('Failed to restart container:', error);
return NextResponse.json(
{ error: error.message || 'Failed to restart container' },
{ status: 500 }
);
}
}

View File

@@ -0,0 +1,21 @@
import { NextResponse } from 'next/server';
export async function POST(request, { params }) {
try {
const Docker = require('dockerode');
const docker = new Docker({ socketPath: '/var/run/docker.sock' });
const container = docker.getContainer(params.id);
await container.start();
return NextResponse.json({
success: true,
message: 'Container started successfully'
});
} catch (error) {
console.error('Failed to start container:', error);
return NextResponse.json(
{ error: error.message || 'Failed to start container' },
{ status: 500 }
);
}
}

View File

@@ -0,0 +1,41 @@
import { NextResponse } from 'next/server';
export async function GET(request, { params }) {
try {
const Docker = require('dockerode');
const docker = new Docker({ socketPath: '/var/run/docker.sock' });
const container = docker.getContainer(params.id);
const stats = await container.stats({ stream: false });
// Calculate CPU and memory percentages
const cpuPercent = calculateCPUPercent(stats);
const memoryUsage = stats.memory_stats.usage || 0;
const memoryLimit = stats.memory_stats.limit || 0;
return NextResponse.json({
cpu: cpuPercent,
memory: Math.round(memoryUsage / 1024 / 1024), // Convert to MB
memoryLimit: Math.round(memoryLimit / 1024 / 1024)
});
} catch (error) {
console.error('Failed to get container stats:', error);
return NextResponse.json(
{ error: error.message || 'Failed to get container stats' },
{ status: 500 }
);
}
}
function calculateCPUPercent(stats) {
const cpuDelta = stats.cpu_stats.cpu_usage.total_usage -
(stats.precpu_stats?.cpu_usage?.total_usage || 0);
const systemDelta = stats.cpu_stats.system_cpu_usage -
(stats.precpu_stats?.system_cpu_usage || 0);
if (systemDelta > 0 && cpuDelta > 0) {
const cpuPercent = (cpuDelta / systemDelta) *
(stats.cpu_stats.online_cpus || 1) * 100;
return Math.round(cpuPercent * 100) / 100;
}
return 0;
}

View File

@@ -0,0 +1,21 @@
import { NextResponse } from 'next/server';
export async function POST(request, { params }) {
try {
const Docker = require('dockerode');
const docker = new Docker({ socketPath: '/var/run/docker.sock' });
const container = docker.getContainer(params.id);
await container.stop({ t: 10 }); // 10 second timeout
return NextResponse.json({
success: true,
message: 'Container stopped successfully'
});
} catch (error) {
console.error('Failed to stop container:', error);
return NextResponse.json(
{ error: error.message || 'Failed to stop container' },
{ status: 500 }
);
}
}