Skip to content

langfuse: replace MinIO with SeaweedFS - #5568

Open
IgorTerenti wants to merge 2 commits into
Osmantic:mainfrom
IgorTerenti:feat/langfuse-seaweedfs
Open

IgorTerenti wants to merge 2 commits into
Osmantic:mainfrom
IgorTerenti:feat/langfuse-seaweedfs

Conversation

@IgorTerenti

Copy link
Copy Markdown

Summary

minio is now archived and langfuse was the only thing in ODS using it (s3 store for event uploads). Swapped it for a single seaweedfs container running master + volume + filer + s3 gateway in one process. Creds come in via AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY, which seaweedfs turns into a static admin identity. Telemetry, IAM, iceberg, and lance listeners are off. Small init container creates the langfuse-events bucket with weed shell and is safe to re-run.

Also renamed the .env keys to LANGFUSE_S3_ACCESS_KEY / LANGFUSE_S3_SECRET_KEY across the linux/macos/windows env generators, schema, .env.example, and fixtures. Dropped four LANGFUSE_MINIO_* schema keys that nothing generated or consumed. Data dir moves to data/langfuse/seaweedfs, old minio data isn't migrated (different on-disk format).

Two commits: one functional, one NFC for docs/comments.

AI Assistance

Claude Code drafted the analysis, compose rewrite, and doc updates. I ran the validation below on real hardware and read the full diff.

Release Lane

  • Stable hotfix targeting release/2.6.x
  • Mainline change targeting main
  • Next-minor work targeting the next feature/minor release
  • Not sure; reviewer should help classify

Stable hotfix reason:

n/a

Changed Surface

  • Docs only
  • Tests only
  • Dashboard UI
  • Dashboard API / host agent
  • Model routing / Hermes / capabilities
  • Network exposure / auth / proxy
  • Dependencies / runtime wiring

Risk And Validation

  • Risk level: High
  • Validation run:
    • git diff --check
    • Markdown/link sanity for docs
    • Focused tests listed below
    • Dashboard lint/test/build
    • Extension audit / compose validation
    • Release-grade fleet or scoped hardware validation
    • Stable-lane patch validation, if targeting release/2.6.x
    • Not required because:

Commands/results:

make lint                                          -> pass
make test                                          -> pass
make smoke                                         -> pass
python3 scripts/check-dependency-pins.py           -> pass
bash tests/contracts/test-installer-contracts.sh   -> pass
python3 scripts/audit-extensions.py --project-dir . langfuse -> clean
docker compose config (base + litellm + langfuse)  -> renders, no warnings

live stack (linux, nvidia):
  ods enable langfuse -> all six langfuse containers healthy, init Exited (0)
  s3 auth on: seaweedfs log shows admin identity added from env vars
  sent one request through litellm -> event landed under /buckets/langfuse-events/<project-id>
  no NoSuchBucket / InvalidAccessKeyId / SignatureDoesNotMatch in worker logs
  ods stop && ods start -> init re-ran and Exited (0), bucket data still there
  seaweedfs RSS ~60MiB against the 512MiB limit

Operational Change Check

  • This is not an operational change.
  • This is an operational change and validation is recorded above.
  • This is an operational change and validation is intentionally deferred for:

Notes For Reviewers

  • Anyone who already had langfuse enabled gets fresh s3 keys and an empty event store on next install run. Traces in clickhouse/postgres are unaffected. README has an "Upgrading from MinIO" note and the old data/langfuse/minio/ dir can just be deleted
  • Image is chrislusf/seaweedfs:4.47. There's no seaweedfs/seaweedfs on docker hub, upstream publishes under the maintainer's account (mirrored from ghcr). Happy to switch to the ghcr path if you'd rather avoid hub pull limits
  • Kept the init container even though seaweedfs auto-creates buckets for admin identities. Deterministic beats "probably works" here IMO
  • Memory limit went 256m -> 512m since one process now runs four components. Actual usage is way under
  • tests/smoke/installer-env-smoke.sh has two pre-existing failures (undefined ai_err), unrelated to this change
  • Noticed lib/backup-paths.sh skips all of data/langfuse/* and the coverage test never scans compose.yaml.disabled. Pre-existing gap, left it out of this PR to keep it one concern. Can open an issue if wanted

Assumed venue: PR description, so I kept the repo's required template sections and filled them in the review register.

Igor Terenti added 2 commits September 16, 2026 12:40
MinIO is now archived. Langfuse was its only consumer in ODS, as the
S3 store for event uploads. Swap it for a single SeaweedFS container
running master, volume, filer, and the S3 gateway in one process.
Credentials come from AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY, which
SeaweedFS turns into a static admin identity. Telemetry, IAM, Iceberg,
and Lance listeners are off. A small init container creates the
langfuse-events bucket with weed shell and is safe to re-run.

Rename the .env keys to LANGFUSE_S3_ACCESS_KEY / LANGFUSE_S3_SECRET_KEY
across the Linux, macOS, and Windows env generators, the schema, the
example env, and test fixtures. Drop four LANGFUSE_MINIO_* schema keys
that nothing generated or consumed. The data dir moves to
data/langfuse/seaweedfs; old MinIO data is not migrated.
README, CHANGELOG, and installer comments still named MinIO. Point them
at SeaweedFS and add a note that old MinIO bucket data is not read by
the new store. Drop LANGFUSE_MINIO_ROOT_USER from two redaction-regex
comments since the key no longer exists.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant