Deploy
Quando usar
- Acionar quando a pessoa pedir release ou deploy de uma aplicação em servidor.
- Acionar para preparar um servidor que receberá stacks Docker Swarm via Ansible.
- Acionar quando a pessoa pedir para cadastrar, adicionar, substituir ou conferir um servidor do ambiente.
- Não executar push, provisionamento ou mudança remota sem alvo e autorização explícitos.
Fluxo
Confirmar a raiz do sistema do usuário e acionar
$specsfy-specialist-versioningpara ler ou prepararSEMVER.Inspecionar
Dockerfile, Compose, stack eansible/existentes. Comparar PHP, extensões, dependências, assets, entrypoint, usuário interno, portas, healthcheck e comando do Octane com a aplicação atual. Preservar trechos personalizados e apresentar o diff antes de substituir um arquivo sem marcações gerenciadas.Executar o gerador somente na primeira preparação, quando todos os destinos estiverem ausentes:
node scripts/scaffold.mjs --project <raiz> --image <registry>/<aplicacao>O padrão inclui Cloudflare Tunnel na stack. Se a pessoa pedir outro proxy, gerar sem
cloudflaredcom--proxy externale configurar a alternativa solicitada em etapa própria.Acionar
$specsfy-specialist-debian-serverpara levantar as máquinas uma por rodada. Registrar hostname, endereço, porta SSH, usuário de conexão e papelmanagerouworkeremansible/inventory.yml, preservando os hosts já cadastrados. Quando chegar uma máquina nova, adicionar somente esse host.Testar todos os hosts declarados antes de qualquer alteração remota. A skill executa o utilitário, mas também mostra a forma curta para uso no Herdr:
./deploy check-hostsLocalizar apenas chaves públicas
~/.ssh/*.pubna máquina controladora e adicioná-las aoauthorized_keysdo usuáriodeploy. Nunca ler, copiar ou transmitir uma chave privada. Manter acessos remotos já cadastrados.Perguntar quais senhas, tokens, chaves e keys a aplicação consome e registrar os nomes em
ansible/vault-fields.txt. Não pedir os valores na conversa. O utilitário solicita cada valor com entrada oculta e grava o YAML criptografado:./deploy secretsA repetição mantém os campos existentes e pergunta somente os ausentes.
No padrão Cloudflare Tunnel, incluir
vault_cloudflare_tunnel_token. O serviço lê o token pelo arquivo/run/secrets/cloudflare_tunnel_token.Gerar a referência da imagem com
docker-tag. Recusar qualquer tag Docker diferente do valor presente emSEMVER.Acionar
$specsfy-specialist-debian-servere$specsfy-specialist-dockerpara definir o estado do host e do Docker Engine.Acionar
$specsfy-specialist-ansiblepara criar ou revisar roles idempotentes que criam o usuáriodeploy, instalam Docker Engine, configuram daemon, firewall, permissões e diretórios da aplicação.Acionar
$specsfy-specialist-docker-swarmpara definir managers, workers, redes e stacks. O playbook executadocker swarm initsomente quando o manager ainda não participa de um swarm e usa tokens protegidos para joins.Validar Ansible em syntax check, lint, check mode e duas execuções num alvo descartável. Validar a stack com
docker stack config.Com autorização para o alvo informado, aplicar o playbook, publicar a imagem versionada e executar
docker stack deploypelo manager.Conferir réplicas, healthchecks, logs, versão e digest. Guardar o comando de rollback para a versão anterior.
Padrões
SEMVERna raiz do sistema do usuário governa imagem, manifesto, tag Git e release.- Gerar
compose.yamlpara desenvolvimento estack.yamlpara produção. Toda produção usa a stack pelo Docker Swarm; não use Compose como runtime de produção. - Em Laravel, exigir
laravel/octanee Open Swoole. A imagem instalaopenswoole; Compose e stack executam Octane com--server=swoole. - Sugerir Cloudflare Tunnel como entrada pública padrão. Executar
cloudflaredcomo serviço da stack, ligado à mesma rede overlay da aplicação e sem porta pública no serviço Laravel. O hostname do túnel aponta parahttp://app:8000. - Trocar o padrão somente quando a pessoa pedir outro proxy. Nesse caso, não
gerar o serviço
cloudflarednem o secret do token. - Ansible configura o servidor e o estado do Swarm. Não deixe uma sequência manual de comandos SSH como procedimento principal.
- Criar o usuário de serviço
deploy, adicionar somente esse usuário ao grupodockere atribuir a ele os diretórios da aplicação. O grupo concede acesso administrativo amplo ao host e não deve incluir contas sem essa função. - Manter
ansible/inventory.ymlcomo mapa dos servidores conhecidos. Uma inclusão preserva os hosts atuais, testa a nova conexão e só então configura o node e seu papel no Swarm. - Mostrar
./deploy check-hosts,./deploy secrets,./deploy sync-keysou./deploy runquando a pessoa precisar copiar uma ação para outro painel do Herdr. A skill executa esses utilitários sem exigir memorização. - Em nova chamada, ler novamente a aplicação e reconciliar apenas o que mudou. O gerador serve ao primeiro bootstrap e não deve sobrescrever arquivos existentes para simular atualização.
- Use módulos idempotentes e
community.docker; comandos necessários para iniciar ou integrar o swarm precisam de condições baseadas no estado atual. - Mantenha managers em número ímpar e restrinja as portas do Swarm aos nodes autorizados.
- Publique uma imagem uma vez e promova o mesmo digest entre ambientes.
- Senhas, tokens e chaves entram em um Ansible Vault criado por prompt seguro.
O Ansible transforma os valores descriptografados em Docker Secrets com
no_log: true; a stack guarda apenas nomes e mounts externos.
Antipadrões
- Usar
latestou outra tag que não reproduzaSEMVER. - Executar
docker swarm initem toda rodada do playbook. - Expor token de join em log, variável aberta ou arquivo commitado.
- Guardar senha, token ou chave no
stack.yaml, em variável aberta ou na imagem. - Passar o token do Cloudflare Tunnel por argumento, variável aberta ou arquivo versionado.
- Conceder
sudoirrestrito ao usuáriodeploysem necessidade confirmada. - Fazer build no servidor ou recompilar uma imagem para cada ambiente.
- Considerar o deploy concluído apenas porque o comando retornou código zero.
Validação
- Executar
current,docker-tageverify-docker-tagpela skill de versionamento. - Confirmar que
deployexiste, pertence ao grupodocker, acessa o daemon e é owner dos diretórios da aplicação. - Confirmar Docker Engine ativo, manager alcançável e swarm em estado
active. - Executar o playbook duas vezes; a segunda rodada deve terminar sem mudanças.
- Comparar a imagem de cada serviço com
SEMVERe com o digest publicado. - Observar a convergência e ensaiar rollback em ambiente compatível.
Skills relacionadas
$specsfy-specialist-versioninggoverna a versão do sistema do usuário.$specsfy-specialist-debian-serverdefine o estado base do host.$specsfy-specialist-dockerprepara e publica a imagem.$specsfy-specialist-ansibleautomatiza o servidor e o cluster.$specsfy-specialist-docker-swarmgoverna serviços, rollout e rollback.$specsfy-specialist-delivery-engineeringgoverna pipeline e promoção entre ambientes quando esses componentes fizerem parte da entrega.
Leia references/standards.md antes de criar ou alterar o playbook de provisionamento e deploy.