−25%

la planurile Windows anuale, până pe 31 oct. Vezi planurile

EQVPS
Începe

VPS pentru Langfuse: vezi ce au făcut agenții tăi AI

Langfuse pe serverul tău: urmărește fiecare apel LLM și fiecare pas de unealtă al agenților care rulează nesupravegheați. Docker Compose testat, RAM real, plan.

Un agent care lucrează la trei noaptea fără să-l urmărească nimeni valorează exact cât capacitatea ta de a reconstitui ulterior ce a făcut. „A ars tokeni de 38 $ peste noapte” e o dimineață proastă. „A ars 38 $ pentru că o unealtă de căutare a întors o pagină goală, iar planificatorul a reîncercat de 400 de ori” e un bug pe care îl repari înainte de prânz. Pentru a doua propoziție ai nevoie de trace-uri.

Langfuse înregistrează fiecare apel LLM, fiecare prompt, pas de unealtă, număr de tokeni și latență ca pe un arbore prin care poți naviga cu clicuri. Găzduit de tine, toate aceste prompturi și răspunsuri — care conțin adesea date de clienți, rezultate de API și câte un secret rătăcit — rămân pe un server pe care îl controlezi, nu în panoul altcuiva.

Cât costă să-l ții pornit

Langfuse v4 nu e un binar mic, ci șase containere: aplicația web, un worker în fundal, Postgres, ClickHouse pentru evenimente, Redis și MinIO pentru fișiere. L-am instalat pe un server de test și am măsurat circa 3,5 GB RAM folosiți cu un proiect gol. Ce crește este ClickHouse, pentru că acolo ajunge fiecare span trimis.

ÎncărcarePlan
Câțiva agenți, trace-uri pe săptămâniMedium-IP — 6 vCPU, 6 GB, 45 GB ($20/lună)
O flotă de agenți, istoric pe luniPlanuri Pro, de la 32 GB RAM în sus — la cerere

Pe planurile mai mici se instalează, dar apoi se sufocă de îndată ce ClickHouse și workerul vor memorie în același timp. N-aș coborî sub 6 GB.

Unde stau agenții? Dacă rulează pe alte mașini, alege un plan cu IPv4 propriu: au nevoie de un endpoint HTTPS, iar pe un plan NAT adresa de ieșire nu este a ta și din exterior se ajunge doar la portul SSH. Dacă agenții rulează chiar pe acest server, Langfuse nu trebuie să iasă deloc pe internet: pentru o probă ajunge Medium cu NAT ($12/lună). Există două locații din UE (disponibilitatea se vede la comandă). Alege-o pe cea mai apropiată de agenți, nu de tine. Serverele se plătesc în cripto, fără KYC.

Instalare

Pe un server proaspăt cu Ubuntu 24.04 sau Debian 12, ca root. Întâi Docker:

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

Apoi Langfuse, cu secrete reale în locul valorilor implicite din fișierul compose:

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

Două dintre parole merg în pereche: parola Postgres stă și în DATABASE_URL, iar parola MinIO trebuie să coincidă cu cele trei rânduri S3_..._SECRET_ACCESS_KEY. De aceea fiecare vine dintr-o singură variabilă.

Acum capcana. Fișierul compose publică aplicația web pe portul 3000 și MinIO pe 9090 pe toate interfețele, iar porturile publicate de Docker ocolesc ufw. Leagă-le pe amândouă de localhost, ca singura intrare să rămână reverse proxy-ul:

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

Ultima comandă ar trebui să afișeze {"status":"OK", ...}. Prima pornire rulează migrările bazei de date; în testul nostru, verificarea de sănătate a trecut la circa 15 secunde după ce au pornit containerele.

HTTPS în față

Îndreaptă langfuse.example.com spre IP-ul serverului, apoi:

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 obține singur certificatul. Deschide site-ul, creează-ți contul (devine prima organizație), adaugă un proiect și copiază-i cheile publică și secretă.

Apoi închide ușa în urma ta. Langfuse înțelege AUTH_DISABLE_SIGNUP, dar fișierul compose standard nu o transmite containerului web, așa că e nevoie de încă un rând sub 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

De acum, o încercare de înregistrare primește «Sign up is disabled». Colegii îi adaugi din interiorul proiectului.

Trimiterea trace-urilor dintr-un agent

SDK-ul Python îți învelește funcțiile, iar apelurile imbricate devin span-uri imbricate:

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()  # citește variabilele LANGFUSE_*

