services: postgres_synapse: image: postgres:16 restart: unless-stopped environment: POSTGRES_USER: synapse POSTGRES_PASSWORD: ${POSTGRES_SYNAPSE_PASSWORD} POSTGRES_DB: synapse POSTGRES_INITDB_ARGS: --encoding=UTF-8 --locale=C volumes: - postgres_synapse_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U synapse -d synapse"] interval: 10s timeout: 5s retries: 10 networks: - meshly synapse: image: ghcr.io/element-hq/synapse:latest restart: unless-stopped depends_on: postgres_synapse: condition: service_healthy environment: SYNAPSE_CONFIG_PATH: /data/homeserver.yaml volumes: - ./synapse:/data expose: - "8008" networks: - meshly postgres_meshly: image: postgres:16 restart: unless-stopped environment: POSTGRES_USER: meshly POSTGRES_PASSWORD: ${POSTGRES_MESHLY_PASSWORD} POSTGRES_DB: meshly POSTGRES_INITDB_ARGS: --encoding=UTF-8 --locale=C volumes: - postgres_meshly_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U meshly -d meshly"] interval: 10s timeout: 5s retries: 10 networks: - meshly meshly_control: image: meshly-control:local restart: unless-stopped depends_on: postgres_meshly: condition: service_healthy synapse: condition: service_started environment: MESHLY_DATABASE_URL: ${MESHLY_DATABASE_URL} MESHLY_DATA_DIR: /data MESHLY_TIMEZONE: ${MESHLY_TIMEZONE} MESHLY_OWNER_USER_ID: ${MESHLY_OWNER_USER_ID} SYNAPSE_BASE_URL: http://synapse:8008 SYNAPSE_SERVER_NAME: ${DOMAIN} SYNAPSE_SERVICE_USER_ID: @meshly-control:${DOMAIN} SYNAPSE_SERVICE_ACCESS_TOKEN: ${SYNAPSE_SERVICE_ACCESS_TOKEN} MESHLY_SIGNING_SECRET: ${MESHLY_SIGNING_SECRET} expose: - "8080" volumes: - meshly_data:/data networks: - meshly meshly_worker: image: meshly-control:local restart: unless-stopped command: ["worker"] depends_on: postgres_meshly: condition: service_healthy environment: MESHLY_DATABASE_URL: ${MESHLY_DATABASE_URL} MESHLY_DATA_DIR: /data MESHLY_TIMEZONE: ${MESHLY_TIMEZONE} MESHLY_OWNER_USER_ID: ${MESHLY_OWNER_USER_ID} SYNAPSE_BASE_URL: http://synapse:8008 SYNAPSE_SERVER_NAME: ${DOMAIN} SYNAPSE_SERVICE_USER_ID: @meshly-control:${DOMAIN} SYNAPSE_SERVICE_ACCESS_TOKEN: ${SYNAPSE_SERVICE_ACCESS_TOKEN} MESHLY_SIGNING_SECRET: ${MESHLY_SIGNING_SECRET} volumes: - meshly_data:/data networks: - meshly caddy: image: caddy:2-alpine restart: unless-stopped depends_on: - synapse - meshly_control environment: DOMAIN: ${DOMAIN} CONTACT_EMAIL: ${CONTACT_EMAIL} ports: - "80:80" - "443:443" - "8448:8448" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - ./caddy_data:/data - ./caddy_config:/config networks: - meshly volumes: postgres_synapse_data: postgres_meshly_data: meshly_data: networks: meshly: