All Projects → itzg → Mc Router

itzg / Mc Router

Licence: mit
Routes Minecraft client connections to backend servers based upon the requested server address

Programming Languages

go
31211 projects - #10 most used programming language

Projects that are alternatives of or similar to Mc Router

Minestom
1.16.5 Lightweight and multi-threaded Minecraft server
Stars: ✭ 400 (+566.67%)
Mutual labels:  minecraft-server
Feather
A Minecraft server implementation in Rust
Stars: ✭ 896 (+1393.33%)
Mutual labels:  minecraft-server
Minecraft Server Status
Minecraft server status and -info script for PHP
Stars: ✭ 39 (-35%)
Mutual labels:  minecraft-server
Tuinity
Stars: ✭ 531 (+785%)
Mutual labels:  minecraft-server
Mcsmanager
轻量级,开箱即用,多实例和支持 Docker 的 Minecraft 服务端管理面板
Stars: ✭ 829 (+1281.67%)
Mutual labels:  minecraft-server
Coreprotect Lookup Web Interface
A flexible lookup web interface for CoreProtect 2
Stars: ✭ 29 (-51.67%)
Mutual labels:  minecraft-server
Paper
High performance Spigot fork that aims to fix gameplay and mechanics inconsistencies
Stars: ✭ 5,293 (+8721.67%)
Mutual labels:  minecraft-server
Infrared
An ultra lightweight minecraft reverse proxy and idle placeholder
Stars: ✭ 59 (-1.67%)
Mutual labels:  minecraft-server
Nodemc
Meta repository for information on the project as a whole
Stars: ✭ 16 (-73.33%)
Mutual labels:  minecraft-server
Shopchest
ShopChest - Spigot/Bukkit Plugin
Stars: ✭ 38 (-36.67%)
Mutual labels:  minecraft-server
Minecase
Minecraft server based on Orleans
Stars: ✭ 581 (+868.33%)
Mutual labels:  minecraft-server
Nukkit
Cloudburst Nukkit - Nuclear-Powered Minecraft: Bedrock Edition Server Software
Stars: ✭ 776 (+1193.33%)
Mutual labels:  minecraft-server
Essentials
The essential plugin suite for Minecraft servers.
Stars: ✭ 957 (+1495%)
Mutual labels:  minecraft-server
Mohist
Minecraft Forge Hybrid server implementing the Paper/Spigot/Bukkit API, formerly known as Thermos/Cauldron/MCPC+
Stars: ✭ 489 (+715%)
Mutual labels:  minecraft-server
Docker Bungeecord
A BungeeCord server to use in conjunction with itzg/minecraft-server
Stars: ✭ 52 (-13.33%)
Mutual labels:  minecraft-server
Gdlauncher
GDLauncher is a simple, yet powerful Minecraft custom launcher with a strong focus on the user experience
Stars: ✭ 386 (+543.33%)
Mutual labels:  minecraft-server
Drivebackupv2
Uploads Minecraft backups to Google Drive/OneDrive or by (S)FTP
Stars: ✭ 26 (-56.67%)
Mutual labels:  minecraft-server
Spongeforge
A Forge mod that implements SpongeAPI
Stars: ✭ 1,106 (+1743.33%)
Mutual labels:  minecraft-server
Seichiassist
ギガンティック☆整地鯖の独自要素を司るプラグイン / A Minecraft(Spigot) Plugin used for Gigantic Seichi Server. Address -> play.seichi.click
Stars: ✭ 56 (-6.67%)
Mutual labels:  minecraft-server
K8s Minecraft
Running a Minecraft server in Kubernetes
Stars: ✭ 37 (-38.33%)
Mutual labels:  minecraft-server

GitHub issues Docker Pulls GitHub release CircleCI Buy me a coffee

Routes Minecraft client connections to backend servers based upon the requested server address.

