#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/functions.sh" resolve_paths WORKER_COUNT=1 while getopts "c:" opt; do case $opt in c) WORKER_COUNT="$OPTARG" ;; *) echo "Usage: $0 [-c count]"; exit 1 ;; esac done require_env resolve_volume_path TEMPLATE_COMPOSE="${INIT_DIR}/templates/worker.yaml" TEMPLATE_CONFIG="${INIT_DIR}/config/worker.yaml" TEMPLATE_LOG="${INIT_DIR}/config/worker-log.yaml" require_file "$TEMPLATE_COMPOSE" "Compose template" require_file "$TEMPLATE_CONFIG" "Config template" require_file "$TEMPLATE_LOG" "Log template" WORKERS_DIR="${VOLUME_PATH}/synapse/workers" mkdir -p "$WORKERS_DIR" "${ROOT_DIR}/.tmp" TRAEFIK_ENABLED="${PROXY:-0}" TEMP_COMPOSE="${ROOT_DIR}/.tmp/compose_workers.yaml" > "$TEMP_COMPOSE" for ((i=1; i<=WORKER_COUNT; i++)); do worker_name="synapse-worker-${i}" port=$((9093 + i)) sed -e "s/{{WORKER_NAME}}/${worker_name}/g" \ -e "s/{{PORT}}/${port}/g" \ -e "s/{{SERVER_NAME}}/${HOMESERVER_FQDN}/g" \ -e "s/{{DB_USER}}/${DB_USER:-synapse}/g" \ -e "s/{{DB_PASSWORD}}/${DB_PASSWORD:-synapse_password}/g" \ -e "s/{{DB_NAME}}/${DB_NAME:-synapse}/g" \ "$TEMPLATE_CONFIG" > "${WORKERS_DIR}/${worker_name}.yaml" sed -e "s/{{WORKER_NAME}}/${worker_name}/g" \ -e "s/{{MAX_BYTES}}/${LOG_MAX_BYTES:-10485760}/g" \ -e "s/{{BACKUP_COUNT}}/${LOG_BACKUP_COUNT:-5}/g" \ -e "s/{{LOG_LEVEL}}/${LOG_LEVEL:-INFO}/g" \ -e "s/{{SYNAPSE_LOG_LEVEL}}/${SYNAPSE_LOG_LEVEL:-INFO}/g" \ "$TEMPLATE_LOG" > "${WORKERS_DIR}/${worker_name}.log.config" TRAEFIK_LABELS="" if [[ "$TRAEFIK_ENABLED" == "1" && -n "$DOMAIN" ]]; then TRAEFIK_LABELS=" labels: - traefik.enable=true - traefik.http.services.${worker_name}.loadbalancer.server.port=${port} - traefik.http.routers.synapse-worker-${worker_name}.rule=Host(\`${DOMAIN}\`) && PathPrefix(\`/_matrix\`) - traefik.http.routers.synapse-worker-${worker_name}.entrypoints=websecure - traefik.http.routers.synapse-worker-${worker_name}.service=${worker_name} - traefik.http.routers.synapse-worker-${worker_name}.priority=10 " fi sed -e "s/{{WORKER_NAME}}/${worker_name}/g" \ -e "s/{{PORT}}/${port}/g" \ -e "s/{{APP_TYPE}}/synapse.app.generic_worker/g" \ -e "s/{{TRAEFIK_LABELS}}/${TRAEFIK_LABELS}/g" \ "$TEMPLATE_COMPOSE" >> "$TEMP_COMPOSE" echo "" >> "$TEMP_COMPOSE" done if [[ -f "$COMPOSE_FILE" ]]; then if ! grep -qE "^ synapse-worker-[0-9]+:" "$COMPOSE_FILE"; then cat "$TEMP_COMPOSE" >> "$COMPOSE_FILE" log_info "Appended ${WORKER_COUNT} worker(s) to compose.yaml" else log_warn "Some workers already exist. Manual merge required" cp "$TEMP_COMPOSE" "${ROOT_DIR}/.tmp/compose_workers.yaml" fi else log_warn "compose.yaml not found. Generated: ${TEMP_COMPOSE}" fi rm -f "$TEMP_COMPOSE" log_info "Worker generation complete"