Skip to content

Minecraft

Minecraft Java Edition server on Kubernetes using the itzg/minecraft-server container image. Supports multiple server types (Vanilla, Paper, Forge, Fabric, Quilt), GeyserMC Bedrock cross-play, mod and plugin management, Aikar-optimized JVM flags, and RCON-backed S3 backups.

LoadBalancer service by default — configure for bare-metal clusters

The chart defaults to service.type: LoadBalancer to expose the game port (25565) directly to players. On bare-metal clusters without a cloud LoadBalancer provider (e.g. K3s without MetalLB), this Service will remain in <pending> state. Use service.type: NodePort with a static nodePort, or install MetalLB first.

Key Features

  • Multiple server types — Vanilla, Paper, Spigot, Bukkit, Forge, Fabric, Quilt, CurseForge, Modrinth
  • GeyserMC cross-play — Bedrock clients (mobile, console, Windows) join Java servers on UDP 19132
  • Aikar GC flags — optimized garbage collection for smooth server performance
  • RCON-backed backupsave-all + save-off via RCON before archiving world data to S3
  • Mod/plugin management — Modrinth, CurseForge, Spiget, and direct URL downloads
  • Resource packs — configure server-side resource packs with SHA-1 verification
  • Prometheus metrics — mc-monitor sidecar with optional ServiceMonitor
  • Pinned upstream image — defaults to 2026.5.2, with Java-specific tags available when needed

Installation

helm repo add helmforge https://repo.helmforge.dev
helm repo update
helm install minecraft helmforge/minecraft --set server.eula=true

OCI registry:

helm install minecraft oci://ghcr.io/helmforgedev/helm/minecraft --set server.eula=true

Java Version Compatibility

Minecraft VersionRequired JavaExample image.tag
1.21.5+Java 252026.5.2
1.20.x - 1.21.4Java 212026.5.2-java21
1.17.x - 1.19.xJava 172026.5.2-java17

The chart defaults to the dated upstream image tag 2026.5.2. Pin image.tag to a Java-specific variant, such as 2026.5.2-java21, when running older Minecraft versions or modpacks that require a specific Java runtime.

Server Type Reference

TypeUse Case
VANILLAOfficial Mojang server, no mods or plugins
PAPERHigh-performance fork with plugin API, required for GeyserMC
SPIGOTPlugin server with Bukkit API
FORGEJava mod loader (Forge mods)
FABRICLightweight mod loader (Fabric mods)
QUILTFork of Fabric with enhanced mod compatibility
MODRINTHModrinth modpack server
AUTO_CURSEFORGECurseForge modpack server (requires mods.curseforgeApiKey)

Deployment Examples

# values.yaml — Vanilla Minecraft server
server:
  eula: true
  type: VANILLA
  version: '1.21.4' # pin version in production — never use LATEST
  motd: 'My Server'
  maxPlayers: 20
  difficulty: normal

jvm:
  memory: 2G
  useAikarFlags: true # always recommended for production

auth:
  onlineMode: true
  whitelist: 'player1,player2'
  ops: 'admin1'

persistence:
  enabled: true
  size: 20Gi

service:
  type: LoadBalancer # requires MetalLB or cloud provider on bare-metal

resources:
  requests:
    memory: 2Gi
    cpu: 500m
  limits:
    memory: 3Gi
    cpu: '2'
# values.yaml — Paper production server with RCON and optimized JVM
server:
  eula: true
  type: PAPER
  version: '1.21.4'
  motd: 'Production Server'
  maxPlayers: 50
  viewDistance: 8
  simulationDistance: 6

jvm:
  memory: 4G
  useAikarFlags: true

auth:
  onlineMode: true
  enforceWhitelist: true
  whitelist: 'player1,player2'
  ops: 'admin1'

rcon:
  enabled: true
  existingSecret: minecraft-rcon

persistence:
  enabled: true
  size: 50Gi

service:
  type: LoadBalancer

resources:
  requests:
    memory: 4Gi
    cpu: '1'
  limits:
    memory: 6Gi
    cpu: '4'
# values.yaml — Paper + GeyserMC for Bedrock cross-play
# Bedrock clients connect on UDP port 19132.
# GeyserMC only works with server.type: PAPER (or SPIGOT).
server:
  eula: true
  type: PAPER
  version: '1.21.4'
  maxPlayers: 30

