feat(compose): optional static/mirror via override files; build-stack up modes

Base compose is core only (dnsmasq, drasl, minecraft, mc-backup, caddy
auth+packwiz). docker-compose.static.yml and docker-compose.mirror.yml layer
on the landing site and the air-gap mirror independently. build-stack.sh --up
[core|static|mirror|full] selects the override files.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-24 05:07:20 +02:00
parent 3bf714a224
commit d6e7504d6e
4 changed files with 53 additions and 12 deletions

View File

@@ -29,27 +29,28 @@ services:
# HTTP_USER: "admin"
# HTTP_PASS: "change-me"
# Core ingress. Static site + air-gap mirror are layered in via override
# files (docker-compose.static.yml / .mirror.yml) — see build-stack.sh --up.
caddy:
image: caddy:alpine
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443" # tls internal — air-gap mirror vhosts (see 11)
environment:
BASE_DOMAIN: ${BASE_DOMAIN}
volumes:
- ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
- ./www:/srv/www:ro
- ./caddy/conf.d/00-core.caddy:/etc/caddy/conf.d/00-core.caddy:ro
- ./pack:/srv/pack:ro
- ./mirror/launcher:/srv/launcher:ro
- ./mirror/upstream:/srv/mirror:ro # byte-exact upstream mirror (see 11)
networks:
mcnet:
# All subdomain aliases live here (harmless when a vhost snippet isn't
# mounted; lets internal containers resolve them to Caddy). The spoof
# hosts only actually serve content when the mirror snippet is present.
aliases:
- "auth.${BASE_DOMAIN}"
- "packwiz.${BASE_DOMAIN}"
# Air-gap spoof hosts -> Caddy, so internal containers resolve them too.
- "meta.prismlauncher.org"
- "piston-meta.mojang.com"
- "piston-data.mojang.com"