Riferimento al deploy self-hosted Node di Emdash CMS
Esegui EmDash sulla tua infrastruttura con un percorso architetturale progressivo da SQLite a PostgreSQL e object storage.
Quando il self-hosting è la scelta giusta
Scegli il self-hosting quando i vincoli sono operativi, legali o architetturali:
- i requisiti di residenza dei dati sono rigidi
- gestisci già internamente servizi di piattaforma condivisi
- hai bisogno di pieno controllo su runtime, modello di processo e percorsi di rete
- vuoi evitare nelle fasi iniziali la dipendenza da cloud gestiti
Il self-hosting non è automaticamente più economico. Di solito è più controllabile.
Modello di progressione consigliato
Non partire dalla massima complessità. Usa un rollout a fasi:
- Node.js + SQLite + storage file locale
- PostgreSQL per sicurezza multi-istanza e maggiore durabilità
- object storage compatibile S3 per portabilità dei media
- supervisione dei processi e rafforzamento dell’osservabilità
Questa sequenza minimizza lo shock di migrazione mantenendo un percorso di produzione pulito.
Architettura di base (Fase 1)
Per produzione single-node o lancio iniziale:
- runtime applicativo: adapter Node (
standalone) - database: file SQLite su disco persistente
- media: directory upload locale
- reverse proxy: Nginx o Caddy
Questa configurazione è sufficiente per carichi editoriali da bassi a moderati con una singola istanza runtime.
# Build ed esecuzione in produzione
npm install
npm run build
npm run start
Criteri di upgrade alla Fase 2 (passaggio a PostgreSQL)
Aggiorna il database quando si verifica uno di questi casi:
- la contesa su scritture concorrenti diventa frequente
- gli obiettivi di backup/recovery superano la strategia di copia file
- hai bisogno di deploy multi-istanza più sicuro
Passa a PostgreSQL prima di aggiungere scaling orizzontale dell’app. Scalare nodi applicativi su SQLite crea rapidamente rischi operativi.
Strategia storage: file locali vs object storage
File locali (inizia da qui)
Adatto ad ambienti a singola istanza con crescita dello storage prevedibile.
Object storage compatibile S3 (passa qui per scalare)
Usalo quando:
- più istanze applicative richiedono accesso condiviso ai media
- backup e disaster recovery devono essere standardizzati
- la strategia CDN ed edge cache dipende da URL oggetto stabili
MinIO può essere usato su infrastruttura privata per un comportamento compatibile S3.
Baseline di processo runtime e proxy
Gestione dei processi
Usa uno tra:
systemdper controllo servizi nativo Linuxpm2per team che vogliono metriche di processo e riavvii rapidi
Reverse proxy
Termina il TLS sul proxy e inoltra all’app Node:
- preserva header
HosteX-Forwarded-* - configura il percorso di health check
- imposta limiti dimensione body allineati alla policy upload
Policy di backup e recovery
Tratta la policy di backup come requisito bloccante per il lancio, non come attività post-lancio.
Baseline minima:
- snapshot database pianificati
- backup o replica dello storage media
- prova di restore almeno una volta prima del lancio pubblico
Un backup mai ripristinato in test è una voce, non un controllo.
Checklist di prontezza operativa
Prima del cutover in produzione, conferma:
- il riavvio a freddo funziona senza modifiche manuali
- i log applicativi sono centralizzati e ricercabili
- l’alerting 5xx è attivo
- uso disco e crescita storage sono monitorati
- il processo di rotazione secret è documentato
Note di migrazione da setup orientato a Cloudflare
Se il tuo progetto è nato con assunzioni Cloudflare:
- rimuovi i binding esclusivi cloud dalla configurazione runtime
- sostituisci adapter D1/R2 con adapter database e storage compatibili Node
- rivalida auth e callback URL dietro il reverse proxy
Il rischio di migrazione è soprattutto nelle assunzioni ambientali, non nel codice a livello pagina.
Quadro decisionale per i team
Usa questa regola:
- se ti servono velocità e minima operatività, preferisci il percorso cloud gestito
- se ti servono controllo e integrazione con l’infrastruttura esistente, preferisci il percorso self-hosted
Scegli un percorso predefinito per ambiente. Modelli di deploy ibridi sono possibili, ma aumentano carico cognitivo e onere di supporto.