jvm:
  memory: 3G
  useAikarFlags: true

auth:
  onlineMode: true # false required if using Floodgate for Bedrock auth

geyser:
  enabled: true
  port: 19132

mods:
  # Download GeyserMC and Floodgate from Modrinth
  modrinthProjects: 'geyser,floodgate'

persistence:
  enabled: true
  size: 20Gi

service:
  type: LoadBalancer
# values.yaml — Forge modded server with mod downloads
# Forge modpacks require more memory and longer startup time.
server:
  eula: true
  type: FORGE
  version: '1.20.1'

image:
  tag: java17 # Forge 1.20.x requires Java 17

jvm:
  memory: 6G
  useAikarFlags: true

mods:
  # Download mods from Modrinth by slug
  modrinthProjects: 'create,jei,waystones'

persistence:
  enabled: true
  size: 30Gi

service:
  type: LoadBalancer

# Increase startup probe for heavy modpacks (default 5 min may not be enough)
startupProbe:
  enabled: true
  initialDelaySeconds: 60
  periodSeconds: 15
  failureThreshold: 40 # 10 minutes total
# values.yaml — Paper server with daily S3 backup
# Backup uses RCON: save-all → save-off → tar archive → upload to S3 → save-on
server:
  eula: true
  type: PAPER
  version: '1.21.4'

jvm:
  memory: 4G
  useAikarFlags: true

rcon:
  enabled: true
  existingSecret: minecraft-rcon

backup:
  enabled: true
  schedule: '0 4 * * *'
  excludes: '*.jar cache logs' # skip re-downloadable files to reduce size
  s3:
    endpoint: https://minio.example.com
    bucket: minecraft-backups
    prefix: my-server
    existingSecret: minecraft-s3-credentials

persistence:
  enabled: true
  size: 50Gi

service:
  type: LoadBalancer

Configuration Reference

Core

ParameterTypeDefaultDescription
nameOverridestring""Override the chart name.
fullnameOverridestring""Override the full release name.
commonLabelsobject{}Extra labels added to all resources.

Image

ParameterTypeDefaultDescription
image.repositorystringdocker.io/itzg/minecraft-serverMinecraft server container image.
image.tagstring"2026.5.2"Image tag. Use Java-specific variants for older Minecraft versions.
image.pullPolicystringIfNotPresentImage pull policy.
imagePullSecretsarray[]Pull secrets for private registries.

Server Configuration

ParameterTypeDefaultDescription
server.eulabooleantrueAccept the Minecraft EULA. Required.
server.typestringVANILLAServer type: VANILLA, PAPER, SPIGOT, FORGE, FABRIC, QUILT, etc.
server.versionstringLATESTMinecraft version. Pin to a specific version in production (e.g. 1.21.4).
server.motdstringA Minecraft Server powered by HelmForgeServer list message of the day.
server.difficultystringnormalGame difficulty: peaceful, easy, normal, hard.
server.gameModestringsurvivalDefault game mode: survival, creative, adventure, spectator.
server.maxPlayersinteger20Maximum concurrent players.
server.viewDistanceinteger10View distance in chunks. Lower values improve server performance.
server.simulationDistanceinteger10Simulation distance in chunks.
server.seedstring""World seed. Empty = random.
server.worldSaveNamestringworldWorld directory name under /data.
server.levelTypestringDEFAULTWorld type: DEFAULT, FLAT, LARGEBIOMES, AMPLIFIED.
server.pvpbooleantrueEnable player vs player combat.
server.allowNetherbooleantrueEnable the Nether dimension.
server.allowFlightbooleanfalseAllow flight. Required for some mods.
server.enableCommandBlockbooleanfalseEnable command blocks.
server.forceGameModebooleanfalseForce players into the default game mode on join.
server.hardcorebooleanfalseHardcore mode (permanent player death).
server.spawnProtectioninteger16Spawn protection radius in blocks. 0 to disable.
server.portinteger25565Java Edition game port.
server.extraPropertiesobject{}Extra server.properties entries as key-value pairs.
server.extraEnvarray[]Extra environment variables for the server container.
Pin server.version in production

