This article provides a detailed step-by-step guide outlining how to install and run Zulip on Debian VPS.
What is Zulip?
Zulip is an open-source team chat platform designed to combine the best aspects of real-time messaging (like Slack or Discord) with the structured organization of email-style threads.
🔑 Key Features:
- Threaded Conversations (Topics):
Each message is sent to a stream and organized into a topic, allowing for structured discussions that are easy to follow—even if you’re away for a while. - Streams & Topics:
Think of streams as channels (like in Slack), and topics as threads within those channels. - Asynchronous + Real-time Communication:
You can catch up on conversations without missing important context. Zulip makes it easy to reply to older messages without interrupting newer ones. - Open Source & Self-hostable:
Zulip is fully open-source and can be deployed on your own server, making it ideal for privacy-conscious teams or organizations with compliance needs. - Integrations:
Supports 100+ integrations (GitHub, Jenkins, Jira, etc.) and a full-featured API. - Cross-platform Support:
Available on web, desktop (Windows, macOS, Linux), and mobile (iOS, Android). - Enterprise Features:
LDAP/Active Directory support, SAML SSO, two-factor authentication, audit logs, and more.
✅ Best For:
- Remote teams needing organized, async-friendly communication
- Open-source communities
- Privacy-sensitive organizations (education, healthcare, government)
- Companies that outgrow Slack’s message chaos
🔍 Comparison:
Feature | Zulip | Slack | Discord |
---|---|---|---|
Threading Model | Topic-based | Inline threads | None (mostly) |
Self-hosted | ✅ Yes | ❌ No | ❌ No |
Open Source | ✅ Yes | ❌ No | ❌ No |
Async-friendly | ✅ Excellent | ⚠️ Limited | ❌ Real-time focus |
In short, Zulip is a structured, flexible, and powerful chat platform built for teams that value organized conversations and open-source control.
🧰 Prerequisites
- A VPS running Debian 10, Debian 11, or Debian 12 (fresh install preferred)
- At least 2 GB RAM (4 GB recommended)
- Root or sudo access
- A domain name pointing to the VPS IP
- SMTP server credentials for email notifications
- Firewall access to ports:
80
,443
How to Install and Run Zulip on Debian VPS
To install and run Zulip on Debian VPS, follow the steps provided below:
-
Update System Packages
Login as root via SSH and run the following commands:
sudo apt update && sudo apt upgrade -y
Install common dependencies:
sudo apt install -y curl wget git build-essential
-
Set Hostname and FQDN
Set your hostname to match your domain:
sudo hostnamectl set-hostname chat.example.com
Edit
/etc/hosts
and add:127.0.0.1 chat.example.com chat
Replace
chat.example.com
with your actual domain. -
Install Docker and Docker Compose
Zulip uses Docker for easier setup.
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
Add your user to the Docker group:
sudo usermod -aG docker $USER
Then log out and back in.
Install Docker Compose:
sudo apt install -y docker-compose
-
Download Zulip Docker Project
Clone Zulip’s official Docker deployment repo:
git clone https://github.com/zulip/docker-zulip.git cd docker-zulip
-
Configure Zulip Settings
Create a copy of the Zulip settings template:
cp /etc/zulip/settings.py /etc/zulip/settings.py.bak
Edit the
zulip/settings.py
file:nano /etc/zulip/settings.py
Update the following:
EXTERNAL_HOST = 'chat.example.com' # Your domain EMAIL_HOST = 'smtp.yourdomain.com' # Your SMTP server EMAIL_HOST_USER = 'you@yourdomain.com' EMAIL_HOST_PASSWORD = 'your_email_password' EMAIL_PORT = 587 EMAIL_USE_TLS = True
-
Set Up SSL with Let’s Encrypt
Run the built-in Let’s Encrypt script:
./scripts/setup/ssl/setup-letsencrypt-certbot
This will automatically obtain and configure an SSL certificate for your domain.
If needed, you can manually generate SSL and copy certs to
zulip/certs
folder. -
Start Zulip Services
From the project root:
docker-compose up -d
This will spin up multiple Zulip containers (app, db, memcached, redis, etc.).
-
Create Initial User
Once the services are up (you can check with
docker ps
), create the initial admin user:docker-compose exec zulip /home/zulip/deployments/current/manage.py create_realm \ --realm_name="My Organization" \ --realm_host=chat.example.com \ --email=admin@example.com
Then create the admin password:
docker-compose exec zulip /home/zulip/deployments/current/manage.py change_user_password admin@example.com
-
Access Zulip Web Interface
Visit
https://chat.example.com
in your browser and log in with the admin credentials:
-
Enable Firewall and HTTPS Redirect
Install and configure UFW:
sudo apt install ufw sudo ufw allow OpenSSH sudo ufw allow 80,443/tcp sudo ufw enable
Zulip should already redirect HTTP to HTTPS automatically via Nginx.
-
Maintenance Tips
- Restart Zulip:
docker-compose restart
- Check logs:
docker-compose logs -f
- Backup volumes: Check
docker-compose.yml
for volume paths - Update Zulip: Pull latest repo and re-deploy
- Restart Zulip:
📌 Summary
Step | Action |
---|---|
1 | Update system & install base packages |
2 | Set FQDN hostname |
3 | Install Docker and Compose |
4 | Clone Zulip repo |
5 | Configure settings (domain, SMTP, etc.) |
6 | Setup SSL (Let’s Encrypt) |
7 | Deploy Zulip with Docker |
8 | Create admin account |
9 | Access web UI |
10 | Setup firewall, backups, and monitor services |
Conclusion
You now know how to install and run Zulip on Debian VPS.