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.
| Belastning | Plan |
|---|---|
| En handfull agenter, veckor av traces | Medium-IP: 6 vCPU, 6 GB, 45 GB ($20/mån) |
| En flotta agenter, månader av historik | Pro-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 -vvisar 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 -dhä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
- VPS för AI-agenter: där agenterna själva körs
- VPS för multiagentsystem: dimensionera en hel flotta
- VPS för en LiteLLM-proxy: en gateway för alla modellnycklar, med kostnadstak
- Pro-planer på förfrågan: 32 till 80 GB RAM för en flotta agenter
- Så konfigurerar du en ufw-brandvägg
Kommentarer
Inga kommentarer än. Bli först.