Ir para o conteúdo

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:

  • peart em 127.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-portal em 127.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-render sem ports, alcançável só pela rede render, que não tem rota para fora. Roda read_only, com tmpfs de tamanho limitado, cap_drop: ALL, no-new-privileges e limite de memória. É o mesmo isolamento que o PrivateNetwork/IPAddressDeny da 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.