mc-router

mc-router

Minecraft服务器智能路由工具 优化多服务器管理

mc-router是一款专为Minecraft服务器设计的智能路由工具。它可根据客户端请求的服务器地址,将连接自动分发到相应的后端服务器。支持Docker和Kubernetes环境,具有服务自动发现功能。通过简单配置即可实现多服务器管理,适用于各种规模的Minecraft服务器部署。mc-router简化了服务器管理流程,提高了资源利用效率,为玩家提供更流畅的游戏体验。

mc-routerMinecraftDockerKubernetes流量路由Github开源项目

GitHub issues Docker Pulls test GitHub release Discord 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) -auto-scale-up Increase Kubernetes StatefulSet Replicas (only) from 0 to 1 on respective backend servers when accessed (env AUTO_SCALE_UP) -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) -default string host:port of a default Minecraft server to use when mapping not found (env DEFAULT) -docker-socket Path to Docker socket to use (env DOCKER_SOCKET) (default "unix:///var/run/docker.sock") -docker-refresh-interval int Refresh interval in seconds for the Docker Swarm integration (env DOCKER_REFRESH_INTERVAL) (default 15) -docker-timeout int Timeout configuration in seconds for the Docker Swarm integration (env DOCKER_TIMEOUT) -in-docker Use Docker service discovery (env IN_DOCKER) -in-docker-swarm Use Docker Swarm service discovery (env IN_DOCKER_SWARM) -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) -mapping value Comma-separated or repeated 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) -ngrok-token string If set, an ngrok tunnel will be established. It is HIGHLY recommended to pass as an environment variable. (env NGROK_TOKEN) -port port The port bound to listen for Minecraft client connections (env PORT) (default 25565) -receive-proxy-protocol Receive PROXY protocol from backend servers, by default trusts every proxy header that it receives, combine with -trusted-proxies to specify a list of trusted proxies (env RECEIVE_PROXY_PROTOCOL) -routes-config string Name or full path to routes config file (env ROUTES_CONFIG) -simplify-srv Simplify fully qualified SRV records for mapping (env SIMPLIFY_SRV) -trusted-proxies value Comma delimited list of CIDR notation IP blocks to trust when receiving PROXY protocol (env TRUSTED_PROXIES) -use-proxy-protocol Send PROXY protocol to backend servers (env USE_PROXY_PROTOCOL) -version Output version and exit (env VERSION)

Docker Multi-Architecture Image

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

Docker Compose Usage

The diagram below shows how this 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.

version: "3.8" services: vanilla: image: itzg/minecraft-server environment: EULA: "TRUE" forge: image: itzg/minecraft-server environment: EULA: "TRUE" TYPE: FORGE router: image: ${MC_ROUTER_IMAGE:-itzg/mc-router} depends_on: - forge - vanilla environment: MAPPING: | vanilla.example.com=vanilla:25565 forge.example.com=forge:25565 ports: - "25565:25565"

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, add these two entries to my "hosts" file:

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

Using Docker auto-discovery

When running mc-router in a Docker environment you can pass the --in-docker or --in-docker-swarm command-line argument and it will poll the Docker API periodically to find all the running containers/services for Minecraft instances. To enable discovery you have to set the mc-router.host label on the container. These are the labels scanned:

  • mc-router.host: Used to configure the hostname the Minecraft clients would use to connect to the server. The container/service endpoint will be used as the routed backend. You can use more than one hostname by splitting it with a comma.
  • mc-router.port: This value must be set to the port the Minecraft server is listening on. The default value is 25565.
  • mc-router.default: Set this to a truthy value to make this server the default backend. Please note that mc-router.host is still required to be set.
  • mc-router.network: Specify the network you are using for the router if multiple are present in the container/service. You can either use the network ID, it's full name or an alias.

Example Docker deployment

Refer to this example docker-compose.yml to see how to configure two different Minecraft servers and a mc-router instance for use with Docker service discovery.

Example Docker Swarm deployment

Refer to this example docker-compose.yml to see how to configure two different Minecraft servers and a mc-router instance for use with Docker Swarm service discovery.

Routing Configuration

The routing configuration allows routing via a config file rather than a command. You need to set -routes-config or ROUTES_CONFIG env variable. The following shows a JSON file for routes config, where default-server can also be null or omitted:

