Instalação por container¶
O Docker Compose é o caminho primário e suportado. O compose.yaml do repositório não é um wrapper de
conveniência: ele carrega controles de segurança que não podem ficar a cargo do operador, acima de tudo
o isolamento de rede do sidecar de renderização.
Passos¶
git clone https://github.com/mentesan/peart.git
cd peart
cp config.example.yaml config.yaml
cp .env.example .env # defina PEART_RENDER_TOKEN com `openssl rand -hex 32`
mkdir -p secrets && touch secrets/master.key && sudo chown 65532:65532 secrets/master.key
docker compose up -d
Para a rede do container, o render.base_url do config.yaml precisa ser http://peart-render:8090,
para o DNS do Compose resolver o sidecar pelo nome do serviço. (O config.example.yaml traz o default de
systemd, 127.0.0.1:8090, porque as duas topologias de fato diferem aqui.)
O chown para 65532 é o usuário sem privilégio embutido na imagem base distroless, o mesmo que os
processos peart e peart-portal rodam. Sem ele, o processo não consegue escrever a chave mestra que
gera no primeiro boot; sem pré-criar o arquivo, o Docker monta um diretório vazio no lugar em vez de um
arquivo. A chave mestra mora fora do volume de dados, então um backup desse volume nunca a contém.
No primeiro acesso o PEART exige criar o administrador e inscrever o segundo fator. Não existe credencial padrão.
O que o compose codifica¶
Três serviços, deliberadamente não dois:
peartem127.0.0.1:8080, preso ao loopback de propósito: ponha um proxy reverso que termina TLS na frente, ou uma VPN. Ele condiciona a subida à saúde do sidecar, o que fecha uma race real em que a geração de relatório ficaria recusada para o resto da vida do container.peart-portalem127.0.0.1:8081, um binário separado (o entrypoint é sobreposto para o portal nunca alcançar um handler interno), com o banco montado somente leitura pela DSN e sem montagem de evidência nem da chave. Renditions e relatórios são montados somente leitura.peart-rendersemports, alcançável só pela rederender, que não tem rota para fora. Rodaread_only, com tmpfs de tamanho limitado,cap_drop: ALL, no-new-privileges e limite de memória. É o mesmo isolamento que oPrivateNetwork/IPAddressDenyda unit de systemd dá, e não é opcional.
O único segredo que o processo interno e o sidecar precisam compartilhar, PEART_RENDER_TOKEN, mora numa
única entrada do .env que os dois containers leem, em vez de ser copiado no config.yaml à mão.
Atualizar¶
Veja Atualização para o ciclo puxar-migrar-reiniciar; as migrações são forward-only e o processo recusa subir contra um banco desatualizado.