Instalação com Docker
8 minute read
A maneira mais fácil de instalar e executar o OpenDataBio é usar o Docker e os arquivos de configuração fornecidos, que incluem nginx, MySQL, Redis e Supervisor para os processos de fila.
Escolha um perfil
O OpenDataBio fornece dois perfis Compose:
docker-compose.yml: desenvolvimento e testes locais, com bind mounts do código-fonte, phpMyAdmin e portas8081/8082.docker-compose.prod.yml: produção, com imagens imutáveis da aplicação, sem bind mounts do código-fonte ou phpMyAdmin, usuário dedicado do banco, verificações de saúde e volumes nomeados.
O Makefile não pergunta qual perfil você deseja. O comando escolhido define o perfil:
make docker-initinicia o perfil de desenvolvimento e usa.env;make init-prodinicia o perfil de produção e usa.env.production.
Para uma instalação de produção, ou para testar o perfil de produção junto de uma instalação Apache existente, use make init-prod.
.env da instalação Apache/local. O Docker de produção usa seu próprio arquivo .env.production e requer DB_HOST=mysql e REDIS_HOST=redis.Se iniciar make docker-init por engano, interrompa com Ctrl+C e pare somente o projeto Compose de desenvolvimento:
docker compose -p odb down
Não acrescente -v, pois essa opção exclui os volumes do projeto Docker selecionado.
Instalação de produção
1. Prepare o ambiente
cd opendatabio
cp .env.production.example .env.production
nano .env.production
chmod 600 .env.production
O Compose lê .env.production no host e injeta seus valores nos containers da
aplicação. A imagem de produção intencionalmente não contém
/var/www/html/.env; o Laravel lê as variáveis de ambiente injetadas.
No mínimo, substitua:
APP_URL=https://dados.exemplo.org
ASSET_URL=https://dados.exemplo.org
APP_FORCE_HTTPS=true
APP_HTTP_PORT=80
DB_DATABASE=opendatabio
DB_USERNAME=opendatabio
DB_PASSWORD=uma-senha-forte-da-aplicacao
DB_ROOT_PASSWORD=outra-senha-forte-para-root
Se o TLS terminar em um proxy reverso externo, mantenha os containers da aplicação em uma rede/porta HTTP privada e configure o proxy para encaminhar o host e o protocolo originais.
Para testar o perfil de produção localmente enquanto o Apache já usa a porta 80:
APP_URL=http://localhost:8083
ASSET_URL=http://localhost:8083
APP_FORCE_HTTPS=false
APP_HTTP_PORT=8083
2. Construa e inicialize
O script de inicialização:
- gera
APP_KEYsomente quando estiver vazia; - compila o frontend uma vez e copia os mesmos assets gerados para as imagens autocontidas de PHP e nginx;
- aguarda as verificações de saúde do MySQL e Redis;
- executa as migrations;
- configura os locales da interface e do conteúdo inserido pelos usuários;
- cria os caches de configuração, rotas e views do Laravel;
- inicia nginx e workers das filas;
- executa a auditoria de locales.
make init-prod
Para inicializar um banco de produção novo e depois importar opcionalmente os dados de referência de localidades e táxons compatíveis com a versão:
make init-prod SEED=1
A etapa de seed é interativa e exige digitar PROCEED. Ela substitui as tabelas
atuais de referência de localidades e táxons; use-a somente em uma instalação
nova ou quando as notas específicas da atualização determinarem essa
substituição. Para executá-la posteriormente em uma instalação de produção já
inicializada:
make seed-prod
O seed de produção é executado inteiramente nos containers do projeto
odb-prod e não lê, altera ou remove arquivos do storage/ local de uma
instalação Apache.
A seleção padrão de locales é:
interface: en,es,pt-br
conteúdo inserido por usuários: pt-br
Para escolher outros locales durante a inicialização:
ODB_INTERFACE_LOCALES=en,es,pt-br \
ODB_CONTENT_LOCALES=pt-br,en \
make init-prod
ODB_CONTENT_LOCALES inicializa a seleção de locales de conteúdo. O locale
principal sempre é habilitado e os campos traduzíveis essenciais continuam
obrigatórios nele; traduções nos demais locales habilitados são opcionais.
A tradução assistida fica desabilitada por padrão. Para habilitar o único
provedor atualmente suportado, configure Google Cloud Translation v3 antes de
make init-prod. Atualmente, o Google aplica um crédito mensal de uso gratuito
aos primeiros 500.000 caracteres NMT, mas billing é obrigatório e o excedente
é cobrado. Configure quotas da API e alertas de cobrança e confira os preços
atuais.
mkdir -p docker-secrets
cp /origem/segura/google-translation.json docker-secrets/
chmod 700 docker-secrets
chmod 600 docker-secrets/google-translation.json
USER_TRANSLATION_PROVIDER=google
GOOGLE_CLOUD_PROJECT=id-do-projeto
GOOGLE_TRANSLATION_LOCATION=global
GOOGLE_APPLICATION_CREDENTIALS=/run/secrets/google-translation.json
O diretório ignorado docker-secrets é montado como somente leitura em
/run/secrets nos containers Laravel e de filas. Nunca inclua seus arquivos na
imagem ou no repositório.
Teste o provedor selecionado:
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml exec -T -u www-data laravel php artisan translations:check --source=en --target=es
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml exec -T -u www-data laravel php artisan translations:check --source=en --target=es --live
Não gere novamente a APP_KEY depois que houver dados armazenados.
3. Valide a produção
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml ps
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml exec -T redis redis-cli ping
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml exec -T -u www-data laravel php artisan migrate:status
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml exec -T -u www-data laravel php artisan locales:audit
curl -I http://localhost:8083/
Examine os logs:
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml logs --tail=200 nginx
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml logs --tail=200 laravel
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml logs --tail=200 supervisord
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml logs --tail=200 mysql
Inicialmente, o CSP do nginx é enviado como Content-Security-Policy-Report-Only. Teste toda a interface e examine os relatórios do navegador antes de ativá-lo em docker/prod/nginx.conf.
Início rápido para desenvolvimento
Esta seção destina-se somente a um checkout de desenvolvimento. Não a siga no mesmo checkout que serve uma instalação Apache: o perfil de desenvolvimento usa .env, monta o código-fonte e pode escrever nos diretórios locais da aplicação.
Pré-requisitos:
- Docker com o plugin Compose v2 (
docker compose). - Linux/macOS: usuário com acesso ao socket do Docker ou instalação rootless.
- Windows: Docker Desktop com WSL2/Hyper-V.
makepara usar os comandos abreviados abaixo.- Node.js 22 e npm no host. O bind mount do código de desenvolvimento
substitui a árvore da aplicação presente na imagem; por isso,
make docker-initgera no checkout os assets não versionados do frontend e do Livewire.
Preserve primeiro qualquer arquivo de ambiente que não pertença ao Docker:
cp .env .env.backup.apache
cp .env.docker .env
make docker-init
Para um banco novo de desenvolvimento, importe os dados opcionais de referência de localidades e táxons depois da inicialização:
make seed-odb
Como alternativa, execute as duas etapas com make docker-init SEED=1. O seed
substitui as tabelas atuais de localidades e táxons e solicita confirmação
explícita.
A aplicação de desenvolvimento estará em http://localhost:8081 e o phpMyAdmin em http://localhost:8082.
Login padrão:
usuário: admin@example.org
senha: password1
Altere a senha depois da instalação.
O comando de inicialização destina-se a uma instalação nova. Ele não substitui uma APP_KEY existente, mas migrations e seeds ainda são alterações no banco de dados.
Comandos Make
Construção e banco de dados
make docker-init— copia.env.dockerse.envnão existir, constrói/inicia containers, instala dependências, gera uma chave ausente, executa migrations e cria o link do storagemake build— constrói os containers de desenvolvimentomake key-generate— gera a chave da aplicação somente se ainda não existirmake composer-install— instala as dependências PHPmake composer-update— atualiza as dependências PHPmake migrate— cria ou atualiza o banco de dadosmake drop-migrate— exclui e recria o banco de dadosmake seed-odb— popula o banco com localidades e táxonsmake seed-prod— popula o banco Docker de produção sem tocar no storage do hostmake init-prod— constrói e inicializa o perfil de produçãomake start-prod/make stop-prod— inicia ou para o perfil de produção
Acesso aos containers
make start— inicia todos os containers de desenvolvimentomake stop— para todos os containers de desenvolvimentomake restart— reinicia os containers de desenvolvimentomake ssh— abre um shell no container Laravelmake ssh-mysql— abre um shell no container MySQLmake mysql— abre o console MySQLmake ssh-nginx— abre um shell no container nginxmake ssh-supervisord— abre um shell no container Supervisor
Manutenção
make optimize— limpa caches e arquivos de logmake info— mostra informações da aplicaçãomake logs— mostra os logs do Laravelmake logs-mysql— mostra os logs do MySQLmake logs-nginx— mostra os logs do nginxmake logs-supervisord— mostra os logs do Supervisor
Persistência de dados e reinicialização
MySQL, Redis e mídias de produção usam volumes nomeados. Reconstruir uma imagem não exclui esses volumes.
docker volume ls
Para reinicializar somente um projeto de desenvolvimento, incluindo seu banco:
docker compose -p odb down -v --remove-orphans
Para o perfil de produção:
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml down -v --remove-orphans
-v exclui permanentemente o banco, o Redis e os volumes de storage de produção daquele projeto Compose. Faça backup antes. Não use docker system prune -a como comando para reinicializar a aplicação: ele não se limita ao OpenDataBio.Atualização de uma instalação Docker existente
Antes de atualizar, faça backup do banco e de storage/app/public/media.
Revise as diferenças de configuração da versão de destino:
- compare
.env.productioncom.env.production.example, incluindoAPP_URLeASSET_URL; - confira as configurações PHP em
docker/prod/php.ini; - confira a configuração do Supervisor em
docker/general/supervisord.conf.
- Atualize o código-fonte:
cd opendatabio
git fetch --tags
git checkout <tag-ou-branch>
- Construa as novas imagens imutáveis:
make build-prod
- Coloque a aplicação em manutenção e execute as migrations com a nova imagem:
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml exec -T -u www-data laravel php artisan down
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml up -d mysql redis laravel
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml exec -T -u www-data laravel php artisan migrate --force
- Atualize os caches e substitua os containers web e de workers:
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml exec -T -u www-data laravel php artisan optimize
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml up -d --force-recreate nginx supervisord
- Retorne a aplicação ao serviço e valide:
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml exec -T -u www-data laravel php artisan up
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml exec -T -u www-data laravel php artisan locales:audit
docker compose --env-file .env.production -p odb-prod -f docker-compose.prod.yml ps
As dependências do Composer e os assets do frontend são incorporados às imagens de produção. Não execute composer update ou npm run build interativamente nos containers de produção. Se a nova versão adicionar chaves a .env.production, configure-as antes de reconstruir ou recriar os containers.