🔌 Add Docker API endpoints for container management
This commit is contained in:
21
app/api/docker/containers/[id]/restart/route.js
Normal file
21
app/api/docker/containers/[id]/restart/route.js
Normal 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 }
|
||||
);
|
||||
}
|
||||
}
|
||||
21
app/api/docker/containers/[id]/start/route.js
Normal file
21
app/api/docker/containers/[id]/start/route.js
Normal 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 }
|
||||
);
|
||||
}
|
||||
}
|
||||
41
app/api/docker/containers/[id]/stats/route.js
Normal file
41
app/api/docker/containers/[id]/stats/route.js
Normal 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;
|
||||
}
|
||||
21
app/api/docker/containers/[id]/stop/route.js
Normal file
21
app/api/docker/containers/[id]/stop/route.js
Normal 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 }
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user