Versão de referência: este artigo foi revisado com base no commit 77562cd , que registra o estado validado da segunda parte do Protheus Docker Lab.

No primeiro artigo da série, Construindo um laboratório Protheus com Docker , montei um ambiente de desenvolvimento composto por PostgreSQL, DBAccess, License Server e AppServer.

Colocar os serviços em execução foi a primeira etapa. A seguinte foi transformar um arquivo Compose funcional em um projeto que eu pudesse entender, validar, recriar e evoluir.

Essa diferença parece pequena, mas é importante:

Um ambiente não se torna reproduzível apenas porque existe um docker-compose.yml.

Também precisamos organizar configuração, dependências, artefatos locais, volumes e procedimentos operacionais.

O problema de concentrar tudo no Compose

Durante uma prova de conceito, é tentador colocar imagens, portas, credenciais, comandos e grandes blocos de configuração diretamente no docker-compose.yml.

O arquivo cresce rapidamente e começa a misturar responsabilidades:

  • definição dos serviços;
  • valores específicos de cada máquina;
  • segredos;
  • arquivos obrigatórios do Protheus;
  • dados persistentes;
  • comandos de preparação;
  • procedimentos de validação.

Além de dificultar a leitura, essa mistura torna menos claro o que pode ser versionado e o que precisa permanecer local.

A estrutura adotada no laboratório

O projeto foi separado por finalidade:

protheus-docker-lab/
|-- .dockerignore
|-- .env.example
|-- .gitignore
|-- docker-compose.yml
|-- config/
|   |-- appserver.ini.example
|   |-- odbc.ini.example
|   `-- odbcinst.ini.example
|-- docs/
|   `-- anotacoes-laboratorio.md
|-- files/
|   `-- .gitkeep
|-- scripts/
|   |-- check.sh
|   |-- generate-dbaccess.sh
|   |-- up.sh
|   |-- down.sh
|   `-- logs.sh
|-- volumes/
|   |-- apo/
|   |-- systemload/
|   `-- logs/
`-- README.md

Cada diretório responde a uma pergunta:

  • config/: quais configurações os serviços precisam?
  • scripts/: como preparar, validar e operar o ambiente?
  • files/: onde colocar temporariamente artefatos locais?
  • volumes/: quais dados precisam sobreviver ao container?
  • docs/: quais evidências, erros e decisões precisam ser preservados?
  • README.md: como outra pessoa reproduz o fluxo?

Os artefatos proprietários e arquivos efetivos do ambiente não são publicados no Git. O .gitignore mantém fora do repositório o .env, os arquivos .ini efetivos, o conteúdo de files/ e os dados de execução em volumes/. Arquivos .gitkeep preservam apenas a estrutura vazia necessária para orientar a preparação.

Serviços com responsabilidades explícitas

O Compose mantém quatro serviços:

ServiçoResponsabilidade
licensefornecer o License Server do ambiente de desenvolvimento
postgres-iniciadoexecutar o banco PostgreSQL usado pelo Protheus
dbaccess-postgresintermediar a comunicação entre AppServer e PostgreSQL
appserverexecutar o ambiente Protheus e disponibilizar o WebApp

A separação ajuda a observar logs, reiniciar componentes e entender as dependências sem instalar tudo diretamente no host.

Ela não significa isolamento completo. Os serviços continuam formando um único sistema e precisam de contratos coerentes de rede, portas, arquivos e inicialização.

Variáveis que pertencem ao ambiente

Valores que podem mudar entre máquinas ficam no .env:

COMPOSE_PROJECT_NAME=protheus-docker-lab
LICENSE_IMAGE=totvsengpro/license-dev
POSTGRES_IMAGE=totvsengpro/postgres-dev:12.1.2510_bra
DBACCESS_IMAGE=totvsengpro/dbaccess-postgres-dev
APPSERVER_IMAGE=totvsengpro/appserver-dev
APPSERVER_PORT=1234
WEBAPP_PORT=8080

O repositório publica apenas .env.example, com nomes e valores seguros para servir de referência. O .env efetivo permanece local.

Essa estratégia reduz duplicação e permite atualizar imagens e portas sem reescrever o Compose. No entanto, um arquivo .env não é um cofre de segredos. Em ambientes compartilhados ou corporativos, credenciais precisam de um mecanismo apropriado de gerenciamento.

Configuração de exemplo e configuração efetiva

O laboratório distingue arquivos que podem ser versionados daqueles gerados ou adaptados localmente:

config/appserver.ini.example  -> config/appserver.ini
config/dbaccess.ini          -> gerado localmente
config/odbc.ini              -> gerado localmente
config/odbcinst.ini          -> gerado localmente

O repositório também mantém exemplos de ODBC para consulta. No fluxo recomendado, entretanto, os três arquivos efetivos do DBAccess e do ODBC são produzidos localmente pelo script e continuam ignorados pelo Git.

