zulip / docker-zulip

Container configurations, images, and examples for Zulip.
https://zulip.com/
Apache License 2.0
550 stars 227 forks source link

Memcached won't start - can't create /home/memcached/memcached.conf in nonexistent directory #424

Closed carsonbird closed 6 months ago

carsonbird commented 6 months ago

I'm getting the following error when attempting to run my own Docker Compose. Everything else about the stack seems to be working fine, and it's a setup I've used extensively in other areas with success, and I'm pretty familiar with it. I'm not sure where the issue would be. Maybe with folder permissions?

So I run docker compose up and there aren't any relevant errors (I believe) other than:

zulip_cache   | sh: can't create /home/memcached/memcached.conf: nonexistent directory
zulip_cache exited with code 0
zulip_cache exited with code 1

I have no idea what it's talking about. The Memecached service doesn't have any volumes, and I assume that the /home/memcached directory that memcached.conf sits in exists by default in the Memcached docker image, so it should exist.

Any ideas what's going on? I can't find any similar errors elsewhere. My files are below.

docker-compose.yaml

# ────────────────────────────────────────────────────────────────────────────╮
# ┌─┐┬ ┬┬  ┬┌─┐  ┌─┐┌─┐┌┬┐┌─┐┌─┐┌─┐┌─┐
# ┌─┘│ ││  │├─┘  │  │ ││││├─┘│ │└─┐├┤
# └─┘└─┘┴─┘┴┴    └─┘└─┘┴ ┴┴  └─┘└─┘└─┘
# ────────────────────────────────────────────────────────────────────────────╯

version: "3.9"

# ███╗   ██╗███████╗████████╗██╗    ██╗ ██████╗ ██████╗ ██╗  ██╗███████╗
# ████╗  ██║██╔════╝╚══██╔══╝██║    ██║██╔═══██╗██╔══██╗██║ ██╔╝██╔════╝
# ██╔██╗ ██║█████╗     ██║   ██║ █╗ ██║██║   ██║██████╔╝█████╔╝ ███████╗
# ██║╚██╗██║██╔══╝     ██║   ██║███╗██║██║   ██║██╔══██╗██╔═██╗ ╚════██║
# ██║ ╚████║███████╗   ██║   ╚███╔███╔╝╚██████╔╝██║  ██║██║  ██╗███████║
# ╚═╝  ╚═══╝╚══════╝   ╚═╝    ╚══╝╚══╝  ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═╝╚══════╝

networks:
  private:
    name: ${COMPOSE_PROJECT_NAME}_private
  public:
    name: ${COMPOSE_PROJECT_NAME}_public

# ███████╗███████╗██████╗ ██╗   ██╗██╗ ██████╗███████╗███████╗
# ██╔════╝██╔════╝██╔══██╗██║   ██║██║██╔════╝██╔════╝██╔════╝
# ███████╗█████╗  ██████╔╝██║   ██║██║██║     █████╗  ███████╗
# ╚════██║██╔══╝  ██╔══██╗╚██╗ ██╔╝██║██║     ██╔══╝  ╚════██║
# ███████║███████╗██║  ██║ ╚████╔╝ ██║╚██████╗███████╗███████║
# ╚══════╝╚══════╝╚═╝  ╚═╝  ╚═══╝  ╚═╝ ╚═════╝╚══════╝╚══════╝

