services: synapse: image: matrixdotorg/synapse:latest container_name: ${MATRIX_SYNAPSE_CONTAINER_NAME:-matrix-synapse} restart: unless-stopped depends_on: - postgres environment: SYNAPSE_SERVER_NAME: ${MATRIX_SERVER_NAME:-matrix.lab2025.duckdns.org} SYNAPSE_REPORT_STATS: "no" # federation disabled (user choice): client-only listener on 8008 ports: - "${MATRIX_SYNAPSE_PORT:-8008}:8008" volumes: - ./synapse-data:/data networks: - matrix postgres: image: postgres:16-alpine container_name: ${MATRIX_POSTGRES_CONTAINER_NAME:-matrix-postgres} restart: unless-stopped environment: POSTGRES_DB: ${MATRIX_POSTGRES_DB:-synapse} POSTGRES_USER: ${MATRIX_POSTGRES_USER:-synapse} POSTGRES_PASSWORD: ${MATRIX_POSTGRES_PASSWORD} POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=C" volumes: - ./postgres-data:/var/lib/postgresql/data networks: - matrix element: image: vectorim/element-web:latest container_name: ${MATRIX_ELEMENT_CONTAINER_NAME:-matrix-element} restart: unless-stopped depends_on: - synapse ports: - "${MATRIX_ELEMENT_PORT:-8081}:80" volumes: # Must mount the FILE, not a directory (element-web reads /app/config.json) - ./element-config/config.json:/app/config.json networks: - matrix networks: matrix: driver: bridge