O DBAccess merece cuidado especial. A senha precisa ser codificada no formato esperado pela ferramenta dbaccesscfg. Editar manualmente o resultado pode produzir um arquivo aparentemente correto, mas inválido para o serviço.

Por isso, o script generate-dbaccess.sh executa a ferramenta da própria imagem e gera a configuração efetiva:

./scripts/generate-dbaccess.sh

O script carrega as variáveis do .env, executa o dbaccesscfg da imagem configurada e grava dbaccess.ini, odbc.ini e odbcinst.ini. Com isso, a senha codificada fica no formato produzido pela própria ferramenta, sem precisar ser copiada ou editada manualmente.

Dependência não é prontidão

O PostgreSQL possui um healthcheck:

healthcheck:
  test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB} -h localhost -p ${POSTGRES_PORT}"]
  interval: 5s
  timeout: 3s
  retries: 20
  start_period: 10s

O DBAccess aguarda o banco ficar saudável:

depends_on:
  postgres-iniciado:
    condition: service_healthy

Isso é melhor do que depender apenas da ordem de criação dos containers, mas possui um limite: pg_isready confirma que o PostgreSQL aceita conexões; ele não garante que o banco esteja completamente preparado para o Protheus.

Da mesma forma, condition: service_started informa que um container iniciou, não que sua função de negócio está pronta.

Essa distinção orienta a próxima etapa do lab: criar validações funcionais além do estado dos containers.

Volumes e artefatos locais

O AppServer precisa acessar RPO, systemload e logs:

volumes:
  - ./volumes/apo/tttm120.rpo:/opt/totvs/protheus/apo/tttm120.rpo
  - ./volumes/systemload:/opt/totvs/protheus/protheus_data/systemload
  - ./volumes/logs:/opt/totvs/appserver/logs

Os bind mounts deixam explícita a origem de cada arquivo no host, o que ajuda em um laboratório local. Eles também criam responsabilidades:

  • preparar os diretórios antes da subida;
  • conferir permissões;
  • manter uma origem limpa do RPO;
  • evitar que artefatos proprietários entrem no Git;
  • entender quais dados podem ser descartados.

Durante os testes iniciais, o diretório systemload precisou permanecer gravável. Esse tipo de descoberta deve fazer parte da documentação, pois não aparece apenas pela leitura do Compose.

Nomes e caminhos previsíveis

Dentro da rede do Compose, os serviços podem se localizar pelo nome. Assim, o DBAccess usa postgres-iniciado como host e o AppServer usa dbaccess-postgres.

Os caminhos internos também foram padronizados:

UsoCaminho no container
RPO/opt/totvs/protheus/apo
dados Protheus/opt/totvs/protheus/protheus_data
configuração AppServer/opt/totvs/appserver/appserver.ini
logs AppServer/opt/totvs/appserver/logs

Essa tabela reduz o conhecimento implícito e facilita conferir os mounts.

Validando a configuração antes de subir

O Docker Compose consegue renderizar e validar sua configuração consolidada:

docker compose config

O laboratório envolve essa validação em scripts/check.sh, que também verifica Docker e arquivos obrigatórios:

./scripts/check.sh

Essa verificação antecipa erros como ausência de .env, RPO, arquivos de systemload ou configurações geradas.

Ela ainda é uma validação de preparação, não uma prova de que o Protheus responde corretamente depois da subida.

O que melhorou

Com a separação, o ambiente passa a ter:

  • um Compose focado na topologia;
  • variáveis externas para imagens e portas;
  • configurações versionáveis como exemplos;
  • arquivos sensíveis ou proprietários fora do repositório;
  • diretórios explícitos para persistência;
  • validação antes da execução;
  • documentação conectada à estrutura real.

Evidências da etapa

EvidênciaRegistro
Versão de referênciaCommit 77562cd
Estrutura e arquivos públicosÁrvore do repositório no commit de referência
Validação da configuraçãoscripts/check.sh executa docker compose config antes da subida
Arquivos obrigatórioscheck.sh verifica configurações, RPO, sx2.unq e sxsbra.txt
Inicializaçãoscripts/up.sh valida, executa docker compose up -d e mostra docker compose ps
Testes e correçõesRegistrados em docs/anotacoes-laboratorio.md

As evidências documentam, entre outros pontos, a conexão do DBAccess com PostgreSQL, o carregamento do ambiente PROTHEUS_DOCKER, o acesso pelo WebApp e a necessidade de manter systemload gravável neste laboratório. Elas também deixam claros os limites do healthcheck e das condições de inicialização usadas pelo Compose.

Próximo passo

Organização reduz ambiguidade, mas o processo ainda possui comandos manuais. Na próxima parte, vamos consolidar a automação e a configuração local. Dados, manutenção e a validação final do laboratório ficam para as partes seguintes da série.

O repositório do projeto está disponível em:

github.com/dirleiflsilva/protheus-docker-lab

Referências