ec9e64187bc7bf2faebd16be8d4667c940ea4df9
5
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
9c0039685b
|
minecraft-server: an overridable image tag and a Java-line guard (5.0.0+up2026.8.2.java25)
Only the newest Java line is maintained from now on. Publishing the chart once per line out of one directory is what made the lines drift apart (#158): a change reached whichever line happened to lie in the directory. java8 and java17 stay published as frozen artifacts at 4.0.0, java21 at 4.1.0, and none of them gets another chart change. Running an older JVM is now a decision at rollout time instead of a chart version: image.tagOverride replaces the tag that otherwise comes from appVersion. It is not called image.tag because it decouples the running image from the chart version, and it is deliberately outside Renovate's reach - renovate.json5 keeps tracking appVersion only. The pairing of tag and minecraft.version is now checked at render time and fails with both values named, the line each one belongs to, and where the tag came from. Until now nothing checked it: a mismatch installed silently and only the container failed afterwards. The boundaries are Mojang's, swept over all 102 releases of the piston-meta manifest (javaVersion.majorVersion): up to 1.16.5 Java 8, 1.17-1.17.1 Java 16, 1.18-1.20.4 Java 17, 1.20.5-1.21.11 Java 21, 26.1 and later Java 25. The 1.17 line was the one gap the chart's own notes did not cover. Two cases pass unchecked on purpose, documented in values.yaml and NOTES.txt: a tag without a recognizable java<N> part, and a minecraft.version that is not a plain numeric x[.y[.z]]. A guard that rejects what it does not understand gets worked around instead of respected. Major, because an installation that already runs a mismatched pair stops rendering. It does not run today either - it now fails earlier and visibly. |
||
|
|
fc8f57e176
|
minecraft-server: null-safe hardening, probes and resources
The last open gap of #99. minecraft-server was the one chart of 21 where an erased security context removed the hardening in silence: it never got the defaultedDict helper, the StatefulSet rendered .Values.securityContext.pod straight through toYaml, and the schema typed securityContext.pod as a strict "object" without required. Measured against ci/minecraft-server/test-values.yaml on 3.0.1: --set securityContext.pod=null --set securityContext.container=null -> helm exit 0, no schema error, "securityContext: null" for BOTH the pod and the container - no runAsNonRoot, no readOnlyRootFilesystem, no dropped capabilities, in a chart with a PVC. Bitter place for it: the README lists this chart as the pilot for #68. It got its schema early and was therefore never caught by the later null-safety wave. Both halves are added, because they cover different cases. For a key WITH a chart default Helm's coalescing deletes the null before validation ever sees it, and only the defaultedDict fallback catches that; for a key WITHOUT one (server.resources.limits) the null survives into validation, where the strict "object" aborted the render. Now widened to ["object","null"]. The fallback table reproduces THIS chart's defaults, deviations included: uid/gid pinned to 1000 (the image's minecraft user - starting as it directly takes the entrypoint's non-root branch, which skips the recursive chown of /data and the write to /etc/nsswitch.conf that a read-only root filesystem would reject), fsGroupChangePolicy OnRootMismatch (a recursive chown of a 32Gi world on every start costs minutes), the explicit empty capabilities.add list, and all three probes as exec probes running the image's mc-health script - this image has no HTTP endpoint, so a probe default rebuilt as httpGet would leave the workload with no working probe at all. The startup budget stays 15s x 80. server.resources goes through the same helper while keeping its memory request deliberately unset, so it is still derived from the JVM heap. Also, the same class one level down: init.sh chowned the migrated serverpack to a hardcoded 1000:1000 while the uid it has to match was overridable. Both reads now go through the same helper, so they cannot disagree. With the chart defaults the rendered script is unchanged, so checksum/config does not move and no existing pod rolls. minecraft.resources.storage and .memory stay deliberately not null-safe: an erased value yields an invalid PVC or an unparseable quantity, which is the loud class #99 excludes. Evidence, all against ci/minecraft-server/test-values.yaml unless noted: - the reported call now renders the defaults, byte-identical to the unmodified rendering. Fallback, not rejection. - rendering with securityContext, all three probes and server.resources set to null is byte-identical to rendering the chart defaults - which is what keeps the table and values.yaml in sync instead of leaving it to discipline. - no regression: rendering before and after the change is byte-identical, on the CI values, on the chart defaults, and with curseforgeServerpack enabled (the init-container path the CI values do not exercise). Confirmed structurally too, not only by raw diff. - partial nulling, 14 keys swept one at a time. On 3.0.1 twelve of them changed the rendering silently, including capabilities (the container kept every default capability instead of dropping ALL) and requests (cpu and ephemeral-storage disappeared entirely). On 4.0.0 all fourteen render identical to the defaults. - explicit false and 0 still win over the defaults; a scalar in a mapping slot is still rejected, now naming the values path. Major bump: erasing one of these blocks used to change the rendered workload and now does not, which is a runtime behaviour change. appVersion is untouched. Refs #99 |
||
|
|
58ea3b62d4
|
Restart the server when its config changes (3.0.0+up2026.8.2.java8)
The StatefulSet now carries two annotations over its two configuration
sources, so a change to either produces a new pod template and a controlled
restart:
checksum/config the rendered ConfigMap (init.sh) - complete, Helm sees
the whole content
checksum/secret-ref the rendered OnePasswordItem - the op:// item path only,
because the Secret's content is materialized by the
operator and is unknown to Helm at render time
Two separate annotations rather than one combined hash: they carry different
guarantees, and a single number would blur "covers everything" and "covers the
path but not the content" into one value that nobody can interpret in a
kubectl describe.
The operator's own operator.1password.io/auto-restart is deliberately NOT set:
it restarts Deployments only. Verified in the operator source (main, 9c3b1b9):
restartWorkloadsWithUpdatedSecrets lists nothing but appsv1.DeploymentList and
getPodTemplate has a single case for *appsv1.Deployment. On this StatefulSet
the annotation would be inert while suggesting the opposite, so the remaining
gap - a rotated value inside the vault item - is documented in values.yaml
instead.
First of the three stage-3-style publishes, so the java8 line goes first and
main ends up on java21. Only the published Java line differs between them:
appVersion 2026.8.2-java8 and the matching minecraft.version default 1.12.2.
Major bump: runtime behaviour changes. A configuration change now costs a full
server restart - 124 s measured for ftb-skies on Longhorn.
Refs #82.
|
||
|
|
4874e5db1f
|
Pin minecraft-server to dated image tags and fix the whitelist switch (2.0.0+up2026.8.2.java8)
Stage 3 of the Fleet migration. Two changes, both breaking, hence the major bump from 1.0.0 to 2.0.0. Dated image tags: appVersion moves from the rolling line tag "java8" to the immutable upstream release tag "2026.8.2-java8". The rolling tags are rebuilt continuously, so a pod restart could pull a different image than the previous start without that being recorded anywhere. 2026.8.2 is the newest upstream release (published 2026-08-23) and exists for all three Java lines. Whitelist semantics: the chart now wires ENABLE_WHITELIST (and ENFORCE_WHITELIST) in both positions, so minecraft.whitelist.enabled: false actually switches the whitelist off. Previously the chart only emitted whitelist variables while enabled was true and had no way to express "off" - and because server.properties lives on the PVC, a release that had once written white-list=true kept it forever. players stays guarded by enabled, since a non-empty WHITELIST enables the whitelist in the image regardless of ENABLE_WHITELIST. The default flips from enabled: true to enabled: false. Under the corrected semantics the old default (enabled with an empty player list) would mean a server nobody can join; false matches both the image and vanilla Minecraft. |
||
|
|
227bcebeb6
|
Bring minecraft-server up to the chart style guidelines (1.0.0+upjava8)
Stage 2 of the Fleet migration for minecraft-server. Major bump: runtime behaviour changes (probes, hardening) and the values interface breaks (resource renames, strict schema). Two real bugs first: - The container declared port 35565 while the Service targeted 25565. It only worked because targetPort was numeric. Both are now server.port (25565) and the Service targets the named port. - The download-serverpack init container was guarded by the map .Values.curseforgeServerpack instead of .enabled, so it rendered for every release and silently no-opped on an empty wget URL. Conventions: - Resources renamed to <release>-<chart>-<kind>, templates to <app>.<kind>.yaml. The PVC deliberately keeps its historical name - renaming it would provision a new, empty volume and orphan the worlds. - Probes (liveness/readiness/startup) via the image's own mc-health, so Ready means the server answers a server-list ping. Startup budget 20 min. - Hardened, values-configurable security contexts: non-root uid 1000, read-only root filesystem with an emptyDir at /tmp, all caps dropped. - Resources from values with the limitFactor helper; an unset memory request is derived from the JVM heap so the two cannot drift apart. - Additive env block rendered through tpl, pinned init image, storage class as a value, RCON wiring only when actually enabled. - curseforge/ftb/curseforgeServerpack are now mutually exclusive. - minecraft.version is pinned to the Java line instead of LATEST. - The mc-router auto-discovery annotation is gone; the service type it implicitly switched is now the explicit value server.service.type. Schema pilot (#68): values.schema.json with additionalProperties false on every chart-owned level, rejecting all three known dead keys. |