Cipi Agente
Instalación del agente Cipi
Cipi Agente (cipi/agent en empaquetador) es el acompañante oficial Laravel de
Cipi. Une su aplicación y el panel de control del servidor con:
- Implementaciones activadas por Webhook desde GitHub y GitLab
- Monitoreo de salud (aplicación, base de datos, caché, cola, confirmación de implementación)
- Una aplicación MCP servidor para asistentes de IA (Cursor, VS Code, Claude Desktop)
- Un orientado al RGPD anonimizador de base de datos
En un servidor administrado por Cipi, cipi app create inyecta el requerido .env
variables automáticamente. La verificación de estado y MCP pueden funcionar en cualquier host Laravel; implementación completa y registro
el acceso espera un entorno administrado por Cipi.
Requisitos
| Requisito | Versión |
|---|---|
| PHP | 8.3+ |
| Laravel | 12+ o 13+ (paquete 1.5.2+) |
| Base de datos (anonimizador) | MySQL o PostgreSQL |
| CLI herramientas (anonimizador) | mysqldump o pg_dump en el servidor |
$ composer require cipi/agent
El proveedor de servicios descubre automáticamente: no config/app.php es necesario un cambio. Después de la instalación,
comprometerse y presionar; Cipi implementa la actualización en la próxima versión.
Opcional: publique el archivo de configuración (no Cipi o valores predeterminados personalizados):
$ php artisan vendor:publish --tag=cipi-config $ php artisan cipi:status # verify config and DB connectivity
/cipi/* en el dominio de la aplicación). El nivel del servidor
cipi/api El paquete se ejecuta en un vhost API separado y
gestiona todo el servidor - ver Agente frente a Cipi API.Artisan comandos
| Comando | Descripción |
|---|---|
| php artisan cipi:estado | Mostrar Cipi valores de configuración y estado de conectividad |
| php artisan cipi: clave de implementación | Imprima la clave de implementación SSH para esta aplicación |
| php artisan cipi:mcp | Muestre la URL del punto final MCP y los fragmentos de configuración para Cursor, VS Code y Claude Desktop |
| php artisan cipi:generar token {tipo} | Genera un token seguro. El tipo puede ser mcp, health, o
anonymize
|
| php artisan cipi:servicio {tipo} --enable|--disable | Activa o desactiva un servicio. Actualizaciones .env en su lugar. Tipo:
mcp, health, o anonymize
|
| php artisan cipi:init-anonymizar | Armar la configuración de anonimización en
/home/{app_user}/.db/anonymization.json
|
| php artisan cipi:anonimizar {config} {salida} | Ejecute un volcado de base de datos anónimo directamente desde CLI (no HTTP) |
Webhook — Implementaciones automáticas
El agente expone un punto final POST en /cipi/webhook. Cuando su proveedor de Git envía un push
evento, el agente verifica la firma y escribe un .deploy-trigger archivo de bandera. Un cron
trabajo que se ejecuta cada minuto a medida que el usuario de la aplicación detecta este archivo, lo elimina y ejecuta Deployer en el
fondo.
Este diseño significa que la respuesta webhook es instantánea (sin tiempo de espera HTTP esperando que se implemente).
completo) y Deployer se ejecuta con los permisos de usuario correctos, no sudo requerido.
Configura tu proveedor de Git
| Proveedor | Webhook URL | Autenticación |
|---|---|---|
| GitHub | https://yourdomain.com/cipi/webhook | X-Hub-Signature-256 HMAC-uso CIPI_WEBHOOK_TOKEN como secreto |
| GitLab | https://yourdomain.com/cipi/webhook | X-Gitlab-Token encabezado: mismo valor del token |
El token a utilizar se almacena en .env como CIPI_WEBHOOK_TOKEN. tu también puedes
recuperarlo en cualquier momento con:
$ cipi deploy myapp --webhook
Filtrado de ramas
De forma predeterminada, cada inserción desencadena una implementación. Para restringir las implementaciones a una rama específica, agregue esto a su
.env:
CIPI_DEPLOY_BRANCH=main
Los empujones a cualquier otra sucursal recibirán un skipped respuesta y no habrá despliegue
desencadenado.
Control de salud
El agente también expone un punto final GET en /cipi/health que devuelve una carga útil JSON con
el estado de la aplicación, la base de datos, el caché, la cola y el hash de confirmación de Git actualmente implementado. Útil
para servicios de monitoreo externos como UptimeRobot. Protegido por el
CIPI_HEALTH_TOKEN Token de portador: genere uno con
php artisan cipi:generate-token health.
$ curl -H "Authorization: Bearer YOUR_CIPI_HEALTH_TOKEN" \
https://yourdomain.com/cipi/health
{
"estado": "saludable",
"usuario_aplicación": "miaplicación",
"php": "8.5",
"laravel": "12.0.0",
"medio ambiente": "producción",
"cheques": {
"aplicación": { "bien": cierto, "versión": "2.1.0", "depurar": falso },
"base de datos": { "bien": cierto, "base de datos": "miaplicación_prod" },
"caché": { "bien": cierto },
"cola": { "bien": cierto, "trabajos_pendientes": 0 },
"implementar": { "bien": cierto, "comprometerse": "a1b2c3d4…", "compromiso corto": "a1b2c3d" }
},
"marca de tiempo": "2026-06-10T14:22:01.000000Z"
}
La confirmación de implementación se resuelve desde la primera fuente disponible:
/home/{app_user}/.cipi/deploy.json(Cipi implementar metadatos)/home/{app_user}/.cipi/last_commit/home/{app_user}/logs/deploy.log.git/HEADogit rev-parse HEAD
Autenticación
La ficha de portador se resuelve en orden: CIPI_HEALTH_TOKEN (dedicado), entonces
CIPI_WEBHOOK_TOKEN (retroceder). Deshabilite el punto final por completo con
php artisan cipi:service health --disable o CIPI_HEALTH_CHECK=false.
Monitoreo de integraciones
El punto final de salud funciona con cualquier verificador HTTP que admita tokens de portador, p.
Tiempo de actividadRobot, Mejor pila, Grafana, o personalizado
cron + curl. Encuesta checks.queue.pending_jobs para alertas de acumulación de colas.
MCP Servidor
cipi-agente incluye un incorporado MCP servidor (Protocolo de contexto modelo)
que expone su aplicación a asistentes de IA como Cursor,
Código VS (con GitHub copiloto), y Escritorio Claude. El punto final
implementa MCP 2024-11-05 sobre HTTP usando JSON-RPC 2.0
y está protegido por el CIPI_MCP_TOKEN Ficha al portador.
El punto final MCP está disponible en POST /cipi/mcp y está deshabilitado de forma predeterminada. para habilitar
eso:
$ php artisan cipi:service mcp --enable $ php artisan cipi:generate-token mcp
Herramientas disponibles
El servidor MCP expone seis herramientas que un asistente de IA puede invocar por su nombre:
| Herramienta | Descripción |
|---|---|
| salud | Estado de la aplicación, la base de datos, la caché y la cola: los mismos datos que el
/cipi/health punto final
|
| información_aplicación | Configuración completa de la aplicación: usuario de la aplicación, versión PHP, versión Laravel, entorno, controladores de cola/caché/sesión, rama de implementación y todas las URL Cipi |
| implementar | Activar una nueva implementación sin tiempo de inactividad: escribe el
.deploy-trigger archivo; El implementador lo detecta en 1 minuto
|
| registros | Lea las últimas N líneas (50 predeterminadas, máximo 500) de los registros de la aplicación. Soportes
type (laravel, nginx, php,
worker, deploy), level para Laravel gravedad
filtrado (por ej. error), y search para filtrado de palabras clave.
Laravel rotación diaria (laravel-YYYY-MM-DD.log) se detecta automáticamente.
|
| consulta_db | Ejecutar consultas SQL en la base de datos de la aplicación, equivalente a
cipi app tinker. Admite SELECCIONAR, MOSTRAR, DESCRIBIR, EXPLICAR (leer) y
INSERTAR, ACTUALIZAR, BORRAR (escribir). Resultados formateados como tabla ASCII, con un límite de 100 filas.
El DDL destructivo (DROP TABLE/DATABASE, TRUNCATE, GRANT/REVOKE, file I/O) está bloqueado.
|
| artisan | Ejecute cualquier comando Artisan (p. ej. migrate:status,
queue:size, cache:clear). De larga duración e interactivo.
comandos como serve, queue:work, y
tinker estan bloqueados
|
logs parámetros de la herramienta
| Parámetro | Valores | Descripción |
|---|---|---|
type |
laravel, nginx, php, worker,
deploy |
Archivo de registro para leer (Laravel rotación diaria detectada automáticamente) |
level |
debug … emergency |
Gravedad mínima: Laravel solo registros |
search |
cualquier cuerda | Filtro de palabras clave que no distingue entre mayúsculas y minúsculas; los rastros de la pila permanecen intactos |
lines |
1–500 (predeterminado 50) | Número de líneas para regresar |
Operaciones bloqueadas (MCP seguridad)
- Artisan:
serve,tinker,queue:work,queue:listen,schedule:work,horizon,octane:start,reverb:start - SQL:
DROP,TRUNCATE,GRANT,REVOKE, E/S de archivos: lectura/escritura limitada a 100 filas
Instrucciones de configuración
Ejecute el cipi:mcp Comando Artisan para obtener la URL del punto final y lista para pegar
Fragmentos de configuración para su cliente AI:
$ php artisan cipi:mcp
El comando imprime las herramientas disponibles y la configuración JSON para Cursor, VS Code y Claude Escritorio.
Cursor
Agregue lo siguiente a ~/.cursor/mcp.json (o vaya a Cursor → Configuración → MCP):
{
"mcpServidores": {
"cipi-mi aplicación": {
"tipo": "http",
"URL": "https://tudominio.com/cipi/mcp",
"encabezados": {
"Autorización": "Portador YOUR_CIPI_MCP_TOKEN"
}
}
}
}
Reemplazar cipi-myapp con el nombre de usuario de tu aplicación, yourdomain.com con tu
dominio real, y YOUR_CIPI_MCP_TOKEN con la ficha de tu
.env. El cursor se conecta de forma nativa a través de HTTP; no se necesita puente.
Código VS
VS Code (con GitHub Copilot) admite MCP de forma nativa desde la versión 1.102. Agregue lo siguiente a
.vscode/mcp.json en su proyecto (o ejecutar MCP: Abrir configuración de usuario
para una configuración global):
{
"servidores": {
"cipi-mi aplicación": {
"tipo": "http",
"URL": "https://tudominio.com/cipi/mcp",
"encabezados": {
"Autorización": "Portador YOUR_CIPI_MCP_TOKEN"
}
}
}
}
Reemplazar cipi-myapp, yourdomain.com, y
YOUR_CIPI_MCP_TOKEN
como arriba. uso MCP: Agregar servidor desde la paleta de comandos para una configuración guiada. Código VS
se conecta a través de HTTP: no se necesita puente.
Escritorio Claude
Claude Desktop requiere el mcp-remoto puente para convertir stdio a HTTP. Añade el
siguiendo a ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServidores": {
"cipi-mi aplicación": {
"comando": "npx",
"argos": [
"-y",
"mcp-remoto",
"https://tudominio.com/cipi/mcp",
"-encabezado",
"Autorización: Portador YOUR_CIPI_MCP_TOKEN"
]
}
}
}
Instalar mcp-remote globalmente una vez con:
$ npm install -g mcp-remote
¿Qué puedes hacer con él?
Una vez conectado, su asistente de IA puede interactuar con la aplicación administrada por Cipi de forma natural. idioma. Por ejemplo:
Usuario: Is the app healthy? Any pending jobs in the queue? Claudio: Calling health tool... Status: healthy — database, cache, and queue all OK. Queue: 0 pending jobs. Usuario: Show me the last errors from the log. Claudio: 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 [...] Usuario: Clear the cache and deploy the latest version. Claudio: Calling artisan tool (cache:clear)... Cache cleared successfully. Calling deploy tool... Deploy queued — Deployer will run within 1 minute. Usuario: What's the current migration status? Claudio: Calling artisan tool (migrate:status)... All 47 migrations have been run. Usuario: How many users signed up in the last 7 days? Claudio: Calling db_query tool (SELECT COUNT(*) FROM users WHERE created_at >= ...)... | count | |-------| | 23 |
CIPI_MCP_TOKEN secreto. Cualquiera que tenga el token puede activar despliegues,
leer registros, ejecutar consultas de bases de datos y ejecutar comandos Artisan a través del punto final MCP. si tu
sospechar una fuga, regenerar
la ficha con php artisan cipi:generate-token mcp y reinicie la aplicación.
POST /cipi/mcp en
el dominio de la aplicación, 6 herramientas, una base de datos/registros de una aplicación) vs. panel API MCP
(POST /mcp en el dominio API, 46 herramientas, servidor completo). Utilice el Agente MCP para
depuración específica de la aplicación; usarpanel API MCP para crear aplicaciones, administrar
SSL, o enumerar todas las bases de datos.Anonimizador de bases de datos
cipi-agenteincluye un anonimizador de base de datos incorporado que crea copias desinfectadas de su base de datos de producción: ideal para compartir con desarrolladores, equipos de control de calidad o entornos de prueba sin exponer datos reales del usuario. Es compatible con ambos MySQL y PostgreSQL, usos farsantetransformaciones basadas en JSON configuradas a través de un archivo y se ejecuta como un trabajo en segundo plano para que las bases de datos grandes no bloqueen HTTP solicitudes.
Esta característica vive dentro de tu Laravel aplicación (el cipi/agent
paquete). Es independiente de la copia de seguridad de la base de datos a nivel de servidor API expuesta por
cipi api — ver
Agente frente a Cipi API abajo.
Casos de uso
- Desarrollo local — proporcione a cada desarrollador un conjunto de datos realista sin copiar correos electrónicos de producción, direcciones o notas de pago
- Entornos de puesta en escena/vista previa — actualizar una base de datos que no sea de producción desde estructura y volumen de producción, con PII reemplazada
- Control de calidad y demostraciones — reproducir errores que dependen de datos relacionales sin riesgo de GDPR
- Acceso de proveedor o contratista — compartir un volcado de SQL cuando una VPN + producción completa el acceso no es aceptable
- Tuberías de CI - correr
cipi:anonymizeen el servidor o disparadorPOST /cipi/dbdesde un paso de automatización seguro
Requisitos previos
| Requisito | ¿Por qué? |
|---|---|
composer require cipi/agent |
El anonimizador es parte del paquete del agente, no del servidor Cipi CLI |
| Trabajador de cola en ejecución | POST /cipi/db despachos AnonymizeDatabaseJob - sin un
trabajador el trabajo nunca se ejecuta. Como raíz: cipi worker list myapp; como usuario de la aplicación:
sudo cipi-worker status myapp
|
mysqldump o pg_dump |
El comando se envía a la herramienta de volcado nativa para su controlador de base de datos. |
Laravel correo (MAIL_* en la aplicación .env) |
Las notificaciones de éxito y fracaso se envían a través del correo de Laravel, si falta SMTP o mal configurado, el trabajo de anonimización aún puede finalizar, pero no hay correo electrónico entregado y el enlace de descarga esta solo en ese mensaje |
anonymization.json en el servidor |
Debe existir en /home/{app_user}/.db/ o
/home/{app_user}/.cipi/ antes de activar un trabajo
|
Agente frente a Cipi API
Ambos componentes Cipi tocan bases de datos, pero resuelven problemas diferentes:
Anonimizador del agente (cipi/agent) |
Cipi API copias de seguridad (cipi/api) |
|
|---|---|---|
| Alcance | Una base de datos de la aplicación Laravel (de la base de datos de la aplicación) .env) |
Cualquier base de datos en el servidor Cipi (bóveda MariaDB) |
| Sigue funcionando | Dentro de la aplicación (PHP + trabajador de cola) | En el host Cipi a través de sudo cipi db … empleos |
| Salida | volcado de SQL con Transformado por un farsante columnas sensibles | Copia de seguridad completamente comprimida — datos reales, sin cambios |
| autenticación | CIPI_ANONYMIZER_TOKEN (por aplicación) |
Ficha de Santuario con dbs-manage (por servidor) |
| Punto final típico | POST https://myapp.com/cipi/db |
POST https://api.example.com/api/dbs/{name}/backup |
| RGPD/PII | Diseñado para compartir de forma segura: solo se transforman las columnas configuradas | Recuperación y clonación ante desastres: trate las copias de seguridad como un secreto de producción |
DbBackup cuando necesitas una instantánea fiel para
restaurar. Utilice el agente anonimizador cuando la gente necesita datos que mira
real pero no debe contener identidades reales. Puedes usar ambos en el mismo proyecto: respaldo para operaciones,
anonimizar para los humanos.como funciona
- Un autenticado
POST /cipi/dbsolicitud (con un destinatarioemail) colasAnonymizeDatabaseJob - el trabajo se ejecuta
php artisan cipi:anonymize, que:- vuelca la base de datos con
mysqldumpopg_dump - fluye a través de
INSERTdeclaraciones y reescribe sólo las columnas enumeradas enanonymization.json - escribe el resultado en
storage/cipi/anonymized_{jobId}.sql
- vuelca la base de datos con
- Si tiene éxito, Laravel envía un correo electrónico con un URL de descarga por tiempo limitado (15 minutos)
GET /cipi/db/{token}entrega el archivo, sin token de portador; la URL en sí es la credencial- En caso de error, se envía un correo electrónico de error en texto sin formato a la misma dirección.
Notificaciones por correo electrónico
HTTP API no devuelve la URL de descarga en la respuesta JSON: el correo electrónico es el único
canal de entrega para POST /cipi/db. Entender quién lo recibe y
lo que se debe configurar evita fallas silenciosas.
¿Quién recibe el correo electrónico?
Exactamente la dirección que pasas en el cuerpo JSON, nada más:
{ "correo electrónico": "desarrollador@ejemplo.com" }
- Éxito → HTML correo electrónico con el enlace de descarga firmado (15 minutos)
- Error → correo electrónico de texto sin formato con el error y el ID del trabajo
- Sin CC, BCC ni respaldo para el administrador Cipi,
CIPI_APP_USER, o una dirección fija en.env - Quien tenga
CIPI_ANONYMIZER_TOKENelige el destinatario en cada solicitud
Laravel el correo debe funcionar
Las notificaciones utilizan Laravel Mail fachada y sus aplicaciones
MAIL_* configuración: la misma configuración que el restablecimiento de contraseña o los formularios de contacto. esto es
independiente del servidor Cipi SMTP (cipi smtp configure para copia de seguridad/implementación
alertas en el host).
Producción típica .env entradas:
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}"
storage/cipi/anonymized_{jobId}.sql en el servidor incluso cuando el correo falla. El API
todavía regresado {"status":"queued"} inmediatamente, eso sólo significa que el trabajo fue
en cola, no es que la entrega del correo electrónico se haya realizado correctamente. comprobar storage/logs/laravel.log por correo
errores, verificar MAIL_*y enviar un mensaje de prueba antes de confiar en
POST /cipi/db en producción.
Prueba rápida de correo (como usuario de la aplicación, antes de su primera exportación):
$ php artisan tinker --execute="Mail::raw('Cipi prueba de correo anonimizador', fn (\$m) => \$m->to('you@example.com')->subject('Prueba de correo'));"
Si ese mensaje no llega, corrija primero el correo Laravel o use la ruta CLI
(php artisan cipi:anonymize) que escribe el archivo directamente y omite el correo electrónico.
Configuración: paso a paso
Ejecute estos comandos en el servidor como usuario de la aplicación (SS:
ssh myapp@your-server o sudo su - myapp como raíz - ver
SSH como usuario de la aplicación):
1. Instale el agente (si aún no está en composer.json):
$ composer require cipi/agent # commit, push, deploy — or run on the current release
2. Habilite el servicio y cree un token:
$ php artisan cipi:service anonymize --enable $ php artisan cipi:generate-token anonymize
3. Armar el archivo de configuración:
$ php artisan cipi:init-anonymize
Esto crea /home/{app_user}/.db/anonymization.json (permisos 0640)
desde la plantilla incorporada. El archivo vive fuera del repositorio de Git - nunca lo es
implementado con su código. uso --force para sobrescribir un archivo existente.
4. Edite la configuración para que coincida con sus tablas reales y columnas confidenciales (consulte Configuración).
5. Verificar cola y correo: confirme que el trabajador ejecuta trabajos y Laravel puede enviarlos al
dirección que pasarás POST /cipi/db (ver
Notificaciones por correo electrónico).
$ 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('Prueba de correo', fn (\$m) => \$m->to('you@example.com')->subject('Prueba de correo'));"
6. Active su primera exportación anónima a través de HTTP o CLI (ver ejemplos a continuación).
Configuración
Rutas válidas (el primer partido gana):
/home/{app_user}/.db/anonymization.json— recomendado/home/{app_user}/.cipi/anonymization.json— alternativa
El archivo JSON tiene dos claves de nivel superior: transformations (obligatorio) y
options (opcional).
{
"transformaciones": {
"usuarios": {
"nombre": "nombre falso",
"correo electrónico": "correo electrónico falso",
"contraseña": "contraseña",
"teléfono": "número de teléfono falso",
"dirección": "dirección falsa"
},
"órdenes": {
"notas_del_cliente": "párrafo falso",
"dirección_de_envío": "dirección falsa"
},
"tickets_de_soporte": {
"mensaje_usuario": "párrafo falso",
"respuesta_agente": "párrafo falso"
}
},
"opciones": {
"algoritmo_hash": "auto",
"preserve_ids": cierto,
"faker_locale": "en_US"
}
}
bajo transformations, cada clave es una nombre de la tabla. Las claves anidadas son
nombres de columnas; los valores son tipos de transformación (no nombres de métodos Faker sin formato; consulte
tabla siguiente). columnas no enumerados mantienen sus valores originales, por lo que puede anonimizar la PII mientras
preservar claves externas, enumeraciones y campos de lógica empresarial.
Transformaciones admitidas
| Transformación | Salida de ejemplo |
|---|---|
fakeName |
Nombre completo (por ejemplo, "Jane Cooper") |
fakeFirstName / fakeLastName |
Solo nombre o apellido |
fakeEmail |
Dirección de correo electrónico aleatoria |
fakeCompany |
Nombre de la empresa |
fakeAddress / fakeCity / fakePostcode |
Dirección, ciudad, código postal |
fakePhoneNumber |
Número de teléfono |
fakeDate |
Cadena de fecha aleatoria |
fakeUrl |
URL |
fakeParagraph |
Párrafo estilo Lorem (notas, biografías, cuerpos de las entradas) |
password |
Vuelve a aplicar el hash al valor usando hash_algorithm (bcrypt, argón o Laravel
auto) — utilizar en users.password entonces iniciar sesión todavía funciona con un
contraseña de prueba conocida si establece una antes del volcado o acepta hashes aleatorios
|
Opciones
| Opción | Predeterminado | Descripción |
|---|---|---|
hash_algorithm |
auto |
auto (Laravel predeterminado), bcrypt, argon,
argon2i, argon2d
|
faker_locale |
en_US |
Configuración regional falsa para nombres, direcciones, etc. (p. ej. it_IT,
de_DE)
|
preserve_ids |
true |
Reservado para uso futuro: las identificaciones se conservan a menos que agregue una id columna debajo
transformaciones
|
metadata, settingsy tablas de auditoría.HTTP API — puntos finales
| Método | Punto final | autenticación | Descripción |
|---|---|---|---|
| PUBLICAR | /cipi/db |
Portador CIPI_ANONYMIZER_TOKEN |
Trabajo de anonimización de colas; correo electrónico enviado cuando esté completo |
| PUBLICAR | /cipi/db/user |
Portador CIPI_ANONYMIZER_TOKEN |
resolver users.id desde correo electrónico (ayudante de depuración) |
| OBTENER | /cipi/db/{token} |
URL firmada (desde correo electrónico) | Descarga el .sql vertedero; caduca en 15 minutos |
Cuando el anonimizador está desactivado (CIPI_ANONYMIZER=false), las rutas regresan
404 — los puntos finales están completamente ocultos.
Ejemplos prácticos (rizo)
Establezca las variables una vez (reemplácelas con el dominio de su aplicación y el token de .env):
exportar APP_URL="https://miaplicación.ejemplo.com" exportar CIPI_ANONYMIZER_TOKEN="tu-token-de-env"
1. Poner en cola un trabajo de anonimización
curl -sS -X POST "${APP_URL}/cipi/db" \ -H "Autorización: Portador ${CIPI_ANONYMIZER_TOKEN}" \ -H "Tipo de contenido: aplicación/json" \ -H "Aceptar: solicitud/json" \ -d '{"correo electrónico": "desarrollador@ejemplo.com"}'
Respuesta exitosa (200):
{
"estado": "en cola",
"mensaje": "El trabajo de anonimización de la base de datos se ha puesto en cola. Recibirá un correo electrónico con instrucciones de descarga cuando se complete".,
"correo electrónico": "desarrollador@ejemplo.com"
}
La llamada HTTP regresa inmediatamente con status: queued - eso hace no
garantizar que se envió el correo electrónico de notificación. El procesamiento puede tardar unos minutos en bases de datos grandes (trabajo
tiempo de espera: 1 hora). El mensaje de finalización va sólo al email en tu cuerpo JSON; si
no llega nada, revisa storage/logs/laravel.log por errores en el transporte del correo,
php artisan queue:failed por un trabajo fallido, y que
MAIL_* está configurado (ver
Notificaciones por correo electrónico).
2. Descargue el volcado (desde el enlace del correo electrónico)
El correo electrónico de finalización contiene una URL como:
https://myapp.example.com/cipi/db/AbCdEf...?expires=1710000000&signature=...
Guárdelo con curl (pegue la URL completa del correo electrónico, sin encabezado de portador):
curl -sS -L -o anonymized.sql "PASTE_FULL_SIGNED_URL_FROM_EMAIL" # Import locally (MySQL example) mysql -u root -p myapp_local < anonymized.sql
Devuelven enlaces caducados o no válidos 410 Gone o 404. Solicitar una nueva exportación con
POST /cipi/db si pasó la ventana de 15 minutos.
3. Busque una identificación de usuario por correo electrónico
Después de la anonimización, los correos electrónicos son falsos, pero los ID de usuario siguen siendo los mismos. Usa esto antes anonimizar para asignar un correo electrónico de producción conocido a una identificación que puede encontrar más adelante en el volcado:
curl -sS -X POST "${APP_URL}/cipi/db/usuario" \ -H "Autorización: Portador ${CIPI_ANONYMIZER_TOKEN}" \ -H "Tipo de contenido: aplicación/json" \ -d '{"correo electrónico": "cliente@producción.com"}'
{
"id_usuario": 42,
"correo electrónico": "cliente@producción.com",
"encontrado_en": "2026-06-10T14:22:01+00:00"
}
Esto consulta el vivo. users tabla: ejecuta solo cuando se te permite tocar la producción
datos. No modifica nada.
4. Respuestas de error (solución de problemas)
| HTTP | Significado | Arreglar |
|---|---|---|
| 403 | Token de portador no válido o faltante | Regenerar con php artisan cipi:generate-token anonymize |
| 404 | Servicio deshabilitado o falta el archivo de configuración | cipi:service anonymize --enable ycipi:init-anonymize
|
| 422 | Falta o no es válida email en el cuerpo JSON |
enviar {"email":"you@example.com"} |
| 400 | JSON no válido o vacío transformations |
Validar anonymization.json sintaxis y contenido |
| 500 | Token no configurado, error de base de datos o falta herramienta de volcado | comprobar .env, mysqldump/pg_dump, Laravel registros
|
| — | API devuelto queued pero no hay correo electrónico (es posible que el trabajo se haya realizado correctamente) |
verificar MAIL_* y enviar una prueba con
php artisan tinker; leer storage/logs/laravel.log para SMTP
errores - o uso cipi:anonymize en el servidor para obtener el archivo sin correo
|
CLI — ejecutar sin HTTP
Para scripts, cron o exportaciones únicas en el servidor:
$ php artisan cipi:anonymize \
/home/myapp/.db/anonymization.json \
/home/myapp/anonymized_export.sql
El comando imprime tres pasos (volcar → transformar → guardar) y sale de un valor distinto de cero en caso de falla. no lo hace enviar correo electrónico: copie el archivo a través de SCP o su propio canal seguro.
Curl de comparación: Cipi API copia de seguridad sin formato
Como referencia, un no anonimizado copia de seguridad del servidor a través de Cipi API se ve así (diferente host, token y semántica):
exportar CIPI_API_URL="https://api.myserver.com" exportar CIPI_API_TOKEN="token-sanctum-con-administración-dbs" curl -sS -X POST "${CIPI_API_URL}/api/dbs/myapp_db/backup" \ -H "Autorización: Portador ${CIPI_API_TOKEN}" \ -H "Aceptar: solicitud/json"
eso regresa 202 con un job_id - encuesta GET /api/jobs/{id} para
la ruta de respaldo en el servidor. El archivo contiene datos reales de producción; restringir
acceder en consecuencia.
Consejos de seguridad y RGPD
- Tienda
CIPI_ANONYMIZER_TOKENen la gestión de secretos: cualquiera que lo tenga puede poner en cola los volcados y consulta/cipi/db/user - Gire la ficha después de los cambios de equipo:
php artisan cipi:generate-token anonymize - Desactivar cuando no sea necesario:
php artisan cipi:service anonymize --disable(los puntos finales devuelven 404) - Los enlaces de descarga caducan en 15 minutos — reenviar correos electrónicos con cuidado
- Documente qué columnas se transforman para su DPA/política de privacidad
- Pruebe el volcado: grep para un correo electrónico de producción conocido; no debería aparecer si
fakeEmailestaba establecido en esa columna
/home/{app_user}/.db/ ya está excluido de las implementaciones). nunca te comprometas
anonymization.json al control de versiones.
Seguridad
Cipi Usos del agente defensa en profundidad: cada característica tiene su propio token de portador y puede ser desactivado de forma independiente. Cuando están deshabilitadas, las rutas regresan 404 (oculto, no 403).
Aislamiento de tokens
| Característica | Variable simbólica | Punto final |
|---|---|---|
| Webhook implementar | CIPI_WEBHOOK_TOKEN |
POST /cipi/webhook |
| control de salud | CIPI_HEALTH_TOKEN (respaldo: webhook token) |
GET /cipi/health |
| MCP servidor | CIPI_MCP_TOKEN |
POST /cipi/mcp |
| Anonimizador de base de datos | CIPI_ANONYMIZER_TOKEN |
POST /cipi/db, POST /cipi/db/user |
Webhook verificación
- GitHub —
X-Hub-Signature-256HMAC-SHA256 - GitLab —
X-Gitlab-Tokencomparación de encabezados
Código fuente y versiones: github.com/cipi-sh/agent (MIT).
Variables ENV
Estas variables son inyectadas automáticamente por Cipi en la aplicación.env durante
cipi app create. Alternar funciones opcionales con
php artisan cipi:service {type} --enable|--disable o configurarlos manualmente.
| variable | Descripción | Predeterminado |
|---|---|---|
| CIPI_WEBHOOK_TOKEN | Secreto para la autenticación webhook (token GitHub HMAC / GitLab) | generado automáticamente |
| CIPI_APP_USER | Nombre de usuario de Linux para esta aplicación (rutas, script de implementación) | configuración automática |
| CIPI_PHP_VERSION | PHP versión reportada en el control de estado | sistema PHP |
| CIPI_DEPLOY_SCRIPT | Ruta a la configuración del implementador | ~/.deployer/deploy.php |
| CIPI_DEPLOY_BRANCH | Rama que desencadena una implementación (vacío = cualquier sucursal) | vacío |
| CIPI_ROUTE_PREFIX | Prefijo de URL para todas las rutas de agentes | cipi |
| CIPI_LOG_CHANNEL | Laravel canal de registro para eventos de implementación | nulo |
| CIPI_HEALTH_CHECK | Habilitar /cipi/health |
true |
| CIPI_HEALTH_TOKEN | Token de portador para salud (vuelve a webhook token) | ninguno |
| CIPI_MCP | Habilitar /cipi/mcp |
false |
| CIPI_MCP_TOKEN | Token al portador para MCP | ninguno |
| CIPI_ANONYMIZER | Habilitar anonimizador en /cipi/db |
false |
| CIPI_ANONYMIZER_TOKEN | Token de portador para anonimizador | ninguno |
php artisan cipi:generate-token {type} para generar tokens para
mcp, health, o anonymize. uso
php artisan cipi:service {type} --enable|--disablepara alternar servicios: el
El comando actualiza tu .env en su lugar.