- Supported cloud provider โ
- TL;DR ๐
- Usage โ
- Access Token ๐
- Minecraft Server Versions ๐
- Minecraft Proxy Versions ๐
- Server Configs ๐
- EULA โ๏ธ๏ธ
minectl ๐บ
Configuration File Wizard ๐ง- Create Minecraft Server ๐
- Delete Minecraft Server ๐
- List Minecraft Server ๐
- Update Minecraft Server ๐
- Plugins Minecraft Server
โคด๏ธ - RCON Minecraft Server ๐
- Monitoring ๐
- Volumes ๐ฝ
- Headless Mode ๐ป
- Getting Started ๐ซ
- Known Limitation ๐ต
- Contributing ๐ค
- Roadmap ๐ฃ๏ธ
- Libraries & Tools ๐ฅ
- Legal Disclaimer ๐ฎ
minectl ๐บ
๏ธ๏ธ is a cli for creating Minecraft server on different cloud provider.
It is a private side project of me, to learn more about Go, CLI and multi-cloud environments.
- Civo (https://www.civo.com/)
- Scaleway (https://www.scaleway.com)
- DigitalOcean (https://www.digitalocean.com/)
- Hetzner (https://www.hetzner.com/)
- Linode (https://www.linode.com/)
- OVHCloud (https://www.ovh.com/)
- Equinix Metal (https://metal.equinix.com/)
- Google Compute Engine (GCE) (https://cloud.google.com/compute)
- Azure (https://azure.microsoft.com/en-us/)
- Oracle Cloud Infrastructure (https://www.oracle.com/cloud/)
- Ionos Cloud (https://cloud.ionos.de/)
Download the latest binary executable for your operating system.
curl -sLS https://get.minectl.dev | sudo sh
or without sudo
curl -sLS https://get.minectl.dev | sh
This will install the minectl ๐บ
to ~/.minctl/
and add it to your path. When it canโt automatically add minectl ๐บ
to your path, you will be prompted to add it manually.
- Use Homebrew
brew tap dirien/homebrew-dirien brew install minectl
-
Use Powershell
#Create directory New-Item -Path "$HOME/minectl/cli" -Type Directory # Download file Start-BitsTransfer -Source https://github.com/dirien/minectl/releases/download/v0.7.0/minectl_0.7.0_windows_amd64.zip -Destination "$HOME/minectl/cli/." # Uncompress zip file Expand-Archive $HOME/minectl/cli/*.zip -DestinationPath C:\Users\Developer\minectl\cli\. #Add to Windows `Environment Variables` [Environment]::SetEnvironmentVariable("Path",$($env:Path + ";$Home\minectl\cli"),'User')
You need to have go installed, and need to checkout the Git repository and run the following commands:
make build
This will output the minectl ๐บ
binary in the bin/minectl
folder.
GoFish works across all three major operating systems (Windows, MacOS, and Linux). It installs packages into its own directory and symlinks their files into /usr/local (or C:\ProgramData for Windows). You can think of it as the cross-platform Homebrew.
To install minectl ๐บ
just type
gofish install minectl
As minectl ๐บ
is already in the main rig of Gofish.
You can find a high level architectural overview here
minectl ๐บ
is completely build on zero-trust. It does not save any API Tokens, instead it looks them up in the ENV
variables.
export CIVO_TOKEN=xx
export DIGITALOCEAN_TOKEN=xxx
export ACCESS_KEY=xxx
export SECRET_KEY=yyy
export ORGANISATION_ID=zzz
export HCLOUD_TOKEN=yyyy
export LINODE_TOKEN=xxxx
You need to create API keys per endpoint. For an overview of available endpoint check supported-apis documentation
For, example, Europe visit https://eu.api.ovh.com/createToken to create your API keys for minectl ๐บ
For the proper rights
choose all HTTP Verbs (GET,PUT,DELETE, POST), and we need only the /cloud/
API.
export OVH_ENDPOINT=ovh-eu
export APPLICATION_KEY=xxx
export APPLICATION_SECRET=yyy
export CONSUMER_KEY=zzz
export SERVICENAME=<projectid>
export PACKET_AUTH_TOKEN=xxx
export EQUINIX_PROJECT=yyy
export GCE_KEY=<pathto>/key.json
See Getting Started - GCE edition for details on how to create a GCP service account for minectl ๐บ`
export VULTR_API_KEY=xxx
az login
az ad sp create-for-rbac --sdk-auth --role 'Contributor' > azure.auth
export AZURE_AUTH_LOCATION=azure.auth
To keep things simple for the moment, the authentication uses OCI config file. And there the default.
Example:
cat /Users/user/.oci/config
[DEFAULT]
user=<ocid>
fingerprint=<SSH fingerprint>
key_file=>path to PEM file>
tenancy=<ocid>
region=<region>
Please follow the instructions under -> https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm
export IONOS_USERNAME=xxx
export IONOS_PASSWORD=yyy
export IONOS_TOKEN=<optional>
โ ๏ธ minectl ๐บ
is not(!) providing any pre-compiled binaries of Minecraft or download a pre-compiled version.Every non-vanilla version will be compiled during the build phase of your server.
Following Minecraft versions is minectl ๐บ
supporting.
The Vanilla software is the original, untouched, unmodified Minecraft server software created and distributed directly by Mojang.
CraftBukkit is lightly modified version of the Vanilla software allowing it to be able to run Bukkit plugins.
Spigot is the most popular used Minecraft server software in the world. Spigot is a modified version of CraftBukkit with hundreds of improvements and optimizations that can only make CraftBukkit shrink in shame.
Paper (formerly known as PaperSpigot, distributed via the Paperclip patch utility) is a high performance fork* of Spigot.
Forge is well known for being able to use Forge Mods which are direct modifications to the Minecraft program code. In doing so, Forge Mods can change the gaming-feel drastically as a result of this.
Fabric is also an mod loader like Forge is with some improvements. Its lightweight and faster and it may is being the best mod loader in the future because its doing very good.
Source: [1]
Network proxy server is what you set up and use as the controller of a network of server - this is the server that connects all of your playable servers together so people can log in through one server IP, and then teleport between the separate servers ingame rather than having to log out and into each different one.
A server network typically consist of the following servers:
-
The proxy server itself running the desired software (BungeeCord being the most widely used and supported). This is the server that you would be advertising the IP of, as all players should be logging in through the proxy server at all times
-
The hub (or main) server. When users connect to the network proxy server's IP, it will re-route those users to this server.
-
All additional servers beyond the main server. Once you have at least one server running the proxy and one as the hub, any other servers will be considered extra servers that you can teleport to from the hub.
BungeeCord is a useful software written in-house by the team at SpigotMC. It acts as a proxy between the player's client and the connected Minecraft servers. End-users of BungeeCord see no difference between it and a normal Minecraft server.
Waterfall is a fork of BungeeCord, a proxy used primarily to teleport players between multiple Minecraft servers.
Waterfall focuses on three main areas:
- Stability
- Features
- Scalability
If you want to start a server with a Minecraft Proxy, you need to define a MinecraftProxy proxy.
apiVersion: ediri.io/minectl/v1alpha1
kind: MinecraftProxy
metadata:
name: minecraft-proxy
spec:
server:
cloud: <cloud provider name civo|scaleway|do|hetzner|linode|ovh|equinix|gce|vultr|azure|oci>
region: <cloud provider region>
size: <cloud provider plan>
ssh: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft"
port: <server port>
proxy:
java:
openjdk: <jdk version>
xmx: <xmx memory for the vm>
xms: <xms memory for the vm>
options:
- "-XX:+UseG1GC"
- "-XX:+ParallelRefProcEnabled"
- "-XX:MaxGCPauseMillis=200"
rcon:
password: <RCON server password>
port: <RCON server port >
enabled: <RCON enabled true|false>
broadcast: <RCON broadcase true|false
type: "bungeecord|waterfall"
version: <version>
You need a MinecraftServer manifest file, to describe the underlying compute instance and the Minecraft Server:
apiVersion: ediri.io/minectl/v1alpha1
kind: MinecraftServer
metadata:
name: minecraft-server
spec:
monitoring:
enabled: true|false
server:
cloud: "provider: civo|scaleway|do|hetzner|linode|ovh|equinix|gce|vultr|azure|oci"
region: "region see cloud provider for details eg. fra1"
size: "see cloud provider docs for details eg. g3.large"
volumeSize: 100
ssh: "<path to ssh public and private key>/ssh"
port: "25565|19132 are the defaults for tcp/udp"
minecraft:
java:
openjdk: "8|16 use jdk 8 for <1.17 java server version"
xmx: 2G
xms: 2G
options:
- "-XX:+UseG1GC"
- "-XX:+ParallelRefProcEnabled"
- "-XX:MaxGCPauseMillis=200"
rcon:
password: test
port: 25575
enabled: true
broadcast: true
edition: "java|bedrock|craftbukkit|fabric|forge|papermc|spigot"
version: "<version>"
eula: true
properties: |
level-seed=stackitminecraftrocks
broadcast-rcon-to-ops=true
...
I created some example configs in the config folder for currently supported cloud provider and Minecraft editions.
You need to set explicitly the EULA as new property in the MinecraftServer manifest to indicate your agreement with the Minecraft End User License. See -> https://minecraft.net/terms for the details.
Calls the minectl wizard to create interactively a minectl ๐บ config
Usage:
minectl wizard [flags]
Examples:
mincetl wizard
Flags:
-h, --help help for wizard
-o, --output string output folder for the configuration file for minectl ๐บ (default: /Users/dirien/.minectl)
Global Flags:
--headless Set this value to if mincetl is called by a CI system. Enables logging and disables human-readable output rendering (default: false)
--log-encoding string Set the log encoding: console|json (default: console) (default "console")
--verbose string Enable verbose logging: debug|info|warn|error|dpanic|panic|fatal
Watch the demo, for more details
minectl create -h
Create an Minecraft Server.
Usage:
minectl create [flags]
Examples:
mincetl create \
--filename server-do.yaml
Flags:
-f, --filename string Contains the configuration for minectl
-h, --help help for create
-w, --wait Wait for Minecraft Server is started (default true)
Global Flags:
--headless Set this value to if mincetl is called by a CI system. Enables logging and disables human-readable output rendering (default: false)
--log-encoding string Set the log encoding: console|json (default: console) (default "console")
--verbose string Enable verbose logging: debug|info|warn|error|dpanic|panic|fatal
minectl delete -h
Delete an Minecraft Server.
Usage:
minectl delete [flags]
Examples:
mincetl delete \
--filename server-do.yaml
--id xxx-xxx-xxx-xxx
Flags:
-f, --filename string that contains the configuration for minectl
-h, --help help for delete
--id string contains the server id
Global Flags:
--headless Set this value to if mincetl is called by a CI system. Enables logging and disables human-readable output rendering (default: false)
--log-encoding string Set the log encoding: console|json (default: console) (default "console")
--verbose string Enable verbose logging: debug|info|warn|error|dpanic|panic|fatal
minectl list -h
List all Minecraft Server.
Usage:
minectl list [flags]
Examples:
mincetl list \
--provider civo \
--region LON1
Flags:
-h, --help help for list
-p, --provider string The cloud provider - civo|scaleway|do|hetzner|linode|ovh|equinix|gce|vultr|azure|oci
-r, --region string The region for your cloud provider
Global Flags:
--headless Set this value to if mincetl is called by a CI system. Enables logging and disables human-readable output rendering (default: false)
--log-encoding string Set the log encoding: console|json (default: console) (default "console")
--verbose string Enable verbose logging: debug|info|warn|error|dpanic|panic|fatal
Update the Minecraft version. The function uses ssh
(port 22).
minectl update -h
Update an Minecraft Server.
Usage:
minectl update [flags]
Examples:
mincetl update \
--filename server-do.yaml
--id xxx-xxx-xxx-xxx
Flags:
-f, --filename string Contains the configuration for minectl
-h, --help help for update
--id string contains the server id
Global Flags:
--headless Set this value to if mincetl is called by a CI system. Enables logging and disables human-readable output rendering (default: false)
--log-encoding string Set the log encoding: console|json (default: console) (default "console")
--verbose string Enable verbose logging: debug|info|warn|error|dpanic|panic|fatal
Use this function, to connect to the RCON port of your Minecraft Server. RCON is a protocol that allows server administrators to remotely execute Minecraft commands.
minectl rcon -h
RCON client to your Minecraft server.
Usage:
minectl rcon [flags]
Examples:
mincetl rcon \
--filename server-do.yaml / \
--id xxxx
Flags:
-f, --filename string Contains the configuration for minectl
-h, --help help for rcon
--id string contains the server id
๐ง Plugins feature is still in beta.
Raw mode, to upload a local plugin file to your server. The function uses ssh
(port 22).
minectl plugins -h
Manage your plugins for a specific server
Usage:
minectl plugins [flags]
Examples:
mincetl plugins \
--filename server-do.yaml
--id xxx-xxx-xxx-xxx
--plugin plugin.jar
--destination /minecraft/mods
Flags:
-d, --destination string Plugin destination location
-f, --filename string Contains the configuration for minectl
-h, --help help for plugins
--id string contains the server id
-p, --plugin string Local plugin file location
Global Flags:
--headless Set this value to if mincetl is called by a CI system. Enables logging and disables human-readable output rendering (default: false)
--log-encoding string Set the log encoding: console|json (default: console) (default "console")
--verbose string Enable verbose logging: debug|info|warn|error|dpanic|panic|fatal
Monitoring is optional and disabled by default. It can be enabled with simply adding following fields to the MinecraftServer manifest:
...
apiVersion: ediri.io/minectl/v1alpha1
kind: MinecraftServer
metadata:
name: minecraft-server
spec:
monitoring:
enabled: true|false
server:
...
Every instance of minectl ๐บ
, has following monitoring components included:
- Prometheus (https://github.com/prometheus/prometheus)
- Node exporter (https://github.com/prometheus/node_exporter)
The edition:java
has on top following exporter included:
- Minecraft exporter (https://github.com/dirien/minecraft-prometheus-exporter)
You can acces the prometheus
via
http://<ip>:9090/graph
With the volumeSize
property, you can provision an extra volume during the creation phase of the server.
It is always recommended using the provided volume of the server, but in some cases (large mod packs, community server, etc.) it makes sense to provision a bigger volume separately.
When a separate volume is defined, minectl ๐บ
is automatically installing the Minecraft binaries on this volume.
apiVersion: ediri.io/minectl/v1alpha1
kind: MinecraftServer
metadata:
name: minecraft-server
spec:
server:
cloud: linode
region: eu-central
size: g6-standard-4
volumeSize: 100
ssh: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft"
port: 25565
minecraft:
...
With the global flag headless
, it is now possible to run minectl ๐บ
in a less human-readable output version. This is
very helpful, if you want to run minectl ๐บ
in workflow.
The flag verbose
sets the level of logging and with log-encoding
you can decide between json
and console
as
encoding format.
- Civo Java Edition
- Civo Bedrock Edition
- Scaleway Java Edition
- How to monitor your multi-cloud minectl ๐บ server?
- Running a modded LuckyBlocks Minecraft Server on budget ๐ฐ - Scaleway edition
- Running a PaperMC SkyBlock server - Hetzner edition
minectl ๐บ
is still under development. There will be the possibility for breaking changes.
Feel free to join.
Apache License, Version 2.0
- Support Bedrock edition #10
- Add monitoring capabilities to minectl server #21
- List Minecraft Server #11
- New Command - Update Minecraft Server #12
- New cloud provider - Hetzner #26
- New cloud provider - Linode #31
- New cloud provider - OVHCloud #43
- New Cloud Provider Equinix Metal #49
- New cloud provider - GCE #55
- Add modded versions as new edition #20
- New cloud provider - Vultr #90
- Add Suport for Proxy Server - bungeecord and waterfall #95
- New cloud provider - Azure #56
- New cloud provider - Oracle/OCI #107
- New cloud provider - Ionos Cloud #218
- ...
- https://github.com/fatih/color
- https://github.com/melbahja/goph
- https://github.com/spf13/cobra
- https://github.com/goreleaser
- https://github.com/civo/civogo
- https://github.com/digitalocean/godo
- https://github.com/scaleway/scaleway-sdk-go
- https://github.com/linode/linodego
- https://github.com/hetznercloud/hcloud-go
- https://github.com/olekukonko/tablewriter
- https://github.com/sethvargo/go-password
- https://github.com/ovh/go-ovh
- https://github.com/dirien/ovh-go-sdk
- https://github.com/packethost/packngo
- https://github.com/hashicorp/go-retryablehttp
- https://github.com/melbahja/goph
- https://github.com/googleapis/google-api-go-client
- https://github.com/Masterminds/sprig
- https://github.com/Tnze/go-mc
- https://github.com/c-bata/go-prompt
- https://github.com/vultr/govultr
- https://github.com/Azure/azure-sdk-for-go
- https://github.com/blang/semver
- https://github.com/tcnksm/go-latest
- https://github.com/uber-go/zap
- https://github.com/oracle/oci-go-sdk
- https://github.com/ionos-cloud/sdk-go
- https://github.com/AlecAivazis/survey
This project is not affiliated with Mojang Studios, XBox Game Studios, Double Eleven or the Minecraft brand.
"Minecraft" is a trademark of Mojang Synergies AB.
Other trademarks referenced herein are property of their respective owners.
Source: