Secrets & .env
Wo API-Tokens, Passwörter und andere Secrets hingehören.
Secrets & .env
API-Tokens, OAuth-Secrets und Datenbank-Passwörter werden nicht in apis.php oder anderen Config-Dateien gehalten, sondern in einer separaten .env-Datei pro Tenant.
Warum
apis.phpund Tool-Configs werden gelegentlich an ein LLM weitergegeben (Tool-Definition, Knowledge-Search-Ergebnisse). Klartext-Tokens hätten dort nichts zu suchen.- Bei
tm pull/tm syncreisen Config-Dateien zwischen deinem Rechner und dem Server — Tokens nicht mit. - Key-Rotation soll ohne Code-Änderung gehen.
Architektur
In API-Configs und Tool-Headern referenzierst du Tokens über den Marker {{secret:KEY}}:
'apis' => [
'shop_api' => [
'base_url' => 'https://shop.example.com/api/v2/',
'headers' => [
'Authorization' => 'Bearer {{secret:SHOP_API_TOKEN}}',
'Accept' => 'application/json',
],
],
],
Der ToolRunner expandiert den Marker nur unmittelbar vor jedem HTTP-Call — nirgendwo sonst. Damit:
- bleibt die Config-Datei lesbar (Marker statt Konkat-Code),
- landen Secrets nie in Logs, Tool-Catalog, LLM-Kontext oder Knowledge-Index,
- ist Resolution-Stelle klar isoliert.
Für komplexere Handler-Logik (JWT-Signierung etc.) gibt es zusätzlich den secret($key)-Helper. Beide Pfade nutzen denselben Backing-Store, beide sind tenant-isoliert.
Untracked Tenants (externe Devs, eigenes Workspace-Repo)
Speicherort:
| Umgebung | Pfad |
|---|---|
| Bei dir lokal | <tenant-verzeichnis>/.env |
| Auf dem Server | shared/tenants_untracked/<code>/.env |
Workflow:
tm pull # Holt Configs + legt .env-Skeleton an falls noch nicht da
$EDITOR .env # Echte Werte eintragen
tm sync # Configs hoch — .env bleibt lokal
Wichtig:
.envist in.gitignoreund wird nicht übertm pull/tm syncsynchronisiert.- Auf dem Server legst du sie einmalig ab (via SSH oder Onboarding-Befehl deines Betreibers).
- Bei Key-Rotation: in der
.envändern. Live-Wirkung beim nächsten Request, kein Deploy.
Tracked Tenants (Workspace im selben Git-Repo wie TaskMonkey)
Gilt nur, wenn dein Tenant-Verzeichnis Teil des mecogpt-Repos ist (nicht der Standard für externe Devs).
Speicherort:
| Umgebung | Pfad |
|---|---|
| Lokal | tenants_untracked/<code>/.env (Repo-Root, in .gitignore) |
| Server | shared/tenants_untracked/<code>/.env |
Begründung der Trennung:
Das Tenant-Verzeichnis selbst liegt im Git — eine .env darin wäre schnell aus Versehen committed. Deshalb der Spiegel-Pfad tenants_untracked/<code>/ auf Repo-Root, der explizit ignoriert ist.
Workflow:
git pull
mkdir -p tenants_untracked/<code>
$EDITOR tenants_untracked/<code>/.env
# Server-Seite bleibt unverändert — nur lokal befüllen
.env-Format
# Kommentare mit '#' am Zeilenanfang
KEY=value
QUOTED="value with spaces"
EMPTY=
Keine Variable-Expansion, keine Multi-Line-Strings. Ein Key pro Zeile.
Welche Keys gibt es
config/tenants/_template/.env.example listet die Standard-Keys (Shopify, JTL, SendGrid, Anthropic, Meta, SMTP, Trello, FinAPI, Dropbox, TinyPNG) mit Kommentaren. tm pull legt auf Wunsch eine Kopie davon als Skeleton in deine .env an.
Sicherheits-Checkliste
-
.envist nicht im Git-Working-Tree sichtbar (git statuszeigt sie nicht). - Keine Tokens als Klartext in
apis.phpoder Tool-Configs. - Bei Workspace-Wechsel: alte
.envlöschen, neue für den neuen Tenant. - Bei Token-Leak (Repo-Push aus Versehen, Mitarbeiter-Wechsel): Token rotieren beim Provider +
.envaktualisieren.
Was passiert wenn ich secret() nicht nutze
Klartext in apis.php funktioniert technisch weiter. Aber:
- Der Token wandert beim
tm pullzwischen Server und Client hin und her, - landet in Knowledge-Index, Tool-Listen und Backups,
- ist im Klartext bei jedem Mitarbeiter mit Repo-Zugriff sichtbar.
secret() ist daher der empfohlene Pfad für alle Neuanlagen und bei Migration alter Configs.