Installation des Cipi Agenten

Cipi Agent (cipi/agent on Packagist) ist der offizielle Laravel-Begleiter für Cipi. Es verbindet Ihre Anwendung und das Server-Kontrollfeld mit:

  • Durch Webhook ausgelöste Einsätze von GitHub und GitLab
  • Gesundheitsüberwachung (App, Datenbank, Cache, Warteschlange, Bereitstellungs-Commit)
  • Eine In-App MCP Server für KI-Assistenten (Cursor, VS Code, Claude Desktop)
  • Eine DSGVO-orientierte database anonymizer

Auf einem von Cipi verwalteten Server cipi app create spritzt das Notwendige ein .envVariablen automatisch. Gesundheitsprüfung und MCP können auf jedem Laravel-Host funktionieren; Vollständige Bereitstellung und Protokollierung Zugriff erwarten Sie eine Cipi-verwaltete Umgebung.

Anforderungen

Requirement Version
PHP 8.3+
Laravel 12+ oder 13+ (Paket 1.5.2+)
Datenbank (Anonymisierer) MySQL oder PostgreSQL
CLI Tools (Anonymisierer) mysqldump oder pg_dump auf dem Server
bash
$ composer require cipi/agent

Der Dienstanbieter erkennt automatisch – nein config/app.php Veränderung ist nötig. Nach der Installation, verpflichten und pushen; Cipi stellt das Update in der nächsten Version bereit.

Optional – veröffentlichen Sie die Konfigurationsdatei (nicht-Cipi oder benutzerdefinierte Standardeinstellungen):