services:
  # ────────────────────────────────────────────────────────────────────────────╮
  # ┌┬┐┌─┐┌┬┐┌─┐┌┐ ┌─┐┌─┐┌─┐
  #  ││├─┤ │ ├─┤├┴┐├─┤└─┐├┤
  # ─┴┘┴ ┴ ┴ ┴ ┴└─┘┴ ┴└─┘└─┘
  # ────────────────────────────────────────────────────────────────────────────╯
  database:
    container_name: ${COMPOSE_PROJECT_NAME}_${DB_CONTAINER_NAME}
    image: zulip/zulip-postgresql:${DB_VERSION:-14}
    restart: unless-stopped
    networks:
      - private
    expose:
      - ${DB_PORT:-5432}
    labels:
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Traefik Config
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - traefik.enable=false

      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Automatic Updates
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - com.centurylinklabs.watchtower.enable=true
    volumes:
      - ./database/data:/var/lib/postgresql:rw
    environment:
      POSTGRES_DB: ${DB_NAME}
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASS}
  # ────────────────────────────────────────────────────────────────────────────╮
  # ┌─┐┌─┐┌─┐┬ ┬┌─┐
  # │  ├─┤│  ├─┤├┤
  # └─┘┴ ┴└─┘┴ ┴└─┘
  # ────────────────────────────────────────────────────────────────────────────╯
  cache:
    container_name: ${COMPOSE_PROJECT_NAME}_${CACHE_CONTAINER_NAME}
    image: memcached:${CACHE_VERSION:-alpine}
    command:
      - sh
      - -euc
      - |
        echo 'mech_list: plain' > "$$SASL_CONF_PATH"
        echo "${COMPOSE_PROJECT_NAME}@$$HOSTNAME:$$MEMCACHED_PASSWORD" > "$$MEMCACHED_SASL_PWDB"
        echo "${COMPOSE_PROJECT_NAME}@localhost:$$MEMCACHED_PASSWORD" >> "$$MEMCACHED_SASL_PWDB"
        exec memcached -S
    restart: unless-stopped
    networks:
      - private
    expose:
      - ${CACHE_PORT:-11211}
    labels:
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Traefik Config
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - traefik.enable=false

      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Automatic Updates
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - com.centurylinklabs.watchtower.enable=true
    # volumes:
    environment:
      MEMCACHED_TCP_PORT: ${CACHE_PORT}
      MEMCACHED_UDP_PORT: ${CACHE_PORT}
      SASL_CONF_PATH: /home/memcached/memcached.conf
      MEMCACHED_SASL_PWDB: /home/memcached/memcached-sasl-db
      MEMCACHED_PASSWORD: ${CACHE_PASS}
  # ────────────────────────────────────────────────────────────────────────────╮
  # ┌─┐ ┬ ┬┌─┐┬ ┬┌─┐
  # │─┼┐│ │├┤ │ │├┤
  # └─┘└└─┘└─┘└─┘└─┘
  # ────────────────────────────────────────────────────────────────────────────╯
  queue:
    container_name: ${COMPOSE_PROJECT_NAME}_${QUEUE_CONTAINER_NAME}
    image: rabbitmq:${QUEUE_VERSION:-3.7.7}
    restart: unless-stopped
    networks:
      - private
    expose:
      - ${QUEUE_PORT:-default_port}
    labels:
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Traefik Config
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - traefik.enable=false

      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Automatic Updates
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - com.centurylinklabs.watchtower.enable=true
    volumes:
      - ./queue/data:/var/lib/rabbitmq:rw
    environment:
      RABBITMQ_DEFAULT_USER: ${QUEUE_USER}
      RABBITMQ_DEFAULT_PASS: ${QUEUE_PASS}
  # ────────────────────────────────────────────────────────────────────────────╮
  # ┌┐ ┬─┐┌─┐┬┌─┌─┐┬─┐
  # ├┴┐├┬┘│ │├┴┐├┤ ├┬┘
  # └─┘┴└─└─┘┴ ┴└─┘┴└─
  # ────────────────────────────────────────────────────────────────────────────╯
  broker:
    container_name: ${COMPOSE_PROJECT_NAME}_${BROKER_CONTAINER_NAME}
    image: redis:${BROKER_VERSION:-alpine}
    command:
      - sh
      - -euc
      - |
        echo "requirepass '$$REDIS_PASSWORD'" > /etc/redis.conf
        exec redis-server /etc/redis.conf
    restart: unless-stopped
    networks:
      - private
    labels:
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Traefik Config
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - traefik.enable=false

      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Automatic Updates
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - com.centurylinklabs.watchtower.enable=true
    volumes:
      - ./broker/data:/data:rw
    environment:
      REDIS_PASSWORD: ${BROKER_PASS}
  # ────────────────────────────────────────────────────────────────────────────╮
  # ┌─┐┌─┐┬─┐┬  ┬┌─┐┬─┐
  # └─┐├┤ ├┬┘└┐┌┘├┤ ├┬┘
  # └─┘└─┘┴└─ └┘ └─┘┴└─
  # ────────────────────────────────────────────────────────────────────────────╯
  server:
    container_name: ${COMPOSE_PROJECT_NAME}_${SERVER_CONTAINER_NAME}
    image: zulip/docker-zulip:${SERVER_VERSION:-8.0-0}
    build:
      context: .
      args:
        ZULIP_GIT_URL: https://github.com/zulip/zulip.git
        ZULIP_GIT_REF: 8.0
    ulimits:
      nofile:
        soft: 1000000
        hard: 1048576
    restart: unless-stopped
    networks:
      - private
      - public
    expose:
      - 80
      - 443
    labels:
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Traefik Config
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - traefik.enable=true
      - traefik.docker.network=${COMPOSE_PROJECT_NAME}_public

      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Services
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - traefik.http.routers.router->${COMPOSE_PROJECT_NAME}_${SERVER_CONTAINER_NAME}.service=${COMPOSE_PROJECT_NAME}_${SERVER_CONTAINER_NAME}
      - traefik.http.services.${COMPOSE_PROJECT_NAME}_${SERVER_CONTAINER_NAME}.loadbalancer.server.port=443

      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Entrypoints
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - traefik.http.routers.router->${COMPOSE_PROJECT_NAME}_${SERVER_CONTAINER_NAME}.entrypoints=http,https

      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Routers
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - traefik.http.routers.router->${COMPOSE_PROJECT_NAME}_${SERVER_CONTAINER_NAME}.rule=Host(`${SERVER_SUBDOMAIN}.${HOSTNAME}`)

      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Middleware
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - traefik.http.routers.router->${COMPOSE_PROJECT_NAME}_${SERVER_CONTAINER_NAME}.middlewares=redirect->https@file

      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # TLS
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - traefik.http.routers.router->${COMPOSE_PROJECT_NAME}_${SERVER_CONTAINER_NAME}.tls=true
      - traefik.http.routers.router->${COMPOSE_PROJECT_NAME}_${SERVER_CONTAINER_NAME}.tls.certresolver=letsencrypt

      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      # Automatic Updates
      # ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
      - com.centurylinklabs.watchtower.enable=true
    volumes:
      - ./server/data:/data:rw
    depends_on:
      - database
      # - cache
      - queue
      - broker
    environment:
      DB_HOST: ${DB_CONTAINER_NAME}
      DB_HOST_PORT: ${DB_PORT}
      DB_USER: ${DB_USER}
      SETTING_MEMCACHED_LOCATION: ${CACHE_CONTAINER_NAME}:${CACHE_PORT}
      SETTING_RABBITMQ_HOST: ${QUEUE_CONTAINER_NAME}
      SETTING_REDIS_HOST: ${BROKER_CONTAINER_NAME}
      SECRETS_email_password: ${SERVER_EMAIL_PASSWORD}
      SECRETS_rabbitmq_password: ${QUEUE_PASS}
      SECRETS_postgres_password: ${DB_PASS}
      SECRETS_memcached_password: ${CACHE_PASS}
      SECRETS_redis_password: ${BROKER_PASS}
      SECRETS_secret_key: ${SERVER_SECRET_KEY}
      SETTING_EXTERNAL_HOST: ${SERVER_SUBDOMAIN}.${HOSTNAME}
      SETTING_ZULIP_ADMINISTRATOR: ${SERVER_ADMIN_EMAIL}
      SETTING_EMAIL_HOST: ${OUTGOING_EMAIL_HOSTNAME}
      SETTING_EMAIL_HOST_USER: ${OUTGOING_EMAIL_USER}
      SETTING_EMAIL_PORT: ${OUTGOING_EMAIL_PORT:-587}
      SETTING_EMAIL_USE_SSL: False
      SETTING_EMAIL_USE_TLS: ${OUTGOING_EMAIL_TLS:-True}
      ZULIP_AUTH_BACKENDS: EmailAuthBackend
      # Uncomment this when configuring the mobile push notifications service
      # SETTING_PUSH_NOTIFICATION_BOUNCER_URL: 'https://push.zulipchat.com'
      LOADBALANCER_IPS: 172.0.0.0/8,192.168.0.0/16

