Befehlsreferenz
Mit zeltro --help erhalten Sie dieselbe Liste im Terminal, mit zeltro <command> --help die Hilfe zu einem einzelnen Befehl.
Befehle mit der Markierung (Projektverzeichnis) müssen Sie in einem Projektverzeichnis ausführen.
🛠️ Entwicklungswerkzeuge#
Im Projektverzeichnis ausführen
| Befehl | Beschreibung |
|---|---|
zeltro composer <args> |
Composer-Befehle im Container ausführen |
zeltro art <args> |
Laravel-Artisan-Befehle ausführen (Alias: zeltro artisan) |
zeltro wp <args> |
WordPress-CLI-Befehle ausführen |
zeltro drush <args> |
Drush (Drupal) aus dem vendor/bin des Projekts ausführen |
zeltro php <args> |
PHP im Container ausführen |
zeltro npm <args> |
npm-Befehle im Container ausführen |
zeltro npx <args> |
npx-Befehle im Container ausführen |
zeltro node <args> |
Node.js im Container ausführen |
zeltro python <args> |
python3 im Container ausführen (Alias: zeltro python3) |
zeltro pip <args> |
pip3 im Container ausführen (Alias: zeltro pip3); pip install ergänzt --break-system-packages |
zeltro shell |
Die passende interaktive Shell oder REPL für das Framework öffnen |
✅ Statische Analyse & Linting#
Im Projektverzeichnis ausführen; Pfade sind relativ zum Projektstamm (zum Beispiel app/Console/Commands/Foo.php)
| Befehl | Beschreibung |
|---|---|
zeltro phpcs <relative-path> |
PHPCS mit dem Standard-Regelsatz ausführen |
zeltro phpcbf <relative-path> |
PHPCBF mit dem Standard-Regelsatz ausführen und automatisch korrigieren |
zeltro phpmd <relative-path> |
PHPMD mit den Standardregeln auf eine Datei anwenden |
zeltro php -l <relative-path> |
Den PHP-Linter auf eine Datei anwenden |
📦 Befehle im Container ausführen#
Im Projektverzeichnis ausführen
| Befehl | Beschreibung |
|---|---|
zeltro exec <cmd> |
Befehl als Benutzer developer ausführen (ohne TTY, für Automatisierung geeignet) |
zeltro exec-root <cmd> |
Befehl als root ausführen (ohne TTY) |
zeltro exec-tty <cmd> |
Befehl als Benutzer developer mit TTY ausführen (interaktiv) |
zeltro exec-tty-root <cmd> |
Befehl als root mit TTY ausführen (interaktiv) |
zeltro bash [args] |
Eine Bash-Shell im Container mit TTY öffnen |
zeltro tinker [args] |
Die Laravel-REPL tinker im Container mit TTY öffnen |
⚡ Erweiterte Laravel-Befehle#
Im Projektverzeichnis ausführen
| Befehl | Beschreibung |
|---|---|
zeltro db-refresh |
Migrationen neu aufsetzen und Seeder ausführen |
zeltro cache-refresh |
Alle Laravel-Caches leeren |
🐍 Erweiterte Django-Befehle#
Im Projektverzeichnis ausführen
| Befehl | Beschreibung |
|---|---|
zeltro django manage <args> |
manage.py mit Argumenten ausführen |
zeltro django shell |
Die interaktive Django-Shell öffnen |
🔧 Dienste verwalten#
Von überall ausführbar
| Befehl | Beschreibung |
|---|---|
zeltro mysql <args> |
Den MariaDB-Client als root im Container zeltro-mariadb ausführen (der Dienst mysql muss aktiviert sein) |
zeltro redis <cmd> |
Redis-CLI-Befehle ausführen (ohne Argumente öffnet sich die REPL) |
zeltro redis-flush |
Alle Redis-Daten löschen |
zeltro memcache <cmd> |
Einen Rohbefehl an Memcached senden (stats, version, flush_all, get <key>, set <key> <value>) |
zeltro memcache-flush |
Alle Memcached-Daten löschen |
zeltro memcache-stats |
Memcached-Statistiken anzeigen |
🎛️ Prozesse verwalten#
Im Projektverzeichnis ausführen
| Befehl | Beschreibung |
|---|---|
zeltro supervisor <cmd> |
supervisorctl-Befehle ausführen |
zeltro supervisor-status |
Alle überwachten Prozesse anzeigen |
📁 Projekte verwalten#
| Befehl | Beschreibung |
|---|---|
zeltro up <project> |
Ein Projekt starten (die gemeinsamen Dienste starten in jedem Fall) |
zeltro up-all |
Alle Projekte starten (deaktivierte Projekte werden übersprungen) |
zeltro down <project> |
Ein Projekt stoppen (die gemeinsamen Dienste laufen weiter, dafür gibt es zeltro stop-services) |
zeltro down-all |
Alle Projekte stoppen (die gemeinsamen Dienste laufen weiter) |
zeltro status [project] [--all] |
Laufende Projekte mit ihrer lokalen und ihrer LAN-Adresse anzeigen; --all zeigt auch gestoppte Projekte |
zeltro new <framework> <name> [options] |
Ein neues Projekt anlegen (Framework und Name sind Pflicht; die Datenbank wird automatisch gewählt, mit --database lässt sie sich festlegen) |
zeltro new folder <name> |
Ein Ordnerprojekt: ein Ordner plus eine KI-Sitzung, ohne Container, Datenbank oder Adresse. Für Skripte, Scraper, Dokumente, CLI-Tools und Bots |
zeltro add <path> [--name N] |
Einen vorhandenen Ordner als Ordnerprojekt nutzen. Er bleibt, wo er ist, es wird nichts hineingeschrieben, und zeltro remove vergisst ihn nur |
zeltro create "<idea>" |
Ein Projekt aus einer Idee in normaler Sprache anlegen und dann im Projektverzeichnis an Ihren KI-Agenten übergeben |
zeltro resume <project> |
Die letzte KI-Sitzung eines Projekts fortsetzen |
zeltro install <app> [name] [--image <ref>] |
Eine beliebte Open-Source-App mit einem Befehl installieren (--list zeigt alle; --one-off überspringt die Übergabe an die KI) |
zeltro clone <mode> <repo> [name] |
Ein vorhandenes Repo klonen (Modus: work-directly / fork / new-repo) |
zeltro setup <project> [database] [options] |
Ein vorhandenes Projektverzeichnis einrichten |
zeltro remove <project> [options] |
Ein Projekt entfernen (die Datenbank bleibt erhalten, außer mit --force-db-delete) |
zeltro rename <project> <new-name> [--github] [--dry-run] [--force] |
Ein Projekt umbenennen. Ordner, Container, Daten-Volumes und der Claude-Code-Verlauf ziehen mit; Adresse, Port, Datenbank und Einstellungen bleiben. Ein laufendes Projekt startet unter dem neuen Namen neu. --github benennt auch das GitHub-Repo um |
zeltro set-metadata <project> [--emoji E] [--name N] [--description D] [--idea TEXT|--idea-file F|--idea -] |
Emoji, Namen und Beschreibung eines Projekts festlegen oder die „Mit KI erstellen“-Idee, aus der es entstanden ist (beliebiger Text bis 200 KB; --idea "" entfernt sie) |
zeltro get-metadata <project> [--idea] [--json-output] |
Die Metadaten eines Projekts anzeigen; --idea gibt nur die Idee aus, Byte für Byte |
zeltro disable <project> |
Ein Projekt stoppen und beiseitelegen: up-all überspringt es, up verweigert den Start, in der GUI ist es ausgeblendet. Es wird nichts gelöscht |
zeltro enable <project> |
Ein deaktiviertes Projekt wieder aktivieren |
zeltro status gibt Adressen aus, die Sie vom Host aus öffnen können: lokal http://<container-ip> (oder http://localhost:<port> unter macOS) und aus dem LAN http://<host-lan-ip>:<port>. http://<project>/ funktioniert vom Host aus nicht, denn Projektnamen lassen sich nur innerhalb von Containern auflösen. Einen Befehl zeltro ps gibt es nicht.
⚙️ System verwalten#
| Befehl | Beschreibung |
|---|---|
zeltro configure |
Die Zeltro-Umgebung konfigurieren |
zeltro ai [--interactive] "<prompt>" |
Einen Prompt an Ihren KI-Agenten senden (standardmäßig als Einzelauftrag) (Projektverzeichnis) |
zeltro ai-set [options] |
KI-Agent, Modell und API-Schlüssel konfigurieren |
zeltro ai-unattended [agent] [--revoke|--status] |
Einen Agenten ohne Rückfragen zur Freigabe arbeiten lassen (wird in die eigene Konfiguration des Agenten geschrieben) |
zeltro peers |
Die Agenten-Sitzungen auflisten, die in der Zeltro-App laufen, auf allen Hosts |
zeltro send <project>[@host] ... -- <message> |
Anderen Agenten-Sitzungen eine Nachricht schicken (Projektverzeichnis) |
zeltro gui <action> |
Für einen Agenten in der Zeltro-App: dem Benutzer eine Frage stellen, ein Secret in die .env aufnehmen, eine Benachrichtigung zeigen oder eine URL öffnen (Projektverzeichnis) |
zeltro update [--full] |
Die CLI per git pull aktualisieren (--full führt auch den Plattform-Installer erneut aus und lädt die Images neu, wobei laufende Projekte gestoppt werden) |
zeltro start-services |
Die gemeinsamen Dienste starten |
zeltro stop-services |
Die gemeinsamen Dienste stoppen |
zeltro enable-service <name> |
Einen optionalen gemeinsamen Dienst aktivieren (siehe unten) |
zeltro disable-service <name> |
Einen davon deaktivieren (sein Daten-Volume bleibt erhalten) |
zeltro uninstall |
Zeltros Docker-Ressourcen und CLI-Dateien entfernen |
zeltro projects-dir |
Den Pfad des Projektverzeichnisses ausgeben |
zeltro version |
Die Version ausgeben und ob ein Update verfügbar ist (auch --version, -v) |
zeltro create-installer "<idea>" |
Einen neuen App-Installer per KI erzeugen (--print gibt nur den Prompt aus) |
zeltro update-installer <app>|--all |
Installer per KI mit dem Upstream-Stand abgleichen (--print gibt nur den Prompt aus) |
Optionale gemeinsame Dienste
Nur Redis, Memcached und MailHog laufen immer. Alles andere bleibt aus, bis Sie es aktivieren, und die Liste der aktivierten Dienste steht in OPTIONAL_SERVICES in /etc/zeltro-cli/.env. zeltro new, zeltro setup und zeltro install aktivieren die Datenbank, die ein Projekt braucht, automatisch.
| Name | Dienst | Adresse (aus einem Container heraus) |
|---|---|---|
mysql |
MariaDB 12 | zeltro-mariadb:3306 |
postgres |
PostgreSQL 17 | zeltro-postgres:5432 |
mongo |
MongoDB 8 | zeltro-mongo:27017 |
phpmyadmin |
phpMyAdmin | http://zeltro-phpmyadmin |
adminer |
Adminer | http://zeltro-adminer:8080 |
mongo-express |
mongo-express | http://zeltro-mongo-express:8081 |
redisinsight |
RedisInsight | http://zeltro-redisinsight:5540 |
minio |
S3-Speicher (Silo, der gepflegte MinIO-Fork) | http://zeltro-minio:9000, Konsole :9001 |
meilisearch |
Meilisearch | http://zeltro-meilisearch:7700 |
zeltro enable-service minio
zeltro disable-service minio
zeltro enable-service --json-output # no name: list every optional service and its state
Ein Dienst gilt nur dann als aktiviert, wenn er startet und weiterläuft. Auf einem Rechner, auf dem Zeltro vor der Umbenennung installiert wurde, verschiebt zeltro migrate-names die Container auf die Namen zeltro-*.
Nachrichten an andere Agenten-Sitzungen
Wenn die Zeltro-App Agenten-Sitzungen in mehreren Projekten betreibt (auf einem Host oder auf mehreren), können diese einander Nachrichten schicken. Die App übernimmt die Zustellung über einen Spool pro Benutzer unter ~/.zeltro/bus/: Sie veröffentlicht peers.json, und send legt pro Nachricht eine JSON-Datei in outbox/ ab.
zeltro peers # list live sessions as project@host; marks yours
zeltro peers --json-output
zeltro send blog -- "API schema changed" # one target
zeltro send blog api@shop -- "Rebuild please" # several targets
zeltro send --all -- "Heading out" # every live session except you
git diff | zeltro send api -- - # read the message from stdin
- Führen Sie
sendin Ihrem Projektverzeichnis aus; daran werden Sie als Absender erkannt. - Ein einfaches
projectgenügt, wenn nur eine aktive Sitzung diesen Namen trägt; sonst verwenden Sieproject@host. - Jedes Ziel muss eine aktive Sitzung sein, sonst wird nichts gesendet. Nachrichten sind auf 16 KB begrenzt.
- Bei einem einzigen Ziel ist
--optional:zeltro send blog "message". - Exit-Code 0 heißt: in die Warteschlange gestellt. Die Nachricht erscheint im Terminal des Ziels als
[Zeltro message from <you>@<host> to <targets>] ....
Die Zeltro-App um etwas bitten
Ein Agent in einer Sitzung, die die Zeltro-App gestartet hat, kann den Benutzer über das Fenster der App erreichen:
zeltro gui notify --level info "Admin login" "http://shop/admin user: admin password: ..."
zeltro gui notify --level success "Pricing page added" "Open /pricing to see it"
zeltro gui secret STRIPE_KEY --reason "for checkout" # writes it into .env; never printed
zeltro gui notify --level warning "Tests failing" "3 failures in api/"
zeltro gui open --project # or: zeltro gui open https://...
zeltro gui settings ai --reason "add an OpenRouter key"
Exit-Codes: 0 OK, 1 Fehler, 2 falsche Verwendung, 3 die App ist nicht verfügbar (fragen Sie stattdessen im Chat), 4 Zeitüberschreitung, 5 der Benutzer hat abgelehnt, 6 die App hat abgelehnt. secret schreibt nur in Dateien innerhalb des Projekts.
zeltro ai und zeltro resume melden der App außerdem, wann ein Durchgang endet, indem sie zeltro gui event als Hook für Claude Code, Codex und aider einsetzen. Die Hook-Flags gelten nur für diesen einen Lauf und ändern Ihre Konfigurationsdateien nicht. Bei Codex wird der Hook übersprungen, wenn Sie ein eigenes notify gesetzt haben.
Optionen von zeltro ai-set
zeltro ai-set verwaltet die globale KI-Agenten-CLI, das Modell und den API-Schlüssel, die Zeltro verwendet.
zeltro ai-set --agent claude --model opus
zeltro ai-set --agent codex --model gpt-6-sol
zeltro ai-set --agent aider --model anthropic/claude-sonnet-5 --api-key sk-ant-...
zeltro ai-set --install-only --agent qwen
zeltro ai-set --json-output
Unterstützte Flags:
--agent <name>– Die KI-Agenten-CLI festlegen (codex,claude,agy,qwen,aider,opencodeoderhermes).geminifunktioniert noch, ist aber veraltet: Google bietet die Gemini CLI seit dem 18.06.2026 nicht mehr für private Konten an. Nutzen Sie stattdessenagy, die Antigravity CLI, die sie ersetzt.--model <name>– Den Modellnamen festlegen (optional für Codex, Claude, agy, Gemini, OpenCode und Hermes; Pflicht für Qwen und Aider sowie für OpenCode und Hermes mit--api-base). OpenCode und Hermes erwartenprovider/model, z. B.openai/gpt-5.4-mini.--api-key <key>– Den KI-API-Schlüssel festlegen (optional für Codex, Claude, agy, OpenCode und Hermes; für agy und Gemini ein Gemini-API-Schlüssel, übergeben alsGEMINI_API_KEY; Pflicht für Aider).--api-key ""löscht einen gespeicherten Schlüssel.--api-base <url>– Einen eigenen API-Endpunkt festlegen: OpenAI-kompatibel für Codex, Qwen, Aider, OpenCode und Hermes; ein Anthropic-kompatibler Proxy für Claude.--api-base nonelöscht ihn.--allow-unattended/--no-allow-unattended– Den Agenten ohne Rückfragen zur Freigabe arbeiten lassen oder das wieder abschalten. Wird in die eigene Konfiguration des Agenten geschrieben; lassen Sie beide weg, bleibt die Einstellung unverändert. Danach richten sich Läufe im Terminal; in der Desktop-App setzt der Schalter „Arbeitet ohne Nachfragen“ jedes Projekts (standardmäßig an) sie pro Sitzung überZELTRO_AI_UNATTENDEDaußer Kraft.--install-only– Zusammen mit--agent: die CLI dieses Agenten installieren, falls sie fehlt, ohne sie zum Standard zu machen. Schreibt nichts in Zeltros Konfiguration.--json-output– Das Ergebnis als JSON zurückgeben (nicht interaktiv). Für sich allein istzeltro ai-set --json-outputeine reine Abfrage: Es installiert und schreibt nichts und meldet die aktuellen Einstellungen plus"session_overrides": true,"ai_language": trueund"installed_agents": [...].
Wenn Sie --agent ohne --model oder --api-base ändern, werden das alte Modell und der alte Endpunkt gelöscht.
Beispiele:
- Aktuelle KI-Einstellungen anzeigen:
zeltro ai-set --json-output
- Codex mit einem Modell konfigurieren:
zeltro ai-set --agent codex --model gpt-6-sol
- Claude mit einem Modell konfigurieren:
zeltro ai-set --agent claude --model opus
- Aider für Anthropic konfigurieren:
zeltro ai-set --agent aider --model anthropic/claude-sonnet-5 --api-key sk-ant-...
- Aider für einen lokalen Ollama-Server konfigurieren:
zeltro ai-set --agent aider --model openai/llama3.1 --api-key ollama --api-base http://localhost:11434/v1
KI-Einstellungen pro Sitzung überschreiben
zeltro ai, resume, create (auch mit --classify-only), clone, create-installer und update-installer nutzen den Agenten, der mit zeltro ai-set festgelegt wurde. Um für einen einzelnen Lauf einen anderen zu nutzen, setzen Sie diese Umgebungsvariablen. Sie werden nie in /etc/zeltro-cli/.env geschrieben.
| Variable | Überschreibt |
|---|---|
ZELTRO_AI_AGENT |
AI_AGENT – codex, claude, agy, aider, qwen, opencode, hermes oder gemini (veraltet) |
ZELTRO_AI_MODEL |
AI_MODEL |
ZELTRO_AI_API_BASE |
AI_API_BASE |
ZELTRO_AI_API_KEY |
AI_API_KEY |
ZELTRO_AI_API_KEY_FILE |
AI_API_KEY, gelesen aus der ersten Zeile der Datei; hat Vorrang vor ZELTRO_AI_API_KEY |
ZELTRO_AI_LANGUAGE |
Die Sprache, in der der Agent antwortet, z. B. Spanish. Zeltros eigene Ausgabe bleibt Englisch |
Nicht gesetzt heißt „den Wert aus ai-set nutzen“; gesetzt, aber leer heißt „für diesen Lauf löschen“. Ein unbekannter Agent, eine nicht lesbare Schlüsseldatei oder ein überschreibender Agent, der nicht installiert ist, führt zu einem Fehler, bevor irgendetwas läuft, und es wird nichts installiert. Nutzen Sie vorher zeltro ai-set --install-only --agent <name>.
ZELTRO_AI_AGENT=qwen ZELTRO_AI_MODEL=qwen/qwen3-coder-30b-a3b-instruct \
ZELTRO_AI_API_BASE=https://openrouter.ai/api/v1 ZELTRO_AI_API_KEY_FILE=~/.or-key \
zeltro ai "Add a health-check endpoint at /ping"
Aider
Aider ist der einzige unterstützte Agent ohne eigene Anmeldung. Er spricht immer direkt mit der API eines Anbieters und braucht deshalb ein Modell und einen Schlüssel.
- Der Modellname bestimmt den Anbieter:
openai/gpt-6-sol,anthropic/claude-sonnet-5,gemini/gemini-2.5-pro,deepseek/deepseek-chat. Siehe die Modellliste von aider. - Aider kennzeichnet Schlüssel nach Anbieter (
--api-key openai=sk-...). Zeltro speichert den reinen Schlüssel und ergänzt die Kennzeichnung anhand des Modellpräfixes,--api-key sk-...genügt also. Ein Schlüssel, der bereits ein=enthält, wird unverändert weitergereicht. --api-basebrauchen Sie nur für einen OpenAI-kompatiblen Server: Ollama, LM Studio, OpenRouter, vLLM. Stellen Sie dem Modell dannopenai/voran. Für die gehostete API eines Anbieters lassen Sie das Feld leer.- Zeltro startet Aider mit
--no-auto-commits, damit seine Änderungen wie bei jedem anderen Agenten in Ihrem Arbeitsverzeichnis landen, statt für Sie committet zu werden.
🤖 Projekte mit KI anlegen#
zeltro create nimmt Ihre Projektidee auf, ergänzt Zeltro-spezifische Anweisungen und übergibt den kombinierten Prompt an Ihre konfigurierte KI-CLI. Zeltro richtet die Umgebung ein, die KI baut die App.
# asks what you want to build (interactive terminals only)
zeltro create
# Pass the idea directly
zeltro create "A timeclock for employees in Django"
zeltro create "A customer check-in system in Laravel"
zeltro create "An inventory tracker in Express"
# Read a long idea from a file or stdin
zeltro create -f big-prompt.md
cat big-prompt.md | zeltro create
# Point to an existing GitHub repo to clone and set it up
zeltro create "https://github.com/monicahq/monica"
Mit --one-off endet der Befehl nach dem Anlegen, und die Übergabe an die KI entfällt.
Was der KI-Agent tut:
- Ist das Framework oder der Stack unklar, fragt er nach, welches er nehmen soll, bevor er weitermacht.
- Er führt
zeltro newaus, um das Projekt anzulegen und seine Container zu starten. - Er liest die erzeugte
.env-Datei, um die Konfiguration von Datenbank, Cache und Mail zu verstehen. - Er baut die App nach den Konventionen des Frameworks: Migrationen, Models, Seeder, Routen, Controller, Templates.
- Er ergänzt die README des Projekts um die lokale URL, nützliche Befehle und gegebenenfalls die Standard-Zugangsdaten.
Passt Ihre Idee zu einer bekannten App, für die es einen Zeltro-Installer gibt (Grafana, Gitea, n8n, Portainer usw.), führt der Agent zuerst zeltro install <name> aus, sodass die App in Sekunden läuft, und nimmt dann die weiteren Anpassungen aus Ihrem Prompt vor. Sie müssen nie eine docker-compose-Datei schreiben oder wissen, auf welchem Port die App lauscht.
Die KI-CLI kann je nach Konfiguration in der Cloud oder lokal laufen. Mit zeltro ai-set wählen Sie, welcher Agent zum Einsatz kommt.
Nur klassifizieren (für GUIs und andere Oberflächen)
zeltro create --classify-only "<idea>" # human-readable
zeltro create --classify-only --json-output "<idea>" # machine-readable
Führt nur die Klassifizierungsphase aus: ermittelt den Stack, gibt das Ergebnis aus, endet mit Exit-Code 0 und legt nichts an. Der Befehl fragt nie nach und lässt sich daher gefahrlos aus einer GUI, einem Skript oder von einem Agenten aufrufen.
Es gibt ihn, weil der normale nicht interaktive Weg (--one-off,
--json-output) stillschweigend die oberste Empfehlung nimmt. Für die Automatisierung ist das in Ordnung,
aber die Wahl, die ein Mensch im Menü getroffen hätte, geht dabei verloren. Eine Oberfläche,
die diese Auswahl selbst anzeigen will, sollte zuerst klassifizieren, die Kandidaten zeigen
und dann zeltro install <app> oder zeltro new <framework> <name> mit dem aufrufen,
was der Benutzer gewählt hat.
Das JSON enthält project_name (null, wenn die Idee kein echtes Thema erkennen lässt;
fragen Sie dann nach, statt etwas vorauszufüllen), recommended, customization_requested, eine
vorgeschlagene database mit Begründung und candidates: zuerst Apps, das Framework
zuletzt, höchstens 5. Apps tragen genau eine feste database, die der Installer vorgibt;
Frameworks tragen ein Array databases mit den Engines, die sie erlauben. Bieten Sie für eine App
nie eine Datenbankauswahl an. Bei einem Fehler gibt der Befehl
{"action": "classify", "status": "error", "message": "..."} aus und endet mit einem Exit-Code ungleich null.
🤖 KI-Agenten-Sitzungen#
Sobald Sie Ihren globalen KI-Agenten mit zeltro ai-set festgelegt haben, können Sie aus jedem Zeltro-Projektverzeichnis einen Prompt senden:
cd /path/to/project
zeltro ai "Build a unique homepage hero section."
Standardmäßig sendet zeltro ai einen Einzelauftrag: Der Agent bekommt den Prompt, erledigt die Arbeit und beendet sich. Der dauerhafte Projektkontext steht in der AGENTS.md des Projekts (Zeltro schreibt sie beim Anlegen), deshalb kann jeder Prompt für sich stehen. Mit --interactive (-i) erhalten Sie stattdessen eine dauerhafte Sitzung. --one-off wird aus Kompatibilitätsgründen weiterhin akzeptiert.
zeltro ai --interactive "Add a health-check endpoint at /ping"
zeltro ai:
- Liest
AI_AGENT,AI_MODEL,AI_API_KEYundAI_API_BASEaus/etc/zeltro-cli/.env, sofern keineZELTRO_AI_*-Überschreibung gesetzt ist. - Startet den Agenten mit dem Prompt (Teile in
[...]kommen nur hinzu, wenn sie gesetzt sind):- Codex:
codex exec [--model "$AI_MODEL"] "<prompt>"(Einzelauftrag) /codex [--model ...] "<prompt>"(interaktiv). Schlüssel überOPENAI_API_KEY; der Endpunkt wird als-c openai_base_url="…"übergeben, weil aktuelle Codex-VersionenOPENAI_BASE_URLignorieren. - Claude:
claude -p [--model "$AI_MODEL"] "<prompt>"(-pnur beim Einzelauftrag). Schlüssel überANTHROPIC_API_KEY, Endpunkt überANTHROPIC_BASE_URL. - Codex und Claude haben beide ihre
--api-key-Flags entfernt; der Schlüssel wird stattdessen über die Umgebung übergeben. Zeltro prüft, ob der Schlüssel zum jeweiligen Anbieter zu passen scheint (sk-für Codex,sk-ant-für Claude). Wenn nicht, ignoriert es ihn mit einer Warnung und lässt die CLI ihre eigene Anmeldung nutzen. Ein Schlüssel für den falschen Anbieter würde sonst eine funktionierende Anmeldung durch eine ersetzen, die nicht funktionieren kann. - Qwen:
qwen --auth-type openai [--model "$AI_MODEL"] --prompt "<prompt>"(Einzelauftrag) /-i "<prompt>"(interaktiv). Schlüssel und Endpunkt überOPENAI_API_KEY/OPENAI_BASE_URL. - agy (Antigravity CLI):
agy [--model "$AI_MODEL"] --add-dir <projects dir> -p "<prompt>"(Einzelauftrag) /-i "<prompt>"(interaktiv). Schlüssel überGEMINI_API_KEY; solange ein Schlüssel gespeichert ist, steht"modelProvider": "gemini"in~/.gemini/antigravity-cli/settings.json. Kein eigener Endpunkt. - Gemini (veraltet):
gemini [--model "$AI_MODEL"] --include-directories <projects dir> --output-format text --prompt "<prompt>"(Einzelauftrag) /-i "<prompt>"(interaktiv). - Aider:
aider --no-check-update --no-pretty --no-auto-commits --subtree-only [--no-git] [--model "$AI_MODEL"] [--api-key <provider>="$AI_API_KEY"] [--openai-api-base "$AI_API_BASE"] --message "<prompt>"(Einzelauftrag). Aiders--messagebeendet sich nach der Antwort, deshalb füttern interaktive Läufe die Sitzung stattdessen mit--loadund übergeben sie dann an Sie.--no-gitkommt hinzu, wenn das Verzeichnis noch kein Git-Repository ist. - OpenCode:
opencode run [-m "$AI_MODEL"] "<prompt>"(Einzelauftrag) /opencode [-m ...] --prompt "<prompt>"(interaktiv). Der Schlüssel landet in der Variablen, die der Anbieter des Modells liest; ein Endpunkt wird inOPENCODE_CONFIG_CONTENTzu einem OpenAI-kompatiblen Anbieter namenszeltro, mit dem Modell alszeltro/<model>. Die automatische Aktualisierung ist für den Lauf abgeschaltet. - Hermes:
hermes chat [--provider <p>] [-m <model>] --oneshot -Q -q "<prompt>"(Einzelauftrag) /hermes chat [...] -q "<prompt>"(interaktiv). Ein Modellpräfix (openai/,openrouter/,anthropic/,gemini/) wird zu--provider; ein Endpunkt nutzt--provider openaimitOPENAI_BASE_URLundOPENAI_API_KEY.
- Codex:
- Übergibt Flags zum Umgehen von Freigaben nur auf Anweisung. Ob ein Agent ohne Rückfrage arbeitet, steht standardmäßig in der eigenen Konfiguration des Agenten (
~/.claude/settings.json,~/.codex/config.toml,~/.gemini/antigravity-cli/settings.json,~/.gemini/settings.json,~/.qwen/settings.json,~/.aider.conf.yml,~/.config/opencode/opencode.json,~/.hermes/config.yaml) und wird mitzeltro ai-set --allow-unattendedoderzeltro ai-unattendedgesetzt. Für einen einzelnen Lauf ergänztZELTRO_AI_UNATTENDED=1die Flags (die Desktop-App nutzt das für ihren Schalter pro Projekt;ZELTRO_AI_AUTO_APPROVE=1funktioniert weiterhin), undZELTRO_AI_UNATTENDED=0schaltet die Freigaben stattdessen ein. Mit1übergibt es (--dangerously-skip-permissions,--dangerously-bypass-approvals-and-sandbox,--yolo,--dangerously-skip-permissionsfür agy,--yolo --skip-trustfür Gemini,--yes-alwaysfür Aider,--autofür OpenCode,--yolofür Hermes).
🎯 Befehlsoptionen#
Globale Optionen#
| Option | Beschreibung |
|---|---|
--json-output |
Saubere JSON-Ausgabe (unterdrückt allen Text und alle Farben). Wird vom Dispatcher entfernt, sodass jeder Befehl sie sieht |
--no-colors |
Farbige Ausgabe abschalten (von den meisten Befehlen akzeptiert). Ist die Ausgabe kein Terminal, ist Farbe ohnehin aus |
--debug |
Debug-Protokollierung nach /tmp/zeltro-cli-debug.log einschalten (akzeptiert von new, clone, setup, remove, status, up, down, start-services, stop-services, configure, uninstall) |
Optionen für neue Projekte#
zeltro new <framework> <name>: Framework und Name sind Pflichtargumente an fester Position. Das Framework ist eines von: laravel, kavera, octobercms, drupal, wordpress, php, fastapi, flask, django, python, express, nestjs, fastify, node, nextjs, nuxt, sveltekit, astro, hono, react, vue.
| Option | Beschreibung | Werte |
|---|---|---|
--database <type> |
Datenbanktyp | auto (Standard): postgres für django/fastapi/flask/python, sqlite für nextjs/nuxt/sveltekit/astro/hono/react/vue, sonst mysql. Oder mysql, postgres, mongo (Alias mongodb), sqlite. Eine Engine, die das Framework nicht nutzen kann, wird mit einer Warnung durch eine unterstützte ersetzt |
--version <ver> |
Framework-Version | Laravel: latest (Standard) oder ein Release-Tag von laravel/laravel, z. B. 12.9.1WordPress: latest (Standard) oder eine WordPress-Version. Andere Frameworks ignorieren die Option |
--db-name <name> |
Datenbankname | Standard: der Projektname, Bindestriche durch Unterstriche ersetzt |
--image <ref> |
Das Docker-Image des Projekts ersetzen | Standard: das cbc-Basis-Image des Frameworks (canebaycomputers/cbc:nginx-php8 / nginx-python3 / nginx-node) |
--no-migration |
Datenbankmigrationen überspringen | Migrationen laufen standardmäßig |
--github |
GitHub-Repository im Benutzerkonto anlegen | Erfordert eine Anmeldung bei der GitHub CLI |
--github-org <org> |
GitHub-Repository in einer Organisation anlegen | Erfordert eine Anmeldung bei der GitHub CLI |
--public |
Das neue GitHub-Repository öffentlich machen | Standard ist privat, wenn --github/--github-org verwendet wird |
--private |
Das neue GitHub-Repository privat machen | Standardverhalten, wenn kein Sichtbarkeits-Flag gesetzt ist |
--no-storage-symlink |
Den Symlink public/storage nicht anlegen |
(nur Laravel) |
--one-off |
Die Übergabe an die KI am Ende überspringen | Für die Automatisierung |
Optionen zum Klonen#
zeltro clone <mode> <repo> [name]: Der Modus ist ein Pflichtargument an erster Stelle: work-directly (klonen und das Original als Upstream behalten), fork (in Ihr GitHub-Konto forken) oder new-repo (ein neues GitHub-Repo dafür anlegen).
| Option | Beschreibung |
|---|---|
--overwrite-docker-compose |
Eine vorhandene docker-compose.yaml ohne Rückfrage überschreiben |
--database <type> |
Datenbanktyp (mysql, postgres, mongo, sqlite) |
--db-name <name> |
Datenbankname (Standard: der Projektname, Bindestriche durch Unterstriche ersetzt) |
--overwrite-env |
Die .env neu erzeugen, auch wenn das geklonte Repo schon eine enthält (Standard: die vorhandene .env behalten) |
--no-migration |
Datenbankmigrationen überspringen (sie laufen standardmäßig, bei übernommenen Apps als nicht zerstörendes migrate) |
--framework <name> |
Das Framework vorgeben, statt es erkennen zu lassen (laravel, kavera, wordpress, octobercms, drupal, php, django, flask, fastapi, python, express, nestjs, fastify, node, nextjs, nuxt, sveltekit, astro, hono, react, vue) |
--image <ref> |
Das Docker-Image des Projekts ersetzen (bei einer angepassten komplexen Compose-Datei das Image des Dienstes, der nach außen antwortet; Standard: das cbc-Basis-Image des Frameworks) |
--no-startup |
Das Projekt registrieren und anpassen, ohne den Container zu starten. So können Sie die angepasste docker-compose prüfen, bevor Sie zeltro up ausführen |
--fold / --no-fold |
Den KI-„Fold“, der das Repo für Zeltro anpasst, erzwingen oder überspringen. Standard: Fold, wenn ein KI-Agent konfiguriert ist, sonst die eingebauten Framework- und Compose-Heuristiken |
--no-preflight |
Die Kompatibilitätsprüfung überspringen und das Repo trotzdem einrichten |
--branch <name> |
Den angegebenen Branch auschecken (wird an git clone übergeben) |
--single-branch |
Nur den Verlauf dieses Branches klonen (wird an git clone übergeben) |
--github-org <org> |
Im Modus new-repo: das Repository in dieser Organisation anlegen |
--public |
Das neue GitHub-Repository öffentlich machen (Standard: privat) |
--private |
Das neue GitHub-Repository privat machen |
--no-storage-symlink |
Den Symlink public/storage nicht anlegen (Laravel) |
--one-off |
Die Übergabe an die KI am Ende überspringen |
Komplexe Projekte: Wenn Sie ein Projekt klonen, das eine eigene docker-compose mit mehreren Diensten mitbringt (mitgelieferte Datenbank, Cache, Worker), passt Zeltro sie automatisch an: Mitgelieferte Datenbank- und Cache-Dienste werden entfernt, und ihre Umgebungsvariablen zeigen danach auf Zeltros gemeinsame Container (
zeltro-postgres,zeltro-mariadb,zeltro-redis,zeltro-mongo). Der Dienst, der nach außen antwortet, bekommt eine feste VPC-IP. Der Image-Typ wirkt sich nur auf diese Compose-Anpassung aus. Die Framework-Schritte (composer install, Verdrahtung der.env, Migrationen) richten sich nach der Framework-Erkennung und laufen auch bei angepassten Projekten. Mit--no-startupprüfen Sie die angepasste Compose-Datei, bevor sie startet, mit--overwrite-envrichten Sie die Verbindungseinstellungen in der.enveiner vorhandenen App auf die gemeinsamen Dienste aus (derAPP_KEYbleibt erhalten), und mit--no-migrationüberspringen Sie die Migrationen.
Optionen für die Einrichtung#
zeltro setup <project> [database]: Das optionale zweite Argument ist die Datenbank-Engine (mysql, postgres, mongo, sqlite; Standard mysql).
| Option | Beschreibung |
|---|---|
--overwrite-docker-compose |
Eine vorhandene docker-compose.yaml ohne Rückfrage überschreiben |
--framework <type> |
Das Framework vorgeben, statt es erkennen zu lassen (laravel, kavera, octobercms, drupal, wordpress, php, fastapi, flask, django, python, express, nestjs, fastify, node, nextjs, nuxt, sveltekit, astro, hono, react, vue) |
--db-name <name> |
Datenbankname (Standard: der Projektname, Bindestriche durch Unterstriche ersetzt) |
--image <ref> |
Das Docker-Image des Projekts ersetzen (bei einer angepassten komplexen Compose-Datei das Image des Dienstes, der nach außen antwortet; Standard: das cbc-Basis-Image des Frameworks) |
--overwrite-env |
Die .env neu erzeugen, auch wenn schon eine existiert (Standard: die vorhandene .env behalten) |
--no-migration |
Datenbankmigrationen überspringen (sie laufen standardmäßig) |
--no-startup |
Das Projekt registrieren und anpassen, ohne den Container zu starten |
--no-storage-symlink |
Den Symlink public/storage nicht anlegen (Laravel) |
Optionen für den Status#
| Option | Beschreibung |
|---|---|
--all |
Auch gestoppte Projekte einbeziehen (Standard: nur laufende Projekte) |
--running |
Nur laufende Projekte (der Standard) |
Ein namentlich angegebenes Projekt (zeltro status my-project) wird auch angezeigt, wenn es gestoppt ist.
Optionen zum Entfernen#
Standardmäßig wandern die Projektdateien in den Papierkorb, und die Datenbank sowie die Docker-Volumes des Projekts bleiben erhalten.
| Option | Beschreibung |
|---|---|
--force-db-delete |
Auch die Datenbanken des Projekts, die von seinem Installer angelegten Datenbankbenutzer und seine benannten Volumes löschen. Die Namen stammen aus den Compose- und .env-Dateien des Projekts und aus seinem Installer; was auch ein anderes Projekt nutzt, bleibt erhalten |
--preserve-database |
Das Löschen der Datenbank ganz auslassen (hat Vorrang vor --force-db-delete) |
Optionen zum Umbenennen#
zeltro rename <project> <new-name> verweigert die Arbeit, solange im Projektordner etwas läuft (eine KI-Sitzung, ein Terminal). Schließen Sie das also zuerst. Bei einem Ordner, der mit zeltro add hinzugefügt wurde, ändert sich nur der Name des Projekts; der Ordner bleibt, wo er ist.
| Option | Beschreibung |
|---|---|
--github |
Auch das GitHub-Repo hinter origin umbenennen (Sie brauchen Admin-Rechte dafür) und origin auf den neuen Namen zeigen lassen. GitHub leitet die alte URL weiter |
--dry-run |
Zeigen, was sich ändern würde und ob --github funktionieren kann, ohne etwas zu ändern |
--force |
Auch dann umbenennen, wenn im Projektordner ein Programm läuft |
Optionen zum Deinstallieren#
| Option | Beschreibung |
|---|---|
--delete-images |
Auch die Docker-Images entfernen (Standard: behalten, damit eine Neuinstallation schneller geht) |
--json-output |
JSON-Antworten für die Automatisierung ausgeben |
Optionen für die Konfiguration#
| Option | Beschreibung |
|---|---|
--git-name <name> |
Git-Benutzername |
--git-email <email> |
Git-E-Mail-Adresse |
--projects-dir <dir> |
Projektverzeichnis (Standard: das vorhandene oder ~/zeltro-projects) |
--vpc-subnet <A.B.C> |
Eigenes Docker-VPC-Subnetz (Standard: das vorhandene oder ein zufälliges 10.x.x) |
--non-interactive, -y |
Nie nachfragen; für alles, was nicht als Flag übergeben wurde, die Standardwerte nehmen |
zeltro configure können Sie gefahrlos erneut ausführen: Die Werte aus /etc/zeltro-cli/.env bleiben als Standardwerte erhalten, und über die Abfragen können Sie sie ändern. Zeltro schreibt nicht in /etc/hosts.
💡 Anwendungsbeispiele#
Projekte klonen und einrichten#
# Clone a Git repository and set it up automatically
zeltro clone work-directly https://github.com/user/my-laravel-app
# Clone with a custom local name
zeltro clone work-directly https://github.com/user/company-project my-local-name
# Manual Git clone into the projects directory, then setup
cd "$(zeltro projects-dir)"
git clone https://github.com/user/company-project
zeltro setup company-project
zeltro up company-project
# Downloaded ZIP file - extract to ~/zeltro-projects/company-project/
zeltro setup company-project
zeltro up company-project
# Copied project folder
cp -r existing-project ~/zeltro-projects/new-project
zeltro setup new-project --overwrite-docker-compose
Entwicklung mit WordPress#
# Create a WordPress project (MySQL is auto-selected)
zeltro new wordpress wp-site --version latest
# Install and activate plugins
cd ~/zeltro-projects/wp-site
zeltro wp plugin install woocommerce --activate
zeltro wp plugin list --status=active
JSON-Ausgabe für die Automatisierung#
# Get project status as JSON for scripts/GUI
zeltro status --json-output
# Create project with JSON response
zeltro new fastapi my-api --database postgres --json-output
# Check if a shared service is running (keys are container names; status is lowercase)
if [ "$(zeltro status --json-output | jq -r '.shared_services["zeltro-mariadb"].status')" = "running" ]; then
echo "Database is ready"
fi
# Batch project operations (--all so stopped projects are included)
for project in $(zeltro status --all --json-output | jq -r '.projects[].name'); do
zeltro up $project --json-output
done
Die Adressfelder lesen
Jedes Projekt in zeltro status --json-output enthält mehrere Adressfelder.
Sie bedeuten Verschiedenes, und eines davon wird leicht falsch verwendet:
| Feld | Bedeutung |
|---|---|
external_port |
Der veröffentlichte Port. Das einzige portable Feld: Ein Port ist dieselbe Zahl, egal von wo aus Sie fragen. |
local_url |
Die Adresse, die auf dem Rechner funktioniert, auf dem Zeltro läuft: die IP des Containers (http://10.x.x.219) oder http://localhost:<port>, wo Docker die Container in einer VM betreibt, wie unter macOS und Windows. |
lan_url |
Die Sicht des Hosts auf sich selbst: seine LAN-Adresse und der veröffentlichte Port. |
metadata |
Anzeige-Metadaten aus dem x-metadata-Block des Projekts; {}, wenn es keinen hat. |
lan_url ist nur aus dem eigenen Netzwerk des Hosts aussagekräftig. Sie wird aus
der Adresse zusammengesetzt, die der Host für sich selbst sieht. Auf einer Cloud-VM ist das die private
Adresse, auf einer EC2-Instanz etwa http://172.30.2.182:226, und die ist von nirgendwo
sonst erreichbar. Das ist kein Fehler im Wert; das Feld kann schlicht nicht wissen,
wer fragt.
Wenn Sie ein Projekt von einem anderen Rechner aus erreichen, bauen Sie die URL aus der
Adresse, über die Sie sich mit diesem Host verbunden haben, plus external_port. Zeigen Sie
einem entfernten Benutzer nie lan_url an.
Ein Port, der lauscht, ist noch kein erreichbarer Port. Zeltro meldet, was der Host über sich selbst sehen kann. Ob Ihre Pakete ankommen, hängt vom Netzwerk zwischen Ihnen und ihm ab: Security Groups, NAT, VPNs oder schlicht davon, ob ein Laptop wach ist. Diese Frage lässt sich nur von dem Rechner aus beantworten, der fragt. Prüfen Sie deshalb von dort, statt die Erreichbarkeit aus der Statusausgabe abzuleiten.
Dienste verwalten#
# Check Redis status and flush cache
zeltro redis ping
zeltro redis-flush
# Monitor supervised processes (from the project directory)
zeltro supervisor-status
zeltro supervisor restart all
Fortgeschrittene Nutzung#
Entwicklungsbefehle im Container
PHP-Projekte: zeltro composer, zeltro art, zeltro php, zeltro wp und zeltro drush laufen im Container Ihres Projekts mit der richtigen PHP-Umgebung:
cd ~/zeltro-projects/my-laravel-app
zeltro composer install # Uses container's PHP 8.3
zeltro art migrate # Runs with container's Laravel setup
zeltro php script.php # Executes with project's PHP configuration
Node.js-Projekte: zeltro npm, zeltro npx und zeltro node laufen im Container Ihres Projekts mit Node 22:
cd ~/zeltro-projects/my-express-app
zeltro npm install # Installs packages inside container
zeltro npx tsc --init # Run any npx command inside container
zeltro node script.js # Execute a script with project's Node environment
Python-Projekte (FastAPI, Django, reines Python): zeltro python und zeltro pip laufen im Container Ihres Projekts:
cd ~/zeltro-projects/my-fastapi-app
zeltro python -c "import sys; print(sys.version)"
zeltro pip install httpx # Install a package inside the container
zeltro pip list # Show installed packages
Django-Projekte: Nutzen Sie die zeltro django-Wrapper für manage.py-Aufgaben:
cd ~/zeltro-projects/my-django-app
zeltro django manage migrate # Run migrations
zeltro django manage createsuperuser # Create admin user
zeltro django manage collectstatic # Collect static files
zeltro django manage makemigrations myapp
Interaktive Shells und REPLs
zeltro shell öffnet automatisch die passende interaktive Umgebung für das aktuelle Projekt:
# Laravel — opens php artisan tinker
cd ~/zeltro-projects/my-laravel-app && zeltro shell
# Django — opens python manage.py shell (Django ORM and apps loaded)
cd ~/zeltro-projects/my-django-app && zeltro shell
# FastAPI / plain Python / Python script — opens python3 REPL
cd ~/zeltro-projects/my-fastapi-app && zeltro shell
# Express / Fastify / plain Node.js — opens node REPL
cd ~/zeltro-projects/my-express-app && zeltro shell
# NestJS — opens node REPL; or the NestJS REPL if src/repl.ts exists
cd ~/zeltro-projects/my-nest-app && zeltro shell
Alles, was es nicht erkennt, bekommt eine Bash-Shell. zeltro tinker bleibt als ausdrücklicher Alias nur für Laravel erhalten.
Die NestJS-REPL (src/repl.ts) wird standardmäßig nicht angelegt. Legen Sie sie nach der NestJS-REPL-Dokumentation an, dann nutzt zeltro shell sie automatisch.
🔌 Anbindung per JSON-API#
Zeltro liefert saubere JSON-Ausgabe für die programmatische Anbindung, ideal für GUI-Anwendungen und Automatisierungsskripte:
// Example: Create project via JSON API
const result = await exec('zeltro new laravel myapp --version 12.9.1 --json-output');
const data = JSON.parse(result.stdout);
// Result:
{
"action": "new_project",
"project_name": "myapp",
"framework": "laravel",
"database": "mysql",
"setup_result": { ... },
"status": "success"
}
Befehle mit JSON-Ausgabe#
✅ Mit JSON-Unterstützung:
zeltro status --json-output- Status von Projekten und Dienstenzeltro new --json-output- Bestätigung der Projekterstellungzeltro clone --json-output- Bestätigung des Klonenszeltro setup --json-output- Bestätigung der Einrichtungzeltro remove --json-output- Bestätigung des Entfernenszeltro up --json-output- Bestätigung des Projektstartszeltro down --json-output- Bestätigung des Projektstoppszeltro start-services --json-output- Bestätigung des Dienststartszeltro stop-services --json-output- Bestätigung des Dienststoppszeltro enable-service/disable-service --json-output- Ergebnis des Umschaltens (ohne Namen: Liste der optionalen Dienste)zeltro configure --json-output- Bestätigung der Konfigurationzeltro uninstall --json-output- Bestätigung der Deinstallationzeltro ai-set --json-output- Aktuelle KI-Einstellungen (für sich allein nur lesend)zeltro create --classify-only --json-output- Klassifizierung des Stackszeltro peers --json-output/zeltro send --json-output- Agenten-Sitzungen / Ergebnis des Sendenszeltro get-metadata --json-output- Alle x-metadata-Schlüssel, einschließlich der vollständigenidea(statusmeldet nurhas_idea)zeltro set-metadata,zeltro disable,zeltro enable --json-output- Ergebniszeltro projects-dir --json-output,zeltro version --json-output
❌ Ohne JSON-Unterstützung (Container-Befehle):
zeltro composer- Läuft im Containerzeltro art- Läuft im Containerzeltro wp- Läuft im Containerzeltro drush- Läuft im Containerzeltro php- Läuft im Containerzeltro npm- Läuft im Containerzeltro npx- Läuft im Containerzeltro node- Läuft im Containerzeltro python- Läuft im Containerzeltro pip- Läuft im Containerzeltro shell- Läuft im Containerzeltro django- Läuft im Containerzeltro exec- Läuft im Containerzeltro exec-root- Läuft im Containerzeltro supervisor- Läuft im Containerzeltro redis- Direkte Verbindung zum Dienstzeltro memcache- Direkte Verbindung zum Dienst
🏗️ Architektur#
Enthaltene Dienste#
Laufen immer:
- Redis (
zeltro-redis) - Caching und Sitzungsspeicher - Memcached (
zeltro-memcached) - Zusätzliche Cache-Schicht - MailHog (
zeltro-mailhog) - E-Mails testen und debuggen (fängt ausgehende E-Mails ab)
Optional, automatisch aktiviert, wenn ein Projekt einen davon braucht, oder mit zeltro enable-service:
- MariaDB (
zeltro-mariadb), PostgreSQL (zeltro-postgres), MongoDB (zeltro-mongo) - phpMyAdmin, Adminer, mongo-express, RedisInsight - Admin-Oberflächen für Datenbanken
- MinIO (S3-kompatibler Speicher, bereitgestellt von Silo, dem gepflegten MinIO-Fork), Meilisearch (Volltextsuche)
Projektstruktur#
~/zeltro-projects/
├── project1/
│ ├── docker-compose.yaml
│ ├── .env
│ └── [project files]
├── project2/
└── ...
Netzwerkkonfiguration#
Jedes Projekt bekommt:
- Eine eigene Docker-IP-Adresse (10.x.x.x) im Netzwerk
zeltro-cli_vpc - Einen Namen, der sich im gemeinsamen Netzwerk aus jedem Container heraus auflösen lässt
- Einen zugeordneten externen Port für den Zugriff aus dem LAN
- Lokale URL: die Container-IP, z. B.
http://10.247.177.219 - LAN-URL:
http://your-ip:port
Deinstallation#
Deinstallation je nach Plattform#
🐧 Linux und 🍎 macOS
# 1. Remove Zeltro's containers, volumes and networks, and the CLI itself
# (/usr/local/bin/zeltro and /usr/local/share/zeltro-cli)
zeltro uninstall
# 2. Remove configuration directory (optional)
sudo rm -rf /etc/zeltro-cli
Wenn Sie das .deb-Paket installiert haben, führen Sie zeltro uninstall und danach sudo apt remove zeltro-cli aus.
Was entfernt wird#
zeltro uninstall entfernt:
- ✅ Alle Container der Zeltro-Dienste (mariadb, redis, postgres usw.)
- ✅ Alle einzelnen Projekt-Container
- ✅ Docker-Images (optional mit
--delete-images) - ✅ Docker-Volumes und -Netzwerke mit dem Präfix
zeltro-cli_, einschließlich der Daten der gemeinsamen Datenbanken - ✅ Das Zeltro-CLI-Binary und die Quelldateien
- ✅ Sichert die docker-compose.yaml-Dateien der Projekte als
docker-compose.yaml.backup
Was erhalten bleibt:
- ✅ Der Quellcode und die Dateien Ihrer Projekte
- ✅ Die Konfiguration in
/etc/zeltro-cli(eine Neuinstallation übernimmt sie) - ✅ Andere Docker-Container und -Images, die nicht zu Zeltro gehören
- ✅ Docker Desktop/Engine selbst
Die Flags finden Sie unter Optionen zum Deinstallieren.
🔧 Konfiguration#
Ersteinrichtung#
# Run the configuration wizard
zeltro configure
zeltro configure installiert außerdem die Tab-Vervollständigung für Bash (nach /usr/share/bash-completion/completions/zeltro und /etc/bash_completion.d/zeltro, je nachdem, was vorhanden ist). Öffnen Sie eine neue Shell und vervollständigen Sie Befehle, Projektnamen und Installer-Namen mit Tab:
zeltro ins<TAB> → install
zeltro install gr<TAB> → grafana gramps-web graylog grist grocy
zeltro up <TAB> → (your project names)
zeltro new <TAB> → laravel wordpress fastapi django ...
zeltro clone <TAB> → work-directly fork new-repo
Umgebungsvariablen#
JSON_OUTPUT=1- Wie--json-outputNO_COLOR- Beliebiger Wert: wie--no-colorsFORCE_COLOR=1- Farbe behalten, wenn die Ausgabe per Pipe oder Umleitung weitergeht (dort ist sie standardmäßig aus), z. B.zeltro status | less -RDEBUG_LOG_PATH- Wohin--debugschreibt (Standard/tmp/zeltro-cli-debug.log)ZELTRO_AI_AGENT,ZELTRO_AI_MODEL,ZELTRO_AI_API_BASE,ZELTRO_AI_API_KEY,ZELTRO_AI_API_KEY_FILE,ZELTRO_AI_LANGUAGE- KI-Einstellungen pro Sitzung überschreiben (siehe „KI-Einstellungen pro Sitzung überschreiben“ unter System verwalten)ZELTRO_AI_UNATTENDED=1/0- Nur für diesen Lauf:1lässt den Agenten ohne Freigabeabfragen arbeiten,0schaltet sie ein, auch wenn seine Konfiguration etwas anderes sagt (nicht gesetzt: Es gilt seine Konfiguration).ZELTRO_AI_AUTO_APPROVE=1ist die ältere Schreibweise von1ZELTRO_BUS_DIR- Spool für Agenten-Nachrichten (Standard~/.zeltro/bus)
Das Projektverzeichnis ist keine Umgebungsvariable: Es steht als PROJECTS_DIR in /etc/zeltro-cli/.env und wird mit zeltro configure --projects-dir gesetzt.
📝 Wichtige Hinweise#
- Verzeichnis: Die Projektwerkzeuge (
composer,art,wp,drush,php,npm,npx,node,python,pip,shell,django,exec,db-refresh,cache-refresh,supervisor) sowieai/sendmüssen in einem Projektverzeichnis ausgeführt werden - JSON-Ausgabe: Nutzen Sie
--json-outputfür die programmatische Anbindung (GUI, Skripte, Automatisierung) - Nicht interaktiver Modus: Befehle nehmen ausdrückliche Argumente und zeigen nie eine Auswahl an.
configureundcreatefragen nur in einem Terminal nach; nutzen Sie in Skriptenconfigure --non-interactiveodercreate --one-off - Datenbanken: Für jedes Projekt wird automatisch eine Datenbank angelegt und konfiguriert, und der gemeinsame Dienst der Engine wird aktiviert, falls er es noch nicht ist
- Adressen: Jedes Projekt bekommt eine Container-IP und einen veröffentlichten Port; in
/etc/hostswird nichts geschrieben
🚦 Hilfe bekommen#
# Show comprehensive help
zeltro help
# Show command-specific help
zeltro new --help
zeltro remove --help
🔍 Fehlerbehebung#
Häufige Probleme#
- Dienste starten nicht: Prüfen Sie, ob Docker läuft und die Ports frei sind
- Berechtigungsfehler: Stellen Sie sicher, dass der Benutzer in der Gruppe
dockerist - Datenbankverbindung: Prüfen Sie mit
zeltro status, ob der Datenbankdienst läuft, und aktivieren Sie ihn mitzeltro enable-service <mysql|postgres|mongo>, falls nicht - Portkonflikte: Jedes Projekt bekommt automatisch einen eigenen Port zugewiesen
Befehle zur Fehlersuche#
# Check service status
zeltro status
# View container logs
docker logs [container-name]
# Check that a shared service resolves from inside the project container
zeltro exec "getent hosts zeltro-redis"
# Enable debug logging
zeltro new laravel my-project --debug
zeltro setup my-project --debug
zeltro configure --debug
# View debug log
cat /tmp/zeltro-cli-debug.log
Debug-Modus#
Die wichtigsten Projekt- und Dienstbefehle akzeptieren ein Flag --debug (siehe Globale Optionen), das ausführliche Protokolle zur Fehlersuche schreibt:
- Speicherort des Protokolls:
/tmp/zeltro-cli-debug.log - Sitzungen: Jeder neue Befehl beginnt eine neue Debug-Sitzung
- Ausführliche Ausgabe: Zeigt den Ablauf der Skripte, Funktionsaufrufe und Exit-Codes
- Über Skripte hinweg: Das Debug-Flag wird automatisch zwischen den Skripten weitergereicht
Beispiel:
# Debug a project creation issue
zeltro new laravel test-project --debug
# Check what happened
tail -f /tmp/zeltro-cli-debug.log
Unter Automatisierung & JSON erfahren Sie, welche Befehle JSON unterstützen und wie Sie Skripte dafür schreiben.
Einen Fehler in dieser Übersetzung gefunden? Sagen Sie es uns auf GitHub.