Files
incus-backup-ui/management/src/index.js
T
Philipp 87682a777f Issue 1: finaler Agent-Job-Status
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
2026-05-21 10:27:04 +02:00

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();