{"id":2725,"date":"2026-04-09T21:46:35","date_gmt":"2026-04-09T21:46:35","guid":{"rendered":"https:\/\/www.mayit.eu\/?page_id=2725"},"modified":"2026-04-09T22:16:15","modified_gmt":"2026-04-09T22:16:15","slug":"openwebui","status":"publish","type":"page","link":"https:\/\/www.mayit.eu\/en\/openwebui\/","title":{"rendered":"OpenWebUI"},"content":{"rendered":"<!doctype html>\n<html lang=\"de\">\n<head>\n<meta charset=\"utf-8\" \/>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" \/>\n<title>Projektdokumentation \u2013 MayIT Docker KI &#038; Monitoring Platform<\/title>\n<meta name=\"author\" content=\"MayIT\" \/>\n<meta name=\"description\" content=\"Projektdokumentation der MayIT Docker KI &#038; Monitoring Platform mit Homarr, OpenWebUI, Portainer, externem Netdata, Tailscale, Betriebsmodell und Recovery-Konzept.\" \/>\n<style>\n\n:root{\n  --bg:#0b0f14; --panel:#111827; --panel2:#0f172a;\n  --text:#e5e7eb; --muted:#9ca3af;\n  --accent:#60a5fa; --accent2:#34d399; --warn:#f59e0b; --danger:#fb7185; --ok:#22c55e;\n  --border:#1f2937; --codeborder:#1d2a3a;\n  --shadow: 0 10px 30px rgba(0,0,0,.35);\n  --radius: 16px;\n  --mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  --sans: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Arial, \"Apple Color Emoji\",\"Segoe UI Emoji\";\n}\n*{box-sizing:border-box}\nhtml{scroll-behavior:smooth}\nbody{\n  margin:0; font-family:var(--sans);\n  background:\n    radial-gradient(1200px 600px at 10% -10%, rgba(96,165,250,.18), transparent 55%),\n    radial-gradient(900px 500px at 80% 0%, rgba(52,211,153,.10), transparent 50%),\n    var(--bg);\n  color:var(--text);\n}\na{color:var(--accent); text-decoration:none}\na:hover{text-decoration:underline}\n.layout{display:flex; min-height:100vh}\n.toc{\n  position:sticky; top:0; height:100vh; width:360px; min-width:300px;\n  padding:22px 18px;\n  background:linear-gradient(180deg, rgba(17,24,39,.92), rgba(15,23,42,.92));\n  border-right:1px solid var(--border); overflow:auto; backdrop-filter: blur(8px);\n}\n.brand{\n  display:flex; gap:10px; align-items:center;\n  padding:10px 10px 14px; border:1px solid var(--border);\n  border-radius:14px; background:rgba(11,18,32,.65); box-shadow:var(--shadow);\n  margin-bottom:14px;\n}\n.logo{\n  width:38px; height:38px; border-radius:12px;\n  background:linear-gradient(135deg, rgba(96,165,250,.95), rgba(52,211,153,.95));\n  display:flex; align-items:center; justify-content:center;\n  color:#06101c; font-weight:900;\n}\n.brand h1{font-size:14px; margin:0}\n.brand .sub{font-size:12px; color:var(--muted); margin-top:2px}\n.pill{\n  display:inline-flex; align-items:center; gap:8px;\n  font-size:12px; color:var(--muted);\n  padding:10px 12px; border:1px solid var(--border);\n  border-radius:999px; background:rgba(11,18,32,.55);\n  margin:10px 8px 0;\n}\n.pill b{color:var(--text)}\n.toc h2{font-size:12px; margin:14px 10px 8px; color:var(--muted); letter-spacing:.08em; text-transform:uppercase}\n.toc ul{list-style:none; margin:0; padding:0 6px 14px}\n.toc li{margin:6px 0}\n.toc a{\n  display:block; padding:8px 10px; border-radius:12px;\n  color:var(--text); border:1px solid transparent;\n}\n.toc a:hover{border-color:rgba(96,165,250,.35); background:rgba(96,165,250,.10); text-decoration:none}\n.main{flex:1; padding:28px 26px 80px}\n.container{max-width:1120px; margin:0 auto}\n.hero{\n  padding:22px; border-radius: var(--radius);\n  background: linear-gradient(180deg, rgba(17,24,39,.55), rgba(15,23,42,.35));\n  border:1px solid var(--border); box-shadow: var(--shadow);\n}\n.hero h1{font-size:28px; margin:0 0 8px}\n.hero .meta{display:flex; flex-wrap:wrap; gap:10px; margin-top:12px}\n.tag{\n  font-size:12px; color:var(--text);\n  padding:8px 12px; border-radius:999px;\n  border:1px solid var(--border); background:rgba(11,18,32,.55);\n}\nsection{margin-top:18px}\n.card{\n  padding:18px; border-radius: var(--radius);\n  border:1px solid var(--border);\n  background: rgba(11,18,32,.55);\n  box-shadow: var(--shadow);\n}\n.card h3{margin:0 0 10px; font-size:18px}\n.muted{color:var(--muted)}\n.small{font-size:12px}\n.note, .warn, .danger, .ok{\n  border-radius:14px; padding:12px 14px; border:1px solid var(--border);\n  background: rgba(96,165,250,.08);\n}\n.warn{background: rgba(245,158,11,.10); border-color: rgba(245,158,11,.25)}\n.danger{background: rgba(251,113,133,.10); border-color: rgba(251,113,133,.25)}\n.ok{background: rgba(34,197,94,.10); border-color: rgba(34,197,94,.25)}\n.hr{height:1px; background:var(--border); margin:14px 0}\n.grid{display:grid; gap:14px}\n@media (min-width: 980px){\n  .grid.cols2{grid-template-columns: 1fr 1fr}\n  .grid.cols3{grid-template-columns: 1fr 1fr 1fr}\n}\ntable{width:100%; border-collapse:separate; border-spacing:0; overflow:hidden; border-radius:14px; border:1px solid var(--border)}\nth, td{padding:10px; border-bottom:1px solid var(--border); vertical-align:top}\nth{background:rgba(17,24,39,.55); text-align:left; font-size:12px; text-transform:uppercase; letter-spacing:.08em; color:var(--muted)}\ntr:last-child td{border-bottom:none}\n.codewrap{position:relative; margin-top:10px}\npre{\n  margin:0; padding:14px; overflow:auto; border-radius:14px;\n  background:linear-gradient(180deg, rgba(10,15,26,.95), rgba(10,15,26,.85));\n  border:1px solid var(--codeborder); color:var(--text);\n  font-family: var(--mono); font-size:12.8px; line-height:1.45;\n}\n.copybtn{\n  position:absolute; top:10px; right:10px;\n  border:1px solid var(--border); background:rgba(15,23,42,.70);\n  color:var(--text); padding:8px 10px; border-radius:12px;\n  cursor:pointer; font-size:12px; display:flex; align-items:center; gap:8px;\n}\n.copybtn:hover{border-color:rgba(96,165,250,.40); background:rgba(96,165,250,.12)}\n.copybtn .dot{width:8px; height:8px; border-radius:99px; background:var(--accent)}\n.kbd{display:inline-block; padding:2px 8px; border-radius:10px; border:1px solid var(--border); background:rgba(15,23,42,.55); font-family:var(--mono); font-size:12px}\n.badge{display:inline-flex; align-items:center; gap:8px; padding:8px 10px; border-radius:999px; border:1px solid var(--border); background:rgba(15,23,42,.35); font-size:12px}\n.badge .b{width:8px;height:8px;border-radius:99px;background:var(--accent2)}\n.footer{\n  margin-top:18px; padding:16px 18px; border-radius: var(--radius);\n  border:1px solid var(--border); background:rgba(11,18,32,.45); color:var(--muted)\n}\n.footer b{color:var(--text)}\ndetails{\n  border:1px solid var(--border); border-radius:14px; padding:10px 12px; background:rgba(15,23,42,.25)\n}\nsummary{cursor:pointer; color:var(--text); font-weight:700}\ndetails p, details ul{color:var(--muted)}\n.print-only{display:none}\n.step{display:flex; gap:10px; align-items:flex-start; margin:10px 0}\n.num{\n  flex:0 0 auto; width:28px; height:28px; border-radius:10px;\n  display:flex; align-items:center; justify-content:center;\n  background:rgba(96,165,250,.12); border:1px solid rgba(96,165,250,.28);\n  color:var(--text); font-weight:700;\n}\n\n.card {\n  min-width: 0;\n  overflow: hidden;\n}\n.grid-backup{\n  display:grid;\n  grid-template-columns: 1fr 1fr;\n  gap:20px;\n  align-items:start;\n}\npre{\n  white-space: pre-wrap;\n  word-break: break-word;\n}\n@media (max-width: 900px){\n  .grid-backup{\n    grid-template-columns: 1fr;\n  }\n}\n\n@media print{\n  body{background:#fff; color:#000}\n  .layout{display:block}\n  .toc{display:none}\n  .hero, .card, .footer, details{box-shadow:none; background:#fff; border:1px solid #ddd}\n  pre{background:#f7f7f7; color:#000; border:1px solid #ddd}\n  .copybtn{display:none}\n  a{color:#000; text-decoration:underline}\n  .print-only{display:block}\n}\n\n<\/style>\n<\/head>\n<body>\n  <div class=\"layout\">\n    <aside class=\"toc\">\n      <div class=\"brand\">\n        <div class=\"logo\">M<\/div>\n        <div>\n          <h1>Projektdokumentation<\/h1>\n          <div class=\"sub\">KI \u2022 Monitoring \u2022 Operations \u2022 Autor: <b>MayIT<\/b><\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"pill\"><b>Ziel:<\/b> Vollst\u00e4ndige Dokumentation der MayIT Docker KI &#038; Monitoring Platform<\/div>\n\n      <h2>Navigation<\/h2>\n      <ul>\n        <li><a href=\"#scope\">Scope &#038; Zielbild<\/a><\/li>\n        <li><a href=\"#architecture\">System- und Monitoring-Architektur<\/a><\/li>\n        <li><a href=\"#dashboards\">Dashboards &#038; Zugriffe<\/a><\/li>\n        <li><a href=\"#backend\">Betriebs- und Monitoring-Logik<\/a><\/li>\n        <li><a href=\"#tiles\">Dashboard-Kacheln<\/a><\/li>\n        <li><a href=\"#health\">Health-Scores &#038; Bewertungslogik<\/a><\/li>\n        <li><a href=\"#security\">Security Monitoring<\/a><\/li>\n        <li><a href=\"#alerts\">Alerts &#038; Eskalation<\/a><\/li>\n        <li><a href=\"#operations\">Betrieb &#038; Aufgabenmodell<\/a><\/li>\n        <li><a href=\"#troubleshooting\">Troubleshooting<\/a><\/li>\n        <li><a href=\"#backup\">Backup &#038; Recovery<\/a><\/li>\n        <li><a href=\"#appendix\">Anhang<\/a><\/li>\n      <\/ul>\n\n      <h2>Quick Links<\/h2>\n      <ul>\n        <li><a href=\"#api-output\">Status-Pfade<\/a><\/li>\n        <li><a href=\"#health-matrix\">Health-Matrix<\/a><\/li>\n        <li><a href=\"#alert-matrix\">Alert-Matrix<\/a><\/li>\n      <\/ul>\n\n      <div class=\"footer small\">\n        <div><b>Stand:<\/b> 2026-04-09<\/div>\n        <div class=\"hr\"><\/div>\n        <div>Dokument: HTML \u2022 Upload geeignet \u2022 Dark Enterprise Style<\/div>\n      <\/div>\n    <\/aside>\n\n    <main class=\"main\">\n      <div class=\"container\">\n        <div class=\"hero\">\n          <h1>MayIT Docker KI &#038; Monitoring Platform \u2013 Projektdokumentation<\/h1>\n          <div class=\"muted\">\n            Diese Projektdokumentation beschreibt den Aufbau einer lokal betriebenen Docker-basierten\n            KI- und Monitoring-Plattform auf einem Mac Mini M4. Dokumentiert werden Architektur,\n            Dashboard-Konzept, Container-Management, Monitoring-Integration, externer Zugriff via\n            Tailscale, operative Betriebslogik, Troubleshooting, Backup und Wiederherstellung.\n          <\/div>\n          <div class=\"meta\">\n            <span class=\"tag\">Autor: MayIT<\/span>\n            <span class=\"tag\">Homarr + OpenWebUI<\/span>\n            <span class=\"tag\">Portainer Management<\/span>\n            <span class=\"tag\">Netdata extern<\/span>\n            <span class=\"tag\">Tailscale \/ MagicDNS<\/span>\n          <\/div>\n        <\/div>\n\n        <section id=\"scope\" class=\"card\">\n          <h3>Scope &#038; Zielbild<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\">\n                <b>Zielbild:<\/b> Eine kompakte, professionelle und von \u00fcberall sicher erreichbare\n                Betriebsplattform, die KI-Nutzung, Container-Management und Monitoring in einer\n                zentralen Bedienoberfl\u00e4che zusammenf\u00fchrt.\n              <\/div>\n              <div class=\"hr\"><\/div>\n              <ul>\n                <li><b>Usability:<\/b> Ein zentrales Dashboard f\u00fcr alle wichtigen Dienste.<\/li>\n                <li><b>Stabilit\u00e4t:<\/b> Saubere Stack-Struktur ohne Altlasten oder Testreste.<\/li>\n                <li><b>Observability:<\/b> Statussichtbarkeit direkt in Homarr plus externes Monitoring.<\/li>\n                <li><b>Security:<\/b> Kein unn\u00f6tiger Public Exposure, Remote-Zugriff \u00fcber Tailscale.<\/li>\n              <\/ul>\n            <\/div>\n            <div>\n              <div class=\"ok\">\n                <b>Projektziel:<\/b> Das System soll nicht nur technisch funktionieren, sondern im\n                Betrieb schnell diagnostizierbar, erweiterbar und sauber dokumentierbar sein.\n              <\/div>\n              <div class=\"hr\"><\/div>\n              <div class=\"warn\">\n                <b>Leitprinzip:<\/b> Produktive Umstellungen erfolgen nur nach Backup, Paralleltest\n                und Validierung \u00fcber LAN und Tailscale. Erst danach werden Altzust\u00e4nde entfernt.\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"architecture\" class=\"card\">\n          <h3>System- und Monitoring-Architektur<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"badge\"><span class=\"b\"><\/span><b>Architekturprinzip:<\/b> Docker UI + KI Frontend + Management + externes Monitoring<\/div>\n              <div class=\"hr\"><\/div>\n              <table>\n                <thead><tr><th>Layer<\/th><th>Komponente<\/th><th>Funktion<\/th><\/tr><\/thead>\n                <tbody>\n                  <tr><td>Hardware<\/td><td>Mac Mini M4<\/td><td>Hostsystem f\u00fcr Docker und Ollama<\/td><\/tr>\n                  <tr><td>Dashboard<\/td><td>Homarr<\/td><td>Zentrale Start- und Kontrolloberfl\u00e4che<\/td><\/tr>\n                  <tr><td>KI Frontend<\/td><td>OpenWebUI<\/td><td>Browserbasierter Zugriff auf lokale KI<\/td><\/tr>\n                  <tr><td>Management<\/td><td>Portainer<\/td><td>Stacks, Container, Volumes und Betriebszust\u00e4nde<\/td><\/tr>\n                  <tr><td>Monitoring<\/td><td>Netdata (extern)<\/td><td>Erg\u00e4nzende System- und Infrastruktur\u00fcberwachung<\/td><\/tr>\n                  <tr><td>VPN<\/td><td>Tailscale<\/td><td>Gesch\u00fctzter Zugriff lokal und remote per MagicDNS<\/td><\/tr>\n                  <tr><td>LLM Backend<\/td><td>Ollama nativ<\/td><td>Lokale Modellverarbeitung au\u00dferhalb von Docker<\/td><\/tr>\n                <\/tbody>\n              <\/table>\n            <\/div>\n            <div>\n              <div class=\"note\">\n                <b>Kernidee:<\/b> Die eigentliche KI-Laufzeit verbleibt bewusst nativ auf dem Mac,\n                w\u00e4hrend die Bedien-, Management- und Monitoring-Schicht in klar voneinander getrennten\n                Containern betrieben wird. Dieses Modell vereinfacht Wartung, Ressourcensteuerung und\n                sp\u00e4tere Erweiterungen erheblich.\n              <\/div>\n              <div class=\"hr\"><\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#archp1\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"archp1\">Benutzer\n  \u2502\n  \u251c\u2500\u2500 Homarr         \u2192 Dashboard & Reachability\n  \u251c\u2500\u2500 OpenWebUI      \u2192 KI Interaktion\n  \u251c\u2500\u2500 Portainer      \u2192 Docker Management\n  \u2514\u2500\u2500 Netdata        \u2192 externes Monitoring\n\nMac Mini M4\n  \u251c\u2500\u2500 Docker \/ frontend-stack\n  \u2502    \u251c\u2500\u2500 homarr\n  \u2502    \u2514\u2500\u2500 openwebui\n  \u251c\u2500\u2500 portainer (separat)\n  \u2514\u2500\u2500 Ollama (nativ)\n\nZugriffspfade\n  \u251c\u2500\u2500 LAN      \u2192 192.168.x.x oder Hostname\n  \u2514\u2500\u2500 Tailscale \u2192 100.x.x.x oder MagicDNS-Hostname<\/pre>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"dashboards\" class=\"card\">\n          <h3>Dashboards &#038; Zugriffe<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\"><b>Homarr Dashboard<\/b><\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#dashp1\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"dashp1\">http:\/\/m4macmachine:7575<\/pre>\n              <\/div>\n              <div class=\"muted small\" style=\"margin-top:10px\">\n                Zweck: Zentrale Bedienoberfl\u00e4che mit Kacheln, Health-Indikatoren und Schnellzugriff.\n              <\/div>\n            <\/div>\n            <div>\n              <div class=\"note\"><b>OpenWebUI<\/b><\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#dashp2\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"dashp2\">http:\/\/m4macmachine:3000<\/pre>\n              <\/div>\n              <div class=\"muted small\" style=\"margin-top:10px\">\n                Zweck: Browserbasierte Nutzung der lokal betriebenen KI \u00fcber das Ollama-Backend.\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"hr\"><\/div>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\"><b>Portainer<\/b><\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#dashp3\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"dashp3\">https:\/\/m4macmachine:9443<\/pre>\n              <\/div>\n              <div class=\"muted small\" style=\"margin-top:10px\">\n                Zweck: Sichere Container- und Stack-Verwaltung. Zugriff ausschlie\u00dflich per HTTPS.\n              <\/div>\n            <\/div>\n            <div>\n              <div class=\"note\"><b>Netdata (extern)<\/b><\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#dashp4\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"dashp4\">Externer Monitoring-Server \/ separate Netdata-Instanz<\/pre>\n              <\/div>\n              <div class=\"muted small\" style=\"margin-top:10px\">\n                Zweck: Erg\u00e4nzende \u00dcberwachung au\u00dferhalb des Mac-Hosts und jenseits der Homarr-Reachability-Checks.\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"hr\"><\/div>\n          <div class=\"warn\">\n            <b>Zugriffsschutz:<\/b> Der produktive Remote-Zugriff erfolgt nicht \u00f6ffentlich, sondern gesch\u00fctzt\n            \u00fcber Tailscale. Dadurch bleiben Management- und KI-Oberfl\u00e4chen ohne unn\u00f6tige Internet-Exposition.\n          <\/div>\n        <\/section>\n\n        <section id=\"backend\" class=\"card\">\n          <h3>Betriebs- und Monitoring-Logik<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\"><b>Produktive Containerstruktur<\/b><\/div>\n              <ul>\n                <li>Finaler Stack: <span class=\"kbd\">frontend-stack<\/span><\/li>\n                <li>Service 1: <span class=\"kbd\">homarr<\/span><\/li>\n                <li>Service 2: <span class=\"kbd\">openwebui<\/span><\/li>\n                <li>Separat: <span class=\"kbd\">portainer<\/span><\/li>\n              <\/ul>\n            <\/div>\n            <div id=\"api-output\">\n              <div class=\"note\"><b>Status-Pfade<\/b><\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#api-p\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"api-p\">curl -I http:\/\/m4macmachine:7575\ncurl -I http:\/\/m4macmachine:3000\ncurl -k -I https:\/\/m4macmachine:9443\ntailscale status\ntailscale ip -4<\/pre>\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"hr\"><\/div>\n          <table>\n            <thead><tr><th>Wert \/ Ebene<\/th><th>Bedeutung<\/th><th>Quelle<\/th><\/tr><\/thead>\n            <tbody>\n              <tr><td>Homarr Status<\/td><td>Erreichbarkeit der produktiven Services<\/td><td>Homarr Healthcheck \/ Kachelstatus<\/td><\/tr>\n              <tr><td>OpenWebUI Health<\/td><td>Service erreichbar, Container healthy<\/td><td>Docker + Homarr<\/td><\/tr>\n              <tr><td>Portainer Reachability<\/td><td>Management-Layer erreichbar<\/td><td>HTTPS-Check<\/td><\/tr>\n              <tr><td>Tailscale Reachability<\/td><td>Remote-Zugriff \u00fcber 100.x.x.x oder Hostname<\/td><td>Tailscale<\/td><\/tr>\n              <tr><td>Hostname Resolution<\/td><td>MagicDNS-Aufl\u00f6sung auf Tailscale-IP<\/td><td>Tailscale \/ Hostname-Zugriff<\/td><\/tr>\n              <tr><td>Netdata<\/td><td>Externe Infrastruktur- und Systemmetriken<\/td><td>Separater Monitoring-Server<\/td><\/tr>\n              <tr><td>Backup-Artefakte<\/td><td>Tar-Archive der produktiven Volumes<\/td><td>BusyBox tar \/ lokaler Backup-Pfad<\/td><\/tr>\n            <\/tbody>\n          <\/table>\n        <\/section>\n\n        <section id=\"tiles\" class=\"card\">\n          <h3>Dashboard-Kacheln<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\"><b>\ud83e\udde0 KI<\/b><\/div>\n              <table style=\"margin-top:12px\">\n                <thead><tr><th>Kachel<\/th><th>Inhalt<\/th><\/tr><\/thead>\n                <tbody>\n                  <tr><td>OpenWebUI<\/td><td>Prim\u00e4rer Einstiegspunkt f\u00fcr KI-Nutzung<\/td><\/tr>\n                  <tr><td>Statuspunkt<\/td><td>Direkte Reachability-Kontrolle unten rechts<\/td><\/tr>\n                  <tr><td>\u00d6ffnungsverhalten<\/td><td>Neuer Tab \/ Hostname-basierter Zugriff<\/td><\/tr>\n                <\/tbody>\n              <\/table>\n            <\/div>\n            <div>\n              <div class=\"note\"><b>\ud83d\udda5\ufe0f Infrastruktur<\/b><\/div>\n              <table style=\"margin-top:12px\">\n                <thead><tr><th>Kachel<\/th><th>Inhalt<\/th><\/tr><\/thead>\n                <tbody>\n                  <tr><td>Portainer<\/td><td>Container-\/Stack-Management<\/td><\/tr>\n                  <tr><td>Homarr<\/td><td>Dashboard \/ Control Center<\/td><\/tr>\n                  <tr><td>Statuspunkte<\/td><td>Sofortige optische Erreichbarkeitsanzeige<\/td><\/tr>\n                <\/tbody>\n              <\/table>\n            <\/div>\n          <\/div>\n\n          <div class=\"hr\"><\/div>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\"><b>Monitoring-Erweiterung<\/b><\/div>\n              <ul>\n                <li>Netdata als separate Monitoring-Kachel integrierbar<\/li>\n                <li>Externer Monitoring-Server kann \u00fcber Hostname\/Tailscale eingebunden werden<\/li>\n                <li>Dashboard ist damit auf sp\u00e4tere NOC-\/Monitoring-Erweiterung vorbereitet<\/li>\n              <\/ul>\n            <\/div>\n            <div>\n              <div class=\"note\"><b>UX-Prinzip<\/b><\/div>\n              <ul>\n                <li>Wichtigste App oben: OpenWebUI<\/li>\n                <li>Management darunter: Portainer und Homarr<\/li>\n                <li>Kurze Klickwege, Status mit einem Blick erfassbar<\/li>\n              <\/ul>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"health\" class=\"card\">\n          <h3>Health-Scores &#038; Bewertungslogik<\/h3>\n          <div id=\"health-matrix\" class=\"grid cols2\">\n            <div>\n              <div class=\"ok\"><b>Homarr Reachability Score<\/b><\/div>\n              <p class=\"muted\">Praktisch umgesetzter, visueller Basis-Healthcheck \u00fcber Kachelstatusfarben.<\/p>\n              <table>\n                <thead><tr><th>Status<\/th><th>Bedeutung<\/th><\/tr><\/thead>\n                <tbody>\n                  <tr><td>Gr\u00fcn<\/td><td>Dienst erreichbar und funktional<\/td><\/tr>\n                  <tr><td>Rot<\/td><td>Dienst nicht erreichbar \/ gestoppt \/ gest\u00f6rt<\/td><\/tr>\n                  <tr><td>Blau (Pause\/Test)<\/td><td>Tempor\u00e4rer Betriebszustand im manuellen Test<\/td><\/tr>\n                <\/tbody>\n              <\/table>\n            <\/div>\n            <div>\n              <div class=\"ok\"><b>Betriebslogik<\/b><\/div>\n              <p class=\"muted\">Das Projekt nutzt bewusst eine schlanke, aber belastbare Bewertungslogik.<\/p>\n              <table>\n                <thead><tr><th>Einfluss<\/th><th>Bewertung<\/th><\/tr><\/thead>\n                <tbody>\n                  <tr><td>Service erreichbar<\/td><td>betriebsbereit<\/td><\/tr>\n                  <tr><td>Service nicht erreichbar<\/td><td>Incident \/ Eingriffsbedarf<\/td><\/tr>\n                  <tr><td>Tailscale Zugriff erfolgreich<\/td><td>Remote-Betrieb funktionsf\u00e4hig<\/td><\/tr>\n                  <tr><td>Backup erfolgreich<\/td><td>Rollback-Punkt gesichert<\/td><\/tr>\n                <\/tbody>\n              <\/table>\n            <\/div>\n          <\/div>\n\n          <div class=\"hr\"><\/div>\n          <div class=\"warn\">\n            <b>Bewertung:<\/b> Dieses Projekt nutzt bewusst keine k\u00fcnstlich \u00fcberladene Health-Metrik,\n            sondern verbindet Homarr-Status, Container-Health, Tailscale-Tests und externe Netdata-Metriken\n            zu einer praxisnahen operativen Bewertungslogik.\n          <\/div>\n        <\/section>\n\n        <section id=\"security\" class=\"card\">\n          <h3>Security Monitoring<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\"><b>Tailscale Remote Security<\/b><\/div>\n              <ul>\n                <li>Remote-Zugriff erfolgt ausschlie\u00dflich \u00fcber Tailscale<\/li>\n                <li>MagicDNS-Hostname <span class=\"kbd\">m4macmachine<\/span> ersetzt schwer merkbare IPs<\/li>\n                <li>Auch Hostname-Zugriffe laufen im Fremdnetz \u00fcber Tailscale<\/li>\n                <li>Kein unn\u00f6tiges Public Exposure der Management-Oberfl\u00e4chen<\/li>\n              <\/ul>\n            <\/div>\n            <div>\n              <div class=\"note\"><b>Portainer Zugriff<\/b><\/div>\n              <ul>\n                <li>Port 9443 nur per HTTPS nutzen<\/li>\n                <li>Fehlerbild <span class=\"kbd\">HTTP request to HTTPS server<\/span> wurde identifiziert und sauber eingeordnet<\/li>\n                <li>Hostname- und Tailscale-Zugriffe wurden erfolgreich validiert<\/li>\n              <\/ul>\n            <\/div>\n          <\/div>\n\n          <div class=\"hr\"><\/div>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\"><b>Container-Hygiene<\/b><\/div>\n              <ul>\n                <li>Alte Test- und Prod-Reste wurden vollst\u00e4ndig bereinigt<\/li>\n                <li>Nur produktive Container und Volumes verbleiben im Endzustand<\/li>\n                <li>Parallele Migration wurde kontrolliert \u00fcber Alternativports abgewickelt<\/li>\n              <\/ul>\n            <\/div>\n            <div>\n              <div class=\"note\"><b>Monitoring-Security<\/b><\/div>\n              <ul>\n                <li>Netdata verbleibt absichtlich auf separatem Server<\/li>\n                <li>Dadurch entsteht zus\u00e4tzliche Sicht auf das Gesamtsystem<\/li>\n                <li>Monitoring und KI-Host bleiben logisch getrennt<\/li>\n              <\/ul>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"alerts\" class=\"card\">\n          <h3>Alerts &#038; Eskalation<\/h3>\n          <div id=\"alert-matrix\" class=\"grid cols2\">\n            <div>\n              <div class=\"warn\"><b>Aktive Alert-Logik<\/b><\/div>\n              <table style=\"margin-top:12px\">\n                <thead><tr><th>Alert<\/th><th>Trigger<\/th><th>Level<\/th><\/tr><\/thead>\n                <tbody>\n                  <tr><td>OpenWebUI down<\/td><td>Kachelstatus rot \/ HTTP-Check fehlschl\u00e4gt<\/td><td>High<\/td><\/tr>\n                  <tr><td>Homarr down<\/td><td>Dashboard nicht erreichbar<\/td><td>High<\/td><\/tr>\n                  <tr><td>Portainer down<\/td><td>9443 via HTTPS nicht erreichbar<\/td><td>High<\/td><\/tr>\n                  <tr><td>Tailscale remote failed<\/td><td>Hostname und 100.x.x.x nicht erreichbar<\/td><td>High<\/td><\/tr>\n                  <tr><td>Netdata extern kritisch<\/td><td>CPU\/RAM\/Disk Alarm auf externer Instanz<\/td><td>Critical<\/td><\/tr>\n                  <tr><td>Backup missing<\/td><td>Finale Tar-Artefakte fehlen \/ Backup-Cut nicht vorhanden<\/td><td>Critical<\/td><\/tr>\n                <\/tbody>\n              <\/table>\n            <\/div>\n            <div>\n              <div class=\"warn\"><b>Alert-Panel Verhalten<\/b><\/div>\n              <ul>\n                <li>Alle Homarr-Kacheln gr\u00fcn = betriebsbereit<\/li>\n                <li>Pause-\/Stop-Test l\u00f6st Farbwechsel reproduzierbar aus<\/li>\n                <li>Netdata erg\u00e4nzt die reine Reachability um Systemzustand<\/li>\n                <li>Portainer dient bei Alarmen als operative Eingriffsoberfl\u00e4che<\/li>\n              <\/ul>\n              <div class=\"hr\"><\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#alertp1\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"alertp1\">Beispiel:\nHIGH: OpenWebUI not reachable\nHIGH: Portainer HTTPS path failed\nCRITICAL: External Netdata reports host overload\nCRITICAL: Final backup artifacts missing<\/pre>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"operations\" class=\"card\">\n          <h3>Betrieb &#038; Aufgabenmodell<\/h3>\n          <div class=\"grid cols3\">\n            <div class=\"note\">\n              <b>Daily<\/b><br>\n              \u2022 Homarr pr\u00fcfen<br>\n              \u2022 OpenWebUI testen<br>\n              \u2022 Portainer Status pr\u00fcfen<br>\n              \u2022 Remote-Zugriff validieren\n            <\/div>\n            <div class=\"note\">\n              <b>Weekly<\/b><br>\n              \u2022 Netdata extern sichten<br>\n              \u2022 Backup-Artefakte pr\u00fcfen<br>\n              \u2022 Container-\/Stack-Zust\u00e4nde pr\u00fcfen<br>\n              \u2022 Kachel- und Healthchecks validieren\n            <\/div>\n            <div class=\"note\">\n              <b>Change<\/b><br>\n              \u2022 Backup vor \u00c4nderung<br>\n              \u2022 Paralleltest<br>\n              \u2022 LAN + Tailscale validieren<br>\n              \u2022 Altzust\u00e4nde konsequent entfernen\n            <\/div>\n          <\/div>\n\n          <div class=\"hr\"><\/div>\n          <div class=\"ok\">\n            <b>Betriebsprinzip:<\/b> Das Projekt setzt auf kleine, kontrollierte \u00c4nderungen statt gro\u00dfer\n            Komplettumbauten. Jede produktive Verbesserung wurde parallel getestet, validiert und erst danach \u00fcbernommen.\n          <\/div>\n        <\/section>\n\n        <section id=\"troubleshooting\" class=\"card\">\n          <h3>Troubleshooting<\/h3>\n          <div class=\"grid cols2\">\n            <div>\n              <div class=\"note\"><b>Homarr<\/b><\/div>\n              <ul>\n                <li>500 Fehler durch ung\u00fcltigen <span class=\"kbd\">SECRET_ENCRYPTION_KEY<\/span><\/li>\n                <li>unhealthy Altzustand durch alte Struktur und Altvolumes<\/li>\n                <li>UI-Zittern im Edit Mode als Homarr-\/Browser-Bug erkannt<\/li>\n              <\/ul>\n            <\/div>\n            <div>\n              <div class=\"note\"><b>OpenWebUI \/ Zugriff<\/b><\/div>\n              <ul>\n                <li>Kachelproblem durch localhost\/iframe\/\u00d6ffnungsverhalten<\/li>\n                <li>Hostname-Zugriff als stabile L\u00f6sung implementiert<\/li>\n                <li>Frischer Datenzustand bewusst akzeptiert und dokumentiert<\/li>\n              <\/ul>\n            <\/div>\n          <\/div>\n\n          <div class=\"hr\"><\/div>\n          <div class=\"codewrap\">\n            <button class=\"copybtn\" data-copy=\"#tr1\"><span class=\"dot\"><\/span>Copy<\/button>\n            <pre id=\"tr1\">docker ps -a\ndocker logs --tail 100 homarr\ndocker logs --tail 100 openwebui\ncurl -I http:\/\/m4macmachine:7575\ncurl -I http:\/\/m4macmachine:3000\ncurl -k -I https:\/\/m4macmachine:9443\ntailscale status\ntailscale ip -4<\/pre>\n          <\/div>\n        <\/section>\n\n        <section id=\"backup\" class=\"card\">\n          <h3>Backup &#038; Recovery<\/h3>\n          <div class=\"grid-backup\">\n            <div>\n              <div class=\"note\"><b>Backup<\/b><\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#bk-p1\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"bk-p1\">mkdir -p ~\/docker-backup-final\n\ndocker run --rm -v frontend-stack_homarr-stack-v1_homarr_v1_appdata:\/source -v ~\/docker-backup-final:\/backup busybox tar czf \/backup\/homarr_final.tar.gz -C \/source .\n\ndocker run --rm -v frontend-stack_openwebui-stack-v1_openwebui_v1_data:\/source -v ~\/docker-backup-final:\/backup busybox tar czf \/backup\/openwebui_final.tar.gz -C \/source .\n\ndocker run --rm -v portainer_data:\/source -v ~\/docker-backup-final:\/backup busybox tar czf \/backup\/portainer_final.tar.gz -C \/source .<\/pre>\n              <\/div>\n            <\/div>\n            <div>\n              <div class=\"note\"><b>Recovery<\/b><\/div>\n              <div class=\"codewrap\">\n                <button class=\"copybtn\" data-copy=\"#bk-p2\"><span class=\"dot\"><\/span>Copy<\/button>\n                <pre id=\"bk-p2\">docker run --rm -v frontend-stack_homarr-stack-v1_homarr_v1_appdata:\/target -v ~\/docker-backup-final:\/backup busybox sh -c \"cd \/target && tar xzf \/backup\/homarr_final.tar.gz\"\n\ndocker run --rm -v frontend-stack_openwebui-stack-v1_openwebui_v1_data:\/target -v ~\/docker-backup-final:\/backup busybox sh -c \"cd \/target && tar xzf \/backup\/openwebui_final.tar.gz\"\n\ndocker restart homarr\ndocker restart openwebui<\/pre>\n              <\/div>\n              <div class=\"muted small\" style=\"margin-top:10px\">\n                Prinzip: Vor jedem gr\u00f6\u00dferen Ausbau einen sauberen Cut erzeugen und exakt diesen Zustand\n                als belastbaren Wiederherstellungspunkt dokumentieren.\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section id=\"appendix\" class=\"card\">\n          <h3>Anhang<\/h3>\n          <table>\n            <thead><tr><th>Element<\/th><th>Pfad \/ Zweck<\/th><\/tr><\/thead>\n            <tbody>\n              <tr><td>Finaler Stack<\/td><td><span class=\"kbd\">frontend-stack<\/span><\/td><\/tr>\n              <tr><td>Homarr Volume<\/td><td><span class=\"kbd\">frontend-stack_homarr-stack-v1_homarr_v1_appdata<\/span><\/td><\/tr>\n              <tr><td>OpenWebUI Volume<\/td><td><span class=\"kbd\">frontend-stack_openwebui-stack-v1_openwebui_v1_data<\/span><\/td><\/tr>\n              <tr><td>Portainer Volume<\/td><td><span class=\"kbd\">portainer_data<\/span><\/td><\/tr>\n              <tr><td>Homarr URL<\/td><td><span class=\"kbd\">http:\/\/m4macmachine:7575<\/span><\/td><\/tr>\n              <tr><td>OpenWebUI URL<\/td><td><span class=\"kbd\">http:\/\/m4macmachine:3000<\/span><\/td><\/tr>\n              <tr><td>Portainer URL<\/td><td><span class=\"kbd\">https:\/\/m4macmachine:9443<\/span><\/td><\/tr>\n              <tr><td>Tailscale IP<\/td><td><span class=\"kbd\">100.x.x.x<\/span><\/td><\/tr>\n              <tr><td>Backup-Pfad<\/td><td><span class=\"kbd\">~\/docker-backup-final<\/span><\/td><\/tr>\n              <tr><td>Monitoring-Erweiterung<\/td><td>Externe Netdata-Instanz<\/td><\/tr>\n            <\/tbody>\n          <\/table>\n\n          <div class=\"footer\">\n            <b>Autor:<\/b> MayIT \u2022 <b>Dokumenttyp:<\/b> Projektdokumentation \u2022 <b>System:<\/b> MayIT Docker KI &#038; Monitoring Platform\n          <\/div>\n        <\/section>\n\n        <div class=\"print-only\">Autor: MayIT \u2013 Projektdokumentation MayIT Docker KI &#038; Monitoring Platform<\/div>\n      <\/div>\n    <\/main>\n  <\/div>\n\n<script>\nfunction copyText(text){\n  if(navigator.clipboard && window.isSecureContext){\n    return navigator.clipboard.writeText(text);\n  }\n  return new Promise((resolve, reject)=>{\n    try{\n      const ta = document.createElement('textarea');\n      ta.value = text;\n      ta.style.position = 'fixed';\n      ta.style.left = '-9999px';\n      ta.style.top = '0';\n      document.body.appendChild(ta);\n      ta.focus();\n      ta.select();\n      const ok = document.execCommand('copy');\n      document.body.removeChild(ta);\n      ok ? resolve() : reject();\n    } catch(e){ reject(e); }\n  });\n}\ndocument.querySelectorAll('.copybtn').forEach(btn=>{\n  btn.addEventListener('click', async ()=>{\n    const sel = btn.getAttribute('data-copy');\n    const pre = document.querySelector(sel);\n    if(!pre) return;\n    const text = pre.innerText.replace(\/\\u00a0\/g,' ');\n    const old = btn.innerHTML;\n    try{\n      await copyText(text);\n      btn.innerHTML = '<span class=\"dot\" style=\"background: var(--accent2)\"><\/span>Copied';\n      setTimeout(()=>btn.innerHTML = old, 1100);\n    } catch(e){\n      btn.innerHTML = '<span class=\"dot\" style=\"background: var(--warn)\"><\/span>Copy failed';\n      setTimeout(()=>btn.innerHTML = old, 1400);\n    }\n  });\n});\n<\/script>\n\n<\/body>\n<\/html>","protected":false},"excerpt":{"rendered":"<p>Projektdokumentation \u2013 MayIT Docker KI &#038; Monitoring Platform M Projektdokumentation KI \u2022 Monitoring \u2022 Operations \u2022 Autor: MayIT Ziel: Vollst\u00e4ndige Dokumentation der MayIT Docker KI &#038; Monitoring Platform Navigation Scope &#038; Zielbild System- und Monitoring-Architektur Dashboards &#038; Zugriffe Betriebs- und Monitoring-Logik Dashboard-Kacheln Health-Scores &#038; Bewertungslogik Security Monitoring Alerts &#038; Eskalation Betrieb &#038; Aufgabenmodell Troubleshooting Backup [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"normal-width-container","site-content-style":"unboxed","site-sidebar-style":"unboxed","ast-global-header-display":"","ast-banner-title-visibility":"disabled","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-2725","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"trp-custom-language-flag":false},"uagb_author_info":{"display_name":"MIT","author_link":"https:\/\/www.mayit.eu\/en\/author\/markus_\/"},"uagb_comment_info":0,"uagb_excerpt":"Projektdokumentation \u2013 MayIT Docker KI &#038; Monitoring Platform M Projektdokumentation KI \u2022 Monitoring \u2022 Operations \u2022 Autor: MayIT Ziel: Vollst\u00e4ndige Dokumentation der MayIT Docker KI &#038; Monitoring Platform Navigation Scope &#038; Zielbild System- und Monitoring-Architektur Dashboards &#038; Zugriffe Betriebs- und Monitoring-Logik Dashboard-Kacheln Health-Scores &#038; Bewertungslogik Security Monitoring Alerts &#038; Eskalation Betrieb &#038; Aufgabenmodell Troubleshooting Backup&hellip;","_links":{"self":[{"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/pages\/2725","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/comments?post=2725"}],"version-history":[{"count":1,"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/pages\/2725\/revisions"}],"predecessor-version":[{"id":2726,"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/pages\/2725\/revisions\/2726"}],"wp:attachment":[{"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/media?parent=2725"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}