Installation de l'agent Cipi

CipiAgent (cipi/agent sur Packagist) est le compagnon officiel Laravel de Cipi. Il relie votre application et le panneau de contrôle du serveur avec :

  • Déploiements déclenchés par Webhook à partir de GitHub et GitLab
  • Surveillance de l'état (application, base de données, cache, file d'attente, validation de déploiement)
  • Une application intégrée Serveur MCP pour les assistants IA (Curseur, VS Code, Claude Desktop)
  • Une solution orientée RGPD anonymiseur de base de données

Sur un serveur géré par Cipi, cipi app create injecte le nécessaire .env automatiquement les variables. Le bilan de santé et MCP peuvent fonctionner sur n'importe quel hôte Laravel ; déploiement complet et journalisation l'accès s'attend à un environnement géré par Cipi.

Exigences

Exigence Version
PHP 8.3+
Laravel 12+ ou 13+ (forfait 1.5.2+)
Base de données (anonymiseur) MySQL ou PostgreSQL
Outils CLI (anonymiseur) mysqldump ou pg_dump sur le serveur
coup
$ composer require cipi/agent

Le fournisseur de services découvre automatiquement – non config/app.php un changement est nécessaire. Après l'installation, s'engager et pousser ; Cipi déploie la mise à jour sur la prochaine version.

Facultatif : publiez le fichier de configuration (non-Cipi ou valeurs par défaut personnalisées) :

