Full Code of dirien/minectl for AI

main 9fcd00bc85ce cached
163 files
553.7 KB
231.3k tokens
132 symbols
1 requests
Download .txt
Showing preview only (596K chars total). Download the full file or copy to clipboard to get everything.
Repository: dirien/minectl
Branch: main
Commit: 9fcd00bc85ce
Files: 163
Total size: 553.7 KB

Directory structure:
gitextract_l55wna43/

├── .dockerignore
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.yaml
│   │   ├── config.yml
│   │   └── feature.yaml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yaml
│   └── workflows/
│       ├── ci.yaml
│       ├── lock.yml
│       └── ossf-scorecard-action.yaml
├── .gitignore
├── .golangci.yaml
├── .goreleaser.yaml
├── .pre-commit-config.yaml
├── AGENTS.md
├── CONTRIBUTING.md
├── DCO
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── artifacthub-repo.yml
├── cmd/
│   └── minectl/
│       ├── AGENTS.md
│       ├── create.go
│       ├── delete.go
│       ├── list.go
│       ├── minectl.go
│       ├── plugins.go
│       ├── rcon.go
│       ├── update.go
│       └── wizard.go
├── config/
│   ├── bedrock/
│   │   ├── server-akamai.yaml
│   │   ├── server-aws.yaml
│   │   ├── server-civo.yaml
│   │   ├── server-do.yaml
│   │   ├── server-exoscale.yaml
│   │   ├── server-gce.yaml
│   │   ├── server-hetzner.yaml
│   │   ├── server-oci.yaml
│   │   ├── server-ovh.yaml
│   │   ├── server-scaleway.yaml
│   │   └── server-vexxhost.yaml
│   ├── bungeecord/
│   │   ├── proxy-civo.yaml
│   │   ├── proxy-do.yaml
│   │   └── proxy-vultr.yaml
│   ├── craftbukkit/
│   │   ├── server-akamai.yaml
│   │   └── server-do.yaml
│   ├── fabric/
│   │   ├── server-akamai.yaml
│   │   ├── server-civo.yaml
│   │   └── server-do.yaml
│   ├── forge/
│   │   ├── server-akamai.yaml
│   │   ├── server-civo.yaml
│   │   └── server-do.yaml
│   ├── java/
│   │   ├── server-akamai.yaml
│   │   ├── server-aws-arm.yaml
│   │   ├── server-aws-spot.yaml
│   │   ├── server-aws.yaml
│   │   ├── server-azure-spot.yaml
│   │   ├── server-azure.yaml
│   │   ├── server-civo.yaml
│   │   ├── server-do.yaml
│   │   ├── server-exoscale.yaml
│   │   ├── server-fuga.yaml
│   │   ├── server-gce-arm.yaml
│   │   ├── server-gce-spot.yaml
│   │   ├── server-gce.yaml
│   │   ├── server-hetzner-arm.yaml
│   │   ├── server-hetzner.yaml
│   │   ├── server-oci.yaml
│   │   ├── server-ovh.yaml
│   │   ├── server-scaleway.yaml
│   │   ├── server-vexxhost.yaml
│   │   └── server-vultr.yaml
│   ├── multipass/
│   │   ├── server-java.yaml
│   │   └── server-papermc.yaml
│   ├── nukkit/
│   │   ├── server-azure.yaml
│   │   ├── server-civo.yaml
│   │   ├── server-do.yaml
│   │   ├── server-fuga.yaml
│   │   ├── server-gce.yaml
│   │   └── server-ovh.yaml
│   ├── papermc/
│   │   ├── server-akamai.yaml
│   │   ├── server-aws-arm.yaml
│   │   ├── server-aws.yaml
│   │   ├── server-azure-arm.yaml
│   │   ├── server-azure.yaml
│   │   ├── server-civo.yaml
│   │   ├── server-do.yaml
│   │   ├── server-exoscale.yaml
│   │   ├── server-fuga.yaml
│   │   ├── server-gce-arm.yaml
│   │   ├── server-hetzner.yaml
│   │   ├── server-oci-arm.yaml
│   │   ├── server-oci.yaml
│   │   ├── server-scaleway.yaml
│   │   ├── server-vexxhost.yaml
│   │   └── server-vultr.yaml
│   ├── powernukkit/
│   │   ├── server-azure.yaml
│   │   └── server-civo.yaml
│   ├── purpur/
│   │   ├── server-akamai.yaml
│   │   ├── server-aws-arm.yaml
│   │   ├── server-aws.yaml
│   │   ├── server-azure-arm.yaml
│   │   ├── server-azure.yaml
│   │   ├── server-civo.yaml
│   │   ├── server-do.yaml
│   │   ├── server-exoscale.yaml
│   │   ├── server-fuga.yaml
│   │   ├── server-gce-arm.yaml
│   │   ├── server-hetzner.yaml
│   │   ├── server-oci-arm.yaml
│   │   ├── server-oci.yaml
│   │   ├── server-scaleway.yaml
│   │   ├── server-vexxhost.yaml
│   │   └── server-vultr.yaml
│   ├── spigot/
│   │   ├── server-akamai.yaml
│   │   ├── server-azure.yaml
│   │   └── server-do.yaml
│   ├── velocity/
│   │   ├── proxy-do.yaml
│   │   └── proxy-gce.yaml
│   └── waterfall/
│       ├── proxy-azure.yaml
│       ├── proxy-do.yaml
│       └── proxy-vultr.yaml
├── development.md
├── docs/
│   ├── architecture.md
│   ├── authentication.md
│   ├── cli-reference.md
│   ├── colored-motd.md
│   ├── configuration.md
│   ├── dashboard/
│   │   └── tutorial.json
│   ├── editions.md
│   ├── features.md
│   ├── getting-started-civo-bedrock.md
│   ├── getting-started-civo.md
│   ├── getting-started-exoscale.md
│   ├── getting-started-gce.md
│   ├── getting-started-scaleway.md
│   ├── minectl.drawio
│   ├── multi-server-monitoring-civo.md
│   ├── running-minecraft-luckyblocks-budget-scaleway.md
│   └── skyblock-papermc-hetzner.md
├── go.mod
├── go.sum
├── internal/
│   ├── logging/
│   │   └── logging.go
│   ├── manifest/
│   │   ├── manifest.go
│   │   ├── proxy.json
│   │   └── server.json
│   ├── provisioner/
│   │   └── provisioner.go
│   ├── rcon/
│   │   └── rcon.go
│   └── ui/
│       ├── form.go
│       ├── spinner.go
│       ├── spinner_test.go
│       ├── table.go
│       ├── table_test.go
│       ├── ui.go
│       └── ui_test.go
├── main.go
└── minectl-skill/
    ├── SKILL.md
    ├── evals/
    │   └── evals.json
    └── references/
        ├── cli-commands.md
        ├── cloud-providers.md
        └── manifest-schema.md

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

**/ssh
**/plugins
**/docs
**/config
**/*.md
DCO
.pre-commit-config.yaml
.goreleaser.yml
.gitignore
LICENSE
Makefile
renovate.json
minectl

# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf

# Generated files
.idea/**/contentModel.xml

# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml

# Gradle
.idea/**/gradle.xml
.idea/**/libraries

# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn.  Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr

# CMake
cmake-build-*/

# Mongo Explorer plugin
.idea/**/mongoSettings.xml

# File-based project format
*.iws

# IntelliJ
out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Cursive Clojure plugin
.idea/replstate.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties

# Editor-based Rest Client
.idea/httpRequests

# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser

### Go template
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib

# Test binary, built with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Dependency directories (remove the comment below to include it)
# vendor/



================================================
FILE: .github/CODEOWNERS
================================================
*       @dirien

================================================
FILE: .github/ISSUE_TEMPLATE/bug.yaml
================================================
name: Bug Report
description: File a bug report
labels: [ bug, triage ]
assignees:
  - dirien
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to fill out this bug report! Please fill the form below.
  - type: textarea
    id: what-happened
    attributes:
      label: What happened?
      description: Also tell us, what did you expect to happen?
    validations:
      required: true
  - type: textarea
    id: reproducible
    attributes:
      label: How can we reproduce this?
      description: Please share as much information as possible. Logs, screenshots, etc.
    validations:
      required: true
  - type: textarea
    id: minectl-version
    attributes:
      label: minectl version
      description: '`minectl version` output'
      render: bash
    validations:
      required: true
  - type: checkboxes
    id: search
    attributes:
      label: Search
      options:
        - label: I did search for other open and closed issues before opening this.
          required: true
  - type: checkboxes
    id: terms
    attributes:
      label: Code of Conduct
      description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/dirien/.github/blob/main/CODE_OF_CONDUCT.md)
      options:
        - label: I agree to follow this project's Code of Conduct
          required: true
  - type: textarea
    id: ctx
    attributes:
      label: Additional context
      description: Anything else you would like to add
    validations:
      required: false


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false



================================================
FILE: .github/ISSUE_TEMPLATE/feature.yaml
================================================
name: Feature Request
description: Request a new feature and/or enhancement to an existing feature
labels: [enhancement, triage]
assignees:
  - dirien
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to fill out this feature request! Please fill the form below.
  - type: textarea
    id: is-it-a-problem
    attributes:
      label: Is your feature request related to a problem? Please describe.
      description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
    validations:
      required: true
  - type: textarea
    id: solution
    attributes:
      label: Describe the solution you'd like
      description: A clear and concise description of what you want to happen.
    validations:
      required: true
  - type: textarea
    id: alternatives
    attributes:
      label: Describe alternatives you've considered
      description: A clear and concise description of any alternative solutions or features you've considered.
    validations:
      required: true
  - type: checkboxes
    id: search
    attributes:
      label: Search
      options:
        - label: I did search for other open and closed issues before opening this.
          required: true
  - type: checkboxes
    id: terms
    attributes:
      label: Code of Conduct
      description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/dirien/.github/blob/main/CODE_OF_CONDUCT.md)
      options:
        - label: I agree to follow this project's Code of Conduct
          required: true
  - type: textarea
    id: ctx
    attributes:
      label: Additional context
      description: Anything else you would like to add
    validations:
      required: false


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
### Thank you for making `minectl 🗺` better

Please reference the issue this PR is fixing.

*Also verify you have:*

* [ ] Read the [contributions](../CONTRIBUTING.md) page.
* [ ] Read the [DCO](../DCO), if you are a first time contributor.
* [ ] Read the [code of conduct](https://github.com/dirien/.github/blob/main/CODE_OF_CONDUCT.md).


================================================
FILE: .github/dependabot.yaml
================================================
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
    labels:
      - "dependencies"
    commit-message:
      prefix: "chore(deps)"

  - package-ecosystem: "gomod"
    directory: "/"
    schedule:
      interval: "weekly"
    labels:
      - "dependencies"
    commit-message:
      prefix: "chore(deps)"


================================================
FILE: .github/workflows/ci.yaml
================================================
name: build-binary

on:
  push:
    branches:
      - '*'
    tags:
      - '*'
  pull_request:

permissions: read-all

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0
      - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-
      - name: Set up Go
        uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          go-version: 1.24.x
          cache: false
      - name: Tests
        run: |
          make test coverage
  release:
    permissions:
      contents: write
      id-token: write
      packages: write
    needs: build
    env:
      DOCKER_CLI_EXPERIMENTAL: "enabled"
      GITHUB_TOKEN: ${{ github.token }}
      HOMEBREW_TAP_GITHUB_TOKEN: ${{ secrets.GH_PAT }}
    runs-on: ubuntu-latest
    if: success() && startsWith(github.ref, 'refs/tags/')
    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0
      - name: Set up QEMU
        uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
      - name: Docker Login
        uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ github.token }}
      - name: Set up Go
        uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          go-version: 1.24.x
          cache: false
      - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-
      - uses: sigstore/cosign-installer@ba7bc0a3fef59531c69a25acd34668d6d3fe6f22 # v4.1.0
      - uses: anchore/sbom-action/download-syft@e22c389904149dbc22b58101806040fa8d37a610 # v0.24.0
      - name: Run GoReleaser
        uses: goreleaser/goreleaser-action@ec59f474b9834571250b370d4735c50f8e2d1e29 # v7.0.0
        with:
          version: latest
          args: release --clean


================================================
FILE: .github/workflows/lock.yml
================================================
name: lock-inactive

on:
  schedule:
    - cron: '0 * * * *'

permissions:
  contents: read

jobs:
  lock:
    permissions:
      issues: write
      pull-requests: write
    runs-on: ubuntu-latest
    steps:
      - uses: dessant/lock-threads@7266a7ce5c1df01b1c6db85bf8cd86c737dadbe7 # v6.0.0
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          issue-inactive-days: 30
          pr-inactive-days: 30
          issue-comment: >
            This issue has been automatically locked since there
            has not been any recent activity after it was closed.
            Please open a new issue for related bugs.
          pr-comment: >
            This pull request has been automatically locked since there
            has not been any recent activity after it was closed.
            Please open a new issue for related bugs.


================================================
FILE: .github/workflows/ossf-scorecard-action.yaml
================================================
name: scorecards-supply-chain-security
on:
  # Only the default branch is supported.
  branch_protection_rule:
  schedule:
    # Weekly on Saturdays.
    - cron: '30 1 * * 6'
  push:
    branches: [ main, master ]

# Declare default permissions as read only.
permissions: read-all

jobs:
  analysis:
    name: Scorecards analysis
    runs-on: ubuntu-latest
    permissions:
      # Needed to upload the results to code-scanning dashboard.
      id-token: write
      security-events: write
      actions: read
      contents: read

    steps:
      - name: "Checkout code"
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          persist-credentials: false

      - name: "Run analysis"
        uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
        with:
          results_file: results.sarif
          results_format: sarif
          # Read-only PAT token. To create it,
          # follow the steps in https://github.com/ossf/scorecard-action#pat-token-creation.
          repo_token: ${{ secrets.SCORECARD_READ_TOKEN }}
          # Publish the results for public repositories to enable scorecard badges. For more details, see
          # https://github.com/ossf/scorecard-action#publishing-results.
          # For private repositories, `publish_results` will automatically be set to `false`, regardless
          # of the value entered here.
          publish_results: true

      # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
      # format to the repository Actions tab.
      - name: "Upload artifact"
        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
        with:
          name: SARIF file
          path: results.sarif
          retention-days: 5

      # Upload the results to GitHub's code scanning dashboard.
      - name: "Upload to code-scanning"
        uses: github/codeql-action/upload-sarif@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1
        with:
          sarif_file: results.sarif


