docker-allthemods10/README.md
Sulkta ae51ce73c0
Some checks failed
gitleaks / scan (push) Failing after 1s
docs: rewrite README for public release; tidy gitleaks workflow comment
2026-06-28 13:37:41 -07:00

134 lines
6.1 KiB
Markdown

# docker-allthemods10
A Docker image that runs an **[All the Mods 10](https://www.curseforge.com/minecraft/modpacks/all-the-mods-10)** (ATM10) dedicated Minecraft server on [NeoForge](https://neoforged.net/).
No Minecraft or modpack files are shipped in the image. On first start the
container downloads the pinned ATM10 server files from CurseForge and runs the
NeoForge installer; subsequent starts boot the already-installed server. The
first run can take a while as the installer completes — watch the logs.
- **Modpack:** All the Mods 10, server version `5.5`
- **Loader:** NeoForge `21.1.219` (Minecraft 1.21.1)
- **Base image:** `eclipse-temurin:21-jdk`
## Requirements
- Docker (or any OCI runtime / Kubernetes — see [`k8s_example.md`](k8s_example.md))
- A persistent volume mounted at `/data`
- TCP port `25565` published
- `EULA=true` — you must accept the [Minecraft EULA](https://aka.ms/MinecraftEULA) to run a server
## Quick start
```sh
# Build the image
docker build -t allthemods10 .
# Run it
docker run -d \
--name atm10 \
-p 25565:25565 \
-v atm10-data:/data \
-e EULA=true \
-e MOTD="All the Mods 10 Server" \
-e MAX_PLAYERS=10 \
allthemods10
```
The server installs into the `/data` volume on first boot. Give it a few
minutes and watch `docker logs -f atm10` until the world is ready.
## Configuration
All configuration is via environment variables. Only `EULA` is required.
| Variable | Default | Description |
|--------------------|---------------------------------|-------------|
| `EULA` | `false` | Set to `true` to accept the Minecraft EULA. The server will not start otherwise. |
| `JVM_OPTS` | `-Xms2048m -Xmx4096m` (example) | JVM flags. Each space-separated token is appended to `user_jvm_args.txt`. |
| `MOTD` | `A Minecraft Server` | Server message of the day. |
| `MAX_PLAYERS` | `20` | Maximum concurrent players. |
| `ALLOW_FLIGHT` | `false` | `true`/`false` — allow flight. |
| `ONLINE_MODE` | `true` | `true`/`false` — authenticate players against Mojang. |
| `ENABLE_WHITELIST` | `false` | `true`/`false` — enforce the whitelist. |
| `WHITELIST_USERS` | _(empty)_ | Comma-separated Minecraft usernames to add to the whitelist. |
| `OP_USERS` | _(empty)_ | Comma-separated Minecraft usernames to grant operator (level 4). |
| `RCON_PASSWORD` | _(empty)_ | If set, enables RCON on the server and uses this password. |
| `RCON_PORT` | `25575` | RCON listen port (only used when `RCON_PASSWORD` is set). |
`WHITELIST_USERS` and `OP_USERS` are resolved to UUIDs at startup via
[playerdb.co](https://playerdb.co/) and merged into `whitelist.json` /
`ops.json` idempotently, so the same name is never added twice.
### Permissions
The server process runs as **uid `99` / gid `100`**, which matches the default
`nobody:users` ownership on [Unraid](https://unraid.net). On other hosts you may
need to `chown 99:100` the `/data` volume (the Kubernetes example does this with
an init container).
### Resetting / upgrading
If an install is incomplete or you want to force a re-download, delete the
`Server-Files-<version>.zip` file in `/data`; the next start will re-run the
install/upgrade.
## Optional: RCON order fulfillment daemon
`fulfillment.py` is an optional companion daemon that delivers in-game items via
RCON in response to confirmed orders from an external shop API (for example, a
donation/store integration). It is **disabled by default** and only starts when
all three of these are set:
- `SHOP_API_URL` — base URL of the shop API
- `SHOP_API_KEY` — API key
- `RCON_PASSWORD` — so the daemon can talk to the server over RCON
When enabled it polls the shop API for pending orders, delivers the configured
item kits to online players via RCON, and marks orders fulfilled. The item kits
(`ITEM_COMMANDS`) and poll/startup timing are defined at the top of
`fulfillment.py`; edit them to match your own shop and items. Additional
variables: `RCON_HOST` (default `127.0.0.1`), `FULFILLMENT_POLL_INTERVAL`
(default `30`s), `FULFILLMENT_STARTUP_DELAY` (default `90`s).
If you do not run a shop, you can ignore this file entirely — leave the three
variables unset and the server runs normally.
## Kubernetes
A community-contributed StatefulSet/Service manifest is in
[`k8s_example.md`](k8s_example.md). It is provided as a starting point and is
not an officially supported deployment method.
## Continuous integration
- `.github/workflows/docker-hub.yml` — builds and pushes the image to Docker Hub
on pushes to `main`/`develop` (expects `DOCKERHUB_USERNAME` / `DOCKERHUB_TOKEN`
secrets).
- `.github/workflows/update-mod.yml` — a daily job that checks CurseForge for a
newer server build and opens an update commit (expects a `CURSEFORGE_API_KEY`).
- `.forgejo/workflows/gitleaks.yml` — runs gitleaks secret scanning (Forgejo/Gitea
Actions; safe to delete if unused).
## Contributing
Issues and pull requests are welcome. Please keep the image lean — modpack
content is downloaded at runtime, not vendored — and avoid committing secrets
(a gitleaks workflow guards against this).
## License & attribution
This repository contains only the **Docker packaging** (entrypoint scripts and
CI workflows) for the All the Mods 10 server. It ships no Minecraft or modpack
files.
It is a fork of [`W3LFARe/docker-allthemods10`](https://github.com/W3LFARe/docker-allthemods10),
which in turn derives from [`Goobaroo/docker-allthemods9`](https://github.com/Goobaroo/docker-allthemods9).
The packaging is provided **as-is**, under the same terms as those upstream
projects.
Minecraft, NeoForge, the All the Mods 10 modpack, and the individual mods it
bundles are each subject to their own licenses and terms — including the
[Mojang/Minecraft EULA](https://aka.ms/MinecraftEULA) and the All the Mods
team's distribution terms. You are responsible for complying with them when you
run this server.