Pular para o conteúdo

Desenvolvimento e arquitetura

Como rodar o painel no seu computador e como o código está organizado. Para contribuir (padrões, testes, fluxo de pull request), leia o CONTRIBUTING.md.

Janela do terminal
pnpm install
SETUP_TOKEN=dev-token pnpm dev
# ou, com Docker:
SETUP_TOKEN=dev-token docker compose -f docker-compose.dev.yml up
  • Painel (build de produção servido pela API): http://localhost:9000
  • Frontend com hot reload: http://localhost:5173 (proxy /api → 9000)
  • Wizard: http://localhost:5173/setup com o token dev-token
  • Domínios de projeto: use *.localhost (servidos em HTTP puro pelo Caddy, sem SSL)

Exemplos prontos para deploy em examples/.

Monorepo pnpm com TypeScript estrito de ponta a ponta:

tws-panel/
├── apps/
│ ├── server/ # API Fastify: wizard, projetos, domínios, e-mail,
│ │ # certificados, notificações, backups,
│ │ # segurança, alertas e auditoria
│ └── web/ # SPA React (Vite + Tailwind + shadcn/ui):
│ # wizard /setup + dashboard dark pt-BR
├── packages/
│ ├── core/ # tipos e constantes compartilhados
│ ├── security/ # engine de scan + hardening + baseline/diff
│ ├── deploy/ # detecção, ingestão, guardrails, Caddy, pipelines
│ └── mailer/ # Stalwart, DKIM, checklist DNS, blacklist,
│ # nota de entregabilidade
├── scripts/
│ ├── install.sh # instalador one-shot (idempotente, 100% Docker)
│ ├── hardening/ # scripts shell idempotentes por fase (00–07)
│ ├── hooks/ # hooks git locais (pre-commit / pre-push)
│ ├── show-token.sh, reset-*.sh, reativar-acesso-ip.sh,
│ │ restaurar-painel.sh, uninstall.sh # utilitários de operação na VPS
│ └── test-*.mts # suítes de verificação (Fases 3 e 4)
├── examples/ # apps de exemplo para deploy (apenas testes)
├── site/ # site de documentação (Starlight); os guias ficam em site/src/content/docs/
├── docs/ # imagens do README, specs internas e textos de comunidade em pt-BR
├── comoFuncionaSistema/ # documentação legível por máquina (para agentes de IA)
├── Dockerfile # build multi-stage do painel (produção)
├── docker-compose.yml # produção: painel em 127.0.0.1:PAAS_PORT (padrão 9000)
└── docker-compose.dev.yml # dev local com hot reload

Como os módulos se relacionam:

┌─────────────┐
browser ───►│ apps/web │ (SPA: wizard + dashboard)
└──────┬──────┘
│ /api
┌──────▼──────┐ ┌───────────────┐
│ apps/server │─────►│ @paas/security│──► host (Lynis, UFW,
│ (Fastify) │ └───────────────┘ fail2ban, baseline)
└──┬───┬───┬──┘
│ │ │ ┌───────────────┐
│ │ └─────►│ @paas/deploy │──► Docker + Caddy central
│ │ └───────────────┘ (SSL automático)
│ │ ┌───────────────┐
│ └─────────►│ @paas/mailer │──► Stalwart (SMTP/IMAP/DKIM)
│ └───────────────┘ + Roundcube (webmail)
│ ┌───────────────┐
└─────────────►│ @paas/core │ (tipos compartilhados)
└───────────────┘
Estado persistido no volume paas_data (/data, arquivos JSON, modo 0600)
— sem banco de dados. Serviços externos só os que você ligar: GitHub,
Telegram e o armazenamento S3/R2 dos backups.

Os guias moram em site/src/content/docs/<idioma>/ (en é o padrão, pt-br o secundário) e são publicados com o Starlight. Os arquivos têm o mesmo caminho em cada idioma; uma página que ainda não foi traduzida aparece em inglês no site. Para adicionar um idioma, crie a pasta dele ao lado de en/ e acrescente uma entrada em locales no site/astro.config.mjs.

Janela do terminal
pnpm docs:dev # servidor local com recarga automática
pnpm docs:build # gera site/dist (mesma etapa do GitHub Pages)
pnpm docs:links # confere os links internos e as âncoras de todos os .md

Entre guias, use links relativos para o arquivo .md (por exemplo ../guides/operations.md#anchor): eles funcionam no GitHub e são reescritos para as URLs do site no build.