−25%

cho Windows trả theo năm, đến 31/10. Xem các gói

EQVPS
Bắt đầu

VPS cho Langfuse: xem agent AI của bạn đã làm gì

Tự host Langfuse và theo dõi từng lời gọi LLM, từng bước công cụ của agent chạy không người trông. Docker Compose đã kiểm thử, số RAM thực tế và gói phù hợp.

Một agent làm việc lúc ba giờ sáng mà không ai trông chỉ đáng giá bằng khả năng bạn dựng lại sau đó xem nó đã làm gì. “Đốt hết 38 $ tiền token trong đêm” là một buổi sáng tệ. “Đốt 38 $ vì một công cụ tìm kiếm trả về trang trống và planner thử lại 400 lần” là một lỗi bạn sửa xong trước bữa trưa. Câu thứ hai cần có trace.

Langfuse ghi lại từng lời gọi LLM, từng prompt, bước công cụ, số token và độ trễ dưới dạng một cây bạn có thể bấm vào để xem. Khi bạn tự host, những prompt và câu trả lời đó — thường chứa dữ liệu khách hàng, kết quả API và đôi khi một bí mật lạc vào — nằm trên máy chủ bạn kiểm soát, không phải trong bảng điều khiển của người khác.

Chi phí để duy trì

Langfuse v4 không phải một file nhị phân nhỏ mà là sáu container: ứng dụng web, một worker chạy nền, Postgres, ClickHouse cho sự kiện, Redis và MinIO cho tệp. Chúng tôi cài nó trên máy chủ thử nghiệm và đo được khoảng 3,5 GB RAM đang dùng với một dự án trống. Thứ lớn dần là ClickHouse, vì mọi span bạn gửi đều nằm ở đó.

TảiGói
Vài agent, trace vài tuầnMedium-IP: 6 vCPU, 6 GB, 45 GB ($20/tháng)
Một đội agent, lịch sử nhiều thángCác gói Pro, từ 32 GB RAM trở lên — theo yêu cầu

Trên các gói nhỏ hơn thì vẫn cài được, nhưng sau đó sẽ ì ạch ngay khi ClickHouse và worker cùng lúc cần bộ nhớ. Tôi sẽ không chọn dưới 6 GB.

Agent ở đâu? Nếu chạy trên máy khác, hãy chọn gói có IPv4 riêng: chúng cần một endpoint HTTPS, còn trên gói NAT địa chỉ đi ra không phải của riêng bạn và từ bên ngoài chỉ vào được cổng SSH. Nếu agent chạy ngay trên máy chủ này, Langfuse không cần lộ ra internet: để thử thì Medium dùng NAT ($12/tháng) là đủ. Có hai vị trí, Đức và Phần Lan; tình trạng còn chỗ hiển thị khi đặt hàng. Hãy chọn nơi gần agent nhất, không phải gần bạn. Máy chủ thanh toán bằng crypto, không cần KYC.

Cài đặt

Trên máy chủ Ubuntu 24.04 hoặc Debian 12 mới tinh, với quyền root. Trước tiên là Docker:

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

Sau đó là Langfuse, với bí mật thật thay cho giá trị mặc định trong 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

Hai trong số các mật khẩu đi theo cặp: mật khẩu Postgres cũng nằm trong DATABASE_URL, còn mật khẩu MinIO phải khớp với ba dòng S3_..._SECRET_ACCESS_KEY. Vì vậy mỗi mật khẩu lấy từ một biến duy nhất.

Giờ đến cái bẫy. File compose công bố ứng dụng web ở cổng 3000 và MinIO ở 9090 trên mọi giao diện, và các cổng Docker công bố sẽ đi vòng qua ufw. Hãy gắn cả hai vào localhost để reverse proxy là lối vào duy nhất:

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

Lệnh cuối cùng phải in ra {"status":"OK", ...}. Lần khởi động đầu tiên sẽ chạy migration cơ sở dữ liệu; trong thử nghiệm của chúng tôi, health check đạt khoảng 15 giây sau khi container lên.

HTTPS phía trước

Trỏ langfuse.example.com về IP của máy chủ, sau đó:

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 tự lấy chứng chỉ. Mở trang web, tạo tài khoản (nó trở thành tổ chức đầu tiên), thêm một dự án và sao chép khóa công khai và khóa bí mật của dự án.

Sau đó, đóng cửa lại. Langfuse hiểu AUTH_DISABLE_SIGNUP, nhưng file compose mặc định không chuyển nó vào container web, nên cần thêm một dòng dưới 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

Từ giờ, mọi lần thử đăng ký sẽ nhận «Sign up is disabled». Đồng nghiệp thì bạn thêm từ bên trong dự án.

Gửi trace từ một agent

SDK Python bọc các hàm của bạn, và lời gọi lồng nhau trở thành span lồng nhau:

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()  # đọc các biến 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()  # script ngắn kết thúc trước khi việc gửi chạy nền xong