# ██╗   ██╗ ██████╗ ██╗     ██╗   ██╗███╗   ███╗███████╗███████╗
# ██║   ██║██╔═══██╗██║     ██║   ██║████╗ ████║██╔════╝██╔════╝
# ██║   ██║██║   ██║██║     ██║   ██║██╔████╔██║█████╗  ███████╗
# ╚██╗ ██╔╝██║   ██║██║     ██║   ██║██║╚██╔╝██║██╔══╝  ╚════██║
#  ╚████╔╝ ╚██████╔╝███████╗╚██████╔╝██║ ╚═╝ ██║███████╗███████║
#   ╚═══╝   ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝     ╚═╝╚══════╝╚══════╝

volumes:
  database:
    name: ${COMPOSE_PROJECT_NAME}_${DB_CONTAINER_NAME}
  broker:
    name: ${COMPOSE_PROJECT_NAME}_${BROKER_CONTAINER_NAME}
  queue:
    name: ${COMPOSE_PROJECT_NAME}_${QUEUE_CONTAINER_NAME}
  server:
    name: ${COMPOSE_PROJECT_NAME}_${SERVER_CONTAINER_NAME}

.env.example

# ────────────────────────────────────────────────────────────────────────────╮
# ┌─┐┬─┐┌─┐ ┬┌─┐┌─┐┌┬┐  ┬  ┬┌─┐┬─┐┬┌─┐┌┐ ┬  ┌─┐┌─┐
# ├─┘├┬┘│ │ │├┤ │   │   └┐┌┘├─┤├┬┘│├─┤├┴┐│  ├┤ └─┐
# ┴  ┴└─└─┘└┘└─┘└─┘ ┴    └┘ ┴ ┴┴└─┴┴ ┴└─┘┴─┘└─┘└─┘
#
# - `COMPOSE_PROJECT_NAME` is a docker variable we will also use to prefix
#   containers, networks, and 
#   proxying. It is also used to generate the default names and usernames.
# - `HOSTNAME` is the base domain name used for proxying the publicly facing 
#   containers.
# ────────────────────────────────────────────────────────────────────────────╯

