Skip to content

Instantly share code, notes, and snippets.

@AnteaterKit
Created January 20, 2026 15:15
Show Gist options
  • Select an option

  • Save AnteaterKit/4d59360cdc09a5be0377d1c3851c67d9 to your computer and use it in GitHub Desktop.

Select an option

Save AnteaterKit/4d59360cdc09a5be0377d1c3851c67d9 to your computer and use it in GitHub Desktop.
LLMOps
version: '3.8'
services:
# ────────────────────────────────────────────────
# SeaweedFS (S3-совместимый объектный storage)
# ────────────────────────────────────────────────
seaweed-master:
image: chrislusf/seaweedfs:latest
command: master -ip.bind=0.0.0.0
ports:
- "9333:9333" # master http
- "19333:19333" # master gRPC (если нужен)
volumes:
- seaweed-master-data:/var/lib/seaweedfs/master
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:9333"]
interval: 15s
timeout: 5s
retries: 5
seaweed-filer:
image: chrislusf/seaweedfs:latest
command: filer -master=seaweed-master:9333 -ip.bind=0.0.0.0 -s3 -s3.port=8333
depends_on:
seaweed-master:
condition: service_healthy
ports:
- "8888:8888" # filer web UI
- "8333:8333" # S3 API endpoint
volumes:
- seaweed-filer-data:/var/lib/seaweedfs/filer
- seaweed-volume-data:/data
environment:
WEED_FILER_S3: "true"
WEED_FILER_S3_ALLOW_DELETE_BUCKET: "true"
restart: unless-stopped
seaweed-volume:
image: chrislusf/seaweedfs:latest
command: volume -mserver=seaweed-master:9333 -ip.bind=0.0.0.0 -port=8080 -dir=/data
depends_on:
seaweed-master:
condition: service_healthy
ports:
- "18080:8080" # volume http (опционально)
volumes:
- seaweed-volume-data:/data
restart: unless-stopped
deploy:
replicas: 1 # можно увеличить до 2–3 для отказоустойчивости
# ────────────────────────────────────────────────
# Langfuse (web + worker)
# ────────────────────────────────────────────────
langfuse-web:
image: langfuse/langfuse:3
restart: unless-stopped
ports:
- "3000:3000"
depends_on:
- redis
- clickhouse
- seaweed-filer
environment:
# ── Обязательные настройки ──
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/langfuse?sslmode=disable
NEXTAUTH_SECRET: super-secret-random-32-chars-minimum-change-me-please
NEXTAUTH_URL: http://localhost:3000
SALT: random-salt-please-change-this-value
ENCRYPTION_KEY: 32-byte-random-hex-key-please-change-this-one-too
# ── Redis ──
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_AUTH: myverystrongredisecret123
# ── ClickHouse ──
CLICKHOUSE_URL: http://clickhouse:8123
CLICKHOUSE_MIGRATION_URL: clickhouse://clickhouse:9000
CLICKHOUSE_USER: default
CLICKHOUSE_PASSWORD: ""
CLICKHOUSE_DB: default
# ── SeaweedFS как S3 ──
LANGFUSE_S3_EVENT_UPLOAD_ENABLED: "true"
LANGFUSE_S3_EVENT_UPLOAD_BUCKET: langfuse-events
LANGFUSE_S3_EVENT_UPLOAD_REGION: us-east-1 # dummy, seaweedfs игнорирует
LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID: anykey
LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY: anysecret1234567890
LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT: http://seaweed-filer:8333
LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE: "true"
LANGFUSE_S3_EVENT_UPLOAD_PREFIX: events/
LANGFUSE_S3_MEDIA_UPLOAD_ENABLED: "true"
LANGFUSE_S3_MEDIA_UPLOAD_BUCKET: langfuse-media
LANGFUSE_S3_MEDIA_UPLOAD_REGION: us-east-1
LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID: anykey
LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY: anysecret1234567890
LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT: http://seaweed-filer:8333
LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE: "true"
LANGFUSE_S3_MEDIA_UPLOAD_PREFIX: media/
# Для прямых загрузок с фронтенда/с SDK (важно!)
# Если доступ снаружи → заменить на http://your-domain:8333 или https
LANGFUSE_S3_MEDIA_UPLOAD_PUBLIC_ENDPOINT: http://localhost:8333
langfuse-worker:
image: langfuse/langfuse-worker:3
restart: unless-stopped
depends_on:
- redis
- clickhouse
- seaweed-filer
environment:
# Те же переменные, что и у web
DATABASE_URL: ${DATABASE_URL}
SALT: ${SALT}
ENCRYPTION_KEY: ${ENCRYPTION_KEY}
REDIS_HOST: ${REDIS_HOST}
REDIS_PORT: ${REDIS_PORT}
REDIS_AUTH: ${REDIS_AUTH}
CLICKHOUSE_URL: ${CLICKHOUSE_URL}
CLICKHOUSE_MIGRATION_URL: ${CLICKHOUSE_MIGRATION_URL}
CLICKHOUSE_USER: ${CLICKHOUSE_USER}
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
LANGFUSE_S3_EVENT_UPLOAD_ENABLED: "true"
LANGFUSE_S3_EVENT_UPLOAD_BUCKET: ${LANGFUSE_S3_EVENT_UPLOAD_BUCKET}
LANGFUSE_S3_EVENT_UPLOAD_REGION: ${LANGFUSE_S3_EVENT_UPLOAD_REGION}
LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID: ${LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID}
LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY: ${LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY}
LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT: ${LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT}
LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE: ${LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE}
LANGFUSE_S3_EVENT_UPLOAD_PREFIX: ${LANGFUSE_S3_EVENT_UPLOAD_PREFIX}
# ────────────────────────────────────────────────
# Вспомогательные сервисы (как в официальном примере)
# ────────────────────────────────────────────────
postgres:
image: postgres:15
restart: unless-stopped
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: langfuse
volumes:
- postgres-data:/var/lib/postgresql/data
clickhouse:
image: clickhouse/clickhouse-server:24
restart: unless-stopped
ulimits:
nofile:
soft: 262144
hard: 262144
volumes:
- clickhouse-data:/var/lib/clickhouse
ports:
- "8123:8123"
- "9000:9000" # tcp native
redis:
image: redis:7
restart: unless-stopped
command: redis-server --requirepass myverystrongredisecret123
volumes:
- redis-data:/data
volumes:
postgres-data:
clickhouse-data:
redis-data:
seaweed-master-data:
seaweed-filer-data:
seaweed-volume-data:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment