Stack completa pra rodar o painel de admin do Liberthia em Docker Swarm (ou Compose).
┌──────────────────┐
│ Mod (Forge) │ porta 25580 (HTTP API + SSE)
│ rodando no host │
└────────┬─────────┘
│ HTTP X-Liberthia-Token
▼
┌──────────────────────────────────────────────────────────────────┐
│ Docker Swarm Stack │
│ │
│ ┌──────────────┐ ┌──────────────────┐ ┌────────────────────┐ │
│ │ PostgreSQL │ │ Backend (Java) │ │ Frontend (nginx) │ │
│ │ port 5432 │←─│ port 8090 │←─│ port 5173 → 80 │ │
│ │ │ │ • engines │ │ • SPA React │ │
│ │ • configs │ │ • REST API │ │ • proxy /api /ws │ │
│ │ • snapshots │ │ • WebSocket /ws │ │ │ │
│ │ • chat log │ │ • SSE consumer │ │ │ │
│ │ • map cache │ │ │ │ │ │
│ └──────────────┘ └──────────────────┘ └────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
- Docker 24+ e Docker Compose v2 (ou Swarm)
- Servidor Minecraft com o mod Liberthia rodando em algum host alcançável
cd deploy
# (opcional) ajusta variáveis em .env
cat > .env <<EOF
LIBERTHIA_PASSWORD=minhasenhasegura
LIBERTHIA_SECRET=$(openssl rand -hex 32)
MOD_URL=http://host.docker.internal:25580
MOD_TOKEN=cole-aqui-o-token-do-mod
POSTGRES_PASSWORD=postgres-strong-password
EOF
docker compose -f docker-stack.yml up --buildAcesse o painel em http://localhost:5173
# Inicializa o swarm (1 vez só)
docker swarm init
# Builda as imagens locais
docker build -t liberthia/backend:latest -f deploy/backend.Dockerfile .
docker build -t liberthia/frontend:latest -f deploy/frontend.Dockerfile .
# Deploy do stack
docker stack deploy -c deploy/docker-stack.yml liberthia
# Status
docker stack services liberthia
docker stack ps liberthia
# Logs
docker service logs -f liberthia_backend
docker service logs -f liberthia_frontend
# Update (após rebuild da imagem)
docker service update --image liberthia/backend:latest liberthia_backend
# Remover stack
docker stack rm liberthia| Variável | Default | Descrição |
|---|---|---|
LIBERTHIA_PASSWORD |
liberthia2026 |
Senha do painel web |
LIBERTHIA_SECRET |
random | Secret JWT (gere com openssl rand -hex 32) |
MOD_URL |
http://host.docker.internal:25580 |
URL HTTP do mod Forge |
MOD_TOKEN |
liberthia-dev-token |
Token X-Liberthia-Token configurado no liberthia-server.toml |
POSTGRES_PASSWORD |
liberthia_pw |
Senha do banco PostgreSQL |
PGADMIN_PASSWORD |
liberthia_pw |
Senha do pgAdmin (acessar em http://localhost:5050) |
O arquivo init.sql é executado automaticamente na primeira inicialização do container PostgreSQL via /docker-entrypoint-initdb.d/. Contém:
- DDL de todas as tabelas (
CREATE TABLE IF NOT EXISTS) - Seed de presets cosmic horror:
- 5 entidades de possession (Yh'kuath, Vorashen, Mor'Ghaur, Last Pilgrim, Iss'thar)
- 4 cursed items (Olho de Vorash, Coração Rachado, Coroa do Silêncio, Sino de Ossos)
- 4 glifos pré-posicionados (Olho, Vazio, Sangue, Silêncio)
- 2 dimensional rifts (Fenda do Vazio, Portão dos Perdidos)
- 2 memory echoes (Círculo dos Esquecidos, Memória da Batalha)
- 4 dias especiais no calendário cósmico
- 3 cutscenes agendadas (Sussurro da Meia-Noite, Bênção da Aurora, Fantasma Aleatório)
- 4 forbidden words rules (vorashen, corra, socorro, deus/divino)
- 1 time-locked box exemplo (Caixa da Aurora)
- Config do Madness Meter com mensagens, sons e FX
Pra rodar manualmente em DB existente:
psql "postgresql://liberthia:senha@host:5432/liberthia" -f deploy/init.sqlÉ idempotente — pode rodar várias vezes, usa IF NOT EXISTS e ON CONFLICT DO NOTHING.
# Backup
docker exec liberthia_postgres pg_dump -U liberthia liberthia > backup.sql
# Restore
docker exec -i liberthia_postgres psql -U liberthia liberthia < backup.sql- email:
admin@liberthia.local - pwd:
${PGADMIN_PASSWORD}
Add server:
- Host:
postgres - Port:
5432 - Database:
liberthia - Username:
liberthia - Password:
${POSTGRES_PASSWORD}
forbidden_rules,forbidden_invocationsmadness_config,madness_statepossession_entities,possession_activecursed_items,cursed_bindingsriftsglyphstime_boxesmemory_echoes,memory_echoes_activecalendar_config,calendar_special_dayscutscenes
chat_log— toda mensagem de chatcommand_log— todo comando executadoplayer_snapshots— backup de inventário/posição (auto a cada 5min)map_chunks— cache PNG de chunks do mapa (BYTEA)
- Backups regulares: rodar
pg_dumpem cron, salvar fora do container - TLS: colocar nginx/caddy/traefik na frente do
frontendpra HTTPS - Secrets: usar
docker secretem vez de env vars com${POSTGRES_PASSWORD} - Backend replicas = 1: as engines usam
@Schedulede cooldowns em memória. Múltiplas réplicas processariam o mesmo evento N vezes. Pra escalar: precisaria de coordenação (Redis lock, leader election, etc.) - Frontend escalável: nginx é stateless, escala livremente
- PostgreSQL pinned no manager: postgres tem volume local, então fixa em um node específico no swarm. Pra HA: use postgres com replicação ou serviço gerenciado (Neon, RDS, etc.)
Backend não conecta no mod:
MOD_URL=http://host.docker.internal:25580 funciona no Docker Desktop (Mac/Windows). No Linux puro, usa o IP da rede do host: MOD_URL=http://172.17.0.1:25580 ou habilita host networking.
Backend OOM:
Aumenta JAVA_OPTS=-Xmx1g e resources.limits.memory: 1.5G.
Migration do banco:
JPA está com ddl-auto: update — adiciona colunas novas automaticamente. Mas pra mudanças destrutivas (drop column, rename), faça manualmente via psql.
Reset total do banco:
docker volume rm liberthia_postgres_data
docker stack deploy -c deploy/docker-stack.yml liberthia