An ultra lightweight Minecraft reverse proxy and idle placeholder: Ever wanted to have only one exposed port on your server for multiple Minecraft servers? Then Infrared is the tool you need! Infrared works as a reverse proxy using a subdomain to connect clients to a specific Minecraft server. It works similar to Nginx for those of you who are familiar.
- Reverse Proxy
- Display Placeholder Server
- Autostart Server when pinged
- Logger Callback URLs
- HAProxy Protocol Support
- TCPShield/RealIP Protocol Support
- Prometheus Support
- REST API
$ docker build --no-cache -t haveachin/infrared:latest https://github.com/haveachin/infrared.git &&
docker image prune -f --filter label=stage=intermediate &&
docker run -d --name infrared --restart=unless-stopped -it -v /usr/local/infrared/configs/:/configs -p 25565:25565/tcp --expose 25565 haveachin/infrared:latest
$ docker build --no-cache -t haveachin/infrared:latest https://github.com/haveachin/infrared.git &&
docker image prune -f --filter label=stage=intermediate &&
docker stop infrared &&
docker rm infrared &&
docker run -d --name infrared --restart=unless-stopped -it -v /usr/local/infrared/configs/:/configs -p 25565:25565/tcp --expose 25565 haveachin/infrared:latest
Info: Command-line flags override environment variables.
INFRARED_CONFIG_PATH
is the path to all your server configs [default: "./configs/"
]
INFRARED_RECEIVE_PROXY_PROTOCOL
if Infrared should be able to receive proxy protocol [default: "false"
]
-config-path
specifies the path to all your server configs [default: "./configs/"
]
-receive-proxy-protocol
if Infrared should be able to receive proxy protocol [default: false
]
-enable-prometheus
enables the Prometheus stats exporter [default: false
]
-prometheus-bind
specifies what the Prometheus HTTP server should bind to [default: :9100
]
./infrared -config-path="." -receive-proxy-protocol=true -enable-prometheus -prometheus-bind="localhost:9123"
Field Name | Type | Required | Default | Description |
---|---|---|---|---|
domainName | String | true | localhost | Should be fully qualified domain name. Note: Every string is accepted. So localhost is also valid. |
listenTo | String | true | :25565 | The address (usually just the port; so short term :port ) that the proxy should listen to for incoming connections.Accepts basically every address format you throw at it. Valid examples: :25565 , localhost:25565 , 0.0.0.0:25565 , 127.0.0.1:25565 , example.de:25565 |
proxyTo | String | true | The address that the proxy should send incoming connections to. Accepts Same formats as the listenTo field. |
|
proxyBind | String | false | The local IP that is being used to dail to the server on proxyTo . (Same as Nginx proxy-bind ) |
|
disconnectMessage | String | false | Sorry {{username}}, but the server is offline. | The message a client sees when he gets disconnected from Infrared due to the server on proxyTo won't respond. Currently available placeholders:- username the username of player that tries to connect- now the current server time- remoteAddress the address of the client that tries to connect- localAddress the local address of the server- domain the domain of the proxy (same as domainName )- proxyTo the address that the proxy proxies to (same as proxyTo )- listenTo the address that Infrared listens on (same as listenTo ) |
timeout | Integer | true | 1000 | The time in milliseconds for the proxy to wait for a ping response before the host (the address you proxyTo) will be declared as offline. This "online check" will be resend for every new connection. |
proxyProtocol | Boolean | false | false | If Infrared should use HAProxy's Proxy Protocol for IP forwarding. Warning: You should only ever set this to true if you now that the server you proxyTo is compatible. |
realIp | Boolean | false | false | If Infrared should use TCPShield/RealIP Protocol for IP forwarding. Warning: You should only ever set this to true if you now that the server you proxyTo is compatible. |
docker | Object | false | See Docker | Optional Docker configuration to automatically start a container and stop it again if unused. Note: Infrared will not take direct connections into account. Be sure to route all traffic that connects to the container through Infrared. |
onlineStatus | Object | false | This is the response that Infrared will give when a client asks for the server status and the server is online. | |
offlineStatus | Object | false | See Response Status | This is the response that Infrared will give when a client asks for the server status and the server is offline. |
callbackServer | Object | false | See Callback Server | Optional callback server configuration to send events as a POST request to a specified URL. |
Field Name | Type | Required | Default | Description |
---|---|---|---|---|
dnsServer | String | false | 127.0.0.11 | The address of the DNS that resolves the container names. |
containerName | String | true | The name of the container that should be automatically started/stopped. | |
portainer | Object | false | Optional Portainer configuration for authorization management. |
More info on Portainer.
Field Name | Type | Required | Default | Description |
---|---|---|---|---|
address | String | true | URL of the Portainer instance. | |
endpointId | String | true | The ID typically an integer of the docker endpoint in the portainer instance. | |
username | String | true | Username for the Portainer user. | |
password | String | true | Password for the Portainer user. |
Field Name | Type | Required | Default | Description |
---|---|---|---|---|
versionName | String | false | Infrared 1.17 | The version name of the Minecraft Server. |
protocolNumber | Integer | true | 755 | The protocol version number. |
maxPlayers | Integer | false | 20 | The maximum number of players that can join the server. Note: Infrared will not limit more players from joining. This number is just for display. |
playersOnline | Integer | false | 0 | The number of online players. Note: Infrared will not that this number is also just for display. |
playerSamples | Array | false | An array of player samples. See [Player Sample](#Player Sample). | |
iconPath | String | false | The path to the server icon. | |
motd | String | false | The motto of the day, short MOTD. |
Field Name | Type | Required | Default | Description |
---|---|---|---|---|
Name | String | true | Username of the player. | |
uuid | String | false | UUID of the player. |
Field Name | Type | Required | Default | Description |
---|---|---|---|---|
url | String | true | URL of the callback server URL. | |
events | Array | true | A string array of event names. Currently available event names are: - Error will send error logs- PlayerJoin will send player joins- PlayerLeave will send player leaves- ContainerStart will send container starts- ContainerStop will send container stops |
min.example.com
{
"domainNames": ["mc.example.com", "example.com"],
"proxyTo": ":8080"
}
full.example.com
{
"domainNames": ["mc.example.com", "example.com"],
"listenTo": ":25565",
"proxyTo": ":8080",
"proxyBind": "0.0.0.0",
"proxyProtocol": false,
"realIp": false,
"timeout": 1000,
"disconnectMessage": "Username: {{username}}\nNow: {{now}}\nRemoteAddress: {{remoteAddress}}\nLocalAddress: {{localAddress}}\nDomain: {{domain}}\nProxyTo: {{proxyTo}}\nListenTo: {{listenTo}}",
"docker": {
"dnsServer": "127.0.0.11",
"containerName": "mc",
"timeout": 30000,
"portainer": {
"address": "localhost:9000",
"endpointId": "1",
"username": "admin",
"password": "foobar"
}
},
"onlineStatus": {
"versionName": "1.17",
"protocolNumber": 755,
"maxPlayers": 20,
"playersOnline": 2,
"playerSamples": [
{
"name": "Steve",
"uuid": "8667ba71-b85a-4004-af54-457a9734eed7"
},
{
"name": "Alex",
"uuid": "ec561538-f3fd-461d-aff5-086b22154bce"
}
],
"motd": "Join us!"
},
"offlineStatus": {
"versionName": "1.17",
"protocolNumber": 755,
"maxPlayers": 20,
"playersOnline": 0,
"motd": "Server is currently offline"
},
"callbackServer": {
"url": "https://mc.example.com/callback",
"events": [
"Error",
"PlayerJoin",
"PlayerLeave",
"ContainerStart",
"ContainerStop"
]
}
}
The built-in prometheus exporter can be used to view metrics about infrareds operation.
When the command line flag -enable-prometheus
is enabled it will bind to :9100
by default, if you would like to use another port or use an application like node_exporter that also uses port 9100 on the same machine you can change the port with the -prometheus-bind
command line flag, example: -prometheus-bind=":9070"
.
It is recommended to firewall the prometheus exporter with an application like ufw or iptables to make it only accessible by your own Prometheus instance.
Example prometheus.yml configuration:
scrape_configs:
- job_name: infrared
static_configs:
- targets: ['infrared-exporter-hostname:port']
- infrared_connected: show the amount of connected players per instance and proxy:
- Example response:
infrared_connected{host="proxy.example.com",instance="vps1.example.com:9070",job="infrared"} 10
- host: listenTo domain as specified in the infrared configuration.
- instance: what infrared instance the amount of players are connected to.
- job: what job was specified in the prometheus configuration.
- Example response:
- infrared_handshakes: counter of the number of handshake packets received per instande, type and target:
- Example response:
infrared_handshakes{instance="vps1.example.com:9070",type="status",host="proxy.example.com"} 5
- instance: what infrared instance handshakes were received on.
- type: the type of handshake received; "status" or "login".
- host: the target host specified by the "Server Address" field in the handshake packet. [1]
- Example response: