Files
mcma-bootstrap/lib/compose_gen.sh
T
Senko-san 3a63ced4d4 feat: optional YouTube Music source (cookies volume + wizard step)
Adds a step_youtube wizard prompt (enable + cookies host folder), the @YOUTUBE_VOLUME@ token in templates/compose/backend.yml substituted in compose_gen, a YOUTUBE_ENABLED/cookies env block, ensure_youtube_dir in lifecycle, en/ru strings, and a README step.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 14:04:49 +03:00

112 lines
4.2 KiB
Bash

# docker-compose.yml + Caddyfile generation by gluing service fragments.
#
# Fragments live in templates/compose/. A few carry @TOKENS@ that depend on the
# user's choices (published ports, depends_on for embedded backing services);
# those are substituted here. External backing services contribute no fragment.
_frag() { cat "${BOOTSTRAP_DIR}/templates/compose/$1"; }
generate_compose() {
local nl=$'\n'
local api_ports="" api_depends="" worker_depends="" webui_ports="" caddy_ports=""
local dep=""
# depends_on: only wait on backing services we actually run, and only when
# they are healthy (never start the backend over an unready dependency).
[[ "$CFG_DB_MODE" == "embedded" ]] && dep+=" db:${nl} condition: service_healthy${nl}"
[[ "$CFG_REDIS_MODE" == "embedded" ]] && dep+=" redis:${nl} condition: service_healthy${nl}"
if [[ -n "$dep" ]]; then
api_depends=" depends_on:${nl}${dep%"$nl"}"
worker_depends="$api_depends"
fi
# API port: published whenever there is no bundled proxy (backend-only, or
# webui with the operator's own proxy). Behind Caddy the API stays in-network.
if [[ "$CFG_PROXY" == "no" ]]; then
api_ports=" ports:${nl} - \"\${API_PORT}:8000\""
fi
# Webui port: published only when the webui runs without the bundled proxy.
if [[ "$CFG_WEBUI" == "yes" && "$CFG_PROXY" == "no" ]]; then
webui_ports=" ports:${nl} - \"\${WEBUI_PORT}:80\""
fi
# YouTube cookies volume: mounted into api+worker only when the source is
# enabled. The host path comes from .env.deploy (YOUTUBE_COOKIES_HOST_PATH).
local youtube_volume=""
if [[ "$CFG_YOUTUBE" == "yes" ]]; then
youtube_volume=" - \${YOUTUBE_COOKIES_HOST_PATH}:/data/youtube"
fi
# Caddy publish ports: 80/443 with a domain (auto-HTTPS), else plain HTTP.
if [[ "$CFG_HTTPS" == "yes" ]]; then
caddy_ports=" - \"80:80\"${nl} - \"443:443\""
else
caddy_ports=" - \"\${HTTP_PORT}:80\""
fi
# -- assemble ---------------------------------------------------------
local backend webui caddy
backend="$(_frag backend.yml)"
backend="${backend//@YOUTUBE_VOLUME@/$youtube_volume}"
backend="${backend//@API_PORTS@/$api_ports}"
backend="${backend//@API_DEPENDS@/$api_depends}"
backend="${backend//@WORKER_DEPENDS@/$worker_depends}"
{
_frag _base.yml
printf '%s\n' "$backend"
if [[ "$CFG_WEBUI" == "yes" ]]; then
webui="$(_frag webui.yml)"
webui="${webui//@WEBUI_PORTS@/$webui_ports}"
printf '%s\n' "$webui"
fi
[[ "$CFG_DB_MODE" == "embedded" ]] && _frag postgres.yml
[[ "$CFG_REDIS_MODE" == "embedded" ]] && _frag redis.yml
[[ "$CFG_STORAGE" == "s3" && "$CFG_S3_MODE" == "embedded" ]] && _frag minio.yml
if [[ "$CFG_PROXY" == "yes" ]]; then
caddy="$(_frag caddy.yml)"
caddy="${caddy//@CADDY_PORTS@/$caddy_ports}"
printf '%s\n' "$caddy"
fi
# -- named volumes (only those actually referenced) ---------------
echo ""
echo "volumes:"
echo " transcode_cache:"
[[ "$CFG_DB_MODE" == "embedded" ]] && echo " pgdata:"
[[ "$CFG_REDIS_MODE" == "embedded" ]] && echo " redisdata:"
[[ "$CFG_STORAGE" == "s3" && "$CFG_S3_MODE" == "embedded" ]] && echo " miniodata:"
if [[ "$CFG_PROXY" == "yes" ]]; then
echo " caddy_data:"
echo " caddy_config:"
fi
} >"$COMPOSE_FILE"
[[ "$CFG_PROXY" == "yes" ]] && generate_caddyfile
}
# generate_caddyfile — concrete Caddyfile (no env indirection). Routes API
# paths to the backend and everything else to the static webui.
generate_caddyfile() {
local site
if [[ "$CFG_HTTPS" == "yes" ]]; then site="$CFG_DOMAIN"; else site=":80"; fi
{
if [[ "$CFG_HTTPS" == "yes" && -n "${CFG_ACME_EMAIL:-}" ]]; then
echo "{"
echo " email ${CFG_ACME_EMAIL}"
echo "}"
echo ""
fi
echo "${site} {"
echo " @api path /api/* /health* /rest/*"
echo " reverse_proxy @api api:8000"
echo " reverse_proxy webui:80"
echo "}"
} >"$CADDYFILE"
}