−25%

על Windows בתשלום שנתי, עד 31.10. לחבילות

EQVPS
התחלה

שרת VPS ל-Langfuse: ראו מה סוכני ה-AI שלכם עשו

אחסנו בעצמכם את Langfuse ועקבו אחרי כל קריאת LLM וכל צעד כלי של סוכנים שרצים בלי השגחה. Docker Compose שנבדק, נתוני RAM אמיתיים והתוכנית המתאימה.

סוכן שעובד בשלוש לפנות בוקר בלי שאיש מסתכל שווה בדיוק כמו היכולת שלכם לשחזר אחר כך מה הוא עשה. „שרף בלילה טוקנים ב-38 $” זה בוקר רע. „שרף 38 $ כי כלי החיפוש החזיר עמוד ריק והמתכנן ניסה שוב 400 פעמים” זה באג שמתקנים לפני ארוחת הצהריים. בשביל המשפט השני צריך עקבות.

‏Langfuse מתעד כל קריאת LLM, כל prompt, צעד כלי, מספר טוקנים וזמן תגובה כעץ שאפשר לטייל בו בלחיצות. כשאתם מארחים אותו בעצמכם, ה-prompts והתשובות האלה — שלעיתים קרובות יש בהם נתוני לקוחות, פלט 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 שמגיע כברירת מחדל לא מעביר אותו לקונטיינר ה-web, ולכן צריך עוד שורה אחת תחת 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». עמיתים מוסיפים מתוך הפרויקט.

שליחת עקבות מסוכן

ה-SDK של Python עוטף את הפונקציות שלכם, וקריאות מקוננות הופכות ל-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 מראה לאן הלך המקום. אם אתם עוקבים אחרי prompts ותשובות ארוכים, ה-45 GB של Medium-IP יתמלאו בתוך שבועות, לא שנים. בדקו פעם בחודש; כשנהיה צפוף, תוכנית Pro עם 400 GB ומעלה זמינה לפי בקשה.
  • עדכונים. קובץ ה-compose מקבע את הגרסה הראשית (:4). ‏docker compose pull && docker compose up -d מביא תיקונים בתוכה. קראו את ה-changelog לפני מעבר לגרסה ראשית אחרת: בדיוק ב-v4 נעלמה נקודת הקצה של העקבות.
  • גיבויים. מה שחשוב יושב ב-volumes של Docker: ‏Postgres מחזיק משתמשים, פרויקטים ומפתחות, ‏ClickHouse ו-MinIO את העקבות עצמם. העתיקו אותם אל מחוץ לשרת לפי לוח זמנים.

האם זה שווה $20 בחודש? אם הסוכנים שלכם מוציאים על טוקנים יותר מזה — ורוב הסוכנים שרצים בלי השגחה מוציאים — הידיעה לאן הלכו הטוקנים מחזירה את עצמה בפעם הראשונה שלולאה יוצאת משליטה. סוכן קטן שרץ פעם ביום לא צריך שום דבר מזה: מספיקים קובץ לוג ומונה טוקנים.

קשור

מוכנים להקים? שלמו בקריפטו, ללא KYC — חי בערך תוך דקה.

הקימו עכשיו →

שאלות נפוצות

כמה 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 שמגיע כברירת מחדל לא מעביר את המשתנה לקונטיינר ה-web, כך ששורה ב-‎.env לבדה לא עושה כלום. הוסיפו שורה אחת לסביבה של langfuse-web (הפקודה למטה), הגדירו true אחרי שיצרתם את החשבון שלכם, וההרשמות הבאות יקבלו «Sign up is disabled».

תגובות

אין עדיין תגובות. היו הראשונים.

השאירו תגובה

התגובות עוברות מודרציה לפני שהן מופיעות.