Description
Name of the Script
Langfuse
Script Type
CT (LXC Container)
Script path
No response
Where does it run?
None
Does this script support arm64?
arm64 not tested
Tested on
- Proxmox VE
- Incus
📋 Script Details
App: Langfuse, an open-source LLM engineering platform (tracing, evaluations, prompt management, metrics). Created May 2023, actively maintained, over 35,000 GitHub stars, tagged release source archives. Initial target: v4.63.0.
- Upstream: https://github.com/langfuse/langfuse
- Self-hosting docs: https://langfuse.com/self-hosting
- Object storage: https://github.com/seaweedfs/seaweedfs
Script type: CT (LXC), bare-metal, no Docker or Docker Compose. Files: ct/langfuse.sh, install/langfuse-install.sh, json/langfuse.json.
- Builds the web and worker applications from the official release tarball, with Node.js 24, the pnpm version the release declares, and the Rust toolchain its native worker addon needs.
- Installs PostgreSQL 17, ClickHouse (unclustered migrations), Redis and a single-node SeaweedFS S3 service natively, each as a systemd service.
- Keeps databases, event storage and worker health on loopback; the web interface listens on port 3000.
- Keeps configuration in
/opt/langfuse_data/.env, outside the replaceable source directory; the notes cover backups and taking a container snapshot before updating. - On first start, upstream's
LANGFUSE_INIT_*variables create the admin account, a Default project and its API keys. The admin login comes fromvar_admin_email(defaultadmin@example.com) andvar_admin_pass(generated when empty). They are saved to~/langfuse.creds, then the one-time values are removed from.env. Sign-up stays disabled. - Updates are health-gated: the version marker only advances after migrations and both health checks pass. SeaweedFS and golang-migrate are updated from their own releases.
- The migration unit only wants, not requires, the local PostgreSQL, ClickHouse, Redis and SeaweedFS units, so any of them can be replaced by an existing server configured in
.env. - Defaults: 4 CPU, 16 GiB RAM, 100 GB disk, unprivileged Debian 13. During the source build the container peaked at 11 GiB including page cache.
- Media uploads and batch exports are not configured by default; they need a client-reachable S3 endpoint.
Upstream sources inspected: web/Dockerfile, worker/Dockerfile, docker-compose.yml, the release's package manifests and entrypoints, native Rust addon requirements, and the PostgreSQL/ClickHouse migration scripts. Langfuse's documented deployment uses containers, so this keeps the equivalent native packaging.
Testing: nested Proxmox VE 9.2.21 (amd64), local checkout of the candidate branch (steveonjava/ProxmoxVED langfuse-native-lxc, 080a14a) with core 1ed2485, mode=mydefaults and a 30 GB disk override.
- Install: 25.5 min. All services active; only port 3000 is reachable from outside the container. The supplied admin email and password were used as given, and the login and API keys in
~/langfuse.creds(mode 600) work. Sign-up is refused and.envkeeps noLANGFUSE_INIT_*values. The password appears only in the creds file (helper log, container files and journal checked). - OTLP ingest and v2 readback, single-count usage and cost, and S3 event storage passed. Wrong passwords, wrong API keys and anonymous S3 access were rejected.
- Restarting PostgreSQL, ClickHouse, Redis or SeaweedFS left Langfuse running and healthy.
- Updates: already current (13 s, nothing touched); SeaweedFS and golang-migrate only (54 s, Langfuse untouched); forced full rebuild (11 min;
.env, S3 identity and creds file unchanged; marker advanced only after the health checks). - Reboot: web ready in about 13 s, earlier traces still readable.
- External Redis: with
.envpointed at another Redis andredis-servermasked, Langfuse started and kept working, including after a reboot. - A deleted API key stays deleted after a restart.
Contract tests also cover failed builds and failed health checks not advancing the version marker, and invalid admin email or password input falling back to the default email or a generated password. arm64 and Incus were not tested.
Activity
push-app-to-main commentedon Nov 12, 2026
#2448 was merged, marking this script Ready For Testing.
community-scripts-issue-bot commentedon Nov 12, 2026
The Langfuse script is ready for testing. Run it in the Proxmox VE shell (or on an Incus host) to create a container:
Default credentials:
Username: admin@example.com
The admin login and the Default project's API keys are saved to ~/langfuse.creds inside the container. Sign-up is off, invited users included; set AUTH_DISABLE_SIGNUP=false in /opt/langfuse_data/.env and restart langfuse-web while adding users.
Behind a reverse proxy, set NEXTAUTH_URL in /opt/langfuse_data/.env to the external URL and restart langfuse-web.
Media uploads and batch exports are not configured; they need an S3 endpoint reachable by clients.
Note: This is not in the official repo yet—it's just a dev version! After merging into ProxmoxVE, it will need to be recreated.
Discord testing thread: https://discord.com/channels/1302816934508630047/1570362908720762960
github-actions commentedon Nov 13, 2026
📊 Install telemetry for
langfuseRuns reported by the DevScripts version of this script since this issue was opened (2026-10-18).
Last run: 15.11.2026 at 15:56 UTC (2 hours 22 minutes ago) · in_progress
Last success: 2026-11-15 08:26 UTC · Last failure: 2026-11-15 15:53 UTC · Avg. install time: 9 min
Failures by cause
137Killed (SIGKILL / Out of memory?)web:build: Killed118LXC: No IP assigned to container after timeoutNo IP assigned to CT 3018 after 60 attemptsOpen in the telemetry dashboard · updated hourly · last refresh 2026-11-15 18:18 UTC
github-actions commentedon Nov 13, 2026
langfusesince this issue was opened:This issue will be closed due to lack of testing 7 days after this label, unless it recovers first: the label is removed again automatically once the script has 15 successful installs in 7 days (or more than 100 installs in total) and, past 50 installs, a success rate of at least 75% (aborted and no-result runs count as failed). Maintainers can add
keep-opento skip this check.