server.version: LATEST is convenient for development but dangerous in production. A Minecraft version update can break plugins, mods, and datapacks — and restarting the pod may automatically upgrade the server. Pin to a specific version (e.g. 1.21.4) and upgrade intentionally.

JVM / Performance

ParameterTypeDefaultDescription
jvm.memorystring1GJVM heap allocation. Sets both -Xms and -Xmx.
jvm.initMemorystring""Override initial heap size independently.
jvm.maxMemorystring""Override maximum heap size independently.
jvm.useAikarFlagsbooleanfalseEnable Aikar’s optimized GC flags. Strongly recommended for production.
jvm.jvmOptsstring""Additional JVM options.
jvm.xxOptsstring""Additional -XX: JVM options.
Enable Aikar's GC flags for smoother performance

Setting jvm.useAikarFlags: true applies garbage collection flags specifically tuned for Minecraft server workloads. They reduce GC pause spikes (which cause lag spikes for players). This is widely recommended by the Minecraft server community for any production deployment.

Authentication and Access Control

ParameterTypeDefaultDescription
auth.onlineModebooleantrueMojang online authentication. Set to false for proxy or offline mode.
auth.whiteliststring""Comma-separated player names or UUIDs for the whitelist.
auth.enforceWhitelistbooleanfalseKick non-whitelisted players immediately when the whitelist is updated.
auth.opsstring""Comma-separated operator (admin) player names or UUIDs.

GeyserMC Cross-Play

GeyserMC requires server.type: PAPER or compatible plugin server

GeyserMC is a Paper/Spigot plugin — it cannot run on VANILLA or FORGE servers. Bedrock clients connect on UDP port 19132. You also need the Floodgate plugin to allow Bedrock players to join without a Java Edition account if auth.onlineMode: true.

ParameterTypeDefaultDescription
geyser.enabledbooleanfalseEnable GeyserMC for Bedrock cross-play.
geyser.portinteger19132UDP port for Bedrock clients.

RCON

ParameterTypeDefaultDescription
rcon.enabledbooleantrueEnable RCON remote console.
rcon.portinteger25575RCON port.
rcon.passwordstring""RCON password. Auto-generated if empty.
rcon.existingSecretstring""Existing secret containing the RCON password.
rcon.existingSecretKeystringrcon-passwordKey inside the existing secret.
rcon.serviceEnabledbooleanfalseExpose RCON as a separate Service.
rcon.serviceTypestringClusterIPRCON service type. Keep ClusterIP for security.

Persistence

ParameterTypeDefaultDescription
persistence.enabledbooleantrueEnable persistent storage for /data.
persistence.storageClassstring""StorageClass for the PVC.
persistence.accessModestringReadWriteOncePVC access mode.
persistence.sizestring10GiPVC size. Grows with worlds, mods, and logs.
persistence.existingClaimstring""Use an existing PVC.
persistence.annotationsobject{}Annotations for the PVC.

Service

ParameterTypeDefaultDescription
service.typestringLoadBalancerGame service type. Use NodePort on bare-metal without MetalLB.
service.portinteger25565Game service port.
service.nodePortstring""Static node port when service.type: NodePort.
service.annotationsobject{}Annotations for the Service.

Mods and Plugins

ParameterTypeDefaultDescription
mods.modrinthProjectsstring""Modrinth project slugs or IDs to download (comma-separated).
mods.curseforgeApiKeystring""CurseForge API key. Required for any CurseForge downloads.
mods.autoCurseforgeSlugstring""CurseForge modpack slug when server.type: AUTO_CURSEFORGE.
mods.spigetResourcesstring""Spiget resource IDs for Bukkit/Spigot plugins (comma-separated).
mods.downloadUrlsstring""Newline-separated direct URLs to download plugins or mods.

Resource Pack

ParameterTypeDefaultDescription
resourcePack.urlstring""URL to a server-side resource pack.
resourcePack.sha1string""SHA-1 hash of the resource pack for client verification.
resourcePack.enforcebooleanfalseForce clients to accept the resource pack before joining.

Backup

The backup CronJob uses RCON to run save-all and save-off before archiving, then save-on after upload — ensuring the world is in a consistent state before the backup is taken.

