Dokploy

Zulip

Open-source threaded team chat designed to keep team communication organized and productive.

Zulip logo

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 → AdvancedBase64 import and paste the content below:

ewogICJjb21wb3NlIjogInZlcnNpb246IFwiMy44XCJcblxuc2VydmljZXM6XG4gIGRhdGFiYXNlOlxuICAgIGltYWdlOiB6dWxpcC96dWxpcC1wb3N0Z3Jlc3FsOjE0XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBzZWNyZXRzOlxuICAgICAgLSB6dWxpcF9fcG9zdGdyZXNfcGFzc3dvcmRcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIFBPU1RHUkVTX0RCOiB6dWxpcFxuICAgICAgUE9TVEdSRVNfVVNFUjogenVsaXBcbiAgICAgIFBPU1RHUkVTX1BBU1NXT1JEX0ZJTEU6IC9ydW4vc2VjcmV0cy96dWxpcF9fcG9zdGdyZXNfcGFzc3dvcmRcbiAgICB2b2x1bWVzOlxuICAgICAgLSB6dWxpcFBvc3RncmVzRGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGFcblxuICBtZW1jYWNoZWQ6XG4gICAgaW1hZ2U6IG1lbWNhY2hlZDphbHBpbmVcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGNvbW1hbmQ6XG4gICAgICAtIHNoXG4gICAgICAtIC1ldWNcbiAgICAgIC0gfFxuICAgICAgICBlY2hvICdtZWNoX2xpc3Q6IHBsYWluJyA+IFwiJCRTQVNMX0NPTkZfUEFUSFwiXG4gICAgICAgIGVjaG8gXCJ6dWxpcEAkJEhPU1ROQU1FOiQkKGNhdCAkJE1FTUNBQ0hFRF9QQVNTV09SRF9GSUxFKVwiID4gXCIkJE1FTUNBQ0hFRF9TQVNMX1BXREJcIlxuICAgICAgICBlY2hvIFwienVsaXBAbG9jYWxob3N0OiQkKGNhdCAkJE1FTUNBQ0hFRF9QQVNTV09SRF9GSUxFKVwiID4+IFwiJCRNRU1DQUNIRURfU0FTTF9QV0RCXCJcbiAgICAgICAgZXhlYyBtZW1jYWNoZWQgLVNcbiAgICBzZWNyZXRzOlxuICAgICAgLSB6dWxpcF9fbWVtY2FjaGVkX3Bhc3N3b3JkXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICBTQVNMX0NPTkZfUEFUSDogL2hvbWUvbWVtY2FjaGUvbWVtY2FjaGVkLmNvbmZcbiAgICAgIE1FTUNBQ0hFRF9TQVNMX1BXREI6IC9ob21lL21lbWNhY2hlL21lbWNhY2hlZC1zYXNsLWRiXG4gICAgICBNRU1DQUNIRURfUEFTU1dPUkRfRklMRTogL3J1bi9zZWNyZXRzL3p1bGlwX19tZW1jYWNoZWRfcGFzc3dvcmRcblxuICByYWJiaXRtcTpcbiAgICBpbWFnZTogcmFiYml0bXE6NC4yXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBjb21tYW5kOlxuICAgICAgLSBzaFxuICAgICAgLSAtZXVjXG4gICAgICAtIHxcbiAgICAgICAgZXhwb3J0IFJBQkJJVE1RX0RFRkFVTFRfUEFTUz1cIiQkKGNhdCAkJFJBQkJJVE1RX1BBU1NXT1JEX0ZJTEUpXCJcbiAgICAgICAgZWNobyBcImRlZmF1bHRfdXNlciA9ICQkUkFCQklUTVFfREVGQVVMVF9VU0VSXCIgPj4gL2V0Yy9yYWJiaXRtcS9yYWJiaXRtcS5jb25mXG4gICAgICAgIGVjaG8gXCJkZWZhdWx0X3Bhc3MgPSAkJFJBQkJJVE1RX0RFRkFVTFRfUEFTU1wiID4+IC9ldGMvcmFiYml0bXEvcmFiYml0bXEuY29uZlxuICAgICAgICBleGVjIGRvY2tlci1lbnRyeXBvaW50LnNoIHJhYmJpdG1xLXNlcnZlclxuICAgIHNlY3JldHM6XG4gICAgICAtIHp1bGlwX19yYWJiaXRtcV9wYXNzd29yZFxuICAgIGVudmlyb25tZW50OlxuICAgICAgUkFCQklUTVFfREVGQVVMVF9VU0VSOiB6dWxpcFxuICAgICAgUkFCQklUTVFfUEFTU1dPUkRfRklMRTogL3J1bi9zZWNyZXRzL3p1bGlwX19yYWJiaXRtcV9wYXNzd29yZFxuICAgIHZvbHVtZXM6XG4gICAgICAtIHp1bGlwUmFiYml0bXFEYXRhOi92YXIvbGliL3JhYmJpdG1xXG5cbiAgcmVkaXM6XG4gICAgaW1hZ2U6IHJlZGlzOmFscGluZVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgY29tbWFuZDpcbiAgICAgIC0gc2hcbiAgICAgIC0gLWV1Y1xuICAgICAgLSAvdXNyL2xvY2FsL2Jpbi9kb2NrZXItZW50cnlwb2ludC5zaCAtLXJlcXVpcmVwYXNzIFwiJCQoY2F0ICQkUkVESVNfUEFTU1dPUkRfRklMRSlcIlxuICAgIHNlY3JldHM6XG4gICAgICAtIHp1bGlwX19yZWRpc19wYXNzd29yZFxuICAgIGVudmlyb25tZW50OlxuICAgICAgUkVESVNfUEFTU1dPUkRfRklMRTogL3J1bi9zZWNyZXRzL3p1bGlwX19yZWRpc19wYXNzd29yZFxuICAgIHZvbHVtZXM6XG4gICAgICAtIHp1bGlwUmVkaXNEYXRhOi9kYXRhXG5cbiAgenVsaXA6XG4gICAgaW1hZ2U6IGdoY3IuaW8venVsaXAvenVsaXAtc2VydmVyOjEyLjEtMFxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIC0gZGF0YWJhc2VcbiAgICAgIC0gbWVtY2FjaGVkXG4gICAgICAtIHJhYmJpdG1xXG4gICAgICAtIHJlZGlzXG4gICAgc2VjcmV0czpcbiAgICAgIC0genVsaXBfX3Bvc3RncmVzX3Bhc3N3b3JkXG4gICAgICAtIHp1bGlwX19tZW1jYWNoZWRfcGFzc3dvcmRcbiAgICAgIC0genVsaXBfX3JhYmJpdG1xX3Bhc3N3b3JkXG4gICAgICAtIHp1bGlwX19yZWRpc19wYXNzd29yZFxuICAgICAgLSB6dWxpcF9fc2VjcmV0X2tleVxuICAgIGVudmlyb25tZW50OlxuICAgICAgU0VUVElOR19FWFRFUk5BTF9IT1NUOiAke1pVTElQX0VYVEVSTkFMX0hPU1R9XG4gICAgICBTRVRUSU5HX1pVTElQX0FETUlOSVNUUkFUT1I6ICR7WlVMSVBfQURNSU5JU1RSQVRPUn1cbiAgICAgIFNFVFRJTkdfUkVNT1RFX1BPU1RHUkVTX0hPU1Q6IGRhdGFiYXNlXG4gICAgICBTRVRUSU5HX01FTUNBQ0hFRF9MT0NBVElPTjogbWVtY2FjaGVkOjExMjExXG4gICAgICBTRVRUSU5HX1JBQkJJVE1RX0hPU1Q6IHJhYmJpdG1xXG4gICAgICBTRVRUSU5HX1JFRElTX0hPU1Q6IHJlZGlzXG4gICAgICBDT05GSUdfYXBwbGljYXRpb25fc2VydmVyX19odHRwX29ubHk6IFwidHJ1ZVwiXG4gICAgICBMT0FEQkFMQU5DRVJfSVBTOiAke1pVTElQX0xPQURCQUxBTkNFUl9JUFN9XG4gICAgdm9sdW1lczpcbiAgICAgIC0genVsaXBEYXRhOi9kYXRhXG4gICAgdWxpbWl0czpcbiAgICAgIG5vZmlsZTpcbiAgICAgICAgc29mdDogMTAwMDAwMFxuICAgICAgICBoYXJkOiAxMDQ4NTc2XG5cbnZvbHVtZXM6XG4gIHp1bGlwRGF0YTpcbiAgenVsaXBQb3N0Z3Jlc0RhdGE6XG4gIHp1bGlwUmFiYml0bXFEYXRhOlxuICB6dWxpcFJlZGlzRGF0YTpcblxuc2VjcmV0czpcbiAgenVsaXBfX3Bvc3RncmVzX3Bhc3N3b3JkOlxuICAgIGVudmlyb25tZW50OiBaVUxJUF9QT1NUR1JFU19QQVNTV09SRFxuICB6dWxpcF9fbWVtY2FjaGVkX3Bhc3N3b3JkOlxuICAgIGVudmlyb25tZW50OiBaVUxJUF9NRU1DQUNIRURfUEFTU1dPUkRcbiAgenVsaXBfX3JhYmJpdG1xX3Bhc3N3b3JkOlxuICAgIGVudmlyb25tZW50OiBaVUxJUF9SQUJCSVRNUV9QQVNTV09SRFxuICB6dWxpcF9fcmVkaXNfcGFzc3dvcmQ6XG4gICAgZW52aXJvbm1lbnQ6IFpVTElQX1JFRElTX1BBU1NXT1JEXG4gIHp1bGlwX19zZWNyZXRfa2V5OlxuICAgIGVudmlyb25tZW50OiBaVUxJUF9TRUNSRVRfS0VZXG4iLAogICJjb25maWciOiAiW3ZhcmlhYmxlc11cbm1haW5fZG9tYWluID0gXCIke2RvbWFpbn1cIlxuYWRtaW5fZW1haWwgPSBcIiR7ZW1haWx9XCJcblxuW2NvbmZpZ11cbmVudiA9IFtcbiAgXCJaVUxJUF9FWFRFUk5BTF9IT1NUPSR7bWFpbl9kb21haW59XCIsXG4gIFwiWlVMSVBfQURNSU5JU1RSQVRPUj0ke2FkbWluX2VtYWlsfVwiLFxuICBcIlpVTElQX1BPU1RHUkVTX1BBU1NXT1JEPSR7cGFzc3dvcmQ6MzJ9XCIsXG4gIFwiWlVMSVBfTUVNQ0FDSEVEX1BBU1NXT1JEPSR7cGFzc3dvcmQ6MzJ9XCIsXG4gIFwiWlVMSVBfUkFCQklUTVFfUEFTU1dPUkQ9JHtwYXNzd29yZDozMn1cIixcbiAgXCJaVUxJUF9SRURJU19QQVNTV09SRD0ke3Bhc3N3b3JkOjMyfVwiLFxuICBcIlpVTElQX1NFQ1JFVF9LRVk9JHtwYXNzd29yZDo2NH1cIixcbiAgXCJaVUxJUF9MT0FEQkFMQU5DRVJfSVBTPTEwLjAuMC4wLzgsMTcyLjE2LjAuMC8xMiwxOTIuMTY4LjAuMC8xNlwiLFxuXVxubW91bnRzID0gW11cblxuW1tjb25maWcuZG9tYWluc11dXG5zZXJ2aWNlTmFtZSA9IFwienVsaXBcIlxucG9ydCA9IDgwXG5ob3N0ID0gXCIke21haW5fZG9tYWlufVwiXG4iCn0=

Tags

chat, collaboration, team, self-hosted


Version: 12.1-0

On this page