Cipi Agente
Instalando o Agente Cipi
Cipi Agente (cipi/agent no Packagista) é o companheiro oficial de Laravel para
Cipi. Ele conecta seu aplicativo e o painel de controle do servidor com:
- Implantações acionadas por Webhook de GitHub e GitLab
- Monitoramento de integridade (aplicativo, banco de dados, cache, fila, commit de implantação)
- Um aplicativo Servidor MCP para assistentes de IA (Cursor, VS Code, Claude Desktop)
- Orientado para GDPR anonimizador de banco de dados
Em um servidor gerenciado por Cipi, cipi app create injeta o necessário .env
variáveis automaticamente. A verificação de integridade e MCP podem funcionar em qualquer host Laravel; implantação completa e registro
o acesso espera um ambiente gerenciado por Cipi.
Requisitos
| Requisito | Versão |
|---|---|
| PHP | 8.3+ |
| Laravel | 12+ ou 13+ (pacote 1.5.2+) |
| Banco de dados (anonimizador) | MySQL ou PostgreSQL |
| Ferramentas CLI (anonimizador) | mysqldump ou pg_dump no servidor |
$ composer require cipi/agent
O provedor de serviços descobre automaticamente — não config/app.php é necessária uma mudança. Após a instalação,
comprometer e empurrar; Cipi implanta a atualização na próxima versão.
Opcional — publique o arquivo de configuração (não Cipi ou padrões personalizados):
$ php artisan vendor:publish --tag=cipi-config $ php artisan cipi:status # verify config and DB connectivity
/cipi/* no domínio do aplicativo). O nível do servidor
cipi/api pacote é executado em um vhost API separado e
gerencia todo o servidor - veja Agente vs Cipi API.Comandos Artisan
| Comando | Descrição |
|---|---|
| php artisan cipi:estado | Mostrar valores de configuração Cipi e status de conectividade |
| php artisan cipi:chave de implantação | Imprima a chave de implantação SSH para este aplicativo |
| php artisan cipi:mcp | Mostrar o URL do endpoint MCP e snippets de configuração para Cursor, VS Code e Claude Desktop |
| php artisan cipi:gerar token {tipo} | Gere um token seguro. O tipo pode ser mcp, health, ou
anonymize
|
| php artisan cipi:serviço {tipo} --enable|--disable | Ative ou desative um serviço. Atualizações .env no lugar. Tipo:
mcp, health, ou anonymize
|
| php artisan cipi:init-anonimizar | Crie a configuração de anonimato em
/home/{app_user}/.db/anonymization.json
|
| php artisan cipi:anonimizar {config} {saída} | Execute um dump de banco de dados anônimo diretamente de CLI (sem HTTP) |
Webhook — Implantações automáticas
O agente expõe um endpoint POST em /cipi/webhook. Quando seu provedor Git envia um push
evento, o agente verifica a assinatura e escreve um .deploy-trigger arquivo de bandeira. Um cron
job sendo executado a cada minuto enquanto o usuário do aplicativo detecta esse arquivo, o remove e executa o Deployer no
fundo.
Este design significa que a resposta webhook é instantânea (sem tempo limite de HTTP aguardando a implantação para
concluído) e o Deployer é executado com as permissões de usuário corretas — não sudo necessário.
Configure seu provedor Git
| Provedor | Webhook URL | Autenticação |
|---|---|---|
| GitHub | https://yourdomain.com/cipi/webhook | X-Hub-Signature-256 HMAC – uso CIPI_WEBHOOK_TOKEN como segredo |
| GitLab | https://yourdomain.com/cipi/webhook | X-Gitlab-Token cabeçalho – mesmo valor de token |
O token a ser usado é armazenado em .env como CIPI_WEBHOOK_TOKEN. Você também pode
recupere-o a qualquer momento com:
$ cipi deploy myapp --webhook
Filtragem de ramificação
Por padrão, cada push aciona uma implantação. Para restringir implantações a uma ramificação específica, adicione isto ao seu
.env:
CIPI_DEPLOY_BRANCH=main
Pushes para qualquer outro branch receberão um skipped resposta e nenhuma implantação será
acionado.
Verificação de saúde
O agente também expõe um endpoint GET em /cipi/health que retorna uma carga útil JSON com
o status do aplicativo, banco de dados, cache, fila e o hash de commit do Git atualmente implantado. Útil
para serviços de monitoramento externo, como UptimeRobot. Protegido pelo
CIPI_HEALTH_TOKEN Token do portador — gere um com
php artisan cipi:generate-token health.
$ curl -H "Authorization: Bearer YOUR_CIPI_HEALTH_TOKEN" \
https://yourdomain.com/cipi/health
{
"estado": "saudável",
"app_user": "meu aplicativo",
"php": "8.5",
"laravel": "12.0.0",
"meio ambiente": "produção",
"cheques": {
"aplicativo": { "ok": verdade, "versão": "2.1.0", "depurar": falso },
"banco de dados": { "ok": verdade, "banco de dados": "meuapp_prod" },
"cache": { "ok": verdade },
"fila": { "ok": verdade, "trabalhos_pendentes": 0 },
"implantar": { "ok": verdade, "comprometer-se": "a1b2c3d4…", "short_commit": "a1b2c3d" }
},
"carimbo de data/hora": "2026-06-10T14:22:01.000000Z"
}
O commit de implantação é resolvido a partir da primeira fonte disponível:
/home/{app_user}/.cipi/deploy.json(Cipi implantar metadados)/home/{app_user}/.cipi/last_commit/home/{app_user}/logs/deploy.log.git/HEADougit rev-parse HEAD
Autenticação
O token do portador é resolvido na seguinte ordem: CIPI_HEALTH_TOKEN (dedicado), então
CIPI_WEBHOOK_TOKEN (cair pra trás). Desative totalmente o endpoint com
php artisan cipi:service health --disable ou CIPI_HEALTH_CHECK=false.
Monitorando integrações
O endpoint de integridade funciona com qualquer verificador HTTP que suporte tokens Bearer – por exemplo.
UptimeRobot, Melhor pilha, Grafanaou personalizado
MCP + curl. Enquete checks.queue.pending_jobs para alertas de pendências de fila.
MCP Servidor
cipi-agente inclui um embutido Servidor MCP (Protocolo de Contexto Modelo)
que expõe seu aplicativo a assistentes de IA, como Cursor,
Código VS (com GitHub Copiloto), e Claude Desktop. O ponto final
implementa MCP 05/11/2024 sobre HTTP usando JSON-RPC 2.0
e é protegido pelo CIPI_MCP_TOKEN Token do portador.
O endpoint MCP está disponível em POST /cipi/mcp e está desabilitado por padrão. Para habilitar
isso:
$ php artisan cipi:service mcp --enable $ php artisan cipi:generate-token mcp
Ferramentas disponíveis
O servidor MCP expõe seis ferramentas que um assistente de IA pode invocar pelo nome:
| Ferramenta | Descrição |
|---|---|
| saúde | Status do aplicativo, do banco de dados, do cache e da fila — os mesmos dados do
/cipi/health ponto final
|
| app_info | Configuração completa do aplicativo: usuário do aplicativo, versão PHP, versão Laravel, ambiente, drivers de fila/cache/sessão, ramificação de implantação e todos os URLs Cipi |
| implantar | Acione uma nova implantação com tempo de inatividade zero — escreve o
.deploy-trigger arquivo; O implantador o pega em 1 minuto
|
| registros | Leia as últimas N linhas (padrão 50, máximo 500) dos logs do aplicativo. Suporta
type (laravel, nginx, php,
worker, deploy), level para gravidade Laravel
filtragem (por ex. error) e search para filtragem de palavras-chave.
Laravel rotação diária (laravel-YYYY-MM-DD.log) é detectado automaticamente.
|
| db_query | Execute consultas SQL no banco de dados do aplicativo — equivalente a
cipi app tinker. Suporta SELECT, SHOW, DESCRIBE, EXPLAIN (ler) e
INSERIR, ATUALIZAR, EXCLUIR (escrever). Resultados formatados como tabela ASCII, limitados a 100 linhas.
DDL destrutivo (DROP TABLE/DATABASE, TRUNCATE, GRANT/REVOKE, E/S de arquivo) é bloqueado.
|
| artisan | Execute qualquer comando Artisan (por exemplo migrate:status,
queue:size, cache:clear). Longa duração e interativo
comandos como serve, queue:worke
tinker estão bloqueados
|
logs parâmetros da ferramenta
| Parâmetro | Valores | Descrição |
|---|---|---|
type |
laravel, nginx, php, worker,
deploy |
Arquivo de log para leitura (Laravel rotação diária detectada automaticamente) |
level |
debug … emergency |
Gravidade mínima — Laravel somente registros |
search |
qualquer sequência | Filtro de palavras-chave que não diferencia maiúsculas de minúsculas; rastreamentos de pilha permanecem intactos |
lines |
1–500 (padrão 50) | Número de linhas a retornar |
Operações bloqueadas (segurança MCP)
- Artisan:
serve,tinker,queue:work,queue:listen,schedule:work,horizon,octane:start,reverb:start - SQL:
DROP,TRUNCATE,GRANT,REVOKE, E/S de arquivo – leitura/gravação limitada em 100 linhas
Instruções de configuração
Execute o cipi:mcp Comando Artisan para obter o URL do endpoint e pronto para colar
trechos de configuração para seu cliente de IA:
$ php artisan cipi:mcp
O comando imprime as ferramentas disponíveis e a configuração JSON para Cursor, VS Code e Claude Área de trabalho.
Cursor
Adicione o seguinte a ~/.cursor/mcp.json (ou vá para Cursor → Configurações → MCP):
{
"mcpServidores": {
"cipi-meuapp": {
"tipo": "http",
"URL": "https://seudominio.com/cipi/mcp",
"cabeçalhos": {
"Autorização": "Portador YOUR_CIPI_MCP_TOKEN"
}
}
}
}
Substituir cipi-myapp com o nome de usuário do seu aplicativo, yourdomain.com com o seu
domínio real, e YOUR_CIPI_MCP_TOKEN com o token do seu
.env. O cursor se conecta nativamente através de HTTP — sem necessidade de ponte.
Código VS
O VS Code (com GitHub Copilot) suporta MCP nativamente desde a versão 1.102. Adicione o seguinte a
.vscode/mcp.json em seu projeto (ou execute MCP: Abrir configuração do usuário
para uma configuração global):
{
"servidores": {
"cipi-meuapp": {
"tipo": "http",
"URL": "https://seudominio.com/cipi/mcp",
"cabeçalhos": {
"Autorização": "Portador YOUR_CIPI_MCP_TOKEN"
}
}
}
}
Substituir cipi-myapp, yourdomain.come
YOUR_CIPI_MCP_TOKEN
como acima. Usar MCP: Adicionar servidor na paleta de comandos para uma configuração guiada. Código VS
conecta-se através de HTTP — nenhuma ponte é necessária.
Claude Desktop
Claude Desktop requer o mcp-remoto bridge para converter stdio em HTTP. Adicione o
seguindo para ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServidores": {
"cipi-meuapp": {
"comando": "NPX",
"argumentos": [
"-você",
"mcp-remoto",
"https://seudominio.com/cipi/mcp",
"-cabeçalho",
"Autorização: Portador YOUR_CIPI_MCP_TOKEN"
]
}
}
}
Instalar mcp-remote globalmente uma vez com:
$ npm install -g mcp-remote
O que você pode fazer com isso
Uma vez conectado, seu assistente de IA pode interagir com o aplicativo gerenciado por Cipi naturalmente linguagem. Por exemplo:
Usuário: Is the app healthy? Any pending jobs in the queue? Cláudio: Calling health tool... Status: healthy — database, cache, and queue all OK. Queue: 0 pending jobs. Usuário: Show me the last errors from the log. Cláudio: 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 [...] Usuário: Clear the cache and deploy the latest version. Cláudio: Calling artisan tool (cache:clear)... Cache cleared successfully. Calling deploy tool... Deploy queued — Deployer will run within 1 minute. Usuário: What's the current migration status? Cláudio: Calling artisan tool (migrate:status)... All 47 migrations have been run. Usuário: How many users signed up in the last 7 days? Cláudio: Calling db_query tool (SELECT COUNT(*) FROM users WHERE created_at >= ...)... | count | |-------| | 23 |
CIPI_MCP_TOKEN segredo. Qualquer pessoa com o token pode acionar implantações,
leia logs, execute consultas de banco de dados e execute comandos Artisan por meio do endpoint MCP. Se você
suspeitar de um vazamento, regenerar
o token com php artisan cipi:generate-token mcp e reinicie o aplicativo.
POST /cipi/mcp ligado
o domínio do aplicativo, 6 ferramentas, banco de dados/logs de um aplicativo) vs. painel API MCP
(POST /mcp no domínio API, 46 ferramentas, servidor inteiro). Use o Agente MCP para
depuração específica do aplicativo; usarpainel API MCP para criar aplicativos, gerenciar
SSL ou liste todos os bancos de dados.Anonimizador de banco de dados
cipi-agenteinclui um anonimizador de banco de dados integrado que cria cópias limpas de seu banco de dados de produção — ideal para compartilhar com desenvolvedores, equipes de controle de qualidade ou ambientes de teste sem expor dados reais do usuário. Suporta ambos MCP e MySQL, usa Falsificadortransformações baseadas em -configuradas por meio de um arquivo JSON e executadas como um trabalho em segundo plano para que bancos de dados grandes não bloqueiem solicitações HTTP.
Esse recurso reside dentro do seu Laravel aplicativo (o cipi/agent
pacote). Ele é separado do backup de banco de dados em nível de servidor API exposto por
cipi api - veja
Agente vs Cipi API abaixo.
Casos de uso
- Desenvolvimento local - forneça a cada desenvolvedor um conjunto de dados realista sem copiar e-mails de produção, endereços ou notas de pagamento
- Ambientes de preparação/visualização — atualizar um banco de dados que não seja de produção estrutura e volume de produção, com PII substituído
- Controle de qualidade e demonstrações — reproduzir bugs que dependem de dados relacionais sem risco do GDPR
- Acesso de fornecedor ou contratado — compartilhe um dump SQL quando uma VPN completa + produção o acesso não é aceitável
- Pipelines de CI - correr
cipi:anonymizeno servidor ou gatilhoPOST /cipi/dbde uma etapa de automação segura
Pré-requisitos
| Requisito | Por que |
|---|---|
composer require cipi/agent |
O anonimizador faz parte do pacote do agente, não do servidor Cipi CLI |
| Trabalhador de fila em execução | POST /cipi/db despachos AnonymizeDatabaseJob - sem um
trabalhador, o trabalho nunca é executado. Como raiz: cipi worker list myapp; como usuário do aplicativo:
sudo cipi-worker status myapp
|
mysqldump ou pg_dump |
O comando é enviado para a ferramenta de dump nativa do seu driver de banco de dados |
Laravel e-mail (MAIL_* no aplicativo .env) |
Notificações de sucesso e falha são enviadas através do mailer de Laravel — se o SMTP estiver faltando ou configurado incorretamente, o trabalho de anonimato ainda pode ser concluído, mas nenhum e-mail é entregue e o link para download está apenas nessa mensagem |
anonymization.json no servidor |
Deve existir em /home/{app_user}/.db/ ou
/home/{app_user}/.cipi/ antes de acionar um trabalho
|
Agente vs Cipi API
Ambos os componentes Cipi tocam bancos de dados, mas resolvem problemas diferentes:
Anonimizador de agente (cipi/agent) |
Cipi API backups (cipi/api) |
|
|---|---|---|
| Escopo | Um banco de dados do aplicativo Laravel (do aplicativo .env) |
Qualquer banco de dados no servidor Cipi (cofre MariaDB) |
| Continua | Dentro do aplicativo (PHP + trabalhador da fila) | No host Cipi via sudo cipi db … empregos |
| Saída | Despejo SQL com Transformado em Faker colunas sensíveis | Backup compactado completo — dados reais, inalterados |
| Autenticação | CIPI_ANONYMIZER_TOKEN (por aplicativo) |
Token do Santuário com dbs-manage (por servidor) |
| Ponto final típico | POST https://myapp.com/cipi/db |
POST https://api.example.com/api/dbs/{name}/backup |
| GDPR/PII | Projetado para compartilhamento seguro — apenas colunas configuradas são transformadas | Recuperação de desastres e clonagem — trate os backups como segredo de produção |
DbBackup quando você precisa de um instantâneo fiel para
restaurar. Use o anonimizador de agente quando as pessoas precisam de dados que parece
real, mas não deve conter identidades reais. Você pode usar ambos no mesmo projeto: backup para operações,
anonimizar para humanos.Como funciona
- Um autenticado
POST /cipi/dbsolicitação (com um destinatárioemail) filasAnonymizeDatabaseJob - O trabalho é executado
php artisan cipi:anonymize, que:- despeja o banco de dados com
mysqldumpoupg_dump - flui através
INSERTdeclarações e reescreve apenas as colunas listadas emanonymization.json - escreve o resultado em
storage/cipi/anonymized_{jobId}.sql
- despeja o banco de dados com
- Em caso de sucesso, Laravel envia um e-mail com um URL de download por tempo limitado (15 minutos)
GET /cipi/db/{token}entrega o arquivo — sem token de portador; o URL em si é o credencial- Em caso de falha, um e-mail de erro em texto simples é enviado para o mesmo endereço
Notificações por e-mail
O HTTP API não retorna o URL de download na resposta JSON — e-mail é o único
canal de entrega para POST /cipi/db. Entender quem recebe e
o que deve ser configurado evita falhas silenciosas.
Quem recebe o e-mail?
Exatamente o endereço que você passa no corpo de JSON — nada mais:
{ "e-mail": "desenvolvedor@exemplo.com" }
- Sucesso → HTML e-mail com link de download assinado (15 minutos)
- Falha → e-mail de texto simples com o erro e o ID do trabalho
- Sem CC, CCO ou substituto para o administrador Cipi,
CIPI_APP_USER, ou um endereço fixo em.env - Quem segura
CIPI_ANONYMIZER_TOKENescolhe o destinatário em cada solicitação
Laravel e-mail deve funcionar
As notificações usam Laravel's Mail fachada e sua aplicação
MAIL_* configurações – a mesma configuração de redefinições de senha ou formulários de contato. Isto é
independente do servidor Cipi SMTP (cipi smtp configure para backup/implantação
alertas no host).
Produção 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 no servidor mesmo quando o correio falhou. O API
ainda voltou {"status":"queued"} imediatamente - isso significa apenas que o trabalho foi
na fila, não que a entrega do e-mail tenha sido bem-sucedida. Verifique storage/logs/laravel.log para correio
erros, verifique MAIL_*e envie uma mensagem de teste antes de confiar
POST /cipi/db em produção.
Teste rápido de e-mail (como usuário do aplicativo, antes da primeira exportação):
$ php artisan tinker --execute="Mail::raw('Cipi teste de email anonimizador', fn (\$m) => \$m->to('you@example.com')->subject('Mail test'));"
Se essa mensagem não chegar, corrija o e-mail Laravel primeiro – ou use o caminho CLI
(php artisan cipi:anonymize) que grava o arquivo diretamente e ignora o email.
Configuração – passo a passo
Execute estes comandos no servidor como usuário do aplicativo (SSH:
ssh myapp@your-server ou sudo su - myapp como root - veja
SSH como usuário do aplicativo):
1. Instale o agente (se ainda não estiver em composer.json):
$ composer require cipi/agent # commit, push, deploy — or run on the current release
2. Habilite o serviço e crie um token:
$ php artisan cipi:service anonymize --enable $ php artisan cipi:generate-token anonymize
3. Crie o arquivo de configuração:
$ php artisan cipi:init-anonymize
Isso cria /home/{app_user}/.db/anonymization.json (permissões 0640)
do modelo integrado. O arquivo vive fora do repositório Git - nunca é
implantado com seu código. Usar --force para substituir um arquivo existente.
4. Edite a configuração para corresponder às suas tabelas reais e colunas confidenciais (consulte Configuração).
5. Verifique a fila e o correio: confirme se o trabalhador executa tarefas e Laravel pode enviar para o
endereço que você vai passar POST /cipi/db (veja
Notificações por e-mail).
$ 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. Acione sua primeira exportação anônima via HTTP ou CLI (veja exemplos abaixo).
Configuração
Caminhos válidos (vitórias na primeira partida):
/home/{app_user}/.db/anonymization.json- recomendado/home/{app_user}/.cipi/anonymization.json- alternativa
O arquivo JSON possui duas chaves de nível superior: transformations (obrigatório) e
options (opcional).
{
"transformações": {
"usuários": {
"nome": "nome falso",
"e-mail": "E-mail falso",
"senha": "senha",
"telefone": "número de telefone falso",
"endereço": "endereço falso"
},
"ordens": {
"notas_docliente": "parágrafo falso",
"endereço_de_envio": "endereço falso"
},
"suporte_tickets": {
"mensagem_do_usuário": "parágrafo falso",
"agente_resposta": "parágrafo falso"
}
},
"opções": {
"hash_algoritmo": "automático",
"preserve_ids": verdade,
"faker_locale": "en_US"
}
}
Abaixo transformations, cada chave é um nome da tabela. As chaves aninhadas são
nomes de colunas; valores são tipos de transformação (não nomes brutos de métodos Faker - consulte
tabela abaixo). Colunas não listados mantêm seus valores originais, para que você possa anonimizar as PII enquanto
preservando chaves estrangeiras, enumerações e campos de lógica de negócios.
Transformações suportadas
| Transformação | Exemplo de saída |
|---|---|
fakeName |
Nome completo (por exemplo, "Jane Cooper") |
fakeFirstName / fakeLastName |
Somente nome ou sobrenome |
fakeEmail |
Endereço de e-mail aleatório |
fakeCompany |
Nome da empresa |
fakeAddress / fakeCity / fakePostcode |
Endereço, cidade, código postal |
fakePhoneNumber |
Número de telefone |
fakeDate |
Sequência de data aleatória |
fakeUrl |
URL |
fakeParagraph |
Parágrafo estilo Lorem (notas, biografias, corpos de tickets) |
password |
Refaz o hash do valor usando hash_algorithm (bcrypt, argônio ou Laravel
auto) — usar em users.password então o login ainda funciona com um
senha de teste conhecida se você definir uma antes do dump ou aceitar hashes aleatórios
|
Opções
| Opção | Padrão | Descrição |
|---|---|---|
hash_algorithm |
auto |
auto (Laravel padrão), bcrypt, argon,
argon2i, argon2d
|
faker_locale |
en_US |
Local falso para nomes, endereços, etc. it_IT,
de_DE)
|
preserve_ids |
true |
Reservado para uso futuro — os IDs são mantidos, a menos que você adicione um id coluna abaixo
transformações
|
metadata, settingse tabelas de auditoria.HTTP API — pontos finais
| Método | Ponto final | Autenticação | Descrição |
|---|---|---|---|
| POSTAR | /cipi/db |
Portador CIPI_ANONYMIZER_TOKEN |
Trabalho de anonimato de fila; e-mail enviado quando concluído |
| POSTAR | /cipi/db/user |
Portador CIPI_ANONYMIZER_TOKEN |
Resolver users.id do e-mail (ajudante de depuração) |
| OBTER | /cipi/db/{token} |
URL assinado (do e-mail) | Baixe o .sql jogar fora; expira em 15 minutos |
Quando o anonimizador está desativado (CIPI_ANONYMIZER=false), rotas retornam
404 — os pontos finais ficam totalmente ocultos.
Exemplos práticos (curl)
Defina variáveis uma vez (substitua pelo domínio do seu aplicativo e token de .env):
exportar APP_URL="https://myapp.example.com" exportar CIPI_ANONYMIZER_TOKEN="seu-token-do-env"
1. Coloque um trabalho de anonimato na fila
curl -sS -X POST "${APP_URL}/cipi/db" \ -H "Autorização: Portador ${CIPI_ANONYMIZER_TOKEN}" \ -H "Tipo de conteúdo: aplicativo/json" \ -H "Aceitar: aplicativo/json" \ -d '{"email": "desenvolvedor@example.com"}'
Resposta bem-sucedida (200):
{
"estado": "na fila",
"mensagem": "O trabalho de anonimato do banco de dados foi colocado na fila. Você receberá um e-mail com instruções de download quando concluído.",
"e-mail": "desenvolvedor@exemplo.com"
}
A chamada HTTP retorna imediatamente com status: queued - isso faz não
garantir que o e-mail de notificação foi enviado. O processamento pode levar minutos em bancos de dados grandes (trabalho
tempo limite: 1 hora). A mensagem de conclusão vai apenas para o email no seu corpo JSON; se
nada chega, verifique storage/logs/laravel.log para erros de transporte de correio,
php artisan queue:failed por um trabalho fracassado, e isso
MAIL_* está configurado (veja
Notificações por e-mail).
2. Baixe o dump (do link do e-mail)
O e-mail de conclusão contém um URL como:
https://myapp.example.com/cipi/db/AbCdEf...?expires=1710000000&signature=...
Salve-o com curl (cole o URL completo do e-mail – sem cabeçalho do 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
Retorno de links expirados ou inválidos 410 Gone ou 404. Solicite uma nova exportação com
POST /cipi/db se a janela de 15 minutos passou.
3. Procure um ID de usuário por e-mail
Após o anonimato, os e-mails são falsos — mas IDs de usuário permanecem os mesmos. Use isto antes anonimato para mapear um e-mail de produção conhecido para um ID que você pode encontrar posteriormente no despejo:
curl -sS -X POST "${APP_URL}/cipi/db/usuário" \ -H "Autorização: Portador ${CIPI_ANONYMIZER_TOKEN}" \ -H "Tipo de conteúdo: aplicativo/json" \ -d '{"email": "cliente@produção.com"}'
{
"id_usuário": 42,
"e-mail": "cliente@produção.com",
"encontrado_em": "2026-06-10T14:22:01+00:00"
}
Isso consulta o live users tabela – execute somente quando você tiver permissão para tocar na produção
dados. Não modifica nada.
4. Respostas de erro (solução de problemas)
| HTTP | Significado | Correção |
|---|---|---|
| 403 | Token do portador inválido ou ausente | Regenerar com php artisan cipi:generate-token anonymize |
| 404 | Serviço desativado ou arquivo de configuração ausente | cipi:service anonymize --enable ecipi:init-anonymize
|
| 422 | Ausente ou inválido email no corpo JSON |
Enviar {"email":"you@example.com"} |
| 400 | JSON inválido ou vazio transformations |
Validar anonymization.json sintaxe e conteúdo |
| 500 | Token não configurado, erro de banco de dados ou ferramenta de dump ausente | Verifique .env, mysqldump/pg_dump, Laravel registros
|
| — | API retornado queued mas nenhum e-mail (o trabalho pode ter sido bem-sucedido) |
Verifique MAIL_* e envie um teste com
php artisan tinker; leia storage/logs/laravel.log para SMTP
erros - ou usar cipi:anonymize no servidor para obter o arquivo sem email
|
CLI — execute sem HTTP
Para scripts, cron ou exportações únicas no servidor:
$ php artisan cipi:anonymize \
/home/myapp/.db/anonymization.json \
/home/myapp/anonymized_export.sql
O comando imprime três etapas (despejar → transformar → salvar) e sai diferente de zero em caso de falha. Não enviar email – copie o arquivo via SCP ou seu próprio canal seguro.
Curl de comparação: Cipi API backup bruto
Para referência, um não anonimizado backup do servidor via Cipi API fica assim (host, token e semântica diferentes):
exportar CIPI_API_URL="https://api.myserver.com" exportar CIPI_API_TOKEN="sanctum-token-com-dbs-manage" curl -sS -X POST "${CIPI_API_URL}/api/dbs/myapp_db/backup" \ -H "Autorização: Portador ${CIPI_API_TOKEN}" \ -H "Aceitar: aplicativo/json"
Isso retorna 202 com um job_id - enquete GET /api/jobs/{id} para
o caminho de backup no servidor. O arquivo contém dados reais de produção; restringir
acesse adequadamente.
Dicas de segurança e GDPR
- Loja
CIPI_ANONYMIZER_TOKENno gerenciamento de segredos – qualquer pessoa com ele pode enfileirar dumps e consulta/cipi/db/user - Gire o token após mudanças de equipe:
php artisan cipi:generate-token anonymize - Desative quando não for necessário:
php artisan cipi:service anonymize --disable(pontos finais retornam 404) - Os links para download expiram em 15 minutos - encaminhe e-mails com cuidado
- Documente quais colunas são transformadas para sua DPA/política de privacidade
- Teste o dump: grep para um e-mail de produção conhecido - ele não deve aparecer se
fakeEmailfoi definido naquela coluna
/home/{app_user}/.db/ já está excluído das implantações). Nunca se comprometa
anonymization.json para controle de versão.
Segurança
Cipi Agente usa defesa em profundidade: cada recurso tem seu próprio token de portador e pode ser desativado de forma independente. Quando desativado, as rotas retornam 404 (oculto, não 403).
Isolamento de token
| Recurso | Variável de token | Ponto final |
|---|---|---|
| Webhook implantar | CIPI_WEBHOOK_TOKEN |
POST /cipi/webhook |
| Verificação de saúde | CIPI_HEALTH_TOKEN (substituto: token webhook) |
GET /cipi/health |
| Servidor MCP | CIPI_MCP_TOKEN |
POST /cipi/mcp |
| Anonimizador de banco de dados | CIPI_ANONYMIZER_TOKEN |
POST /cipi/db, POST /cipi/db/user |
Webhook verificação
- GitHub —
X-Hub-Signature-256HMAC-SHA256 - GitLab —
X-Gitlab-Tokencomparação de cabeçalho
Código fonte e versões: github.com/cipi-sh/agent (MIT).
Variáveis ENV
Essas variáveis são injetadas automaticamente por Cipi no aplicativo.env durante
cipi app create. Alternar recursos opcionais com
php artisan cipi:service {type} --enable|--disable ou configure-os manualmente.
| Variável | Descrição | Padrão |
|---|---|---|
| CIPI_WEBHOOK_TOKEN | Segredo para autenticação webhook (token GitHub HMAC/GitLab) | gerado automaticamente |
| CIPI_APP_USER | Nome de usuário do Linux para este aplicativo (caminhos, script de implantação) | configuração automática |
| CIPI_PHP_VERSION | Versão PHP relatada na verificação de integridade | sistema PHP |
| CIPI_DEPLOY_SCRIPT | Caminho para configuração do Deployer | ~/.deployer/deploy.php |
| CIPI_DEPLOY_BRANCH | Branch que aciona uma implantação (vazio = qualquer filial) | vazio |
| CIPI_ROUTE_PREFIX | Prefixo de URL para todas as rotas do agente | cipi |
| CIPI_LOG_CHANNEL | Laravel canal de log para eventos de implantação | nulo |
| CIPI_HEALTH_CHECK | Habilitar /cipi/health |
true |
| CIPI_HEALTH_TOKEN | Token de portador para saúde (volta para token webhook) | nenhum |
| CIPI_MCP | Habilitar /cipi/mcp |
false |
| CIPI_MCP_TOKEN | Token do portador para MCP | nenhum |
| CIPI_ANONYMIZER | Ative o anonimizador em /cipi/db |
false |
| CIPI_ANONYMIZER_TOKEN | Token de portador para anonimizador | nenhum |
php artisan cipi:generate-token {type} para gerar tokens para
mcp, health, ou anonymize. Usar
php artisan cipi:service {type} --enable|--disablepara alternar serviços - o
comando atualiza seu .env no lugar.