No description
  • Shell 80.4%
  • PowerShell 19.6%
Find a file
2026-07-05 00:43:02 -03:00
scripts initial commit 2026-07-05 00:43:02 -03:00
traefik initial commit 2026-07-05 00:43:02 -03:00
.env.example initial commit 2026-07-05 00:43:02 -03:00
.gitignore initial commit 2026-07-05 00:43:02 -03:00
docker-compose.yml initial commit 2026-07-05 00:43:02 -03:00
README.md initial commit 2026-07-05 00:43:02 -03:00

infra-v2 — Dokploy (painel privado, apps públicos)

Stack de auto-hospedagem com Dokploy via Docker Compose.

A ideia é simples:

  • Painel do Dokploy → acessível somente via localhost + túnel SSH. A porta 3000 é presa em 127.0.0.1 no servidor, então nunca fica exposta à internet.
  • Apps que você criar no Dokployexpostos publicamente pelo Traefik (portas 80/443), com HTTPS automático via Let's Encrypt.
                    Internet
                       │
             ┌─────────┴──────────┐
     80/443  │                    │  3000  (só 127.0.0.1)
   (público) │                    │  (fechado p/ fora)
             ▼                    ▼
        ┌─────────┐        ┌──────────────┐        você ── ssh -L ──► túnel
        │ Traefik │        │   Dokploy    │◄──────  http://localhost:3000
        └────┬────┘        │  (painel/API)│
             │             └──────┬───────┘
   roteia p/ apps                 │ cria serviços Swarm + rotas Traefik
             ▼                    ▼
   ┌───────────────── dokploy-network (overlay) ─────────────────┐
   │   seus apps        postgres        redis        ...          │
   └─────────────────────────────────────────────────────────────┘

Componentes

Serviço Imagem Portas Exposição
dokploy dokploy/dokploy:latest 127.0.0.1:3000 privado (túnel)
dokploy-traefik traefik:v3.6.7 80, 443 (tcp+udp) público
dokploy-postgres postgres:16 interna rede interna
dokploy-redis redis:7 interna rede interna

Pré-requisitos

  • Um servidor Linux com Docker instalado (Ubuntu/Debian recomendado).
  • Docker em modo Swarm — o Dokploy publica cada app como um serviço Swarm. O bootstrap.sh faz isso pra você.
  • Portas 80 e 443 liberadas no firewall / Security List do provedor. Não libere a 3000 — ela deve ficar fechada de propósito.

Rode este stack no servidor. A porta 3000 fechada é o que garante que o painel só seja acessível por quem tem acesso SSH à máquina.

Setup (no servidor)

# 1. Prepara Swarm + rede overlay + pasta de config (idempotente)
ADVERTISE_ADDR=SEU_IP ./scripts/bootstrap.sh

# 2. Configura os segredos
cp .env.example .env
#    preencha ADVERTISE_ADDR, POSTGRES_PASSWORD, BETTER_AUTH_SECRET
#      openssl rand -hex 24     -> POSTGRES_PASSWORD
#      openssl rand -base64 32  -> BETTER_AUTH_SECRET

# 3. Sobe o stack
docker compose up -d

# 4. Acompanhe o boot
docker compose logs -f dokploy

Acessar o painel (via túnel SSH)

Como a 3000 está presa em 127.0.0.1 no servidor, você a alcança abrindo um túnel:

# Linux/macOS
./scripts/tunnel.sh usuario@servidor

# Windows (PowerShell)
.\scripts\tunnel.ps1 -RemoteHost usuario@servidor

Deixe o terminal aberto e acesse http://localhost:3000. No primeiro acesso, o Dokploy pede para criar a conta de administrador.

Equivalente manual: ssh -N -L 3000:127.0.0.1:3000 usuario@servidor

Expor um app (fica público)

No painel do Dokploy:

  1. Create → Application/Compose/Docker e configure o build/deploy.
  2. Na aba Domains, adicione o domínio do app (ex.: app.seudominio.com).
  3. Aponte um registro DNS A desse domínio para o IP do servidor.
  4. Marque HTTPS + Let's Encrypt.

O Dokploy cria o serviço Swarm e escreve a rota em /etc/dokploy/traefik/dynamic. O Traefik (público em 80/443) passa a servir o app com certificado automático. O painel continua sem domínio público — de propósito.

Operação

# Atualizar o Dokploy (o botão "Update" do painel não se aplica a este modo compose)
docker compose pull dokploy && docker compose up -d dokploy

# Atualizar o Traefik / mudar a config estática (traefik/traefik.yml)
docker compose up -d dokploy-traefik

# Ver status / logs
docker compose ps
docker compose logs -f <serviço>

# Parar tudo (mantém volumes/dados)
docker compose down

Notas e cuidados

  • Este modo roda o core do Dokploy como containers Compose, não como serviços Swarm. Os apps que você cria continuam sendo serviços Swarm normais. A diferença prática: atualize o próprio Dokploy pelo docker compose pull (acima), não pelo botão do painel.
  • A config estática do Traefik é este repositório (traefik/traefik.yml), não o editor do painel. Ajuste o e-mail do Let's Encrypt lá, ou defina por app no Dokploy.
  • /etc/dokploy guarda estado sensível (chaves SSH, certificados acme.json, rotas). Faça backup dessa pasta e dos volumes dokploy-postgres-database / dokploy-redis-data.
  • Segredos: .env está no .gitignore. Nunca comite senhas reais.

Estrutura

infra-v2/
├── docker-compose.yml     # stack: dokploy + postgres + redis + traefik
├── .env.example           # modelo de variáveis (copie para .env)
├── traefik/
│   └── traefik.yml         # config estática do Traefik (versionada)
└── scripts/
    ├── bootstrap.sh        # swarm init + rede overlay + pasta de config
    ├── tunnel.sh           # túnel SSH p/ o painel (Linux/macOS)
    └── tunnel.ps1          # túnel SSH p/ o painel (Windows)