{"id":2708,"date":"2026-04-03T21:12:33","date_gmt":"2026-04-03T21:12:33","guid":{"rendered":"https:\/\/www.mayit.eu\/?page_id=2708"},"modified":"2026-04-04T19:16:32","modified_gmt":"2026-04-04T19:16:32","slug":"macm4","status":"publish","type":"page","link":"https:\/\/www.mayit.eu\/en\/macm4\/","title":{"rendered":"MacM4"},"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 Aufbau eines lokalen KI-Servers auf dem Mac Mini M4 (MayIT)<\/title>\n  <meta name=\"author\" content=\"MayIT\" \/>\n  <meta name=\"description\" content=\"Projektdokumentation \u2013 Aufbau eines lokalen KI-Servers auf dem Mac Mini M4 (MayIT)\" \/>\n  <style>\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}\n    html{scroll-behavior:smooth}\n    body{\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      overflow-x:hidden;\n    }\n    a{color:var(--accent); text-decoration:none}\n    a:hover{text-decoration:underline}\n    .layout{display:flex; min-height:100vh; min-width:0}\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      max-width:100%;\n      flex-wrap:wrap;\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      overflow-wrap:anywhere;\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; min-width:0; padding:28px 26px 80px}\n    .container{max-width:1120px; width:100%; min-width:0; 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      min-width:0;\n    }\n    .hero h1{font-size:28px; margin:0 0 8px; overflow-wrap:anywhere}\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    }\n    section{margin-top:18px; min-width:0}\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      min-width:0;\n      overflow:hidden;\n    }\n    .card h3{margin:0 0 10px; font-size:18px; overflow-wrap:anywhere}\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      min-width:0;\n      overflow-wrap:anywhere;\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; min-width:0}\n    .grid > *{min-width:0}\n    @media (min-width: 980px){\n      .grid.cols2{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}\n      .grid.cols3{grid-template-columns:minmax(0,1fr) minmax(0,1fr) minmax(0,1fr)}\n    }\n    .tablewrap{max-width:100%; overflow:auto; border-radius:14px}\n    table{width:100%; border-collapse:separate; border-spacing:0; border-radius:14px; border:1px solid var(--border); min-width:0}\n    th, td{padding:10px; border-bottom:1px solid var(--border); vertical-align:top; overflow-wrap:anywhere}\n    th{background:rgba(17,24,39,.55); text-align:left; font-size:12px; text-transform:uppercase; letter-spacing:.08em; color:var(--muted)}\n    tr:last-child td{border-bottom:none}\n    .codewrap{position:relative; margin-top:10px; max-width:100%; min-width:0}\n    pre{\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      max-width:100%;\n      white-space:pre-wrap;\n      word-break:break-word;\n      overflow-wrap:anywhere;\n    }\n    code{font-family:var(--mono); overflow-wrap:anywhere}\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      z-index:2;\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    .step{display:flex; gap:10px; align-items:flex-start; min-width: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    .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; flex-wrap:wrap}\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)}\n    details{\n      border:1px solid var(--border); border-radius:14px; padding:10px 12px; background:rgba(15,23,42,.25)\n    }\n    summary{cursor:pointer; color:var(--text); font-weight:700}\n    details p, details ul{color:var(--muted)}\n    ul, ol{padding-left:20px}\n    li{margin:6px 0}\n    .print-only{display:none}\n    @media (max-width: 1100px){\n      .layout{display:block}\n      .toc{position:relative; width:100%; min-width:0; height:auto; border-right:none; border-bottom:1px solid var(--border)}\n      .main{padding:18px}\n      .container{max-width:100%}\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<\/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\">Projekt \u2022 Architektur \u2022 Security \u2022 Betrieb \u2022 Autor: <b>MayIT<\/b><\/div>\n        <\/div>\n      <\/div>\n      <div class=\"pill\"><b>Ziel:<\/b> Vollst\u00e4ndige Projektdokumentation des Mac-Mini-M4-KI-Server-Aufbaus<\/div>\n      <h2>Navigation<\/h2>\n      <ul><li><a href=\"#scope\">Projekt\u00fcberblick<\/a><\/li>\n<li><a href=\"#initial\">Ausgangssituation<\/a><\/li>\n<li><a href=\"#goals\">Projektziele<\/a><\/li>\n<li><a href=\"#planning\">Planung &#038; Konzeption<\/a><\/li>\n<li><a href=\"#components\">Hardware, Softwarebasis und Inference<\/a><\/li>\n<li><a href=\"#implementation\">Implementierung<\/a><\/li>\n<li><a href=\"#architecture\">Zielarchitektur<\/a><\/li>\n<li><a href=\"#security\">Security-Konzept<\/a><\/li>\n<li><a href=\"#operations\">Betriebskonzept<\/a><\/li>\n<li><a href=\"#models\">Modellportfolio<\/a><\/li>\n<li><a href=\"#troubleshooting\">Troubleshooting<\/a><\/li>\n<li><a href=\"#backup\">Wiederanlauf &#038; Recovery<\/a><\/li>\n<li><a href=\"#appendix\">Anhang<\/a><\/li><\/ul>\n      <h2>Quick Links<\/h2>\n      <ul><li><a href=\"#doc1\">Implementierungsblock<\/a><\/li>\n<li><a href=\"#doc2\">Zielarchitektur<\/a><\/li>\n<li><a href=\"#doc4\">Recovery-Befehl<\/a><\/li><\/ul>\n      <div class=\"footer small\">\n        <div><b>Stand:<\/b> 2026-04-03<\/div>\n        <div class=\"hr\"><\/div>\n        <div>Dokument: HTML \u2022 Dark Enterprise Style \u2022 MayIT<\/div>\n      <\/div>\n    <\/aside>\n    <main class=\"main\">\n      <div class=\"container\">\n        <div class=\"hero\">\n          <h1>Mac Mini M4 KI-Server \u2013 Projektdokumentation<\/h1>\n          <div class=\"muted\">Diese Projektdokumentation beschreibt die Konzeption, Planung, technische Umsetzung und betriebliche Einordnung eines lokal betriebenen KI-Servers auf einem Mac Mini M4. Die L\u00f6sung verbindet Apple-Silicon-Performance mit einer wartbaren Architektur aus nativer Inferenz, containerisierten Erg\u00e4nzungsdiensten und einem sicherheitsorientierten Zugriffskonzept.<\/div>\n          <div class=\"meta\"><span class=\"tag\">Autor: MayIT<\/span>\n<span class=\"tag\">On-Premises KI<\/span>\n<span class=\"tag\">Apple Silicon<\/span>\n<span class=\"tag\">Ollama + Open WebUI<\/span>\n<span class=\"tag\">Colima \/ Docker<\/span>\n<span class=\"tag\">Security-orientiert<\/span><\/div>\n        <\/div>\n        \n<section id=\"scope\" class=\"card\">\n  <h3>Projekt\u00fcberblick<\/h3>\n  <div class=\"grid cols2\">\n    <div>\n      <div class=\"note\"><b>Projektziel:<\/b> Aufbau eines lokal betriebenen KI-Servers auf Basis eines Mac Mini M4, um Sprachmodelle datenschutzfreundlich, performant und dauerhaft verf\u00fcgbar lokal auszuf\u00fchren.<\/div>\n      <div class=\"hr\"><\/div>\n      <ul>\n        <li>Bereitstellung einer stabilen KI-Infrastruktur f\u00fcr lokale Nutzung.<\/li>\n        <li>Webbasierter Zugriff \u00fcber Open WebUI statt reiner Terminal-Interaktion.<\/li>\n        <li>Saubere Trennung zwischen Inference-Layer und containerisierter Service-Ebene.<\/li>\n        <li>Sicherer Fernzugriff ohne offene Router-Ports.<\/li>\n      <\/ul>\n    <\/div>\n    <div>\n      <div class=\"ok\"><b>Nutzen:<\/b> H\u00f6here Datenhoheit, geringere Abh\u00e4ngigkeit von Cloud-Diensten, experimentelle Erweiterbarkeit und ein nachvollziehbarer technischer Unterbau f\u00fcr den eigenen KI-Betrieb.<\/div>\n      <div class=\"hr\"><\/div>\n      <div class=\"warn\"><b>Projektcharakter:<\/b> Die L\u00f6sung ist bewusst pragmatisch, leistungsf\u00e4hig und administrierbar ausgelegt. Sie ist kein hochskalierendes Rechenzentrum, sondern eine professionelle On-Premises-KI-Plattform im kompakten Formfaktor.<\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"initial\" class=\"card\">\n  <h3>Ausgangssituation<\/h3>\n  <div class=\"grid cols2\">\n    <div>\n      <p>Ausgangsbasis war der Wunsch, einen Mac Mini M4 in einen lokalen KI-Server zu \u00fcberf\u00fchren, der rund um die Uhr betrieben werden kann und zugleich ohne tiefe Vorkenntnisse administrierbar bleibt. Die Anleitung beschreibt den Aufbau mit Terminalbefehlen, die Installation eines lokalen Modellservers und die Erg\u00e4nzung durch eine containerisierte Weboberfl\u00e4che.<\/p>\n      <div class=\"hr\"><\/div>\n      <p>Im Fokus stand dabei nicht nur die reine technische Funktionsf\u00e4higkeit, sondern vor allem ein Setup, das im Alltag stabil l\u00e4uft, sich aus der Ferne sicher bedienen l\u00e4sst und bei Bedarf schrittweise erweitert werden kann.<\/p>\n    <\/div>\n    <div>\n      <div class=\"tablewrap\">\n        <table>\n          <thead><tr><th>Ausgangspunkt<\/th><th>Bewertung<\/th><\/tr><\/thead>\n          <tbody>\n            <tr><td>Hardware<\/td><td>Mac Mini M4 mit Apple Silicon<\/td><\/tr>\n            <tr><td>Einsatzszenario<\/td><td>Lokale KI-Nutzung und Fernzugriff<\/td><\/tr>\n            <tr><td>Betriebsmodell<\/td><td>24\/7-Dauerbetrieb<\/td><\/tr>\n            <tr><td>Rahmenbedingung<\/td><td>M\u00f6glichst einfaches, aber professionell nutzbares Setup<\/td><\/tr>\n          <\/tbody>\n        <\/table>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"goals\" class=\"card\">\n  <h3>Projektziele<\/h3>\n  <div class=\"grid cols3\">\n    <div class=\"note\">\n      <b>Funktionale Ziele<\/b>\n      <ul>\n        <li>Lokales Hosting von Sprachmodellen<\/li>\n        <li>Browserbasierte Chat-Oberfl\u00e4che<\/li>\n        <li>Headless-Betrieb per SSH<\/li>\n        <li>Optionale Service-Erweiterung<\/li>\n      <\/ul>\n    <\/div>\n    <div class=\"note\">\n      <b>Betriebliche Ziele<\/b>\n      <ul>\n        <li>Stabiler Dauerbetrieb<\/li>\n        <li>Automatischer Start zentraler Dienste<\/li>\n        <li>Klare Port- und Rollenverteilung<\/li>\n        <li>Wiederanlauf nach Stromausfall<\/li>\n      <\/ul>\n    <\/div>\n    <div class=\"note\">\n      <b>Sicherheitsziele<\/b>\n      <ul>\n        <li>Kein offenes Portforwarding<\/li>\n        <li>VPN-basierter externer Zugriff<\/li>\n        <li>Minimierte Freigaben<\/li>\n        <li>Kontrollierte Erweiterbarkeit<\/li>\n      <\/ul>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"planning\" class=\"card\">\n  <h3>Planung &#038; Konzeption<\/h3>\n  <div class=\"grid cols2\">\n    <div>\n      <div class=\"note\"><b>Architekturentscheidung:<\/b> Der Inference-Layer sollte nativ auf macOS laufen, weil Ollama dort direkt auf den Unified Memory und die Metal-Beschleunigung der Apple-GPU zugreifen kann.<\/div>\n      <div class=\"hr\"><\/div>\n      <p>Container sollten nur f\u00fcr erg\u00e4nzende Dienste verwendet werden. Dadurch entsteht eine saubere Aufgabenteilung: hohe Modell-Performance auf dem Host, reproduzierbare Utility-Services in einer isolierten Colima-Umgebung.<\/p>\n      <div class=\"hr\"><\/div>\n      <p>Gleichzeitig wurde die Bedienbarkeit stark ber\u00fccksichtigt. Statt nur einer CLI-L\u00f6sung wurde Open WebUI als zentrale Benutzeroberfl\u00e4che eingeplant. So kann das System alltagsnah genutzt werden, ohne auf die Flexibilit\u00e4t der Shell verzichten zu m\u00fcssen.<\/p>\n    <\/div>\n    <div>\n      <div class=\"tablewrap\">\n        <table>\n          <thead><tr><th>Entscheidung<\/th><th>Begr\u00fcndung<\/th><\/tr><\/thead>\n          <tbody>\n            <tr><td>Ollama nativ<\/td><td>Maximale Performance und direkter Hardwarezugriff<\/td><\/tr>\n            <tr><td>Docker via Colima<\/td><td>Saubere Isolation f\u00fcr Zusatzdienste auf Apple Silicon<\/td><\/tr>\n            <tr><td>Open WebUI<\/td><td>Nutzbare Chat-Oberfl\u00e4che mit Administrationskomfort<\/td><\/tr>\n            <tr><td>Tailscale statt Portforwarding<\/td><td>Deutlich sichererer externer Zugriff<\/td><\/tr>\n          <\/tbody>\n        <\/table>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"components\" class=\"card\">\n  <h3>Hardware, Softwarebasis und Inference<\/h3>\n  <div class=\"grid cols2\">\n    <div>\n      <div class=\"note\"><b>Hardwarebasis<\/b><\/div>\n      <ul>\n        <li>Mac Mini M4 als Plattform mit Apple Silicon.<\/li>\n        <li>Unified Memory als kritischer Faktor f\u00fcr lokale Modellgr\u00f6\u00dfen.<\/li>\n        <li>Metal-Beschleunigung als wesentlicher Performance-Vorteil.<\/li>\n      <\/ul>\n      <div class=\"hr\"><\/div>\n      <div class=\"note\"><b>Softwarebasis<\/b><\/div>\n      <ul>\n        <li>macOS als Host-Betriebssystem<\/li>\n        <li>Homebrew als Paketmanager<\/li>\n        <li>Ollama als lokaler Modellserver<\/li>\n        <li>Colima als Docker-Laufzeitumgebung<\/li>\n      <\/ul>\n    <\/div>\n    <div>\n      <div class=\"tablewrap\">\n        <table>\n          <thead><tr><th>Komponente<\/th><th>Rolle<\/th><th>Projektbedeutung<\/th><\/tr><\/thead>\n          <tbody>\n            <tr><td>Mac Mini M4<\/td><td>Hardwareplattform<\/td><td>Leistungsf\u00e4hige und energieeffiziente Edge-Compute-Basis<\/td><\/tr>\n            <tr><td>Homebrew<\/td><td>Paketverwaltung<\/td><td>Reproduzierbare Installation der Kernkomponenten<\/td><\/tr>\n            <tr><td>Ollama<\/td><td>Inference-Layer<\/td><td>Lokale Modellbereitstellung und API-Endpunkt<\/td><\/tr>\n            <tr><td>Colima<\/td><td>Container-VM<\/td><td>Linux-basierte Laufzeit f\u00fcr Docker-Dienste<\/td><\/tr>\n            <tr><td>Docker<\/td><td>Containerbetrieb<\/td><td>Standardisierte Bereitstellung der Zusatzdienste<\/td><\/tr>\n          <\/tbody>\n        <\/table>\n      <\/div>\n      <div class=\"hr\"><\/div>\n      <div class=\"warn\"><b>Kapazit\u00e4tsbewertung:<\/b> Kleine und mittlere Modelle sind im beschriebenen Umfeld praktikabel. Sehr gro\u00dfe 70B-Modelle sind f\u00fcr diese Plattform in der beschriebenen Konfiguration nicht zielf\u00fchrend.<\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"implementation\" class=\"card\">\n  <h3>Implementierung<\/h3>\n  <div class=\"grid cols2\">\n    <div>\n      <div class=\"badge\"><span class=\"b\"><\/span><b>Umsetzungspfad:<\/b> Remote-Zugriff \u2192 Homebrew \u2192 Ollama \u2192 Colima \u2192 Open WebUI \u2192 Erweiterungen<\/div>\n      <div class=\"hr\"><\/div>\n      <ol>\n        <li>Aktivierung von SSH und optionaler Bildschirmfreigabe f\u00fcr den headless Betrieb.<\/li>\n        <li>Anpassung der Energieeinstellungen f\u00fcr einen unterbrechungsarmen Dauerbetrieb.<\/li>\n        <li>Installation von Homebrew als Grundlage f\u00fcr sp\u00e4tere Komponenten.<\/li>\n        <li>Bereitstellung von Ollama als nativem Host-Dienst.<\/li>\n        <li>Installation von Colima, Docker und docker-compose.<\/li>\n        <li>Deployment von Open WebUI und Anbindung an den Host-Endpunkt von Ollama.<\/li>\n        <li>Optionaler Ausbau um Portainer, Homarr und FileBrowser.<\/li>\n      <\/ol>\n    <\/div>\n    <div>\n      <div class=\"codewrap\">\n        <button class=\"copybtn\" data-copy=\"#doc1\"><span class=\"dot\"><\/span>Copy<\/button>\n        <pre id=\"doc1\">brew install ollama\nbrew services start ollama\n\nbrew install colima docker docker-compose\ncolima start --memory 4 --disk 100 --cpu 4\n\ndocker run -d \\\n  --name openwebui \\\n  -p 3000:8080 \\\n  -v openwebui:\/app\/backend\/data \\\n  --restart always \\\n  ghcr.io\/open-webui\/open-webui:main<\/pre>\n      <\/div>\n      <div class=\"muted small\" style=\"margin-top:10px\">Die Kopplung zwischen Container und Host erfolgt \u00fcber <span class=\"kbd\">host.docker.internal:11434<\/span>.<\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"architecture\" class=\"card\">\n  <h3>Zielarchitektur<\/h3>\n  <div class=\"grid cols2\">\n    <div>\n      <div class=\"codewrap\">\n        <button class=\"copybtn\" data-copy=\"#doc2\"><span class=\"dot\"><\/span>Copy<\/button>\n        <pre id=\"doc2\">Client \/ Browser\n   \u2502\n   \u2514\u2500 Open WebUI (Docker \/ Colima, Port 3000)\n          \u2502\n          \u2514\u2500 host.docker.internal:11434\n                 \u2502\n                 \u2514\u2500 Ollama (nativ auf macOS)\n                        \u2502\n                        \u2514\u2500 Lokale Modelle \/ Metal GPU \/ Unified Memory<\/pre>\n      <\/div>\n    <\/div>\n    <div>\n      <div class=\"note\"><b>Architekturwirkung:<\/b> Die Webschicht ist sauber von der Inferenzschicht getrennt. Dadurch lassen sich Bedienoberfl\u00e4che, zus\u00e4tzliche Tools und Recovery-Ma\u00dfnahmen unabh\u00e4ngig vom eigentlichen Modellserver betrachten.<\/div>\n      <div class=\"hr\"><\/div>\n      <div class=\"tablewrap\">\n        <table>\n          <thead><tr><th>Schicht<\/th><th>Betriebsort<\/th><th>Bewertung<\/th><\/tr><\/thead>\n          <tbody>\n            <tr><td>Inference<\/td><td>macOS Host<\/td><td>Performant und hardware-nah<\/td><\/tr>\n            <tr><td>Web UI<\/td><td>Docker \/ Colima<\/td><td>Flexibel und reproduzierbar<\/td><\/tr>\n            <tr><td>Optionale Tools<\/td><td>Docker \/ Colima<\/td><td>Modular zuschaltbar<\/td><\/tr>\n            <tr><td>Remote Access<\/td><td>LAN \/ VPN<\/td><td>Sicher ohne Router-Portfreigaben<\/td><\/tr>\n          <\/tbody>\n        <\/table>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"security\" class=\"card\">\n  <h3>Security-Konzept<\/h3>\n  <div class=\"grid cols2\">\n    <div>\n      <div class=\"note\"><b>Kernprinzip:<\/b> Der Mac Mini wird nicht direkt als \u00f6ffentlich erreichbarer Internetdienst verstanden, sondern als kontrolliert erreichbare interne Plattform.<\/div>\n      <div class=\"hr\"><\/div>\n      <ul>\n        <li>SSH ausschlie\u00dflich intern oder per VPN nutzen.<\/li>\n        <li>Management-Dienste wie Portainer oder FileBrowser nicht offen ver\u00f6ffentlichen.<\/li>\n        <li>Starke, einzigartige Zugangsdaten f\u00fcr alle Webdienste setzen.<\/li>\n        <li>Nur explizit ben\u00f6tigte Ordner in Container hineinmounten.<\/li>\n      <\/ul>\n    <\/div>\n    <div>\n      <div class=\"danger\"><b>Risikofaktor:<\/b> Sobald Ports wie 22, 3000, 8080 oder 9443 am Router freigegeben werden, entsteht eine unn\u00f6tig gro\u00dfe Angriffsfl\u00e4che. Die in der Anleitung empfohlene VPN-Strategie ist deshalb ein wesentlicher Sicherheitsbaustein des Gesamtdesigns.<\/div>\n      <div class=\"hr\"><\/div>\n      <div class=\"tablewrap\">\n        <table>\n          <thead><tr><th>Aspekt<\/th><th>Projektentscheidung<\/th><\/tr><\/thead>\n          <tbody>\n            <tr><td>Externer Zugriff<\/td><td>Tailscale \/ VPN<\/td><\/tr>\n            <tr><td>SSH<\/td><td>Kein offenes Portforwarding<\/td><\/tr>\n            <tr><td>Dateifreigabe<\/td><td>Nur dedizierte Host-Verzeichnisse freigeben<\/td><\/tr>\n            <tr><td>Container<\/td><td>Nur notwendige Zusatzdienste aktivieren<\/td><\/tr>\n          <\/tbody>\n        <\/table>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"operations\" class=\"card\">\n  <h3>Betriebskonzept<\/h3>\n  <div class=\"grid cols3\">\n    <div class=\"note\">\n      <b>Daily Operations<\/b>\n      <ul>\n        <li>Erreichbarkeit von Ollama und Open WebUI pr\u00fcfen<\/li>\n        <li>Verf\u00fcgbare Modelle und Speicherverbrauch beobachten<\/li>\n        <li>Docker-Containerstatus kontrollieren<\/li>\n      <\/ul>\n    <\/div>\n    <div class=\"note\">\n      <b>Change Management<\/b>\n      <ul>\n        <li>Neue Container zuerst einzeln testen<\/li>\n        <li>Ports und Volumes dokumentieren<\/li>\n        <li>\u00c4nderungen schrittweise umsetzen<\/li>\n      <\/ul>\n    <\/div>\n    <div class=\"note\">\n      <b>Lifecycle<\/b>\n      <ul>\n        <li>macOS aktuell halten<\/li>\n        <li>Homebrew-Pakete kontrolliert aktualisieren<\/li>\n        <li>Docker-Images regelm\u00e4\u00dfig erneuern<\/li>\n      <\/ul>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"models\" class=\"card\">\n  <h3>Modellportfolio und technische Grenzen<\/h3>\n  <div class=\"grid cols2\">\n    <div>\n      <div class=\"ok\"><b>Geeignete Startmodelle:<\/b> Llama 3.1, Qwen 2.5 7B und Phi 3.5 stellen einen praxisnahen Einstieg dar. Sie liefern auf Apple Silicon einen sinnvollen Kompromiss aus Antwortqualit\u00e4t, Geschwindigkeit und Ressourcenbedarf.<\/div>\n      <div class=\"hr\"><\/div>\n      <p>Die Projektumsetzung zeigt deutlich, dass nicht nur die CPU, sondern vor allem der Unified-Memory-Rahmen und die GPU-Anbindung die Betriebsgrenzen bestimmen. Daraus folgt eine realistische Modellstrategie statt eines \u00fcberzogenen Gr\u00f6\u00dfenfokus.<\/p>\n    <\/div>\n    <div>\n      <div class=\"warn\"><b>Grenze der Plattform:<\/b> Sehr gro\u00dfe 70B-Modelle sind im beschriebenen Setup nicht wirtschaftlich oder stabil betreibbar. Die Architektur ist daher bewusst auf die tats\u00e4chlich sinnvolle Modellklasse ausgelegt und nicht auf Maximalwerte.<\/div>\n      <div class=\"hr\"><\/div>\n      <div class=\"tablewrap\">\n        <table>\n          <thead><tr><th>Modellklasse<\/th><th>Einsch\u00e4tzung<\/th><\/tr><\/thead>\n          <tbody>\n            <tr><td>3B bis 8B<\/td><td>Sehr gut geeignet<\/td><\/tr>\n            <tr><td>Mittlere Modelle<\/td><td>Je nach Speicherbudget brauchbar<\/td><\/tr>\n            <tr><td>70B<\/td><td>Nicht Ziel dieser Plattform<\/td><\/tr>\n          <\/tbody>\n        <\/table>\n      <\/div>\n    <\/div>\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>Typischer Fehlerfall 1:<\/b> Colima startet nicht<\/div>\n      <div class=\"codewrap\">\n        <button class=\"copybtn\" data-copy=\"#doc3\"><span class=\"dot\"><\/span>Copy<\/button>\n        <pre id=\"doc3\">pkill -9 colima\npkill -9 limactl\ncolima delete\ncolima start --memory 4 --disk 100 --cpu 4<\/pre>\n      <\/div>\n    <\/div>\n    <div>\n      <div class=\"note\"><b>Typischer Fehlerfall 2:<\/b> Open WebUI erreicht Ollama nicht<\/div>\n      <ul>\n        <li>Connection URL in Open WebUI pr\u00fcfen.<\/li>\n        <li>Host-Endpunkt <span class=\"kbd\">localhost:11434<\/span> lokal testen.<\/li>\n        <li>Docker-Containerstatus und Colima-Status kontrollieren.<\/li>\n      <\/ul>\n    <\/div>\n  <\/div>\n  <div class=\"hr\"><\/div>\n  <div class=\"grid cols2\">\n    <div>\n      <div class=\"note\"><b>Typischer Fehlerfall 3:<\/b> System schl\u00e4ft ein oder sperrt sich<\/div>\n      <p>In diesem Fall m\u00fcssen die Energieoptionen mit <span class=\"kbd\">pmset<\/span> und gegebenenfalls zus\u00e4tzliche Screensaver-Einstellungen angepasst werden, damit der Serverbetrieb nicht unterbrochen wird.<\/p>\n    <\/div>\n    <div>\n      <div class=\"note\"><b>Typischer Fehlerfall 4:<\/b> \u00dcberdimensioniertes Modell<\/div>\n      <p>Wenn ein zu gro\u00dfes Modell geladen wird, steigt das Risiko f\u00fcr starke Performance-Einbr\u00fcche oder Instabilit\u00e4t. Die Projektpraxis best\u00e4tigt daher die Notwendigkeit einer konservativen Modellwahl.<\/p>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"backup\" class=\"card\">\n  <h3>Betriebsstabilit\u00e4t, Wiederanlauf und Recovery<\/h3>\n  <div class=\"grid cols2\">\n    <div>\n      <div class=\"note\"><b>Wiederanlaufstrategie:<\/b> Ollama startet als Homebrew-Service automatisch. Die Containerdienste k\u00f6nnen gesammelt \u00fcber einen Shell-Alias oder einen dokumentierten Startablauf reaktiviert werden.<\/div>\n      <div class=\"codewrap\">\n        <button class=\"copybtn\" data-copy=\"#doc4\"><span class=\"dot\"><\/span>Copy<\/button>\n        <pre id=\"doc4\">echo 'alias start-server=\"colima start --memory 4 --disk 100 --cpu 4 && sleep 30 && docker start openwebui filebrowser portainer homarr && echo \\\"\u2705 Alle Services gestartet!\\\"\"' >> ~\/.zshrc\nsource ~\/.zshrc<\/pre>\n      <\/div>\n    <\/div>\n    <div>\n      <div class=\"ok\"><b>Recovery-Bewertung:<\/b> Die Plattform ist f\u00fcr einen pragmatischen lokalen Betrieb gut wiederherstellbar, da Host-Dienst, Container-Layer und Weboberfl\u00e4che klar separiert sind. Diese Trennung erleichtert Fehleranalyse, Neuaufbau und Erweiterung.<\/div>\n      <div class=\"hr\"><\/div>\n      <p>F\u00fcr einen noch professionelleren Betrieb w\u00e4ren erg\u00e4nzend Konfigurationsbackups, Versionsdokumentation und ein definierter Update-Rollback-Prozess sinnvoll.<\/p>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"appendix\" class=\"card\">\n  <h3>Anhang<\/h3>\n  <div class=\"tablewrap\">\n    <table>\n      <thead><tr><th>Element<\/th><th>Wert \/ Bedeutung<\/th><\/tr><\/thead>\n      <tbody>\n        <tr><td>Ollama<\/td><td>Lokaler Modellserver auf Port 11434<\/td><\/tr>\n        <tr><td>Open WebUI<\/td><td>Webfrontend auf Port 3000<\/td><\/tr>\n        <tr><td>Portainer<\/td><td>Optionale Docker-Verwaltung auf Port 9443<\/td><\/tr>\n        <tr><td>Homarr<\/td><td>Optionales Dashboard auf Port 7575<\/td><\/tr>\n        <tr><td>FileBrowser<\/td><td>Optionale Dateiverwaltung auf Port 8080<\/td><\/tr>\n        <tr><td>Tailscale<\/td><td>VPN-basierter externer Zugriff<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n<\/section>\n\n      <\/div>\n    <\/main>\n  <\/div>\n  \n<script>\ndocument.addEventListener('click', async (e) => {\n  const btn = e.target.closest('.copybtn');\n  if(!btn) return;\n  const target = document.querySelector(btn.dataset.copy);\n  if(!target) return;\n  const text = target.innerText;\n  const original = btn.innerHTML;\n  try{\n    await navigator.clipboard.writeText(text);\n    btn.innerHTML = '<span class=\"dot\"><\/span>Kopiert';\n  }catch(err){\n    const ta = document.createElement('textarea');\n    ta.value = text;\n    document.body.appendChild(ta);\n    ta.select();\n    document.execCommand('copy');\n    ta.remove();\n    btn.innerHTML = '<span class=\"dot\"><\/span>Kopiert';\n  }\n  setTimeout(() => btn.innerHTML = original, 1600);\n});\n<\/script>\n\n<\/body>\n<\/html>","protected":false},"excerpt":{"rendered":"<p>Projektdokumentation \u2013 Aufbau eines lokalen KI-Servers auf dem Mac Mini M4 (MayIT) M Projektdokumentation Projekt \u2022 Architektur \u2022 Security \u2022 Betrieb \u2022 Autor: MayIT Ziel: Vollst\u00e4ndige Projektdokumentation des Mac-Mini-M4-KI-Server-Aufbaus Navigation Projekt\u00fcberblick Ausgangssituation Projektziele Planung &#038; Konzeption Hardware, Softwarebasis und Inference Implementierung Zielarchitektur Security-Konzept Betriebskonzept Modellportfolio Troubleshooting Wiederanlauf &#038; Recovery Anhang Quick Links Implementierungsblock Zielarchitektur Recovery-Befehl [&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-2708","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 Aufbau eines lokalen KI-Servers auf dem Mac Mini M4 (MayIT) M Projektdokumentation Projekt \u2022 Architektur \u2022 Security \u2022 Betrieb \u2022 Autor: MayIT Ziel: Vollst\u00e4ndige Projektdokumentation des Mac-Mini-M4-KI-Server-Aufbaus Navigation Projekt\u00fcberblick Ausgangssituation Projektziele Planung &#038; Konzeption Hardware, Softwarebasis und Inference Implementierung Zielarchitektur Security-Konzept Betriebskonzept Modellportfolio Troubleshooting Wiederanlauf &#038; Recovery Anhang Quick Links Implementierungsblock Zielarchitektur Recovery-Befehl&hellip;","_links":{"self":[{"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/pages\/2708","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=2708"}],"version-history":[{"count":2,"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/pages\/2708\/revisions"}],"predecessor-version":[{"id":2714,"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/pages\/2708\/revisions\/2714"}],"wp:attachment":[{"href":"https:\/\/www.mayit.eu\/en\/wp-json\/wp\/v2\/media?parent=2708"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}