Referência de implantação self-hosted do EmDash CMS em Node

Execute o EmDash na sua própria infraestrutura com um caminho arquitetural progressivo de SQLite para PostgreSQL e armazenamento de objetos.

Quando self-hosting é a escolha certa

Escolha self-hosting quando suas restrições forem operacionais, legais ou arquiteturais:

  • requisitos de residência de dados são rígidos
  • você já opera serviços de plataforma compartilhados internamente
  • precisa de controle total sobre runtime, modelo de processo e caminhos de rede
  • quer evitar acoplamento com nuvem gerenciada nos estágios iniciais

Self-hosting não é automaticamente mais barato. Em geral é mais controlável.

Modelo de progressão recomendado

Não comece com complexidade máxima. Use um rollout em etapas:

  1. Node.js + SQLite + armazenamento de arquivos local
  2. PostgreSQL para segurança multi-instância e durabilidade mais forte
  3. armazenamento de objetos compatível com S3 para portabilidade de mídia
  4. supervisão de processo e endurecimento de observabilidade

Essa sequência minimiza choque de migração preservando um caminho de produção limpo.

Arquitetura base (estágio 1)

Para produção single-node ou lançamento inicial:

  • runtime do app: adapter Node (standalone)
  • banco: arquivo SQLite em disco persistente
  • mídia: diretório local de uploads
  • proxy reverso: Nginx ou Caddy

Essa configuração basta para cargas editoriais baixas a moderadas com uma instância de runtime.

# Build e execução em produção
npm install
npm run build
npm run start

Critérios de upgrade estágio 2 (migrar para PostgreSQL)

Faça upgrade do banco quando qualquer um destes aparecer:

  • contenção de escrita concorrente frequente
  • objetivos de backup/recuperação além da estratégia de cópia de arquivo
  • necessidade de implantação multi-instância mais segura

Use PostgreSQL antes de escalar horizontalmente o app. Escalar nós de app em SQLite cria risco operacional rápido.

Estratégia de armazenamento: arquivos locais vs armazenamento de objetos

Arquivos locais (comece aqui)

Bom para ambientes single-instance com crescimento de armazenamento previsível.

Armazenamento de objetos compatível com S3 (migre aqui para escala)

Use quando:

  • várias instâncias do app precisam de acesso compartilhado à mídia
  • backup e recuperação de desastre devem ser padronizados
  • estratégia de CDN e cache de borda depende de URLs de objeto estáveis

MinIO pode ser usado em infra privada para comportamento compatível com S3.

Processo de runtime e baseline de proxy

Gestão de processos

Use uma de:

  • systemd para controle de serviço nativo Linux
  • pm2 para equipes que querem métricas de processo e reinícios rápidos

Proxy reverso

Termine TLS no proxy e encaminhe para o app Node:

  • preserve cabeçalhos Host e X-Forwarded-*
  • configure caminho de health check
  • defina limites de tamanho de corpo alinhados à política de upload

Política de backup e recuperação

Trate política de backup como bloqueante de lançamento, não tarefa pós-lançamento.

Baseline mínimo:

  • snapshots do banco em cronograma
  • backups ou replicação do armazenamento de mídia
  • exercício de restauração pelo menos uma vez antes do lançamento público

Backup que nunca foi restaurado em teste é rumor, não controle.

Checklist de prontidão operacional

Antes do corte para produção, confirme:

  • cold restart funciona sem edições manuais
  • logs da aplicação estão centralizados e pesquisáveis
  • alertas de 5xx estão ativos
  • uso de disco e crescimento de armazenamento são monitorados
  • processo de rotação de segredos está documentado

Notas de migração a partir de setup orientado à Cloudflare

Se o projeto começou com suposições da Cloudflare:

  • remova bindings só de nuvem da config de runtime
  • substitua adapters D1/R2 por adapters de banco e armazenamento compatíveis com Node
  • revalide URLs de auth e callbacks atrás do seu proxy reverso

O risco de migração está sobretudo em suposições de ambiente, não em código de página.

Framework de decisão para equipes

Use esta regra:

  • se precisa de velocidade e ops mínimos, prefira caminho de nuvem gerenciada
  • se precisa de controle e integração com infra existente, prefira self-hosting

Escolha um caminho padrão por ambiente. Modelos híbridos de implantação são possíveis, mas aumentam carga cognitiva e fardo de suporte.