og-cod-plutainer/README.md
Amos df24be7446
docs: split the README into task-focused pages, rework the examples
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.
2026-08-15 17:22:30 +01:00

3.5 KiB

Plutainer

Run a Call of Duty dedicated server in Docker. One image, seven games, configured with environment variables.

services:
  my-server:
    image: ghcr.io/ayymoss/plutainer:latest
    ports: ["4976:4976/udp"]
    volumes:
      - /path/to/BO2/files:/home/plutainer/gamefiles:ro
      - ./my-server:/home/plutainer/app
    environment:
      PLUTAINER_GAME: t6zm
      PLUTAINER_CONFIG_FILE: dedicated_zm.cfg
      PLUTO_SERVER_KEY: your-key-here
    restart: unless-stopped

docker compose up -d and you have a Black Ops II zombies server. Plutainer writes a working config on first start, so there is nothing to prepare beyond the game files you own.

→ Start here: the Quickstart

Supported games

Game PLUTAINER_GAME Notes
World at War (T4) t4mp, t4sp Plutonium. Needs a server key
Black Ops (T5) t5mp, t5sp Plutonium. Needs a valid server key — see why
Black Ops II (T6) t6mp, t6zm Plutonium. Needs a server key
Modern Warfare 3 (IW5) iw5mp Plutonium. Needs a server key
Modern Warfare 2 (IW4x) iw4x No key. amd64 only
Black Ops III (T7x) t7x Alterware. No key
Modern Warfare (CoD4x) cod4x No key. Multiplayer only, amd64 only

Image: ghcr.io/ayymoss/plutainer:latest — multi-arch (amd64 + arm64), with two exceptions.

Documentation

If you want to… Read
Get a first server running Quickstart
Know what your game needs Games — files, keys, config names, ports
Look up an environment variable Configuration
Understand where configs and logs live Volumes & configs
Send RCON commands RCON
Connect IW4MAdmin IW4MAdmin
Know when a server counts as healthy Healthcheck & restarts
Fix something that's broken Troubleshooting & FAQ
Copy a working compose file Examples
Upgrade from v1 Migration guide

What Plutainer does for you

  • Writes a working config on first start. Community defaults are seeded into app/configs/, and never overwrite files you've edited.
  • Fetches the server binaries. Plutonium, IW4x and T7x updaters run at startup; CoD4x ships in the image. You supply only the base game files.
  • Puts every config in one folder. Edit app/configs/whatever.cfg; Plutainer symlinks it to wherever the engine expects it.
  • Keeps logs findable. app/logs/ holds stable symlinks to the active log files, wherever the game moved them.
  • Fails loudly, not endlessly. A misconfiguration holds the container in Up with a readable error instead of a restart loop.
  • Reports real health. The healthcheck asks the server for its current map — no RCON password required.

Support

Discord: https://discord.gg/JekrGGWAUg — for Plutainer setup and configuration, including IW4MAdmin.

Plutonium-specific game issues are out of scope, and some familiarity with Docker is assumed. New to Docker? Start at https://docs.docker.com/get-started/.

Credits