TL;DR
$ cd /meu/diretorio/projetos
$ git clone git@bitbucket.org:iongrade/gatewayXYZDocker.git ./gatewayXYZDocker
$ git clone git@bitbucket.org:iongrade/gatewayXYZ.git ./gatewayXYZDocker/app
$ cp ./gatewayXYZDocker/.env-sample ./gatewayXYZDocker/.env
$ nano ./gatewayXYZDocker/.env #ACERTAR O ARQUIVO COM AS SUAS CONFIGURAÇÕES
$ mkdir -p ./gatewayXYZDocker/app/client/dependencies
$ nano ./gatewayXYZDocker/app/client/dependencies/dev.php #COPIAR ARQUIVO DE EXEMPLO MAIS ABAIXO
$ cd ./gatewayXYZDocker
$ git checkout devenv
$ docker compose up -d
INTRODUÇÃO
Todo gateway é composto de dois projetos "irmãos". Tomando o "gateway Hikvision" como exemplo:
- HikvisionGateway (aplicação em si)
- HikvisionGatewayDocker (infra-estrutura Docker)
Em um setup de produção, o projeto da aplicação é colocado como "o diretório app" dentro do projeto Docker. A estrutura final fica mais ou menos assim:
| HikvisionGatewayDocker
| -- docker-compose.yml
| -- .env
| -- scripts/
| -- app/ #ESSE DIRETÓRIO É EXATAMENTE O PROJETO DA APLIÇÃO
| .......
Quando estamos montando o ambiente de desenvolvimento, a sugestão é montar uma estrutura idêntica a essa acima (um projeto dentro do outro) e fazer alguns ajustes:
PROJETO DOCKER
Usar o branch devenv. Esse branch deve sempre ser uma cópia do branch master, ajustado em alguns pontos:
- usa um Dockerfile para os container PHP habilitando XDebug;
- os diretórios
logs,client,credentialsetmpnão são passados como volumes (para que sejam usados os diretórios "nativos" da aplicação, mais fácil de debuggar); - o entrypoint dos containers PHP CLI (geralmente
engine) são alterados paratail -f, de modo que os serviços não são executados automaticamente ao subir o container (para maior controle de debug).
Se você NÃO QUISER colocar o projeto da aplicação como o diretório app, você tem duas opções:
- colocar o projeto da aplicação onde quiser e criar um link simbólico (
ln -s /path/to/app /path/to/HikvisionGatewayDocker/app); - alterar (por sua conta e risco) o
docker-compose.yml.
ATENÇÃO
Em alguns projetos, há um webserver. Talvez seja necessário ajustar o docker-compose.yml para alterar a porta padrão pra evitar conflitos.
Não se esqueça de criar o arquivo .env. Todo projeto tem um .env-sample pra servir de referência.
Talvez seja necessário acertar as permissões de diretórios. Os gateways devem ter um script setPermissions.sh que cuida disso.
PROJETO APLICAÇÃO
Não existe um branch específico de desenvolvimento. Você pode/deve, no entanto, fazer alguns ajustes pra acertar o ambiente.
O diretório app/client tem arquivos "do cliente". O que estiver nesse diretório (especialmente numa subpasta dependencies, que são os registros do injetor de dependências) tem prioridade sobre os arquivos "nativos".
Em geral, para desenvolvimento você vai:
- acertar a definição do
AsyncExecutorpra que os debugs apareçam no console (exemplo de como deve ser feito mais abaixo); - (opcional) acertar manualmente variáveis de ambiente pra ter que mexer menos no arquivo
.env; - (opcional) registrar a classe
AppConfigurationpra facilitar a vida.
Algo assim:
<?php
use alesinicio\AsyncExecutor\AsyncExecutor;
use Iongrade\GatewayCommon\AppConfiguration;
putenv('SERIALNUMBER=SERIAL123');
putenv('FACILITY=DEMO');
putenv('MQTT_HOST=host.docker.internal');
putenv('MQTT_PORT=1883');
return [
AsyncExecutor::class => fn() : AsyncExecutor => new AsyncExecutor(interpreterPath: 'php', defaultOutputPath: '/proc/' . posix_getpid() . '/fd/1'),
AppConfiguration::class => fn() : AppConfiguration => new AppConfiguration(
type : 'hikvision',
serial : getenv('SERIALNUMBER'),
facility : getenv('FACILITY'),
version : trim((string)file_get_contents(__DIR__ . '/../version')),
lprPort : getenv('HTTP_PORT') ?: 80,
lprMinimalConfidence : getenv('LPR_CONFIDENCE') ?: 90,
hostHardwareFetcherFn: fn() : string => 'Meu computador',
hostModelFetcherFn : fn() : string => 'Minha distro',
basePath : DIR_ROOT,
hostIPFetcherFn : fn() : string => '123.123.123.123',
),
];
Se você acertar o .env direitinho, só vai precisar da declaração do AsyncExecutor.
EXECUÇÃO
Ligue todos os containers e garanta que estejam rodando.
Na IDE, defina como interpretador CLI o PHP do container engine.
Confira o mapeamento de path (basicamente copiar o mapeamento do app que está feito no docker-compose.yml).
Crie um arquivo de teste, coloque um breakpoint e execute usando esse interpretador acima.