−25%

на річну оплату Windows, до 31.10. До тарифів

EQVPS
Почати

VPS для Langfuse: що робили ваші AI-агенти

Свій Langfuse: трасування кожного виклику LLM і кроку інструменту в агентів, що працюють без нагляду. Перевірений Docker Compose, реальні цифри RAM і тариф.

Агент, який працює о третій ночі без нагляду, рівно настільки хороший, наскільки ви потім можете відновити, що він робив. «За ніч спалив токенів на $38» — поганий ранок. «Спалив $38, бо інструмент пошуку повернув порожню сторінку, а планувальник повторив запит 400 разів» — баг, який лагодиться до обіду. Для другої фрази потрібні трасування.

Langfuse записує кожен виклик LLM, промпт, крок інструменту, кількість токенів і затримку у вигляді дерева, по якому можна клікати. Коли він стоїть на вашому сервері, усі ці промпти й відповіді — а в них зазвичай і дані клієнтів, і відповіді API, і часом випадковий секрет — лишаються у вас, а не в чужій панелі.

Скільки це коштує

Langfuse v4 — не один маленький бінарник, а шість контейнерів: веб-застосунок, фоновий воркер, Postgres, ClickHouse для подій, Redis і MinIO для файлів. Ми поставили його на тестовий сервер і заміряли: близько 3,5 ГБ RAM за порожнього проєкту. Рости буде ClickHouse — туди потрапляє кожен крок, який ви надсилаєте.

НавантаженняТариф
Кілька агентів, трасування за тижніMedium-IP — 6 vCPU, 6 ГБ, 45 ГБ ($20/міс)
Флот агентів, історія за місяціТарифи Pro, від 32 ГБ RAM — за заявкою

На менших тарифах він встановиться, а потім почне задихатися, щойно ClickHouse і воркеру одночасно знадобиться пам'ять. Менше ніж 6 ГБ я б не брав.

Де живуть агенти? Якщо на інших машинах — беріть тариф зі своєю 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, щоб єдиним входом лишився зворотний проксі:

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 обгортає ваші функції, а вкладені виклики перетворюються на вкладені кроки:

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, ваших ключів там немає — і ви дивитеся на порожню панель.

Перевірити з консолі, що кроки дійшли:

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 і фреймворками агентів, тож найчастіше вистачає змінити імпорт, а не розставляти декоратори всюди.

За чим стежити

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

Чи варте це $20 на місяць? Якщо ваші агенти витрачають на токени більше — а агенти без нагляду зазвичай витрачають, — то знання, куди пішли токени, окупиться першої ж ночі, коли якийсь цикл піде врознос. Одному маленькому агенту, що запускається раз на день, усе це не потрібно: вистачить лог-файлу й лічильника токенів.

За темою

Готові розгорнути? Оплата криптою, без KYC — сервер за хвилину.

Розгорнути →

Часті питання

Скільки пам'яті потрібно власному Langfuse?

На нашому тестовому сервері Langfuse v4 — це шість контейнерів: веб, воркер, Postgres, ClickHouse, Redis і MinIO — зайняв близько 3,5 ГБ RAM з порожнім проєктом. ClickHouse росте з кожним надісланим кроком. Medium-IP (6 ГБ RAM, 45 ГБ диска) спокійно тягне його для кількох агентів; цілому флоту агентів з історією за місяці потрібен тариф 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 — саме так ми перевірили, що тестові кроки дійшли.

Як закрити реєстрацію для сторонніх?

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

Коментарі

Поки немає коментарів. Будьте першим.

Залишити коментар

Коментарі проходять модерацію перед публікацією.