Captures live config state of nullstone Purpur 1.21.11 server: - docker-compose.yml (itzg/minecraft-server image, MODRINTH_PROJECTS + PLUGINS lists) - All plugin configs under live-server/plugins/ (no DBs, no jars, no world data) - Server core: bukkit.yml, spigot.yml, purpur.yml, paper-global.yml, paper-world-defaults.yml, server.properties Excluded via .gitignore: - World data (world/, world_nether/, world_the_end/, auth_limbo/) - Sensitive: AuthMe DB (password hashes), Lands DB, CoreProtect DB, Essentials userdata - Jars (auto-fetched), logs, caches, .paper-remapped
87 lines
2.9 KiB
Markdown
87 lines
2.9 KiB
Markdown
# Deploy
|
|
|
|
## Fresh install
|
|
|
|
Target host: Debian 13 w/ Docker + Compose v2. Userns-remap optional (see PERMISSIONS.md).
|
|
|
|
```bash
|
|
# 1. Prep host dir
|
|
sudo mkdir -p /opt/docker/minecraft
|
|
sudo chown $(id -u):$(id -g) /opt/docker/minecraft
|
|
|
|
# 2. Seed configs from this repo
|
|
git clone https://github.com/<you>/minecraft-server.git /tmp/mc-repo
|
|
cp -r /tmp/mc-repo/config/* /opt/docker/minecraft/
|
|
mv /opt/docker/minecraft/paper /opt/docker/minecraft/config # paper-global.yml etc live in ./config/
|
|
cp /tmp/mc-repo/docker-compose.yml /opt/docker/minecraft/
|
|
|
|
# 3. Apply 777 (only if userns-remap in /etc/docker/daemon.json — see PERMISSIONS.md)
|
|
chmod -R 777 /opt/docker/minecraft
|
|
|
|
# 4. Ensure proxy network exists (for Traefik integration)
|
|
docker network create proxy 2>/dev/null || true
|
|
|
|
# 5. Boot
|
|
cd /opt/docker/minecraft
|
|
docker compose pull
|
|
docker compose up -d
|
|
docker logs -f minecraft-mc
|
|
```
|
|
|
|
Watch for `[Server thread/INFO]: Done (XX.XXXs)!` — server is live.
|
|
|
|
## Migrating from existing server
|
|
|
|
If you have an existing Bukkit-family server (Paper/Spigot/Purpur):
|
|
|
|
```bash
|
|
# On old host
|
|
cd /path/to/old-server
|
|
docker compose down 2>/dev/null || systemctl stop minecraft 2>/dev/null
|
|
tar czf /tmp/mc-old.tar.gz .
|
|
|
|
# Transfer
|
|
scp /tmp/mc-old.tar.gz user@new-host:/tmp/
|
|
|
|
# On new host
|
|
mkdir -p /opt/docker/minecraft
|
|
cd /opt/docker/minecraft
|
|
tar xzf /tmp/mc-old.tar.gz
|
|
|
|
# Drop in this repo's compose
|
|
cp /tmp/mc-repo/docker-compose.yml ./
|
|
chmod -R 777 .
|
|
|
|
# Optional: clear plugins/ to let MODRINTH_PROJECTS pull fresh latest
|
|
rm -rf plugins/*.jar
|
|
|
|
docker compose up -d
|
|
```
|
|
|
|
`REMOVE_OLD_MODS=true` + `REMOVE_OLD_MODS_INCLUDE=*.jar` in compose deletes manually-placed jars on every boot. Disable if you want manual jars to persist.
|
|
|
|
## Updating
|
|
|
|
```bash
|
|
cd /opt/docker/minecraft
|
|
docker compose pull # latest itzg image
|
|
docker compose down
|
|
docker compose up -d # auto-DLs latest Purpur build + latest plugins
|
|
```
|
|
|
|
Purpur version: set `VERSION: LATEST` in compose (default in this repo) to track newest stable. Pin to e.g. `VERSION: "1.21.10"` for reproducibility.
|
|
|
|
## Stopping / removing
|
|
|
|
```bash
|
|
docker compose down # stop, keep data
|
|
docker compose down -v # stop, remove anonymous volumes (worlds are bind-mounted, safe)
|
|
sudo rm -rf /opt/docker/minecraft # nuke everything
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
- **Restart loop, "Operation not permitted" on chown** → see PERMISSIONS.md, run `chmod -R 777 /opt/docker/minecraft`.
|
|
- **`Project(s) could not be located: [foo]`** → Modrinth slug wrong. Check the project page URL on modrinth.com — slug is the last path segment.
|
|
- **`UnknownHostException: api.purpurmc.org`** → host DNS broken. On nullstone, Tailscale ate `/etc/resolv.conf`; fix: `sudo tailscale set --accept-dns=false`.
|
|
- **Server starts but plugins missing** → check `docker logs minecraft-mc` for `[mc-image-helper]` lines; download errors print there.
|