@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()  # scripturile scurte se încheie înainte ca trimiterea din fundal să termine

Nu sări peste LANGFUSE_BASE_URL. Fără ea, SDK-ul trimite totul în tăcere în cloudul Langfuse, cheile tale nu există acolo și te uiți la un panou gol.

Ca să verifici din consolă că span-urile au ajuns:

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

În v4, vechiul endpoint /api/public/traces răspunde cu o eroare despre modul events-only. Este de așteptat, nu e o instalare stricată. Într-un agent real înveleşti la fel apelul LLM și fiecare unealtă; în plus, Langfuse are integrări pentru SDK-urile LLM și framework-urile de agenți populare, așa că de multe ori ajunge să schimbi un import în loc să presari decoratori peste tot.

La ce să fii atent

  • Disc. ClickHouse și MinIO păstrează tot ce trimiți. docker system df -v arată unde s-a dus spațiul. Dacă urmărești prompturi și răspunsuri lungi, cei 45 GB de pe Medium-IP se umplu în săptămâni, nu în ani. Verifică o dată pe lună; când devine strâmt, un plan Pro cu 400 GB sau mai mult este la cerere.
  • Actualizări. Fișierul compose fixează versiunea majoră (:4). docker compose pull && docker compose up -d aduce corecturile din cadrul ei. Citește changelog-ul înainte să schimbi versiunea majoră: exact în v4 a dispărut endpointul de trace-uri.
  • Backupuri. Ce contează stă în volume Docker: Postgres ține utilizatorii, proiectele și cheile; ClickHouse și MinIO, trace-urile propriu-zise. Copiază-le în afara serverului după un program.

Merită $20 pe lună? Dacă agenții tăi cheltuie mai mult de atât pe tokeni — și majoritatea agenților nesupravegheați cheltuie —, să știi unde s-au dus tokenii se amortizează prima dată când o buclă o ia razna. Un agent mic care rulează o dată pe zi nu are nevoie de nimic din toate acestea: ajung un fișier de log și un contor de tokeni.

Articole conexe

Gata de deploy? Plătește cu cripto, fără KYC — online în aproximativ un minut.

Pornește acum →

Întrebări frecvente

De câtă memorie RAM are nevoie Langfuse găzduit de tine?

Pe serverul nostru de test, Langfuse v4 a rulat ca șase containere — web, worker, Postgres, ClickHouse, Redis și MinIO — și a folosit circa 3,5 GB RAM cu un proiect gol. ClickHouse crește cu fiecare span pe care îl trimiți. Medium-IP (6 GB RAM, 45 GB disc) îl duce fără efort pentru câțiva agenți; o flotă întreagă cu luni de istoric are nevoie de un plan Pro, disponibil la cerere.

Are nevoie Langfuse de o adresă IP proprie?

Doar dacă agenții rulează în altă parte și trimit trace-uri prin internet: au nevoie de un endpoint HTTPS, iar un plan NAT acceptă din exterior doar portul tău SSH. Dacă agenții stau pe același server, Langfuse poate rămâne pe localhost, iar panoul îl deschizi printr-un tunel SSH; pentru asta ajunge planul Medium cu NAT.

Codul rulează, dar panoul rămâne gol. De ce?

Aproape întotdeauna lipsește LANGFUSE_BASE_URL. Fără ea, SDK-ul trimite totul în cloudul Langfuse, cheile tale de pe propriul server nu există acolo și la serverul tău nu ajunge nimic. Pune în variabilă propria adresă.

Endpointul /api/public/traces întoarce o eroare. E stricată instalarea?

Nu. Langfuse v4 rulează într-un mod events-only, în care acel endpoint este dezactivat. Citește datele prin /api/public/v2/observations — cu acest apel am verificat noi că span-urile de test au ajuns.

Cum împiedic străinii să se înregistreze pe instanța mea?

Langfuse citește AUTH_DISABLE_SIGNUP, dar docker-compose.yml standard nu transmite variabila către containerul web, așa că doar un rând în .env nu ajută. Adaugă un rând în mediul lui langfuse-web (comanda e mai jos), setează true după ce îți creezi contul, iar înregistrările următoare primesc «Sign up is disabled».

Comentarii

Încă nu există comentarii. Fii primul.

Lasă un comentariu

Comentariile sunt moderate înainte să apară.