The README had grown to 388 lines of reference material and was reported as too difficult to follow. It is now a 72-line landing page - a working compose block, the game table, and an index - with the detail moved to whichever page owns it: docs/quickstart.md first server, start to finish docs/games.md per game: files, keys, config names, quirks docs/configuration.md environment variable reference docs/volumes-and-configs.md volume layout, config symlinks, logs docs/rcon.md passwords, rcon-cli, who may send RCON docs/iw4madmin.md sidecar setup, parsers, the whitelist trap docs/healthcheck.md what healthy means, restarts, autoheal docs/troubleshooting.md symptom-first FAQ Nothing was dropped; the length came out of duplication. The troubleshooting page is deliberately symptom-first, and every entry is a failure that actually happened - the T5 key that presents as a broken server, the CoD4x RCON password silently refused for being under 8 characters, the IW4MAdmin whitelist. Examples are split by scenario under examples/, replacing the single 228-line file: single-server, per-game (a block for all seven), multi-server, with-iw4madmin, and env.example for secrets. EXAMPLE-docker-compose.yml stays as a signpost because forum posts link to it. The IW4MAdmin example and docs now mount the log FILE rather than the app directory. Pointing IW4MAdmin at Plutainer's logs/ symlink means it silently ingests nothing: it decides whether to read by comparing the file's size, and .NET reports a symlink's size as the length of the link text, so the log never appears to grow. Mounting the file makes Docker resolve the symlink at mount time. Verified across all eleven servers. docs/ and examples/ are excluded from the build context.
3.6 KiB
Quickstart
Getting one server running, start to finish. Budget ten minutes, most of it waiting for downloads.
Before you start
You need three things:
- Docker and Docker Compose on a Linux host.
- The base game files, which you must own. Plutainer ships no game content. What exactly each game needs is in Games.
- A Plutonium server key — only for T4, T5, T6 and IW5. Free from https://platform.plutonium.pw/serverkeys. IW4x, T7x and CoD4x need nothing.
1. Put the game files somewhere
Anywhere on the host. They're mounted read-only, so they can be shared by as many servers as you like:
/opt/game-files/
T6ServerFiles/
IW4xServerFiles/
2. Write a compose file
Pick your game's example from examples/, or start from this one:
services:
t6zm-1:
image: ghcr.io/ayymoss/plutainer:latest
container_name: t6zm-1
restart: unless-stopped
ports:
- "4976:4976/udp"
volumes:
- /opt/game-files/T6ServerFiles:/home/plutainer/gamefiles:ro
- ./t6zm-1:/home/plutainer/app
environment:
PLUTAINER_GAME: t6zm
PLUTAINER_CONFIG_FILE: dedicated_zm.cfg
PLUTO_SERVER_KEY: ${T6ZM_KEY}
PLUTAINER_RCON_PASSWORD: change-me-or-remove-this-line
Four settings matter:
PLUTAINER_GAME |
Which game. Full list |
PLUTAINER_CONFIG_FILE |
Which config to run. Must be one Plutainer seeds unless you supply your own — names per game |
| the gamefiles mount | Your base game files, read-only |
| the app mount | Where server data, configs and logs live |
Put the key in a .env file next to your compose file so it stays out of the compose:
T6ZM_KEY=your-key-here
3. Start it
docker compose up -d
docker compose logs -f
First start takes a while. Plutonium downloads ~500 MB, IW4x 1–2 GB. CoD4x is ready in under a minute since everything ships in the image. The healthcheck allows five minutes before it starts judging.
4. Check it worked
docker ps
healthy means the server answered a status query and reported a loaded map — it's genuinely up, not just running. If it says unhealthy or never leaves starting, go to Troubleshooting.
5. Edit your config
Everything is in one folder, whatever the game:
nano ./t6zm-1/configs/dedicated_zm.cfg
docker restart t6zm-1
Plutainer symlinks that file to wherever the engine expects it, so you never go hunting through runtime/. Details in Volumes & configs.
What you get
t6zm-1/
configs/ ← edit your *.cfg here
logs/ ← stable symlinks to the live logs
runtime/ ← game files, binaries, engine state (leave alone)
Next steps
- Send commands to the server → RCON. Set
PLUTAINER_RCON_PASSWORDfirst; it's empty by default so RCON is off. - Add an admin tool → IW4MAdmin
- Run several servers →
examples/multi-server.yml. Each needs its own port and its own app directory; the gamefiles mount can be shared. - Restart servers automatically when they die → Healthcheck & restarts
A note on permissions
The container runs as UID 1000. If you create the app directory as root, the container may not be able to write to it:
sudo chown -R 1000:1000 ./t6zm-1
Most desktop Linux users are already UID 1000 and never hit this. If the logs say Permission denied while creating configs, logs or runtime, this is why.