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:
- Node.js + SQLite + armazenamento de arquivos local
- PostgreSQL para segurança multi-instância e durabilidade mais forte
- armazenamento de objetos compatível com S3 para portabilidade de mídia
- 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:
systemdpara controle de serviço nativo Linuxpm2para 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
HosteX-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.