−25%

på Windows ved årlig betaling, til 31/10. Se pakkerne

EQVPS
Kom i gang

VPS til Langfuse: se, hvad dine AI-agenter gjorde

Kør Langfuse selv og spor hvert LLM-kald og hvert værktøjstrin fra agenter, der kører uden opsyn. Testet Docker Compose, rigtige RAM-tal og en plan.

En agent, der arbejder klokken tre om natten uden at nogen kigger med, er præcis så meget værd som din evne til bagefter at stykke sammen, hvad den lavede. „Brændte tokens af for 38 $ i nat” er en dårlig morgen. „Brændte 38 $ af, fordi et søgeværktøj returnerede en tom side, og planlæggeren prøvede igen 400 gange” er en fejl, du retter før frokost. Den anden sætning kræver traces.

Langfuse gemmer hvert LLM-kald med prompt, værktøjstrin, antal tokens og latenstid som et træ, du kan klikke dig igennem. Kører du det selv, bliver de prompts og svar — der tit indeholder kundedata, API-output og en enkelt forvildet hemmelighed — på en server, du styrer, og ikke i en andens panel.

Hvad det koster at holde kørende

Langfuse v4 er ikke en lille binær fil, men seks containere: webappen, en baggrundsworker, Postgres, ClickHouse til hændelser, Redis og MinIO til filer. Vi installerede det på en testserver og målte omkring 3,5 GB brugt RAM med et tomt projekt. Det, der vokser, er ClickHouse, for dér ender hvert span, du sender.

BelastningPlan
En håndfuld agenter, ugers tracesMedium-IP: 6 vCPU, 6 GB, 45 GB ($20/md.)
En flåde af agenter, måneders historikPro-planer, fra 32 GB RAM — på forespørgsel

På mindre planer kan det installeres, men så kæmper det, så snart ClickHouse og workeren vil have hukommelse på samme tid. Jeg ville ikke gå under 6 GB.

Hvor bor agenterne? Kører de på andre maskiner, så vælg en plan med egen IPv4: de skal bruge et HTTPS-endpoint, og på en NAT-plan er den udgående adresse ikke din egen, og udefra kan man kun nå SSH-porten. Kører agenterne på selve serveren, behøver Langfuse aldrig at vende ud mod internettet: til en test rækker Medium med NAT ($12/md.). Der er to placeringer, Tyskland og Finland; tilgængeligheden ses ved bestilling. Vælg den, der ligger tættest på agenterne, ikke på dig. Serverne betales med krypto, uden KYC.

Installation

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

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

Derefter Langfuse, med rigtige hemmeligheder i stedet for compose-filens standardværdier:

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

To af adgangskoderne hænger sammen: Postgres-koden står også inde i DATABASE_URL, og MinIO-koden skal passe med de tre linjer S3_..._SECRET_ACCESS_KEY. Derfor kommer hver af dem fra én variabel.

Nu fælden. Compose-filen udgiver webappen på port 3000 og MinIO på 9090 på alle interfaces, og porte, som Docker udgiver, går uden om ufw. Bind begge til localhost, så reverse proxyen er den eneste vej ind:

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

Den sidste kommando skal udskrive {"status":"OK", ...}. Første opstart kører databasemigreringerne; i vores test gik health checket igennem omkring 15 sekunder efter, at containerne var kommet op.

HTTPS foran

Peg langfuse.example.com på serverens IP og derefter:

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 henter selv certifikatet. Åbn sitet, opret din konto (den bliver den første organisation), tilføj et projekt, og kopiér dets offentlige og hemmelige nøgle.

Luk så døren efter dig. Langfuse forstår AUTH_DISABLE_SIGNUP, men standardfilen for compose sender den ikke videre til webcontaineren, så der skal én linje mere ind 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

Fra nu af får et tilmeldingsforsøg «Sign up is disabled». Kolleger tilføjer du inde fra projektet.

Send traces fra en agent

Python-SDK'et pakker dine funktioner ind, og indlejrede kald bliver til indlejrede 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_*-variablerne

@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()  # korte scripts slutter, før afsendelsen i baggrunden er færdig