bash
$ php artisan vendor:publish --tag=cipi-config
$ php artisan cipi:status   # verify config and DB connectivity
Agent vs. Panel API:Dieses Paket wird ausgeführtin jeder Laravel-App (/cipi/* auf der App-Domäne). Die Serverebene cipi/api Paket läuft auf einem separaten API vhost und verwaltet den gesamten Server – siehe Agent gegen Cipi API.
Führen Sie nach der Installation des Pakets einen Commit und einen Push durch. Cipi wird es beim nächsten Einsatz einsammeln automatisch.

Artisan Befehle

Befehl Beschreibung
php artisan cipi:Status Zeigt Cipi Konfigurationswerte und Verbindungsstatus an
php artisan cipi:deploy-key Drucken Sie den SSH-Bereitstellungsschlüssel für diese App aus
php artisan cipi:mcp Zeigen Sie die MCP-Endpunkt-URL und Setup-Snippets für Cursor, VS Code und Claude Desktop an
php artisan cipi:generate-token {type} Generieren Sie ein sicheres Token. Typ kann sein mcp, health, oder anonymize
php artisan cipi:service {type} --enable|--disable Schalten Sie einen Dienst ein oder aus. Aktualisierungen .env an Ort und Stelle. Typ: mcp, health, oder anonymize
php artisan cipi:init-anonymize Erstellen Sie ein Gerüst für die Anonymisierungskonfiguration unter /home/{app_user}/.db/anonymization.json
php artisan cipi:anonymize {config} {output} Führen Sie einen anonymisierten Datenbank-Dump direkt vom CLI aus (kein HTTP)

Webhook — Automatic Deploys

Der Agent macht einen POST-Endpunkt verfügbar unter /cipi/webhook. Wenn Ihr Git-Anbieter einen Push sendet Bei diesem Ereignis überprüft der Agent die Signatur und schreibt eine .deploy-trigger Flag-Datei. Ein cron Der Job wird jede Minute ausgeführt, wenn der App-Benutzer diese Datei erkennt, sie entfernt und den Deployer im ausführt Hintergrund.

Dieses Design bedeutet, dass die webhook-Antwort sofort erfolgt (kein HTTP-Timeout beim Warten auf die Bereitstellung). vollständig) und Deployer wird mit den richtigen Benutzerberechtigungen ausgeführt – nein sudo erforderlich.

Konfigurieren Sie Ihren Git-Anbieter

Anbieter Webhook URL Authentifizierung
GitHub https://yourdomain.com/cipi/webhook X-Hub-Signature-256HMAC – VerwendungCIPI_WEBHOOK_TOKEN als Geheimnis
GitLab https://yourdomain.com/cipi/webhook X-Gitlab-Token Header – gleicher Tokenwert

Der zu verwendende Token wird in gespeichert .env als CIPI_WEBHOOK_TOKEN. Das können Sie auch jederzeit abrufen mit:

bash
$ cipi deploy myapp --webhook

Zweigfilterung

Standardmäßig löst jeder Push eine Bereitstellung aus. Um Bereitstellungen auf einen bestimmten Zweig zu beschränken, fügen Sie dies zu Ihrem hinzu .env:

env
CIPI_DEPLOY_BRANCH=main

Pushs an einen anderen Zweig erhalten eine skipped Es erfolgt keine Reaktion und keine Bereitstellung ausgelöst.

Health Check

Der Agent stellt außerdem einen GET-Endpunkt bereit unter /cipi/health Das gibt eine Nutzlast von JSON zurück den Status der App, der Datenbank, des Caches, der Warteschlange und des aktuell bereitgestellten Git-Commit-Hashs. Nützlich für externe Überwachungsdienste wie UptimeRobot. Geschützt durch die CIPI_HEALTH_TOKEN Inhabertoken – generieren Sie eines mit php artisan cipi:generate-token health.

bash
$ curl -H "Authorization: Bearer YOUR_CIPI_HEALTH_TOKEN" \
    https://yourdomain.com/cipi/health
json
{
  „Status“: „gesund“,
  „app_user“: „meine App“,
  „php“: "8.5",
  „laravel“: "12.0.0",
  „Umwelt“: "production",
  „Schecks“: {
    „App“:      { „ok“: wahr, „Version“: "2.1.0", „Debuggen“: falsch },
    „Datenbank“: { „ok“: wahr, „Datenbank“: „myapp_prod“ },
    „Cache“:    { „ok“: wahr },
    „Warteschlange“:    { „ok“: wahr, „pending_jobs“: 0 },
    „bereitstellen“:   { „ok“: wahr, „verpflichten“: "a1b2c3d4…", „short_commit“: „a1b2c3d“ }
  },
  „Zeitstempel“: „2026-06-10T14:22:01.000000Z“
}

Der Deploy-Commit wird aus der ersten verfügbaren Quelle aufgelöst:

  1. /home/{app_user}/.cipi/deploy.json (Cipi Metadaten bereitstellen)
  2. /home/{app_user}/.cipi/last_commit
  3. /home/{app_user}/logs/deploy.log
  4. .git/HEAD oder git rev-parse HEAD

Authentifizierung

Der Inhabertoken wird in der folgenden Reihenfolge aufgelöst: CIPI_HEALTH_TOKEN (gewidmet), dann CIPI_WEBHOOK_TOKEN (zurückgreifen). Deaktivieren Sie den Endpunkt vollständig mit php artisan cipi:service health --disable oder CIPI_HEALTH_CHECK=false.

Überwachung von Integrationen

Der Gesundheitsendpunkt funktioniert mit jedem HTTP-Prüfer, der Bearer-Token unterstützt – z. UptimeRobot, Besserer Stapel, Grafana, oder benutzerdefiniert cron + curl. Umfrage checks.queue.pending_jobs für Warteschlangenrückstauwarnungen.

MCP Server

cipi-Agent Enthält eine integrierte MCP Server (Modellkontextprotokoll) Dadurch wird Ihre Anwendung KI-Assistenten zugänglich gemacht, z Cursor, VS-Code (mit GitHub Copilot), und Claude Desktop. Der Endpunkt implementiert MCP 2024-11-05 über HTTP mit JSON-RPC 2.0 und ist durch die geschützt CIPI_MCP_TOKEN Inhabertoken.

Der MCP-Endpunkt ist verfügbar unter POST /cipi/mcp und ist standardmäßig deaktiviert. Zum Aktivieren es:

bash
$ php artisan cipi:service mcp --enable
$ php artisan cipi:generate-token mcp

Verfügbare Werkzeuge

Der MCP-Server stellt sechs Tools bereit, die ein KI-Assistent namentlich aufrufen kann:

Werkzeug Beschreibung
Gesundheit App-, Datenbank-, Cache- und Warteschlangenstatus – dieselben Daten wie die /cipi/health Endpunkt
app_info Vollständige Anwendungskonfiguration: App-Benutzer, PHP-Version, Laravel-Version, Umgebung, Warteschlangen-/Cache-/Sitzungstreiber, Bereitstellungszweig und alle Cipi URLs
bereitstellen Lösen Sie eine neue Bereitstellung ohne Ausfallzeiten aus – schreibt der .deploy-trigger Datei; Der Bereitsteller holt es innerhalb von 1 Minute ab
Protokolle Lesen Sie die letzten N Zeilen (Standard 50, max. 500) aus Anwendungsprotokollen. Unterstützt type (laravel, nginx, php, worker, deploy), level für Laravel Schweregrad Filterung (z.B. error), und search zur Keyword-Filterung. Laravel täglicher Wechsel (laravel-YYYY-MM-DD.log) wird automatisch erkannt.
db_query Führen Sie SQL-Abfragen für die Anwendungsdatenbank aus – äquivalent zu cipi app tinker. Unterstützt SELECT, SHOW, DESCRIBE, EXPLAIN (Lesen) und EINFÜGEN, AKTUALISIEREN, DELETE (schreiben). Ergebnisse formatiert als ASCII-Tabelle, begrenzt auf 100 Zeilen. Destruktives DDL (DROP TABLE/DATABASE, TRUNCATE, GRANT/REVOKE, Datei-E/A) wird blockiert.
artisan Führen Sie einen beliebigen Artisan-Befehl aus (z. B. migrate:status, queue:size, cache:clear). Langanhaltend und interaktiv Befehle wie serve, queue:work, und tinker sind gesperrt

logs Werkzeugparameter

Parameter Werte Beschreibung
type laravel, nginx, php, worker, deploy Zu lesende Protokolldatei (Laravel tägliche Rotation automatisch erkannt)
level debugemergency Mindestschweregrad – nur Laravel Protokolle
search irgendeine Zeichenfolge Groß-/Kleinschreibung berücksichtigender Schlüsselwortfilter; Stapelspuren bleiben erhalten
lines 1–500 (default 50) Anzahl der zurückzugebenden Zeilen

Blockierte Vorgänge (MCP Sicherheit)

  • Artisan: serve, tinker, queue:work, queue:listen, schedule:work, horizon, octane:start, reverb:start
  • SQL: DROP, TRUNCATE, GRANT, REVOKE, Datei-E/A – Lese-/Schreibzugriff begrenzt auf 100 Reihen

Einrichtungsanweisungen

Führen Sie das aus cipi:mcp Artisan-Befehl, um die Endpunkt-URL abzurufen und zum Einfügen bereit zu machen Konfigurationsausschnitte für Ihren AI-Client:

bash
$ php artisan cipi:mcp

Der Befehl druckt die verfügbaren Tools und die JSON-Konfiguration für Cursor, VS Code und Claude Desktop.

Cursor

Fügen Sie Folgendes hinzu ~/.cursor/mcp.json (oder gehen Sie zu Cursor → Einstellungen → MCP):

json
{
  „mcpServers“: {
    "cipi-myapp": {
      „Typ“: „http“,
      „URL“: „https://yourdomain.com/cipi/mcp“,
      „Kopfzeilen“: {
        „Autorisierung“: „Träger YOUR_CIPI_MCP_TOKEN“
      }
    }
  }
}

Ersetzen cipi-myapp mit Ihrem App-Benutzernamen, yourdomain.com mit deinem tatsächliche Domäne und YOUR_CIPI_MCP_TOKEN mit dem Token von Ihrem .env. Der Cursor verbindet sich nativ über HTTP – keine Brücke erforderlich.

VS-Code

VS Code (mit GitHub Copilot) unterstützt MCP nativ seit Version 1.102. Fügen Sie Folgendes hinzu .vscode/mcp.json in Ihrem Projekt (oder run MCP: Benutzerkonfiguration öffnen für ein globales Setup):

json
{
  „Server“: {
    "cipi-myapp": {
      „Typ“: „http“,
      „URL“: „https://yourdomain.com/cipi/mcp“,
      „Kopfzeilen“: {
        „Autorisierung“: „Träger YOUR_CIPI_MCP_TOKEN“
      }
    }
  }
}

Ersetzen cipi-myapp, yourdomain.com, und YOUR_CIPI_MCP_TOKEN wie oben. Benutzen MCP: Server hinzufügen aus der Befehlspalette für eine geführte Einrichtung. VS-Code verbindet über HTTP – keine Brücke erforderlich.

Claude Desktop

Claude Desktop benötigt dasmcp-Fernbedienung Bridge, um stdio in HTTP zu konvertieren. Fügen Sie die hinzu im Anschluss an ~/Library/Application Support/Claude/claude_desktop_config.json:

json
{
  „mcpServers“: {
    "cipi-myapp": {
      „Befehl“: „npx“,
      „Argumente“: [
        „-y“,
        „mcp-Fernbedienung“,
        „https://yourdomain.com/cipi/mcp“,
        „--header“,
        „Autorisierung: Inhaber YOUR_CIPI_MCP_TOKEN“
      ]
    }
  }
}

Installieren mcp-remote global einmalig mit:

bash
$ npm install -g mcp-remote

Was Sie damit machen können

Sobald die Verbindung hergestellt ist, kann Ihr KI-Assistent auf natürliche Weise mit der von Cipi verwalteten Anwendung interagieren Sprache. Zum Beispiel:

Gespräch
Benutzer:  Is the app healthy? Any pending jobs in the queue?

Claude: Calling health tool...
         Status: healthy — database, cache, and queue all OK.
         Queue: 0 pending jobs.

Benutzer:  Show me the last errors from the log.

Claude: Calling logs tool (lines: 100)...
         Found 2 errors in the last 100 lines:
         [2026-03-04 14:22:01] production.ERROR: Connection refused [...]
         [2026-03-04 14:23:15] production.ERROR: Redis timeout [...]

Benutzer:  Clear the cache and deploy the latest version.

Claude: Calling artisan tool (cache:clear)...
         Cache cleared successfully.
         Calling deploy tool...
         Deploy queued — Deployer will run within 1 minute.

Benutzer:  What's the current migration status?

Claude: Calling artisan tool (migrate:status)...
         All 47 migrations have been run.

Benutzer:  How many users signed up in the last 7 days?

Claude: Calling db_query tool (SELECT COUNT(*) FROM users WHERE created_at >= ...)...
         | count |
         |-------|
         | 23    |
Der MCP-Server benötigt keinen SSH-Zugriff auf den VPS. Es funktioniert völlig über HTTPS Verbrauch das gleiche Bearer-Token, das von den webhook- und Health-Check-Endpunkten verwendet wird. Dadurch ist es ideal für Teams, in denen Entwickler ohne Root-Zugriff überwachen und bereitstellen können sollten.
Behalten Sie Ihre CIPI_MCP_TOKEN Geheimnis. Jeder mit dem Token kann Bereitstellungen auslösen, Lesen Sie Protokolle, führen Sie Datenbankabfragen aus und führen Sie Artisan-Befehle über den MCP-Endpunkt aus. Wenn Sie Leck vermuten, regenerieren das Token mit php artisan cipi:generate-token mcp und starten Sie die Anwendung neu.
Zwei MCP-Server in Cipi: Agent MCP (POST /cipi/mcp auf die App-Domäne, 6 Tools, die Datenbank/Protokolle einer App) vs panel API MCP (POST /mcp auf der API-Domäne, 46 Tools, gesamter Server). Verwenden Sie Agent MCP für App-spezifisches Debugging; verwendenpanel API MCP um Apps zu erstellen, zu verwalten SSL, oder alle Datenbanken auflisten.

Database Anonymizer

cipi-Agent enthält einen integrierten Datenbank-Anonymisierer, der bereinigte Kopien davon erstellt Ihre Produktionsdatenbank – ideal für die gemeinsame Nutzung mit Entwicklern, QA-Teams oder Staging-Umgebungen ohne echte Benutzerdaten preiszugeben. Es unterstützt beides MySQL und PostgreSQL, verwendet Faker-basierte Transformationen, die über eine JSON-Datei konfiguriert werden und als ausgeführt werden Hintergrundjob, sodass große Datenbanken keine HTTP-Anfragen blockieren.

Diese Funktion lebt in Ihrem Inneren Laravel application (die cipi/agent Paket). Es ist getrennt von der Datenbanksicherung API auf Serverebene, die von bereitgestellt wird cipi api – siehe Agent gegen Cipi API unten.

Anwendungsfälle

  • Lokale Entwicklung– Geben Sie jedem Entwickler einen realistischen Datensatz, ohne ihn kopieren zu müssen Produktions-E-Mails, Adressen oder Zahlungshinweise
  • Staging-/Vorschauumgebungen – Aktualisieren Sie eine Nicht-Produktionsdatenbank von Produktionsstruktur und -volumen, wobei PII ersetzt wurde
  • Qualitätssicherung und Demos – Reproduzieren Sie Fehler, die von relationalen Daten abhängen, ohne DSGVO-Risiko
  • Lieferanten- oder Auftragnehmerzugang – Geben Sie einen SQL-Dump frei, wenn eine vollständige VPN + -Produktion erfolgt Der Zugriff ist nicht akzeptabel
  • CI-Pipelines – laufen cipi:anonymize auf dem Server oder TriggerPOST /cipi/db aus einem sicheren Automatisierungsschritt

Voraussetzungen

Requirement Warum
composer require cipi/agent Der Anonymisierer ist Teil des Agentenpakets, nicht des Cipi-Servers CLI
Warteschlangenarbeiter läuft POST /cipi/db Sendungen AnonymizeDatabaseJob – ohne a Worker, der Job wird nie ausgeführt. Als Root: cipi worker list myapp; als App-Benutzer: sudo cipi-worker status myapp
mysqldump oder pg_dump Der Befehl wird an das native Dump-Tool für Ihren DB-Treiber gesendet
Laravel Post (MAIL_* in App .env) Erfolgs- und Fehlerbenachrichtigungen werden über den Mailer von Laravel gesendet – wenn SMTP fehlt oder Wenn die Anonymisierungsaufgabe falsch konfiguriert ist, kann sie dennoch abgeschlossen werden keine E-Mail ist geliefert und der Download-Link ist nur in dieser Nachricht
anonymization.json auf dem Server Muss vorhanden sein /home/{app_user}/.db/ oder /home/{app_user}/.cipi/ bevor ein Auftrag ausgelöst wird

Agent gegen Cipi API

Beide Cipi-Komponenten berühren Datenbanken, lösen aber unterschiedliche Probleme:

Agent anonymizer (cipi/agent) Cipi API backups (cipi/api)
Umfang Eine Laravel App-Datenbank (aus der App-Datenbank). .env) Jede Datenbank auf dem Cipi-Server (MariaDB-Tresor)
Läuft weiter In der App (PHP + Warteschlangenarbeiter) Auf dem Cipi Host via sudo cipi db … Arbeitsplätze
Ausgabe SQL-Dump mit Faker-transformiert sensitive columns Vollständig komprimiertes Backup — reale Daten, unverändert
Auth CIPI_ANONYMIZER_TOKEN (pro App) Sanctum-Token mitdbs-manage (per server)
Typischer Endpunkt POST https://myapp.com/cipi/db POST https://api.example.com/api/dbs/{name}/backup
DSGVO / PII Entwickelt für sicheres Teilen – nur konfigurierte Spalten werden transformiert Notfallwiederherstellung und Klonen – Backups als Produktionsgeheimnis behandeln
Benutzen Cipi API DbBackup wenn Sie einen originalgetreuen Schnappschuss benötigen wiederherstellen. Benutzen Sie die Agenten-Anonymisiererwenn Leute Daten brauchensieht aus real, darf aber keine realen Identitäten enthalten. Sie können beides im selben Projekt verwenden: Backup für den Betrieb, für Menschen anonymisieren.

How it works

  1. An authenticated POST /cipi/db Anfrage (mit einem Empfänger email) Warteschlangen AnonymizeDatabaseJob
  2. Der Job wird ausgeführt php artisan cipi:anonymize, die:
    • speichert die Datenbank mit mysqldump oder pg_dump
    • strömt durch INSERTAnweisungen und schreibt nur die in aufgeführten Spalten neu anonymization.json
    • schreibt das Ergebnis nach storage/cipi/anonymized_{jobId}.sql
  3. Bei Erfolg sendet Laravel eine E-Mail mit a Zeitlich begrenzte Download-URL (15 Minuten)
  4. GET /cipi/db/{token} stellt die Datei bereit – kein Bearer-Token; Die URL selbst ist die Berechtigungsnachweis
  5. Bei einem Fehler wird eine Klartext-Fehler-E-Mail an dieselbe Adresse gesendet

E-Mail-Benachrichtigungen

Die HTTP API gibt die Download-URL nicht in der JSON-Antwort zurück – E-Mail ist die einzige Lieferkanal für POST /cipi/db. Verstehen, wer es erhält und Was konfiguriert werden muss, vermeidet stille Fehler.

Wer erhält die E-Mail?

Genau die Adresse, die Sie im JSON-Körper übergeben – sonst nichts:

json
{ „E-Mail“: „developer@example.com“ }
  • Erfolg → HTML E-Mail mit dem signierten Download-Link (15 Minuten)
  • Fehler → Klartext-E-Mail mit Fehler und Job-ID
  • Kein CC, BCC oder Fallback auf den Cipi-Administrator, CIPI_APP_USER, oder eine feste Adresse in .env
  • Wer auch immer hält CIPI_ANONYMIZER_TOKEN wählt bei jeder Anfrage den Empfänger aus

Laravel Mail muss funktionieren

Benachrichtigungen verwenden LaravelMail Fassade und Ihre Anwendung MAIL_* Einstellungen – die gleiche Konfiguration wie beim Zurücksetzen von Passwörtern oder bei Kontaktformularen. Das istunabhängig von Cipi Server-SMTP (cipi smtp configure für Backup/Bereitstellung Warnungen auf dem Host).

Typische Produktion.envEinträge:

env
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=...
MAIL_PASSWORD=...
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@myapp.example.com
MAIL_FROM_NAME="${APP_NAME}"
Auftrag erfolgreich, Posteingang leer? Der Dump existiert möglicherweise bereits unter storage/cipi/anonymized_{jobId}.sqlauf dem Server, auch wenn die E-Mail fehlschlägt. Die API trotzdem zurückgekehrt {"status":"queued"} sofort – das bedeutet nur, dass der Job war in der Warteschlange, nicht dass die E-Mail-Zustellung erfolgreich war. Überprüfen storage/logs/laravel.log für Post Fehler, überprüfen MAIL_*, und senden Sie eine Testnachricht, bevor Sie sich darauf verlassen POST /cipi/db in der Produktion.

Schneller Mailtest (als App-Benutzer vor Ihrem ersten Export):

bash
$ php artisan tinker --execute="Mail::raw('Cipi anonymizer mail test', fn (\$m) => \$m->to('you@example.com')->subject('Mail test'));"

Wenn diese Nachricht nicht eintrifft, beheben Sie zuerst die E-Mail Laravel – oder verwenden Sie den Pfad CLI (php artisan cipi:anonymize), wodurch die Datei direkt geschrieben und E-Mails übersprungen werden.

Einrichtung – Schritt für Schritt

Run these commands auf dem Server als App-Benutzer (SSH: ssh myapp@your-server oder sudo su - myapp als Wurzel – siehe SSH as the app user):

1. Installieren Sie den Agenten (falls nicht schon drin composer.json):

bash
$ composer require cipi/agent
# commit, push, deploy — or run on the current release

2. Aktivieren Sie den Dienst und erstellen Sie ein Token:

bash
$ php artisan cipi:service anonymize --enable
$ php artisan cipi:generate-token anonymize

3. Erstellen Sie ein Gerüst für die Konfigurationsdatei:

bash
$ php artisan cipi:init-anonymize

Das schafft /home/{app_user}/.db/anonymization.json (Berechtigungen 0640) aus der integrierten Vorlage. Die Datei lebt außerhalb des Git-Repositorys – das ist es nie mit Ihrem Code bereitgestellt. Benutzen --force um eine bestehende Datei zu überschreiben.

4. Bearbeiten Sie die Konfiguration um Ihre realen Tabellen und sensiblen Spalten abzugleichen (siehe Configuration).

5. Warteschlange und E-Mail überprüfen: Bestätigen Sie, dass der Worker Jobs ausführt und Laravel an den senden kann Adresse, an die Sie weitergeben werdenPOST /cipi/db (siehe E-Mail-Benachrichtigungen).

bash
$ php artisan cipi:status          # DB connectivity
$ php artisan queue:work --once   # optional: confirm worker can run jobs
# send a test email — must arrive before using POST /cipi/db
$ php artisan tinker --execute=„Mail::raw('Mail test', fn (\$m) => \$m->to('you@example.com')->subject('Mail test'));"

6. Lösen Sie Ihren ersten anonymisierten Export aus über HTTP oder CLI (siehe Beispiele unten).

Configuration

Gültige Pfade (das erste Spiel gewinnt):

  • /home/{app_user}/.db/anonymization.json — empfohlen
  • /home/{app_user}/.cipi/anonymization.json – Alternative

Die Datei JSON verfügt über zwei Schlüssel der obersten Ebene: transformations (erforderlich) und options (optional).

json
{
  „Transformationen“: {
    „Benutzer“: {
      „Name“: „fakeName“,
      „E-Mail“: "fakeEmail",
      „Passwort“: „Passwort“,
      „Telefon“: „fakePhoneNumber“,
      „Adresse“: "fakeAddress"
    },
    „Bestellungen“: {
      „customer_notes“: „fakeParagraph“,
      "shipping_address": "fakeAddress"
    },
    „support_tickets“: {
      „user_message“: „fakeParagraph“,
      „agent_response“: „fakeParagraph“
    }
  },
  „Optionen“: {
    „hash_algorithm“: „automatisch“,
    „preserve_ids“: wahr,
    „faker_locale“: „en_US“
  }
}

Unter transformations, jeder Schlüssel ist ein Tabellenname. Verschachtelte Schlüssel sind column names; Werte sind Transformationstypen (keine rohen Faker-Methodennamen – siehe Tabelle unten). Spalten nicht Die aufgelisteten Daten behalten ihre ursprünglichen Werte bei, sodass Sie personenbezogene Daten anonymisieren können Beibehaltung von Fremdschlüsseln, Enumerationen und Geschäftslogikfeldern.

Unterstützte Transformationen

Transformation Beispielausgabe
fakeName Vollständiger Name (z. B. „Jane Cooper“)
fakeFirstName / fakeLastName Nur Vor- oder Nachname
fakeEmail Zufällige E-Mail-Adresse
fakeCompany Firmenname
fakeAddress / fakeCity / fakePostcode Straße, Ort, Postleitzahl
fakePhoneNumber Telefonnummer
fakeDate Zufällige Datumszeichenfolge
fakeUrl URL
fakeParagraph Absatz im Lorem-Stil (Notizen, Biografien, Tickettexte)
password Hasht den Wert erneut mit hash_algorithm (bcrypt, argon oder Laravel auto) – verwenden auf users.password Die Anmeldung funktioniert also immer noch mit a bekanntes Testkennwort, wenn Sie eines vor dem Dump festlegen, oder zufällige Hashes akzeptieren

Optionen

Option Standard Beschreibung
hash_algorithm auto auto (Standardeinstellung Laravel), bcrypt, argon, argon2i, argon2d
faker_locale en_US Gefälschtes Gebietsschema für Namen, Adressen usw. (z. B. it_IT, de_DE)
preserve_ids true Für zukünftige Verwendung reserviert – IDs bleiben erhalten, es sei denn, Sie fügen eine hinzu id Spalte darunter Transformationen
Anonymisierung ist Opt-in pro Spalte. Wenn eine Tabelle PII in einer JSON-Spalte enthält, Blob oder Spalte, die Sie vergessen haben aufzulisten, werden diese Daten wörtlich kopiert. Überprüfen Sie das Schema regelmäßig – besonders metadata, settingsund Prüftabellen.

HTTP API – Endpunkte

Methode Endpunkt Auth Beschreibung
POST /cipi/db Träger CIPI_ANONYMIZER_TOKEN Anonymisierungsjob in die Warteschlange stellen; E-Mail nach Abschluss gesendet
POST /cipi/db/user Träger CIPI_ANONYMIZER_TOKEN Lösen users.id per E-Mail (Debug-Helfer)
ERHALTEN /cipi/db/{token} Signierte URL (aus E-Mail) Download the .sqlentsorgen; läuft in 15 Minuten ab

Wenn der Anonymisierer deaktiviert ist (CIPI_ANONYMIZER=false), Routen kehren zurück 404 — Die Endpunkte sind vollständig ausgeblendet.

Praxisbeispiele (Curl)

Legen Sie die Variablen einmal fest (ersetzen Sie sie durch Ihre App-Domäne und das Token von). .env):

bash
exportieren APP_URL=„https://myapp.example.com“
exportieren CIPI_ANONYMIZER_TOKEN=„Ihr-Token-aus-Umgebung“

1. Stellen Sie einen Anonymisierungsauftrag in die Warteschlange

bash
curl -sS -X POST „${APP_URL}/cipi/db“ \
  -H „Autorisierung: Inhaber ${CIPI_ANONYMIZER_TOKEN}“ \
  -H „Content-Type: application/json“ \
  -H „Akzeptieren: Bewerbung/json“ \
  -d '{"email": "developer@example.com"}'

Erfolgreiche Antwort (200):

json
{
  „Status“: „in der Warteschlange“,
  „Nachricht“: „Der Auftrag zur Datenbankanonymisierung wurde in die Warteschlange gestellt. Sobald der Vorgang abgeschlossen ist, erhalten Sie eine E-Mail mit Anweisungen zum Herunterladen.“,
  „E-Mail“: „developer@example.com“
}

Der HTTP-Anruf kehrt sofort mit zurück status: queued — that does nicht garantieren, dass die Benachrichtigungs-E-Mail gesendet wurde. Die Verarbeitung kann bei großen Datenbanken (Job Timeout: 1 Stunde). Die Abschlussmeldung geht nur an die email in deinem JSON Körper; wenn Es kommt nichts an, überprüfen Sie storage/logs/laravel.log für Mail-Transportfehler, php artisan queue:failed für einen gescheiterten Job, und das MAIL_* konfiguriert ist (siehe E-Mail-Benachrichtigungen).

2. Laden Sie den Dump herunter (über den E-Mail-Link).

Die Abschluss-E-Mail enthält eine URL wie:

Text
https://myapp.example.com/cipi/db/AbCdEf...?expires=1710000000&signature=...

Speichern Sie es mit Curl (fügen Sie die vollständige URL aus der E-Mail ein – ohne Bearer-Header):

bash
curl -sS -L -o anonymized.sql „PASTE_FULL_SIGNED_URL_FROM_EMAIL“

# Import locally (MySQL example)
mysql -u root -p myapp_local < anonymized.sql

Abgelaufene oder ungültige Links werden zurückgegeben 410 Gone oder 404. Fordern Sie einen neuen Export an mit POST /cipi/db wenn das 15-Minuten-Fenster verstrichen ist.

3. Suchen Sie per E-Mail nach einer Benutzer-ID

Nach der Anonymisierung sind E-Mails gefälscht – aber Benutzer-IDs bleiben gleich. Benutzen Sie dies vor Anonymisieren, um eine bekannte Produktions-E-Mail einer ID zuzuordnen, die Sie später im finden Dump:

bash
curl -sS -X POST „${APP_URL}/cipi/db/user“ \
  -H „Autorisierung: Inhaber ${CIPI_ANONYMIZER_TOKEN}“ \
  -H „Content-Type: application/json“ \
  -d '{"email": "customer@produktion.com"}'
json
{
  „user_id“: 42,
  „E-Mail“: „customer@produktion.com“,
  „found_at“: „2026-06-10T14:22:01+00:00“
}

Dies fragt das Live ab users Tabelle – nur ausführen, wenn Sie die Produktion berühren dürfen Daten. Es ändert nichts.

4. Fehlerreaktionen (Fehlerbehebung)

HTTP Bedeutung Beheben
403 Ungültiger oder fehlender Inhaber-Token Regenerieren Sie mit php artisan cipi:generate-token anonymize
404 Dienst deaktiviert oder Konfigurationsdatei fehlt cipi:service anonymize --enable und cipi:init-anonymize
422 Fehlt oder ist ungültigemail in JSON body Senden {"email":"you@example.com"}
400 Ungültig JSON oder leer transformations Validieren anonymization.jsonSyntax und Inhalt
500 Token nicht konfiguriert, DB-Fehler oder Dump-Tool fehlt Überprüfen .env, mysqldump/pg_dump, Laravel Protokolle
API returned queued aber keine E-Mail (Job war möglicherweise erfolgreich) Überprüfen MAIL_* und senden Sie einen Test mit php artisan tinker; lesen storage/logs/laravel.log für SMTP Fehler – oder Verwendung cipi:anonymize auf dem Server, um die Datei ohne E-Mail zu erhalten

CLI – ohne HTTP laufen

Für Skripte, cron oder einmalige Exporte auf dem Server:

bash
$ php artisan cipi:anonymize \
    /home/myapp/.db/anonymization.json \
    /home/myapp/anonymized_export.sql

Der Befehl gibt drei Schritte aus (Dump → Transformieren → Speichern) und wird bei einem Fehler ungleich Null beendet. Das ist nicht der Fall E-Mail senden – Kopieren Sie die Datei über SCP oder Ihren eigenen sicheren Kanal.

Vergleich Curl: Cipi API Raw-Backup

Als Referenz: a nicht anonymisiert Server-Backup über Cipi API sieht so aus (unterschiedlicher Host, Token und Semantik):

bash
exportieren CIPI_API_URL=„https://api.myserver.com“
exportieren CIPI_API_TOKEN=„sanctum-token-with-dbs-manage“

curl -sS -X POST „${CIPI_API_URL}/api/dbs/myapp_db/backup“ \
  -H „Autorisierung: Inhaber ${CIPI_API_TOKEN}“ \
  -H „Akzeptieren: Bewerbung/json“

That returns 202mit einem job_id – Umfrage GET /api/jobs/{id} für den Backup-Pfad auf dem Server. Das Archiv enthält echte Produktionsdaten; einschränken entsprechend zugreifen.

Sicherheits- und DSGVO-Tipps

  • Speichern CIPI_ANONYMIZER_TOKEN in der Geheimnisverwaltung – jeder, der damit ausgestattet ist, kann Dumps in die Warteschlange stellen und abfragen /cipi/db/user
  • Drehen Sie den Token nach einem Teamwechsel: php artisan cipi:generate-token anonymize
  • Deaktivieren, wenn es nicht benötigt wird: php artisan cipi:service anonymize --disable (Endpunkte geben 404 zurück)
  • Download-Links laufen ab 15 Minuten – Leiten Sie E-Mails sorgfältig weiter
  • Dokumentieren Sie, welche Spalten für Ihre DPA-/Datenschutzrichtlinie umgewandelt werden
  • Testen Sie den dump: grep auf eine bekannte Produktions-E-Mail – er sollte nicht erscheinen, wenn fakeEmail wurde auf diese Spalte gesetzt
Die Anonymisierungskonfiguration bildet Ihr Datenbankschema ab. Bewahren Sie es außerhalb Ihres Repositorys auf (Standard). Pfad /home/{app_user}/.db/ ist bereits von Bereitstellungen ausgeschlossen). Lege dich niemals fest anonymization.json zur Versionskontrolle.

Sicherheit

Cipi Agent verwendet Verteidigung in der Tiefe: Jede Funktion hat ihr eigenes Bearer-Token und kann sein unabhängig voneinander ausgeschaltet werden. Bei Deaktivierung kehren Routen zurück 404 (hidden, not 403).

Token-Isolation

Funktion Token-Variable Endpunkt
Webhook bereitstellen CIPI_WEBHOOK_TOKEN POST /cipi/webhook
Health check CIPI_HEALTH_TOKEN (Fallback: webhook Token) GET /cipi/health
MCP Server CIPI_MCP_TOKEN POST /cipi/mcp
DB anonymizer CIPI_ANONYMIZER_TOKEN POST /cipi/db, POST /cipi/db/user

Webhook Verifizierung

  • GitHubX-Hub-Signature-256HMAC-SHA256
  • GitLabX-Gitlab-Token header comparison

Quellcode und Veröffentlichungen: github.com/cipi-sh/agent(MIT).

ENV Variables

Diese Variablen werden von Cipi automatisch in die App eingefügt .envwährendcipi app create. Schalten Sie optionale Funktionen mit um php artisan cipi:service {type} --enable|--disable oder manuell einstellen.

Variabel Beschreibung Standard
CIPI_WEBHOOK_TOKEN Geheimnis für webhook-Authentifizierung (GitHub HMAC / GitLab-Token) automatisch generiert
CIPI_APP_USER Linux-Benutzername für diese App (Pfade, Bereitstellungsskript) automatisch eingestellt
CIPI_PHP_VERSION PHP-Version im Gesundheitscheck gemeldet System PHP
CIPI_DEPLOY_SCRIPT Pfad zur Deployer-Konfiguration ~/.deployer/deploy.php
CIPI_DEPLOY_BRANCH Zweig, der eine Bereitstellung auslöst (leer = jede Filiale) leer
CIPI_ROUTE_PREFIX URL-Präfix für alle Agentenrouten cipi
CIPI_LOG_CHANNEL Laravel Protokollkanal für Bereitstellungsereignisse null
CIPI_HEALTH_CHECK Aktivieren /cipi/health true
CIPI_HEALTH_TOKEN Inhabertoken für Gesundheit (fällt auf webhook-Token zurück) keine
CIPI_MCP Aktivieren /cipi/mcp false
CIPI_MCP_TOKEN Inhabertoken für MCP keine
CIPI_ANONYMIZER Aktivieren Sie den Anonymisierer unter /cipi/db false
CIPI_ANONYMIZER_TOKEN Inhabertoken für Anonymisierung keine
Benutzen php artisan cipi:generate-token {type} um Token zu generieren mcp, health, oder anonymize. Benutzen php artisan cipi:service {type} --enable|--disable um Dienste umzuschalten – die Der Befehl aktualisiert Ihre .env an Ort und Stelle.