No description
Find a file
pp 62937b5927 deploy.sh: .zshrc wird gemerged statt überschrieben
- 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.
2026-08-10 21:03:44 +02:00
bin Deploy: TARGET_DIR entfernt, Strukturen angepasst 2026-08-10 19:39:52 +02:00
Library/LaunchDaemons Initial commit: macOS Studio Server Konfiguration 2026-08-10 17:49:43 +02:00
.gitignore Deploy: Parameter aus deploy.txt lesen, deploy_parameter.txt Vorlage, deploy.txt git-ignorieren 2026-08-10 19:37:10 +02:00
.zshrc Deploy: TARGET_DIR entfernt, Strukturen angepasst 2026-08-10 19:39:52 +02:00
deploy.sh deploy.sh: .zshrc wird gemerged statt überschrieben 2026-08-10 21:03:44 +02:00
deploy_parameter.txt Deploy: SSH_CONNECT statt HOST+USER, README-Pfade korrigiert 2026-08-10 19:46:30 +02:00
README.md deploy.sh: .zshrc wird gemerged statt überschrieben 2026-08-10 21:03:44 +02:00

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-a4b
  • openai/gpt-oss-120b
  • qwen/qwen3.6-35b-a3b
  • text-embedding-bge-m3
  • text-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).

.zshrc wird nicht überschrieben, sondern gemerged: Für jede Zeile der lokalen .zshrc wird geprüft, ob sie auf dem Zielsystem bereits exakt vorhanden ist — fehlt sie, wird sie an die remote .zshrc angehä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 über sudo auf dem Zielsystem installiert. Der Remote-User benötigt passwordless sudo (NOPASSWD) in seiner sudoers-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.

visudo prüft die Syntax vor dem Speichern — verhindert, dass du dich mit einem Tippfehler dauerhaft von sudo aussperrst. Deshalb nie sudo nano /etc/sudoers direkt verwenden, sondern immer visudo.

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.