The refresh script kept its own copy of the pack directory and the three URLs,
so every deployment had to hand-edit it after running the installer — the last
manual step and an easy one to forget or get wrong.
It now sources deploy.conf when one sits next to it and derives PACK_DIR,
BASE_URL, CLIENT_URL and PACK_URL from PACK_NAME, SHARE and MIRROR_URL. The
CONFIG block remains as the fallback when there is no config file, so the
script still works standalone.
CLIENT_URL was also referenced by the sync but never defined in the CONFIG
block, which would have been an unbound variable under set -u on the first run
with client mods. Verified both the with-config and without-config paths.
Also gitignore deploy.conf and DEPLOY-NOTES.md as machine-local files.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Deploys a self-hosted NeoForge server whose modpack clients pull automatically
on launch, with mods served from an HTTP mirror of the server's own mods dir
rather than Modrinth or CurseForge.
- mc-service-setup.sh: minecraft user, NeoForge install, systemd service paired
with a console FIFO socket so stops are graceful and the world saves
- packwiz-setup.sh: packwiz install, pack init, mod index built from the
mirror, and per-OS player setup guides generated with real URLs baked in
- mc-refresh-restart.sh: re-sync after mod changes, ZFS snapshot, restart
- deploy.sh: runs the above in order
- build.sh: release zip, refusing to package scripts that don't parse
Every entry point refuses to run when /minecraft is not a mountpoint, so an
unmounted dataset cannot silently fill the root filesystem.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>