−25%

untuk Windows tahunan, hingga 31 Okt. Lihat paket

EQVPS
Mulai

VPS untuk Langfuse: lihat apa yang dilakukan agen AI

Host Langfuse sendiri dan lacak setiap panggilan LLM serta langkah tool dari agen yang berjalan tanpa pengawasan. Docker Compose teruji, RAM nyata, dan paket.

Agen yang bekerja pukul tiga pagi tanpa ada yang mengawasi hanya seberharga kemampuan Anda untuk merekonstruksi apa yang dilakukannya. „Menghabiskan token senilai 38 $ semalam” adalah pagi yang buruk. „Menghabiskan 38 $ karena tool pencarian mengembalikan halaman kosong dan planner mencoba ulang 400 kali” adalah bug yang Anda perbaiki sebelum makan siang. Kalimat kedua butuh trace.

Langfuse mencatat setiap panggilan LLM, prompt, langkah tool, jumlah token, dan latensi sebagai pohon yang bisa Anda telusuri dengan klik. Jika Anda meng-host-nya sendiri, prompt dan jawaban itu — yang sering berisi data pelanggan, output API, dan sesekali rahasia yang nyasar — tetap di server yang Anda kendalikan, bukan di dasbor orang lain.

Biaya menjalankannya

Langfuse v4 bukan satu biner kecil, melainkan enam kontainer: aplikasi web, worker latar belakang, Postgres, ClickHouse untuk event, Redis, dan MinIO untuk file. Kami memasangnya di server uji dan mengukur sekitar 3,5 GB RAM terpakai dengan proyek kosong. Yang membesar adalah ClickHouse, karena setiap span yang Anda kirim berakhir di sana.

BebanPaket
Beberapa agen, trace berminggu-mingguMedium-IP: 6 vCPU, 6 GB, 45 GB ($20/bln)
Armada agen, riwayat berbulan-bulanPaket Pro, mulai 32 GB RAM — atas permintaan

Di paket yang lebih kecil ia bisa terpasang, tapi kemudian kewalahan begitu ClickHouse dan worker sama-sama butuh memori. Saya tidak akan memakai kurang dari 6 GB.

Di mana agen tinggal? Jika berjalan di mesin lain, pilih paket dengan IPv4 sendiri: mereka butuh endpoint HTTPS, sedangkan di paket NAT alamat keluarnya bukan milik Anda dan dari luar hanya port SSH yang bisa dijangkau. Jika agen berjalan di server ini juga, Langfuse tidak perlu menghadap internet sama sekali: untuk uji coba cukup Medium dengan NAT ($12/bln). Ada dua lokasi, Jerman dan Finlandia; ketersediaannya terlihat saat memesan. Pilih yang paling dekat dengan agen, bukan dengan Anda. Server dibayar dengan kripto, tanpa KYC.

Instalasi

Di server Ubuntu 24.04 atau Debian 12 yang baru, sebagai root. Pertama Docker:

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

Lalu Langfuse, dengan rahasia sungguhan menggantikan nilai bawaan file 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

Dua dari kata sandi itu berpasangan: kata sandi Postgres juga ada di dalam DATABASE_URL, dan kata sandi MinIO harus sama dengan tiga baris S3_..._SECRET_ACCESS_KEY. Karena itu masing-masing diambil dari satu variabel.

Sekarang jebakannya. File compose memublikasikan aplikasi web di port 3000 dan MinIO di 9090 pada semua antarmuka, dan port yang dipublikasikan Docker melewati ufw. Ikat keduanya ke localhost agar reverse proxy menjadi satu-satunya pintu masuk:

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

Perintah terakhir seharusnya menampilkan {"status":"OK", ...}. Start pertama menjalankan migrasi database; dalam uji kami, health check lolos sekitar 15 detik setelah kontainer menyala.

HTTPS di depan

Arahkan langfuse.example.com ke IP server, lalu:

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 mengambil sertifikat sendiri. Buka situsnya, buat akun Anda (itu menjadi organisasi pertama), tambahkan proyek, dan salin kunci publik dan rahasianya.

Setelah itu, tutup pintunya. Langfuse memahami AUTH_DISABLE_SIGNUP, tetapi file compose bawaan tidak meneruskannya ke kontainer web, jadi perlu satu baris lagi di bawah 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

Mulai sekarang, upaya pendaftaran mendapat «Sign up is disabled». Rekan kerja ditambahkan dari dalam proyek.

Mengirim trace dari agen

SDK Python membungkus fungsi Anda, dan panggilan bersarang menjadi span bersarang:

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()  # membaca variabel 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()  # skrip pendek selesai sebelum pengiriman di latar belakang rampung

