{% import 'macro/postgres.j2' as pg with context %} --- version: '3.9' services: synapse: image: registry.tobiasmanske.de/matrixdotorg/synapse:latest user: "1000:1000" # Since synapse does not retry to connect to the database, restart upon # failure restart: unless-stopped # See the readme for a full documentation of the environment settings # NOTE: You must edit homeserver.yaml to use postgres, it defaults to sqlite environment: - SYNAPSE_CONFIG_DIR=/config - SYNAPSE_CONFIG_PATH=/config/homeserver.yaml - TZ=Europe/Berlin ulimits: nofile: soft: 10000 hard: 40000 volumes: - synapse_data:/data - ./synapse-config:/config:ro,Z - ./mautrix-telegram/registration.yaml:/data/reg-mautrix-tg.yaml:ro,Z - ./mautrix-slack/registration.yaml:/data/reg-mautrix-slack.yaml:ro,Z - ./mautrix-signal/registration.yaml:/data/reg-mautrix-signal.yaml:ro,Z depends_on: - db - redis networks: - default - backend - metrics labels: - "traefik.enable=true" - "traefik.docker.network=${COMPOSE_PROJECT_NAME}_default" - "traefik.http.routers.http-synapse.rule=Host(`synapse.{{ matrix.baseurl }}`)" - "traefik.http.routers.http-synapse.entryPoints=websecure" - "traefik.http.routers.http-synapse.service=matrix-synapse" - "traefik.http.routers.matrix-synapse.rule=Host(`{{ matrix.baseurl }}`) && PathPrefix(`/_{path:(matrix|synapse)}/`)" - "traefik.http.routers.matrix-synapse.entryPoints=websecure" - "traefik.http.routers.matrix-synapse.service=matrix-synapse" - "traefik.http.services.matrix-synapse.loadbalancer.server.port=8008" - "prometheus-scrape.enabled=true" - "prometheus-scrape.port=9091" - "prometheus-scrape.metrics_path=/_synapse/metrics" {{ pg.postgres("db", matrix.db.user, matrix.db.password, matrix.db.database, ["backend"], schedule="@hourly" ) }} caddy: image: caddy:2 volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro,z restart: unless-stopped labels: - "traefik.enable=true" - "traefik.docker.network=${COMPOSE_PROJECT_NAME}_default" - "traefik.http.routers.matrix-well-known.rule=Host(`{{ matrix.baseurl }}`) && PathPrefix(`/.well-known/matrix/`)" - "traefik.http.routers.matrix-well-known.entrypoints=websecure" - "traefik.http.services.matrix-well-known.loadbalancer.server.port=80" cinny: image: ghcr.io/cinnyapp/cinny:latest # image: registry.tobiasmanske.de/cinnyapp/cinny:latest restart: unless-stopped labels: - "traefik.enable=true" - "traefik.docker.network=${COMPOSE_PROJECT_NAME}_default" - "traefik.http.routers.matrix-cinny.rule=Host(`cinny.{{ matrix.baseurl }}`)" - "traefik.http.routers.matrix-cinny.entryPoints=websecure" - "traefik.http.services.matrix-cinny.loadbalancer.server.port=80" volumes: - ./cinny-config.json:/app/config.json:ro,Z networks: - default redis: image: redis:latest restart: unless-stopped networks: - backend ### SLIDING SYNC {{ pg.postgres("db-syncv3", matrix.syncv3.user, matrix.syncv3.password, matrix.syncv3.database, ["syncv3"] ) }} syncv3-proxy: image: ghcr.io/matrix-org/sliding-sync:latest restart: always environment: - "SYNCV3_SERVER=https://synapse.{{ matrix.baseurl }}" - "SYNCV3_SECRET={{ matrix.syncv3.secret }}" - "SYNCV3_BINDADDR=:8008" - "SYNCV3_PROM=:2112" - "SYNCV3_DB=user={{ matrix.syncv3.user }} dbname={{ matrix.syncv3.database }} sslmode=disable host=db-syncv3 password='{{ matrix.syncv3.password }}'" labels: - "traefik.enable=true" - "traefik.docker.network=${COMPOSE_PROJECT_NAME}_default" - "traefik.http.routers.matrix-syncv3-proxy.rule=Host(`syncv3.{{ matrix.baseurl }}`)" - "traefik.http.routers.matrix-syncv3-proxy.entrypoints=websecure" - "traefik.http.services.matrix-syncv3-proxy.loadbalancer.server.port=8008" - "prometheus-scrape.enabled=false" - "prometheus-scrape.port=2112" networks: - syncv3 - default ### BRIDGES #### Telegram mautrix-telegram: image: dock.mau.dev/mautrix/telegram:latest user: "1000:1000" restart: unless-stopped environment: - "MAUTRIX_DIRECT_STARTUP=1" volumes: - bridge_tg_data:/data - ./mautrix-telegram/config.yaml:/data/config.yaml:ro,Z - ./mautrix-telegram/registration.yaml:/data/registration.yaml:ro,Z networks: - backend - default # Needs to contact UFOs in the sky depends_on: - db-bridge-tg - synapse {{ pg.postgres("db-bridge-tg", matrix.bridge.tg.dbuser, matrix.bridge.tg.dbpass, matrix.bridge.tg.dbname, ["backend"] ) }} #### SLACK mautrix-slack: image: dock.mau.dev/mautrix/slack:latest environment: - "UID=1000" - "GID=1000" restart: unless-stopped volumes: - bridge_slack_data:/data - ./mautrix-slack/config.yaml:/data/config.yaml:ro,Z - ./mautrix-slack/registration.yaml:/data/registration.yaml:ro,Z networks: - backend - default # Needs to contact UFOs in the sky depends_on: - db-bridge-slack - synapse {{ pg.postgres("db-bridge-slack", matrix.bridge.slack.dbuser, matrix.bridge.slack.dbpass, matrix.bridge.slack.dbname, ["backend"] ) }} #### SIGNAL mautrix-signal: image: dock.mau.dev/mautrix/signal:latest restart: unless-stopped environment: - "MAUTRIX_DIRECT_STARTUP=1" - "UID=1000" networks: - default - backend volumes: - bridge_signal_data:/data - signald_data:/signald - ./mautrix-signal/config.yaml:/data/config.yaml:ro,Z - ./mautrix-signal/registration.yaml:/data/registration.yaml:ro,Z depends_on: - signald - db-bridge-signal signald: image: docker.io/signald/signald:latest restart: unless-stopped networks: - default - backend volumes: - signald_data:/signald {{ pg.postgres("db-bridge-signal", matrix.bridge.signal.dbuser, matrix.bridge.signal.dbpass, matrix.bridge.signal.dbname, ["backend"] ) }} networks: postgres: internal: true backend: internal: true syncv3: internal: true metrics: external: true volumes: bridge_signal_data: bridge_slack_data: bridge_tg_data: db-bridge-signal_data: db-bridge-slack_data: db-bridge-tg_data: db-syncv3_data: db_data: signald_data: synapse_data: ...