1 12/10/2026 9 min

Su Debian 12, Zulip conviene installarlo come servizio dedicato e non come stack improvvisato sopra il web server di turno. La scelta pratica è semplice: lasci al pacchetto/installer ufficiale la gestione dell’applicazione, tieni PostgreSQL e Redis locali, metti Nginx davanti e verifichi subito che mail, hostname e DNS siano coerenti. Se sbagli questi tre punti, l’installazione “parte” ma poi l’account creation, gli inviti o le notifiche si rompono più avanti.

Prima di toccare il server, definisci il nome pubblico dell’istanza, per esempio chat.example.com, e assicurati che punti all’IP corretto con record A/AAAA. Se prevedi invio posta, prepara anche un dominio o sottodominio dedicato, perché Zulip vive meglio quando il traffico SMTP non è mescolato con il resto dell’infrastruttura. La logica è: prima identità, poi trasporto, infine funzionalità.

Prerequisiti minimi e scelta dell’architettura

Per una installazione pulita su Debian 12, usa una VM o un server con almeno 2 vCPU, 4 GB di RAM e 40 GB di disco se pensi di restare su un gruppo piccolo. Se prevedi allegati, crescita utenti o retention lunga dei messaggi, alza il margine sul disco. Zulip non è leggerissimo: il collo di bottiglia più comune non è il codice applicativo ma la combinazione tra database, cache e I/O.

Il flusso che segue assume una installazione singola, con Zulip dietro Nginx sullo stesso host. È il caso più lineare per una community o per un team interno. Se vuoi separare i ruoli su più nodi, il principio non cambia, ma devi gestire in modo esplicito PostgreSQL, Redis e il reverse proxy. Qui parto dal caso più utile per chi deve mettere online un servizio stabile in tempi ragionevoli.

Aggiornamento base del sistema e pacchetti necessari

Parti dal sistema aggiornato. Non è formalità: Zulip dipende da componenti che devono essere allineati per evitare incompatibilità banali ma fastidiose.

sudo apt update
sudo apt -y upgrade
sudo apt -y install curl wget ca-certificates gnupg lsb-release ufw unzip

Controlla anche che l’orario sia corretto, perché TLS, log e alcuni flussi di autenticazione soffrono quando il clock del server è fuori asse.

timedatectl status

Se vedi System clock synchronized: no, correggi prima di continuare. Su Debian 12 il servizio NTP di sistema di solito basta, ma in ambienti bloccati o con policy particolari conviene verificare subito.

Download del pacchetto ufficiale Zulip

Per evitare bricolage inutili, usa il pacchetto ufficiale della release che vuoi installare. Il file cambia con la versione, quindi scaricalo dal sito Zulip o dalla release che hai scelto e verifica sempre checksum o firma se disponibili nel tuo processo operativo.

Un esempio operativo, da adattare al nome reale del pacchetto:

wget https://download.zulip.com/server/zulip-server-latest.tar.gz
sudo tar -xzf zulip-server-latest.tar.gz -C /tmp
cd /tmp/zulip-server-*

Se preferisci una procedura più controllata, scarica la release specifica e conserva il tarball in un repository interno. In contesti di change controllato, è meglio sapere esattamente quale versione hai messo in produzione e poterla riusare in rollback.

Installazione guidata: database, Redis e web server

L’installer ufficiale di Zulip prepara i componenti necessari e configura il servizio. Durante il setup ti verranno richiesti hostname, mail domain e altri parametri fondamentali. Qui non conviene andare a intuito: un hostname errato oggi diventa un problema di login, callback o link assoluti domani.

sudo ./scripts/setup/install --help

Se il pacchetto include uno script di installazione interattivo, leggilo prima di eseguirlo. La forma esatta può cambiare tra versioni, ma il concetto resta identico: l’installer prepara il servizio applicativo, il database, la cache e il front-end.

In genere il percorso corretto è simile a questo:

sudo ./scripts/setup/install \ --hostname=chat.example.com \ --email-address=admin@example.com

Se la tua release usa un comando diverso, sostituiscilo con quello indicato dalla documentazione inclusa nel pacchetto. Il punto importante non è il nome esatto del comando, ma il fatto che hostname e mail siano definiti subito e in modo consistente.

Durante questa fase, l’installer tende a configurare:

  • PostgreSQL come database principale.
  • Redis per code, cache e lavoro asincrono.
  • Nginx come reverse proxy.
  • Servizi systemd per applicazione, worker e componenti correlati.
  • Se uno di questi blocchi non parte, non forzare subito modifiche a caso. Prima leggi i log del servizio specifico e identifica il layer rotto.

    Verifica dei servizi systemd

    Dopo l’installazione, il controllo più utile è quello dei servizi. Su Debian 12, systemd ti dà un quadro più affidabile della semplice pagina web caricata dal browser.

    systemctl status zulip-server
    systemctl status nginx
    systemctl status postgresql
    systemctl status redis-server
    

    Il risultato atteso è active (running) per i servizi coinvolti. Se uno è failed, apri subito il journal associato:

    journalctl -u zulip-server -b --no-pager
    journalctl -u nginx -b --no-pager
    journalctl -u postgresql -b --no-pager
    

    Se il problema è nella rete o nel certificato, spesso lo vedi più velocemente dal proxy che dall’applicazione. Se invece la pagina si apre ma il login fallisce o le notifiche non partono, il sospetto si sposta su mail, database o worker asincroni.

    Configurazione DNS e certificato TLS

    Il dominio pubblico deve risolvere verso il server giusto. Prima di ragionare sul resto, verifica dal client o da un resolver esterno:

    dig +short chat.example.com A
    dig +short chat.example.com AAAA
    

    Se usi IPv6, assicurati che il record AAAA sia realmente raggiungibile. Un AAAA rotto è peggio di nessun AAAA, perché alcuni client lo preferiscono e poi vanno in timeout. È uno degli errori più sottovalutati quando un sito “sembra” giusto ma carica male.

    Per TLS, se Nginx gestisce il certificato, emetti un certificato valido per l’hostname dell’istanza. Con Let’s Encrypt la procedura tipica è lineare, ma dipende dal fatto che il port 80 sia raggiungibile almeno temporaneamente.

    sudo apt -y install certbot python3-certbot-nginx
    sudo certbot --nginx -d chat.example.com
    

    Dopo il rilascio del certificato, controlla rinnovo e configurazione di Nginx. Un errore comune è lasciare un redirect o un server_name incoerente con il certificato, con il risultato di generare warning del browser e callback interrotti.

    Mail: il punto che decide se Zulip è davvero utilizzabile

    Zulip senza posta funzionante è un’istanza dimezzata. Inviti, reset password e notifiche dipendono da SMTP. Non basta “avere una mail”: serve un server o relay che accetti connessioni dal nodo Zulip e che sia coerente con SPF, DKIM e, se usi DMARC, con la policy del dominio.

    Prima di integrare Zulip, prova il relay con uno strumento semplice o con i log del servizio MTA. Se hai un relay esterno, verifica che l’IP del server sia autorizzato. Se invii direttamente, la deliverability sarà il tuo problema principale, non la parte applicativa.

    Nel file di configurazione dell’istanza, imposta i parametri SMTP secondo il tuo ambiente. La posizione esatta del file può variare con la release, ma di solito trovi un file di configurazione applicativa sotto una directory dedicata all’istanza, ad esempio nell’area di installazione di Zulip. L’obiettivo è avere:

  • host SMTP corretto.
  • porta corretta, spesso 587 o 465.
  • username e password del relay, se richiesti.
  • encryption coerente con il server remoto.
  • Non salvare segreti in chiaro in documentazione operativa o ticket. Se devi condividere il contenuto della configurazione, redigi username e password e conserva i valori reali in un secret manager o nel vault aziendale.

    Accesso iniziale e creazione dell’amministratore

    Una volta che la UI risponde, crea il primo amministratore e verifica che l’account abbia i permessi necessari per gestire realm, utenti e impostazioni globali. Il primo login serve anche a capire se il flusso di email funziona davvero: se il sistema richiede conferma o invia link di attivazione, il problema di SMTP emerge subito.

    Se l’interfaccia carica ma il bootstrap dell’account fallisce, controlla prima i log dell’applicazione e poi la connessione al database. Un errore lato browser può essere solo la superficie di un problema a valle, per esempio una migrazione non completata o un worker bloccato.

    Controlli operativi dopo il go-live

    Una installazione fatta bene non finisce con la pagina di login. I controlli minimi che farei nelle prime ore sono questi:

  • Apri la home di Zulip da browser esterno e verifica che il certificato sia valido.
  • Controlla che il login funzioni con un account reale.
  • Invia una mail di test o un reset password e verifica la consegna.
  • Controlla i log di Nginx e dell’app per errori 4xx/5xx ricorrenti.
  • Verifica spazio disco e RAM con df -h e free -h.
  • Per osservabilità base, vale la pena tenere d’occhio almeno latenza HTTP, error rate e saturazione disco. Se il servizio cresce, il primo sintomo di sofferenza non è sempre un down totale: spesso è un rallentamento progressivo, la coda mail che si accumula o il database che inizia a rispondere lento.

    Backup e rollback: cosa salvare prima di cambiare qualcosa

    Se tocchi configurazione, aggiornamenti o migrazioni, il rollback non va improvvisato. Prima di modificare l’istanza, salva almeno la configurazione e il database. In un’installazione classica, i due elementi critici sono il dump PostgreSQL e la directory di configurazione dell’istanza.

    sudo -u postgres pg_dump zulip > zulip-$(date +%F).sql
    sudo tar -czf zulip-config-$(date +%F).tar.gz /etc/zulip /home/zulip
    

    Il path esatto può cambiare in base al layout dell’installazione, quindi verifica prima dove il pacchetto ha collocato file e dati. Se non sei sicuro, individua i riferimenti dalla configurazione del servizio o dal contenuto dell’unit systemd.

    Il rollback tipico di un cambio fallito è semplice: ripristini la config precedente, riavvii i servizi e, se necessario, reimporti il dump. Se hai cambiato solo Nginx o il certificato, il rollback resta confinato al layer edge e non deve toccare il database.

    Quando l’installazione non va: i tre punti che rompono quasi sempre tutto

    Se qualcosa si blocca, nella pratica i colpevoli ricorrenti sono sempre gli stessi. Primo: hostname errato, che manda fuori fase URL, cookie e certificato. Secondo: posta non funzionante, che fa sembrare l’istanza incompleta anche se la UI è su. Terzo: risorse insufficienti o disco pieno, che degradano database e worker in modo intermittente.

    La strategia corretta è non spostare subito il problema in un refactor più ampio. Misura prima il layer che cade, correggi la causa minima, poi decidi se serve hardening, tuning o separazione dei ruoli. Questa sequenza evita ore perse a inseguire effetti collaterali.

    Una configurazione sobria è spesso quella che dura di più

    Su Debian 12, Zulip si installa bene quando eviti di sovrapporre troppi strumenti che fanno la stessa cosa. Nginx davanti, PostgreSQL e Redis ben tenuti, mail verificata, DNS pulito e backup già pronti: non serve altro per partire in modo serio. Se poi la community cresce, separerai i ruoli e introdurrai monitoraggio più fine. Ma la base deve essere semplice, leggibile e ripristinabile.

    Se vuoi fare le cose con metodo, tratta la prima installazione come un change controllato: documenta versione, hostname, parametri SMTP, percorso dei file critici e comando di rollback. È il modo più economico per evitare che la prossima manutenzione diventi una caccia al bug a memoria.