Spring ikke LANGFUSE_BASE_URL over. Uden den sender SDK'et stille og roligt alt til Langfuses sky, dine nøgler findes ikke der, og du sidder og kigger på et tomt panel.

Sådan tjekker du fra terminalen, at dine spans er kommet frem:

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

I v4 svarer det gamle endpoint /api/public/traces med en fejl om events-only-tilstanden. Det er forventet og ikke en ødelagt installation. I en rigtig agent pakker du LLM-kaldet og hvert værktøj ind på samme måde; desuden har Langfuse integrationer til de udbredte LLM-SDK'er og agent-frameworks, så tit er det nok at skifte en import i stedet for at strø dekoratorer ud over det hele.

Hold øje med

  • Disk. ClickHouse og MinIO gemmer alt, hvad du sender. docker system df -v viser, hvor pladsen er blevet af. Sporer du lange prompts og svar, er Medium-IP's 45 GB fyldt på uger, ikke år. Tjek én gang om måneden; når der bliver trangt, fås en Pro-plan med 400 GB eller mere på forespørgsel.
  • Opdateringer. Compose-filen låser hovedversionen (:4). docker compose pull && docker compose up -d henter rettelser inden for den. Læs changeloggen, før du skifter hovedversion: det var netop i v4, at traces-endpointet forsvandt.
  • Backup. Det vigtige ligger i Docker-volumener: Postgres holder brugere, projekter og nøgler, ClickHouse og MinIO selve sporene. Kopiér dem væk fra serveren efter en fast plan.

Er det $20 om måneden værd? Hvis dine agenter bruger mere end det på tokens — og det gør de fleste agenter uden opsyn — så tjener det sig hjem at vide, hvor de blev af, første gang en løkke løber løbsk. En lille agent, der kører én gang om dagen, har ikke brug for noget af det her: en logfil og en tokentæller er nok.

Relateret

Klar til at deploye? Betal med krypto, ingen KYC — live på cirka et minut.

Deploy nu →

FAQ

Hvor meget RAM kræver et selvhostet Langfuse?

På vores testserver kørte Langfuse v4 som seks containere — web, worker, Postgres, ClickHouse, Redis og MinIO — og brugte omkring 3,5 GB RAM med et tomt projekt. ClickHouse vokser med hvert span, du sender. Medium-IP (6 GB RAM, 45 GB disk) klarer det roligt for en håndfuld agenter; en hel flåde med måneders historik kræver en Pro-plan, som fås på forespørgsel.

Skal Langfuse have sin egen IP-adresse?

Kun hvis agenterne kører et andet sted og sender traces over internettet: de skal bruge et HTTPS-endpoint, og en NAT-plan modtager udefra kun din SSH-port. Bor agenterne på samme server, kan Langfuse blive på localhost, og du åbner panelet gennem en SSH-tunnel; til det rækker Medium-planen med NAT.

Koden kører, men panelet er tomt. Hvorfor?

Næsten altid mangler LANGFUSE_BASE_URL. Uden den sender SDK'et alt til Langfuses egen sky, dine selvhostede nøgler findes ikke der, og intet når frem til din server. Sæt din egen adresse i variablen.

Endpointet /api/public/traces giver en fejl. Er installationen i stykker?

Nej. Langfuse v4 kører i en events-only-tilstand, hvor det endpoint er slået fra. Læs data via /api/public/v2/observations — det var med det kald, vi tjekkede, at vores test-spans var kommet frem.

Hvordan forhindrer jeg fremmede i at oprette sig på min instans?

Langfuse læser AUTH_DISABLE_SIGNUP, men standardfilen docker-compose.yml sender ikke variablen videre til webcontaineren, så det nytter ikke kun at skrive den i .env. Tilføj én linje til miljøet for langfuse-web (kommandoen står nedenfor), sæt den til true, når du har oprettet din egen konto, og næste tilmeldinger får «Sign up is disabled».

Kommentarer

Ingen kommentarer endnu. Vær den første.

Skriv en kommentar

Kommentarer modereres, før de vises.