Compare commits
3 Commits
fe3f1174b9
...
e716bdaa3e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e716bdaa3e | ||
|
|
636effe8ce | ||
|
|
9edf4a5da2 |
@@ -19,8 +19,11 @@ POSTGRES_IMAGE='docker.io/library/postgres:16'
|
||||
LANGFUSE_WEB_IMAGE='docker.io/langfuse/langfuse:3'
|
||||
LANGFUSE_WORKER_IMAGE='docker.io/langfuse/langfuse-worker:3'
|
||||
CLICKHOUSE_IMAGE='docker.io/clickhouse/clickhouse-server:25.11'
|
||||
# Chainguard provides only :latest? https://images.chainguard.dev/directory/image/minio/versions
|
||||
MINIO_IMAGE='cgr.dev/chainguard/minio'
|
||||
# Using official MinIO image here because the Chainguard image used in Langfuse
|
||||
# docker-compose example does not ship
|
||||
# a shell, but this script relies on a small shell wrapper to pre-create the
|
||||
# langfuse bucket. And Chainguard offers only tag :latest.
|
||||
MINIO_IMAGE='docker.io/minio/minio:RELEASE.2025-09-07T16-13-09Z'
|
||||
REDIS_IMAGE='docker.io/redis:7'
|
||||
|
||||
HOST_LOCAL_IP='127.0.0.1'
|
||||
@@ -30,6 +33,9 @@ LANGFLOW_CONTAINER_PORT='7860'
|
||||
# Expose Langfuse Web on 8091 -> 3000
|
||||
LANGFUSE_HOST_PORT='8091'
|
||||
LANGFUSE_CONTAINER_PORT='3000'
|
||||
# MinIO API/console ports inside the pod (avoid conflict with ClickHouse native port 9000)
|
||||
MINIO_API_PORT='9100'
|
||||
MINIO_CONSOLE_PORT='9101'
|
||||
# All other services are only reachable inside the pod
|
||||
|
||||
BIND_DIR="$HOME/.local/share/$POD_NAME"
|
||||
@@ -41,11 +47,13 @@ LANGFUSE_MINIO_DATA_DIR="$BIND_DIR/langfuse-minio-data"
|
||||
USER_SYSTEMD_DIR="$HOME/.config/systemd/user"
|
||||
|
||||
LANGFUSE_PUBLIC_URL="http://$HOST_LOCAL_IP:$LANGFUSE_HOST_PORT"
|
||||
LANGFLOW_DB_URL='postgresql://langflow:langflow@localhost:5432/langflow'
|
||||
|
||||
LANGFUSE_COMMON_ENV=(
|
||||
-e NEXTAUTH_URL="$LANGFUSE_PUBLIC_URL"
|
||||
-e DATABASE_URL="postgresql://langflow:langflow@localhost:5432/langfuse"
|
||||
-e SALT="qwexoiuzxequtbfvyqewregvg"
|
||||
-e ENCRYPTION_KEY="57db4291f0243a9f6bbbf82d3fbca1a72c58fd42f852a4d74e3db8b55bee720a" # TODO: change to a secure 64-char hex key
|
||||
-e ENCRYPTION_KEY="57db4291f0243a9f6bbbf82d3fbca1a72c58fd42f852a4d74e3db8b55bee720a"
|
||||
-e TELEMETRY_ENABLED=true
|
||||
-e LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES=true
|
||||
-e CLICKHOUSE_MIGRATION_URL="clickhouse://localhost:9000"
|
||||
@@ -58,21 +66,21 @@ LANGFUSE_COMMON_ENV=(
|
||||
-e LANGFUSE_S3_EVENT_UPLOAD_REGION="auto"
|
||||
-e LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID="minio"
|
||||
-e LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY="miniosecret"
|
||||
-e LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT="http://localhost:9000"
|
||||
-e LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT="http://localhost:$MINIO_API_PORT"
|
||||
-e LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE=true
|
||||
-e LANGFUSE_S3_EVENT_UPLOAD_PREFIX="events/"
|
||||
-e LANGFUSE_S3_MEDIA_UPLOAD_BUCKET="langfuse"
|
||||
-e LANGFUSE_S3_MEDIA_UPLOAD_REGION="auto"
|
||||
-e LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID="minio"
|
||||
-e LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY="miniosecret"
|
||||
-e LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT="http://localhost:9000"
|
||||
-e LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT="http://localhost:$MINIO_API_PORT"
|
||||
-e LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE=true
|
||||
-e LANGFUSE_S3_MEDIA_UPLOAD_PREFIX="media/"
|
||||
-e LANGFUSE_S3_BATCH_EXPORT_ENABLED=false
|
||||
-e LANGFUSE_S3_BATCH_EXPORT_BUCKET="langfuse"
|
||||
-e LANGFUSE_S3_BATCH_EXPORT_PREFIX="exports/"
|
||||
-e LANGFUSE_S3_BATCH_EXPORT_REGION="auto"
|
||||
-e LANGFUSE_S3_BATCH_EXPORT_ENDPOINT="http://localhost:9000"
|
||||
-e LANGFUSE_S3_BATCH_EXPORT_ENDPOINT="http://localhost:$MINIO_API_PORT"
|
||||
-e LANGFUSE_S3_BATCH_EXPORT_EXTERNAL_ENDPOINT="$LANGFUSE_PUBLIC_URL"
|
||||
-e LANGFUSE_S3_BATCH_EXPORT_ACCESS_KEY_ID="minio"
|
||||
-e LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY="miniosecret"
|
||||
@@ -90,6 +98,13 @@ LANGFUSE_COMMON_ENV=(
|
||||
-e SMTP_CONNECTION_URL=
|
||||
)
|
||||
|
||||
# Stop existing systemd-managed pod if present, to avoid conflicts on rerun
|
||||
echo "Stopping systemd-managed pod 'pod-$POD_NAME.service' if it exists..."
|
||||
if systemctl --user list-units --type=service --all 2>/dev/null | \
|
||||
grep -q "pod-$POD_NAME.service"; then
|
||||
systemctl --user stop "pod-$POD_NAME.service" || true
|
||||
fi
|
||||
|
||||
# Prepare directories
|
||||
mkdir -p "$LANGFLOW_DATA_DIR" "$POSTGRES_DATA_DIR" \
|
||||
"$LANGFUSE_CLICKHOUSE_DATA_DIR" "$LANGFUSE_CLICKHOUSE_LOGS_DIR" \
|
||||
@@ -138,8 +153,10 @@ done
|
||||
|
||||
# Ensure separate database for Langfuse in the shared Postgres instance
|
||||
echo "Ensuring 'langfuse' database exists for Langfuse..."
|
||||
if ! podman exec "$POSTGRES_CTR_NAME" psql -U langflow -d postgres -tc "SELECT 1 FROM pg_database WHERE datname = 'langfuse';" | grep -q 1; then
|
||||
podman exec "$POSTGRES_CTR_NAME" psql -U langflow -d postgres -c "CREATE DATABASE langfuse OWNER langflow;"
|
||||
if ! podman exec "$POSTGRES_CTR_NAME" psql -U langflow -d postgres \
|
||||
-tc "SELECT 1 FROM pg_database WHERE datname = 'langfuse';" | grep -q 1; then
|
||||
podman exec "$POSTGRES_CTR_NAME" psql -U langflow -d postgres \
|
||||
-c "CREATE DATABASE langfuse OWNER langflow;"
|
||||
fi
|
||||
echo "Database 'langfuse' is ready for Langfuse."
|
||||
|
||||
@@ -154,12 +171,15 @@ podman run -d --name "$CLICKHOUSE_CTR_NAME" --pod "$POD_NAME" \
|
||||
echo "Container '$CLICKHOUSE_CTR_NAME' started (rc=$?)"
|
||||
|
||||
# Minio container (S3-compatible storage for Langfuse)
|
||||
# NOTE: The official MinIO image uses the `minio` binary as entrypoint.
|
||||
# We call `server` directly as the container command and rely on Langfuse
|
||||
# to create buckets on first use via the S3 API.
|
||||
podman run -d --name "$MINIO_CTR_NAME" --pod "$POD_NAME" \
|
||||
-e MINIO_ROOT_USER=minio \
|
||||
-e MINIO_ROOT_PASSWORD=miniosecret \
|
||||
-v "$LANGFUSE_MINIO_DATA_DIR:/data:Z" \
|
||||
"$MINIO_IMAGE" \
|
||||
sh -c 'mkdir -p /data/langfuse && minio server --address ":9000" --console-address ":9001" /data'
|
||||
server --address ":$MINIO_API_PORT" --console-address ":$MINIO_CONSOLE_PORT" /data
|
||||
echo "Container '$MINIO_CTR_NAME' started (rc=$?)"
|
||||
|
||||
# Redis container (queue/cache for Langfuse)
|
||||
@@ -171,7 +191,7 @@ echo "Container '$REDIS_CTR_NAME' started (rc=$?)"
|
||||
|
||||
# Langflow container
|
||||
podman run -d --name "$LANGFLOW_CTR_NAME" --pod "$POD_NAME" \
|
||||
-e LANGFLOW_DATABASE_URL=postgresql://langflow:langflow@localhost:5432/langflow \
|
||||
-e LANGFLOW_DATABASE_URL="$LANGFLOW_DB_URL" \
|
||||
-e LANGFLOW_CONFIG_DIR=/app/langflow \
|
||||
-e LANGFLOW_LOG_FILE=/app/langflow/langflow.log \
|
||||
-e LANGFLOW_LOG_ENV=default \
|
||||
@@ -230,10 +250,12 @@ echo "To view status: systemctl --user status pod-${POD_NAME}.service"
|
||||
echo "To view logs: journalctl --user -u pod-${POD_NAME}.service -f"
|
||||
|
||||
# Wait for Langflow API readiness
|
||||
CHECK_URL="http://$HOST_LOCAL_IP:$LANGFLOW_HOST_PORT"
|
||||
CHECK_URL_LANGFLOW="http://$HOST_LOCAL_IP:$LANGFLOW_HOST_PORT"
|
||||
CHECK_URL_LANGFUSE="http://$HOST_LOCAL_IP:$LANGFUSE_HOST_PORT"
|
||||
for attempt in $(seq 1 30); do
|
||||
if curl -fsS "$CHECK_URL" >/dev/null 2>&1; then
|
||||
echo "Langflow Web UI is reachable at http://$HOST_LOCAL_IP:$LANGFLOW_HOST_PORT."
|
||||
if curl -fsS "$CHECK_URL_LANGFLOW" >/dev/null 2>&1; then
|
||||
echo "Langflow Web UI is reachable at $CHECK_URL_LANGFLOW."
|
||||
echo "Langfuse Web UI is reachable at $CHECK_URL_LANGFUSE."
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
|
||||
Reference in New Issue
Block a user