[grade=pending] QA sprint: commit 103 at-risk files from multi-agent sprint work
Committed by Hermes autonomous QA sprint 2026-08-13. These files were modified during the Aug 12 sprint but never committed.
This commit is contained in:
@@ -60,6 +60,14 @@ const monitoringRoutes = require('../routes/monitoring');
|
||||
const updatesRoutes = require('../routes/updates');
|
||||
const authRoutes = require('../routes/auth');
|
||||
const shareRoutes = require('../routes/share');
|
||||
const i18nRoutes = require('../routes/i18n');
|
||||
const discoverRoutes = require('../routes/discover');
|
||||
const discoverAdoptRoutes = require('../routes/discover-adopt');
|
||||
const catalogRoutes = require('../routes/catalog');
|
||||
const wizardRoutes = require('../routes/wizard');
|
||||
const disasterRoutes = require('../routes/disaster-recovery');
|
||||
const caddycodeRoutes = require('../routes/caddycode');
|
||||
const fleetRoutes = require('../routes/fleet');
|
||||
const configRoutes = require('../routes/config');
|
||||
const dnsRoutes = require('../routes/dns');
|
||||
const notificationRoutes = require('../routes/notifications');
|
||||
@@ -90,9 +98,11 @@ const DependencyManager = require('./managers/dependency-manager');
|
||||
const autoRestartRoutes = require('../routes/auto-restart');
|
||||
const configDriftRoutes = require('../routes/config-drift');
|
||||
const sslMonitorRoutes = require('../routes/ssl-monitor');
|
||||
const diskSpaceRoutes = require('../routes/disk-space');
|
||||
const { AutoRestartManager } = require('./managers/auto-restart-manager');
|
||||
const { ConfigDriftDetector } = require('./managers/config-drift-detector');
|
||||
const SSLMonitor = require('./monitoring/ssl-monitor');
|
||||
const { DiskSpaceMonitor } = require('./monitoring/disk-space-monitor');
|
||||
const DNSPropagationChecker = require('./dns/dns-propagation');
|
||||
|
||||
// Constants
|
||||
@@ -455,6 +465,12 @@ async function createApp() {
|
||||
sslMonitor.start(3600000); // 1 hour
|
||||
log.info('app', 'SSL monitor initialized');
|
||||
|
||||
// Initialize disk space monitor (disk budget + auto-cleanup)
|
||||
const diskSpaceMonitor = new DiskSpaceMonitor({ log, config: ctx.siteConfig });
|
||||
ctx.diskSpaceMonitor = diskSpaceMonitor;
|
||||
diskSpaceMonitor.start(600000); // 10 min
|
||||
log.info('app', 'Disk space monitor initialized', { budgetGB: diskSpaceMonitor.getConfig().diskBudgetGB });
|
||||
|
||||
// Initialize DNS propagation checker
|
||||
const dnsPropagationChecker = new DNSPropagationChecker(ctx);
|
||||
ctx.dnsPropagationChecker = dnsPropagationChecker;
|
||||
@@ -587,6 +603,58 @@ async function createApp() {
|
||||
log: ctx.log,
|
||||
notificationManager: ctx.notification
|
||||
}));
|
||||
|
||||
// DC-077: i18n — language metadata and translations (public, no auth needed)
|
||||
apiRouter.use(i18nRoutes());
|
||||
|
||||
// DC-100: Service discovery — auto-detect running containers
|
||||
apiRouter.use(discoverRoutes({
|
||||
docker: ctx.docker,
|
||||
servicesStateManager: ctx.servicesStateManager,
|
||||
asyncHandler: ctx.asyncHandler,
|
||||
}));
|
||||
|
||||
// DC-103: One-click adopt — auto-generate routes + DNS + service entry
|
||||
apiRouter.use(discoverAdoptRoutes({
|
||||
docker: ctx.docker,
|
||||
servicesStateManager: ctx.servicesStateManager,
|
||||
caddy: ctx.caddy,
|
||||
dns: ctx.dns,
|
||||
siteConfig: ctx.config,
|
||||
asyncHandler: ctx.asyncHandler,
|
||||
}));
|
||||
|
||||
// DC-104: App catalog — browse curated templates
|
||||
const { APP_TEMPLATES: templatesArray } = require('./docker/app-templates');
|
||||
apiRouter.use(catalogRoutes({
|
||||
APP_TEMPLATES: templatesArray,
|
||||
asyncHandler: ctx.asyncHandler,
|
||||
}));
|
||||
|
||||
// DC-105: Smart defaults wizard
|
||||
apiRouter.use(wizardRoutes({
|
||||
APP_TEMPLATES: templatesArray,
|
||||
asyncHandler: ctx.asyncHandler,
|
||||
}));
|
||||
|
||||
// DC-107: Disaster recovery — full backup + restore
|
||||
apiRouter.use(disasterRoutes({
|
||||
servicesStateManager: ctx.servicesStateManager,
|
||||
platformPaths: require('../platform-paths'),
|
||||
log: ctx.log,
|
||||
asyncHandler: ctx.asyncHandler,
|
||||
}));
|
||||
|
||||
// DC-106: Caddyfile-as-code — visual reverse proxy builder
|
||||
apiRouter.use(caddycodeRoutes({
|
||||
asyncHandler: ctx.asyncHandler,
|
||||
}));
|
||||
|
||||
// DC-108: Multi-host fleet management
|
||||
apiRouter.use(fleetRoutes({
|
||||
log: ctx.log,
|
||||
asyncHandler: ctx.asyncHandler,
|
||||
}));
|
||||
apiRouter.use(updatesRoutes({
|
||||
updateManager: ctx.updateManager,
|
||||
selfUpdater: ctx.selfUpdater,
|
||||
@@ -709,6 +777,11 @@ async function createApp() {
|
||||
asyncHandler: ctx.asyncHandler,
|
||||
logError: ctx.logError,
|
||||
}));
|
||||
apiRouter.use('/disk', diskSpaceRoutes({
|
||||
diskSpaceMonitor: ctx.diskSpaceMonitor,
|
||||
asyncHandler: ctx.asyncHandler,
|
||||
log: ctx.log,
|
||||
}));
|
||||
|
||||
// Inline API routes (mounted under /api/v1 below)
|
||||
// Note: /health lives at root only — see root-level health check below.
|
||||
@@ -723,6 +796,12 @@ async function createApp() {
|
||||
ok(res, { metrics: metrics.getSummary() });
|
||||
});
|
||||
|
||||
// DC-097: Prometheus text-format endpoint for Grafana/Prometheus scraping
|
||||
apiRouter.get('/metrics/prometheus', (req, res) => {
|
||||
res.set('Content-Type', 'text/plain; version=0.0.4');
|
||||
res.send(metrics.toPrometheus());
|
||||
});
|
||||
|
||||
// Mount at /api/v1 (canonical, single version)
|
||||
app.use('/api/v1', apiRouter);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user