{"id":196,"date":"2026-05-13T14:49:03","date_gmt":"2026-05-13T14:49:03","guid":{"rendered":"https:\/\/thesidequestlab.com\/project\/tsql-ops-dashboard\/"},"modified":"2026-05-13T14:58:45","modified_gmt":"2026-05-13T14:58:45","slug":"tsql-ops-dashboard","status":"publish","type":"post","link":"https:\/\/thesidequestlab.com\/old\/project\/tsql-ops-dashboard\/","title":{"rendered":"TSQL Ops Dashboard"},"content":{"rendered":"<figure class=\"project-body-hero\"><img decoding=\"async\" src=\"https:\/\/images.unsplash.com\/photo-1551288049-bebda4e38f71?auto=format&#038;fit=crop&#038;w=1400&#038;q=80\" alt=\"Abstract analytics dashboard on monitors\" loading=\"lazy\"><\/figure>\n<div class=\"privacy-callout\"><strong data-lang-block=\"en\">Privacy note.<\/strong><strong data-lang-block=\"nl\">Privacy-notitie.<\/strong> <span data-lang-block=\"en\">This write-up explains the architecture and purpose without publishing credentials, private routes that should stay private, personal data, or operational secrets.<\/span><span data-lang-block=\"nl\">Deze beschrijving legt de architectuur en het doel uit zonder credentials, private routes, persoonlijke gegevens of operationele geheimen te publiceren.<\/span><\/div>\n<div class=\"project-facts\">\n<div class=\"project-fact\"><strong>Type<\/strong><span>Private ops dashboard<\/span><\/div>\n<div class=\"project-fact\"><strong>Stack<\/strong><span>Flask, Docker SDK, Caddy, Authelia<\/span><\/div>\n<div class=\"project-fact\"><strong>Purpose<\/strong><span>Fast server visibility<\/span><\/div>\n<\/div>\n<div class=\"project-deep\" data-lang-block=\"en\">\n<h2>What it is<\/h2>\n<p>The dashboard is the server\u2019s quick-look control room. It collects the checks that are useful during maintenance: system load, disk and memory pressure, container state, update hints, backup entry points, and links to the other services.<\/p>\n<h2>How it works<\/h2>\n<div class=\"workflow-steps\">\n<div class=\"workflow-step\">A small Flask app serves the UI and JSON endpoints from an internal port.<\/div>\n<div class=\"workflow-step\">The Docker SDK reads container status locally, so the page can show what is running without exposing the Docker socket publicly.<\/div>\n<div class=\"workflow-step\">Caddy publishes the route and Authelia protects access before the dashboard is shown.<\/div>\n<div class=\"workflow-step\">Mutating actions are disabled by default unless explicitly enabled through environment configuration.<\/div>\n<\/div>\n<h2>Why it exists<\/h2>\n<p>Most personal servers fail in boring ways: a container is stale, a disk fills up, a service moved, or the route points at the wrong upstream. This dashboard is designed to catch those boring problems quickly without logging into five different tools.<\/p>\n<ul class=\"tech-tags\">\n<li>Flask<\/li>\n<li>Docker Compose<\/li>\n<li>Authelia<\/li>\n<li>Caddy<\/li>\n<li>Ops UI<\/li>\n<\/ul>\n<\/div>\n<div class=\"project-deep\" data-lang-block=\"nl\">\n<h2>Wat het is<\/h2>\n<p>Het dashboard is de snelle controlekamer van de server. Het bundelt checks die nuttig zijn tijdens onderhoud: systeemload, disk- en geheugendruk, containerstatus, update-indicaties, backup-ingangen en links naar andere services.<\/p>\n<h2>Hoe het werkt<\/h2>\n<div class=\"workflow-steps\">\n<div class=\"workflow-step\">Een kleine Flask-app serveert de UI en JSON-endpoints op een interne poort.<\/div>\n<div class=\"workflow-step\">De Docker SDK leest lokaal containerstatus uit, zodat de pagina kan tonen wat draait zonder de Docker socket publiek te maken.<\/div>\n<div class=\"workflow-step\">Caddy publiceert de route en Authelia zet er authenticatie voor.<\/div>\n<div class=\"workflow-step\">Muterende acties staan standaard uit, tenzij ze expliciet via environment-configuratie worden aangezet.<\/div>\n<\/div>\n<h2>Waarom het bestaat<\/h2>\n<p>Persoonlijke servers gaan meestal stuk op saaie manieren: een container is verouderd, een disk loopt vol, een service is verplaatst of een route wijst naar de verkeerde upstream. Dit dashboard is gemaakt om die saaie problemen snel te zien zonder vijf tools te openen.<\/p>\n<ul class=\"tech-tags\">\n<li>Flask<\/li>\n<li>Docker Compose<\/li>\n<li>Authelia<\/li>\n<li>Caddy<\/li>\n<li>Ops UI<\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>A private command center for health checks, containers, backups, quick links and server status.<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-196","post","type-post","status-publish","format-standard","hentry","category-projects"],"_links":{"self":[{"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/posts\/196","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/comments?post=196"}],"version-history":[{"count":1,"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/posts\/196\/revisions"}],"predecessor-version":[{"id":204,"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/posts\/196\/revisions\/204"}],"wp:attachment":[{"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/media?parent=196"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/categories?post=196"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thesidequestlab.com\/old\/wp-json\/wp\/v2\/tags?post=196"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}