This project runs a Minecraft Java Edition server with Docker.
The stack in docker-compose.yml starts four services:
minecraft-paper— game server (itzg/minecraft-server, Paper)websockify— TCP-to-WebSocket bridgenginx— HTTP endpoint for the WebSocket tunnel (/minecraft-tunnel)mumble-server— voice chat server (port64738)
Current game settings:
| Setting | Value |
|---|---|
| Type | Paper |
| Version | 26.2 |
| Memory | 4G |
| Server port | 25575 |
| Online mode | FALSE |
| Difficulty | hard |
.
├── docker-compose.yml # service definitions
├── nginx.conf # WebSocket tunnel proxy config
├── minecraft_data/ # world data, server properties, plugins (gitignored)
└── mumble_data/ # Mumble DB & config (gitignored)
Create a .env file in the project root before starting:
MUMBLE_SUPERUSER_PASSWORD=your_password_heredocker compose up -d --force-recreateStop everything:
docker compose downContainer state:
docker compose psLive server logs:
docker compose logs -f minecraft-paperYou should eventually see:
Done (...s)! For help, type "help"
127.0.0.1:25575
From another device on your LAN:
<your-lan-ip>:25575
Run websocat in a separate terminal to unwrap the tunnel locally:
websocat.exe -b -E tcp-l:127.0.0.1:25576 ws://127.0.0.1:80/minecraft-tunnelThen connect Minecraft to 127.0.0.1:25576.
Note: Do not bind
websocatto port25575— Docker already owns that port.
Connect any Mumble client to:
127.0.0.1:64738
The superuser password is set via MUMBLE_SUPERUSER_PASSWORD in your .env file.
# Check all containers
docker compose ps
# Check listening ports (Windows)
Test-NetConnection -ComputerName 127.0.0.1 -Port 25575
Test-NetConnection -ComputerName 127.0.0.1 -Port 80
Test-NetConnection -ComputerName 127.0.0.1 -Port 64738
# Review startup logs
docker compose logs --tail 200 minecraft-paper nginx websockify mumble-server- World and server files:
minecraft_data/ - Plugins:
minecraft_data/plugins/ - Mumble config and DB:
mumble_data/