ParameterTypeDefaultDescription
backup.enabledbooleanfalseEnable scheduled S3 backup CronJob.
backup.schedulestring"0 4 * * *"Cron schedule for backups.
backup.suspendbooleanfalseSuspend the CronJob without deleting it.
backup.concurrencyPolicystringForbidCronJob concurrency policy.
backup.successfulJobsHistoryLimitinteger3Successful job records to keep.
backup.failedJobsHistoryLimitinteger3Failed job records to keep.
backup.backoffLimitinteger1Job retry limit.
backup.archivePrefixstringminecraftPrefix for backup archive filenames.
backup.excludesstring"*.jar cache logs"Space-separated patterns excluded from the archive.
backup.images.workerstringdocker.io/itzg/minecraft-server:2026.5.2Image for RCON and tar operations.
backup.images.uploaderstringdocker.io/helmforge/mc:1.0.0Image for S3 upload.
backup.resourcesobject{}Resources for backup containers.
backup.s3.endpointstring""S3-compatible endpoint URL.
backup.s3.bucketstring""Target bucket name.
backup.s3.prefixstringminecraftKey prefix within the bucket.
backup.s3.createBucketIfNotExistsbooleantrueCreate the bucket if it does not exist.
backup.s3.existingSecretstring""Existing secret with S3 access and secret keys.
backup.s3.existingSecretAccessKeyKeystringaccess-keyKey for S3 access key.
backup.s3.existingSecretSecretKeyKeystringsecret-keyKey for S3 secret key.
backup.s3.accessKeystring""Inline S3 access key (ignored when existingSecret is set).
backup.s3.secretKeystring""Inline S3 secret key (ignored when existingSecret is set).

Metrics (mc-monitor)

ParameterTypeDefaultDescription
metrics.enabledbooleanfalseEnable Prometheus metrics via mc-monitor sidecar.
metrics.image.repositorystringdocker.io/itzg/mc-monitormc-monitor image.
metrics.image.tagstring0.16.1mc-monitor image tag.
metrics.portinteger8080Prometheus metrics port.
metrics.serviceMonitor.enabledbooleanfalseCreate a Prometheus Operator ServiceMonitor.
metrics.serviceMonitor.intervalstring30sMetrics scrape interval.
metrics.serviceMonitor.labelsobject{}Extra labels for the ServiceMonitor.

Probes

ParameterTypeDefaultDescription
startupProbe.enabledbooleantrueEnable startup probe. Allows up to 5 minutes for the server to start.
startupProbe.initialDelaySecondsinteger30Startup probe initial delay.
startupProbe.periodSecondsinteger10Startup probe period.
startupProbe.timeoutSecondsinteger5Startup probe timeout.
startupProbe.failureThresholdinteger30Failures before restart. Increase for heavy modpacks.
livenessProbe.enabledbooleantrueEnable liveness probe.
readinessProbe.enabledbooleantrueEnable readiness probe.

Resources and Security

ParameterTypeDefaultDescription
resourcesobject{}CPU and memory requests and limits.
podSecurityContext.fsGroupinteger1000Filesystem group for the pod.
securityContext.runAsUserinteger1000UID for the server process.
securityContext.runAsGroupinteger1000GID for the server process.
terminationGracePeriodSecondsinteger120Grace period for shutdown. Allows save-all to complete before pod exits.

Scheduling

ParameterTypeDefaultDescription
nodeSelectorobject{}Node selector for scheduling.
tolerationsarray[]Tolerations for scheduling.
affinityobject{}Affinity rules.
topologySpreadConstraintsarray[]Topology spread constraints.
priorityClassNamestring""PriorityClass for the pod.
podLabelsobject{}Extra labels for the pod.
podAnnotationsobject{}Extra annotations for the pod.

Extra

ParameterTypeDefaultDescription
extraVolumesarray[]Extra volumes to attach to the pod.
extraVolumeMountsarray[]Extra volume mounts for the container.
extraManifestsarray[]Extra Kubernetes manifests deployed alongside the chart.

Upgrade Notes

docker.io/itzg/minecraft-server:2026.5.2 is an upstream image update from 2026.4.2. Review the upstream release notes before upgrading production servers, take a world backup, and verify plugins, mods, datapacks, and pinned server.version values in a staging environment before reusing existing PVCs.

More Information