Zulip
Open-source threaded team chat designed to keep team communication organized and productive.
Configuration
version: "3.8"
services:
database:
image: zulip/zulip-postgresql:14
restart: unless-stopped
secrets:
- zulip__postgres_password
environment:
POSTGRES_DB: zulip
POSTGRES_USER: zulip
POSTGRES_PASSWORD_FILE: /run/secrets/zulip__postgres_password
volumes:
- zulipPostgresData:/var/lib/postgresql/data
memcached:
image: memcached:alpine
restart: unless-stopped
command:
- sh
- -euc
- |
echo 'mech_list: plain' > "$$SASL_CONF_PATH"
echo "zulip@$$HOSTNAME:$$(cat $$MEMCACHED_PASSWORD_FILE)" > "$$MEMCACHED_SASL_PWDB"
echo "zulip@localhost:$$(cat $$MEMCACHED_PASSWORD_FILE)" >> "$$MEMCACHED_SASL_PWDB"
exec memcached -S
secrets:
- zulip__memcached_password
environment:
SASL_CONF_PATH: /home/memcache/memcached.conf
MEMCACHED_SASL_PWDB: /home/memcache/memcached-sasl-db
MEMCACHED_PASSWORD_FILE: /run/secrets/zulip__memcached_password
rabbitmq:
image: rabbitmq:4.2
restart: unless-stopped
command:
- sh
- -euc
- |
export RABBITMQ_DEFAULT_PASS="$$(cat $$RABBITMQ_PASSWORD_FILE)"
echo "default_user = $$RABBITMQ_DEFAULT_USER" >> /etc/rabbitmq/rabbitmq.conf
echo "default_pass = $$RABBITMQ_DEFAULT_PASS" >> /etc/rabbitmq/rabbitmq.conf
exec docker-entrypoint.sh rabbitmq-server
secrets:
- zulip__rabbitmq_password
environment:
RABBITMQ_DEFAULT_USER: zulip
RABBITMQ_PASSWORD_FILE: /run/secrets/zulip__rabbitmq_password
volumes:
- zulipRabbitmqData:/var/lib/rabbitmq
redis:
image: redis:alpine
restart: unless-stopped
command:
- sh
- -euc
- /usr/local/bin/docker-entrypoint.sh --requirepass "$$(cat $$REDIS_PASSWORD_FILE)"
secrets:
- zulip__redis_password
environment:
REDIS_PASSWORD_FILE: /run/secrets/zulip__redis_password
volumes:
- zulipRedisData:/data
zulip:
image: ghcr.io/zulip/zulip-server:12.1-0
restart: unless-stopped
depends_on:
- database
- memcached
- rabbitmq
- redis
secrets:
- zulip__postgres_password
- zulip__memcached_password
- zulip__rabbitmq_password
- zulip__redis_password
- zulip__secret_key
environment:
SETTING_EXTERNAL_HOST: ${ZULIP_EXTERNAL_HOST}
SETTING_ZULIP_ADMINISTRATOR: ${ZULIP_ADMINISTRATOR}
SETTING_REMOTE_POSTGRES_HOST: database
SETTING_MEMCACHED_LOCATION: memcached:11211
SETTING_RABBITMQ_HOST: rabbitmq
SETTING_REDIS_HOST: redis
CONFIG_application_server__http_only: "true"
LOADBALANCER_IPS: ${ZULIP_LOADBALANCER_IPS}
volumes:
- zulipData:/data
ulimits:
nofile:
soft: 1000000
hard: 1048576
volumes:
zulipData:
zulipPostgresData:
zulipRabbitmqData:
zulipRedisData:
secrets:
zulip__postgres_password:
environment: ZULIP_POSTGRES_PASSWORD
zulip__memcached_password:
environment: ZULIP_MEMCACHED_PASSWORD
zulip__rabbitmq_password:
environment: ZULIP_RABBITMQ_PASSWORD
zulip__redis_password:
environment: ZULIP_REDIS_PASSWORD
zulip__secret_key:
environment: ZULIP_SECRET_KEY[variables]
main_domain = "${domain}"
admin_email = "${email}"
[config]
env = [
"ZULIP_EXTERNAL_HOST=${main_domain}",
"ZULIP_ADMINISTRATOR=${admin_email}",
"ZULIP_POSTGRES_PASSWORD=${password:32}",
"ZULIP_MEMCACHED_PASSWORD=${password:32}",
"ZULIP_RABBITMQ_PASSWORD=${password:32}",
"ZULIP_REDIS_PASSWORD=${password:32}",
"ZULIP_SECRET_KEY=${password:64}",
"ZULIP_LOADBALANCER_IPS=10.0.0.0/8,172.16.0.0/12,192.168.0.0/16",
]
mounts = []
[[config.domains]]
serviceName = "zulip"
port = 80
host = "${main_domain}"Base64
To import this template in Dokploy: create a Compose service → Advanced → Base64 import and paste the content below:
ewogICJjb21wb3NlIjogInZlcnNpb246IFwiMy44XCJcblxuc2VydmljZXM6XG4gIGRhdGFiYXNlOlxuICAgIGltYWdlOiB6dWxpcC96dWxpcC1wb3N0Z3Jlc3FsOjE0XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBzZWNyZXRzOlxuICAgICAgLSB6dWxpcF9fcG9zdGdyZXNfcGFzc3dvcmRcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIFBPU1RHUkVTX0RCOiB6dWxpcFxuICAgICAgUE9TVEdSRVNfVVNFUjogenVsaXBcbiAgICAgIFBPU1RHUkVTX1BBU1NXT1JEX0ZJTEU6IC9ydW4vc2VjcmV0cy96dWxpcF9fcG9zdGdyZXNfcGFzc3dvcmRcbiAgICB2b2x1bWVzOlxuICAgICAgLSB6dWxpcFBvc3RncmVzRGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGFcblxuICBtZW1jYWNoZWQ6XG4gICAgaW1hZ2U6IG1lbWNhY2hlZDphbHBpbmVcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGNvbW1hbmQ6XG4gICAgICAtIHNoXG4gICAgICAtIC1ldWNcbiAgICAgIC0gfFxuICAgICAgICBlY2hvICdtZWNoX2xpc3Q6IHBsYWluJyA+IFwiJCRTQVNMX0NPTkZfUEFUSFwiXG4gICAgICAgIGVjaG8gXCJ6dWxpcEAkJEhPU1ROQU1FOiQkKGNhdCAkJE1FTUNBQ0hFRF9QQVNTV09SRF9GSUxFKVwiID4gXCIkJE1FTUNBQ0hFRF9TQVNMX1BXREJcIlxuICAgICAgICBlY2hvIFwienVsaXBAbG9jYWxob3N0OiQkKGNhdCAkJE1FTUNBQ0hFRF9QQVNTV09SRF9GSUxFKVwiID4+IFwiJCRNRU1DQUNIRURfU0FTTF9QV0RCXCJcbiAgICAgICAgZXhlYyBtZW1jYWNoZWQgLVNcbiAgICBzZWNyZXRzOlxuICAgICAgLSB6dWxpcF9fbWVtY2FjaGVkX3Bhc3N3b3JkXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICBTQVNMX0NPTkZfUEFUSDogL2hvbWUvbWVtY2FjaGUvbWVtY2FjaGVkLmNvbmZcbiAgICAgIE1FTUNBQ0hFRF9TQVNMX1BXREI6IC9ob21lL21lbWNhY2hlL21lbWNhY2hlZC1zYXNsLWRiXG4gICAgICBNRU1DQUNIRURfUEFTU1dPUkRfRklMRTogL3J1bi9zZWNyZXRzL3p1bGlwX19tZW1jYWNoZWRfcGFzc3dvcmRcblxuICByYWJiaXRtcTpcbiAgICBpbWFnZTogcmFiYml0bXE6NC4yXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBjb21tYW5kOlxuICAgICAgLSBzaFxuICAgICAgLSAtZXVjXG4gICAgICAtIHxcbiAgICAgICAgZXhwb3J0IFJBQkJJVE1RX0RFRkFVTFRfUEFTUz1cIiQkKGNhdCAkJFJBQkJJVE1RX1BBU1NXT1JEX0ZJTEUpXCJcbiAgICAgICAgZWNobyBcImRlZmF1bHRfdXNlciA9ICQkUkFCQklUTVFfREVGQVVMVF9VU0VSXCIgPj4gL2V0Yy9yYWJiaXRtcS9yYWJiaXRtcS5jb25mXG4gICAgICAgIGVjaG8gXCJkZWZhdWx0X3Bhc3MgPSAkJFJBQkJJVE1RX0RFRkFVTFRfUEFTU1wiID4+IC9ldGMvcmFiYml0bXEvcmFiYml0bXEuY29uZlxuICAgICAgICBleGVjIGRvY2tlci1lbnRyeXBvaW50LnNoIHJhYmJpdG1xLXNlcnZlclxuICAgIHNlY3JldHM6XG4gICAgICAtIHp1bGlwX19yYWJiaXRtcV9wYXNzd29yZFxuICAgIGVudmlyb25tZW50OlxuICAgICAgUkFCQklUTVFfREVGQVVMVF9VU0VSOiB6dWxpcFxuICAgICAgUkFCQklUTVFfUEFTU1dPUkRfRklMRTogL3J1bi9zZWNyZXRzL3p1bGlwX19yYWJiaXRtcV9wYXNzd29yZFxuICAgIHZvbHVtZXM6XG4gICAgICAtIHp1bGlwUmFiYml0bXFEYXRhOi92YXIvbGliL3JhYmJpdG1xXG5cbiAgcmVkaXM6XG4gICAgaW1hZ2U6IHJlZGlzOmFscGluZVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgY29tbWFuZDpcbiAgICAgIC0gc2hcbiAgICAgIC0gLWV1Y1xuICAgICAgLSAvdXNyL2xvY2FsL2Jpbi9kb2NrZXItZW50cnlwb2ludC5zaCAtLXJlcXVpcmVwYXNzIFwiJCQoY2F0ICQkUkVESVNfUEFTU1dPUkRfRklMRSlcIlxuICAgIHNlY3JldHM6XG4gICAgICAtIHp1bGlwX19yZWRpc19wYXNzd29yZFxuICAgIGVudmlyb25tZW50OlxuICAgICAgUkVESVNfUEFTU1dPUkRfRklMRTogL3J1bi9zZWNyZXRzL3p1bGlwX19yZWRpc19wYXNzd29yZFxuICAgIHZvbHVtZXM6XG4gICAgICAtIHp1bGlwUmVkaXNEYXRhOi9kYXRhXG5cbiAgenVsaXA6XG4gICAgaW1hZ2U6IGdoY3IuaW8venVsaXAvenVsaXAtc2VydmVyOjEyLjEtMFxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIC0gZGF0YWJhc2VcbiAgICAgIC0gbWVtY2FjaGVkXG4gICAgICAtIHJhYmJpdG1xXG4gICAgICAtIHJlZGlzXG4gICAgc2VjcmV0czpcbiAgICAgIC0genVsaXBfX3Bvc3RncmVzX3Bhc3N3b3JkXG4gICAgICAtIHp1bGlwX19tZW1jYWNoZWRfcGFzc3dvcmRcbiAgICAgIC0genVsaXBfX3JhYmJpdG1xX3Bhc3N3b3JkXG4gICAgICAtIHp1bGlwX19yZWRpc19wYXNzd29yZFxuICAgICAgLSB6dWxpcF9fc2VjcmV0X2tleVxuICAgIGVudmlyb25tZW50OlxuICAgICAgU0VUVElOR19FWFRFUk5BTF9IT1NUOiAke1pVTElQX0VYVEVSTkFMX0hPU1R9XG4gICAgICBTRVRUSU5HX1pVTElQX0FETUlOSVNUUkFUT1I6ICR7WlVMSVBfQURNSU5JU1RSQVRPUn1cbiAgICAgIFNFVFRJTkdfUkVNT1RFX1BPU1RHUkVTX0hPU1Q6IGRhdGFiYXNlXG4gICAgICBTRVRUSU5HX01FTUNBQ0hFRF9MT0NBVElPTjogbWVtY2FjaGVkOjExMjExXG4gICAgICBTRVRUSU5HX1JBQkJJVE1RX0hPU1Q6IHJhYmJpdG1xXG4gICAgICBTRVRUSU5HX1JFRElTX0hPU1Q6IHJlZGlzXG4gICAgICBDT05GSUdfYXBwbGljYXRpb25fc2VydmVyX19odHRwX29ubHk6IFwidHJ1ZVwiXG4gICAgICBMT0FEQkFMQU5DRVJfSVBTOiAke1pVTElQX0xPQURCQUxBTkNFUl9JUFN9XG4gICAgdm9sdW1lczpcbiAgICAgIC0genVsaXBEYXRhOi9kYXRhXG4gICAgdWxpbWl0czpcbiAgICAgIG5vZmlsZTpcbiAgICAgICAgc29mdDogMTAwMDAwMFxuICAgICAgICBoYXJkOiAxMDQ4NTc2XG5cbnZvbHVtZXM6XG4gIHp1bGlwRGF0YTpcbiAgenVsaXBQb3N0Z3Jlc0RhdGE6XG4gIHp1bGlwUmFiYml0bXFEYXRhOlxuICB6dWxpcFJlZGlzRGF0YTpcblxuc2VjcmV0czpcbiAgenVsaXBfX3Bvc3RncmVzX3Bhc3N3b3JkOlxuICAgIGVudmlyb25tZW50OiBaVUxJUF9QT1NUR1JFU19QQVNTV09SRFxuICB6dWxpcF9fbWVtY2FjaGVkX3Bhc3N3b3JkOlxuICAgIGVudmlyb25tZW50OiBaVUxJUF9NRU1DQUNIRURfUEFTU1dPUkRcbiAgenVsaXBfX3JhYmJpdG1xX3Bhc3N3b3JkOlxuICAgIGVudmlyb25tZW50OiBaVUxJUF9SQUJCSVRNUV9QQVNTV09SRFxuICB6dWxpcF9fcmVkaXNfcGFzc3dvcmQ6XG4gICAgZW52aXJvbm1lbnQ6IFpVTElQX1JFRElTX1BBU1NXT1JEXG4gIHp1bGlwX19zZWNyZXRfa2V5OlxuICAgIGVudmlyb25tZW50OiBaVUxJUF9TRUNSRVRfS0VZXG4iLAogICJjb25maWciOiAiW3ZhcmlhYmxlc11cbm1haW5fZG9tYWluID0gXCIke2RvbWFpbn1cIlxuYWRtaW5fZW1haWwgPSBcIiR7ZW1haWx9XCJcblxuW2NvbmZpZ11cbmVudiA9IFtcbiAgXCJaVUxJUF9FWFRFUk5BTF9IT1NUPSR7bWFpbl9kb21haW59XCIsXG4gIFwiWlVMSVBfQURNSU5JU1RSQVRPUj0ke2FkbWluX2VtYWlsfVwiLFxuICBcIlpVTElQX1BPU1RHUkVTX1BBU1NXT1JEPSR7cGFzc3dvcmQ6MzJ9XCIsXG4gIFwiWlVMSVBfTUVNQ0FDSEVEX1BBU1NXT1JEPSR7cGFzc3dvcmQ6MzJ9XCIsXG4gIFwiWlVMSVBfUkFCQklUTVFfUEFTU1dPUkQ9JHtwYXNzd29yZDozMn1cIixcbiAgXCJaVUxJUF9SRURJU19QQVNTV09SRD0ke3Bhc3N3b3JkOjMyfVwiLFxuICBcIlpVTElQX1NFQ1JFVF9LRVk9JHtwYXNzd29yZDo2NH1cIixcbiAgXCJaVUxJUF9MT0FEQkFMQU5DRVJfSVBTPTEwLjAuMC4wLzgsMTcyLjE2LjAuMC8xMiwxOTIuMTY4LjAuMC8xNlwiLFxuXVxubW91bnRzID0gW11cblxuW1tjb25maWcuZG9tYWluc11dXG5zZXJ2aWNlTmFtZSA9IFwienVsaXBcIlxucG9ydCA9IDgwXG5ob3N0ID0gXCIke21haW5fZG9tYWlufVwiXG4iCn0=Links
Tags
chat, collaboration, team, self-hosted
Version: 12.1-0