import { loadConfig } from './config.js'; import { createApiServer } from './server.js'; import { createDocker } from './docker.js'; import { createJobs } from './jobs.js'; import { createDev } from './dev.js'; import { createProxy } from './proxy.js'; import os from 'node:os'; import { listenAddresses } from './listen.js'; const config = loadConfig(process.env); const docker = createDocker(); const realJobs = createJobs({ config, docker }); // Die API antwortet auf POST /jobs/build mit { runId }. const jobs = { submit: (job) => ({ runId: realJobs.submit(job) }), get: realJobs.get, queueLength: realJobs.queueLength }; setInterval(() => realJobs.pruneCache().catch((e) => console.error('pruneCache', e)), 24 * 3600e3).unref(); const dev = createDev({ config, docker, jobs: realJobs }); // Zustand der Dev-Server liegt nur im Speicher: Überbleibsel entfernen, dann jede Minute Leerlauf prüfen. dev.cleanupOrphans().catch((e) => console.error('cleanupOrphans', e)); setInterval(() => dev.sweep().catch((e) => console.error('sweep', e)), 60e3).unref(); // R13: nur auf Adressen außerhalb des Sandbox-Netzes lauschen (kein Zugriff aus Dev-Containern am Traefik-Auth vorbei). const addrs = listenAddresses(os.networkInterfaces(), config.sandboxSubnet); for (const addr of addrs) { createApiServer({ config, jobs, dev }).listen(config.apiPort, addr, () => console.log(`Preview-Runner API auf ${addr}:${config.apiPort}`)); createProxy({ config, dev }).listen(config.proxyPort, addr, () => console.log(`Preview-Runner Proxy auf ${addr}:${config.proxyPort}`)); }