================================================
FILE: .gitignore
================================================
.idea
**/passwords
**/server.properties
tmp*/
bin/
dist/
coverage.out
revive.log
**/.DS_Store
**/key.json
/minectl
**/azure.auth
**/ssh/
**/oracleidentitycloudservice_*.pem
**/*-openrc.sh
.claude/
.mcp.json


================================================
FILE: .golangci.yaml
================================================
version: "2"

formatters:
  enable:
    - gofumpt
    - goimports

linters:
  enable:
    # bugs
    - bodyclose
    - durationcheck
    - errcheck
    - errorlint
    - gosec
    - govet
    - loggercheck
    - nilerr
    - noctx
    - recvcheck
    - sqlclosecheck

    # performance
    - copyloopvar
    - intrange
    - mirror
    - perfsprint
    - prealloc
    - usestdlibvars

    # style & conventions
    - asciicheck
    - bidichk
    - dupword
    - errname
    - forbidigo
    - goconst
    - gocritic
    - gocyclo
    - goprintffuncname
    - misspell
    - modernize
    - nolintlint
    - nosprintfhostport
    - predeclared
    - revive
    - tagliatelle
    - unconvert
    - unparam
    - wastedassign
    - whitespace

    # testing
    - thelper
    - tparallel
    - usetesting

    # unused / dead code
    - fatcontext
    - reassign

  settings:
    forbidigo:
      forbid:
        - pattern: 'ioutil\.*'
          msg: "use os and io packages instead of ioutil"
      exclude-godoc-examples: true
      analyze-types: true
    tagliatelle:
      case:
        use-field-name: false
        rules:
          yaml: goCamel
          json: snake
    errorlint:
      asserts: true
      comparison: true
      errorf: true
    gocritic:
      enabled-tags:
        - diagnostic
        - style
        - performance
      disabled-checks:
        - hugeParam
        - importShadow
    revive:
      rules:
        - name: blank-imports
        - name: context-as-argument
        - name: dot-imports
        - name: error-naming
        - name: error-return
        - name: error-strings
        - name: exported
          disabled: true
        - name: increment-decrement
        - name: indent-error-flow
        - name: package-comments
          disabled: true
        - name: range
        - name: receiver-naming
        - name: redefines-builtin-id
        - name: superfluous-else
        - name: unreachable-code
        - name: var-naming
    misspell:
      locale: US
      ignore-rules:
        - organisation
    gocyclo:
      min-complexity: 15
    perfsprint:
      err-error: true
      errorf: true
      sprintf1: true
    gosec:
      excludes:
        - G104
        - G204
        - G304


================================================
FILE: .goreleaser.yaml
================================================
version: 2
project_name: minectl
snapshot:
  version_template: '{{ .Version }}-SNAPSHOT'
before:
  hooks:
    - go mod tidy
builds:
  - env:
      - CGO_ENABLED=0
    goos:
      - linux
      - windows
      - darwin
    ignore:
      - goos: windows
        goarch: arm64
    goarch:
      - amd64
      - arm64
    mod_timestamp: '{{ .CommitTimestamp }}'
    flags:
      - -trimpath


source:
  enabled: true

sboms:
  - artifacts: archive
  - id: source
    artifacts: source

checksum:
  name_template: 'checksums.txt'

signs:
  - cmd: cosign
    signature: '${artifact}.sigstore.json'
    args:
      - sign-blob
      - '--bundle=${signature}'
      - '${artifact}'
      - '-y'
    artifacts: all
    output: true

dockers:
  - image_templates: [ "ghcr.io/dirien/{{ .ProjectName }}:{{ .Version }}-amd64" ]
    dockerfile: Dockerfile
    use: buildx
    build_flag_templates:
      - --platform=linux/amd64
      - --label=org.opencontainers.image.licenses=Apache-2.0
      - --label=org.opencontainers.image.description=minectl is a cli for creating Minecraft server on different cloud provider
      - --label=org.opencontainers.image.created={{.Date}}
      - --label=org.opencontainers.image.name={{.ProjectName}}
      - --label=org.opencontainers.image.revision={{.FullCommit}}
      - --label=org.opencontainers.image.version={{.Version}}
      - --label=org.opencontainers.image.source={{.GitURL}}
      - --label=io.artifacthub.package.maintainers=[{"name":"Engin Diri","email":"engin.diri@ediri.de"}]
      - --label=io.artifacthub.package.readme-url=https://raw.githubusercontent.com/dirien/minectl/main/README.md
      - --label=io.artifacthub.package.logo-url=https://dirien.github.io/minectl/img/minectl-logo.png
      - --label=io.artifacthub.package.keywords=minecraft,server,cli
      - --label=io.artifacthub.package.license=Apache-2.0
  - image_templates: [ "ghcr.io/dirien/{{ .ProjectName }}:{{ .Version }}-arm64" ]
    goarch: arm64
    dockerfile: Dockerfile
    use: buildx
    build_flag_templates:
      - --platform=linux/arm64/v8
      - --label=org.opencontainers.image.licenses=Apache-2.0
      - --label=org.opencontainers.image.description=minectl is a cli for creating Minecraft server on different cloud provider
      - --label=org.opencontainers.image.created={{.Date}}
      - --label=org.opencontainers.image.name={{.ProjectName}}
      - --label=org.opencontainers.image.revision={{.FullCommit}}
      - --label=org.opencontainers.image.version={{.Version}}
      - --label=org.opencontainers.image.source={{.GitURL}}
      - --label=io.artifacthub.package.maintainers=[{"name":"Engin Diri","email":"engin.diri@ediri.de"}]
      - --label=io.artifacthub.package.readme-url=https://raw.githubusercontent.com/dirien/minectl/main/README.md
      - --label=io.artifacthub.package.logo-url=https://dirien.github.io/minectl/img/minectl-logo.png
      - --label=io.artifacthub.package.keywords=minecraft,server,cli
      - --label=io.artifacthub.package.license=Apache-2.0

docker_manifests:
  - name_template: 'ghcr.io/dirien/{{ .ProjectName }}:{{ .Version }}'
    image_templates:
      - 'ghcr.io/dirien/{{ .ProjectName }}:{{ .Version }}-amd64'
      - 'ghcr.io/dirien/{{ .ProjectName }}:{{ .Version }}-arm64'
  - name_template: 'ghcr.io/dirien/{{ .ProjectName }}:latest'
    image_templates:
      - 'ghcr.io/dirien/{{ .ProjectName }}:{{ .Version }}-amd64'
      - 'ghcr.io/dirien/{{ .ProjectName }}:{{ .Version }}-arm64'


docker_signs:
  - cmd: cosign
    artifacts: manifests
    output: true
    args:
      - 'sign'
      - '${artifact}'
      - '-y'

brews:
  - repository:
      owner: dirien
      name: homebrew-dirien
      token: "{{ .Env.HOMEBREW_TAP_GITHUB_TOKEN }}"

    commit_author:
      name: dirien
      email: info@ediri.de

    directory: Formula
    homepage: "https://github.com/dirien/minectl"
    description: "minectl️️ 🗺️ is a cli for creating Minecraft (java or bedrock) server on different cloud provider."
    license: "Apache License 2.0"

archives:
  - format_overrides:
      - goos: windows
        formats: ["zip"]

nfpms:
  - file_name_template: >-
      {{- .ProjectName }}_
      {{- title .Os }}_
      {{- if eq .Arch "amd64" }}x86_64
      {{- else if eq .Arch "386" }}i386
      {{- else }}{{ .Arch }}{{ end }}
      {{- if .Arm }}v{{ .Arm }}{{ end -}}
    homepage: https://github.com/dirien/minectl
    description: "minectl️️ 🗺️ is a cli for creating Minecraft (java or bedrock) server on different cloud provider."
    maintainer: "Engin Diri info@ediri.de"
    license: "Apache License 2.0"
    vendor: minectl️️ Developers
    formats:
      - rpm
      - deb
      - apk
    bindir: /usr/bin

changelog:
  sort: asc
  use: github
  filters:
    exclude:
      - '^test:'
      - '^chore'
      - Merge pull request
      - Merge remote-tracking branch
      - Merge branch
      - go mod tidy
  groups:
    - title: 'New Features'
      regexp: "^.*feat[(\\w)]*:+.*$"
      order: 0
    - title: 'Bug fixes'
      regexp: "^.*fix[(\\w)]*:+.*$"
      order: 10
    - title: Other work
      order: 999


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
  - repo: https://github.com/dirien/pre-commit-hooks
    rev: v0.1.0
    hooks:
      - id: golangci-lint

================================================
FILE: AGENTS.md
================================================
<!-- FOR AI AGENTS - Human readability is a side effect, not a goal -->
<!-- Managed by agent: keep sections and order; edit content, not structure -->
<!-- Last updated: 2026-03-21 | Last verified: 2026-03-21 -->

# AGENTS.md

**Precedence:** the **closest `AGENTS.md`** to the files you're changing wins. Root holds global defaults only.

## Commands (verified 2026-03-21)
> Source: Makefile, go.mod

<!-- AGENTS-GENERATED:START commands -->
| Task | Command | ~Time |
|------|---------|-------|
| Typecheck | `go build -v ./...` | ~15s |
| Lint | `golangci-lint run --timeout 10m -E goimports --fix` | ~30s |
| Format | `gofmt -w .` | ~5s |
| Test (single) | `go test -v -race ./internal/ui/...` | ~2s |
| Test (all) | `go test -v ./...` | ~10s |
| Build (local) | `go build .` | ~10s |
| Build (cross) | `make build` | ~30s |
| Install | `go install .` | ~10s |
| Coverage | `make coverage` | ~15s |
<!-- AGENTS-GENERATED:END commands -->

> If commands fail, verify against `Makefile` or ask user to update.

## Workflow
1. **Before coding**: Read nearest `AGENTS.md` for the area you're touching
2. **After each change**: Run the smallest relevant check (lint → typecheck → single test)
3. **Before committing**: Run full test suite if changes affect >2 files or touch shared code
4. **Before claiming done**: Run verification and **show output as evidence**

## File Map
<!-- AGENTS-GENERATED:START filemap -->
```
main.go                          → entrypoint, injects version/commit/date
cmd/minectl/                     → CLI commands (cobra): create, delete, list, update, wizard, plugins, rcon
internal/
  logging/                       → zap-based structured logging
  manifest/                      → YAML manifest parsing and JSON schema validation
  provisioner/                   → cloud provider orchestration via minectl-sdk
  rcon/                          → Minecraft RCON interactive prompt
  ui/                            → TUI components (spinner, table, forms via bubbletea/huh)
config/                          → server config templates per Minecraft edition
docs/                            → documentation and images
Dockerfile                       → chainguard static image, copies binary
Makefile                         → build, test, lint, coverage targets
```
<!-- AGENTS-GENERATED:END filemap -->

## Golden Samples (follow these patterns)
<!-- AGENTS-GENERATED:START golden-samples -->
| For | Reference | Key patterns |
|-----|-----------|--------------|
| CLI command | `cmd/minectl/create.go` | Cobra RunE, flag parsing, provisioner creation |
| Provisioner | `internal/provisioner/provisioner.go` | Interface, cloud provider switch, spinner lifecycle |
| UI component | `internal/ui/spinner.go` | Bubbletea model, headless vs interactive |
| Test pattern | `internal/ui/ui_test.go` | Table-driven tests, headless/interactive variants |
<!-- AGENTS-GENERATED:END golden-samples -->

## Utilities (check before creating new)
<!-- AGENTS-GENERATED:START utilities -->
| Need | Use | Location |
|------|-----|----------|
| Cloud provisioning | `minectl-sdk` | `github.com/dirien/minectl-sdk` (external) |
| CLI framework | `cobra` | `github.com/spf13/cobra` |
| TUI forms | `huh` | `github.com/charmbracelet/huh` |
| TUI spinners/tables | `bubbletea` + `bubbles` | `internal/ui/` |
| Logging | `zap` | `internal/logging/` |
| YAML parsing | `sigs.k8s.io/yaml` | `internal/manifest/` |
| JSON schema validation | `gojsonschema` | `internal/manifest/` |
| Error wrapping | `pkg/errors` | Used throughout |
<!-- AGENTS-GENERATED:END utilities -->

## Heuristics (quick decisions)
<!-- AGENTS-GENERATED:START heuristics -->
| When | Do |
|------|-----|
| Adding cloud provider | Add case in `internal/provisioner/provisioner.go:getProvisioner()`, implement in `minectl-sdk` |
| Adding CLI command | New file in `cmd/minectl/`, register in `minectl.go:init()` |
| Adding server edition | New config dir under `config/`, update manifest parsing |
| Version injection | Via ldflags in Makefile: `-X main.version=...` |
| Headless mode | Use `--headless` flag; switches UI to structured logging |
| Committing | Use Conventional Commits (`feat:`, `fix:`, `docs:`, etc.) |
| Adding dependency | Ask first — we minimize deps |
| Unsure about pattern | Check Golden Samples above |
<!-- AGENTS-GENERATED:END heuristics -->

## Repository Settings
<!-- AGENTS-GENERATED:START repo-settings -->
- **Default branch:** `main`
- **Go version:** 1.24.9
- **Module:** `github.com/dirien/minectl`
- **Docker:** chainguard static base image
- **CI:** GitHub Actions (lock-inactive workflow)
<!-- AGENTS-GENERATED:END repo-settings -->

## Key Decisions
<!-- AGENTS-GENERATED:START key-decisions -->
- **External SDK:** Core cloud logic lives in `github.com/dirien/minectl-sdk`, not in this repo. This repo is the CLI wrapper.
- **Charmbracelet TUI:** Interactive mode uses bubbletea/huh/lipgloss; headless mode falls back to zap logging.
- **Multi-cloud:** 15 cloud providers supported via provider-specific env vars (see `provisioner.go`).
- **Manifest-driven:** Server config is YAML manifests validated against JSON schema.
<!-- AGENTS-GENERATED:END key-decisions -->

## Boundaries

### Always Do
- Run pre-commit checks before committing
- Add tests for new code paths
- Use conventional commit format: `type(scope): subject`
- Follow Go 1.24 conventions and idioms
- Show test output as evidence before claiming work is complete

### Ask First
- Adding new dependencies
- Modifying CI/CD configuration
- Changing public API signatures or CLI flags
- Changes to `minectl-sdk` (external dependency)
- Repo-wide refactoring or rewrites

### Never Do
- Commit secrets, credentials, or cloud provider tokens
- Modify vendor/ or generated files
- Push directly to main branch
- Use `ioutil.*` (deprecated)
- Commit go.sum without go.mod changes

## Contributing (for AI agents)
- **Comprehension**: Understand the problem before submitting code. Read the linked issue, understand *why* the change is needed.
- **Context**: Every PR must explain trade-offs and link to the issue it addresses.
- **Continuity**: Respond to review feedback. Drive-by PRs without follow-up will be closed.

<!-- AGENTS-GENERATED:START module-boundaries -->
## Module Boundaries
- `cmd/minectl/` → CLI layer only; no business logic, delegates to `internal/`
- `internal/provisioner/` → orchestrates `minectl-sdk`; no direct cloud API calls
- `internal/ui/` → presentation only; no business logic
- `internal/manifest/` → parsing/validation only; no side effects
- `internal/logging/` → logging setup; used by `ui`
- `internal/rcon/` → RCON protocol; standalone
<!-- AGENTS-GENERATED:END module-boundaries -->

## Terminology
| Term | Means |
|------|-------|
| minectl | This CLI tool for provisioning Minecraft servers |
| minectl-sdk | External Go SDK containing cloud provider implementations |
| manifest | YAML file describing desired server configuration |
| edition | Minecraft variant: java, bedrock, fabric, forge, papermc, etc. |
| RCON | Remote Console protocol for Minecraft server administration |
| headless | Non-interactive mode for CI/automation (structured log output) |

## Index of scoped AGENTS.md
<!-- AGENTS-GENERATED:START scope-index -->
| Directory | Focus |
|-----------|-------|
| [`cmd/minectl/`](./cmd/minectl/AGENTS.md) | CLI commands, cobra patterns, flag handling |
<!-- AGENTS-GENERATED:END scope-index -->

> **Agents**: When you read or edit files in a listed directory, you **must** load its AGENTS.md first.

## When instructions conflict
The nearest `AGENTS.md` wins. Explicit user prompts override files.
- For Go-specific patterns, defer to language idioms and standard library conventions


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to minectl 🗺

Welcome, and thank you for considering contributing to minectl 🗺. We encourage you to help out by raising issues,
improving documentation, fixing bugs, or adding new features

If you're interested in contributing please start by reading this document.

## Establishing a Development Environment

Establishing a development environment typically requires:

1. Forking and cloning the repository.
1. Installing development dependencies.

## Contributing Code

To contribute bug fixes or features to minectl 🗺:

1. Communicate your intent.
1. Make your changes.
1. Test your changes.
1. Update documentation and examples.
1. Open a Pull Request (PR).

Communicating your intent lets the minectl 🗺 maintainers know that you intend to contribute, and how. This sets you up
for success - you can avoid duplicating an effort that may already be underway, adding a feature that may be rejected,
or heading down a path that you would be steered away from at review time. The best way to communicate your intent is
via a detailed GitHub issue. Take a look first to see if there's already an issue relating to the thing you'd like to
contribute. If there isn't, please raise a new one! Let us know what you'd like to work on, and why.

Be sure to practice [good git commit hygiene] as you make your changes. All but the smallest changes should be broken up
into a few commits that tell a story. Use your git commits to provide context for the folks who will review PR, and the
folks who will be spelunking the codebase in the months and years to come. Ensure each of your commits is signed-off in
compliance with the [Developer Certificate of Origin] by using `git commit -s`.

All minectl 🗺 documentation and examples are under revision control; see the
[docs] and [config] directories of this repository. Any change that introduces new behaviour or changes
existing behaviour must include updates to any relevant documentation and examples. Please keep documentation and
example changes in distinct commits.

In summary, please:

* Discuss your change in a GitHub issue before you start.
* Use your Git commit messages to communicate your intent to your reviewers.
* Sign-off on all Git commits by running `git commit -s`
* Add or update tests for all changes.
* Update all relevant documentation and examples.
* If necessary, tidy up your git commit history once your PR is approved.

Thank you for reading through our contributing guide!

[good git commit hygiene]: https://www.futurelearn.com/info/blog/telling-stories-with-your-git-history

[Developer Certificate of Origin]: https://github.com/apps/dco

[docs]: docs/

[config]: config/

================================================
FILE: DCO
================================================
Developer Certificate of Origin
Version 1.1

Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
660 York Street, Suite 102,
San Francisco, CA 94110 USA

Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.


Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.

================================================
FILE: Dockerfile
================================================
# Dockerfile
FROM cgr.dev/chainguard/static@sha256:853bfd4495abb4b65ede8fc9332513ca2626235589c2cef59b4fce5082d0836d
COPY minectl \
	/usr/bin/minectl
ENTRYPOINT ["/usr/bin/minectl"]


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: Makefile
================================================
NAME          := minectl
FILES         := $(shell find * -type f ! -path 'vendor/*' -name '*.go')
.DEFAULT_GOAL := help
Version := $(shell git describe --tags --dirty)
GitCommit := $(shell git rev-parse HEAD)
LDFLAGS := "-s -w -X main.version=$(Version) -X main.commit=$(GitCommit)"

.PHONY: lint
lint: golangci-lint

.PHONY: golangci-lint
golangci-lint:
	@hash golangci-lint > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
		export BINARY="golangci-lint"; \
		curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(GOPATH)/bin v1.41.1; \
	fi
	golangci-lint run --timeout 10m -E goimports --fix

.PHONY: test
test: ## Run the tests against the codebase
	go test -v ./...

.PHONY: install
install: ## Build and install locally the binary (dev purpose)
	go install .

.PHONY: build-local
build-local: ## Build the binaries using local GOOS
	go build .

.PHONY: run-local
run-local: ## Run the binaries locals
	go run .

.PHONY: build
build: ## Build the binaries
	rm -rf bin/
	mkdir -p bin/
	CGO_ENABLED=0 GOOS=linux go build -ldflags $(LDFLAGS) -a -installsuffix cgo -o bin/$(NAME)
	CGO_ENABLED=0 GOOS=darwin go build -ldflags $(LDFLAGS) -a -installsuffix cgo -o bin/$(NAME)-darwin
	CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags $(LDFLAGS) -a -installsuffix cgo -o bin/$(NAME).exe

.PHONY: clean
clean: ## Remove binary if it exists
	rm -f $(NAME)

.PHONY: coverage
coverage: ## Generates coverage report
	rm -rf *.out
	go test -v ./... -coverpkg=./... -coverprofile=coverage.out

.PHONY: all
all: test build coverage ## Test, builds and ship package for all supported platforms

.PHONY: help
help: ## Displays this help
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'


================================================
FILE: README.md
================================================
## New - 1.21.11 support

`minectl 🗺`️️ supports the `Minecraft 1.21.11` version

<img alt="logo" src="docs/img/1_21_11_logo.png" width="40%"/>

# `minectl 🗺`

![minectl](https://dirien.github.io/minectl/img/minectl.png)

![Minecraft](https://img.shields.io/badge/Minecraft-62B47A?style=for-the-badge&logo=Minecraft&logoColor=white)
![Go](https://img.shields.io/badge/go-00ADD8?style=for-the-badge&logo=go&logoColor=white)
![Ubuntu](https://img.shields.io/badge/ubuntu_22.04-E95420?style=for-the-badge&logo=ubuntu&logoColor=white)
![Prometheus](https://img.shields.io/badge/Prometheus-E6522C?style=for-the-badge&logo=Prometheus&logoColor=white)
![Scaleway](https://img.shields.io/badge/scaleway-4F0599?style=for-the-badge&logo=scaleway&logoColor=white)
![DigitalOcean](https://img.shields.io/badge/DigitalOcean-0080FF?style=for-the-badge&logo=DigitalOcean&logoColor=white)
![Civo](https://img.shields.io/badge/Civo-239DFF?style=for-the-badge&logo=Civo&logoColor=white)
![Akamai Connected Cloud](https://img.shields.io/badge/akamai_connected_cloud-0096D6?style=for-the-badge&logo=akamai&logoColor=white)
![Hetzner](https://img.shields.io/badge/hetzner-d50c2d?style=for-the-badge&logo=hetzner&logoColor=white)
![OVH](https://img.shields.io/badge/ovh-123F6D?style=for-the-badge&logo=ovh&logoColor=white)
![Google Cloud](https://img.shields.io/badge/google_cloud-4285F4?style=for-the-badge&logo=google-cloud&logoColor=white)
![Vultr](https://img.shields.io/badge/vultr-007BFC?style=for-the-badge&logo=vultr&logoColor=white)
![Microsoft Azure](https://img.shields.io/badge/Microsoft_Azure-0078D4?style=for-the-badge&logo=microsoft-azure&logoColor=white)
![Oracle Cloud Infrastructure](https://img.shields.io/badge/Oracle_Cloud_Infrastructure-F80000?style=for-the-badge&logo=oracle&logoColor=white)
![Amazon AWS](https://img.shields.io/badge/Amazon_AWS-FF9900?style=for-the-badge&logo=amazonaws&logoColor=white)
![VEXXHOST](https://img.shields.io/badge/VEXXHOST-2A1659?style=for-the-badge&logo=vexxhost&logoColor=white)
![Multipass](https://img.shields.io/badge/Multipass-E95420?style=for-the-badge&logo=ubuntu&logoColor=white)
![Exoscale](https://img.shields.io/badge/Exoscale-DA291C?style=for-the-badge&logo=exoscale&logoColor=white)
![Fuga Cloud](https://img.shields.io/badge/fuga_cloud-242F4B?style=for-the-badge&logo=fugacloud&logoColor=white)

[![Go Reference](https://pkg.go.dev/badge/github.com/dirien/minectl.svg)](https://pkg.go.dev/github.com/dirien/minectl)
[![Go Report Card](https://goreportcard.com/badge/github.com/dirien/minectl)](https://goreportcard.com/report/github.com/dirien/minectl)

![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/dirien/minectl/ci.yaml?branch=main&logo=github&style=for-the-badge)
![GitHub](https://img.shields.io/github/license/dirien/minectl?style=for-the-badge)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=dirien_minectl&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=dirien_minectl)
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/dirien/minectl/badge?style=for-the-badge)](https://api.securityscorecards.dev/projects/github.com/dirien/minectl)
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5238/badge)](https://bestpractices.coreinfrastructure.org/projects/5238)

![GitHub release (latest by date)](https://img.shields.io/github/v/release/dirien/minectl?style=for-the-badge)

[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/minectl&style=for-the-badge)](https://artifacthub.io/packages/search?repo=minectl)

`minectl 🗺`️️ is a CLI for creating Minecraft servers on different cloud providers.

It is a private side project of me, to learn more about Go, CLI and multi-cloud environments.

## Table of Contents

- [Supported Cloud Providers](#supported-cloud-providers)
- [Quick Start](#quick-start)
- [Documentation](#documentation)
- [Getting Started Guides](#getting-started-guides)
- [Known Limitations](#known-limitations)
- [Contributing](#contributing)
- [Roadmap](#roadmap)
- [Libraries & Tools](#libraries--tools)
- [Legal Disclaimer](#legal-disclaimer)

## Supported Cloud Providers

| Provider | Website |
|----------|---------|
| Civo | https://www.civo.com/ |
| Scaleway | https://www.scaleway.com |
| DigitalOcean | https://www.digitalocean.com/ |
| Hetzner | https://www.hetzner.com/ |
| Akamai Connected Cloud | https://www.linode.com/ |
| OVHCloud | https://www.ovh.com/ |
| Google Compute Engine (GCE) | https://cloud.google.com/compute |
| Vultr | https://www.vultr.com/ |
| Azure | https://azure.microsoft.com/en-us/ |
| Oracle Cloud Infrastructure | https://www.oracle.com/cloud/ |
| Amazon AWS | https://aws.amazon.com/ |
| VEXXHOST | https://vexxhost.com/ |
| Multipass | https://multipass.run/ |
| Exoscale | https://www.exoscale.com/ |
| Fuga Cloud | https://fuga.cloud/ |

## Quick Start

### Installation

#### Linux/macOS (Installation Script)

```bash
curl -sLS https://get.minectl.dev | sudo sh
```

or without `sudo`:

```bash
curl -sLS https://get.minectl.dev | sh
```

#### macOS (Homebrew)

```bash
brew tap dirien/homebrew-dirien
brew install minectl
```

#### Windows (PowerShell)

```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 $HOME/minectl/cli/.
# Add to Windows Environment Variables
[Environment]::SetEnvironmentVariable("Path",$($env:Path + ";$Home\minectl\cli"),'User')
```

#### From Source

```bash
git clone https://github.com/dirien/minectl
cd minectl
make build
```

### Create Your First Server

1. **Set up authentication** for your cloud provider ([see docs](docs/authentication.md))

2. **Create a config file** using the wizard:
   ```bash
   minectl wizard
   ```

3. **Create the server**:
   ```bash
   minectl create --filename server.yaml
   ```

4. **Connect and play!**

[![asciicast](https://asciinema.org/a/439572.svg)](https://asciinema.org/a/439572)

## Documentation

| Document | Description |
|----------|-------------|
| [Architecture](docs/architecture.md) | High-level architectural overview |
| [Authentication](docs/authentication.md) | Cloud provider credentials setup |
| [Configuration](docs/configuration.md) | Server and proxy configuration reference |
| [CLI Reference](docs/cli-reference.md) | All commands and flags |
| [Editions](docs/editions.md) | Supported Minecraft server and proxy editions |
| [Features](docs/features.md) | Monitoring, volumes, security, and more |

## Getting Started Guides

- [Civo Java Edition](docs/getting-started-civo.md)
- [Civo Bedrock Edition](docs/getting-started-civo-bedrock.md)
- [Scaleway Java Edition](docs/getting-started-scaleway.md)
- [GCE Edition](docs/getting-started-gce.md)
- [Exoscale Edition](docs/getting-started-exoscale.md)
- [Multi-cloud server monitoring](docs/multi-server-monitoring-civo.md)
- [LuckyBlocks on Scaleway](docs/running-minecraft-luckyblocks-budget-scaleway.md)
- [PaperMC SkyBlock on Hetzner](docs/skyblock-papermc-hetzner.md)

## Known Limitations

`minectl 🗺` is still under development. There will be the possibility for breaking changes.

## Contributing

Feel free to join! See our [contribution guidelines](CONTRIBUTING.md).

**License:** Apache License, Version 2.0

## Roadmap

- [x] Support Bedrock edition [#10](https://github.com/dirien/minectl/issues/10)
- [x] Add monitoring capabilities [#21](https://github.com/dirien/minectl/issues/21)
- [x] List Minecraft Server [#11](https://github.com/dirien/minectl/issues/11)
- [x] Update Minecraft Server [#12](https://github.com/dirien/minectl/issues/12)
- [x] Hetzner support [#26](https://github.com/dirien/minectl/issues/26)
- [x] Linode support [#31](https://github.com/dirien/minectl/issues/31)
- [x] OVHCloud support [#43](https://github.com/dirien/minectl/issues/43)
- [x] GCE support [#55](https://github.com/dirien/minectl/issues/55)
- [x] Modded editions [#20](https://github.com/dirien/minectl/issues/20)
- [x] Vultr support [#90](https://github.com/dirien/minectl/issues/90)
- [x] Proxy servers (BungeeCord/Waterfall) [#95](https://github.com/dirien/minectl/issues/95)
- [x] Azure support [#56](https://github.com/dirien/minectl/issues/56)
- [x] Oracle/OCI support [#107](https://github.com/dirien/minectl/issues/107)
- [x] AWS support [#210](https://github.com/dirien/minectl/pull/210)
- [ ] Much more to come...

## Libraries & Tools

<details>
<summary>Click to expand</summary>

- https://github.com/charmbracelet/bubbletea
- https://github.com/charmbracelet/lipgloss
- https://github.com/charmbracelet/huh
- https://github.com/charmbracelet/bubbles
- 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/sethvargo/go-password
- https://github.com/ovh/go-ovh
- https://github.com/dirien/ovh-go-sdk
- https://github.com/hashicorp/go-retryablehttp
- 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/aws/aws-sdk-go-v2
- https://github.com/gophercloud/gophercloud
- https://github.com/exoscale/egoscale

</details>

## Legal Disclaimer

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.

## Stargazers over time

[![Stargazers over time](https://starchart.cc/dirien/minectl.svg)](https://starchart.cc/dirien/minectl)


================================================
FILE: SECURITY.md
================================================
# Security Policies and Procedures

This document outlines security procedures and general policies for the `minectl 🗺`
project.

* [Reporting a Bug](#reporting-a-bug)
* [Disclosure Policy](#disclosure-policy)
* [Comments on this Policy](#comments-on-this-policy)

## Reporting a Bug

The `minectl 🗺` team and community take all security bugs in `minectl 🗺`
seriously. Thank you for improving the security of `minectl 🗺`. We appreciate your efforts and
responsible disclosure and will make every effort to acknowledge your contributions.

Report security bugs by emailing the lead maintainer at engin.diri@ediri.de.

The lead maintainer will acknowledge your email within 48 hours, and will send a more detailed response within 48 hours
indicating the next steps in handling your report. After the initial reply to your report, the security team will
endeavor to keep you informed of the progress towards a fix and full announcement, and may ask for additional
information or guidance.

Report security bugs in third-party modules to the person or team maintaining the module.

## Disclosure Policy

When the security team receives a security bug report, they will assign it to a primary handler. This person will
coordinate the fix and release process, involving the following steps:

* Confirm the problem and determine the affected versions.
* Audit code to find any potential similar problems.
* Prepare fixes for all releases still under maintenance. These fixes will be released as fast as possible to npm.

## Comments on this Policy

If you have suggestions on how this process could be improved please submit a pull request.

================================================
FILE: artifacthub-repo.yml
================================================
# ID is for the OCI Image
repositoryID: 71cfb056-f17b-4d72-8e10-a3437303a257
owners:
  - name: Engin Diri
    email: engin.diri@ediri.de

================================================
FILE: cmd/minectl/AGENTS.md
================================================
<!-- Managed by agent: keep sections and order; edit content, not structure. Last updated: 2026-03-21 -->

# AGENTS.md — cmd/minectl (CLI Commands)

<!-- AGENTS-GENERATED:START overview -->
## Overview
Cobra-based CLI entry point for minectl. Each file defines one subcommand. All commands delegate to `internal/` packages for business logic.
<!-- AGENTS-GENERATED:END overview -->

<!-- AGENTS-GENERATED:START filemap -->
## Key Files
| File | Purpose |
|------|---------|
| `minectl.go` | Root command, global flags (`--headless`, `--verbose`, `--log-encoding`), version check, subcommand registration in `init()` |
| `create.go` | `minectl create` — provisions a Minecraft server from manifest |
| `delete.go` | `minectl delete` — tears down a server by ID |
| `update.go` | `minectl update` — updates server edition/config |
| `list.go` | `minectl list` — lists servers for a given provider/region |
| `rcon.go` | `minectl rcon` — opens interactive RCON console |
| `plugins.go` | `minectl plugins` — uploads plugins to a running server |
| `wizard.go` | `minectl wizard` — interactive TUI wizard for server creation |
<!-- AGENTS-GENERATED:END filemap -->

<!-- AGENTS-GENERATED:START golden-samples -->
## Golden Samples (follow these patterns)
| For | Reference | Key patterns |
|-----|-----------|--------------|
| Standard CRUD command | `create.go` | `RunE` + `RunFunc` wrapper, flag setup, provisioner factory |
| Root + global flags | `minectl.go` | `PersistentPreRunE` for logging/UI setup, `PersistentPostRunE` for version check |
| Interactive command | `wizard.go` | Uses `internal/ui/form.go` for TUI prompts |
<!-- AGENTS-GENERATED:END golden-samples -->

<!-- AGENTS-GENERATED:START setup -->
## Setup & environment
- **CLI framework:** Cobra (`github.com/spf13/cobra`)
- **Build output:** `bin/minectl` (linux), `bin/minectl-darwin`, `bin/minectl.exe` (windows)
- Version injected via ldflags: `main.version`, `main.commit`, `main.date`
<!-- AGENTS-GENERATED:END setup -->

<!-- AGENTS-GENERATED:START commands -->
## Build & tests
- Build: `go build .` or `make build` (cross-platform)
- Run: `go run .`
- Test: `go test -v ./...` (tests are in `internal/`, not here)
- Lint: `golangci-lint run --timeout 10m -E goimports --fix`
<!-- AGENTS-GENERATED:END commands -->

<!-- AGENTS-GENERATED:START code-style -->
## Code style & conventions
- Use Cobra `RunE` (not `Run`) for commands that can fail
- Wrap `RunE` with `RunFunc()` from `minectl.go` for consistent error handling + exit codes
- Common flag sets: `--filename` (manifest), `--id` (server ID), `--ssh-key` (private key path)
- `createUpdatePluginProvisioner()` is the shared factory for commands needing a provisioner
- Register new commands in `init()` inside `minectl.go`
- Provide `--help` text for all commands and flags
- Exit codes: 0 = success, 1 = error (via `os.Exit` in `RunFunc`)
- Errors: displayed via `minectlUI.ErrorMsg()` (stderr in headless, TUI in interactive)
- `--headless` flag: enables structured logging, disables TUI rendering
<!-- AGENTS-GENERATED:END code-style -->

<!-- AGENTS-GENERATED:START security -->
## Security & safety
- Cloud credentials come from environment variables only — never from flags or config files
- Never log or display cloud tokens
- Validate manifest paths before reading
- SSH key paths: validate existence, do not log contents
<!-- AGENTS-GENERATED:END security -->

<!-- AGENTS-GENERATED:START checklist -->
## PR/commit checklist
- [ ] `--help` text is clear and accurate for new/modified commands
- [ ] New command registered in `minectl.go:init()`
- [ ] Uses `RunFunc` wrapper for error handling
- [ ] Flags have meaningful defaults and descriptions
- [ ] Works in both interactive and `--headless` mode
- [ ] Errors go through `minectlUI.ErrorMsg()`
<!-- AGENTS-GENERATED:END checklist -->

<!-- AGENTS-GENERATED:START examples -->
## Patterns to Follow
> **Prefer looking at real code in this repo over generic examples.**
> See **Golden Samples** section above for files that demonstrate correct patterns.
<!-- AGENTS-GENERATED:END examples -->

<!-- AGENTS-GENERATED:START help -->
## When stuck
- Cobra docs: see `github.com/spf13/cobra` README
- Check existing commands (especially `create.go`) for patterns
- Root AGENTS.md for project-wide conventions
<!-- AGENTS-GENERATED:END help -->


================================================
FILE: cmd/minectl/create.go
================================================
package minectl

import (
	"fmt"

	"github.com/dirien/minectl/internal/provisioner"
	"github.com/dirien/minectl/internal/ui"

	"github.com/pkg/errors"
	"github.com/spf13/cobra"
)

func init() {
	createCmd.Flags().StringP("filename", "f", "", "Location of the manifest file")
	_ = createCmd.Flags().SetAnnotation("filename", cobra.BashCompFilenameExt, []string{"yaml"})
	createCmd.Flags().BoolP("wait", "w", true, "Wait for Minecraft Server is started")
}

var createCmd = &cobra.Command{
	Use:   "create",
	Short: "Create an Minecraft Server.",
	Example: `minectl create  \
    --filename server-do.yaml`,
	RunE:          RunFunc(runCreate),
	SilenceUsage:  true,
	SilenceErrors: true,
}

func runCreate(cmd *cobra.Command, _ []string) error {
	filename, err := cmd.Flags().GetString("filename")
	if filename == "" {
		return errors.New("Please provide a valid manifest file via -f|--filename flag")
	}
	if err != nil {
		return errors.Wrap(err, "Please provide a valid manifest file")
	}
	p, err := provisioner.NewProvisioner(&provisioner.MinectlProvisionerOpts{
		ManifestPath: filename,
	}, minectlUI)
	if err != nil {
		return err
	}
	wait := true
	if cmd.Flags().Changed("wait") {
		wait, _ = cmd.Flags().GetBool("wait")
	}
	res, err := p.CreateServer(wait)
	if err != nil {
		return err
	}
	if !headless {
		table := ui.NewTable(minectlUI, "ID", "NAME", "REGION", "TAGS", "IP")
		table.Append([]string{res.ID, res.Name, res.Region, res.Tags, res.PublicIP})

		fmt.Println("")
		table.Render()

		minectlUI.Info(fmt.Sprintf("To delete the server:\n\n  minectl delete -f %s --id %s", filename, res.ID))
		minectlUI.Info(fmt.Sprintf("To update the server:\n\n  minectl update -f %s --id %s", filename, res.ID))
		minectlUI.Info(fmt.Sprintf("To connect via RCON:\n\n  minectl rcon -f %s --id %s", filename, res.ID))
		minectlUI.Warn("Beta features:")
		minectlUI.Info(fmt.Sprintf("To upload a plugin:\n\n  minectl plugins -f %s --id %s --plugin <folder>/x.jar --destination /minecraft/plugins", filename, res.ID))
	}
	return nil
}


================================================
FILE: cmd/minectl/delete.go
================================================
package minectl

import (
	"github.com/dirien/minectl/internal/provisioner"
	"github.com/dirien/minectl/internal/ui"
	"github.com/pkg/errors"
	"github.com/spf13/cobra"
)

func init() {
	deleteCmd.Flags().StringP("filename", "f", "", "Location of the manifest file")
	_ = deleteCmd.Flags().SetAnnotation("filename", cobra.BashCompFilenameExt, []string{"yaml"})
	deleteCmd.Flags().String("id", "", "Contains the server id")
	deleteCmd.Flags().BoolP("yes", "y", false, "Automatically delete the server")
}

var deleteCmd = &cobra.Command{
	Use:   "delete",
	Short: "Delete an Minecraft Server.",
	Example: `mincetl delete  \
    --filename server-do.yaml
    --id xxx-xxx-xxx-xxx
	`,
	RunE:          RunFunc(runDelete),
	SilenceUsage:  true,
	SilenceErrors: true,
}

func runDelete(cmd *cobra.Command, _ []string) error {
	filename, err := cmd.Flags().GetString("filename")
	if err != nil {
		return errors.Wrap(err, "failed to get 'filename' value")
	}
	if filename == "" {
		return errors.New("Please provide a valid manifest file via -f|--filename flag")
	}
	id, err := cmd.Flags().GetString("id")
	if err != nil {
		return err
	}
	if id == "" {
		return errors.New("Please provide a valid id")
	}
	newProvisioner, err := provisioner.NewProvisioner(&provisioner.MinectlProvisionerOpts{
		ManifestPath: filename,
		ID:           id,
	}, minectlUI)
	if err != nil {
		return err
	}

	yes := cmd.Flag("yes").Changed
	if yes {
		err = newProvisioner.DeleteServer()
		if err != nil {
			return err
		}
	} else {
		confirmed, err := ui.Confirm("Do you want to delete the Minecraft server?")
		if err != nil {
			return err
		}
		if confirmed {
			err = newProvisioner.DeleteServer()
			if err != nil {
				return err
			}
		} else {
			minectlUI.Warn("Delete canceled.")
		}
	}

	return nil
}


================================================
FILE: cmd/minectl/list.go
================================================
package minectl

import (
	"fmt"

	"github.com/dirien/minectl/internal/provisioner"
	"github.com/dirien/minectl/internal/ui"
	"github.com/pkg/errors"
	"github.com/spf13/cobra"
)

func init() {
	listCmd.Flags().StringP("provider", "p", "", "The cloud provider - civo|scaleway|do|hetzner|akamai|ovh|gce|vultr|azure|oci|aws|vexxhost|fuga|multipass|exoscale")
	listCmd.Flags().StringP("region", "r", "", "The region (gce: zone) for your cloud provider - civo|gce")
}

var listCmd = &cobra.Command{
	Use:   "list",
	Short: "List all Minecraft Server.",
	Example: `mincetl list  \
    --provider civo \
    --region LON1`,
	RunE:          RunFunc(runList),
	SilenceUsage:  true,
	SilenceErrors: true,
}

func runList(cmd *cobra.Command, _ []string) error {
	provider, err := cmd.Flags().GetString("provider")
	if err != nil {
		return errors.Wrap(err, "failed to get 'provider' value")
	}
	if provider == "" {
		return errors.New("Please provide a valid 'provider' value")
	}
	region, err := cmd.Flags().GetString("region")
	if err != nil {
		return errors.Wrap(err, "failed to get 'region' value")
	}

	newProvisioner, err := provisioner.ListProvisioner(&provisioner.MinectlProvisionerListOpts{
		Provider: provider,
		Region:   region,
	}, minectlUI)
	if err != nil {
		return err
	}
	servers, err := newProvisioner.ListServer()
	if err != nil {
		return err
	}

	if len(servers) == 0 {
		minectlUI.Info("No servers found")
		return nil
	}

	if !headless {
		fmt.Println("")
		table := ui.NewTable(minectlUI, "ID", "NAME", "REGION", "TAGS", "IP")
		for _, server := range servers {
			table.Append([]string{server.ID, server.Name, server.Region, server.Tags, server.PublicIP})
		}
		table.Render()
	}
	return nil
}


================================================
FILE: cmd/minectl/minectl.go
================================================
package minectl

import (
	"bytes"
	"context"
	"errors"
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"regexp"
	"runtime"
	"strings"

	"go.uber.org/zap"

	"github.com/blang/semver/v4"
	"github.com/dirien/minectl/internal/logging"
	"github.com/dirien/minectl/internal/provisioner"
	"github.com/dirien/minectl/internal/ui"
	"github.com/mitchellh/go-homedir"
	"github.com/morikuni/aec"
	pkgerrors "github.com/pkg/errors"
	"github.com/spf13/cobra"
	"github.com/tcnksm/go-latest"
)

var (
	Version   string
	GitCommit string
	Date      string
)

func createUpdatePluginProvisioner(cmd *cobra.Command) (provisioner.Provisioner, error) {
	filename, err := cmd.Flags().GetString("filename")
	if err != nil {
		return nil, pkgerrors.Wrap(err, "Please provide a valid manifest file")
	}
	if filename == "" {
		return nil, pkgerrors.New("Please provide a valid manifest file via -f|--filename flag")
	}
	id, err := cmd.Flags().GetString("id")
	if err != nil {
		return nil, err
	}
	if id == "" {
		return nil, pkgerrors.New("Please provide a valid id")
	}
	sshKey, err := cmd.Flags().GetString("ssh-key")
	if err != nil {
		return nil, err
	}
	if sshKey == "" {
		return nil, pkgerrors.New("Please provide a valid ssh key path")
	}
	p, err := provisioner.NewProvisioner(&provisioner.MinectlProvisionerOpts{
		ManifestPath:      filename,
		ID:                id,
		SSHPrivateKeyPath: sshKey,
	}, minectlUI)
	if err != nil {
		return nil, err
	}
	return p, nil
}

func isDevVersion(s semver.Version) bool {
	if len(s.Pre) == 0 {
		return false
	}

	devStrings := regexp.MustCompile(`alpha|beta|dev|rc`)
	return !s.Pre[0].IsNum && devStrings.MatchString(s.Pre[0].VersionStr)
}

func isBrewInstall(exe string) (bool, error) {
	if runtime.GOOS != "darwin" {
		return false, nil
	}

	exePath, err := filepath.EvalSymlinks(exe)
	if err != nil {
		return false, err
	}

	brewBin, err := exec.LookPath("brew")
	if err != nil {
		return false, err
	}

	brewPrefixCmd := exec.CommandContext(context.Background(), brewBin, "--prefix", "minectl")

	var stdout bytes.Buffer
	var stderr bytes.Buffer
	brewPrefixCmd.Stdout = &stdout
	brewPrefixCmd.Stderr = &stderr
	if err = brewPrefixCmd.Run(); err != nil {
		var ee *exec.ExitError
		if errors.As(err, &ee) {
			ee.Stderr = stderr.Bytes()
		}
		return false, pkgerrors.Wrapf(err, "'brew --prefix minectl' failed")
	}

	brewPrefixCmdOutput := strings.TrimSpace(stdout.String())
	if brewPrefixCmdOutput == "" {
		return false, pkgerrors.New("trimmed output from 'brew --prefix minectl' is empty")
	}

	brewPrefixPath, err := filepath.EvalSymlinks(brewPrefixCmdOutput)
	if err != nil {
		return false, err
	}

	brewPrefixExePath := filepath.Join(brewPrefixPath, "minectl")
	return exePath == brewPrefixExePath, nil
}

func runPostCommandHooks(c *cobra.Command, args []string) error {
	if c.PostRunE != nil {
		if err := c.PostRunE(c, args); err != nil {
			return err
		}
	} else if c.PostRun != nil {
		c.PostRun(c, args)
	}
	for p := c; p != nil; p = p.Parent() {
		if p.PersistentPostRunE != nil {
			if err := p.PersistentPostRunE(c, args); err != nil {
				return err
			}
			break
		} else if p.PersistentPostRun != nil {
			p.PersistentPostRun(c, args)
			break
		}
	}
	return nil
}

func RunFunc(run func(cmd *cobra.Command, args []string) error) func(*cobra.Command, []string) error {
	return func(cmd *cobra.Command, args []string) error {
		if res := run(cmd, args); res != nil {
			minectlUI.ErrorMsg(res)
			if postRunErr := runPostCommandHooks(cmd, args); postRunErr != nil {
				minectlUI.ErrorMsg(postRunErr)
			}
			os.Exit(1)
		}
		os.Exit(0)
		return nil
	}
}

func getUpgradeCommand() string {
	exe, err := os.Executable()
	if err != nil {
		return ""
	}

	isBrew, err := isBrewInstall(exe)
	if err != nil {
		fmt.Printf("error determining if the running executable was installed with brew: %s", err)
	}
	if isBrew {
		return "$ brew upgrade minectl"
	}

	if runtime.GOOS != "windows" {
		return "$ curl -sSL https://get.minectl.dev | sh"
	}
	return ""
}

func getUpgradeMessage(latestVer, current *semver.Version) *string {
	cmd := getUpgradeCommand()
	msg := fmt.Sprintf("A new version of minectl is available. To upgrade from version '%s' to '%s', ", current, latestVer)
	if cmd != "" {
		msg += "run \n   " + cmd + "\n\nor "
	}

	msg += "visit https://github.com/dirien/minectl#installing-minectl- for manual instructions."
	return &msg
}

func getCLIVersionInfo(current *semver.Version) (*semver.Version, error) {
	githubTag := &latest.GithubTag{
		Owner:      "dirien",
		Repository: "minectl",
	}

	res, err := latest.Check(githubTag, current.String())
	if err != nil {
		return nil, err
	}
	version, err := semver.New(res.Current)
	if err != nil {
		return nil, err
	}
	return version, nil
}

func checkForUpdate() *string {
	curVer, err := semver.ParseTolerant(getVersion())
	if err != nil {
		fmt.Printf("error parsing current version: %s", err)
	}
	if isDevVersion(curVer) {
		return nil
	}
	latestVer, err := getCLIVersionInfo(&curVer)
	if err != nil {
		return nil
	}
	if latestVer.GT(curVer) {
		return getUpgradeMessage(latestVer, &curVer)
	}

	return nil
}

var versionCmd = &cobra.Command{
	Use:   "version",
	Short: "Display the clients version information.",
	Run:   parseBaseCommand,
}

func getVersion() string {
	if Version != "" {
		return Version
	}
	return "0.1.0-dev"
}

func parseBaseCommand(_ *cobra.Command, _ []string) {
	printLogo()
	fmt.Println("Version:", getVersion())
	fmt.Println("Git Commit:", GitCommit)
	fmt.Println("Build date:", Date)
}

var (
	headless          bool
	minectlLog        *logging.MinectlLogging
	minectlUI         *ui.UI
	updateCheckResult chan *string
)

var minectlCmd = &cobra.Command{
	Use:   "minectl",
	Short: "Create Minecraft Server on different cloud provider.",
	Run:   runMineCtl,
	CompletionOptions: cobra.CompletionOptions{
		DisableDefaultCmd: false,
	},
	PersistentPreRunE: func(cmd *cobra.Command, _ []string) error {
		headless, _ = cmd.Flags().GetBool("headless")
		verbose, _ := cmd.Flags().GetString("verbose")
		logEncoding, _ := cmd.Flags().GetString("log-encoding")
		if headless && verbose == "" {
			verbose = "info"
		}
		var err error
		minectlLog, err = logging.NewLogging(verbose, logEncoding, headless)
		if err != nil {
			os.Exit(0)
		}
		minectlUI = ui.NewUI(headless, minectlLog)
		var waitForUpdateCheck bool
		defer func() {
			if !waitForUpdateCheck {
				close(updateCheckResult)
			}
		}()

		updateCheckResult = make(chan *string)
		waitForUpdateCheck = true
		go func() {
			updateCheckResult <- checkForUpdate()
			close(updateCheckResult)
		}()
		return nil
	},
	PersistentPostRunE: func(_ *cobra.Command, _ []string) error {
		checkVersionMsg, ok := <-updateCheckResult
		if ok && checkVersionMsg != nil {
			zap.S().Infof("Warning(%v)", checkVersionMsg)
			fmt.Println()
			fmt.Println(*checkVersionMsg)
		}
		return nil
	},
}

func makeAppDirectoryIfNotExists() {
	dir, err := homedir.Dir()
	if err != nil {
		fmt.Printf("error determining the home directory: %s", err)
	}
	path := dir + "/.minectl"
	if _, err := os.Stat(path); os.IsNotExist(err) {
		err := os.Mkdir(path, os.ModeDir|0o755)
		if err != nil {
			fmt.Printf("error while creating the minectl directory: %s", err)
		}
	}
}

func GetHomeFolder() string {
	dir, err := homedir.Dir()
	if err != nil {
		fmt.Printf("error determining the home directory: %s", err)
	}
	return dir + "/.minectl"
}

func init() {
	makeAppDirectoryIfNotExists()
	minectlCmd.PersistentFlags().String("verbose", "",
		"Enable verbose logging: debug|info|warn|error|dpanic|panic|fatal")
	minectlCmd.PersistentFlags().String("log-encoding", "console",
		"Set the log encoding: console|json (default: console)")
	minectlCmd.PersistentFlags().Bool("headless", false,
		"Set this value to if mincetl is called by a CI system. Enables logging and disables human-readable output rendering (default: false)")
	minectlCmd.AddCommand(versionCmd)
	minectlCmd.AddCommand(createCmd)
	minectlCmd.AddCommand(deleteCmd)
	minectlCmd.AddCommand(listCmd)
	minectlCmd.AddCommand(wizardCmd)
	minectlCmd.AddCommand(pluginCmd)
	minectlCmd.AddCommand(rconCmd)
	minectlCmd.AddCommand(updateCmd)
}

func Execute(version, gitCommit, date string) error {
	Version = version
	GitCommit = gitCommit
	Date = date

	return minectlCmd.Execute()
}

func runMineCtl(cmd *cobra.Command, _ []string) {
	printLogo()
	err := cmd.Help()
	if err != nil {
		os.Exit(0)
	}
}

func printLogo() {
	minectlLogo := aec.WhiteF.Apply(minectlFigletStr)
	fmt.Println(minectlLogo)
}

const minectlFigletStr = `
 _______ _____ __   _ _______ _______ _______       
 |  |  |   |   | \  | |______ |          |    |     
 |  |  | __|__ |  \_| |______ |_____     |    |_____
`


================================================
FILE: cmd/minectl/plugins.go
================================================
package minectl

import (
	"github.com/spf13/cobra"
)

func init() {
	pluginCmd.Flags().StringP("filename", "f", "", "Location of the manifest file")
	_ = pluginCmd.Flags().SetAnnotation("filename", cobra.BashCompFilenameExt, []string{"yaml"})
	pluginCmd.Flags().String("id", "", "contains the server id")
	pluginCmd.Flags().StringP("plugin", "p", "", "Location of the plugin")
	_ = pluginCmd.Flags().SetAnnotation("plugin", cobra.BashCompFilenameExt, []string{"jar"})
	pluginCmd.Flags().StringP("destination", "d", "", "Plugin destination folder")
	_ = pluginCmd.Flags().SetAnnotation("destination", cobra.BashCompSubdirsInDir, []string{})
	pluginCmd.Flags().StringP("ssh-key", "k", "", "specify a specific path for the SSH key")
}

type ModType string

const (
	Forge  ModType = "forge"
	Fabric ModType = "fabric"
)

type Plugin struct {
	Name        string
	Mod         ModType
	Version     []string
	DownloadURL string
	Destination string
}

var pluginCmd = &cobra.Command{
	Use:   "plugins",
	Short: "Manage your plugins for a specific server",
	Example: `mincetl plugins  \
    --filename server-do.yaml
    --id xxx-xxx-xxx-xxx
	--plugin plugin.jar
    --destination /minecraft/mods`,
	RunE:          RunFunc(runPlugin),
	SilenceUsage:  true,
	SilenceErrors: true,
}

var _ = []Plugin{
	{
		Name:        "Fabric API",
		Mod:         Fabric,
		Version:     []string{"0.37.1+1.16", "0.37.1+1.17"},
		DownloadURL: "https://github.com/FabricMC/fabric/releases/download/{{ .Version }}/fabric-api-{{ .Version }}.jar",
		Destination: "/mincraft/mods",
	},
}

func runPlugin(cmd *cobra.Command, _ []string) error {
	p, err := createUpdatePluginProvisioner(cmd)
	if err != nil {
		return err
	}
	plugin, _ := cmd.Flags().GetString("plugin")
	destination, _ := cmd.Flags().GetString("destination")
	err = p.UploadPlugin(plugin, destination)
	if err != nil {
		return err
	}
	return err
}


================================================
FILE: cmd/minectl/rcon.go
================================================
package minectl

import (
	"github.com/dirien/minectl/internal/provisioner"
	"github.com/pkg/errors"
	"github.com/spf13/cobra"
)

func init() {
	rconCmd.Flags().StringP("filename", "f", "", "Location of the manifest file")
	_ = rconCmd.Flags().SetAnnotation("filename", cobra.BashCompFilenameExt, []string{"yaml"})
	rconCmd.Flags().String("id", "", "contains the server id")
}

var rconCmd = &cobra.Command{
	Use:   "rcon",
	Short: "RCON client to your Minecraft server.",
	Example: `mincetl rcon  \
    --filename server-do.yaml \
    --id xxxx`,
	RunE:          RunFunc(runRCON),
	SilenceUsage:  true,
	SilenceErrors: true,
}

func runRCON(cmd *cobra.Command, _ []string) error {
	filename, err := cmd.Flags().GetString("filename")
	if filename == "" {
		return errors.New("Please provide a valid manifest file via -f|--filename flag")
	}
	if err != nil {
		return errors.Wrap(err, "Please provide a valid manifest file")
	}
	id, err := cmd.Flags().GetString("id")
	if err != nil {
		return err
	}
	if id == "" {
		return errors.New("Please provide a valid id")
	}
	p, err := provisioner.NewProvisioner(&provisioner.MinectlProvisionerOpts{
		ManifestPath: filename,
		ID:           id,
	}, minectlUI)
	if err != nil {
		return err
	}
	err = p.DoRCON()
	if err != nil {
		return err
	}
	return nil
}


================================================
FILE: cmd/minectl/update.go
================================================
package minectl

import (
	"github.com/spf13/cobra"
)

func init() {
	updateCmd.Flags().StringP("filename", "f", "", "Location of the manifest file")
	updateCmd.Flags().StringP("ssh-key", "k", "", "specify a specific path for the SSH key")
	_ = updateCmd.Flags().SetAnnotation("filename", cobra.BashCompFilenameExt, []string{"yaml"})
	updateCmd.Flags().String("id", "", "contains the server id")
}

var updateCmd = &cobra.Command{
	Use:   "update",
	Short: "Update an Minecraft Server.",
	Example: `mincetl update  \
    --filename server-do.yaml
    --id xxx-xxx-xxx-xxx`,
	RunE:          RunFunc(runUpdate),
	SilenceUsage:  true,
	SilenceErrors: true,
}

func runUpdate(cmd *cobra.Command, _ []string) error {
	p, err := createUpdatePluginProvisioner(cmd)
	if err != nil {
		return err
	}
	err = p.UpdateServer()
	if err != nil {
		return err
	}
	return err
}


================================================
FILE: cmd/minectl/wizard.go
================================================
package minectl

import (
	"errors"
	"fmt"
	"os"
	"regexp"
	"strconv"
	"strings"

	"github.com/charmbracelet/huh"
	"github.com/dirien/minectl-sdk/common"
	"github.com/dirien/minectl-sdk/model"
	"github.com/dirien/minectl-sdk/template"
	"github.com/dirien/minectl/internal/ui"
	"github.com/spf13/cobra"
)

var wizardCmd = &cobra.Command{
	Use:           "wizard",
	Short:         "Calls the minectl wizard to create interactively a minectl config",
	Example:       `mincetl wizard`,
	RunE:          RunFunc(runWizard),
	SilenceUsage:  true,
	SilenceErrors: true,
}

func init() {
	wizardCmd.Flags().StringP("output", "o", "", "output folder for the configuration file for minectl (default: ~/.minectl)")
	_ = wizardCmd.Flags().SetAnnotation("output", cobra.BashCompSubdirsInDir, []string{})
}

// Provider options for the wizard
var providerOptions = []huh.Option[string]{
	huh.NewOption("DigitalOcean", "DigitalOcean"),
	huh.NewOption("Civo", "Civo"),
	huh.NewOption("Scaleway", "Scaleway"),
	huh.NewOption("Hetzner", "Hetzner"),
	huh.NewOption("Akamai Connected Cloud", "Akamai Connected Cloud"),
	huh.NewOption("OVHcloud", "OVHcloud"),
	huh.NewOption("Google Compute Engine", "Google Compute Engine"),
	huh.NewOption("vultr", "vultr"),
	huh.NewOption("Azure", "Azure"),
	huh.NewOption("Oracle Cloud Infrastructure", "Oracle Cloud Infrastructure"),
	huh.NewOption("Amazon Web Services", "Amazon Web Services"),
	huh.NewOption("VEXXHOST", "VEXXHOST"),
	huh.NewOption("Ubuntu Multipass", "Ubuntu Multipass"),
	huh.NewOption("Exoscale", "Exoscale"),
	huh.NewOption("Fuga Cloud", "Fuga Cloud"),
}

var javaVersionOptions = []huh.Option[string]{
	huh.NewOption("Java 8", "8"),
	huh.NewOption("Java 16", "16"),
	huh.NewOption("Java 17", "17"),
}

var editionOptions = []huh.Option[string]{
	huh.NewOption("Bedrock", "bedrock"),
	huh.NewOption("Nukkit", "nukkit"),
	huh.NewOption("PowerNukkit", "powernukkit"),
	huh.NewOption("CraftBukkit", "craftbukkit"),
	huh.NewOption("Fabric", "fabric"),
	huh.NewOption("Forge", "forge"),
	huh.NewOption("Java (Vanilla)", "java"),
	huh.NewOption("PaperMC", "papermc"),
	huh.NewOption("Spigot", "spigot"),
	huh.NewOption("Purpur", "purpur"),
}

var featureOptions = []huh.Option[string]{
	huh.NewOption("Monitoring", "Monitoring"),
	huh.NewOption("RCON", "RCON"),
}

// isBedrockEdition returns true for editions that don't use Java.
func isBedrockEdition(edition string) bool {
	return edition == "bedrock" || edition == "nukkit" || edition == "powernukkit"
}

func runWizard(cmd *cobra.Command, _ []string) error {
	minectlUI.Info("minectl configuration file wizard")

	wizard := model.Wizard{
		SSHPort:  "22",
		BanTime:  "600",
		MaxRetry: "6",
		Java:     "16",
		Heap:     "2G",
		Edition:  "java",
	}
	var features []string

	// Validation functions
	nameValidator := func(s string) error {
		if s == "" {
			return errors.New("please enter the name of your Minecraft server")
		}
		match, _ := regexp.MatchString(common.NameRegex, s)
		if !match {
			return errors.New("the name must consist of lower case alphanumeric characters or '-'")
		}
		return nil
	}

	requiredValidator := func(s string) error {
		if s == "" {
			return errors.New("this field is required")
		}
		return nil
	}

	portValidator := func(s string) error {
		if s == "" {
			return errors.New("this field is required")
		}
		port, err := strconv.Atoi(s)
		if err != nil || port < 1 || port > 65535 {
			return errors.New("enter a valid port number (1-65535)")
		}
		return nil
	}

	heapValidator := func(s string) error {
		if s == "" {
			return errors.New("this field is required")
		}
		if !strings.Contains(s, "G") {
			return errors.New("enter the Java heap size in following notation <size>G, eg 2G")
		}
		return nil
	}

	// Group 1: Server basics
	basicGroup := huh.NewGroup(
		huh.NewInput().
			Title("Server Name").
			Description("Enter the name of your Minecraft server").
			Value(&wizard.Name).
			Validate(nameValidator),
		huh.NewSelect[string]().
			Title("Cloud Provider").
			Description("Choose a cloud provider").
			Options(providerOptions...).
			Value(&wizard.Provider),
		huh.NewInput().
			Title("Plan/Size").
			Description("Enter the plan/size for the server (e.g., s-4vcpu-8gb, e2-standard-2)").
			Value(&wizard.Plan).
			Validate(requiredValidator),
		huh.NewInput().
			Title("Region/Datacenter").
			Description("Enter the region/datacenter (e.g., fra1, europe-west6-a)").
			Value(&wizard.Region).
			Validate(requiredValidator),
	)

	// Group 2: SSH configuration
	sshGroup := huh.NewGroup(
		huh.NewInput().
			Title("SSH Public Key Path").
			Description("Enter the full path to your SSH public key (e.g., /home/user/.ssh/id_rsa.pub)").
			Value(&wizard.SSH).
			Validate(requiredValidator),
		huh.NewInput().
			Title("SSH Port").
			Description("Enter the SSH port").
			Value(&wizard.SSHPort).
			Validate(portValidator),
	)

	// Group 3: Security (fail2ban)
	securityGroup := huh.NewGroup(
		huh.NewInput().
			Title("Fail2ban Ban Time").
			Description("Enter the fail2ban ban time in seconds").
			Value(&wizard.BanTime).
			Validate(requiredValidator),
		huh.NewInput().
			Title("Fail2ban Max Retry").
			Description("Enter the fail2ban max retry count").
			Value(&wizard.MaxRetry).
			Validate(requiredValidator),
	)

	// Group 4: Features and edition selection
	featuresGroup := huh.NewGroup(
		huh.NewMultiSelect[string]().
			Title("Additional Features").
			Description("Select additional features for your server").
			Options(featureOptions...).
			Value(&features),
		huh.NewSelect[string]().
			Title("Minecraft Edition").
			Description("Select a Minecraft edition").
			Options(editionOptions...).
			Value(&wizard.Edition),
	)

	// Group 5: Java configuration (hidden for Bedrock-based editions)
	javaGroup := huh.NewGroup(
		huh.NewSelect[string]().
			Title("Java Version").
			Description("Choose the Java version").
			Options(javaVersionOptions...).
			Value(&wizard.Java),
		huh.NewInput().
			Title("Java Heap Size").
			Description("Enter the Java heap size (rule of thumb: half of available RAM)").
			Value(&wizard.Heap).
			Validate(heapValidator),
		huh.NewInput().
			Title("RCON Password").
			Description("Enter a RCON password (if you selected that feature)").
			Value(&wizard.RconPw),
	).WithHideFunc(func() bool {
		return isBedrockEdition(wizard.Edition)
	})

	// Group 6: Minecraft version and properties
	minecraftGroup := huh.NewGroup(
		huh.NewInput().
			Title("Minecraft Version").
			Description("Enter the Minecraft version number").
			Value(&wizard.Version).
			Validate(requiredValidator),
		huh.NewText().
			Title("Additional Properties").
			Description("Add additional Minecraft server properties (key=value, one per line)").
			Value(&wizard.Properties).
			CharLimit(1000),
	)

	// Create the form
	form := huh.NewForm(
		basicGroup,
		sshGroup,
		securityGroup,
		featuresGroup,
		javaGroup,
		minecraftGroup,
	)

	// Run the form with headless support
	err := ui.RunForm(form, headless)
	if err != nil {
		return err
	}

	// Set features
	wizard.Features = features

	config, err := template.NewTemplateConfig(wizard)
	if err != nil {
		return err
	}

	outputFolder := GetHomeFolder()
	output, err := cmd.Flags().GetString("output")
	if err == nil {
		if output != "" {
			outputFolder = output
		}
	}

	filename := fmt.Sprintf("%s/config-%s.yaml", outputFolder, wizard.Name)
	minectlUI.Info("Writing configuration file to " + filename)
	err = os.WriteFile(filename, []byte(config), 0o600)
	if err != nil {
		return err
	}
	minectlUI.Info("To create the server:\n\n  minectl create -f " + filename)
	return nil
}


================================================
FILE: config/bedrock/server-akamai.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-be
spec:
  server:
    cloud: akamai
    region: eu-central
    size: g6-standard-4
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    edition: bedrock
    version: 1.26.0.2
    eula: true
    properties: |
      server-name=Akamai Connected Cloud Minecraft
      gamemode=survival
      force-gamemode=false
      difficulty=normal
      allow-cheats=false
      max-players=100
      online-mode=true
      white-list=false
      server-portv6=19133
      view-distance=32
      tick-distance=4
      player-idle-timeout=30
      max-threads=8
      level-name=Bedrock level
      level-seed=
      default-player-permission-level=member
      texturepack-required=false
      content-log-file-enabled=false
      compression-threshold=1
      server-authoritative-movement=server-auth
      player-movement-score-threshold=20
      player-movement-distance-threshold=0.3
      player-movement-duration-threshold-in-ms=500
      correct-player-movement=false
      server-authoritative-block-breaking=false


================================================
FILE: config/bedrock/server-aws.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-be
spec:
  server:
    cloud: aws
    region: eu-central-1
    size: t3.xlarge
    ssh:
      port: 22
      publickeyfile: "/root/.ssh/id_rsa.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    edition: bedrock
    version: 1.26.0.2
    eula: true
    properties: |
      server-name=Azure Minecraft - Bedrock edition
      gamemode=survival
      force-gamemode=false
      difficulty=normal
      allow-cheats=false
      max-players=100
      online-mode=true
      white-list=false
      server-portv6=19133
      view-distance=32
      tick-distance=4
      player-idle-timeout=30
      max-threads=8
      level-name=Bedrock level
      level-seed=
      default-player-permission-level=member
      texturepack-required=false
      content-log-file-enabled=false
      compression-threshold=1
      server-authoritative-movement=server-auth
      player-movement-score-threshold=20
      player-movement-distance-threshold=0.3
      player-movement-duration-threshold-in-ms=500
      correct-player-movement=false
      server-authoritative-block-breaking=false


================================================
FILE: config/bedrock/server-civo.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-be
spec:
  server:
    cloud: civo
    region: LON1
    size: g3.large
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft-be.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    edition: bedrock
    version: 1.26.0.2
    eula: true
    properties: |
      server-name=Civo Minecraft - Bedrock edition
      gamemode=survival
      force-gamemode=false
      difficulty=normal
      allow-cheats=false
      max-players=100
      online-mode=true
      white-list=false
      server-portv6=19133
      view-distance=32
      tick-distance=4
      player-idle-timeout=30
      max-threads=8
      level-name=Bedrock level
      level-seed=
      default-player-permission-level=member
      texturepack-required=false
      content-log-file-enabled=false
      compression-threshold=1
      server-authoritative-movement=server-auth
      player-movement-score-threshold=20
      player-movement-distance-threshold=0.3
      player-movement-duration-threshold-in-ms=500
      correct-player-movement=false
      server-authoritative-block-breaking=false


================================================
FILE: config/bedrock/server-do.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-be
spec:
  server:
    cloud: do
    region: fra1
    size: s-4vcpu-8gb
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft-be.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    edition: bedrock
    version: 1.26.0.2
    eula: true
    properties: |
      server-name=DigitalOcean Minecraft
      gamemode=survival
      force-gamemode=false
      difficulty=normal
      allow-cheats=false
      max-players=100
      online-mode=true
      white-list=false
      server-portv6=19133
      view-distance=32
      tick-distance=4
      player-idle-timeout=30
      max-threads=8
      level-name=Bedrock level
      level-seed=
      default-player-permission-level=member
      texturepack-required=false
      content-log-file-enabled=false
      compression-threshold=1
      server-authoritative-movement=server-auth
      player-movement-score-threshold=20
      player-movement-distance-threshold=0.3
      player-movement-duration-threshold-in-ms=500
      correct-player-movement=false
      server-authoritative-block-breaking=false


================================================
FILE: config/bedrock/server-exoscale.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-be
spec:
  server:
    cloud: exoscale
    region: de-fra-1
    size: medium
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft-be.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    edition: bedrock
    version: 1.26.0.2
    eula: true
    properties: |
      server-name=Exoscale Minecraft
      gamemode=survival
      force-gamemode=false
      difficulty=normal
      allow-cheats=false
      max-players=100
      online-mode=true
      white-list=false
      server-portv6=19133
      view-distance=32
      tick-distance=4
      player-idle-timeout=30
      max-threads=8
      level-name=Bedrock level
      level-seed=
      default-player-permission-level=member
      texturepack-required=false
      content-log-file-enabled=false
      compression-threshold=1
      server-authoritative-movement=server-auth
      player-movement-score-threshold=20
      player-movement-distance-threshold=0.3
      player-movement-duration-threshold-in-ms=500
      correct-player-movement=false
      server-authoritative-block-breaking=false


================================================
FILE: config/bedrock/server-gce.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-be
spec:
  server:
    cloud: gce
    region: europe-west6-a
    size: e2-standard-2
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft-be.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    edition: bedrock
    version: 1.26.0.2
    eula: true
    properties: |
      server-name=GCE Minecraft
      gamemode=survival
      force-gamemode=false
      difficulty=normal
      allow-cheats=false
      max-players=100
      online-mode=true
      white-list=false
      server-portv6=19133
      view-distance=32
      tick-distance=4
      player-idle-timeout=30
      max-threads=8
      level-name=Bedrock level
      level-seed=
      default-player-permission-level=member
      texturepack-required=false
      content-log-file-enabled=false
      compression-threshold=1
      server-authoritative-movement=server-auth
      player-movement-score-threshold=20
      player-movement-distance-threshold=0.3
      player-movement-duration-threshold-in-ms=500
      correct-player-movement=false
      server-authoritative-block-breaking=false


================================================
FILE: config/bedrock/server-hetzner.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-be
spec:
  server:
    cloud: hetzner
    region: nbg1
    size: cpx31
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft-be.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    edition: bedrock
    version: 1.26.0.2
    eula: true
    properties: |
      server-name=Hetzner Minecraft
      gamemode=survival
      force-gamemode=false
      difficulty=normal
      allow-cheats=false
      max-players=100
      online-mode=true
      white-list=false
      server-portv6=19133
      view-distance=32
      tick-distance=4
      player-idle-timeout=30
      max-threads=8
      level-name=Bedrock level
      level-seed=
      default-player-permission-level=member
      texturepack-required=false
      content-log-file-enabled=false
      compression-threshold=1
      server-authoritative-movement=server-auth
      player-movement-score-threshold=20
      player-movement-distance-threshold=0.3
      player-movement-duration-threshold-in-ms=500
      correct-player-movement=false
      server-authoritative-block-breaking=false


================================================
FILE: config/bedrock/server-oci.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-be
spec:
  server:
    cloud: oci
    region: eu-frankfurt-1
    size: VM.Standard2.2
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft-be.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    edition: bedrock
    version: 1.26.0.2
    eula: true
    properties: |
      server-name=Civo Minecraft
      gamemode=survival
      force-gamemode=false
      difficulty=normal
      allow-cheats=false
      max-players=100
      online-mode=true
      white-list=false
      server-portv6=19133
      view-distance=32
      tick-distance=4
      player-idle-timeout=30
      max-threads=8
      level-name=Bedrock level
      level-seed=
      default-player-permission-level=member
      texturepack-required=false
      content-log-file-enabled=false
      compression-threshold=1
      server-authoritative-movement=server-auth
      player-movement-score-threshold=20
      player-movement-distance-threshold=0.3
      player-movement-duration-threshold-in-ms=500
      correct-player-movement=false
      server-authoritative-block-breaking=false


================================================
FILE: config/bedrock/server-ovh.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-be
spec:
  server:
    cloud: ovh
    region: DE1
    size: b2-7
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft-be.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    edition: bedrock
    version: 1.26.0.2
    eula: true
    properties: |
      server-name=OVHcloud Minecraft
      gamemode=survival
      force-gamemode=false
      difficulty=normal
      allow-cheats=false
      max-players=100
      online-mode=true
      white-list=false
      server-portv6=19133
      view-distance=32
      tick-distance=4
      player-idle-timeout=30
      max-threads=8
      level-name=Bedrock level
      level-seed=
      default-player-permission-level=member
      texturepack-required=false
      content-log-file-enabled=false
      compression-threshold=1
      server-authoritative-movement=server-auth
      player-movement-score-threshold=20
      player-movement-distance-threshold=0.3
      player-movement-duration-threshold-in-ms=500
      correct-player-movement=false
      server-authoritative-block-breaking=false


================================================
FILE: config/bedrock/server-scaleway.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-bedrock
spec:
  server:
    cloud: scaleway
    region: fr-par-1
    size: GP1-XS
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft-be.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    edition: bedrock
    version: 1.26.0.2
    eula: true
    properties: |
      server-name=Scaleway Minecraft
      gamemode=survival
      force-gamemode=false
      difficulty=normal
      allow-cheats=false
      max-players=100
      online-mode=true
      white-list=false
      server-portv6=19133
      view-distance=32
      tick-distance=4
      player-idle-timeout=30
      max-threads=8
      level-name=Bedrock level
      level-seed=
      default-player-permission-level=member
      texturepack-required=false
      content-log-file-enabled=false
      compression-threshold=1
      server-authoritative-movement=server-auth
      player-movement-score-threshold=20
      player-movement-distance-threshold=0.3
      player-movement-duration-threshold-in-ms=500
      correct-player-movement=false
      server-authoritative-block-breaking=false


================================================
FILE: config/bedrock/server-vexxhost.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-bedrock
spec:
  server:
    cloud: vexxhost
    region: am1
    size: "v3-starter-2"
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft-be.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    edition: bedrock
    version: 1.26.0.2
    eula: true
    properties: |
      server-name=VEXXHOST Minecraft
      gamemode=survival
      force-gamemode=false
      difficulty=normal
      allow-cheats=false
      max-players=100
      online-mode=true
      white-list=false
      server-portv6=19133
      view-distance=32
      tick-distance=4
      player-idle-timeout=30
      max-threads=8
      level-name=Bedrock level
      level-seed=
      default-player-permission-level=member
      texturepack-required=false
      content-log-file-enabled=false
      compression-threshold=1
      server-authoritative-movement=server-auth
      player-movement-score-threshold=20
      player-movement-distance-threshold=0.3
      player-movement-duration-threshold-in-ms=500
      correct-player-movement=false
      server-authoritative-block-breaking=false


================================================
FILE: config/bungeecord/proxy-civo.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftProxy
metadata:
  name: minecraft-proxy
spec:
  server:
    cloud: civo
    region: LON1
    size: g3.xsmall
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25577
  proxy:
    java:
      openjdk: 8
      xmx: 512M
      xms: 512M
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    type: bungeecord
    version: "1.21"

================================================
FILE: config/bungeecord/proxy-do.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftProxy
metadata:
  name: minecraft-proxy
spec:
  server:
    cloud: do
    region: fra1
    size: s-1vcpu-1gb
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25577
  proxy:
    java:
      openjdk: 8
      xmx: 512M
      xms: 512M
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    type: bungeecord
    version: "1.21"

================================================
FILE: config/bungeecord/proxy-vultr.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftProxy
metadata:
  name: minecraft-proxy
spec:
  server:
    cloud: vultr
    region: fra
    size: "vc2-1c-1gb"
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25577
  proxy:
    java:
      openjdk: 8
      xmx: 512M
      xms: 512M
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    type: bungeecord
    version: "1.21"

================================================
FILE: config/craftbukkit/server-akamai.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: akamai
    region: eu-central
    size: g6-standard-4
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: craftbukkit
    version: 1.21.11
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7aAkamai Connected Cloud \u00A7rMinecraft --- \u00A76CraftBukkit \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/craftbukkit/server-do.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: do
    region: fra1
    size: s-4vcpu-8gb
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: craftbukkit
    version: 1.21.11
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bDigitalOcean \u00A7rMinecraft --- \u00A76CraftBukkit \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/fabric/server-akamai.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: akamai
    region: eu-central
    size: g6-standard-4
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: fabric
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7aAkamai Connected Cloud \u00A7rMinecraft --- \u00A76Fabric \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/fabric/server-civo.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: civo
    region: LON1
    size: g3.large
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: fabric
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bCivo \u00A7rMinecraft --- \u00A76Fabric \u00A7redition
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/fabric/server-do.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: do
    region: fra1
    size: s-4vcpu-8gb
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: fabric
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bDigitalOcean \u00A7rMinecraft --- \u00A76Fabric \u00A7redition
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/forge/server-akamai.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: akamai
    region: eu-central
    size: g6-standard-4
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: forge
    version: 1.21.11-61.1.1
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7aAkamai Connected Cloud \u00A7rMinecraft --- \u00A76Forge \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/forge/server-civo.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: civo
    region: LON1
    size: g3.large
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: forge
    version: 1.21.11-61.1.1
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bCivo \u00A7rMinecraft --- \u00A76Forge \u00A7redition
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/forge/server-do.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  monitoring:
    enabled: true
  server:
    cloud: do
    region: fra1
    size: s-4vcpu-8gb
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: forge
    version: 1.21.11-61.1.1
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bDigitalOcean \u00A7rMinecraft --- \u00A76Forge \u00A7redition
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/java/server-akamai.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: akamai
    region: eu-central
    size: g6-standard-4
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7aAkamai Connected Cloud \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-aws-arm.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-arm
spec:
  monitoring:
    enabled: false
  server:
    cloud: aws
    region: eu-central-1
    size: c6g.xlarge
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
    arm: true
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A76AWS Arm \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-aws-spot.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-spot
spec:
  monitoring:
    enabled: false
  server:
    cloud: aws
    region: eu-central-1
    size: t3.xlarge
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
    spot: true
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A76AWS Spot \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-aws.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  monitoring:
    enabled: false
  server:
    cloud: aws
    region: eu-central-1
    size: t3.xlarge
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      allow-flight=false
      allow-nether=true
      broadcast-console-to-ops=true
      broadcast-rcon-to-ops=true
      difficulty=easy
      enable-command-block=false
      enable-jmx-monitoring=false
      enable-query=false
      enable-rcon=false
      enable-status=true
      enforce-secure-profile=true
      enforce-whitelist=false
      entity-broadcast-range-percentage=100
      force-gamemode=false
      function-permission-level=2
      gamemode=survival
      generate-structures=true
      generator-settings={}
      hardcore=false
      hide-online-players=false
      level-name=world
      level-seed=minectlrocks
      level-type=minecraft\:normal
      max-chained-neighbor-updates=1000000
      max-players=20
      max-tick-time=60000
      max-world-size=29999984
      motd=\u00A76AWS \u00A7rMinecraft --- \u00A76Java \u00A7redition
      network-compression-threshold=256
      online-mode=true
      op-permission-level=4
      player-idle-timeout=0
      prevent-proxy-connections=false
      previews-chat=false
      pvp=true
      query.port=25565
      rate-limit=0
      rcon.password=
      rcon.port=25575
      require-resource-pack=false
      resource-pack=
      resource-pack-prompt=
      resource-pack-sha1=
      server-ip=
      server-port=25565
      simulation-distance=10
      spawn-animals=true
      spawn-monsters=true
      spawn-npcs=true
      spawn-protection=16
      sync-chunk-writes=true
      text-filtering-config=
      use-native-transport=true
      view-distance=10
      white-list=false


================================================
FILE: config/java/server-azure-spot.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: azure
    region: westeurope
    size: Standard_D2_v4
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
    spot: true
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bAzure Spot \u00A7rMinecraft --- \u00A76Java \u00A7redition
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/java/server-azure.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: azure
    region: westeurope
    size: Standard_D2_v4
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bAzure \u00A7rMinecraft --- \u00A76Java \u00A7redition
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/java/server-civo.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: civo
    region: LON1
    size: g3.large
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival25565
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bCivo \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-do.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: do
    region: fra1
    size: s-4vcpu-8gb
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bDigitalOcean \u00A7rMinecraft --- \u00A76Java \u00A7redition
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/java/server-exoscale.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: exoscale
    region: de-fra-1
    size: medium
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival25565
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7cExoscale \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-fuga.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  monitoring:
    enabled: false
  server:
    cloud: fuga
    region: ams2
    size: s3.large
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A76Fuga Cloud \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-gce-arm.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-arm
spec:
  server:
    cloud: gce
    region: europe-west4-a
    size: t2a-standard-2
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
    arm: true
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A79GCE ARM \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-gce-spot.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: gce
    region: europe-west6-a
    size: e2-standard-2
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
    spot: true
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A79GCE \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-gce.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: gce
    region: europe-west6-a
    size: e2-standard-2
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A79GCE \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-hetzner-arm.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: hetzner
    region: fsn1
    size: cax21
    arm: true
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7cHetzner Arm \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/java/server-hetzner.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: hetzner
    region: nbg1
    size: cpx31
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7cHetzner \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/java/server-oci.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: oci
    region: eu-frankfurt-1
    size: VM.Standard2.2
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bOracle Cloud Infrastructure \u00A7rMinecraft --- \u00A76Java \u00A7reditio
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-ovh.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: ovh
    region: DE1
    size: b2-7
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7cOVHcloud \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-scaleway.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  monitoring:
    enabled: true
  server:
    cloud: scaleway
    region: fr-par-1
    size: GP1-XS
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7cScaleway \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-vexxhost.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: vexxhost
    region: am1
    size: "v3-starter-2"
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival25565
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A75VEXXHOST \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/java/server-vultr.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: vultr
    region: fra
    size: "vc2-2c-4gb"
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival25565
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bVultr \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/multipass/server-java.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: multipass
    port: 25565
    size: 1-4G
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
  minecraft:
    java:
      openjdk: 21
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: java
    version: "1.21.11"
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A76Multipass \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/multipass/server-papermc.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: multipass
    port: 25565
    size: 1-4G
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A76Multipass \u00A7rMinecraft --- \u00A76PaperMC \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/nukkit/server-azure.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: azure
    region: westeurope
    size: Standard_D2_v4
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    java:
      openjdk: 8
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: nukkit
    version: 1.0-SNAPSHOT
    eula: true
    properties: |
      motd=Azure Minecraft --- Nukkitx edition
      sub-motd=https://nukkitx.com
      server-ip=0.0.0.0
      view-distance=10
      white-list=off
      achievements=on
      announce-player-achievements=on
      spawn-protection=16
      max-players=20
      allow-flight=off
      spawn-animals=on
      spawn-mobs=on
      gamemode=0
      force-gamemode=off
      hardcore=off
      pvp=on
      difficulty=1
      generator-settings=
      level-name=world
      level-seed=
      level-type=DEFAULT
      allow-nether=on
      enable-query=on
      auto-save=on
      force-resources=off
      xbox-auth=on


================================================
FILE: config/nukkit/server-civo.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: civo
    region: LON1
    size: g3.large
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    java:
      openjdk: 8
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: nukkit
    version: 1.0-SNAPSHOT
    eula: true
    properties: |
      motd=Civo Minecraft --- Nukkitx edition
      sub-motd=https://nukkitx.com
      server-ip=0.0.0.0
      view-distance=10
      white-list=off
      achievements=on
      announce-player-achievements=on
      spawn-protection=16
      max-players=20
      allow-flight=off
      spawn-animals=on
      spawn-mobs=on
      gamemode=0
      force-gamemode=off
      hardcore=off
      pvp=on
      difficulty=1
      generator-settings=
      level-name=world
      level-seed=
      level-type=DEFAULT
      allow-nether=on
      enable-query=on
      auto-save=on
      force-resources=off
      xbox-auth=on


================================================
FILE: config/nukkit/server-do.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: do
    region: fra1
    size: s-4vcpu-8gb
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    java:
      openjdk: 8
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: nukkit
    version: 1.0-SNAPSHOT
    eula: true
    properties: |
      motd=DigitalOcean Minecraft --- Nukkitx edition
      sub-motd=https://nukkitx.com
      server-ip=0.0.0.0
      view-distance=10
      white-list=off
      achievements=on
      announce-player-achievements=on
      spawn-protection=16
      max-players=20
      allow-flight=off
      spawn-animals=on
      spawn-mobs=on
      gamemode=0
      force-gamemode=off
      hardcore=off
      pvp=on
      difficulty=1
      generator-settings=
      level-name=world
      level-seed=
      level-type=DEFAULT
      allow-nether=on
      enable-query=on
      auto-save=on
      force-resources=off
      xbox-auth=on


================================================
FILE: config/nukkit/server-fuga.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: fuga
    region: ams2
    size: s3.large
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    java:
      openjdk: 8
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: nukkit
    version: 1.0-SNAPSHOT
    eula: true
    properties: |
      motd=Fuga Cloud Minecraft --- Nukkitx edition
      sub-motd=https://nukkitx.com
      server-ip=0.0.0.0
      view-distance=10
      white-list=off
      achievements=on
      announce-player-achievements=on
      spawn-protection=16
      max-players=20
      allow-flight=off
      spawn-animals=on
      spawn-mobs=on
      gamemode=0
      force-gamemode=off
      hardcore=off
      pvp=on
      difficulty=1
      generator-settings=
      level-name=world
      level-seed=
      level-type=DEFAULT
      allow-nether=on
      enable-query=on
      auto-save=on
      force-resources=off
      xbox-auth=on


================================================
FILE: config/nukkit/server-gce.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: gce
    region: europe-west6-a
    size: e2-standard-2
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    java:
      openjdk: 8
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: nukkit
    version: 1.0-SNAPSHOT
    eula: true
    properties: |
      motd=GCE Minecraft --- Nukkitx edition
      sub-motd=https://nukkitx.com
      server-ip=0.0.0.0
      view-distance=10
      white-list=off
      achievements=on
      announce-player-achievements=on
      spawn-protection=16
      max-players=20
      allow-flight=off
      spawn-animals=on
      spawn-mobs=on
      gamemode=0
      force-gamemode=off
      hardcore=off
      pvp=on
      difficulty=1
      generator-settings=
      level-name=world
      level-seed=
      level-type=DEFAULT
      allow-nether=on
      enable-query=on
      auto-save=on
      force-resources=off
      xbox-auth=on


================================================
FILE: config/nukkit/server-ovh.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: ovh
    region: DE1
    size: b2-7
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 19132
  minecraft:
    java:
      openjdk: 8
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: nukkit
    version: 1.0-SNAPSHOT
    eula: true
    properties: |
      motd=GCE Minecraft --- Nukkitx edition
      sub-motd=https://nukkitx.com
      server-ip=0.0.0.0
      view-distance=10
      white-list=off
      achievements=on
      announce-player-achievements=on
      spawn-protection=16
      max-players=20
      allow-flight=off
      spawn-animals=on
      spawn-mobs=on
      gamemode=0
      force-gamemode=off
      hardcore=off
      pvp=on
      difficulty=1
      generator-settings=
      level-name=world
      level-seed=
      level-type=DEFAULT
      allow-nether=on
      enable-query=on
      auto-save=on
      force-resources=off
      xbox-auth=on


================================================
FILE: config/papermc/server-akamai.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: akamai
    region: eu-central
    size: g6-standard-4
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7aAkamai Connected Cloud \u00A7rMinecraft --- \u00A76PaperMC \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/papermc/server-aws-arm.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-arm
spec:
  server:
    cloud: aws
    region: eu-central-1
    size: c6g.xlarge
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
    arm: true
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A76AWS \u00A7rMinecraft Graviton --- \u00A76PaperMC \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/papermc/server-aws.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: aws
    region: eu-central-1
    size: t3.xlarge
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A76AWS \u00A7rMinecraft --- \u00A76PaperMC \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/papermc/server-azure-arm.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-arm
spec:
  server:
    cloud: azure
    region: westeurope
    size: Standard_D2ps_v5
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
    arm: true
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bAzure ARM \u00A7rMinecraft --- \u00A76PaperMC \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=
      


================================================
FILE: config/papermc/server-azure.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: azure
    region: westeurope
    size: Standard_D2_v4
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bAzure \u00A7rMinecraft --- \u00A76PaperMC \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/papermc/server-civo.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  monitoring:
    enabled: true
  server:
    cloud: civo
    region: LON1
    size: g3.large
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bCivo \u00A7rMinecraft --- \u00A76PaperMC \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=29999984


================================================
FILE: config/papermc/server-do.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  monitoring:
    enabled: true
  server:
    cloud: do
    region: fra1
    size: s-4vcpu-8gb
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bDigitalOcean \u00A7rMinecraft --- \u00A76PaperMC \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/papermc/server-exoscale.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: exoscale
    region: de-fra-1
    size: medium
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7cExoscale \u00A7rMinecraft --- \u00A76Java \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/papermc/server-fuga.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: fuga
    region: ams2
    size: s3.large
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A75Fuga Cloud \u00A7rMinecraft --- \u00A76PaperMC \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/papermc/server-gce-arm.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-arm
spec:
  server:
    cloud: gce
    region: europe-west4-a
    size: t2a-standard-2
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
    arm: true
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A79GCE ARM \u00A7rMinecraft --- \u00A76PaperMC \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=
      


================================================
FILE: config/papermc/server-hetzner.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  server:
    cloud: hetzner
    region: nbg1
    size: cpx31
    ssh:
      port: 2223
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7cHetzner \u00A7rMinecraft --- \u00A76PaperMC \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/papermc/server-oci-arm.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server-arm
spec:
  monitoring:
    enabled: true
  server:
    cloud: oci
    region: eu-frankfurt-1
    size: VM.Standard.A1.Flex
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
    arm: true
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack-prompt=
      gamemode=survival
      allow-nether=true
      enable-command-block=false
      sync-chunk-writes=true
      enable-query=false
      op-permission-level=4
      prevent-proxy-connections=false
      resource-pack=
      entity-broadcast-range-percentage=100
      level-name=world
      player-idle-timeout=0
      motd=\u00A7bOracle Cloud Infrastructure \u00A7rMinecraft --- \u00A76PaperMC \u00A7redition
      query.port=25565
      force-gamemode=false
      rate-limit=0
      hardcore=false
      white-list=false
      broadcast-console-to-ops=true
      pvp=true
      spawn-npcs=true
      spawn-animals=true
      snooper-enabled=true
      difficulty=easy
      function-permission-level=2
      network-compression-threshold=256
      text-filtering-config=
      require-resource-pack=false
      spawn-monsters=true
      max-tick-time=60000
      enforce-whitelist=false
      use-native-transport=true
      max-players=100
      resource-pack-sha1=
      spawn-protection=16
      online-mode=true
      enable-status=true
      allow-flight=false
      max-world-size=


================================================
FILE: config/papermc/server-oci.yaml
================================================
apiVersion: minectl.ediri.io/v1alpha1
kind: MinecraftServer
metadata:
  name: minecraft-server
spec:
  monitoring:
    enabled: true
  server:
    cloud: oci
    region: eu-frankfurt-1
    size: VM.Standard2.2
    ssh:
      port: 22
      publickeyfile: "/Users/dirien/Tools/repos/stackit-minecraft/minecraft/ssh/minecraft.pub"
      fail2ban:
        bantime: 1000
        maxretry: 3
    port: 25565
  minecraft:
    java:
      openjdk: 17
      xmx: 2G
      xms: 2G
      rcon:
        password: test
        port: 25575
        enabled: true
        broadcast: true
    edition: papermc
    version: 1.21.11-117
    eula: true
    properties: |
      level-seed=minectlrocks
      view-distance=10
      enable-jmx-monitoring=false
      server-ip=
      resource-pack
Download .txt
gitextract_l55wna43/

├── .dockerignore
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.yaml
│   │   ├── config.yml
│   │   └── feature.yaml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yaml
│   └── workflows/
│       ├── ci.yaml
│       ├── lock.yml
│       └── ossf-scorecard-action.yaml
├── .gitignore
├── .golangci.yaml
├── .goreleaser.yaml
├── .pre-commit-config.yaml
├── AGENTS.md
├── CONTRIBUTING.md
├── DCO
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── artifacthub-repo.yml
├── cmd/
│   └── minectl/
│       ├── AGENTS.md
│       ├── create.go
│       ├── delete.go
│       ├── list.go
│       ├── minectl.go
│       ├── plugins.go
│       ├── rcon.go
│       ├── update.go
│       └── wizard.go
├── config/
│   ├── bedrock/
│   │   ├── server-akamai.yaml
│   │   ├── server-aws.yaml
│   │   ├── server-civo.yaml
│   │   ├── server-do.yaml
│   │   ├── server-exoscale.yaml
│   │   ├── server-gce.yaml
│   │   ├── server-hetzner.yaml
│   │   ├── server-oci.yaml
│   │   ├── server-ovh.yaml
│   │   ├── server-scaleway.yaml
│   │   └── server-vexxhost.yaml
│   ├── bungeecord/
│   │   ├── proxy-civo.yaml
│   │   ├── proxy-do.yaml
│   │   └── proxy-vultr.yaml
│   ├── craftbukkit/
│   │   ├── server-akamai.yaml
│   │   └── server-do.yaml
│   ├── fabric/
│   │   ├── server-akamai.yaml
│   │   ├── server-civo.yaml
│   │   └── server-do.yaml
│   ├── forge/
│   │   ├── server-akamai.yaml
│   │   ├── server-civo.yaml
│   │   └── server-do.yaml
│   ├── java/
│   │   ├── server-akamai.yaml
│   │   ├── server-aws-arm.yaml
│   │   ├── server-aws-spot.yaml
│   │   ├── server-aws.yaml
│   │   ├── server-azure-spot.yaml
│   │   ├── server-azure.yaml
│   │   ├── server-civo.yaml
│   │   ├── server-do.yaml
│   │   ├── server-exoscale.yaml
│   │   ├── server-fuga.yaml
│   │   ├── server-gce-arm.yaml
│   │   ├── server-gce-spot.yaml
│   │   ├── server-gce.yaml
│   │   ├── server-hetzner-arm.yaml
│   │   ├── server-hetzner.yaml
│   │   ├── server-oci.yaml
│   │   ├── server-ovh.yaml
│   │   ├── server-scaleway.yaml
│   │   ├── server-vexxhost.yaml
│   │   └── server-vultr.yaml
│   ├── multipass/
│   │   ├── server-java.yaml
│   │   └── server-papermc.yaml
│   ├── nukkit/
│   │   ├── server-azure.yaml
│   │   ├── server-civo.yaml
│   │   ├── server-do.yaml
│   │   ├── server-fuga.yaml
│   │   ├── server-gce.yaml
│   │   └── server-ovh.yaml
│   ├── papermc/
│   │   ├── server-akamai.yaml
│   │   ├── server-aws-arm.yaml
│   │   ├── server-aws.yaml
│   │   ├── server-azure-arm.yaml
│   │   ├── server-azure.yaml
│   │   ├── server-civo.yaml
│   │   ├── server-do.yaml
│   │   ├── server-exoscale.yaml
│   │   ├── server-fuga.yaml
│   │   ├── server-gce-arm.yaml
│   │   ├── server-hetzner.yaml
│   │   ├── server-oci-arm.yaml
│   │   ├── server-oci.yaml
│   │   ├── server-scaleway.yaml
│   │   ├── server-vexxhost.yaml
│   │   └── server-vultr.yaml
│   ├── powernukkit/
│   │   ├── server-azure.yaml
│   │   └── server-civo.yaml
│   ├── purpur/
│   │   ├── server-akamai.yaml
│   │   ├── server-aws-arm.yaml
│   │   ├── server-aws.yaml
│   │   ├── server-azure-arm.yaml
│   │   ├── server-azure.yaml
│   │   ├── server-civo.yaml
│   │   ├── server-do.yaml
│   │   ├── server-exoscale.yaml
│   │   ├── server-fuga.yaml
│   │   ├── server-gce-arm.yaml
│   │   ├── server-hetzner.yaml
│   │   ├── server-oci-arm.yaml
│   │   ├── server-oci.yaml
│   │   ├── server-scaleway.yaml
│   │   ├── server-vexxhost.yaml
│   │   └── server-vultr.yaml
│   ├── spigot/
│   │   ├── server-akamai.yaml
│   │   ├── server-azure.yaml
│   │   └── server-do.yaml
│   ├── velocity/
│   │   ├── proxy-do.yaml
│   │   └── proxy-gce.yaml
│   └── waterfall/
│       ├── proxy-azure.yaml
│       ├── proxy-do.yaml
│       └── proxy-vultr.yaml
├── development.md
├── docs/
│   ├── architecture.md
│   ├── authentication.md
│   ├── cli-reference.md
│   ├── colored-motd.md
│   ├── configuration.md
│   ├── dashboard/
│   │   └── tutorial.json
│   ├── editions.md
│   ├── features.md
│   ├── getting-started-civo-bedrock.md
│   ├── getting-started-civo.md
│   ├── getting-started-exoscale.md
│   ├── getting-started-gce.md
│   ├── getting-started-scaleway.md
│   ├── minectl.drawio
│   ├── multi-server-monitoring-civo.md
│   ├── running-minecraft-luckyblocks-budget-scaleway.md
│   └── skyblock-papermc-hetzner.md
├── go.mod
├── go.sum
├── internal/
│   ├── logging/
│   │   └── logging.go
│   ├── manifest/
│   │   ├── manifest.go
│   │   ├── proxy.json
│   │   └── server.json
│   ├── provisioner/
│   │   └── provisioner.go
│   ├── rcon/
│   │   └── rcon.go
│   └── ui/
│       ├── form.go
│       ├── spinner.go
│       ├── spinner_test.go
│       ├── table.go
│       ├── table_test.go
│       ├── ui.go
│       └── ui_test.go
├── main.go
└── minectl-skill/
    ├── SKILL.md
    ├── evals/
    │   └── evals.json
    └── references/
        ├── cli-commands.md
        ├── cloud-providers.md
        └── manifest-schema.md
Download .txt
SYMBOL INDEX (132 symbols across 20 files)

FILE: cmd/minectl/create.go
  function init (line 13) | func init() {
  function runCreate (line 29) | func runCreate(cmd *cobra.Command, _ []string) error {

FILE: cmd/minectl/delete.go
  function init (line 10) | func init() {
  function runDelete (line 29) | func runDelete(cmd *cobra.Command, _ []string) error {

FILE: cmd/minectl/list.go
  function init (line 12) | func init() {
  function runList (line 28) | func runList(cmd *cobra.Command, _ []string) error {

FILE: cmd/minectl/minectl.go
  function createUpdatePluginProvisioner (line 34) | func createUpdatePluginProvisioner(cmd *cobra.Command) (provisioner.Prov...
  function isDevVersion (line 67) | func isDevVersion(s semver.Version) bool {
  function isBrewInstall (line 76) | func isBrewInstall(exe string) (bool, error) {
  function runPostCommandHooks (line 119) | func runPostCommandHooks(c *cobra.Command, args []string) error {
  function RunFunc (line 141) | func RunFunc(run func(cmd *cobra.Command, args []string) error) func(*co...
  function getUpgradeCommand (line 155) | func getUpgradeCommand() string {
  function getUpgradeMessage (line 175) | func getUpgradeMessage(latestVer, current *semver.Version) *string {
  function getCLIVersionInfo (line 186) | func getCLIVersionInfo(current *semver.Version) (*semver.Version, error) {
  function checkForUpdate (line 203) | func checkForUpdate() *string {
  function getVersion (line 228) | func getVersion() string {
  function parseBaseCommand (line 235) | func parseBaseCommand(_ *cobra.Command, _ []string) {
  function makeAppDirectoryIfNotExists (line 295) | func makeAppDirectoryIfNotExists() {
  function GetHomeFolder (line 309) | func GetHomeFolder() string {
  function init (line 317) | func init() {
  function Execute (line 335) | func Execute(version, gitCommit, date string) error {
  function runMineCtl (line 343) | func runMineCtl(cmd *cobra.Command, _ []string) {
  function printLogo (line 351) | func printLogo() {
  constant minectlFigletStr (line 356) | minectlFigletStr = `

FILE: cmd/minectl/plugins.go
  function init (line 7) | func init() {
  type ModType (line 18) | type ModType
  constant Forge (line 21) | Forge  ModType = "forge"
  constant Fabric (line 22) | Fabric ModType = "fabric"
  type Plugin (line 25) | type Plugin struct
  function runPlugin (line 56) | func runPlugin(cmd *cobra.Command, _ []string) error {

FILE: cmd/minectl/rcon.go
  function init (line 9) | func init() {
  function runRCON (line 26) | func runRCON(cmd *cobra.Command, _ []string) error {

FILE: cmd/minectl/update.go
  function init (line 7) | func init() {
  function runUpdate (line 25) | func runUpdate(cmd *cobra.Command, _ []string) error {

FILE: cmd/minectl/wizard.go
  function init (line 28) | func init() {
  function isBedrockEdition (line 77) | func isBedrockEdition(edition string) bool {
  function runWizard (line 81) | func runWizard(cmd *cobra.Command, _ []string) error {

FILE: internal/logging/logging.go
  type MinectlLogging (line 13) | type MinectlLogging struct
    method Error (line 52) | func (l *MinectlLogging) Error(msg error) {
    method RawMessage (line 60) | func (l *MinectlLogging) RawMessage(msg string) {
    method PrintMixedGreen (line 68) | func (l *MinectlLogging) PrintMixedGreen(format, value string) {
    method IsHeadless (line 78) | func (l *MinectlLogging) IsHeadless() bool {
  function NewLogging (line 17) | func NewLogging(verbose, logEncoding string, headless bool) (*MinectlLog...

FILE: internal/manifest/manifest.go
  type MinecraftServerManifest (line 18) | type MinecraftServerManifest struct
  constant MinecraftProxy (line 23) | MinecraftProxy  = "MinecraftProxy"
  constant MinecraftServer (line 24) | MinecraftServer = "MinecraftServer"
  function validate (line 33) | func validate(manifest []byte) error {
  function checkNamePattern (line 61) | func checkNamePattern(serverName string) error {
  function checkSSHPort (line 69) | func checkSSHPort(port int) error {
  function NewMinecraftResource (line 76) | func NewMinecraftResource(manifestPath string) (*model.MinecraftResource...

FILE: internal/provisioner/provisioner.go
  constant minecraftProxyTitle (line 36) | minecraftProxyTitle                 = "Minecraft %s Proxy"
  constant minecraftServerTitle (line 37) | minecraftServerTitle                = "Minecraft %s edition"
  constant minecraftSelectedCloudProviderTitle (line 38) | minecraftSelectedCloudProviderTitle = "Using cloud provider %s"
  constant minecraftListServersTitle (line 39) | minecraftListServersTitle           = "Listing all servers"
  constant minecraftServerDeletingTitle (line 41) | minecraftServerDeletingTitle  = "Deleting server (%s)..."
  constant minecraftServerDeleteTitle (line 42) | minecraftServerDeleteTitle    = "Server (%s) deleted."
  constant minecraftServerNotDeleteTitle (line 43) | minecraftServerNotDeleteTitle = "Server (%s) not deleted."
  constant minecraftServerCreatingTitle (line 45) | minecraftServerCreatingTitle  = "Creating server (%s)..."
  constant minecraftServerCreateTitle (line 46) | minecraftServerCreateTitle    = "Server (%s) created."
  constant minecraftServerNotCreateTitle (line 47) | minecraftServerNotCreateTitle = "Server (%s) not created."
  constant minecraftServerStartingTitle (line 49) | minecraftServerStartingTitle = "Starting server..."
  constant minecraftServerStartTitle (line 50) | minecraftServerStartTitle    = "Server successfully started."
  constant minecraftServerNotStartTitle (line 51) | minecraftServerNotStartTitle = "Server failed to start."
  constant minecraftServerUpdatingTitle (line 53) | minecraftServerUpdatingTitle  = "Updating server (%s)..."
  constant minecraftServerUpdateTitle (line 54) | minecraftServerUpdateTitle    = "Server (%s) updated."
  constant minecraftServerNotUpdateTitle (line 55) | minecraftServerNotUpdateTitle = "Server (%s) update failed."
  constant startCheckCount (line 57) | startCheckCount = 50
  type MinectlProvisionerOpts (line 60) | type MinectlProvisionerOpts struct
  type MinectlProvisionerListOpts (line 66) | type MinectlProvisionerListOpts struct
  type MinectlProvisioner (line 71) | type MinectlProvisioner struct
    method GetServer (line 87) | func (p *MinectlProvisioner) GetServer() (*automation.ResourceResults,...
    method DoRCON (line 91) | func (p *MinectlProvisioner) DoRCON() error {
    method UploadPlugin (line 101) | func (p *MinectlProvisioner) UploadPlugin(plugin, destination string) ...
    method UpdateServer (line 112) | func (p *MinectlProvisioner) UpdateServer() error {
    method waitForMinecraftServerReady (line 123) | func (p *MinectlProvisioner) waitForMinecraftServerReady(server *autom...
    method CreateServer (line 152) | func (p *MinectlProvisioner) CreateServer(wait bool) (*automation.Reso...
    method ListServer (line 172) | func (p *MinectlProvisioner) ListServer() ([]automation.ResourceResult...
    method DeleteServer (line 176) | func (p *MinectlProvisioner) DeleteServer() error {
  type Provisioner (line 77) | type Provisioner interface
  function ListProvisioner (line 186) | func ListProvisioner(options *MinectlProvisionerListOpts, u *ui.UI) (*Mi...
  function getProvisioner (line 200) | func getProvisioner(provider, region string) (automation.Automation, err...
  function NewProvisioner (line 298) | func NewProvisioner(options *MinectlProvisionerOpts, u *ui.UI) (*Minectl...

FILE: internal/rcon/rcon.go
  type RCON (line 10) | type RCON struct
    method RunPrompt (line 21) | func (r *RCON) RunPrompt() {
    method executor (line 26) | func (r *RCON) executor(t string) {
  type RCONer (line 17) | type RCONer interface
  function completer (line 50) | func completer(_ prompt.Document) []prompt.Suggest {
  function NewRCON (line 54) | func NewRCON(server, passwort string, port int) *RCON {

FILE: internal/ui/form.go
  function FormTheme (line 12) | func FormTheme() *huh.Theme {
  function RunForm (line 32) | func RunForm(form *huh.Form, headless bool) error {
  function Confirm (line 41) | func Confirm(title string) (bool, error) {

FILE: internal/ui/spinner.go
  type Spinner (line 16) | type Spinner struct
    method Start (line 76) | func (s *Spinner) Start() {
    method Stop (line 106) | func (s *Spinner) Stop(err error) {
  type spinnerModel (line 28) | type spinnerModel struct
    method Init (line 34) | func (m spinnerModel) Init() tea.Cmd {
    method Update (line 38) | func (m spinnerModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
    method View (line 56) | func (m spinnerModel) View() string {
  type quitMsg (line 64) | type quitMsg struct
  function NewSpinner (line 67) | func NewSpinner(message string, u *UI) *Spinner {

FILE: internal/ui/spinner_test.go
  function newTestUI (line 10) | func newTestUI(t *testing.T, headless bool) *UI {
  function TestNewSpinner (line 19) | func TestNewSpinner(t *testing.T) {
  function TestSpinnerHeadlessStartStop (line 47) | func TestSpinnerHeadlessStartStop(t *testing.T) {
  function TestSpinnerStopWithoutStart (line 78) | func TestSpinnerStopWithoutStart(t *testing.T) {

FILE: internal/ui/table.go
  type TableStyle (line 13) | type TableStyle struct
  function DefaultTableStyle (line 20) | func DefaultTableStyle() TableStyle {
  type Table (line 35) | type Table struct
    method Append (line 53) | func (t *Table) Append(row []string) {
    method buildTable (line 58) | func (t *Table) buildTable() *table.Table {
    method Render (line 76) | func (t *Table) Render() {
    method renderPlain (line 85) | func (t *Table) renderPlain() {
    method String (line 93) | func (t *Table) String() string {
    method RenderToWriter (line 108) | func (t *Table) RenderToWriter(w io.Writer) {
  function NewTable (line 43) | func NewTable(u *UI, headers ...string) *Table {

FILE: internal/ui/table_test.go
  function TestTableAppend (line 9) | func TestTableAppend(t *testing.T) {
  function TestTableString (line 20) | func TestTableString(t *testing.T) {
  function TestTableRenderToWriter (line 76) | func TestTableRenderToWriter(t *testing.T) {
  function TestDefaultTableStyle (line 89) | func TestDefaultTableStyle(t *testing.T) {

FILE: internal/ui/ui.go
  type UI (line 21) | type UI struct
    method IsHeadless (line 35) | func (u *UI) IsHeadless() bool {
    method Logging (line 40) | func (u *UI) Logging() *logging.MinectlLogging {
    method Info (line 45) | func (u *UI) Info(msg string) {
    method Success (line 54) | func (u *UI) Success(msg string) {
    method ErrorMsg (line 63) | func (u *UI) ErrorMsg(err error) {
    method Warn (line 72) | func (u *UI) Warn(msg string) {
  function NewUI (line 27) | func NewUI(headless bool, log *logging.MinectlLogging) *UI {

FILE: internal/ui/ui_test.go
  function TestUI (line 8) | func TestUI(t *testing.T) {
  function TestInfo (line 31) | func TestInfo(t *testing.T) {
  function TestSuccess (line 49) | func TestSuccess(t *testing.T) {
  function TestErrorMsg (line 67) | func TestErrorMsg(t *testing.T) {
  function TestWarn (line 85) | func TestWarn(t *testing.T) {

FILE: main.go
  function main (line 16) | func main() {
Condensed preview — 163 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (598K chars).
[
  {
    "path": ".dockerignore",
    "chars": 1966,
    "preview": "### JetBrains template\n# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, W"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 15,
    "preview": "*       @dirien"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yaml",
    "chars": 1549,
    "preview": "name: Bug Report\ndescription: File a bug report\nlabels: [ bug, triage ]\nassignees:\n  - dirien\nbody:\n  - type: markdown\n "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 29,
    "preview": "blank_issues_enabled: false\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature.yaml",
    "chars": 1768,
    "preview": "name: Feature Request\ndescription: Request a new feature and/or enhancement to an existing feature\nlabels: [enhancement,"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 339,
    "preview": "### Thank you for making `minectl 🗺` better\n\nPlease reference the issue this PR is fixing.\n\n*Also verify you have:*\n\n* ["
  },
  {
    "path": ".github/dependabot.yaml",
    "chars": 374,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n  "
  },
  {
    "path": ".github/workflows/ci.yaml",
    "chars": 2537,
    "preview": "name: build-binary\n\non:\n  push:\n    branches:\n      - '*'\n    tags:\n      - '*'\n  pull_request:\n\npermissions: read-all\n\n"
  },
  {
    "path": ".github/workflows/lock.yml",
    "chars": 853,
    "preview": "name: lock-inactive\n\non:\n  schedule:\n    - cron: '0 * * * *'\n\npermissions:\n  contents: read\n\njobs:\n  lock:\n    permissio"
  },
  {
    "path": ".github/workflows/ossf-scorecard-action.yaml",
    "chars": 2090,
    "preview": "name: scorecards-supply-chain-security\non:\n  # Only the default branch is supported.\n  branch_protection_rule:\n  schedul"
  },
  {
    "path": ".gitignore",
    "chars": 207,
    "preview": ".idea\n**/passwords\n**/server.properties\ntmp*/\nbin/\ndist/\ncoverage.out\nrevive.log\n**/.DS_Store\n**/key.json\n/minectl\n**/az"
  },
  {
    "path": ".golangci.yaml",
    "chars": 2238,
    "preview": "version: \"2\"\n\nformatters:\n  enable:\n    - gofumpt\n    - goimports\n\nlinters:\n  enable:\n    # bugs\n    - bodyclose\n    - d"
  },
  {
    "path": ".goreleaser.yaml",
    "chars": 5095,
    "preview": "version: 2\nproject_name: minectl\nsnapshot:\n  version_template: '{{ .Version }}-SNAPSHOT'\nbefore:\n  hooks:\n    - go mod t"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 112,
    "preview": "repos:\n  - repo: https://github.com/dirien/pre-commit-hooks\n    rev: v0.1.0\n    hooks:\n      - id: golangci-lint"
  },
  {
    "path": "AGENTS.md",
    "chars": 7726,
    "preview": "<!-- FOR AI AGENTS - Human readability is a side effect, not a goal -->\n<!-- Managed by agent: keep sections and order; "
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2661,
    "preview": "# Contributing to minectl 🗺\n\nWelcome, and thank you for considering contributing to minectl 🗺. We encourage you to help "
  },
  {
    "path": "DCO",
    "chars": 1421,
    "preview": "Developer Certificate of Origin\nVersion 1.1\n\nCopyright (C) 2004, 2006 The Linux Foundation and its contributors.\n660 Yor"
  },
  {
    "path": "Dockerfile",
    "chars": 181,
    "preview": "# Dockerfile\nFROM cgr.dev/chainguard/static@sha256:853bfd4495abb4b65ede8fc9332513ca2626235589c2cef59b4fce5082d0836d\nCOPY"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "Makefile",
    "chars": 1805,
    "preview": "NAME          := minectl\nFILES         := $(shell find * -type f ! -path 'vendor/*' -name '*.go')\n.DEFAULT_GOAL := help\n"
  },
  {
    "path": "README.md",
    "chars": 10267,
    "preview": "## New - 1.21.11 support\n\n`minectl 🗺`️️ supports the `Minecraft 1.21.11` version\n\n<img alt=\"logo\" src=\"docs/img/1_21_11_"
  },
  {
    "path": "SECURITY.md",
    "chars": 1633,
    "preview": "# Security Policies and Procedures\n\nThis document outlines security procedures and general policies for the `minectl 🗺`\n"
  },
  {
    "path": "artifacthub-repo.yml",
    "chars": 136,
    "preview": "# ID is for the OCI Image\nrepositoryID: 71cfb056-f17b-4d72-8e10-a3437303a257\nowners:\n  - name: Engin Diri\n    email: eng"
  },
  {
    "path": "cmd/minectl/AGENTS.md",
    "chars": 4335,
    "preview": "<!-- Managed by agent: keep sections and order; edit content, not structure. Last updated: 2026-03-21 -->\n\n# AGENTS.md —"
  },
  {
    "path": "cmd/minectl/create.go",
    "chars": 2033,
    "preview": "package minectl\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/dirien/minectl/internal/provisioner\"\n\t\"github.com/dirien/minectl/internal"
  },
  {
    "path": "cmd/minectl/delete.go",
    "chars": 1787,
    "preview": "package minectl\n\nimport (\n\t\"github.com/dirien/minectl/internal/provisioner\"\n\t\"github.com/dirien/minectl/internal/ui\"\n\t\"g"
  },
  {
    "path": "cmd/minectl/list.go",
    "chars": 1711,
    "preview": "package minectl\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/dirien/minectl/internal/provisioner\"\n\t\"github.com/dirien/minectl/internal"
  },
  {
    "path": "cmd/minectl/minectl.go",
    "chars": 8700,
    "preview": "package minectl\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"runtime\"\n\t\""
  },
  {
    "path": "cmd/minectl/plugins.go",
    "chars": 1885,
    "preview": "package minectl\n\nimport (\n\t\"github.com/spf13/cobra\"\n)\n\nfunc init() {\n\tpluginCmd.Flags().StringP(\"filename\", \"f\", \"\", \"Lo"
  },
  {
    "path": "cmd/minectl/rcon.go",
    "chars": 1301,
    "preview": "package minectl\n\nimport (\n\t\"github.com/dirien/minectl/internal/provisioner\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/spf13/"
  },
  {
    "path": "cmd/minectl/update.go",
    "chars": 862,
    "preview": "package minectl\n\nimport (\n\t\"github.com/spf13/cobra\"\n)\n\nfunc init() {\n\tupdateCmd.Flags().StringP(\"filename\", \"f\", \"\", \"Lo"
  },
  {
    "path": "cmd/minectl/wizard.go",
    "chars": 7623,
    "preview": "package minectl\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/charmbracelet/huh\"\n\t\"gith"
  },
  {
    "path": "config/bedrock/server-akamai.yaml",
    "chars": 1263,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-be\nspec:\n  server:\n    cl"
  },
  {
    "path": "config/bedrock/server-aws.yaml",
    "chars": 1209,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-be\nspec:\n  server:\n    cl"
  },
  {
    "path": "config/bedrock/server-civo.yaml",
    "chars": 1253,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-be\nspec:\n  server:\n    cl"
  },
  {
    "path": "config/bedrock/server-do.yaml",
    "chars": 1244,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-be\nspec:\n  server:\n    cl"
  },
  {
    "path": "config/bedrock/server-exoscale.yaml",
    "chars": 1245,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-be\nspec:\n  server:\n    cl"
  },
  {
    "path": "config/bedrock/server-gce.yaml",
    "chars": 1248,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-be\nspec:\n  server:\n    cl"
  },
  {
    "path": "config/bedrock/server-hetzner.yaml",
    "chars": 1238,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-be\nspec:\n  server:\n    cl"
  },
  {
    "path": "config/bedrock/server-oci.yaml",
    "chars": 1250,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-be\nspec:\n  server:\n    cl"
  },
  {
    "path": "config/bedrock/server-ovh.yaml",
    "chars": 1233,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-be\nspec:\n  server:\n    cl"
  },
  {
    "path": "config/bedrock/server-scaleway.yaml",
    "chars": 1250,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-bedrock\nspec:\n  server:\n "
  },
  {
    "path": "config/bedrock/server-vexxhost.yaml",
    "chars": 1253,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-bedrock\nspec:\n  server:\n "
  },
  {
    "path": "config/bungeecord/proxy-civo.yaml",
    "chars": 564,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftProxy\nmetadata:\n  name: minecraft-proxy\nspec:\n  server:\n    cloud: "
  },
  {
    "path": "config/bungeecord/proxy-do.yaml",
    "chars": 564,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftProxy\nmetadata:\n  name: minecraft-proxy\nspec:\n  server:\n    cloud: "
  },
  {
    "path": "config/bungeecord/proxy-vultr.yaml",
    "chars": 567,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftProxy\nmetadata:\n  name: minecraft-proxy\nspec:\n  server:\n    cloud: "
  },
  {
    "path": "config/craftbukkit/server-akamai.yaml",
    "chars": 1851,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/craftbukkit/server-do.yaml",
    "chars": 1821,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/fabric/server-akamai.yaml",
    "chars": 1843,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/fabric/server-civo.yaml",
    "chars": 1781,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/fabric/server-do.yaml",
    "chars": 1790,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/forge/server-akamai.yaml",
    "chars": 1846,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/forge/server-civo.yaml",
    "chars": 1784,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/forge/server-do.yaml",
    "chars": 1825,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/java/server-akamai.yaml",
    "chars": 1841,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-aws-arm.yaml",
    "chars": 1871,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-arm\nspec:\n  monitoring:\n "
  },
  {
    "path": "config/java/server-aws-spot.yaml",
    "chars": 1873,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-spot\nspec:\n  monitoring:\n"
  },
  {
    "path": "config/java/server-aws.yaml",
    "chars": 2202,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/java/server-azure-spot.yaml",
    "chars": 1811,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-azure.yaml",
    "chars": 1791,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-civo.yaml",
    "chars": 1813,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-do.yaml",
    "chars": 1786,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-exoscale.yaml",
    "chars": 1823,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-fuga.yaml",
    "chars": 1847,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/java/server-gce-arm.yaml",
    "chars": 1846,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-arm\nspec:\n  server:\n    c"
  },
  {
    "path": "config/java/server-gce-spot.yaml",
    "chars": 1836,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-gce.yaml",
    "chars": 1823,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-hetzner-arm.yaml",
    "chars": 1823,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-hetzner.yaml",
    "chars": 1805,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-oci.yaml",
    "chars": 1847,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-ovh.yaml",
    "chars": 1808,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-scaleway.yaml",
    "chars": 1850,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/java/server-vexxhost.yaml",
    "chars": 1828,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/java/server-vultr.yaml",
    "chars": 1820,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/multipass/server-java.yaml",
    "chars": 1789,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/multipass/server-papermc.yaml",
    "chars": 1797,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/nukkit/server-azure.yaml",
    "chars": 1233,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/nukkit/server-civo.yaml",
    "chars": 1219,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/nukkit/server-do.yaml",
    "chars": 1228,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/nukkit/server-fuga.yaml",
    "chars": 1225,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/nukkit/server-gce.yaml",
    "chars": 1232,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/nukkit/server-ovh.yaml",
    "chars": 1212,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/papermc/server-akamai.yaml",
    "chars": 1847,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/papermc/server-aws-arm.yaml",
    "chars": 1843,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-arm\nspec:\n  server:\n    c"
  },
  {
    "path": "config/papermc/server-aws.yaml",
    "chars": 1815,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/papermc/server-azure-arm.yaml",
    "chars": 1855,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-arm\nspec:\n  server:\n    c"
  },
  {
    "path": "config/papermc/server-azure.yaml",
    "chars": 1824,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/papermc/server-civo.yaml",
    "chars": 1848,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/papermc/server-do.yaml",
    "chars": 1849,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/papermc/server-exoscale.yaml",
    "chars": 1815,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/papermc/server-fuga.yaml",
    "chars": 1814,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/papermc/server-gce-arm.yaml",
    "chars": 1853,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-arm\nspec:\n  server:\n    c"
  },
  {
    "path": "config/papermc/server-hetzner.yaml",
    "chars": 1813,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/papermc/server-oci-arm.yaml",
    "chars": 1901,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-arm\nspec:\n  monitoring:\n "
  },
  {
    "path": "config/papermc/server-oci.yaml",
    "chars": 1878,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/papermc/server-scaleway.yaml",
    "chars": 1849,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/papermc/server-vexxhost.yaml",
    "chars": 1821,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/papermc/server-vultr.yaml",
    "chars": 1845,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/powernukkit/server-azure.yaml",
    "chars": 1236,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/powernukkit/server-civo.yaml",
    "chars": 1223,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/purpur/server-akamai.yaml",
    "chars": 1846,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/purpur/server-aws-arm.yaml",
    "chars": 1842,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-arm\nspec:\n  server:\n    c"
  },
  {
    "path": "config/purpur/server-aws.yaml",
    "chars": 1814,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/purpur/server-azure-arm.yaml",
    "chars": 1854,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-arm\nspec:\n  server:\n    c"
  },
  {
    "path": "config/purpur/server-azure.yaml",
    "chars": 1823,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/purpur/server-civo.yaml",
    "chars": 1847,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/purpur/server-do.yaml",
    "chars": 1848,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/purpur/server-exoscale.yaml",
    "chars": 1815,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/purpur/server-fuga.yaml",
    "chars": 1813,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/purpur/server-gce-arm.yaml",
    "chars": 1852,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-arm\nspec:\n  server:\n    c"
  },
  {
    "path": "config/purpur/server-hetzner.yaml",
    "chars": 1812,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/purpur/server-oci-arm.yaml",
    "chars": 1900,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server-arm\nspec:\n  monitoring:\n "
  },
  {
    "path": "config/purpur/server-oci.yaml",
    "chars": 1877,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/purpur/server-scaleway.yaml",
    "chars": 1848,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/purpur/server-vexxhost.yaml",
    "chars": 1820,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/purpur/server-vultr.yaml",
    "chars": 1844,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  monitoring:\n    e"
  },
  {
    "path": "config/spigot/server-akamai.yaml",
    "chars": 1863,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/spigot/server-azure.yaml",
    "chars": 1795,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/spigot/server-do.yaml",
    "chars": 1833,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftServer\nmetadata:\n  name: minecraft-server\nspec:\n  server:\n    cloud"
  },
  {
    "path": "config/velocity/proxy-do.yaml",
    "chars": 575,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftProxy\nmetadata:\n  name: minecraft-proxy\nspec:\n  server:\n    cloud: "
  },
  {
    "path": "config/velocity/proxy-gce.yaml",
    "chars": 487,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftProxy\nmetadata:\n  name: minecraft-proxy\nspec:\n  server:\n    cloud: "
  },
  {
    "path": "config/waterfall/proxy-azure.yaml",
    "chars": 541,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftProxy\nmetadata:\n  name: minecraft-proxy\nspec:\n  server:\n    cloud: "
  },
  {
    "path": "config/waterfall/proxy-do.yaml",
    "chars": 565,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftProxy\nmetadata:\n  name: minecraft-proxy\nspec:\n  server:\n    cloud: "
  },
  {
    "path": "config/waterfall/proxy-vultr.yaml",
    "chars": 568,
    "preview": "apiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftProxy\nmetadata:\n  name: minecraft-proxy\nspec:\n  server:\n    cloud: "
  },
  {
    "path": "development.md",
    "chars": 89,
    "preview": "#How to start development on minectl\n\n\n# Install pre-commit\n\n    brew install pre-commit\n"
  },
  {
    "path": "docs/architecture.md",
    "chars": 474,
    "preview": "# minectl 🗺 Architecture diagram\n\nThe architecture of minectl is quite straight forward:\n\n![img.png](img/architecture.pn"
  },
  {
    "path": "docs/authentication.md",
    "chars": 7011,
    "preview": "# Authentication\n\n`minectl` is completely built on zero-trust. It does not save any API tokens, instead it looks them up"
  },
  {
    "path": "docs/cli-reference.md",
    "chars": 3638,
    "preview": "# CLI Reference\n\n## Global Flags\n\nAll commands support these global flags:\n\n```\n--headless              Run in CI mode w"
  },
  {
    "path": "docs/colored-motd.md",
    "chars": 510,
    "preview": "# How to colour your server MOTD\n\n```bash\n\\u00A70 - BLACK\n\\u00A71 - DARK BLUE\n\\u00A72 - DARK GREEN\n\\u00A73 - DARK AQUA\n\\"
  },
  {
    "path": "docs/configuration.md",
    "chars": 5251,
    "preview": "# Configuration\n\n`minectl` uses YAML manifest files to describe Minecraft servers and proxies. You can create these manu"
  },
  {
    "path": "docs/dashboard/tutorial.json",
    "chars": 8243,
    "preview": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\""
  },
  {
    "path": "docs/editions.md",
    "chars": 4037,
    "preview": "# Minecraft Editions\n\n> `minectl` is not(!) providing any pre-compiled binaries of Minecraft or downloading a pre-compil"
  },
  {
    "path": "docs/features.md",
    "chars": 3435,
    "preview": "# Features\n\n## Monitoring\n\nMonitoring is optional and disabled by default. Enable it by adding the following to your Min"
  },
  {
    "path": "docs/getting-started-civo-bedrock.md",
    "chars": 3368,
    "preview": "![Civo](https://img.shields.io/badge/Civo-239DFF?style=for-the-badge&logo=Civo&logoColor=white)\n# Getting Started on Civ"
  },
  {
    "path": "docs/getting-started-civo.md",
    "chars": 3387,
    "preview": "![Civo](https://img.shields.io/badge/Civo-239DFF?style=for-the-badge&logo=Civo&logoColor=white)\n# Getting Started - Civo"
  },
  {
    "path": "docs/getting-started-exoscale.md",
    "chars": 5449,
    "preview": "![Exoscale](https://img.shields.io/badge/Exoscale-DA291C?style=for-the-badge&logo=Exoscale&logoColor=white)\n# Getting St"
  },
  {
    "path": "docs/getting-started-gce.md",
    "chars": 1398,
    "preview": "![Google Cloud](https://img.shields.io/badge/google--cloud-4285F4?style=for-the-badge&logo=google-cloud&logoColor=white)"
  },
  {
    "path": "docs/getting-started-scaleway.md",
    "chars": 3709,
    "preview": "![Scaleway](https://img.shields.io/badge/scaleway-4F0599?style=for-the-badge&logo=scaleway&logoColor=white)\n# Getting St"
  },
  {
    "path": "docs/minectl.drawio",
    "chars": 139084,
    "preview": "<mxfile host=\"app.diagrams.net\" modified=\"2021-08-09T19:30:18.919Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) Apple"
  },
  {
    "path": "docs/multi-server-monitoring-civo.md",
    "chars": 10152,
    "preview": "![Civo](https://img.shields.io/badge/Civo-239DFF?style=for-the-badge&logo=Civo&logoColor=white)\n![Kubernetes](https://im"
  },
  {
    "path": "docs/running-minecraft-luckyblocks-budget-scaleway.md",
    "chars": 5047,
    "preview": "![Scaleway](https://img.shields.io/badge/scaleway-4F0599?style=for-the-badge&logo=scaleway&logoColor=white)\n\n# Running a"
  },
  {
    "path": "docs/skyblock-papermc-hetzner.md",
    "chars": 3560,
    "preview": "![Hetzner](https://img.shields.io/badge/hetzner-d50c2d?style=for-the-badge&logo=hetzner&logoColor=white)\n\n# Running a Pa"
  },
  {
    "path": "go.mod",
    "chars": 8678,
    "preview": "module github.com/dirien/minectl\n\ngo 1.24.9\n\nrequire (\n\tgithub.com/Tnze/go-mc v1.20.2\n\tgithub.com/blang/semver/v4 v4.0.0"
  },
  {
    "path": "go.sum",
    "chars": 54546,
    "preview": "cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4=\ncloud.google.com/go/auth v0.17.0/go.mod"
  },
  {
    "path": "internal/logging/logging.go",
    "chars": 1656,
    "preview": "package logging\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/charmbracelet/lipgloss\"\n\n\t\"go.uber.org/zap\"\n\t\"go.uber.org/zap/"
  },
  {
    "path": "internal/manifest/manifest.go",
    "chars": 2197,
    "preview": "package manifest\n\nimport (\n\t_ \"embed\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/dirien/minectl-sdk/commo"
  },
  {
    "path": "internal/manifest/proxy.json",
    "chars": 4158,
    "preview": "{\n  \"$schema\": \"http://json-schema.org/draft-06/schema#\",\n  \"$ref\": \"#/definitions/Welcome8\",\n  \"definitions\": {\n    \"We"
  },
  {
    "path": "internal/manifest/server.json",
    "chars": 4747,
    "preview": "{\n  \"$schema\": \"http://json-schema.org/draft-06/schema#\",\n  \"$ref\": \"#/definitions/Welcome2\",\n  \"definitions\": {\n    \"We"
  },
  {
    "path": "internal/provisioner/provisioner.go",
    "chars": 10774,
    "preview": "package provisioner\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/dirien/minectl-sdk/automation\"\n\t\"gith"
  },
  {
    "path": "internal/rcon/rcon.go",
    "chars": 1337,
    "preview": "package rcon\n\nimport (\n\t\"fmt\"\n\n\tmcnet \"github.com/Tnze/go-mc/net\"\n\tprompt \"github.com/c-bata/go-prompt\"\n)\n\ntype RCON str"
  },
  {
    "path": "internal/ui/form.go",
    "chars": 1469,
    "preview": "// Package ui provides terminal UI components for minectl using the Charm ecosystem.\npackage ui\n\nimport (\n\t\"errors\"\n\n\t\"g"
  },
  {
    "path": "internal/ui/spinner.go",
    "chars": 2804,
    "preview": "package ui\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/charmbracelet/bubbles/spinner\"\n\ttea \"github.com/charmbracelet/bu"
  },
  {
    "path": "internal/ui/spinner_test.go",
    "chars": 2202,
    "preview": "package ui\n\nimport (\n\t\"errors\"\n\t\"testing\"\n\n\t\"github.com/dirien/minectl/internal/logging\"\n)\n\nfunc newTestUI(t *testing.T,"
  },
  {
    "path": "internal/ui/table.go",
    "chars": 2483,
    "preview": "package ui\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\n\t\"github.com/charmbracelet/lipgloss\"\n\t\"github.com/charmbracelet/lipgloss/t"
  },
  {
    "path": "internal/ui/table_test.go",
    "chars": 2050,
    "preview": "package ui\n\nimport (\n\t\"bytes\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestTableAppend(t *testing.T) {\n\tu := newTestUI(t, true)\n\ttb"
  },
  {
    "path": "internal/ui/ui.go",
    "chars": 1921,
    "preview": "package ui\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/charmbracelet/lipgloss\"\n\t\"github.com/dirien/minectl/internal/logging\"\n\t\"go.ube"
  },
  {
    "path": "internal/ui/ui_test.go",
    "chars": 1784,
    "preview": "package ui\n\nimport (\n\t\"errors\"\n\t\"testing\"\n)\n\nfunc TestUI(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\theadle"
  },
  {
    "path": "main.go",
    "chars": 267,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/dirien/minectl/cmd/minectl\"\n)\n\nvar (\n\tversion string\n\tcommit  string\n\t"
  },
  {
    "path": "minectl-skill/SKILL.md",
    "chars": 8035,
    "preview": "---\nname: minectl\ndescription: \"Use this skill for every message containing the word \\\"minectl\\\". Claude has zero built-"
  },
  {
    "path": "minectl-skill/evals/evals.json",
    "chars": 5107,
    "preview": "{\n  \"skill_name\": \"minectl\",\n  \"evals\": [\n    {\n      \"id\": 1,\n      \"prompt\": \"I want to set up a Minecraft server for "
  },
  {
    "path": "minectl-skill/references/cli-commands.md",
    "chars": 3489,
    "preview": "# CLI Command Reference\n\n## Global Flags\n\n```\n--verbose <level>     Logging level: debug|info|warn|error|dpanic|panic|fa"
  },
  {
    "path": "minectl-skill/references/cloud-providers.md",
    "chars": 2016,
    "preview": "# Cloud Provider Reference\n\n## Supported Providers and Environment Variables\n\n| Provider | `cloud` value | Required Envi"
  },
  {
    "path": "minectl-skill/references/manifest-schema.md",
    "chars": 3452,
    "preview": "# Manifest Schema Reference\n\n## MinecraftServer Manifest\n\n```yaml\napiVersion: minectl.ediri.io/v1alpha1\nkind: MinecraftS"
  }
]

About this extraction

This page contains the full source code of the dirien/minectl GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 163 files (553.7 KB), approximately 231.3k tokens, and a symbol index with 132 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!