Database Gateway
Externe SQL-Datenbanken sicher und temporär per Tool abfragen.
Manchmal brauchst du Daten aus einer fremden Datenbank — der Live-Shop-DB des Kunden, einem alten CRM, einem Legacy-System. Direkter SQL-Zugriff von TaskMonkey aus geht nicht (Netzwerk, Firewall, Sicherheit). Lösung: das Database Gateway.
Konzept
Statt eine permanente DB-Verbindung zu öffnen, deployt das Gateway-Tool ein kleines, signiertes PHP-Script über SSH auf den Webserver des Ziels. Das Script nimmt SQL-Queries per POST entgegen, führt sie auf der lokalen DB des Servers aus und gibt JSON zurück. Nach Ablauf wird es wieder gelöscht.
Vorteile:
- Kein VPN, kein Tunnel, keine direkte DB-Verbindung
- Token-basiert, zeitlich begrenzt
- Read-only oder Read/Write konfigurierbar
- Funktioniert mit jeder DB, die das Server-PHP erreichen kann (MySQL, PostgreSQL, SQLite — entscheidet die Konfiguration des Ziel-Servers)
Voraussetzungen
Du brauchst SSH-Zugang zum Ziel-Webserver mit einem Key, dessen privater Teil hinterlegt ist. Pro Ziel hinterlegst du in deinem Workspace eine Connection-Config mit:
| Feld | Bedeutung |
|---|---|
hostname |
Server-Adresse für SSH |
remote_user |
SSH-User |
web_root |
Pfad, in dem das Gateway-Script abgelegt wird (muss per HTTP erreichbar sein) |
ssh_key |
Pfad zum privaten Schlüssel auf dem TaskMonkey-Server |
key_passphrase |
falls der Key passwortgeschützt ist |
base_url |
öffentliche URL des web_root |
allow_write |
optional, default false — erlaubt INSERT/UPDATE/DELETE |
Wo genau diese Config landet, klärt dein Betreiber. Typisch: config/remote_databases/<projekt>.php in deinem Workspace.
Tools
Drei Tools, die du in deiner tools-Liste freigibst:
| Tool | Zweck |
|---|---|
deployGateway |
Lädt das Script auf den Ziel-Server, generiert Token, hält 24h aktiv (default) |
executeQuery |
Sendet SQL-Query an das aktive Gateway, bekommt Ergebnis als JSON |
removeGateway |
Räumt das Script wieder ab (sollte nach getaner Arbeit gerufen werden) |
Beispiel-Flow im Chat
User: "Wie viele Bestellungen mit Status 'pending' liegen im Shop?"
Modell:
1. deployGateway(project: 'kunde_shop') → Token erhalten
2. executeQuery(sql: "SELECT COUNT(*) FROM orders WHERE status='pending'")
3. removeGateway(project: 'kunde_shop')
Antwort: "Aktuell 23 offene Bestellungen."
Im Prompt empfiehlt es sich, das Modell explizit anzuweisen, am Ende removeGateway zu rufen — sonst liegt ein offenes Gateway 24h herum.
Sicherheit
| Mechanismus | Schutz |
|---|---|
| Random-Token (256 bit) | jeder Request muss den Token mitschicken |
expires_at |
Tokens laufen ab (default 24h) |
allow_write Default false |
Schreib-Queries werden serverseitig abgewiesen |
| SSH-Key-Auth | nur wer den Key hat, kann ein Gateway deployen |
removeGateway |
nach getaner Arbeit: Script weg, Token wertlos |
Trotzdem: Das Gateway ist ein Live-Zugriff auf eine fremde Produktiv-DB. Setze es nur ein, wenn:
- Du die Verantwortung hast oder explizit autorisiert wurdest
- Defaults restriktiv sind (read-only)
- Tools nur die Queries machen, die fachlich nötig sind — keine
SELECT *-Datenkraken
Use-Cases
- Migrations-Checks: „Sind alle Datensätze aus der alten DB rüber?"
- Live-Reporting: „Zeig mir den heutigen Umsatz aus dem Shop"
- Daten-Recherche: „Welche Kunden haben das Produkt X bestellt?"
- Konsistenz-Checks: „Gibt es Bestellungen ohne zugehörigen Kunden?"
Was sich nicht dafür eignet:
- Massendaten-Migrationen (Tool-Calls haben ein Token-Budget)
- Produktive Schreibzugriffe ohne sehr klare Audit-Anforderungen — nimm dafür eine echte API
- Daten, die du dauerhaft brauchst — pull sie einmal, leg sie in deine eigene DB (z. B. Supabase)
Verwandt
- Supabase — wenn du eine eigene DB brauchst, nicht eine fremde anzapfen willst
- Eigene REST-API anbinden — wenn das Zielsystem eine API hat, nimm die statt SQL
Debug
tm test-tool deployGateway project=kunde_shop
tm test-tool executeQuery sql='SELECT 1'
tm logs
Wenn ein Deploy fehlschlägt: meistens SSH-Key falsch, web_root nicht beschreibbar, oder das base_url zeigt nicht auf den Web-Root. Reines SSH-Login zum Ziel manuell testen, dann nochmal versuchen.