O mkclient é o provisionador de projetos/clients dentro da infraestrutura com Docker + Traefik.
Ele cria a stack Nginx + PHP-FPM por domínio, configura banco (SQLite ou MySQL central), gera arquivos (.env, Dockerfiles, compose), sobe os containers e aplica ajustes padrão para apps Laravel.
A partir desta versão, o mkclient foi refatorado em etapas (steps) para facilitar manutenção e depuração.
Também foi adicionado suporte a perfis PHP automáticos (mínimo ou completo, com base no composer.json).
-
VPS com Docker & Docker Compose (instalados via setup.sh).
-
Infra do Traefik já instalada em
/opt/traefik, com:- redes externas compartilhadas:
proxy(sempre) edb(se usar MySQL); - arquivo
/opt/traefik/.envcom variáveis (se usar MySQL central,MYSQL_ROOT_PASSWORDprecisa existir).
- redes externas compartilhadas:
-
DNS do domínio do projeto apontando para a VPS.
-
(Opcional) SSH configurado para Git (SSH) no host.
- Coleta inputs e confirma resumo.
- Prepara o ambiente local (usuário Linux, pastas, redes).
- Gera arquivos de suporte (nginx.conf + templates de Dockerfiles).
- Traz o código (Git/ZIP/vazio).
- Detecta perfil PHP pelo
composer.json(ou aplica escolha manual). - Configura banco (cria schema/usuário e importa dump se MySQL).
- Gera
docker-compose.ymlaplicando o Dockerfile correto. - Cria/ajusta
.env. - Build +
up -dda stack + trigger do certificado. - Ajustes Laravel (composer, key, optimize, migrate/seed, permissões).
- Resumo final e dicas de uso.
Fluxo completo:
bash /opt/devops-stack/scripts/mkclient.shExecutar a partir de um step específico:
START_AT=50 bash /opt/devops-stack/scripts/mkclient.shExecutar até um step e parar:
STOP_AT=80 bash /opt/devops-stack/scripts/mkclient.shO
mkclientsalva um state em:/home/<cliente>/<projeto>/.provision/state.envIsso permite retomar sem perder contexto.
scripts/
├─ mkclient.sh # orquestrador (roda os steps em ordem)
└─ client/
├─ lib.sh # helpers + persistência de state
└─ steps/
├─ 10-inputs.sh # perguntas, resumo e confirmação
├─ 20-prep.sh # redes, usuário Linux, pastas
├─ 30-nginx-phpfiles.sh # gera nginx.conf + templates de Dockerfiles
├─ 40-code.sh # obtém código (Git/ZIP/vazio)
├─ 45-php-profile.sh # detecta perfil PHP pelo composer.json
├─ 50-db.sh # MySQL: cria DB/usuário e importa dump
├─ 60-compose.sh # aplica template certo e gera docker-compose.yml
├─ 70-env.sh # cria/ajusta .env
├─ 80-up.sh # build php + up -d + trigger ACME
├─ 90-laravel.sh # composer/key/optimize/migrate/seed/menu
└─ 99-summary.sh # resumo e comandos úteis
Pergunta:
-
Cliente, Projeto, Domínio
-
Versão do PHP (8.1 / 8.2 / 8.3 / 8.4, padrão 8.2)
-
DB:
SQLiteouMySQL (central) -
Origem do código: Git (SSH) / ZIP local / Vazio
-
Execuções opcionais do Laravel:
- Composer install em produção (--no-dev) ou com dev
- Rodar
migrate - Rodar
seed - Rodar
menu:make - Rodar
viewsmysql:make
-
Perfil PHP:
- Auto (padrão): detecta dependências no
composer.json. - Manual: usuário pode escolher
min(sem intl) oufull(com intl).
- Auto (padrão): detecta dependências no
-
Mostra resumo e pede confirmação.
-
Salva state inicial.
- Garante redes Docker externas (
proxy,dbse MySQL). - Cria usuário Linux
<cliente>. - Prepara diretórios (
src,nginx,.composer-cache,.provision). - Ajusta permissões.
-
Cria
nginx.conf. -
Gera templates de Dockerfiles:
.min.tpl: apenas extensões essenciais (pdo_mysql, sqlite, mbstring, bcmath, gd, zip, exif)..full.tpl: inclui também suporte aintl(icu-libs + intl).
- Git SSH → clona repo.
- ZIP → extrai.
- Vazio → mantém diretório para subir depois.
-
Analisa
composer.json:- Se encontrar
ext-intl,filament/*ousymfony/intl, força perfil full. - Senão, mantém min.
- Se encontrar
-
Exporta
PHP_PROFILEpara os próximos steps.
- Cria schema + usuário.
- Importa dump (
dump.sql(.gz)) se presente, marcandoDUMP_IMPORTED=1.
- Copia o template escolhido para
php.mysql.Dockerfileouphp.sqlite.Dockerfile. - Gera
docker-compose.ymlcom serviçosphp+nginxe labels Traefik.
- Cria/ajusta
.envcom dados do projeto.
- Builda container PHP com Dockerfile escolhido.
- Sobe stack.
- Dispara emissão de certificado SSL.
-
Garante
database.sqlitese SQLite. -
Composer install:
- Pula se ZIP trouxe
vendor/+composer.lock. - Caso contrário, roda conforme escolha (produção ou dev).
- Pula se ZIP trouxe
-
Laravel tasks:
php artisan key:generate,dump-autoload -o,optimize,storage:link.- Rodar
viewsmysql:makese escolhido. - Rodar
menu:makese escolhido. - Rodar
migrate/seedse escolhidos (pulados se dump importado).
-
Ajusta permissões (
storage,bootstrap/cache).
- Mostra caminhos úteis, credenciais DB, perfil PHP aplicado e opções Laravel selecionadas.
/home/<cliente>/<projeto>/
├── src/
├── nginx/
│ └── nginx.conf
├── php.sqlite.Dockerfile(.tpls)
├── php.mysql.Dockerfile(.tpls)
├── docker-compose.yml
├── .composer-cache/
└── .provision/
└── state.env
Os
.tplsão templates internos; o step60gera o Dockerfile final usado no build.
APP_ENV=production,APP_DEBUG=falsepor padrão.- Dumps importados são apagados de
src/após sucesso. - Credenciais MySQL geradas automaticamente — guarde as exibidas no resumo.
Logs do Nginx:
docker compose -f /home/<cliente>/<projeto>/docker-compose.yml logs -f nginxRebuild do PHP:
cd /home/<cliente>/<projeto>
docker compose build php && docker compose up -dTestar HTTPS:
curl -I https://<dominio>-
Posso retomar depois de um erro? Sim. Use
START_ATpara recomeçar do ponto desejado. -
Quando as migrations/seeders rodam? Apenas se selecionados nos inputs, e não houver dump importado.
-
Como sei se preciso do perfil completo? Se usar Filament,
ext-intlou libs de internacionalização (symfony/intl), omkclientjá detecta automaticamente. -
Posso forçar manualmente o perfil PHP? Sim, basta recusar a detecção automática no
10-inputs.sh. -
O que o script não faz? Não cria a infra do Traefik (isso é do
setup.sh), não gerencia DNS e não faz deploy contínuo.