−25%

på Windows vid årsbetalning, till 31/10. Till paketen

EQVPS
Kom igång

VPS för Langfuse: se vad dina AI-agenter gjorde

Kör Langfuse själv och spåra varje LLM-anrop och verktygssteg från agenter som jobbar utan tillsyn. Testad Docker Compose, verkliga RAM-siffror och en plan.

En agent som jobbar klockan tre på natten utan att någon tittar är värd exakt så mycket som din förmåga att i efterhand rekonstruera vad den gjorde. ”Brände tokens för 38 $ under natten” är en dålig morgon. ”Brände 38 $ för att ett sökverktyg returnerade en tom sida och planeraren försökte igen 400 gånger” är en bugg du fixar före lunch. Den andra meningen kräver traces.

Langfuse sparar varje LLM-anrop, med prompt, verktygssteg, antal tokens och latens, som ett träd du kan klicka dig igenom. Kör du det själv stannar prompterna och svaren — som ofta innehåller kunddata, API-svar och någon vilsekommen hemlighet — på en server du kontrollerar, inte i någon annans panel.

Vad det kostar att hålla igång

Langfuse v4 är inte en liten binär utan sex containrar: webbappen, en bakgrundsworker, Postgres, ClickHouse för händelser, Redis och MinIO för filer. Vi installerade det på en testserver och mätte runt 3,5 GB använt RAM med ett tomt projekt. Det som växer är ClickHouse, eftersom varje span du skickar hamnar där.

BelastningPlan
En handfull agenter, veckor av tracesMedium-IP: 6 vCPU, 6 GB, 45 GB ($20/mån)
En flotta agenter, månader av historikPro-planer, från 32 GB RAM — på förfrågan

På mindre planer går det att installera, men sedan kämpar det så fort ClickHouse och workern vill ha minne samtidigt. Jag skulle inte gå under 6 GB.

Var bor agenterna? Körs de på andra maskiner, välj en plan med egen IPv4: de behöver en HTTPS-endpoint, och på en NAT-plan är den utgående adressen inte din egen och utifrån når man bara SSH-porten. Körs agenterna på samma server behöver Langfuse aldrig synas mot internet: för ett test räcker Medium med NAT ($12/mån). Det finns två platser, Tyskland och Finland; tillgängligheten syns vid beställning. Välj den som ligger närmast agenterna, inte dig. Servrarna betalas med krypto, utan KYC.

Installation

På en nyinstallerad Ubuntu 24.04- eller Debian 12-server, som root. Först Docker:

curl -fsSL https://get.docker.com | sh

Sedan Langfuse, med riktiga hemligheter i stället för compose-filens standardvärden:

git clone --depth 1 https://github.com/langfuse/langfuse.git
cd langfuse

PG=$(openssl rand -hex 16); MINIO=$(openssl rand -hex 16)
cat > .env <<EOF
NEXTAUTH_URL=https://langfuse.example.com
NEXTAUTH_SECRET=$(openssl rand -hex 32)
SALT=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
POSTGRES_PASSWORD=$PG
DATABASE_URL=postgresql://postgres:$PG@postgres:5432/postgres
CLICKHOUSE_PASSWORD=$(openssl rand -hex 16)
MINIO_ROOT_PASSWORD=$MINIO
LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY=$MINIO
LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY=$MINIO
LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY=$MINIO
REDIS_AUTH=$(openssl rand -hex 16)
TELEMETRY_ENABLED=false
EOF
chmod 600 .env

Två av lösenorden hör ihop: Postgres-lösenordet finns också i DATABASE_URL, och MinIO-lösenordet måste stämma med de tre raderna S3_..._SECRET_ACCESS_KEY. Därför kommer vart och ett från en enda variabel.

Nu fällan. Compose-filen publicerar webbappen på port 3000 och MinIO på 9090 på alla gränssnitt, och portar som Docker publicerar går förbi ufw. Bind båda till localhost så att reverse proxyn blir den enda vägen in:

sed -i 's/- 3000:3000/- 127.0.0.1:3000:3000/; s/- 9090:9000/- 127.0.0.1:9090:9000/' docker-compose.yml
docker compose up -d
curl -s http://127.0.0.1:3000/api/public/health

Det sista kommandot ska skriva ut {"status":"OK", ...}. Första starten kör databasmigreringarna; i vårt test gick hälsokontrollen igenom ungefär 15 sekunder efter att containrarna kommit upp.

HTTPS framför

Peka langfuse.example.com mot serverns IP och sedan:

apt install -y caddy
cat > /etc/caddy/Caddyfile <<'EOF'
langfuse.example.com {
    reverse_proxy 127.0.0.1:3000
}
EOF
systemctl reload caddy
ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw enable

Caddy hämtar certifikatet själv. Öppna sajten, skapa ditt konto (det blir den första organisationen), lägg till ett projekt och kopiera dess publika och hemliga nyckel.

Stäng sedan dörren efter dig. Langfuse förstår AUTH_DISABLE_SIGNUP, men standardfilen för compose skickar inte vidare den till webbcontainern, så det behövs en rad till under langfuse-web:

sed -i 's|^      NEXTAUTH_SECRET: \(.*\)$|      NEXTAUTH_SECRET: \1\n      AUTH_DISABLE_SIGNUP: ${AUTH_DISABLE_SIGNUP:-false}|' docker-compose.yml
echo "AUTH_DISABLE_SIGNUP=true" >> .env
docker compose up -d

Från och med nu får ett registreringsförsök «Sign up is disabled». Kollegor lägger du till inifrån projektet.

Skicka traces från en agent

Python-SDK:t lindar in dina funktioner, och nästlade anrop blir nästlade spans:

python3 -m venv venv && . venv/bin/activate
pip install langfuse
export LANGFUSE_PUBLIC_KEY=pk-lf-...
export LANGFUSE_SECRET_KEY=sk-lf-...
export LANGFUSE_BASE_URL=https://langfuse.example.com
from langfuse import get_client, observe

langfuse = get_client()  # läser LANGFUSE_*-variablerna

@observe(name="fetch-prices")
def fetch_prices(pair: str) -> dict:
    return {"pair": pair, "bid": 64210.5}

@observe(name="nightly-agent-run")
def run() -> str:
    data = fetch_prices("BTC/USDT")
    return f"done: {data['pair']}"

print(run())
langfuse.flush()  # korta skript avslutas innan sändningen i bakgrunden är klar

Hoppa inte över LANGFUSE_BASE_URL. Utan den skickar SDK:t tyst allt till Langfuses moln, dina nycklar finns inte där och du stirrar på en tom panel.

Så kontrollerar du från terminalen att spansen kom fram:

curl -s -u "$LANGFUSE_PUBLIC_KEY:$LANGFUSE_SECRET_KEY" \
  "$LANGFUSE_BASE_URL/api/public/v2/observations?limit=5"

I v4 svarar den gamla endpointen /api/public/traces med ett fel om events-only-läget. Det är väntat, inte en trasig installation. I en riktig agent lindar du in LLM-anropet och varje verktyg på samma sätt; dessutom har Langfuse integrationer för de vanliga LLM-SDK:erna och agentramverken, så ofta räcker det att byta en import i stället för att strö dekoratorer överallt.

Att hålla koll på

  • Disk. ClickHouse och MinIO sparar allt du skickar. docker system df -v visar vart utrymmet tog vägen. Spårar du långa prompter och svar fylls Medium-IP:s 45 GB på veckor, inte år. Kolla en gång i månaden; när det blir trångt finns en Pro-plan med 400 GB eller mer på förfrågan.
  • Uppdateringar. Compose-filen låser huvudversionen (:4). docker compose pull && docker compose up -d hämtar rättningar inom den. Läs changeloggen innan du byter huvudversion: det var just i v4 som traces-endpointen försvann.
  • Säkerhetskopior. Det som betyder något ligger i Docker-volymer: Postgres håller användare, projekt och nycklar, ClickHouse och MinIO själva traces. Kopiera dem bort från servern enligt ett schema.

Är det värt $20 i månaden? Om dina agenter gör av med mer än så på tokens — och de flesta agenter utan tillsyn gör det — betalar sig vetskapen om vart tokens tog vägen första gången en loop skenar. En liten agent som körs en gång om dagen behöver inget av detta: en loggfil och en tokenräknare räcker.

Relaterat

Redo att distribuera? Betala med krypto, ingen KYC — igång på ungefär en minut.

Distribuera nu →

FAQ

Hur mycket RAM behöver ett egenhostat Langfuse?

På vår testserver körde Langfuse v4 som sex containrar — web, worker, Postgres, ClickHouse, Redis och MinIO — och använde runt 3,5 GB RAM med ett tomt projekt. ClickHouse växer med varje span du skickar. Medium-IP (6 GB RAM, 45 GB disk) klarar det bekvämt för en handfull agenter; en hel flotta med månader av historik behöver en Pro-plan, som finns på förfrågan.

Behöver Langfuse en egen IP-adress?

Bara om agenterna körs någon annanstans och skickar traces över internet: de behöver en HTTPS-endpoint, och en NAT-plan tar bara emot din SSH-port utifrån. Bor agenterna på samma server kan Langfuse stanna på localhost, och du öppnar panelen via en SSH-tunnel; då räcker Medium-planen med NAT.

Koden körs, men panelen är tom. Varför?

Nästan alltid saknas LANGFUSE_BASE_URL. Utan den skickar SDK:t allt till Langfuses eget moln, dina egenhostade nycklar finns inte där och ingenting når din server. Sätt din egen adress i variabeln.

Endpointen /api/public/traces ger ett fel. Är installationen trasig?

Nej. Langfuse v4 körs i ett events-only-läge där den endpointen är avstängd. Läs data via /api/public/v2/observations — det var med det anropet vi kontrollerade att våra testspans hade kommit fram.

Hur hindrar jag främlingar från att registrera sig på min instans?

Langfuse läser AUTH_DISABLE_SIGNUP, men standardfilen docker-compose.yml skickar inte vidare variabeln till webbcontainern, så det hjälper inte att bara lägga den i .env. Lägg till en rad i miljön för langfuse-web (kommandot finns nedan), sätt den till true när du skapat ditt eget konto, så får nästa registreringar «Sign up is disabled».

Kommentarer

Inga kommentarer än. Bli först.

Lämna en kommentar

Kommentarer modereras innan de visas.