O DocuSeal se provou como uma das ferramentas Open Source mais disruptivas para assinatura de documentos e contratos digitais online. Porém, gerenciar essa stack de containers herdando privilégios de root através do Docker clássico adiciona camadas desnecessárias de risco à sua infraestrutura.
Neste artigo, vamos detalhar a estratégia de provisionar a stack completa do DocuSeal rodando em Podman no modo rootless no Arch Linux. O nosso foco principal é manter os privilégios do sistema operacional intactos e isolados, alterando pontualmente o mapeamento das portas para que o serviço coexista sem atritos com outras aplicações de desenvolvimento da sua máquina.
1. O Cenário B2B e o Desenho da Stack
A arquitetura do DocuSeal é ágil, mas exige serviços interdependentes declarados em um arquivo Compose. Nessa topologia gerenciada pelo Podman, trabalhamos com três pilares principais:
- DocuSeal App: O núcleo da aplicação web, que orquestra e gerencia o fluxo de assinaturas.
- PostgreSQL: Banco de dados relacional confiável onde residem todas as validações e metadados.
- Caddy: Servidor web focado em alta performance que atua como proxy reverso automático, lidando com a porta de saída.
2. O Desafio das Portas Rootless e a Estratégia de Isolamento
A filosofia de segurança do Linux é clara: por padrão, usuários comuns (rootless) não podem iniciar aplicações vinculadas a portas abaixo de 1024, como as clássicas HTTP (80) e HTTPS (443), requeridas pelo servidor Caddy. Somado a isso, é provável que a porta padrão da aplicação do DocuSeal (3000) já esteja em conflito com outros projetos locais de Front-end ou APIs no seu ambiente.
A Solução Inteligente (Sem gambiarras no Kernel): Modificar os parâmetros globais via sysctl para forçar o usuário comum a abrir portas baixas seria criar uma falha sistêmica desnecessária. A prática recomendada de DevOps é redirecionar o mapeamento para portas altas (acima de 1024) diretamente no arquivo docker-compose.yml do seu ambiente.
Com essa técnica, a adaptação das portas no Host se comporta da seguinte maneira:
| Serviço/Container | Porta Interna | Porta Externa (Host PC) | Justificativa Técnica |
|---|---|---|---|
| Aplicação (DocuSeal) | 3000 | 3001 | Evita colisão com frameworks ou serviços preexistentes. |
| Tráfego HTTP (Caddy) | 80 | 8081 | Porta > 1024 nativamente liberada para usuários rootless. |
| Tráfego HTTPS (Caddy) | 443 | 8443 | Porta > 1024 nativamente liberada para usuários rootless. |
3. Refatorando o docker-compose.yml
Aplicando o conceito acima, repare que as portas à esquerda dos dois pontos (a porta vista pelo sistema do host) foram alteradas para garantir a execução rootless de forma segura e sem colisão de IP:
services:
app:
depends_on:
postgres:
condition: service_healthy
image: docuseal/docuseal:latest
ports:
- 3001:3000
volumes:
- ./docuseal:/data/docuseal
environment:
- FORCE_SSL=${HOST}
- DATABASE_URL=postgresql://postgres:postgres@postgres:5432/docuseal
postgres:
image: postgres:18
volumes:
- './pg_data:/var/lib/postgresql/18/docker'
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: docuseal
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
caddy:
image: caddy:latest
command: caddy reverse-proxy --from $HOST --to app:3000
ports:
- 8081:80
- 8443:443
- 8443:443/udp
volumes:
- ./caddy:/data/caddy
environment:
- HOST=${HOST}
4. Pipeline de Comandos de Execução
No Arch Linux (ou derivados), o Podman não ativa seu socket por padrão. Precisamos ativá-lo atrelado puramente ao seu usuário para orquestração efetiva:
Passo 1: Habilitar o Socket do Podman (Modo Usuário)
systemctl --user enable --now podman.socket
⚠️ Atenção DevOps: Nunca use sudo nesta etapa! O uso do argumento --user cria um canal de comunicação de infraestrutura seguro restrito ao seu próprio nível de permissão local.
Passo 2: Subindo a Stack do DocuSeal
Uma vez validado o mapeamento das portas altas e com o socket escutando, a iniciação do Podman fluirá magicamente sem solicitar senhas do superusuário:
# Faça um reset em estruturas corrompidas, caso existam:
podman compose down
# Coloque os serviços no ar em modo background (Daemon):
podman compose up -d
5. Operação Tática e Economia de RAM
A vantagem principal do Podman frente ao Docker clássico é a eficiência na linha de comando. Para evitar uso indiscriminado de RAM e recursos quando você não precisa emitir contratos, adote essa rotina:
- Ligar o servidor antes de preparar os contratos:
podman compose up -d - Desligar toda a stack imediatamente após a assinatura:
podman compose down - Monitorar e debugar falhas nos processos em tempo real:
podman compose logs -f
Veredito Técnico
A adoção dessa arquitetura rootless prova que você não apenas soluciona problemas, mas desenha soluções de alto calibre voltadas à segurança corporativa. Usar o DocuSeal impulsionado pelo Podman garante controle soberano sobre sua hospedagem Open Source, alavancando uma redução agressiva de consumo da sua máquina no modo Stand-by.



