Overview
SeaweedFS is a distributed object store with an S3-compatible API. This template deploys a single all-in-one node — master, volume server, filer, S3 gateway and admin UI in oneweed mini process — with persistent storage, startup bucket creation and signed-request (SigV4) authentication on port 8333.
Its main use is as an in-org storage target: any workload or template that accepts an S3-compatible endpoint and a static access key pair can point at it without data leaving your organization. Both sets of credentials — the S3 keys and the admin UI login — come from dictionary secrets you create before installing; the template creates no secrets of its own.
--gvc GVC_NAME at install time.What Gets Created
23646 is only declared on the workload when adminUI.enabled is true (the default).
Prerequisites
Two secrets must exist before you install. They are deliberately separate: the S3 keys are handed to every client application, while the admin login guards the bucket browser and maintenance tools. Secrets are org-level, so no--gvc flag is involved.
Create the S3 credentials secret
AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY. Every S3 client uses these, and SeaweedFS serves S3 with no authentication at all when they are absent:s3.credentialsSecretName to the name you used.Create the admin UI credentials secret
username and password, guarding the admin login form. Required whenever adminUI.enabled is true, which is the default:adminUI.credentialsSecretName to the name you used.Read either secret back later
-o yaml; a bare cpln secret reveal prints only a summary table, not the values:Installation
With both secrets in place, install into your existing GVC, passing the names of the two secrets you created above:UI
CLI
Terraform
Pulumi
Configuration
Image and Resources
weed mini is the image’s own default command; the template pins every port explicitly because the port layout can change between upstream releases. Pin a concrete released tag, never latest.
Storage
capacity is below 10 or when autoscaling is enabled with maxCapacity smaller than capacity. Data survives restarts, redeployments and helm upgrade under the same release name; uninstalling deletes the volume set and every stored object, keeping a final snapshot for 7 days.
S3 API
s3.buckets entries must be lowercase letters, digits, dots and hyphens, 3–63 characters, starting with a letter or digit; the chart refuses to render otherwise. Buckets are only ever created, never deleted — removing a name from the list leaves the bucket in place, and adding one takes effect on the next restart. You can also create buckets at any time through the admin UI or with aws s3 mb.
Admin UI
23646 and is reachable from inside the GVC only; it is never publicly routed. Setting adminUI.enabled: false removes the port and the credential references from the workload and narrows the policy to the S3 credentials secret alone — the admin routes then return 404. With the UI disabled, credentialsSecretName may be left empty.
Access
publicAccess.enabled: true serves the S3 API over HTTPS on the automatically assigned *.cpln.app canonical endpoint, using path-style addressing. Only port 8333 is exposed this way — the admin UI is never publicly routed. Access changes can take a few minutes to take effect.
Connecting
403, and a wrong secret key gets SignatureDoesNotMatch.
To reach the admin UI from your machine:
http://localhost:23646 and log in with the username and password from your admin credentials secret.
Using SeaweedFS as an S3 Backend
Any client that speaks S3 works, subject to three rules:- Path-style addressing is required. Objects are addressed as
http://RELEASE_NAME-seaweedfs.GVC_NAME.cpln.local:8333/BUCKET/KEY; virtual-host style (BUCKET.host) is not served. SetforcePathStyle: true/addressing_style = pathon the client. - Any region value works. The region is read from the client’s signature scope and never compared against a server-side value, so a consumer hardcoded to
us-east-1is fine as-is. - The bucket must already exist for most backup tools. Create it with
s3.buckets, through the admin UI, or withaws s3 mb.
AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY from your S3 credentials secret — most consumers want them in a second dictionary secret under their own key names:
Operations
Backing Up
Everything SeaweedFS stores — objects and all metadata — lives on the singleRELEASE_NAME-seaweedfs-data volume set, so a volume set snapshot captures the whole store consistently. Take one on demand:
Restoring a Backup
Restoring an object-level copy is an ordinary upload: create the bucket if it does not exist (throughs3.buckets, the admin UI or aws s3 mb), then sync the copy back:
Upgrading from 1.0.0
Version1.1.0 moved the admin UI login out of Helm values. 1.0.0 shipped a working username and password as values, used exactly as written — a published default guarding the bucket browser and maintenance tools for the life of the install.
Create the admin credentials secret
1.0.0 default was public.Drop the removed keys from your values
adminUI.username and adminUI.password, and set adminUI.credentialsSecretName instead. Leave s3.credentialsSecretName exactly as it is — the S3 half is unchanged, and anything already backing up into SeaweedFS needs no edit.Upgrade the release
cpln helm upgrade with --version 1.1.0 and your updated values, as described in the CLI guide. The single replica restarts and the S3 API is unavailable until it is back; stored objects on the volume set are untouched.Rotating Credentials
Both secrets are read when a replica starts, so rotating one takes effect only after a redeployment. Update the secret’s values, then force a redeployment:InvalidAccessKeyId and stored objects are untouched. Update every consumer at the same time.
Scaling and Availability
The template deploys a single replica by design and exposes no replica count.weed mini runs one master, one filer and one volume server in a single process, so additional replicas would each hold a separate, divergent object store behind one name. Consequences:
- A redeploy,
helm upgradeor platform reschedule is a full S3 outage until the replica is back. Schedule upgrades accordingly. - Durability comes from the persistent volume set, not from replication: data survives restarts and reschedules, and a node failure re-attaches the same volume.
- Grow capacity vertically — raise
resources.maxMemoryfor very large object counts andvolumeset.capacity(or enablevolumeset.autoscaling) for more data.
Troubleshooting
Deployment never starts and cpln logs returns nothing
Deployment never starts and cpln logs returns nothing
cpln helm install succeeded, but the workload sits at zero replicas and cpln logs '{gvc="GVC_NAME", workload="RELEASE_NAME-seaweedfs"}' --limit 50 --since 10m returns no lines at all.Cause: One of the two prerequisite secrets does not exist, so the container is never started. The deployment message names it:cpln workload force-redeployment RELEASE_NAME-seaweedfs --gvc GVC_NAME.helm upgrade fails with 'adminUI.username and adminUI.password were removed in seaweedfs 1.1.0'
helm upgrade fails with 'adminUI.username and adminUI.password were removed in seaweedfs 1.1.0'
adminUI.username or adminUI.password, which 1.1.0 removed. The guard fires even with adminUI.enabled: false.Fix: Follow the steps under Upgrading from 1.0.0 above: create the admin credentials secret, remove both keys from your values, set adminUI.credentialsSecretName, then upgrade again.S3 client gets 403 or SignatureDoesNotMatch
S3 client gets 403 or SignatureDoesNotMatch
aws s3 ls or a consumer template’s backup job is refused with 403 or an error body containing SignatureDoesNotMatch.Cause: The request is unsigned, or the client’s secret key does not match the value in your S3 credentials secret. A client using virtual-host-style addressing (bucket.host) also fails, because only path-style is served.Fix: Compare the client’s keys against cpln secret reveal S3_CREDENTIALS_SECRET_NAME -o yaml, and set path-style addressing on the client (aws configure set default.s3.addressing_style path, forcePathStyle: true, or the consumer’s equivalent).S3 client gets InvalidAccessKeyId after rotating the secret
S3 client gets InvalidAccessKeyId after rotating the secret
InvalidAccessKeyId.Cause: The S3 credentials secret was rotated and the node redeployed, so the old access key is no longer valid; the client still holds the old key.Fix: Update every consumer with the new AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY. Stored objects are unaffected.Admin UI returns 404 or is unreachable
Admin UI returns 404 or is unreachable
23646 return 404, or the port cannot be reached at all.Cause: With adminUI.enabled: false the admin routes are unregistered and the port is not declared on the workload. With it enabled, the UI is still never publicly routed — publicAccess.enabled: true exposes port 8333 only, and requesting /login on the public endpoint reaches the S3 gateway instead.Fix: Set adminUI.enabled: true (with adminUI.credentialsSecretName pointing at an existing secret), and reach the UI with cpln port-forward RELEASE_NAME-seaweedfs 23646:23646 --gvc GVC_NAME or from a workload inside the GVC.Changing publicAccess or internalAccess appears to have no effect
Changing publicAccess or internalAccess appears to have no effect
helm upgrade that flipped an access setting, requests still get the old answer.Cause: Firewall changes take a few minutes to propagate.Fix: Wait and re-test before concluding the setting is broken.Important Notes
- Create both prerequisite secrets before installing. A missing one wedges the deployment with no log output;
cpln workload get-deploymentsis the one command that names it. - The template creates no secrets. Both credentials are yours, so
helm uninstallleaves them in place. - Clients must use path-style addressing; virtual-host style is not served.
- Only the S3 API is publicly routable.
publicAccessexposes port8333alone — reach the admin UI throughcpln port-forwardor from inside the GVC. - Single replica by design — every redeploy or upgrade is a full S3 outage until the replica is back.
- Rotating a secret requires a forced redeployment to take effect; update every consumer at the same time.
- Uninstall deletes the volume set and every stored object, keeping a final snapshot for 7 days.
- Upgrading from
1.0.0requires the admin credentials secret and removingadminUI.username/adminUI.passwordfrom your values.