# Zanjir - Docker Compose Configuration # Self-hosted Matrix server with Conduit, Element Web, and Caddy services: # Conduit Matrix Homeserver (Rust-based) conduit: image: ${CONDUIT_IMAGE:-docker.io/matrixconduit/matrix-conduit:latest} container_name: zanjir-conduit restart: unless-stopped environment: CONDUIT_SERVER_NAME: ${DOMAIN} CONDUIT_DATABASE_BACKEND: rocksdb CONDUIT_DATABASE_PATH: /var/lib/matrix-conduit/ CONDUIT_PORT: 6167 CONDUIT_MAX_REQUEST_SIZE: 20000000 CONDUIT_ALLOW_REGISTRATION: "true" CONDUIT_ALLOW_FEDERATION: "false" CONDUIT_ALLOW_ENCRYPTION: "true" CONDUIT_ALLOW_GUEST_ACCESS: "false" CONDUIT_TRUSTED_SERVERS: '["matrix.org"]' CONDUIT_ADDRESS: 0.0.0.0 CONDUIT_LOG: "info,rocket=off,_=off,sled=off" CONDUIT_CONFIG: "" volumes: - conduit-data:/var/lib/matrix-conduit/ networks: - zanjir-network # Coturn TURN Server for Voice/Video Calls coturn: image: ${COTURN_IMAGE:-coturn/coturn:latest} container_name: zanjir-coturn restart: unless-stopped ports: - "3478:3478/udp" - "5349:5349/udp" environment: TURN_STATIC_SECRET: ${TURN_SECRET} TURN_REALM: ${DOMAIN} command: - "-n" - "--log-file=stdout" - "--listening-port=3478" - "--tls-listening-port=5349" - "--min-port=49152" - "--max-port=65535" - "--realm=${DOMAIN}" - "--use-auth-secret" - "--static-auth-secret=${TURN_SECRET}" - "--no-tls" - "--no-dtls" networks: - zanjir-network # Admin Panel admin: build: ./admin container_name: zanjir-admin restart: unless-stopped environment: CONDUIT_URL: http://conduit:6167 REGISTRATION_SHARED_SECRET: ${REGISTRATION_SHARED_SECRET} DOMAIN: ${DOMAIN} volumes: - ./admin:/app - admin-data:/app/data networks: - zanjir-network depends_on: - conduit # Element Web Client element: image: ${ELEMENT_IMAGE:-vectorim/element-web:v1.11.50} container_name: zanjir-element restart: unless-stopped volumes: - ./config/element-config.json:/app/config.json:ro - ./config/welcome.html:/app/welcome.html:ro networks: - zanjir-network # Caddy Reverse Proxy with Automatic HTTPS caddy: image: ${CADDY_IMAGE:-caddy:2-alpine} container_name: zanjir-caddy restart: unless-stopped ports: - "${HTTP_PORT:-80}:80" - "${HTTPS_PORT:-443}:443" environment: DOMAIN: ${DOMAIN} SERVER_ADDRESS: ${SERVER_ADDRESS:-${DOMAIN}} HTTPS_PORT: ${HTTPS_PORT:-443} HTTP_PORT: ${HTTP_PORT:-80} volumes: - ./Caddyfile.active:/etc/caddy/Caddyfile:ro - caddy-data:/data - caddy-config:/config # Mount Element Web files for serving - element-web:/srv/element:ro networks: - zanjir-network depends_on: - conduit - element # Utility container to copy Element Web files element-copy: image: ${ELEMENT_COPY_IMAGE:-vectorim/element-web:v1.11.50} container_name: zanjir-element-copy user: root entrypoint: ["/bin/sh", "-c"] command: - | cp -r /app/* /srv/element/ cp /config/config.json /srv/element/config.json cp /config/welcome.html /srv/element/welcome.html cp /config/logo.webp /srv/element/logo.webp cp /config/custom.css /srv/element/custom.css mkdir -p /srv/element/mobile_guide cp /config/mobile_guide.html /srv/element/mobile_guide/index.html echo "Element Web files copied successfully" volumes: - element-web:/srv/element - ./config/element-config.json:/config/config.json:ro - ./config/welcome.html:/config/welcome.html:ro - ./config/logo.webp:/config/logo.webp:ro - ./config/custom.css:/config/custom.css:ro - ./config/mobile_guide.html:/config/mobile_guide.html:ro networks: - zanjir-network networks: zanjir-network: driver: bridge volumes: conduit-data: name: zanjir-conduit-data caddy-data: name: zanjir-caddy-data caddy-config: name: zanjir-caddy-config element-web: name: zanjir-element-web admin-data: name: zanjir-admin-data