Usage

  -api-binding host:port
    	The host:port bound for servicing API requests (env API_BINDING)
  -connection-rate-limit int
    	Max number of connections to allow per second (env CONNECTION_RATE_LIMIT) (default 1)
  -cpu-profile string
    	Enables CPU profiling and writes to given path (env CPU_PROFILE)
  -debug
    	Enable debug logs (env DEBUG)
  -in-kube-cluster
    	Use in-cluster kubernetes config (env IN_KUBE_CLUSTER)
  -kube-config string
    	The path to a kubernetes configuration file (env KUBE_CONFIG)
  -kube-discovery
    	Enables discovery of annotated kubernetes services (env KUBE_DISCOVERY)
  -mapping string
    	Comma-separated mappings of externalHostname=host:port (env MAPPING)
  -metrics-backend string
    	Backend to use for metrics exposure/publishing: discard,expvar,influxdb (env METRICS_BACKEND) (default "discard")
  -metrics-backend-config-influxdb-addr string
    	 (env METRICS_BACKEND_CONFIG_INFLUXDB_ADDR)
  -metrics-backend-config-influxdb-database string
    	 (env METRICS_BACKEND_CONFIG_INFLUXDB_DATABASE)
  -metrics-backend-config-influxdb-interval duration
    	 (env METRICS_BACKEND_CONFIG_INFLUXDB_INTERVAL) (default 1m0s)
  -metrics-backend-config-influxdb-password string
    	 (env METRICS_BACKEND_CONFIG_INFLUXDB_PASSWORD)
  -metrics-backend-config-influxdb-retention-policy string
    	 (env METRICS_BACKEND_CONFIG_INFLUXDB_RETENTION_POLICY)
  -metrics-backend-config-influxdb-tags value
    	any extra tags to be included with all reported metrics (env METRICS_BACKEND_CONFIG_INFLUXDB_TAGS)
  -metrics-backend-config-influxdb-username string
    	 (env METRICS_BACKEND_CONFIG_INFLUXDB_USERNAME)
  -port port
    	The port bound to listen for Minecraft client connections (env PORT) (default 25565)
  -version
    	Output version and exit (env VERSION)

REST API

  • GET /routes Retrieves the currently configured routes
  • POST /routes Registers a route given a JSON body structured like:
{
  "serverAddress": "CLIENT REQUESTED SERVER ADDRESS",
  "backend": "HOST:PORT"
}
  • POST /defaultRoute Registers a default route to the given backend. JSON body is structured as:
{
  "backend": "HOST:PORT"
}
  • DELETE /routes/{serverAddress} Deletes an existing route for the given serverAddress

Docker Multi-Architecture Image

The multi-architecture image published at Docker Hub supports amd64, arm64, and arm32v6 (i.e. RaspberryPi).

Docker Compose Usage

The following diagram shows how the example docker-compose.yml configures two Minecraft server services named vanilla and forge, which also become the internal network aliases. Notice those services don't need their ports exposed since the internal networking allows for the inter-container access.

The router service is only one of the services that needs to exposed on the external network. The --mapping declares how the hostname users will enter into their Minecraft client will map to the internal services.

To test out this example, I added these two entries to my "hosts" file:

127.0.0.1 vanilla.example.com
127.0.0.1 forge.example.com

Kubernetes Usage

Using kubernetes service auto-discovery

When running mc-router as a kubernetes pod and you pass the --in-kube-cluster command-line argument, then it will automatically watch for any services annotated with

  • mc-router.itzg.me/externalServerName : The value of the annotation will be registered as the external hostname Minecraft clients would used to connect to the routed service. The service's clusterIP and target port are used as the routed backend.
  • mc-router.itzg.me/defaultServer : The service's clusterIP and target port are used as the default if no other externalServiceName annotations applies.

For example, start mc-router's container spec with

image: itzg/mc-router
name: mc-router
args: ["--in-kube-cluster"]

and configure the backend minecraft server's service with the annotation:

apiVersion: v1
kind: Service
metadata:
  name: mc-forge
  annotations:
    "mc-router.itzg.me/externalServerName": "external.host.name"

Example kubernetes deployment

This example deployment

  • Declares an mc-router service that exposes a node port 25565
  • Declares a service account with access to watch and list services
  • Declares --in-kube-cluster in the mc-router container arguments
  • Two "backend" Minecraft servers are declared each with an "mc-router.itzg.me/externalServerName" annotation that declares their external server name
kubectl apply -f https://raw.githubusercontent.com/itzg/mc-router/master/docs/k8s-example-auto.yaml

Notes

  • This deployment assumes two persistent volume claims: mc-stable and mc-snapshot
  • I extended the allowed node port range by adding --service-node-port-range=25000-32767 to /etc/kubernetes/manifests/kube-apiserver.yaml

Development

Building locally with Docker

docker run -it --rm \
  -v gopkg:/go/pkg \
  -v ${PWD}:/build -w /build \
  golang:1.12 \
  go build ./cmd/mc-router

Performing snapshot release with Docker

docker run -it --rm \
  -v ${PWD}:/build -w /build \
  -v /var/run/docker.sock:/var/run/docker.sock \
  goreleaser/goreleaser \
  release --snapshot --rm-dist
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].