https://github.com/asgarrrr/hetzner-minecraft
Docker Compose setup to run All the Mods 10 on a Hetzner VPS, with room for a future Discord bot.
https://github.com/asgarrrr/hetzner-minecraft
all-the-mods-10 atm10 curseforge docker-compose hetzner minecraft vps
Last synced: about 1 month ago
JSON representation
Docker Compose setup to run All the Mods 10 on a Hetzner VPS, with room for a future Discord bot.
- Host: GitHub
- URL: https://github.com/asgarrrr/hetzner-minecraft
- Owner: Asgarrrr
- Created: 2026-04-22T12:34:15.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-04-22T14:21:09.000Z (3 months ago)
- Last Synced: 2026-04-22T15:16:14.788Z (3 months ago)
- Topics: all-the-mods-10, atm10, curseforge, docker-compose, hetzner, minecraft, vps
- Language: Shell
- Size: 24.4 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Hetzner Minecraft
Minimal repo for running **All the Mods 10** on a Hetzner VPS with Docker Compose.
The repository currently runs Minecraft only, with a reserved `services/discord-bot/` directory for a future bot.
## Structure
```text
.
├── compose.yml
├── .env.example
├── scripts/
│ ├── bootstrap-ubuntu.sh
│ └── provision-ubuntu.sh
├── services/
│ ├── minecraft/
│ └── discord-bot/
└── volumes/
└── minecraft/
```
- `compose.yml`: shared Docker orchestration for the repo
- `scripts/bootstrap-ubuntu.sh`: Ubuntu bootstrap script for Docker + first deploy
- `scripts/provision-ubuntu.sh`: fresh-server provisioner with dedicated user + clone + bootstrap
- `services/minecraft/`: docs and files related to the Minecraft server
- `services/discord-bot/`: reserved location for the future bot
- `volumes/minecraft/`: persistent server data
## Prerequisites
- a Hetzner VPS
- a CurseForge API key
## Bootstrap
On a fresh Ubuntu server, after cloning the repo:
```bash
chmod +x scripts/bootstrap-ubuntu.sh
./scripts/bootstrap-ubuntu.sh
```
The script will:
- install Docker Engine and the Compose plugin if needed
- create `.env` from `.env.example` if missing
- ask for `CF_API_KEY` and `RCON_PASSWORD` if they are not already set
- create `./volumes/minecraft`
- pull the image and start the stack
You can also run it non-interactively:
```bash
CF_API_KEY='your_token' RCON_PASSWORD='your_password' ./scripts/bootstrap-ubuntu.sh
```
Optional overrides:
```bash
CF_API_KEY='your_token' \
RCON_PASSWORD='your_password' \
MEMORY=20G \
INIT_MEMORY=4G \
VIEW_DISTANCE=6 \
SIMULATION_DISTANCE=4 \
MOTD="Eternia ATM10" \
./scripts/bootstrap-ubuntu.sh
```
If you also want the script to open Minecraft in UFW, set `OPEN_UFW=1`.
## Fresh Server Provisioning
If you want the server to:
- create a dedicated system user
- clone or update the repo
- run the bootstrap automatically
use `scripts/provision-ubuntu.sh`.
With a public repo, the shortest path on a fresh server is:
```bash
curl -fsSL https://raw.githubusercontent.com/Asgarrrr/hetzner-minecraft/main/scripts/provision-ubuntu.sh -o provision-ubuntu.sh
sudo env CF_API_KEY='your_token' \
RCON_PASSWORD='your_password' \
APP_USER=minecraft \
APP_HOME=/opt/hetzner-minecraft \
bash provision-ubuntu.sh
```
If your CurseForge key starts with `$2a$10$...`, keep the single quotes exactly as shown above. On the current version of this repo, that is enough: the key is passed to the container through `env_file`, so you do not need to double the dollar signs in `.env`.
The default `REPO_URL` already points to `https://github.com/Asgarrrr/hetzner-minecraft.git`, so you only need to override it if you fork or rename the repository.
If you ever switch back to a private repo, use either:
```bash
sudo REPO_URL=git@github.com:Asgarrrr/hetzner-minecraft.git bash provision-ubuntu.sh
```
or:
```bash
sudo GITHUB_TOKEN=your_token bash provision-ubuntu.sh
```
Useful options:
- `APP_USER`: dedicated Linux user, default `minecraft`
- `APP_USER_HOME`: Linux home directory for that user, default `/home/minecraft`
- `APP_HOME`: target directory, default `/opt/hetzner-minecraft`
- `REPO_REF`: git branch/tag, default `main`
- `UPDATE_REPO=1`: fetch and fast-forward an existing checkout
- `RUN_BOOTSTRAP=0`: stop after clone/update
- all bootstrap variables such as `CF_API_KEY`, `RCON_PASSWORD`, `MEMORY`, `MOTD`, `OPEN_UFW`
## Manual Installation
1. Copy `.env.example` to `.env`
2. Set `CF_API_KEY` and `RCON_PASSWORD`
3. Start the server:
```bash
docker compose up -d
```
4. Open port `25565/tcp` in the VPS firewall
5. Follow the logs during first boot:
```bash
docker compose logs -f minecraft
```
The first boot can take a while: the container downloads the image, then the ATM10 modpack.
## Configuration
Main variables in `.env`:
- `CF_API_KEY`: required to download the CurseForge modpack
- `RCON_PASSWORD`: RCON password
- `ALLOW_FLIGHT`: set to `true` to avoid kicks when modded flight is detected
- `MEMORY`: Java max heap, `16G` by default
- `INIT_MEMORY`: Java initial heap, `4G` by default
- `CF_FILENAME_MATCHER`: ATM10 version to install, `6.6` by default
## Data
All persistent data is stored in `./volumes/minecraft`.
If you want to migrate an existing world later, place the world files in that directory before restarting the container.