|
| 1 | +--- |
| 2 | +name: minectl |
| 3 | +description: "Deploy and manage Minecraft servers across 16 cloud providers using the minectl CLI. Use when the user wants to create, delete, update, or list Minecraft servers, write minectl YAML manifests, connect via RCON, upload plugins, or choose cloud providers and server editions for Minecraft hosting. Triggers on: Minecraft server deployment, minectl commands, Minecraft manifest files, cloud-hosted game servers, or Minecraft edition selection." |
| 4 | +--- |
| 5 | + |
| 6 | +# minectl |
| 7 | + |
| 8 | +minectl creates and manages Minecraft servers on 16 cloud providers via declarative YAML manifests. |
| 9 | + |
| 10 | +## Creating a Manifest |
| 11 | + |
| 12 | +Every operation starts with a manifest file: |
| 13 | + |
| 14 | +```yaml |
| 15 | +apiVersion: minectl.ediri.io/v1alpha1 |
| 16 | +kind: MinecraftServer |
| 17 | +metadata: |
| 18 | + name: my-minecraft |
| 19 | +spec: |
| 20 | + server: |
| 21 | + cloud: hetzner |
| 22 | + region: fsn1 |
| 23 | + size: cx21 |
| 24 | + ssh: |
| 25 | + port: 22 |
| 26 | + publickeyfile: ~/.ssh/id_rsa.pub |
| 27 | + fail2ban: |
| 28 | + bantime: 1000 |
| 29 | + maxretry: 3 |
| 30 | + port: 25565 |
| 31 | + minecraft: |
| 32 | + java: |
| 33 | + openjdk: 21 |
| 34 | + xmx: 2G |
| 35 | + xms: 2G |
| 36 | + rcon: |
| 37 | + password: changeme |
| 38 | + port: 25575 |
| 39 | + enabled: true |
| 40 | + edition: papermc |
| 41 | + version: "1.21" |
| 42 | + eula: true |
| 43 | + properties: | |
| 44 | + max-players=20 |
| 45 | + difficulty=normal |
| 46 | + motd=My Minecraft Server |
| 47 | +``` |
| 48 | +
|
| 49 | +### Choosing an Edition |
| 50 | +
|
| 51 | +| Edition | Best for | |
| 52 | +|---------|----------| |
| 53 | +| `java` | Vanilla experience, no mods | |
| 54 | +| `papermc` | Performance + plugin support (recommended) | |
| 55 | +| `spigot` | Bukkit plugin ecosystem | |
| 56 | +| `craftbukkit` | Legacy Bukkit plugins | |
| 57 | +| `fabric` | Lightweight mods | |
| 58 | +| `forge` | Large mod packs | |
| 59 | +| `purpur` | Paper + extra gameplay tweaks | |
| 60 | +| `bedrock` | Cross-platform (mobile/console/PC) | |
| 61 | +| `nukkit` | Java-based Bedrock server | |
| 62 | +| `powernukkit` | Extended Nukkit | |
| 63 | + |
| 64 | +For proxy setups, use `kind: MinecraftProxy` with editions: `bungeecord`, `waterfall`, or `velocity`. |
| 65 | + |
| 66 | +### Optional Features |
| 67 | + |
| 68 | +Add to `spec.server`: |
| 69 | +- `spot: true` - Spot/preemptible instances (AWS, Azure, GCE) to save cost |
| 70 | +- `arm: true` - ARM instances (Hetzner, AWS, GCE) |
| 71 | +- `volumeSize: 50` - Extra storage in GB |
| 72 | + |
| 73 | +Add to `spec`: |
| 74 | +- `monitoring: { enabled: true }` - Prometheus + Node Exporter |
| 75 | + |
| 76 | +### Naming Rules |
| 77 | + |
| 78 | +- `metadata.name` must be lowercase alphanumeric with hyphens only |
| 79 | +- SSH port must be 22 or between 1024-65535 |
| 80 | +- `eula` must be `true` |
| 81 | + |
| 82 | +## Server Lifecycle |
| 83 | + |
| 84 | +```bash |
| 85 | +# Generate a manifest interactively |
| 86 | +minectl wizard |
| 87 | +
|
| 88 | +# Create a server (waits for startup by default) |
| 89 | +minectl create -f server.yaml |
| 90 | +
|
| 91 | +# Verify the server is running after creation |
| 92 | +minectl list -p hetzner -r fsn1 |
| 93 | +# Expected: server appears with a valid ID and status. If absent, check credentials and quota. |
| 94 | +
|
| 95 | +# List running servers |
| 96 | +minectl list -p hetzner -r fsn1 |
| 97 | +
|
| 98 | +# Connect via RCON for remote commands |
| 99 | +minectl rcon -f server.yaml --id <server-id> |
| 100 | +
|
| 101 | +# Upload a plugin |
| 102 | +minectl plugins -f server.yaml --id <server-id> -k ~/.ssh/id_rsa \ |
| 103 | + -p myplugin.jar -d /minecraft/plugins |
| 104 | +
|
| 105 | +# Update Minecraft version (edit version in manifest first) |
| 106 | +minectl update -f server.yaml --id <server-id> -k ~/.ssh/id_rsa |
| 107 | +
|
| 108 | +# Delete the server |
| 109 | +minectl delete -f server.yaml --id <server-id> -y |
| 110 | +``` |
| 111 | + |
| 112 | +### Error Recovery |
| 113 | + |
| 114 | +| Symptom | Likely cause | Action | |
| 115 | +|---------|--------------|--------| |
| 116 | +| `create` exits without a server ID | Authentication failure | Verify provider environment variables are exported (see [references/cloud-providers.md](references/cloud-providers.md)) | |
| 117 | +| `create` fails with quota/limit error | Cloud account quota exceeded | Switch region, use a smaller `size`, or request a quota increase from the provider | |
| 118 | +| `create` succeeds but server absent from `list` | Wrong region or provider flag | Re-run `minectl list` with the exact `-p` and `-r` values from the manifest | |
| 119 | +| Plugin upload fails | SSH key mismatch | Confirm `-k` points to the private key matching `spec.server.ssh.publickeyfile` | |
| 120 | +| RCON connection refused | RCON not enabled or wrong port | Ensure `rcon.enabled: true` and the port in the manifest matches `rcon.port` | |
| 121 | + |
| 122 | +## Cloud Provider Selection |
| 123 | + |
| 124 | +When helping a user choose a provider, consider: |
| 125 | +- **Budget**: Civo, Hetzner, and DigitalOcean are cheapest. Use `spot: true` on AWS/Azure/GCE for savings. |
| 126 | +- **Region needs**: Check [references/cloud-providers.md](references/cloud-providers.md) for available regions. |
| 127 | +- **Local testing**: Use `multipass` for local VMs with no cloud account needed. |
| 128 | + |
| 129 | +Each provider requires specific environment variables for authentication. See [references/cloud-providers.md](references/cloud-providers.md) for the full list. |
| 130 | + |
| 131 | +## References |
| 132 | + |
| 133 | +- **Cloud providers, credentials, and sizes**: [references/cloud-providers.md](references/cloud-providers.md) |
| 134 | +- **Full manifest schema**: [references/manifest-schema.md](references/manifest-schema.md) |
| 135 | +- **CLI command flags and details**: [references/cli-commands.md](references/cli-commands.md) |
0 commit comments