Agent, który pracuje o trzeciej w nocy bez nadzoru, jest wart tyle, ile Twoja zdolność do odtworzenia potem, co właściwie zrobił. „Przepalił w nocy tokeny za 38 $” to zły poranek. „Przepalił 38 $, bo narzędzie wyszukiwania zwróciło pustą stronę, a planista ponowił próbę 400 razy” to błąd, który naprawiasz przed obiadem. Do tego drugiego zdania potrzebne są ślady.
Langfuse zapisuje każde wywołanie LLM, każdy prompt, krok narzędzia, liczbę tokenów i opóźnienie w postaci drzewa, po którym można klikać. Na własnym serwerze te prompty i odpowiedzi — w których często są dane klientów, wyniki API i czasem jakiś zabłąkany sekret — zostają u Ciebie, a nie w cudzym panelu.
Ile kosztuje utrzymanie
Langfuse v4 to nie mały plik binarny, tylko sześć kontenerów: aplikacja webowa, worker w tle, Postgres, ClickHouse na zdarzenia, Redis i MinIO na pliki. Postawiliśmy go na serwerze testowym i zmierzyliśmy około 3,5 GB zajętej RAM przy pustym projekcie. Rośnie ClickHouse, bo tam trafia każdy wysłany span.
| Obciążenie | Plan |
|---|---|
| Kilka agentów, ślady z kilku tygodni | Medium-IP: 6 vCPU, 6 GB, 45 GB ($20/mies.) |
| Flota agentów, historia z wielu miesięcy | Plany Pro, od 32 GB RAM — na zapytanie |
Na mniejszych planach się zainstaluje, a potem zacznie się dusić, gdy tylko ClickHouse i worker zechcą pamięci jednocześnie. Nie schodziłbym poniżej 6 GB.
Gdzie mieszkają agenty? Jeśli działają na innych maszynach, weź plan z własnym IPv4: potrzebują endpointu HTTPS, a na planie NAT adres wychodzący nie jest Twój i z zewnątrz dostępny jest tylko port SSH. Jeśli agenty działają na tym samym serwerze, Langfuse w ogóle nie musi wystawiać się do internetu: na próbę wystarczy Medium z NAT ($12/mies.). Lokalizacje są dwie, Niemcy i Finlandia; dostępność widać przy zamówieniu. Wybierz tę bliższą agentom, nie Tobie. Za serwery płacisz kryptowalutą, bez KYC.
Instalacja
Na świeżym serwerze z Ubuntu 24.04 lub Debianem 12, jako root. Najpierw Docker:
curl -fsSL https://get.docker.com | sh
Potem Langfuse — z prawdziwymi sekretami zamiast domyślnych wartości z pliku 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
Dwa z tych haseł mają pary: hasło Postgres siedzi też w DATABASE_URL, a hasło MinIO musi się zgadzać z trzema liniami S3_..._SECRET_ACCESS_KEY. Dlatego każde pochodzi z jednej zmiennej.
Teraz pułapka. Plik compose publikuje aplikację webową na porcie 3000, a MinIO na 9090 na wszystkich interfejsach, a porty publikowane przez Dockera omijają ufw. Przypnij oba do localhost, żeby jedynym wejściem został reverse proxy:
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
Ostatnie polecenie powinno wypisać {"status":"OK", ...}. Pierwsze uruchomienie wykonuje migracje bazy; u nas health check przeszedł około 15 sekund po starcie kontenerów.
HTTPS z przodu
Skieruj langfuse.example.com na IP serwera, a potem:
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 sam pobierze certyfikat. Otwórz stronę, załóż konto (stanie się pierwszą organizacją), dodaj projekt i skopiuj jego klucz publiczny i tajny.
Potem zamknij za sobą drzwi. Langfuse rozumie AUTH_DISABLE_SIGNUP, ale standardowy plik compose nie przekazuje jej do kontenera web, więc potrzebna jest jedna dodatkowa linia pod 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
Od teraz próba rejestracji dostaje «Sign up is disabled». Współpracowników dodajesz z poziomu projektu.
Wysyłanie śladów z agenta
SDK dla Pythona opakowuje Twoje funkcje, a zagnieżdżone wywołania stają się zagnieżdżonymi spanami:
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() # czyta zmienne 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() # krótkie skrypty kończą się, zanim wysyłanie w tle się skończy
Nie pomijaj LANGFUSE_BASE_URL. Bez tej zmiennej SDK po cichu wysyła wszystko do chmury Langfuse, Twoich kluczy tam nie ma, a Ty patrzysz na pusty panel.
Sprawdzenie z konsoli, czy spany dotarły:
curl -s -u "$LANGFUSE_PUBLIC_KEY:$LANGFUSE_SECRET_KEY" \
"$LANGFUSE_BASE_URL/api/public/v2/observations?limit=5"
W v4 stary endpoint /api/public/traces odpowiada błędem o trybie events-only. Tak ma być, instalacja nie jest zepsuta. W prawdziwym agencie tak samo opakowujesz wywołanie LLM i każde narzędzie; do tego Langfuse ma integracje z popularnymi SDK dla LLM i frameworkami agentów, więc często wystarczy zmienić import, zamiast rozstawiać dekoratory wszędzie.
Na co uważać
- Dysk. ClickHouse i MinIO trzymają wszystko, co wyślesz.
docker system df -vpokaże, gdzie podziało się miejsce. Jeśli śledzisz długie prompty i odpowiedzi, 45 GB na Medium-IP zapełni się w tygodnie, nie w lata. Sprawdzaj raz w miesiącu; gdy zrobi się ciasno, plan Pro z 400 GB lub więcej jest na zapytanie. - Aktualizacje. Plik compose przypina wersję główną (
:4).docker compose pull && docker compose up -dpobiera poprawki w jej obrębie. Przed zmianą wersji głównej przeczytaj changelog: właśnie w v4 zniknął endpoint śladów. - Kopie zapasowe. To, co ważne, leży w wolumenach Dockera: Postgres trzyma użytkowników, projekty i klucze, ClickHouse i MinIO — same ślady. Kopiuj je poza serwer według harmonogramu.
Czy to warte $20 miesięcznie? Jeśli Twoje agenty wydają na tokeny więcej — a większość agentów bez nadzoru wydaje — wiedza, gdzie poszły tokeny, zwraca się przy pierwszej pętli, która wymknie się spod kontroli. Mały agent uruchamiany raz dziennie nie potrzebuje niczego z tego: wystarczy plik logów i licznik tokenów.
Powiązane
- VPS dla agentów AI — gdzie działają same agenty
- VPS dla systemów wieloagentowych — jak dobrać zasoby dla całej floty
- VPS dla proxy LiteLLM — jedna bramka dla wszystkich kluczy modeli, z limitami wydatków
- Plany Pro na zapytanie — od 32 do 80 GB RAM dla floty agentów
- Jak skonfigurować zaporę ufw
Komentarze
Brak komentarzy. Bądź pierwszy.