Đừng bỏ qua LANGFUSE_BASE_URL. Không có nó, SDK lặng lẽ gửi mọi thứ lên cloud của Langfuse, khóa của bạn không có ở đó và bạn chỉ nhìn vào một bảng điều khiển trống.

Kiểm tra từ terminal rằng các span đã tới:

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

Trong v4, endpoint cũ /api/public/traces trả về lỗi về chế độ events-only. Đó là điều bình thường, không phải bản cài hỏng. Trong một agent thật, bạn bọc lời gọi LLM và từng công cụ theo cùng cách; ngoài ra Langfuse có sẵn tích hợp cho các SDK LLM và framework agent phổ biến, nên thường chỉ cần đổi một dòng import thay vì rải decorator khắp nơi.

Những gì cần theo dõi

  • Ổ đĩa. ClickHouse và MinIO giữ mọi thứ bạn gửi. docker system df -v cho biết dung lượng đã đi đâu. Nếu bạn trace prompt và câu trả lời dài, 45 GB của Medium-IP sẽ đầy trong vài tuần chứ không phải vài năm. Kiểm tra mỗi tháng một lần; khi chật, gói Pro từ 400 GB trở lên có theo yêu cầu.
  • Cập nhật. File compose ghim phiên bản chính (:4). docker compose pull && docker compose up -d lấy các bản sửa lỗi trong phiên bản đó. Đọc changelog trước khi đổi phiên bản chính: endpoint trace biến mất đúng ở v4.
  • Sao lưu. Những gì quan trọng nằm trong volume Docker: Postgres giữ người dùng, dự án và khóa; ClickHouse và MinIO giữ chính các trace. Sao chép chúng ra ngoài máy chủ theo lịch.

Có đáng $20 mỗi tháng không? Nếu agent của bạn tiêu cho token nhiều hơn thế — và đa số agent không người trông đều vậy — thì việc biết token đã đi đâu sẽ tự hoàn vốn ngay lần đầu một vòng lặp chạy mất kiểm soát. Một agent nhỏ chạy mỗi ngày một lần thì không cần những thứ này: một file log và một bộ đếm token là đủ.

Liên quan

Sẵn sàng triển khai? Thanh toán bằng crypto, không KYC — trực tuyến trong khoảng một phút.

Triển khai ngay →

FAQ

Langfuse tự host cần bao nhiêu RAM?

Trên máy chủ thử nghiệm của chúng tôi, Langfuse v4 chạy thành sáu container — web, worker, Postgres, ClickHouse, Redis và MinIO — và dùng khoảng 3,5 GB RAM với một dự án trống. ClickHouse lớn dần theo mỗi span bạn gửi. Medium-IP (6 GB RAM, 45 GB ổ đĩa) chạy thoải mái cho vài agent; cả một đội agent với lịch sử nhiều tháng thì cần gói Pro, có theo yêu cầu.

Langfuse có cần địa chỉ IP riêng không?

Chỉ khi agent chạy ở nơi khác và gửi trace qua internet: chúng cần một endpoint HTTPS, còn gói NAT từ bên ngoài chỉ nhận cổng SSH của bạn. Nếu agent ở ngay trên cùng máy chủ, Langfuse có thể chỉ nghe localhost và bạn mở bảng điều khiển qua đường hầm SSH; khi đó gói Medium dùng NAT là đủ.

Code chạy rồi mà bảng điều khiển vẫn trống. Vì sao?

Gần như luôn là do thiếu LANGFUSE_BASE_URL. Không có biến này, SDK gửi mọi thứ lên cloud của chính Langfuse, khóa từ máy chủ của bạn không tồn tại ở đó và không có gì đến được máy chủ của bạn. Hãy đặt địa chỉ của bạn vào biến.

Endpoint /api/public/traces trả về lỗi. Bản cài đặt hỏng à?

Không. Langfuse v4 chạy ở chế độ events-only, trong đó endpoint này bị tắt. Hãy đọc dữ liệu qua /api/public/v2/observations — chúng tôi đã dùng chính lời gọi này để xác nhận các span thử nghiệm đã tới nơi.

Làm sao chặn người lạ đăng ký vào instance của tôi?

Langfuse đọc AUTH_DISABLE_SIGNUP, nhưng docker-compose.yml mặc định không chuyển biến này vào container web, nên chỉ ghi vào .env thì không có tác dụng. Thêm một dòng vào môi trường của langfuse-web (lệnh ở bên dưới), đặt true sau khi tạo tài khoản của bạn, và các lần đăng ký sau sẽ nhận «Sign up is disabled».

Bình luận

Chưa có bình luận nào. Hãy là người đầu tiên.

Để lại bình luận

Bình luận được kiểm duyệt trước khi hiển thị.