Jangan lewatkan LANGFUSE_BASE_URL. Tanpanya, SDK diam-diam mengirim semuanya ke cloud Langfuse, kunci Anda tidak ada di sana, dan Anda hanya menatap dasbor kosong.

Untuk memeriksa dari terminal bahwa span sudah masuk:

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

Di v4, endpoint lama /api/public/traces membalas dengan error tentang mode events-only. Itu memang diharapkan, bukan instalasi yang rusak. Di agen sungguhan Anda membungkus panggilan LLM dan setiap tool dengan cara yang sama; selain itu Langfuse punya integrasi untuk SDK LLM dan framework agen yang umum, jadi sering kali cukup mengganti satu import alih-alih menaburkan decorator di mana-mana.

Yang perlu diawasi

  • Disk. ClickHouse dan MinIO menyimpan semua yang Anda kirim. docker system df -v menunjukkan ke mana ruangnya pergi. Jika Anda melacak prompt dan jawaban panjang, 45 GB milik Medium-IP penuh dalam hitungan minggu, bukan tahun. Periksa sebulan sekali; saat mulai sempit, paket Pro dengan 400 GB atau lebih tersedia atas permintaan.
  • Pembaruan. File compose mengunci versi mayor (:4). docker compose pull && docker compose up -d membawa perbaikan di dalamnya. Baca changelog sebelum pindah versi mayor: justru di v4 endpoint trace menghilang.
  • Cadangan. Yang penting ada di volume Docker: Postgres menyimpan pengguna, proyek, dan kunci; ClickHouse dan MinIO menyimpan trace-nya. Salin keluar dari server secara terjadwal.

Apakah sepadan dengan $20 per bulan? Jika agen Anda menghabiskan lebih dari itu untuk token — dan sebagian besar agen tanpa pengawasan memang begitu — mengetahui ke mana token pergi akan balik modal saat pertama kali sebuah loop lepas kendali. Satu agen kecil yang berjalan sekali sehari tidak butuh semua ini: file log dan penghitung token sudah cukup.

Terkait

Siap deploy? Bayar dengan kripto, tanpa KYC — online dalam sekitar satu menit.

Deploy →

Pertanyaan umum

Berapa RAM yang dibutuhkan Langfuse di server sendiri?

Di server uji kami, Langfuse v4 berjalan sebagai enam kontainer — web, worker, Postgres, ClickHouse, Redis, dan MinIO — dan memakai sekitar 3,5 GB RAM dengan proyek kosong. ClickHouse membesar dengan setiap span yang Anda kirim. Medium-IP (RAM 6 GB, disk 45 GB) menjalankannya dengan lega untuk beberapa agen; satu armada penuh dengan riwayat berbulan-bulan butuh paket Pro, yang tersedia atas permintaan.

Apakah Langfuse perlu alamat IP sendiri?

Hanya jika agen berjalan di tempat lain dan mengirim trace lewat internet: mereka butuh endpoint HTTPS, sedangkan paket NAT dari luar hanya menerima port SSH Anda. Kalau agen tinggal di server yang sama, Langfuse bisa tetap di localhost dan dasbor dibuka lewat tunnel SSH; untuk itu paket Medium dengan NAT sudah cukup.

Kode saya berjalan, tetapi dasbor tetap kosong. Kenapa?

Hampir selalu LANGFUSE_BASE_URL belum diisi. Tanpanya, SDK mengirim semuanya ke cloud milik Langfuse sendiri, kunci dari instans Anda tidak ada di sana, dan tidak ada yang sampai ke server Anda. Isi variabel itu dengan alamat Anda sendiri.

Endpoint /api/public/traces mengembalikan error. Apakah instalasinya rusak?

Tidak. Langfuse v4 berjalan dalam mode events-only, dan di mode itu endpoint tersebut dimatikan. Baca data lewat /api/public/v2/observations — dengan panggilan itulah kami memastikan span uji kami sudah masuk.

Bagaimana mencegah orang asing mendaftar di instans saya?

Langfuse membaca AUTH_DISABLE_SIGNUP, tetapi docker-compose.yml bawaan tidak meneruskan variabel itu ke kontainer web, jadi menaruhnya di .env saja tidak berpengaruh. Tambahkan satu baris ke environment langfuse-web (perintahnya ada di bawah), set ke true setelah membuat akun Anda, dan pendaftaran berikutnya akan mendapat «Sign up is disabled».

Komentar

Belum ada komentar. Jadilah yang pertama.

Tinggalkan komentar

Komentar dimoderasi sebelum muncul.