−25%

за Windows при годишно плащане, до 31.10. Към плановете

EQVPS
Започни

VPS за Langfuse: вижте какво са правили AI агентите

Собствен Langfuse: проследявайте всяко извикване на LLM и всяка стъпка на инструмент на агентите си. Тестван Docker Compose, реални цифри за RAM и план.

Агент, който работи в три през нощта без надзор, струва точно толкова, колкото можете после да възстановите какво е правил. „За една нощ изгори токени за $38“ е лоша сутрин. „Изгори $38, защото инструментът за търсене върна празна страница, а планировчикът опита отново 400 пъти“ е бъг, който оправяте преди обяд. За второто изречение трябват следи.

Langfuse записва всяко извикване на LLM, промпт, стъпка на инструмент, брой токени и закъснение като дърво, по което можете да кликате. Когато е на ваш сървър, тези промптове и отговори — в тях обикновено има данни на клиенти, отговори от API и понякога забравена тайна — остават при вас, а не в чужд панел.

Колко струва да работи

Langfuse v4 не е един малък бинарен файл, а шест контейнера: уеб приложението, фонов worker, Postgres, ClickHouse за събитията, Redis и MinIO за файловете. Сложихме го на тестов сървър и измерихме около 3,5 GB заета RAM при празен проект. Расте ClickHouse — там попада всеки span, който изпращате.

НатоварванеПлан
Няколко агента, следи за седмициMedium-IP: 6 vCPU, 6 GB, 45 GB ($20/месец)
Флот агенти, история за месециПланове Pro, от 32 GB RAM нагоре — по заявка

На по-малки планове ще се инсталира, но после ще се задъхва, щом ClickHouse и worker-ът поискат памет едновременно. Под 6 GB не бих слизал.

Къде живеят агентите? Ако работят на други машини, вземете план със собствен IPv4: трябва им HTTPS адрес, а на план с NAT изходящият адрес не е ваш собствен и отвън е достъпен само SSH портът. Ако агентите работят на същия сървър, Langfuse изобщо не трябва да гледа към интернет: за проба стига Medium с NAT ($12/месец). Локациите са две, Германия и Финландия; наличността се вижда при поръчка. Изберете по-близката до агентите, а не до вас. Сървърите се плащат с крипто, без KYC.

Инсталация

На чист сървър с Ubuntu 24.04 или Debian 12, като root. Първо Docker:

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

После самия Langfuse — с истински тайни вместо стойностите по подразбиране от 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

Две от паролите имат двойка: паролата на Postgres стои и вътре в DATABASE_URL, а паролата на MinIO трябва да съвпада с трите реда S3_..._SECRET_ACCESS_KEY. Затова всяка идва от една променлива.

Сега капанът. Compose файлът публикува уеб приложението на порт 3000, а MinIO на 9090 на всички интерфейси, и портовете, публикувани от Docker, минават покрай ufw. Вържете и двата към localhost, за да остане 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

Последната команда трябва да изведе {"status":"OK", ...}. Първото стартиране пуска миграциите на базата; при нас проверката мина около 15 секунди след като контейнерите тръгнаха.

HTTPS отпред

Насочете langfuse.example.com към IP адреса на сървъра, след това:

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 сам взема сертификата. Отворете сайта, създайте акаунт — той става първата организация, — добавете проект и копирайте публичния и секретния му ключ.

После затворете вратата след себе си. Langfuse разбира AUTH_DISABLE_SIGNUP, но стандартният compose файл не я подава на уеб контейнера, затова трябва още един ред под 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

Оттук нататък опит за регистрация получава «Sign up is disabled». Колегите добавяте от самия проект.

Как агентът да изпраща следи

Python SDK обвива функциите ви, а вложените извиквания стават вложени 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()  # чете променливите 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()  # кратките скриптове приключват преди фоновото изпращане

Не пропускайте LANGFUSE_BASE_URL. Без нея SDK тихо праща всичко в облака на Langfuse, ключовете ви ги няма там и гледате празен панел.

Проверка от конзолата, че spans са пристигнали:

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

Във v4 старият ендпойнт /api/public/traces отговаря с грешка за режима events-only. Така трябва да е, инсталацията не е счупена. В истински агент по същия начин обвивате извикването на LLM и всеки инструмент; освен това Langfuse има интеграции с популярните SDK за LLM и рамки за агенти, така че често е достатъчно да смените един import, вместо да слагате декоратори навсякъде.

За какво да следите

  • Диск. ClickHouse и MinIO пазят всичко изпратено. Къде е отишло мястото, ще покаже docker system df -v. Ако следите дълги промптове и отговори, 45 GB на Medium-IP ще се напълнят за седмици, не за години. Проверявайте веднъж месечно; когато стане тясно, план Pro с 400 GB и повече е по заявка.
  • Обновления. Compose файлът фиксира основната версия (:4). docker compose pull && docker compose up -d дърпа поправките в нейните рамки. Преди смяна на основна версия четете changelog: точно във v4 изчезна ендпойнтът за следи.
  • Резервни копия. Всичко ценно е в томовете на Docker: в Postgres са потребителите, проектите и ключовете, в ClickHouse и MinIO — самите следи. Копирайте ги извън сървъра по график.

Струва ли си $20 на месец? Ако агентите ви харчат за токени повече — а агентите без надзор обикновено харчат, — знанието къде са отишли токените се изплаща още първия път, когато някой цикъл излезе от контрол. На един малък агент, пускан веднъж дневно, нищо от това не му трябва: стигат лог файл и брояч на токени.

Свързано

Готов за deploy? Плати в crypto, без KYC — онлайн за около минута.

Deploy-ни сега →

Въпроси

Колко RAM трябва на Langfuse на собствен сървър?

На тестовия ни сървър Langfuse v4 работеше като шест контейнера — web, worker, Postgres, ClickHouse, Redis и MinIO — и заемаше около 3,5 GB RAM с празен проект. ClickHouse расте с всеки изпратен span. Medium-IP (6 GB RAM, 45 GB диск) го движи спокойно за няколко агента; цял флот агенти с история от месеци изисква план Pro, наличен по заявка.

Трябва ли на Langfuse собствен IP адрес?

Само ако агентите работят другаде и изпращат следи през интернет: трябва им HTTPS адрес, а план с NAT приема отвън само вашия SSH порт. Ако агентите живеят на същия сървър, Langfuse може да остане на localhost, а панела отваряте през SSH тунел; за това стига и планът Medium с NAT.

Кодът се изпълнява, но панелът е празен. Защо?

Почти винаги липсва LANGFUSE_BASE_URL. Без нея SDK изпраща всичко в облака на самия Langfuse, вашите ключове ги няма там и до сървъра ви не стига нищо. Задайте в променливата собствения си адрес.

Ендпойнтът /api/public/traces връща грешка. Счупена ли е инсталацията?

Не. Langfuse v4 работи в режим events-only, в който този ендпойнт е изключен. Четете данните през /api/public/v2/observations — точно с това извикване проверихме, че тестовите ни spans са пристигнали.

Как да спра регистрацията за непознати?

Langfuse чете AUTH_DISABLE_SIGNUP, но стандартният docker-compose.yml не подава тази променлива към уеб контейнера, така че ред само в .env не върши работа. Добавете ред в средата на langfuse-web (командата е по-долу), задайте true, след като създадете своя акаунт, и следващите регистрации получават «Sign up is disabled».

Коментари

Още няма коментари. Бъди първият.

Остави коментар

Коментарите се модерират преди да се появят.