COMPOSE_PROJECT_NAME=zulip
HOSTNAME=REDACTED
BASE_SUBDOMAIN=chat

# ────────────────────────────────────────────────────────────────────────────╮
# ┌┬┐┌─┐┌┬┐┌─┐┌┐ ┌─┐┌─┐┌─┐
#  ││├─┤ │ ├─┤├┴┐├─┤└─┐├┤
# ─┴┘┴ ┴ ┴ ┴ ┴└─┘┴ ┴└─┘└─┘
# ────────────────────────────────────────────────────────────────────────────╯

DB_CONTAINER_NAME=db
DB_SUBDOMAIN=${DB_CONTAINER_NAME}
DB_PORT=5432
DB_VERSION=14 # From https://github.com/zulip/docker-zulip/blob/8e716c245f805ad9474f260631316741b0bcb276/docker-compose.yml#L4
DB_NAME=${COMPOSE_PROJECT_NAME}
DB_USER=${COMPOSE_PROJECT_NAME}
DB_PASS=
# Note that you need to do a manual `ALTER ROLE` query if you
# change this on a system after booting the postgres container
# the first time on a host.  Instructions are available in Zulip's README.md.

# ────────────────────────────────────────────────────────────────────────────╮
# ┌─┐┌─┐┌─┐┬ ┬┌─┐
# │  ├─┤│  ├─┤├┤
# └─┘┴ ┴└─┘┴ ┴└─┘
# ────────────────────────────────────────────────────────────────────────────╯

