Files
cozystack/packages/system
Aleksei Sviridkin 101d1d9861 chore(seaweedfs): bump chart to 4.45 (#4079)
## What this PR does

Refreshes the vendored SeaweedFS chart from 4.31 to 4.45 through `make
update`. This supersedes #2918, which stopped at 4.34: both things that
bump was after (SIGHUP hot-reload of the JWT signing keys, and native
`expires_after_seconds` under
`global.seaweedfs.securityConfig.jwtSigning`) are in 4.45 too, along
with three months of chart fixes.

What changes in a rendered cozystack install:

- Every SeaweedFS server moves from `chrislusf/seaweedfs:4.31` to
`4.45`. The chart takes its image tag from `appVersion`, so the
`master`, `volume` and `filer` StatefulSets and the `s3` Deployment all
get a new image and roll. None of them sets an `updateStrategy`, so they
fall back to RollingUpdate and restart one pod at a time, in every
tenant that runs SeaweedFS. Selectors, `serviceName` and
`volumeClaimTemplates` are byte-identical across the bump, so no
immutable field is touched and no volume is recreated.
- The mysql Secret and the `WEED_MYSQL_*` env block now render only for
the mysql filer store, so the dummy `seaweedfs-db-secret` and its env
vars drop out of a postgres2 install. That Secret is a `pre-install`
hook resource and Helm never deletes hook resources on upgrade, so an
existing one stays behind unused; the tenant cleanup hook still removes
it when the tenant goes away.
- The filer ServiceMonitor selects on a `monitoring: "true"` label that
upstream moved from the filer-client Service onto the filer Service, so
metrics come from one Service instead of two. See the upgrade note
below.
- The filer db-init ConfigMap volume is marked optional.
- S3 gained a Lance catalog port (9101), rendered on the deployment and
published on the Service. This package pins it off, see below.
- The new per-component NetworkPolicy templates are opt-in and off by
default.

The rendered s3 port set is therefore unchanged from 4.31: `swfs-s3` and
`metrics`, same as before the bump.

## Catalog listeners

`weed s3` ships two table-catalog listeners that default to on: Lance on
9101, new in this bump and published on the s3 Service, and Iceberg on
8181, which predates it and stays on the pod IP. Both are served over
plain HTTP with no way to supply a certificate, while every other port
on this gateway is TLS by way of `s3-tls-main-port.patch`, and both
expose writable namespace and table routes. Nothing in cozystack
consumes either.

- Lance is pinned off in `values.yaml`, which drops the container port
and the Service port with it.
- Iceberg could not be pinned off at all: the chart wraps
`-port.iceberg` in an `if` and the value defaults to null, so the flag
was dropped and weed served its own 8181. A new carried patch renders
the flag the way 4.45 already renders `-port.lance`, so null reaches
weed as 0. An explicitly configured port still wins in both cases.

## Volume resize hook

The hook decides twice: one gate emits the `--cascade=orphan` delete of
the volume StatefulSet, the other emits the PVC patches. Both were
comparing sizes as strings, in different ways, and the two disagreed
about what a size change is.

The PVC gate reached its operands through an `include`, which returns a
string, so byte counts were compared lexicographically. A grow that
crossed a decimal exponent and lowered the leading digit (5Gi to 10Gi,
8Gi to 16Gi, 20Gi to 100Gi) read as a shrink: the patches were skipped
while the delete above them still ran, leaving the StatefulSet recreated
and the claims at the old size, hook exit 0 and nothing logged. The same
comparison read a real shrink across an exponent as a grow and emitted a
patch the API server rejects, failing the pre-upgrade hook after the
delete had landed.

The delete gate compared the live `volumeClaimTemplates` size against
the desired one raw. Since the API server re-emits a quantity in
canonical form, that never converges for a non-canonical spelling:
values saying `10240Mi` come back from the cluster as `10Gi`, so the
volume StatefulSet is deleted and recreated on every upgrade for a size
that never moved, and no patch follows because the numeric gate
correctly sees no growth.

A third defect sits in the patch command itself, which formatted the
desired size with `%s`. Helm decodes values through JSON, so a size
written without quotes arrives as a float64 and the rendered command
carried a Go format error where the quantity belongs. The hook fails on
it, and it fails after the orphan delete has already run. It is `%v`
now: `21474836480` renders as `2.147483648e+10`, which
`resource.ParseQuantity` accepts and the API server stores as
`21474836480`. The tenant app always quotes `size`, so no tenant could
reach this.

Carried as one patch normalising both gates through
`seaweedfs.resource-quantity`, with unit tests on the exponent-crossing
grow, a grow that always worked, a shrink, a respelling, and a size set
as a number.

## Upgrade notes

Two things to know before upgrading.

`filer.ingress` is gone from the chart's values. Upstream replaced it
with `filer.ingresses.http.*` and added `filer.ingresses.grpc.*`; those
six removed keys are the only contract break in the whole values file
across the bump. Nothing in tree sets the old key and the tenant-facing
SeaweedFS resource has no filer-ingress field, so a default install is
unaffected. An operator who set `filer.ingress.enabled: true` through a
platform-level `spec.components.seaweedfs-system.values` override is
not: Helm accepts the unknown key without complaint and the Ingress
simply stops rendering, with nothing in an event or a log to read.

Filer metrics stop being double-counted. Before this bump both
`seaweedfs-filer` and `seaweedfs-filer-client` matched the filer
ServiceMonitor, so Prometheus scraped two targets per filer pod and
every filer series was duplicated. One target is the correct number, but
panels built on `rate(SeaweedFS_filer_request_total{...})` and
`rate(SeaweedFS_filerStore_request_total{...})` in the shipped dashboard
step down by half at upgrade time. That step is the duplicate going
away, not a throughput loss. Quantile panels are ratios and are
unaffected.

## Patches

Ten carried patches, all applying cleanly from a fresh download.
`resize-api-server-annotation.diff` needed a rebase: upstream now
renders pod-template labels on the resize hook, so the patch appends the
cozystack apiserver label to them instead of creating the block. Two are
new and are described above: `s3-iceberg-port-explicit.patch` and
`volume-resize-quantity.diff`. Both belong upstream and are carried only
until they land there.

## Verification

Checked locally: a fresh download of 4.45 with all ten patches applied
in Makefile order reproduces the committed tree byte for byte; `helm
unittest` passes 73 in `packages/system/seaweedfs` and 35 in
`packages/extra/seaweedfs`; the naming-guard canary still refuses a
blind upgrade; and a rendered diff against 4.31 comes back identical for
object names, StatefulSet selectors, `serviceName` and
`volumeClaimTemplates`, so a running install keeps its workloads and
volumes across the upgrade. Each fix above has a unit test that is red
without it.

Not checked locally, worth an eye in review or e2e: the live upgrade
path, since `helm template` cannot exercise the `lookup` that preserves
the security.toml JWT keys, and server-side apply convergence when the
`monitoring` label moves between the two filer Services.

### Screenshots

N/A, no UI change.

### Downstream repositories

- [x] No downstream repository is affected by this change
- [ ] [cozystack/website](https://github.com/cozystack/website) -
follow-up:
- [ ]
[cozystack/terraform-provider-cozystack](https://github.com/cozystack/terraform-provider-cozystack)
- follow-up:
- [ ]
[cozystack/ansible-cozystack](https://github.com/cozystack/ansible-cozystack)
- follow-up:
- [ ] [cozystack/ccp](https://github.com/cozystack/ccp) - follow-up:
- [ ] [cozystack/talm](https://github.com/cozystack/talm) - follow-up:
- [ ] [cozystack/cozyhr](https://github.com/cozystack/cozyhr) -
follow-up:
- [ ] [cozystack/cozy-proxy](https://github.com/cozystack/cozy-proxy) -
follow-up:
- [ ]
[cozystack/cozystack-telemetry-server](https://github.com/cozystack/cozystack-telemetry-server)
- follow-up:
- [ ]
[cozystack/external-apps-example](https://github.com/cozystack/external-apps-example)
- follow-up:
- [ ] [cozystack/examples](https://github.com/cozystack/examples) -
follow-up:
- [ ] [cozystack/community](https://github.com/cozystack/community) -
follow-up:

### Release note

```release-note
chore(seaweedfs): bump the vendored SeaweedFS chart to 4.45, with the Lance and Iceberg table catalogs kept off and both gates of the volume resize hook comparing sizes numerically. Every SeaweedFS server moves to the 4.45 image, so the master, volume and filer StatefulSets and the s3 Deployment roll one pod at a time on upgrade. Two operator-visible notes: filer metrics stop being double-counted, so filer rate panels step down by half at upgrade time, and the chart's `filer.ingress` values key is replaced by `filer.ingresses.http`, so an override still using the old key is silently inert.
```



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Updated SeaweedFS to version 4.45, with expanded chart configuration
for enterprise licensing, NetworkPolicies, custom scheduling,
certificate-based SFTP authentication, and existing-secret credentials.
* Added separate HTTP and gRPC filer ingress options, S3 Lance ingress
and listener settings, and Lance worker support.
  * Added a Grafana dashboard view for filer object-size distributions.
* **Improvements**
* Added configurable node ports and load-balancer settings across
services, plus custom certificate DNS names.
* Improved volume-resize handling for equivalent storage quantities and
added support for resizing PVCs.
* **Documentation**
* Expanded chart guidance for persistence, credentials, networking,
licensing, and MySQL configuration.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-09-26 18:51:48 +04:00
..
…