Date: 2026-02-25 Status: Completed Origin: MDF Webseiten session 0053
app/job_store.py — in-memory job store decouples subprocess from SSE connectionapp/routers/jobs.py — job management endpointsGET /api/jobs/, GET /api/jobs/{op_id}, GET /api/jobs/{op_id}/stream?from=Nrun_job() to ops_runner.py — runs subprocess writing to job store, NOT killed on browser disconnectjob_sse_stream() to job_store.py — shared SSE wrapper with keepalivecreate_job() → asyncio.create_task(run_job()) → return StreamingResponse(job_sse_stream())/api/jobs/{op_id}/stream?from=N (3 retries)app/routers/terminal.py — WebSocket endpoint with PTY via docker exec{"type":"input","data":"..."} / {"type":"resize","cols":80,"rows":24} / {"type":"output","data":"..."}sync_data.py (regression from engineer rewrite)rebuild.py (_all_compose_dirs, _compose_cmd_for for Seafile)main.py with jobs + terminal routers, cleanup task in lifespansync_data.py bidirectional fix (git commit 31ac43f) and stabilization checksfrom=N query param on stream endpoint enables replay from any position — client tracks last received line indexapp/job_store.py — new (315 lines)app/routers/jobs.py — new (186 lines)app/routers/terminal.py — new (287 lines)app/ops_runner.py — added run_job() (388 lines total)app/main.py — added routers + cleanup task (138 lines)app/routers/backups.py — job store integration (287 lines)app/routers/restore.py — job store integration (290 lines)app/routers/sync_data.py — job store + bidirectional fix (71 lines)app/routers/promote.py — job store integration (69 lines)app/routers/rebuild.py — job store + multi-compose (365 lines)static/js/app.js — v15: reconnect + terminal (2355 lines)static/index.html — xterm.js CDN + terminal modalstatic/css/style.css — terminal stylesCode written locally at /Users/i052341/Daten/Cloud/08 - Others/MDF/Infrastruktur/Code/ops-dashboard/. Not yet deployed to server at time of note creation. Deploy + verification is the next session's starting task.
Tags: #Session #OpsDashboard #PersistentJobs #Terminal