{ "default-server": "vanilla:25565", "mappings": { "vanilla.example.com": "vanilla:25565", "forge.example.com": "forge:25565" } }

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. You can use more hostnames by splitting them with comma.
  • 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"

you can use multiple host names:

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

mc-router will pick the service port named either minecraft or mc-router. If neither port names exist, it will use port value 25565.

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(s)
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
Auto Scale Up

The -auto-scale-up flag argument makes the router "wake up" any stopped backend servers, by changing replicas: 0 to replicas: 1.

This requires using kind: StatefulSet instead of kind: Service for the Minecraft backend servers.

It also requires the ClusterRole to permit get + update for statefulsets & statefulsets/scale, e.g. like this (or some equivalent more fine-grained one to only watch/list services+statefulsets, and only get+update scale):

apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: services-watcher rules: - apiGroups: [""] resources: ["services"] verbs: ["watch","list"] - apiGroups: ["apps"] resources: ["statefulsets", "statefulsets/scale"] verbs: ["watch","list","get","update"]

Make sure to set StatefulSet.metadata.name and StatefulSet.spec.serviceName to the same value; otherwise, autoscaling will not trigger:

apiVersion: v1 kind: Service metadata: name: mc-forge spec: type: ClusterIP annotations: "mc-router.itzg.me/defaultServer": "true" "mc-router.itzg.me/externalServerName": "external.host.name" --- apiVersion: apps/v1 kind: StatefulSet metadata: name: mc-forge spec: serviceName: mc-forge

REST API

  • GET /routes (with Accept: application/json)

    Retrieves the currently configured routes

  • POST /routes (with Content-Type: application/json)

    Registers a route given a JSON body structured like:

    { "serverAddress": "CLIENT REQUESTED SERVER ADDRESS", "backend": "HOST:PORT" }
  • POST /defaultRoute (with Content-Type: application/json)

    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

ngrok

mc-router has built-in support to run as an ngrok agent. To enable this support, pass an ngrok authtoken to the command-line argument or environment variable, shown above.

Ngrok Quick Start

Create/access an ngrok account and allocate an agent authtoken from the dashboard.

In a new directory, create a file called .env with the allocated token

NGROK_TOKEN=...

In the same directory, create the following compose file:

version: "3.8" services: mc: image: itzg/minecraft-server environment: EULA: true volumes: - mc-data:/data # No port mapping since mc-router connects over compose network router: image: itzg/mc-router environment: DEFAULT: mc:25565 NGROK_TOKEN: ${NGROK_TOKEN} # No port mapping needed since it routes through ngrok tunnel volumes: mc-data: {}

Start the compose project:

docker compose up -d

Grab the mc-router logs using:

docker compose logs router

From those logs, locate the ngrokUrl parameter from the "Listening" info log message, such as tcp://8.tcp.ngrok.io:99999.

In the Minecraft client, the server address will be the part after the "tcp://" prefix, such as 8.tcp.ngrok.io:99999.

Development

Building locally with Docker

docker build -t mc-router .

Build locally without Docker

After installing Go and doing a go mod download to install all required prerequisites, just like the Dockerfile does, you can:

make test # go test -v ./... go build ./cmd/mc-router/

Skaffold

For "in-cluster development" it's convenient to use https://skaffold.dev. Any changes to Go source code will trigger a go build, new container image pushed to registry with a new tag, and refresh in Kubernetes with the image tag used in the deployment transparently updated to the new tag and thus new pod created pulling new images, as configured by skaffold.yaml:

skaffold dev

When using Google Cloud (GCP), first create a Docker Artifact Registry, then add the Artifact Registry Reader Role to the Compute Engine default service account of your GKE clusterService Account (to avoid error like "container mc-router is waiting to start: ...-docker.pkg.dev/... can't be pulled"), then use e.g. gcloud auth configure-docker europe-docker.pkg.dev or equivalent one time (to create a ~/.docker/config.json), and then use e.g. --default-repo=europe-docker.pkg.dev/YOUR-PROJECT/YOUR-ARTIFACT-REGISTRY option for skaffold dev.

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

Related Projects

编辑推荐精选

蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

下拉加载更多