import { createServer } from "http"; import next from "next"; import { handleWebDAV } from "./lib/webdav"; import { createDailySnapshotIfNeeded } from "./lib/snapshot"; import { purgeExpiredTrash, cleanupOrphanChunks } from "./lib/trash"; const dev = process.env.NODE_ENV !== "production"; const port = parseInt(process.env.PORT || "5001", 10); const app = next({ dev }); const handle = app.getRequestHandler(); app.prepare().then(() => { createServer(async (req, res) => { const parsedUrl = new URL(req.url!, `http://${req.headers.host || "localhost"}`); if (parsedUrl.pathname?.startsWith("/dav")) { await handleWebDAV(req, res); } else { await handle(req, res); } }).listen(port, () => { console.log(`> SPB Cloud ready on http://localhost:${port}`); console.log(`> WebDAV endpoint: http://localhost:${port}/dav`); console.log(`> WebDAV public: https://cloud.spboucher.ai/dav`); // Daily snapshot: attempt immediately on startup, then check every hour const runSnapshot = () => { createDailySnapshotIfNeeded() .then((created) => { if (created) console.log("> [Snapshot] Snapshot quotidien créé"); }) .catch((err) => console.error("> [Snapshot] Erreur:", err)); }; // Entretien horaire : purge de la corbeille (> 30 jours) + chunks d'upload orphelins const runMaintenance = () => { purgeExpiredTrash().then((n) => { if (n) console.log(`> [Corbeille] ${n} fichier(s) purgé(s) (> 30 j)`); }).catch((err) => console.error("> [Corbeille] Erreur:", err)); cleanupOrphanChunks().catch((err) => console.error("> [Upload] Nettoyage chunks:", err)); }; setTimeout(runMaintenance, 60 * 1000); setInterval(runMaintenance, 60 * 60 * 1000); if (process.env.SNAPSHOT_DISABLED === "1") { console.log("> [Snapshot] désactivé (SNAPSHOT_DISABLED=1)"); } else { runSnapshot(); setInterval(runSnapshot, 60 * 60 * 1000); // re-check every hour } }); }).catch((err) => { console.error("Failed to start server:", err); process.exit(1); });