Installieren des Cipi-Agenten

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

  • Durch Webhook ausgelöste Bereitstellungen 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 Datenbank-Anonymisierer

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

Anforderungen

Anforderung 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 vs. Cipi API.
Führen Sie nach der Installation des Pakets einen Commit und einen Push durch. Cipi wird es bei der nächsten Bereitstellung übernehmen automatisch.

Artisan Befehle

Befehl Beschreibung
php artisan cipi:Status Cipi-Konfigurationswerte und Verbindungsstatus anzeigen
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 aus CLI aus (kein HTTP).

Webhook – Automatische Bereitstellung

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-256 HMAC – Verwendung CIPI_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.

Gesundheitscheck

Der Agent stellt außerdem einen GET-Endpunkt bereit unter /cipi/health das gibt eine JSON-Nutzlast mit 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“: „Produktion“,
  „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), also 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 unter Verwendung von JSON-RPC 2.0 und ist durch die geschützt CIPI_MCP_TOKEN Inhabertoken.

Der Endpunkt MCP 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 den Schweregrad Laravel Filterung (z.B. error), und search zur Keyword-Filterung. Laravel tägliche Rotation (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 (Standard 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 zum Abrufen der Endpunkt-URL und zum Einfügen bereit 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 stellt eine native Verbindung über HTTP her – keine Bridge 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 sich über HTTP – keine Brücke erforderlich.

Claude Desktop

Claude Desktop benötigt das mcp-remote Bridge zum Konvertieren von stdio in HTTP. 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-remote“,
        „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 vollständig mit HTTPS das gleiche Bearer-Token, das von den Endpunkten webhook und Health Check 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 Endpunkt MCP 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 Domäne API, 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.

Datenbank-Anonymisierer

cipi-Agententhä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, damit große Datenbanken HTTP-Anfragen nicht blockieren.

Diese Funktion lebt in Ihrem Inneren Laravel-Anwendung (die cipi/agent Paket). Es ist getrennt von der Datenbanksicherung auf Serverebene API, die von bereitgestellt wird cipi api – siehe Agent vs. 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 Trigger POST /cipi/db aus einem sicheren Automatisierungsschritt

Voraussetzungen

Anforderung Warum
composer require cipi/agent Der Anonymisierer ist Teil des Agentenpakets, nicht des Servers Cipi 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 E-Mail (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 vs. Cipi API

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

Agenten-Anonymisierer (cipi/agent) Cipi API Sicherungen (cipi/api)
Umfang Eine Laravel-App-Datenbank (aus der App-Datenbank). .env) Jede Datenbank auf dem Cipi-Server (MariaDB-Tresor)
Läuft weiter Innerhalb der App (PHP + Warteschlangenarbeiter) Auf dem Cipi-Host über sudo cipi db … Arbeitsplätze
Ausgabe SQL-Dump mit Faker-transformiert empfindliche Spalten Vollständig komprimiertes Backup — reale Daten, unverändert
Auth CIPI_ANONYMIZER_TOKEN (pro App) Sanctum-Token mit dbs-manage (pro 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-Anonymisierer wenn Leute Daten brauchen sieht 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.

Wie es funktioniert

  1. Eine authentifizierte 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 INSERT Anweisungen 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 Berechtigung
  5. Bei einem Fehler wird eine Klartext-Fehler-E-Mail an dieselbe Adresse gesendet

E-Mail-Benachrichtigungen

Der 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-Body übergeben – sonst nichts:

json
{ „E-Mail“: „developer@example.com“ }
  • Erfolgreich → 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 Laravel Mail Fassade und Ihre Anwendung MAIL_* Einstellungen – die gleiche Konfiguration wie beim Zurücksetzen von Passwörtern oder bei Kontaktformularen. Das ist unabhängig von Cipi Server SMTP (cipi smtp configure für Backup/Bereitstellung Warnungen auf dem Host).

Typische Produktion .env Einträ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}.sql auf dem Server, auch wenn die E-Mail fehlschlägt. Der 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 ankommt, reparieren Sie zuerst die 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

Führen Sie diese Befehle aus auf dem Server als App-Benutzer (SSH: ssh myapp@your-server oder sudo su - myapp als Wurzel – siehe SSH als App-Benutzer):

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 Ihren realen Tabellen und sensiblen Spalten zu entsprechen (siehe Konfiguration).

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 werden POST /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).

Konfiguration

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“,
      „Versandadresse“: „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 Spaltennamen; 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 (Laravel Standard), 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) Laden Sie die herunter .sql entsorgen; 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 „Inhaltstyp: application/json“ \
  -H „Akzeptieren: application/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-Aufruf kehrt sofort mit zurück status: queued – das geht 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 Anonymisierung, 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 „Inhaltstyp: 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 undcipi:init-anonymize
422 Fehlt oder ist ungültig email im JSON-Körper Senden {"email":"you@example.com"}
400 Ungültig JSON oder leer transformations Validieren anonymization.json Syntax und Inhalt
500 Token nicht konfiguriert, DB-Fehler oder Dump-Tool fehlt Überprüfen .env, mysqldump/pg_dump, Laravel Protokolle
API zurückgegeben 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 ausführen

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.

Vergleichscurl: Cipi API Rohsicherung

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: application/json“

Das kommt zurück 202 mit 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. Wenn deaktiviert, kehren Routen zurück 404 (versteckt, nicht 403).

Token-Isolation

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

Webhook Verifizierung

  • GitHubX-Hub-Signature-256 HMAC-SHA256
  • GitLabX-Gitlab-Token Header-Vergleich

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

ENV-Variablen

Diese Variablen werden von Cipi automatisch in die App eingefügt.env während cipi 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 die 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 wurde bei der Gesundheitsprüfung 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 Inhaber-Token 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|--disableum Dienste umzuschalten – die Der Befehl aktualisiert Ihre .env an Ort und Stelle.