Management pollt jetzt offene Agent-Jobs und aktualisiert job_history mit: - finalem success / failed - Fehlertext - aktuellem/finalem Step - finishedAt - durationMs - Snapshot-ID aus den Agent-Logs, wenn ein Backup erfolgreich war Die Operations-Seite zeigt jetzt Dauer und Snapshot-ID. Issue 2: erweiterte Agent-Healthchecks /api/health am Agent prüft jetzt strukturiert: - fehlende Env-Konfiguration - Commands: incus, zfs, zpool, restic, udevadm, dd - ZFS Pool Existenz - ZFS Pool Capacity/Freespace via zpool list - /dev/zvol Zugriff - Restic Repository Zugriff
38 lines
1.2 KiB
JavaScript
38 lines
1.2 KiB
JavaScript
import cors from 'cors';
|
|
import express from 'express';
|
|
import { config } from './config.js';
|
|
import { migrate } from './db.js';
|
|
import { requireAuth } from './auth.js';
|
|
import { startJobPoller } from './jobPoller.js';
|
|
import { authRouter } from './routes/auth.js';
|
|
import { nodesRouter } from './routes/nodes.js';
|
|
import { operationsRouter } from './routes/operations.js';
|
|
import { proxyRouter } from './routes/proxy.js';
|
|
import { schedulesRouter } from './routes/schedules.js';
|
|
import { startScheduler } from './scheduler.js';
|
|
|
|
migrate();
|
|
|
|
const app = express();
|
|
|
|
app.use(cors({ origin: true, credentials: true }));
|
|
app.use(express.json());
|
|
|
|
app.use('/api/auth', authRouter);
|
|
app.use('/api', requireAuth, proxyRouter);
|
|
app.use('/api/nodes', requireAuth, nodesRouter);
|
|
app.use('/api/operations', requireAuth, operationsRouter);
|
|
app.use('/api/schedules', requireAuth, schedulesRouter);
|
|
|
|
app.use((error, _req, res, _next) => {
|
|
const status = error.status || 500;
|
|
res.status(status).json({ error: error.message || 'Internal server error.' });
|
|
});
|
|
|
|
app.listen(config.port, () => {
|
|
console.log(`Incus backup management API listening on http://localhost:${config.port}`);
|
|
});
|
|
|
|
startScheduler();
|
|
startJobPoller();
|