SeaweedFS — a fast, Apache-2.0 distributed object store with an S3-compatible API. Deployed single-node all-in-one (master + volume + filer + S3 gateway in one process) as a host-networked Nomad service with a persistent Docker volume.
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "seaweedfs"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The SeaweedFS container image. Pin a tag in production.
image = "chrislusf/seaweedfs:latest"
# Host port for the S3-compatible API — the endpoint your S3 clients use.
s3_port = 8333
# Host port for the master server + its web UI. SeaweedFS also binds the gRPC port master_port+10000 on the host.
master_port = 9333
# Host port for the volume server (+10000 for its gRPC port). Default 8080 — change it if another host service already uses 8080.
volume_port = 8080
# Host port for the filer + its web UI (+10000 for its gRPC port).
filer_port = 8888
# S3 access key for the admin identity. Leave BOTH access_key and secret_key empty to run open (Allow-All mode, anonymous access). Set both to require authentication for all S3 requests.
access_key = ""
# S3 secret key for the admin identity. Baked into the job as a rendered config — treat it as a secret.
secret_key = ""
# Docker named volume for /data (object data + master + filer metadata). This is all of SeaweedFS's state — back it up. SeaweedFS runs as root, so a fresh volume is writable.
data_volume = "seaweedfs_data"
# Placement constraints — pin to one node so the local volume stays put (this pack runs a single all-in-one alloc). On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# The task resources. Raise memory for large datasets — the volume server keeps needle indexes in memory.
resources = {
cpu = 500
memory = 512
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "seaweedfs" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "chrislusf/seaweedfs:latest" | The SeaweedFS container image. Pin a tag in production. |
| s3_port | number | 8333 | Host port for the S3-compatible API — the endpoint your S3 clients use. |
| master_port | number | 9333 | Host port for the master server + its web UI. SeaweedFS also binds the gRPC port master_port+10000 on the host. |
| volume_port | number | 8080 | Host port for the volume server (+10000 for its gRPC port). Default 8080 — change it if another host service already uses 8080. |
| filer_port | number | 8888 | Host port for the filer + its web UI (+10000 for its gRPC port). |
| access_key key | string | "" | S3 access key for the admin identity. Leave BOTH access_key and secret_key empty to run open (Allow-All mode, anonymous access). Set both to require authentication for all S3 requests. |
| secret_key key | string | "" | S3 secret key for the admin identity. Baked into the job as a rendered config — treat it as a secret. |
| data_volume | string | "seaweedfs_data" | Docker named volume for /data (object data + master + filer metadata). This is all of SeaweedFS's state — back it up. SeaweedFS runs as root, so a fresh volume is writable. |
| constraints | list | [] | Placement constraints — pin to one node so the local volume stays put (this pack runs a single all-in-one alloc). On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 500
memory = 512
} | The task resources. Raise memory for large datasets — the volume server keeps needle indexes in memory. |
No variables match.
SeaweedFS — a fast, Apache-2.0 distributed file/object store with an S3-compatible API. A lightweight, fully open-source alternative to MinIO for object storage: backup targets, a storage backend for Loki / the zot registry / Fleet software installers, or app assets.
This pack is single-node all-in-one: it runs weed server -s3, which starts the
master, a volume server, a filer and the S3 gateway in one process, host-networked,
with all state on a persistent Docker volume.
nomad-pack registry add nomploy github.com/Nomploy/nomad-packs
nomad-pack run seaweedfs --registry nomploy
In nomploy: create a Compose service, type Nomad Pack, pack seaweedfs, custom
registry github.com/Nomploy/nomad-packs, then Deploy.
http://<node-ip>:8333 (use path-style addressing).http://<node-ip>:9333http://<node-ip>:8888SeaweedFS also binds the gRPC ports master_port+10000, volume_port+10000,
filer_port+10000 on the host.
Follows the same optional-auth pattern as the zot pack:
access_key and secret_key empty → S3 runs open (Allow-All,
anonymous). Fine for a trusted internal network.admin identity with full permissions is rendered into the S3
config, and authentication becomes mandatory for every S3 request.| Variable | Default | Notes |
|---|---|---|
image |
chrislusf/seaweedfs:latest |
Pin a tag in production. |
s3_port |
8333 |
The S3 endpoint. |
master_port / volume_port / filer_port |
9333 / 8080 / 8888 |
Change volume_port if 8080 is taken. |
access_key / secret_key |
"" |
Both empty = open; both set = auth required. |
data_volume |
seaweedfs_data |
All state — back it up. |
constraints |
[] |
Pin to a node so the local volume stays put. |
resources |
cpu 500 / mem 512 |
Raise memory for large datasets. |
aws --endpoint-url http://<node-ip>:8333 s3 mb s3://test
aws --endpoint-url http://<node-ip>:8333 s3 cp ./file s3://test/
aws --endpoint-url http://<node-ip>:8333 s3 ls s3://test/
With auth enabled, configure the access/secret key first (aws configure) and keep
--endpoint-url path-style.
count is fixed to 1 and data is on a local volume — pin the job
with constraints. For a scale-out cluster, run separate master/volume/filer jobs.data_volume; it holds both objects and metadata.