No description
- Shell 80.4%
- PowerShell 19.6%
| scripts | ||
| traefik | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| README.md | ||
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 porta3000é presa em127.0.0.1no servidor, então nunca fica exposta à internet. - Apps que você criar no Dokploy → expostos 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.shfaz isso pra você. - Portas
80e443liberadas no firewall / Security List do provedor. Não libere a3000— ela deve ficar fechada de propósito.
Rode este stack no servidor. A porta
3000fechada é 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:
- Create → Application/Compose/Docker e configure o build/deploy.
- Na aba Domains, adicione o domínio do app (ex.:
app.seudominio.com). - Aponte um registro DNS A desse domínio para o IP do servidor.
- 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/dokployguarda estado sensível (chaves SSH, certificadosacme.json, rotas). Faça backup dessa pasta e dos volumesdokploy-postgres-database/dokploy-redis-data.- Segredos:
.envestá 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)