refactor(pack): host custom jars from ./custom outside the pack root

Move pack/custom/ -> ./custom/ and bind-mount it into caddy at
/srv/pack/custom (served URL pack.${BASE_DOMAIN}/custom/ unchanged).
Keeping jars outside the packwiz pack root stops `packwiz refresh`
from indexing them as direct files on top of the mods/*.pw.toml
external refs (drops 9 bogus custom/*.jar entries from index.toml).

add-custom-mod.sh now writes jars to ./custom/. Trim the blessingskin
caddy override to just the conf swap (volumes merge by target).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-07 21:22:03 +02:00
parent 58f0312018
commit c40cbe7594
14 changed files with 16 additions and 47 deletions

View File

@@ -26,12 +26,12 @@
services:
caddy:
# Swap the core ingress conf for the Blessing Skin one (same mount target,
# so it shadows the base 00-core.caddy). volumes is a full replacement here.
# Swap the core ingress conf for the Blessing Skin one. Compose MERGES
# volumes by container path, so mounting the BSS conf at the SAME target
# (/etc/caddy/conf.d/00-core.caddy) shadows the base 00-core.caddy; all
# other base mounts (pack, custom, static, ca) are kept automatically.
volumes:
- ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy/conf.d/00-core-blessingskin.caddy:/etc/caddy/conf.d/00-core.caddy:ro
- ./pack:/srv/pack:ro
depends_on:
- blessing-skin

View File

@@ -31,6 +31,10 @@ services:
- ./mirror/launcher:/srv/launcher:ro
- ./caddy/caddy-root-ca.crt:/srv/ca-pub/ca.crt:ro
- ./pack:/srv/pack:ro
# Custom (locally-hosted) mod jars live OUTSIDE ./pack so packwiz refresh
# doesn't index them as direct files — they're external download targets
# referenced by pack/mods/*.pw.toml. Served at pack.${BASE_DOMAIN}/custom/.
- ./custom:/srv/pack/custom:ro
networks:
mcnet:
# Only the stack's own subdomains in the base. The upstream spoof-host

View File

@@ -2,48 +2,12 @@ hash-format = "sha256"
[[files]]
file = "CustomSkinLoader/CustomSkinLoader.json"
hash = "e90635e0074cc7b1ddee50ddd2af8a4b35842ab721878665b00a3612ad01105b"
hash = "20f015b837d4178cc1ba6ca074e746dea91b2b97810587bae0fc4e55cf98b1aa"
[[files]]
file = "README.md"
hash = "3915be75668def5a70667584c7aebdc1ee9a7f7dd9479cb10fb174aad40a6b4e"
[[files]]
file = "custom/CustomSkinLoader_Universal-14.28.jar"
hash = "0008fb0a91dd1e84d52162cfe96addb5f6aed3b76d426ea7305d7624e31f1894"
[[files]]
file = "custom/Jade-1.21.1-NeoForge-15.10.5.jar"
hash = "067bb4b007e1d6f6b79f0afe99c91252aa825472b99a76d33a60d24442f9e92d"
[[files]]
file = "custom/JadeAddons-1.21.1-NeoForge-6.1.0.jar"
hash = "5f242668ad710092964d4d9afda8a94fa2401665ea13eea67d55d07e4dff8a64"
[[files]]
file = "custom/JustEnoughProfessions-neoforge-1.21.1-4.0.5.jar"
hash = "b320b47f1791f56df9e1a05138f0e312e6e54541945ff15f2f1fd398cd1d4d9d"
[[files]]
file = "custom/JustEnoughResources-NeoForge-1.21.1-1.6.0.17.jar"
hash = "7a47d69b5530704690d5a5f0726cd74a2d6c57df17dd4a8589c4ab5212f91460"
[[files]]
file = "custom/MouseTweaks-neoforge-mc1.21-2.26.1.jar"
hash = "68e6f4201c5de97b77929a7215c9552495696ca6a3bf3ae4eacc34e135f6cc8b"
[[files]]
file = "custom/balm-neoforge-1.21.1-21.0.58.jar"
hash = "aa2463747bad4c2351869226ea7bce7839510dfd2ac387f8d1588b1ce9309c67"
[[files]]
file = "custom/inventoryessentials-neoforge-1.21.1-21.1.15.jar"
hash = "b7a5c5526a45256551543419ba2b5d54e56c585d76a645a8cea8cb8ea843ae2c"
[[files]]
file = "custom/jei-1.21.1-neoforge-19.27.0.340.jar"
hash = "8aaf547432f1b4958239b036356b910692fe40f858c3073d996f56bbf7c99826"
[[files]]
file = "mods/balm-neoforge-1-21-1-21-0-58.pw.toml"
hash = "4d04516cc66ac6f29d6d1ae16bfd89217f21d842858ace5bcae1e402da5da0e2"

View File

@@ -6,7 +6,7 @@ pack-format = "packwiz:1.1.0"
[index]
file = "index.toml"
hash-format = "sha256"
hash = "64c69b2e38fcf389a3de38d240aa95e8309ac60e717c1fe994aef2c4a2684921"
hash = "2707ae674c7c75371b97cc378ca72abc36bbb513b7db238db111f88a13aa6039"
[versions]
minecraft = "1.21.1"

View File

@@ -6,8 +6,9 @@
# <slug>.pw.toml that points at a stable download URL + sha256, then refresh.
#
# Since the jars are local (no public URL), we HOST them on the caddy pack
# server: each jar is copied under pack/custom/ — caddy serves pack/ at
# http://pack.${BASE_DOMAIN}/ — so the metadata's download url is
# server: each jar is copied to the top-level ./custom/ dir (OUTSIDE ./pack, so
# packwiz refresh won't index it as a direct file). Caddy bind-mounts ./custom
# at /srv/pack/custom, so it is served at
# http://pack.${BASE_DOMAIN}/custom/<filename>
# which is exactly what minecraft fetches via PACKWIZ_URL on install.
#
@@ -73,7 +74,7 @@ else
JARS=("$TARGET")
fi
mkdir -p pack/custom pack/mods
mkdir -p custom pack/mods
# ---- per-jar processing (no refresh; refresh once at the end) --------------
add_one() { # $1 = jar path. Uses NAME (single-jar only), SIDE, FORCE, BASE_DOMAIN.
@@ -88,7 +89,7 @@ add_one() { # $1 = jar path. Uses NAME (single-jar only), SIDE, FORCE, BASE_DOM
[ -n "$slug" ] || die "could not derive a slug from name '$name'"
meta="pack/mods/${slug}.pw.toml"
dest="pack/custom/${filename}"
dest="custom/${filename}"
url="http://pack.${BASE_DOMAIN}/custom/${filename}"
if [ "$FORCE" -ne 1 ]; then
@@ -119,4 +120,4 @@ for j in "${JARS[@]}"; do add_one "$j"; done
# .pw.toml files are picked up. Must run inside the pack dir.
( cd pack && packwiz refresh )
log "packwiz refresh done — ${#JARS[@]} mod(s) added to the pack"
echo " commit pack/custom/*.jar, pack/mods/*.pw.toml, pack/index.toml, pack/pack.toml"
echo " commit custom/*.jar, pack/mods/*.pw.toml, pack/index.toml, pack/pack.toml"