CACHE_CONTAINER_NAME=cache
CACHE_SUBDOMAIN=${CACHE_CONTAINER_NAME}
CACHE_PORT=11211
CACHE_VERSION=alpine
CACHE_PASS=

# ────────────────────────────────────────────────────────────────────────────╮
# ┌─┐ ┬ ┬┌─┐┬ ┬┌─┐
# │─┼┐│ │├┤ │ │├┤
# └─┘└└─┘└─┘└─┘└─┘
# ────────────────────────────────────────────────────────────────────────────╯

QUEUE_CONTAINER_NAME=queue
QUEUE_SUBDOMAIN=${QUEUE_CONTAINER_NAME}
QUEUE_VERSION=3.7.7
QUEUE_USER=${COMPOSE_PROJECT_NAME}
QUEUE_PASS=

# ────────────────────────────────────────────────────────────────────────────╮
# ┌┐ ┬─┐┌─┐┬┌─┌─┐┬─┐
# ├┴┐├┬┘│ │├┴┐├┤ ├┬┘
# └─┘┴└─└─┘┴ ┴└─┘┴└─
# ────────────────────────────────────────────────────────────────────────────╯

BROKER_CONTAINER_NAME=broker
BROKER_SUBDOMAIN=${BROKER_CONTAINER_NAME}
BROKER_VERSION=alpine
BROKER_PASS=

# ────────────────────────────────────────────────────────────────────────────╮
# ┌─┐┌─┐┬─┐┬  ┬┌─┐┬─┐
# └─┐├┤ ├┬┘└┐┌┘├┤ ├┬┘
# └─┘└─┘┴└─ └┘ └─┘┴└─
# ────────────────────────────────────────────────────────────────────────────╯

SERVER_CONTAINER_NAME=server
SERVER_SUBDOMAIN=${BASE_SUBDOMAIN}
# SERVER_PORT=443
SERVER_VERSION=8.0-0

SERVER_ADMIN_EMAIL=

# SECRET_KEY should be a long (e.g. 50 characters), random string. 
# This value is important to keep secret and constant over time, 
# since it is used to (among other things) sign login cookies 
# (so if you change this, all your users will be forcibly logged out).
SERVER_SECRET_KEY=

# ────────────────────────────────────────────────────────────────────────────╮
# ┌─┐┌┬┐┌─┐┬┬
# ├┤ │││├─┤││
# └─┘┴ ┴┴ ┴┴┴─┘
# ────────────────────────────────────────────────────────────────────────────╯

OUTGOING_EMAIL_HOSTNAME=
OUTGOING_EMAIL_TLS=True
OUTGOING_EMAIL_PORT=587
OUTGOING_EMAIL_USER=
OUTGOING_EMAIL_PASS=
carsonbird commented 6 months ago

Alright, I found the issue. Just a typo in the Memcache(d)(?) environment configs. The service and the product are called memcached with a 'd', but the name of the user directory in the memcached image is memcache without a 'd', so... the lines should be

services:
  cache:
    environment:
      SASL_CONF_PATH: /home/memcache/memcached.conf
      MEMCACHED_SASL_PWDB: /home/memcache/memcached-sasl-db

OOOOhhhh, maybe it's like "memcache-d", as in "containerd" and "systemd". Maybe the 'd' is for daemon.