242 lines
7.2 KiB
YAML
242 lines
7.2 KiB
YAML
# COMPOSE TEMPLATE - DO NOT EDIT MANUALLY
|
|
# Generated by set_compose.sh
|
|
|
|
networks:
|
|
matrix_network:
|
|
name: matrix_network
|
|
|
|
services:
|
|
# --- CORE SERVICES (Always Included) ---
|
|
matrix-db:
|
|
image: postgres:latest
|
|
container_name: "matrix-db"
|
|
restart: unless-stopped
|
|
volumes:
|
|
- ${VOLUME_PATH}/postgres:/var/lib/postgresql:rw
|
|
networks:
|
|
- matrix_network
|
|
environment:
|
|
POSTGRES_USER: ${PG_USER}
|
|
POSTGRES_PASSWORD: ${PG_PASSWORD}
|
|
POSTGRES_INITDB_ARGS: --encoding=UTF8 --locale=C
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U '${PG_USER}'"]
|
|
start_period: "1s"
|
|
interval: "1s"
|
|
timeout: "5s"
|
|
|
|
redis:
|
|
image: redis:latest
|
|
container_name: "matrix-redis"
|
|
restart: unless-stopped
|
|
networks:
|
|
- matrix_network
|
|
command: redis-server --appendonly yes
|
|
|
|
synapse:
|
|
image: ghcr.io/element-hq/synapse:latest
|
|
container_name: "synapse"
|
|
user: ${USER_ID}:${GROUP_ID}
|
|
restart: unless-stopped
|
|
volumes:
|
|
- ${VOLUME_PATH}/synapse:/data:rw
|
|
networks:
|
|
- matrix_network
|
|
environment:
|
|
SYNAPSE_CONFIG_DIR: /data
|
|
SYNAPSE_CONFIG_PATH: /data/homeserver.yaml
|
|
depends_on:
|
|
redis:
|
|
condition: service_started
|
|
matrix-db:
|
|
condition: service_healthy
|
|
# [TRAEFIK_LABELS_START]
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.synapse.rule=Host(`${HOMESERVER_FQDN}`)"
|
|
- "traefik.http.routers.synapse.entrypoints=websecure"
|
|
- "traefik.http.routers.synapse.tls.certresolver=myresolver"
|
|
- "traefik.http.services.synapse.loadbalancer.server.port=8008"
|
|
# [TRAEFIK_LABELS_END]
|
|
|
|
mas:
|
|
image: ghcr.io/element-hq/matrix-authentication-service:latest
|
|
container_name: "mas"
|
|
restart: unless-stopped
|
|
volumes:
|
|
- ${VOLUME_PATH}/mas:/data:rw
|
|
networks:
|
|
- matrix_network
|
|
command: "server --config=/data/config.yaml"
|
|
depends_on:
|
|
matrix-db:
|
|
condition: service_healthy
|
|
# [TRAEFIK_LABELS_START]
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.auth.rule=Host(`${MAS_FQDN}`)"
|
|
- "traefik.http.routers.auth.entrypoints=websecure"
|
|
- "traefik.http.routers.auth.tls.certresolver=myresolver"
|
|
- "traefik.http.services.auth.loadbalancer.server.port=8000"
|
|
# [TRAEFIK_LABELS_END]
|
|
|
|
# --- OPTIONAL: LIVEKIT RTC STACK ---
|
|
# [LIVEKIT_START]
|
|
livekit:
|
|
image: livekit/livekit-server:latest
|
|
container_name: "livekit"
|
|
restart: unless-stopped
|
|
volumes:
|
|
- ${VOLUME_PATH}/livekit:/etc/livekit
|
|
environment:
|
|
- LIVEKIT_KEYS=access-key=${LIVEKIT_API_KEY},secret=${LIVEKIT_API_SECRET}
|
|
- LIVEKIT_PORT=7880
|
|
- LIVEKIT_WS_PORT=7881
|
|
- LIVEKIT_SERVER_URL=https://${LIVEKIT_FQDN}
|
|
networks:
|
|
- matrix_network
|
|
depends_on:
|
|
- redis
|
|
- matrix-db
|
|
ports:
|
|
- "${LIVEKIT_UDP_RANGE}:${LIVEKIT_UDP_RANGE}/udp"
|
|
# [TRAEFIK_LABELS_START]
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.rtc.rule=Host(`${LIVEKIT_FQDN}`)"
|
|
- "traefik.http.routers.rtc.entrypoints=websecure"
|
|
- "traefik.http.routers.rtc.tls.certresolver=myresolver"
|
|
- "traefik.http.services.rtc.loadbalancer.server.port=7880"
|
|
# [TRAEFIK_LABELS_END]
|
|
|
|
# The JWT Bridge Service
|
|
lk-jwt-service:
|
|
image: ghcr.io/element-hq/lk-jwt-service:latest
|
|
container_name: "lk-jwt-service"
|
|
restart: unless-stopped
|
|
environment:
|
|
- LK_JWT_PORT=8080
|
|
- LIVEKIT_URL=wss://${LIVEKIT_FQDN}
|
|
- LIVEKIT_KEY=${LIVEKIT_API_KEY}
|
|
- LIVEKIT_SECRET=${LIVEKIT_API_SECRET}
|
|
- LIVEKIT_LOCAL_HOMESERVERS=${HOMESERVER_FQDN}
|
|
networks:
|
|
- matrix_network
|
|
depends_on:
|
|
- livekit
|
|
# [TRAEFIK_LABELS_START]
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.jwt.rule=Host(`${JWT_FQDN}`)"
|
|
- "traefik.http.routers.jwt.entrypoints=websecure"
|
|
- "traefik.http.routers.jwt.tls.certresolver=myresolver"
|
|
- "traefik.http.services.jwt.loadbalancer.server.port=8080"
|
|
# [TRAEFIK_LABELS_END]
|
|
# [LIVEKIT_END]
|
|
|
|
# --- OPTIONAL: WEB HOSTED APP ---
|
|
# [ELEMENT_START]
|
|
element-web:
|
|
image: vectorim/element-web:latest
|
|
container_name: "matrix-web-client"
|
|
restart: unless-stopped
|
|
volumes:
|
|
- ${VOLUME_PATH}/element-web:/usr/share/nginx/html:ro
|
|
networks:
|
|
- matrix_network
|
|
environment:
|
|
- ELEMENT_WEB_CONFIG_PATH=/usr/share/nginx/html/config.json
|
|
# [TRAEFIK_LABELS_START]
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.app.rule=Host(`${APP_FQDN}`)"
|
|
- "traefik.http.routers.app.entrypoints=websecure"
|
|
- "traefik.http.routers.app.tls.certresolver=myresolver"
|
|
- "traefik.http.services.app.loadbalancer.server.port=80"
|
|
# [TRAEFIK_LABELS_END]
|
|
# [ELEMENT_END]
|
|
|
|
# [CINNY_START]
|
|
cinny:
|
|
image: cinny-web:latest
|
|
container_name: "matrix-web-client"
|
|
restart: unless-stopped
|
|
volumes:
|
|
- ${VOLUME_PATH}/cinny:/usr/share/nginx/html:ro
|
|
networks:
|
|
- matrix_network
|
|
# [TRAEFIK_LABELS_START]
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.app.rule=Host(`${APP_FQDN}`)"
|
|
- "traefik.http.routers.app.entrypoints=websecure"
|
|
- "traefik.http.routers.app.tls.certresolver=myresolver"
|
|
- "traefik.http.services.app.loadbalancer.server.port=80"
|
|
# [TRAEFIK_LABELS_END]
|
|
# [CINNY_END]
|
|
|
|
# [FLUFFYCHAT_START]
|
|
fluffy-chat:
|
|
image: kibaek/fluffy-chat:latest
|
|
container_name: "matrix-web-client"
|
|
restart: unless-stopped
|
|
volumes:
|
|
- ${VOLUME_PATH}/fluffy-chat:/usr/share/nginx/html:ro
|
|
networks:
|
|
- matrix_network
|
|
# [TRAEFIK_LABELS_START]
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.app.rule=Host(`${APP_FQDN}`)"
|
|
- "traefik.http.routers.app.entrypoints=websecure"
|
|
- "traefik.http.routers.app.tls.certresolver=myresolver"
|
|
- "traefik.http.services.app.loadbalancer.server.port=80"
|
|
# [TRAEFIK_LABELS_END]
|
|
# [FLUFFYCHAT_END]
|
|
|
|
# --- OPTIONAL: REVERSE PROXY ---
|
|
# [NGINX_START]
|
|
nginx:
|
|
image: nginx:latest
|
|
container_name: "matrix-nginx"
|
|
restart: unless-stopped
|
|
ports:
|
|
- "80:80"
|
|
- "443:443"
|
|
stop_grace_period: 0s
|
|
volumes:
|
|
- ${VOLUME_PATH}/nginx/conf.d:/etc/nginx/conf.d:ro
|
|
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
|
|
networks:
|
|
matrix_network:
|
|
aliases:
|
|
- ${DOMAIN}
|
|
- ${HOMESERVER_FQDN}
|
|
- ${MAS_FQDN}
|
|
- ${APP_FQDN}
|
|
# [NGINX_END]
|
|
|
|
# [TRAEFIK_START]
|
|
traefik:
|
|
image: traefik:latest
|
|
container_name: "traefik"
|
|
restart: unless-stopped
|
|
ports:
|
|
- "80:80"
|
|
- "443:443"
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
- ${VOLUME_PATH}/traefik:/etc/traefik
|
|
command:
|
|
- "--api.insecure=true"
|
|
- "--providers.docker=true"
|
|
- "--providers.docker.exposedbydefault=false"
|
|
- "--entrypoints.web.address=:80"
|
|
- "--entrypoints.websecure.address=:443"
|
|
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
|
|
- "--certificatesresolvers.myresolver.acme.email=${PG_USER}@${DOMAIN}"
|
|
- "--certificatesresolvers.myresolver.acme.storage=/etc/traefik/acme.json"
|
|
networks:
|
|
- matrix_network
|
|
# [TRAEFIK_END]
|