- Shell 100%
- Neue Funktion merge_zshrc(): lädt lokale .zshrc auf Remote-Tmp, prüft pro Zeile via 'grep -qxF' ob sie exakt bereits vorhanden ist, und ergänzt nur fehlende Zeilen an die remote .zshrc. - Falls remote .zshrc nicht existiert, wird sie komplett neu angelegt. - Vor dem Merge wird ein Backup der remote .zshrc unter $REMOTE_HOME/backups/ angelegt (Schema TIMESTAMP_.zshrc). - Idempotent: IFS= read -r erhält Einrückung/exakten Zeileninhalt, so dass erneutes Deployen keine Duplikate erzeugt. - .zshrc wird nicht mehr über den normalen Datei-Pfad deployt, sondern als Spezialfall gemerged. - README: Merge-Logik dokumentiert. |
||
|---|---|---|
| bin | ||
| Library/LaunchDaemons | ||
| .gitignore | ||
| .zshrc | ||
| deploy.sh | ||
| deploy_parameter.txt | ||
| README.md | ||
Mac Studio Server
Lokaler AI-Inferenzserver auf macOS. Startet und verwaltet zwei LLM-Backend-Services als LaunchDaemons:
- LM Studio (API-Port 1234) — OpenAI-kompatible Server-API
- Ollama (API-Port 11434) — Ollama-native API
Architektur
┌───────────────────────────────────────────────┐
│ Mac Studio Server │
│ │
│ LaunchDaemon │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ LM Studio │ │ Ollama │ │
│ │ :1234 │ │ :11434 │ │
│ │ OpenAI-kompat. │ │ Ollama-native │ │
│ └────────┬─────────┘ └────────┬─────────┘ │
│ │ │ │
│ ┌────────┴─────────────────────┴──────────┐ │
│ │ Verwaltungsskripte │ │
│ │ │ │
│ │ lmstudiostart/stop/status │ │
│ │ ollamastart/stop/status │ │
│ └─────────────────────────────────────────┘ │
└───────────────────────────────────────────────┘
Dateien
LaunchDaemons
| Datei | Funktion |
|---|---|
Library/LaunchDaemons/com.pp.lmstudio.plist |
Startet LM Studio Server beim Systemstart |
Library/LaunchDaemons/com.pp.ollama.plist |
Startet Ollama Server beim Systemstart (automatisch neu) |
Verwaltungsskripte (bin/)
| Skript | LM Studio | Ollama | Beschreibung |
|---|---|---|---|
lmstudiostart / ollamastart |
✅ | ✅ | Startet den Service + lädt konfigurierte Models |
lmstudiostop / ollamastop |
✅ | ✅ | Stoppt den Service sauber |
lmstudiostatus / ollamastatus |
✅ | ✅ | Zeigt Service-Status, laufende Ports, geladene Models |
Konfiguration
| Datei | Beschreibung |
|---|---|
.zshrc |
Aliases für schnelle Steuerung der Services |
Quickstart
LM Studio
# Service starten
lmstudiostart
# Status prüfen
lmstudiostatus
# Service stoppen
lmstudiostop
Ollama
# Service starten
ollamastart
# Status prüfen
ollamastatus
# Service stoppen
ollamastop
Aliases (in .zshrc)
LM Studio
| Alias | Befehl |
|---|---|
lmstart |
sudo launchctl kickstart -k system/com.pp.lmstudiostart |
lmboot |
sudo launchctl bootstrap system /Library/LaunchDaemons/com.pp.lmstudio.plist |
lmstop |
/Users/pp/bin/lmstudiostop |
lmstatus |
/Users/pp/bin/lmstudiostatus |
lmlogout |
tail -f /var/log/lmstudio/stdout.log |
lmlogerr |
tail -f /var/log/lmstudio/stderr.log |
Ollama
| Alias | Befehl |
|---|---|
olstart |
sudo launchctl kickstart -k system/com.pp.ollama |
olboot |
sudo launchctl bootstrap system /Library/LaunchDaemons/com.pp.ollama.plist |
olstop |
ollamastop |
olstatus |
ollamastatus |
ollogout |
tail -f /var/log/ollama/stdout.log |
ollogerr |
tail -f /var/log/ollama/stderr.log |
API-Zugriff
LM Studio
# Lokal
curl http://127.0.0.1:1234/v1/models
# Über LAN
curl http://192.168.16.45:1234/v1/models
Ollama
# Lokal
curl http://127.0.0.1:11434/api/tags
# Über LAN
curl http://192.168.16.45:11434/api/tags
Konfigurierte Models
LM Studio lädt folgende Models automatisch beim Start:
google/gemma-4-26b-a4bopenai/gpt-oss-120bqwen/qwen3.6-35b-a3btext-embedding-bge-m3text-embedding-slide-bge-reranker-v2-m3
Installationshinweise
LaunchDaemons aktivieren
sudo launchctl bootstrap system /Library/LaunchDaemons/com.pp.lmstudio.plist
sudo launchctl bootstrap system /Library/LaunchDaemons/com.pp.ollama.plist
Deploy-Skript
Dateien werden nach Pfad-Mapping auf das Zielsystem kopiert:
| Datei im Repo | Zielpfad auf Zielsystem |
|---|---|
Library/... |
/Library/... (root-geschützt, via sudo) |
bin/* |
$REMOTE_HOME/bin/ |
.zshrc |
$REMOTE_HOME/.zshrc (gemerged, siehe unten) |
| andere | übersprungen (Sicherheit) |
$REMOTE_HOME wird beim Start per SSH ermittelt ($HOME des Remote-Users).
.zshrcwird nicht überschrieben, sondern gemerged: Für jede Zeile der lokalen.zshrcwird geprüft, ob sie auf dem Zielsystem bereits exakt vorhanden ist — fehlt sie, wird sie an die remote.zshrcangehängt. Vorher wird ein Backup unter$REMOTE_HOME/backups/angelegt. Der Vorgang ist idempotent:>erneutes Deployen ergänzt nur noch fehlende Zeilen, keine Duplikate.
Dateien unter root-geschützten Pfaden (
/Library/...) werden automatisch übersudoauf dem Zielsystem installiert. Der Remote-User benötigt passwordless sudo (NOPASSWD) in seinersudoers-Konfiguration.
# Parameter vorbereiten
cp deploy_parameter.txt deploy.txt && nano deploy.txt
# Deploy
./deploy.sh
# Direkt (ohne deploy.txt)
./deploy.sh pp@studio.home --yes
# Dry-Run (ohne Kopieren)
./deploy.sh pp@studio.home --dry-run
# Hilfe
./deploy.sh --help
Passwordless sudo einrichten (Remote)
Dateien unter /Library/... werden via sudo auf dem Zielsystem installiert.
Damit ./deploy.sh --yes komplett ohne Passwort-Prompts durchläuft,
braucht der Remote-User pp einmalig passwordless sudo für die
benötigten Befehle (cp, mv, mkdir).
Auf dem Zielsystem ( Remote, z.B. pp@studio.home) ausführen:
sudo EDITOR=nano visudo -f /etc/sudoers.d/pp_deploy
In der Datei eintragen:
pp ALL=(ALL) NOPASSWD: /bin/cp, /bin/mv, /bin/mkdir
Speichern mit Ctrl+O, Enter, Ctrl+X.
visudoprüft die Syntax vor dem Speichern — verhindert, dass du dich mit einem Tippfehler dauerhaft vonsudoaussperrst. Deshalb niesudo nano /etc/sudoersdirekt verwenden, sondern immervisudo.
Entfernen bei Bedarf:
sudo rm /etc/sudoers.d/pp_deploy
Logs
| Service | stdout | stderr |
|---|---|---|
| LM Studio | /var/log/lmstudio/stdout.log |
/var/log/lmstudio/stderr.log |
| Ollama | /var/log/ollama/stdout.log |
/var/log/ollama/stderr.log |
Log-Dateien mit den Aliases lmlogout, lmlogerr, ollogout, ollogerr live einsehen.