coup
$ php artisan vendor:publish --tag=cipi-config
$ php artisan cipi:status   # verify config and DB connectivity
Agent contre panneau API : ce paquet fonctionnedans chaque application Laravel (/cipi/* sur le domaine de l'application). Le niveau du serveur cipi/api Le package s'exécute sur un hôte virtuel API distinct et gère l'ensemble du serveur — voir Agent contre Cipi API.
Après avoir installé le package, validez et poussez. Cipi le récupérera lors du prochain déploiement automatiquement.

Commandes Artisan

Commande Descriptif
php artisan cipi : statut Afficher les valeurs de configuration Cipi et l'état de la connectivité
php artisan cipi : clé de déploiement Imprimer la clé de déploiement SSH pour cette application
php artisan cipi :mcp Afficher l'URL du point de terminaison MCP et les extraits de configuration pour Cursor, VS Code et Claude Desktop
php artisan cipi:generate-token {type} Générez un jeton sécurisé. Le type peut être mcp, health, ou anonymize
php artisan cipi:service {type} --enable|--disable Activer ou désactiver un service. Mises à jour .env en place. Tapez : mcp, health, ou anonymize
php artisan cipi:init-anonymiser Échafaudez la configuration d'anonymisation à /home/{app_user}/.db/anonymization.json
php artisan cipi : anonymiser {config} {output} Exécutez un dump de base de données anonyme directement à partir du CLI (pas de HTTP)

Webhook — Déploiements automatiques

L'agent expose un point de terminaison POST à /cipi/webhook. Lorsque votre fournisseur Git envoie un push événement, l'agent vérifie la signature et rédige un .deploy-trigger fichier de drapeau. Un cron tâche exécutée toutes les minutes lorsque l'utilisateur de l'application détecte ce fichier, le supprime et exécute Deployer dans le arrière-plan.

Cette conception signifie que la réponse webhook est instantanée (pas de délai d'attente HTTP en attente de déploiement sur terminé) et Deployer s'exécute avec les autorisations utilisateur appropriées - non sudo requis.

Configurez votre fournisseur Git

Fournisseur Webhook URL Authentification
GitHub https://yourdomain.com/cipi/webhook X-Hub-Signature-256 HMAC — utiliser CIPI_WEBHOOK_TOKEN comme secret
GitLab https://yourdomain.com/cipi/webhook X-Gitlab-Token en-tête - même valeur de jeton

Le jeton à utiliser est stocké dans .env comme CIPI_WEBHOOK_TOKEN. Vous pouvez également récupérez-le à tout moment avec :

coup
$ cipi deploy myapp --webhook

Filtrage des branches

Par défaut, chaque poussée déclenche un déploiement. Pour restreindre les déploiements à une branche spécifique, ajoutez ceci à votre .env:

env
CIPI_DEPLOY_BRANCH=main

Les push vers n'importe quelle autre succursale recevront un skipped réponse et aucun déploiement ne sera déclenché.

Bilan de santé

L'agent expose également un point de terminaison GET à /cipi/health qui renvoie une charge utile JSON avec l'état de l'application, de la base de données, du cache, de la file d'attente et du hachage de validation Git actuellement déployé. Utile pour les services de surveillance externes tels que UptimeRobot. Protégé par le CIPI_HEALTH_TOKEN Jeton du porteur : générez-en un avec php artisan cipi:generate-token health.

coup
$ curl -H "Authorization: Bearer YOUR_CIPI_HEALTH_TOKEN" \
    https://yourdomain.com/cipi/health
json
{
  "statut": "en bonne santé",
  "utilisateur_app": "monapplication",
  "MCP": "8.5",
  "php": "12.0.0",
  "environnement": "production",
  "chèques": {
    "application":      { "d'accord": vrai, "version": "2.1.0", "déboguer": faux },
    "base de données": { "d'accord": vrai, "base de données": "monapp_prod" },
    "cache":    { "d'accord": vrai },
    "file d'attente":    { "d'accord": vrai, "jobs_en attente": 0 },
    "déployer":   { "d'accord": vrai, "s'engager": "a1b2c3d4…", "short_commit": "a1b2c3d" }
  },
  "horodatage": "2026-06-10T14:22:01.000000Z"
}

Le commit de déploiement est résolu à partir de la première source disponible :

  1. /home/{app_user}/.cipi/deploy.json (Cipi déployer des métadonnées)
  2. /home/{app_user}/.cipi/last_commit
  3. /home/{app_user}/logs/deploy.log
  4. .git/HEAD ou git rev-parse HEAD

Authentification

Le jeton Porteur est résolu dans l’ordre : CIPI_HEALTH_TOKEN (dédié), alors CIPI_WEBHOOK_TOKEN (retomber). Désactivez entièrement le point de terminaison avec php artisan cipi:service health --disable ou CIPI_HEALTH_CHECK=false.

Surveillance des intégrations

Le point de terminaison de santé fonctionne avec n'importe quel vérificateur HTTP qui prend en charge les jetons Bearer, par exemple. Temps de disponibilitéRobot, Meilleure pile, Grafana, ou personnalisé MCP + curl. Sondage checks.queue.pending_jobs pour les alertes de retard de file d’attente.

MCP Serveur

cipi-agent comprend un intégré Serveur MCP (Protocole de contexte modèle) qui expose votre application à des assistants IA tels que Curseur, Code VS (avec GitHub copilote), et Bureau Claude. Le point final implémente MCP 2024-11-05 sur HTTP en utilisant JSON-RPC 2.0 et est protégé par le CIPI_MCP_TOKEN Jeton du porteur.

Le point de terminaison MCP est disponible sur POST /cipi/mcp et est désactivé par défaut. Pour activer ça :

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

Outils disponibles

Le serveur MCP expose six outils qu'un assistant IA peut appeler par son nom :

Outil Descriptif
santé État de l'application, de la base de données, du cache et de la file d'attente : mêmes données que le /cipi/health point final
app_info Configuration complète de l'application : utilisateur de l'application, version PHP, version Laravel, environnement, pilotes de file d'attente/cache/session, branche de déploiement et toutes les URL Cipi
déployer Déclenchez un nouveau déploiement sans temps d'arrêt – écrit le .deploy-trigger fichier; Le déployeur le récupère dans la minute suivante
journaux Lisez les N dernières lignes (50 par défaut, 500 maximum) à partir des journaux d'application. Prise en charge type (laravel, nginx, php, worker, deploy), level pour la gravité Laravel filtrage (par ex. error), et search pour le filtrage par mots clés. Laravel rotation quotidienne (laravel-YYYY-MM-DD.log) est détecté automatiquement.
db_query Exécuter des requêtes SQL sur la base de données de l'application — équivalent à cipi app tinker. Prend en charge SELECT, SHOW, DESCRIBE, EXPLAIN (lecture) et INSÉRER, METTRE À JOUR, SUPPRIMER (écrire). Résultats formatés sous forme de tableau ASCII, limités à 100 lignes. Le DDL destructeur (DROP TABLE/DATABASE, TRUNCATE, GRANT/REVOKE, file I/O) est bloqué.
artisan Exécutez n'importe quelle commande Artisan (par ex. migrate:status, queue:size, cache:clear). Longue durée et interactif des commandes comme serve, queue:work, et tinker sont bloqués

logs paramètres de l'outil

Paramètre Valeurs Descriptif
type laravel, nginx, php, worker, deploy Fichier journal à lire (rotation quotidienne Laravel détectée automatiquement)
level debugemergency Gravité minimale : journaux Laravel uniquement
search n'importe quelle chaîne Filtre de mots-clés insensible à la casse ; les traces de pile restent intactes
lines 1 à 500 (50 par défaut) Nombre de lignes à retourner

Opérations bloquées (sécurité MCP)

  • Artisan : serve, tinker, queue:work, queue:listen, schedule:work, horizon, octane:start, reverb:start
  • SQL : DROP, TRUNCATE, GRANT, REVOKE, E/S de fichier — lecture/écriture limitée à 100 lignes

Instructions de configuration

Exécutez le cipi:mcp Commande Artisan pour obtenir l'URL du point de terminaison et prête à être collée extraits de configuration pour votre client AI :

coup
$ php artisan cipi:mcp

La commande imprime les outils disponibles et la configuration JSON pour Cursor, VS Code et Claude Bureau.

Curseur

Ajoutez ce qui suit à ~/.cursor/mcp.json (ou allez dans Curseur → Paramètres → MCP) :

json
{
  "mcpServeurs": {
    "cipi-monapplication": {
      "type": "http",
      "url": "https://votredomaine.com/cipi/mcp",
      "en-têtes": {
        "Autorisation": "Porteur YOUR_CIPI_MCP_TOKEN"
      }
    }
  }
}

Remplacer cipi-myapp avec le nom d'utilisateur de votre application, yourdomain.com avec votre domaine réel, et YOUR_CIPI_MCP_TOKEN avec le jeton de votre .env. Le curseur se connecte nativement via HTTP — aucun pont n'est nécessaire.

Code VS

VS Code (avec GitHub Copilot) prend en charge MCP nativement depuis la version 1.102. Ajoutez ce qui suit à .vscode/mcp.json dans votre projet (ou exécutez MCP : ouvrir la configuration utilisateur pour une configuration globale) :

json
{
  "serveurs": {
    "cipi-monapplication": {
      "type": "http",
      "url": "https://votredomaine.com/cipi/mcp",
      "en-têtes": {
        "Autorisation": "Porteur YOUR_CIPI_MCP_TOKEN"
      }
    }
  }
}

Remplacer cipi-myapp, yourdomain.com, et YOUR_CIPI_MCP_TOKEN comme ci-dessus. Utiliser MCP : Ajouter un serveur à partir de la palette de commandes pour une configuration guidée. Code VS se connecte via HTTP - aucun pont n'est nécessaire.

Bureau Claude

Claude Desktop nécessite le mcp-à distance pont pour convertir stdio en HTTP. Ajoutez le suite à ~/Library/Application Support/Claude/claude_desktop_config.json:

json
{
  "mcpServeurs": {
    "cipi-monapplication": {
      "commande": "npx",
      "arguments": [
        "-y",
        "mcp-télécommande",
        "https://votredomaine.com/cipi/mcp",
        "--en-tête",
        "Autorisation : Porteur YOUR_CIPI_MCP_TOKEN"
      ]
    }
  }
}

Installer mcp-remote globalement une fois avec :

coup
$ npm install -g mcp-remote

Ce que vous pouvez faire avec

Une fois connecté, votre assistant IA peut interagir avec l'application gérée par Cipi de manière naturelle. langue. Par exemple :

conversation
Utilisateur :  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.

Utilisateur :  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 [...]

Utilisateur :  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.

Utilisateur :  What's the current migration status?

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

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

Claude : Calling db_query tool (SELECT COUNT(*) FROM users WHERE created_at >= ...)...
         | count |
         |-------|
         | 23    |
Le serveur MCP ne nécessite pas d'accès SSH au VPS. Cela fonctionne entièrement sur HTTPS en utilisant le même jeton Bearer utilisé par les points de terminaison webhook et de contrôle de santé. Cela le rend idéal pour des équipes où les développeurs devraient pouvoir surveiller et déployer sans accès root.
Gardez votre CIPI_MCP_TOKEN secrète. Toute personne possédant le jeton peut déclencher des déploiements, lisez les journaux, exécutez des requêtes de base de données et exécutez les commandes Artisan via le point de terminaison MCP. Si vous soupçonner une fuite, régénérer le jeton avec php artisan cipi:generate-token mcp et redémarrez l'application.
Deux serveurs MCP dans Cipi : Agent MCP (POST /cipi/mcp sur le domaine de l'application, 6 outils, la base de données/journaux d'une application) vs panneau API MCP (POST /mcp sur le domaine API, 46 outils, serveur entier). Utilisez l'agent MCP pour débogage spécifique à l'application ; utiliserpanneau API MCP pour créer des applications, gérer SSL, ou répertoriez toutes les bases de données.

Anonymiseur de base de données

cipi-agentcomprend un anonymiseur de base de données intégré qui crée des copies nettoyées de votre base de données de production - idéale pour le partage avec les développeurs, les équipes d'assurance qualité ou les environnements de test sans exposer les données réelles des utilisateurs. Il prend en charge les deux MCP et MySQL, utilise Plus faux-transformations basées sur configurées via un fichier JSON et s'exécute en tant que travail en arrière-plan afin que les bases de données volumineuses ne bloquent pas les requêtes HTTP.

Cette fonctionnalité réside à l'intérieur de votre Laravel demande (le cipi/agent emballer). Elle est distincte de la sauvegarde de base de données au niveau du serveur API exposée par cipi api — voir Agent contre Cipi API ci-dessous.

Cas d'utilisation

  • Développement local — donnez à chaque développeur un ensemble de données réaliste sans copie e-mails, adresses ou notes de paiement de production
  • Environnements de préparation/prévisualisation — actualiser une base de données hors production à partir de structure et volume de production, avec remplacement des informations personnelles
  • Assurance qualité et démos — reproduire des bugs qui dépendent des données relationnelles sans risque RGPD
  • Accès fournisseur ou entrepreneur — partager un dump SQL lors d'un VPN + production complet l'accès n'est pas acceptable
  • Pipelines CI — courir cipi:anonymize sur le serveur ou le déclencheur POST /cipi/db à partir d’une étape d’automatisation sécurisée

Conditions préalables

Exigence Pourquoi
composer require cipi/agent L'anonymiseur fait partie du package de l'agent, pas du serveur Cipi CLI
Travailleur de file d'attente en cours d'exécution POST /cipi/db dépêches AnonymizeDatabaseJob — sans un travailleur, le travail ne s'exécute jamais. En tant que root : cipi worker list myapp; en tant qu'utilisateur de l'application : sudo cipi-worker status myapp
mysqldump ou pg_dump La commande s'adresse à l'outil de vidage natif de votre pilote de base de données.
Laravel courrier (MAIL_* dans l'application .env) Les notifications de réussite et d'échec sont envoyées via le courrier de Laravel - si SMTP est manquant ou mal configuré, le travail d'anonymisation peut encore se terminer mais aucun e-mail n'est livré et le lien de téléchargement est uniquement dans ce message
anonymization.json sur le serveur Doit exister à /home/{app_user}/.db/ ou /home/{app_user}/.cipi/ avant de déclencher un travail

Agent contre Cipi API

Les deux composants Cipi touchent aux bases de données, mais ils résolvent des problèmes différents :

Anonymiseur d'agent (cipi/agent) Cipi API sauvegardes (cipi/api)
Portée La base de données d'une application Laravel (à partir de la base de données de l'application .env) N'importe quelle base de données sur le serveur Cipi (coffre-fort MariaDB)
Fonctionne sur Dans l'application (PHP + file d'attente) Sur l'hôte Cipi via sudo cipi db … emplois
Sortie Dump SQL avec Transformé en faux colonnes sensibles Sauvegarde entièrement compressée — données réelles, inchangées
Authentification CIPI_ANONYMIZER_TOKEN (par application) Jeton du Sanctuaire avec dbs-manage (par serveur)
Point final typique POST https://myapp.com/cipi/db POST https://api.example.com/api/dbs/{name}/backup
RGPD/PII Conçu pour un partage sécurisé : seules les colonnes configurées sont transformées Reprise après sinistre et clonage : traitez les sauvegardes comme étant secrètes en production
Utiliser Cipi API DbBackup lorsque vous avez besoin d'un instantané fidèle pour restaurer. Utilisez le agent anonymiseur quand les gens ont besoin de données regarde réel mais ne doit pas contenir d’identités réelles. Vous pouvez utiliser les deux sur le même projet : sauvegarde pour les opérations, anonymiser pour les humains.

Comment ça marche

  1. Un authentifié POST /cipi/db demande (avec un destinataire email) files d'attente AnonymizeDatabaseJob
  2. Le travail s'exécute php artisan cipi:anonymize, qui :
    • vide la base de données avec mysqldump ou pg_dump
    • coule à travers INSERT instructions et réécrit uniquement les colonnes répertoriées dans anonymization.json
    • écrit le résultat dans storage/cipi/anonymized_{jobId}.sql
  3. En cas de succès, Laravel envoie un e-mail avec un URL de téléchargement limitée dans le temps (15 minutes)
  4. GET /cipi/db/{token} sert le fichier – pas de jeton Bearer ; l'URL elle-même est le informations d'identification
  5. En cas d'échec, un e-mail d'erreur en texte brut est envoyé à la même adresse

Notifications par courrier électronique

Le HTTP API ne renvoie pas l'URL de téléchargement dans la réponse JSON - l'e-mail est le seul canal de livraison pour POST /cipi/db. Comprendre qui le reçoit et ce qui doit être configuré évite les pannes silencieuses.

Qui reçoit l'e-mail ?

Exactement l'adresse que vous transmettez dans le corps JSON - rien d'autre :

json
{ "e-mail": "développeur@exemple.com" }
  • Succès → HTML email avec le lien de téléchargement signé (15 minutes)
  • Échec → e-mail en texte brut avec l'erreur et l'ID de la tâche
  • Pas de CC, BCC ou secours à l'administrateur Cipi, CIPI_APP_USER, ou une adresse fixe à .env
  • Celui qui détient CIPI_ANONYMIZER_TOKEN choisit le destinataire à chaque demande

Le courrier Laravel doit fonctionner

Les notifications utilisent les Laravel Mail façade et celle de votre application MAIL_* paramètres - la même configuration que les réinitialisations de mot de passe ou les formulaires de contact. C'est indépendant du serveur SMTP Cipi (cipi smtp configure pour la sauvegarde/le déploiement alertes sur l'hôte).

Production typique .env entrées :

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}"
Travail réussi, boîte de réception vide ? Le dump existe peut-être déjà sous storage/cipi/anonymized_{jobId}.sql sur le serveur même en cas d'échec du courrier. Le API toujours revenu {"status":"queued"} immédiatement — cela signifie seulement que le travail a été mis en file d'attente, mais la livraison des e-mails n'a pas réussi. Vérifier storage/logs/laravel.log pour le courrier erreurs, vérifier MAIL_*, et envoyez un message de test avant de vous fier à POST /cipi/db en production.

Test rapide du courrier (en tant qu'utilisateur de l'application, avant votre premier export) :

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

Si ce message n'arrive pas, corrigez d'abord le courrier Laravel - ou utilisez le chemin CLI (php artisan cipi:anonymize) qui écrit le fichier directement et ignore les e-mails.

Configuration – étape par étape

Exécutez ces commandes sur le serveur en tant qu'utilisateur de l'application (SSH : ssh myapp@your-server ou sudo su - myapp en tant que root - voir SSH en tant qu'utilisateur de l'application):

1. Installez l'agent (si ce n'est pas déjà fait composer.json):

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

2. Activez le service et créez un jeton :

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

3. Échafaudez le fichier de configuration :

coup
$ php artisan cipi:init-anonymize

Cela crée /home/{app_user}/.db/anonymization.json (autorisations 0640) à partir du modèle intégré. Le fichier vit en dehors du dépôt Git — ce n'est jamais le cas déployé avec votre code. Utiliser --force pour écraser un fichier existant.

4. Modifiez la configuration pour correspondre à vos vraies tables et colonnes sensibles (voir Configuration).

5. Vérifiez la file d'attente et le courrier : confirmez que le travailleur exécute les tâches et que Laravel peut les envoyer au adresse que vous transmettrez POST /cipi/db (voir Notifications par courrier électronique).

coup
$ 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. Déclenchez votre premier export anonymisé via HTTP ou CLI (voir exemples ci-dessous).

Configuration

Chemins valides (le premier match gagne) :

  • /home/{app_user}/.db/anonymization.json — recommandé
  • /home/{app_user}/.cipi/anonymization.json — alternative

Le fichier JSON possède deux clés de niveau supérieur : transformations (obligatoire) et options (facultatif).

json
{
  "transformations": {
    "utilisateurs": {
      "nom": "fauxNom",
      "e-mail": "fauxEmail",
      "mot de passe": "mot de passe",
      "téléphone": "faux numéro de téléphone",
      "adresse": "fausse adresse"
    },
    "commandes": {
      "notes_clients": "fauxParagraphe",
      "adresse_d'expédition": "fausse adresse"
    },
    "support_tickets": {
      "message_utilisateur": "fauxParagraphe",
      "agent_response": "fauxParagraphe"
    }
  },
  "options": {
    "algorithme_de hachage": "auto",
    "preserve_ids": vrai,
    "faux_locale": "fr_US"
  }
}

Sous transformations, chaque clé est un nom du tableau. Les clés imbriquées sont noms de colonnes; les valeurs sont des types de transformation (et non des noms de méthodes Faker bruts — voir tableau ci-dessous). Colonnes pas répertoriés conservent leurs valeurs d'origine, afin que vous puissiez anonymiser les informations personnelles tout en en préservant les clés étrangères, les énumérations et les champs de logique métier.

Transformations prises en charge

Transformation Exemple de sortie
fakeName Nom complet (par exemple « Jane Cooper »)
fakeFirstName / fakeLastName Nom ou prénom uniquement
fakeEmail Adresse e-mail aléatoire
fakeCompany Nom de l'entreprise
fakeAddress / fakeCity / fakePostcode Adresse, ville, code postal
fakePhoneNumber Numéro de téléphone
fakeDate Chaîne de date aléatoire
fakeUrl URL
fakeParagraph Paragraphe de style Lorem (notes, biographies, corps de ticket)
password Re-hache la valeur en utilisant hash_algorithm (bcrypt, argon ou Laravel auto) — à utiliser sur users.password donc la connexion fonctionne toujours avec un mot de passe de test connu si vous en définissez un avant le vidage ou si vous acceptez des hachages aléatoires

Possibilités

Options Par défaut Descriptif
hash_algorithm auto auto (Laravel par défaut), bcrypt, argon, argon2i, argon2d
faker_locale en_US Paramètres régionaux falsifiés pour les noms, adresses, etc. (par ex. it_IT, de_DE)
preserve_ids true Réservé pour une utilisation future : les identifiants sont conservés sauf si vous ajoutez un id colonne sous transformations
L'anonymisation est opt-in par colonne. Si une table contient des informations personnelles dans une colonne JSON, blob, ou colonne que vous avez oublié de lister, ces données sont copiées textuellement. Révisez régulièrement le schéma – surtout metadata, settingset les tables d'audit.

HTTP API — points de terminaison

Méthode Point de terminaison Authentification Descriptif
POSTER /cipi/db Porteur CIPI_ANONYMIZER_TOKEN Travail d'anonymisation de la file d'attente ; email envoyé une fois terminé
POSTER /cipi/db/user Porteur CIPI_ANONYMIZER_TOKEN Résoudre users.id depuis un e-mail (assistant de débogage)
OBTENIR /cipi/db/{token} URL signée (à partir d'un e-mail) Téléchargez le .sql décharge; expire dans 15 minutes

Lorsque l'anonymiseur est désactivé (CIPI_ANONYMIZER=false), les itinéraires reviennent 404 — les points de terminaison sont entièrement masqués.

Exemples pratiques (curl)

Définissez les variables une fois (remplacez-les par le domaine de votre application et le jeton de .env):

coup
exporter APP_URL="https://myapp.example.com"
exporter CIPI_ANONYMIZER_TOKEN="votre-jeton-de-l'environnement"

1. Mettre en file d'attente une tâche d'anonymisation

coup
curl -sS -X POST "${APP_URL}/cipi/db" \
  -H "Autorisation : Porteur ${CIPI_ANONYMIZER_TOKEN}" \
  -H "Type de contenu : application/json" \
  -H "Accepter : application/json" \
  -d '{"email": "developer@example.com"}'

Réponse réussie (200):

json
{
  "statut": "en file d'attente",
  "message": "Le travail d'anonymisation de la base de données a été mis en file d'attente. Vous recevrez un e-mail avec les instructions de téléchargement une fois terminé.",
  "e-mail": "développeur@exemple.com"
}

L'appel HTTP revient immédiatement avec status: queued — ça fait pas garantir que l'e-mail de notification a été envoyé. Le traitement peut prendre quelques minutes sur des bases de données volumineuses (travail délai d'attente : 1 heure). Le message d'achèvement est envoyé uniquement au email dans votre corps JSON ; si rien n'arrive, vérifie storage/logs/laravel.log pour les erreurs de transport du courrier, php artisan queue:failed pour un travail raté, et que MAIL_* est configuré (voir Notifications par courrier électronique).

2. Téléchargez le dump (à partir du lien e-mail)

L'e-mail de fin contient une URL telle que :

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

Enregistrez-le avec curl (collez l'URL complète de l'e-mail - pas d'en-tête Bearer) :

coup
curl -sS -L -o anonymized.sql "PASTE_FULL_SIGNED_URL_FROM_EMAIL"

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

Retour de liens expirés ou invalides 410 Gone ou 404. Demander un nouvel export avec POST /cipi/db si la fenêtre de 15 minutes est passée.

3. Recherchez un identifiant d'utilisateur par e-mail

Après l'anonymisation, les e-mails sont faux, mais les identifiants utilisateur restent les mêmes. Utilisez ceci avant anonymisation pour mapper un e-mail de production connu à un identifiant que vous pourrez trouver plus tard dans le déverser :

coup
curl -sS -X POST "${APP_URL}/cipi/db/utilisateur" \
  -H "Autorisation : Porteur ${CIPI_ANONYMIZER_TOKEN}" \
  -H "Type de contenu : application/json" \
  -d '{"email": "client@production.com"}'
json
{
  "identifiant_utilisateur": 42,
  "e-mail": "client@production.com",
  "trouvé_à": "2026-06-10T14:22:01+00:00"
}

Cela interroge le live users table - s'exécute uniquement lorsque vous êtes autorisé à toucher à la production données. Cela ne modifie rien.

4. Réponses aux erreurs (dépannage)

HTTP Signification Corriger
403 Jeton de porteur invalide ou manquant Régénérez-vous avec php artisan cipi:generate-token anonymize
404 Service désactivé ou fichier de configuration manquant cipi:service anonymize --enable etcipi:init-anonymize
422 Manquant ou invalide email dans le corps de JSON Envoyer {"email":"you@example.com"}
400 JSON invalide ou vide transformations Valider anonymization.json syntaxe et contenu
500 Jeton non configuré, erreur de base de données ou outil de vidage manquant Vérifier .env, mysqldump/pg_dump, Laravel journaux
API renvoyé queued mais pas d'e-mail (le travail a peut-être réussi) Vérifier MAIL_* et envoyer un test avec php artisan tinker; lire storage/logs/laravel.log pour SMTP erreurs - ou utilisez cipi:anonymize sur le serveur pour récupérer le fichier sans mail

CLI — exécuter sans HTTP

Pour les scripts, cron, ou les exports ponctuels sur le serveur :

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

La commande imprime trois étapes (vidage → transformation → sauvegarde) et sort non nulle en cas d'échec. Ce n'est pas le cas envoyer un e-mail — copiez le fichier via SCP ou votre propre canal sécurisé.

Boucle de comparaison : Cipi API sauvegarde brute

Pour référence, un non anonymisé sauvegarde du serveur via Cipi API ressemble à ceci (hôte, jeton et sémantique différents) :

coup
exporter CIPI_API_URL="https://api.myserver.com"
exporter CIPI_API_TOKEN="jeton-sanctum-avec-dbs-manage"

curl -sS -X POST "${CIPI_API_URL}/api/dbs/myapp_db/backup" \
  -H "Autorisation : Porteur ${CIPI_API_TOKEN}" \
  -H "Accepter : application/json"

Cela revient 202 avec un job_id — sondage GET /api/jobs/{id} pour le chemin de sauvegarde sur le serveur. Les archives contiennent données de production réelles; restreindre accéder en conséquence.

Conseils de sécurité et RGPD

  • Magasin CIPI_ANONYMIZER_TOKEN dans la gestion des secrets – n'importe qui le possédant peut mettre les vidages en file d'attente et requête /cipi/db/user
  • Faites pivoter le jeton après les changements d'équipe : php artisan cipi:generate-token anonymize
  • Désactiver lorsque vous n'en avez pas besoin : php artisan cipi:service anonymize --disable (les points de terminaison renvoient 404)
  • Les liens de téléchargement expirent dans 15 minutes — transférez soigneusement les e-mails
  • Documentez quelles colonnes sont transformées pour votre DPA/politique de confidentialité
  • Testez le dump : grep pour un e-mail de production connu – il ne devrait pas apparaître si fakeEmail a été défini sur cette colonne
La configuration d'anonymisation mappe le schéma de votre base de données. Gardez-le en dehors de votre référentiel (par défaut chemin /home/{app_user}/.db/ est déjà exclu des déploiements). Ne vous engagez jamais anonymization.json au contrôle de version.

Sécurité

Cipi L'agent utilise défense en profondeur: chaque fonctionnalité possède son propre jeton Bearer et peut être désactivé indépendamment. Lorsqu'ils sont désactivés, les itinéraires reviennent 404 (caché, pas 403).

Isolement des jetons

Caractéristique Variable de jeton Point de terminaison
Webhook déployer CIPI_WEBHOOK_TOKEN POST /cipi/webhook
Bilan de santé CIPI_HEALTH_TOKEN (repli : jeton webhook) GET /cipi/health
Serveur MCP CIPI_MCP_TOKEN POST /cipi/mcp
Anonymiseur de base de données CIPI_ANONYMIZER_TOKEN POST /cipi/db, POST /cipi/db/user

Vérification Webhook

  • GitHubX-Hub-Signature-256 HMAC-SHA256
  • GitLabX-Gitlab-Token comparaison d'en-tête

Code source et versions : github.com/cipi-sh/agent (MIT).

Variables ENV

Ces variables sont automatiquement injectées par Cipi dans le fichier de l'application..env pendant cipi app create. Basculez les fonctionnalités facultatives avec php artisan cipi:service {type} --enable|--disable ou définissez-les manuellement.

Variable Descriptif Par défaut
CIPI_WEBHOOK_TOKEN Secret pour l'authentification webhook (jeton GitHub HMAC / GitLab) généré automatiquement
CIPI_APP_USER Nom d'utilisateur Linux pour cette application (chemins, script de déploiement) réglage automatique
CIPI_PHP_VERSION Version PHP signalée dans le bilan de santé système PHP
CIPI_DEPLOY_SCRIPT Chemin d'accès à la configuration du déployeur ~/.deployer/deploy.php
CIPI_DEPLOY_BRANCH Branche qui déclenche un déploiement (vide = n'importe quelle succursale) vide
CIPI_ROUTE_PREFIX Préfixe d'URL pour toutes les routes d'agent cipi
CIPI_LOG_CHANNEL Laravel canal de journalisation pour les événements de déploiement nul
CIPI_HEALTH_CHECK Activer /cipi/health true
CIPI_HEALTH_TOKEN Jeton de porteur pour la santé (revient au jeton webhook) aucun
CIPI_MCP Activer /cipi/mcp false
CIPI_MCP_TOKEN Jeton au porteur pour MCP aucun
CIPI_ANONYMIZER Activer l'anonymiseur sur /cipi/db false
CIPI_ANONYMIZER_TOKEN Jeton porteur pour anonymiseur aucun
Utiliser php artisan cipi:generate-token {type} générer des jetons pour mcp, health, ou anonymize. Utiliser php artisan cipi:service {type} --enable|--disablepour basculer les services - le la commande met à jour votre .env en place.