_So, you want to host minecraft servers, huh?_
## Intro
I like docker for the most part. I can be a pain, but truthfully, nothing makes me more happy than defined configs that just _work_ after some troubleshooting. Here is the workflow
- add work flow heh
## What you need
This guide is expecting you know a bit about controlling docker via the CLI, but if not, [here](https://docs.docker.com/get-started/docker_cheatsheet.pdf).
I am using Ubuntu 24.04 inside a Proxmox VM, there is a good set of reasons why I do this, but that is for a different writeup.
- [Docker](https://docs.docker.com/engine/install/ubuntu/)
- Docker Compose via `sudo apt install docker-compose`
## The cheese
With that being said, let's look at the `docker-compose.yml`:
```yaml
version: '3.8'
services:
velocity:
image: itzg/bungeecord:latest
container_name: velocity-proxy
environment:
TYPE: VELOCITY
MEMORY: 512M
ports:
- "10000:25577"
volumes:
- ./velocity:/server
networks:
- minecraft-network
restart: unless-stopped
lobby:
image: itzg/minecraft-server:latest
container_name: lobby-server
environment:
EULA: "TRUE"
TYPE: "PAPER"
PAPER_CHANNEL: "EXPERIMENTAL"
MEMORY: 4G
SERVER_NAME: "Lobby Server"
ONLINE_MODE: "FALSE"
# Server properties
MOTD: "Welcome to the Lobby!"
MAX_PLAYERS: 100
DIFFICULTY: peaceful
MODE: adventure
PVP: "FALSE"
LEVEL_TYPE: minecraft:flat
SPAWN_PROTECTION: 0
ALLOW_FLIGHT: "TRUE"
# Fix spawn location
OVERRIDE_SERVER_PROPERTIES: "TRUE"
# Lobby specific settings
FORCE_GAMEMODE: "TRUE"
# Backup configuration
volumes:
- ./lobby:/data
networks:
- minecraft-network
restart: unless-stopped
andrew:
image: itzg/minecraft-server:latest
container_name: andrew-server
environment:
EULA: "TRUE"
TYPE: "PAPER"
PAPER_CHANNEL: "EXPERIMENTAL"
# USE_AIKAR_FLAGS: "TRUE"
MEMORY: 8G
SERVER_NAME: "Andrew Server"
ONLINE_MODE: "FALSE"
# Server properties
MOTD: "Andrew's block guh"
MAX_PLAYERS: 50
DIFFICULTY: hard
MODE: survival
PVP: "TRUE"
SPAWN_PROTECTION: 16
# Backup configuration
ENABLE_ROLLING_LOGS: "TRUE"
BACKUP_ENABLED: "TRUE"
BACKUP_INTERVAL: "2h"
BACKUP_PRUNE_DAYS: "7"
BACKUP_DEST_DIR: "/backups"
volumes:
- ./andrew:/data
- ./backups/andrew:/backups
networks:
- minecraft-network
restart: unless-stopped
josh:
image: itzg/minecraft-server:latest
container_name: josh-server
environment:
EULA: "TRUE"
TYPE: "PAPER"
PAPER_CHANNEL: "EXPERIMENTAL"
# USE_AIKAR_FLAGS: "TRUE"
MEMORY: 8G
SERVER_NAME: "Josh Server"
ONLINE_MODE: "FALSE"
# Server properties
MOTD: "Josh's Server - fart"
MAX_PLAYERS: 50
DIFFICULTY: hard
MODE: survival
SPAWN_PROTECTION: 0
# Backup configuration
ENABLE_ROLLING_LOGS: "TRUE"
BACKUP_ENABLED: "TRUE"
BACKUP_INTERVAL: "2h"
BACKUP_PRUNE_DAYS: "7"
BACKUP_DEST_DIR: "/backups"
volumes:
- ./josh:/data
- ./backups/josh:/backups
networks:
- minecraft-network
restart: unless-stopped
networks:
minecraft-network:
driver: bridge
```
## Configuring a Bit Further
Because of the change for more agnostic operation for the minecraft docker image used above, there is a few things you need to configure outside of docker compose doing so.
### Velocity
Inside `velocity/velocity.toml`, copy this:
```toml
# Config version. Do not change this
config-version = "2.7"
# What port should the proxy be bound to? By default, we'll bind to all addresses on port 25577.
bind = "0.0.0.0:25577"
# What should be the MOTD? This gets displayed when the player adds your server to
# their server list. Only MiniMessage format is accepted.
motd = "<#09add3>A Velocity Server"
# What should we display for the maximum number of players? (Velocity does not support a cap
# on the number of players online.)
show-max-players = 100
# Should we authenticate players with Mojang? By default, this is on.
online-mode = true
# Should the proxy enforce the new public key security standard? By default, this is on.
force-key-authentication = true
# If client's ISP/AS sent from this proxy is different from the one from Mojang's
# authentication server, the player is kicked. This disallows some VPN and proxy
# connections but is a weak form of protection.
prevent-client-proxy-connections = false
# Should we forward IP addresses and other data to backend servers?
# Available options:
# - "none": No forwarding will be done. All players will appear to be connecting
# from the proxy and will have offline-mode UUIDs.
# - "legacy": Forward player IPs and UUIDs in a BungeeCord-compatible format. Use this
# if you run servers using Minecraft 1.12 or lower.
# - "bungeeguard": Forward player IPs and UUIDs in a format supported by the BungeeGuard
# plugin. Use this if you run servers using Minecraft 1.12 or lower, and are
# unable to implement network level firewalling (on a shared host).
# - "modern": Forward player IPs and UUIDs as part of the login process using
# Velocity's native forwarding. Only applicable for Minecraft 1.13 or higher.
player-info-forwarding-mode = "modern"
# If you are using modern or BungeeGuard IP forwarding, configure a file that contains a unique secret here.
# The file is expected to be UTF-8 encoded and not empty.
forwarding-secret-file = "forwarding.secret"
# Announce whether or not your server supports Forge. If you run a modded server, we
# suggest turning this on.
announce-forge = false
# If enabled (default is false) and the proxy is in online mode, Velocity will kick
# any existing player who is online if a duplicate connection attempt is made.
kick-existing-players = false
# Should Velocity pass server list ping requests to a backend server?
# Available options:
# - "disabled": No pass-through will be done. The velocity configured MOTD, player count, and
# player sample will be used.
# - "mods": Passes only the mod list from your backend server into the response. The first
# server in your try list (or forced host) with a mod list will be used. If no
# backend servers can be contacted, Velocity won't display any mod information.
# - "description": Uses the description and mod list from the backend server. The first server in
# the try list (or forced host) will be used for the description and mod list.
# - "all": Uses the backend server's response as the proxy response. The Velocity
# configuration is used if no servers could be contacted.
ping-passthrough = "disabled"
# If not enabled (default is true) player IP addresses will be replaced by <ip address withheld> in logs
enable-player-address-logging = true
[servers]
# Configure your servers here. Each key represents the server's name, and the value
# represents the IP address of the server to connect to.
lobby = "lobby:25565"
a1 = "andrew:25565"
j1 = "josh:25565"
# In what order we should try servers when a player logs in or is kicked from a server.
try = ["lobby"]
[forced-hosts]
# Configure your forced hosts here.
# "lobby.example.com" = ["lobby"]
[advanced]
# How large a Minecraft packet has to be before we compress it. Setting this to zero will
# compress all packets, and setting it to -1 will disable compression entirely.
compression-threshold = 64
# How much compression should be done (from 0-9). The default is -1, which uses the
# default level of 6.
compression-level = -1
# How fast (in milliseconds) are clients allowed to connect after the last connection? By
# default, this is three seconds. Disable this by setting this to 0.
login-ratelimit = 3000
# Specify a custom timeout for connection timeouts here. The default is five seconds.
connection-timeout = 5000
# Specify a read timeout for connections here. The default is 30 seconds.
read-timeout = 30000
# Enables compatibility with HAProxy's PROXY protocol. If you don't know what this is for, then
# don't enable it.
haproxy-protocol = false
# Enables TCP fast open support on the proxy. Requires the proxy to run on Linux.
tcp-fast-open = false
# Enables BungeeCord plugin messaging channel support on Velocity.
bungee-plugin-message-channel = true
# Shows ping requests to the proxy from clients.
show-ping-requests = false
# By default, Velocity will attempt to gracefully handle situations where the user unexpectedly
# loses connection to the server without an explicit disconnect message by attempting to fall the
# user back, except in the case of read timeouts. BungeeCord will disconnect the user instead. You
# can disable this setting to use the BungeeCord behavior.
failover-on-unexpected-server-disconnect = true
# Declares the proxy commands to 1.13+ clients.
announce-proxy-commands = true
# Enables the logging of commands
log-command-executions = false
# Enables logging of player connections when connecting to the proxy, switching servers
# and disconnecting from the proxy.
log-player-connections = true
[query]
# Whether to enable responding to GameSpy 4 query responses or not.
enabled = false
# If query is enabled, on what port should the query protocol listen on?
port = 25577
# This is the map name that is reported to the query services.
map = "Velocity"
# Whether plugins should be shown in query response by default or not
show-plugins = false
```
### Proxy Info and Key Makin'
You need to make a key for velocity to sign connections:
```bash
openssl rand -base64 32 > velocity/forwarding.secret
```
then you need to copy:
```bash
cat velocity/forwarding.secret
```
Paper needs further definition for it to use Velocity properly. Since velocity uses key authentication across connections, you need to copy the following into `/theserver/config/paper-global.yml`:
```yaml
proxies:
velocity:
enabled: true
online-mode: true
secret: 'secret-goes-here-1337'
```
There might be some other stuff in that block regarding bungeecord, leave that as default (this is needed as velocity uses the same service I think, I need to look at this further).
## Plugins!!!!11!!!
I like to use [AdvancementAnnouncer](https://hangar.papermc.io/AltKat/AdvancementAnnouncer) as it is baller and very easy to use. All the commands can be found on that page as well.
## Resources
[https://www.reddit.com/r/admincraft/comments/11z52zm/best_proxy_bungeecord_velocity_etc/](https://www.reddit.com/r/admincraft/comments/11z52zm/best_proxy_bungeecord_velocity_etc/)
[https://docs.papermc.io/velocity/](https://docs.papermc.io/velocity/)
[https://docker-minecraft-server.readthedocs.io/en/latest/](https://docker-minecraft-server.readthedocs.io/en/latest/)
[https://github.com/itzg/docker-mc-backup](https://github.com/itzg/docker-mc-backup)
[https://prismlauncher.org/](https://prismlauncher.org/) USE PRISM LAUNCHER!
[https://modrinth.com/plugin/passwords?version=1.21.10&loader=paper](https://modrinth.com/plugin/passwords?version=1.21.10&loader=paper)