Skip to content

Commit 2aec06a

Browse files
committed
chore: add Docker Compose configuration for Langfuse services and GCP deployment workflow
1 parent 577ad57 commit 2aec06a

File tree

2 files changed

+221
-0
lines changed

2 files changed

+221
-0
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
name: Deploy Langfuse to GCP VM (Optimized - Hosted Services)
2+
3+
on:
4+
push:
5+
branches:
6+
- release/voyager-main
7+
workflow_dispatch:
8+
inputs:
9+
environment:
10+
description: "Environment to deploy to"
11+
type: choice
12+
options:
13+
- staging
14+
- production
15+
required: true
16+
default: staging
17+
18+
jobs:
19+
deploy-to-gcp:
20+
name: Deploy Langfuse to GCP VM
21+
runs-on: ubuntu-latest
22+
environment: production
23+
24+
steps:
25+
- name: Checkout code
26+
uses: actions/checkout@v4
27+
28+
- name: Prepare Docker Compose File
29+
run: |
30+
# Copy the voyager compose file
31+
cp docker-compose.voyager.yml docker-compose.prod.yml
32+
33+
- name: Create Environment File
34+
run: |
35+
cat > .env << 'EOF'
36+
# Core Langfuse Configuration
37+
NEXTAUTH_SECRET=${{ secrets.NEXTAUTH_SECRET }}
38+
SALT=${{ secrets.SALT }}
39+
ENCRYPTION_KEY=${{ secrets.ENCRYPTION_KEY }}
40+
41+
# Database Configuration (Your hosted PostgreSQL)
42+
DATABASE_URL=${{ secrets.DATABASE_URL }}
43+
44+
# Redis Configuration (Your hosted Redis)
45+
REDIS_HOST=${{ secrets.REDIS_HOST }}
46+
REDIS_PORT=${{ secrets.REDIS_PORT }}
47+
REDIS_AUTH=${{ secrets.REDIS_AUTH }}
48+
49+
# Minio Configuration
50+
MINIO_ROOT_PASSWORD=${{ secrets.MINIO_ROOT_PASSWORD }}
51+
52+
EOF
53+
54+
- name: SSH into GCP VM and Deploy
55+
env:
56+
GCP_VM_IP: ${{ secrets.GCP_VM_IP }}
57+
GCP_VM_USER: ${{ secrets.GCP_VM_USER }}
58+
PRIVATE_KEY: ${{ secrets.GCP_SSH_PRIVATE_KEY }}
59+
run: |
60+
echo "$PRIVATE_KEY" > private_key.pem
61+
chmod 600 private_key.pem
62+
63+
# Copy files to VM
64+
scp -o StrictHostKeyChecking=no -i private_key.pem docker-compose.prod.yml .env $GCP_VM_USER@$GCP_VM_IP:~/langfuse/
65+
66+
# Deploy on VM
67+
ssh -o StrictHostKeyChecking=no -i private_key.pem $GCP_VM_USER@$GCP_VM_IP << EOF
68+
cd ~/langfuse
69+
70+
# Pull latest images
71+
docker-compose -f docker-compose.prod.yml pull
72+
73+
# Stop and remove existing containers
74+
docker-compose -f docker-compose.prod.yml down
75+
76+
# Start services
77+
docker-compose -f docker-compose.prod.yml up -d
78+
79+
# Clean up old images
80+
docker system prune -f
81+
82+
# Wait for services to be ready
83+
sleep 30
84+
85+
# Health check
86+
curl -f http://localhost:3000/api/public/health || exit 1
87+
curl -f http://localhost:3030/api/health || exit 1
88+
89+
echo "Langfuse deployment completed successfully!"
90+
EOF
91+
92+
rm private_key.pem

docker-compose.voyager.yml

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# Make sure to update the credential placeholders with your own secrets.
2+
# We mark them with # CHANGEME in the file below.
3+
# In addition, we recommend to restrict inbound traffic on the host to langfuse-web (port 3000) and minio (port 9090) only.
4+
# All other components are bound to localhost (127.0.0.1) to only accept connections from the local machine.
5+
# External connections from other machines will not be able to reach these services directly.
6+
services:
7+
langfuse-worker:
8+
image: docker.io/langfuse/langfuse-worker:sha-7e31dda
9+
restart: always
10+
depends_on: &langfuse-depends-on
11+
minio:
12+
condition: service_healthy
13+
clickhouse:
14+
condition: service_healthy
15+
ports:
16+
- 127.0.0.1:3030:3030
17+
environment: &langfuse-worker-env
18+
NEXTAUTH_URL: http://localhost:3000
19+
DATABASE_URL: ${DATABASE_URL}
20+
SALT: ${SALT}
21+
ENCRYPTION_KEY: ${ENCRYPTION_KEY}
22+
TELEMETRY_ENABLED: ${TELEMETRY_ENABLED:-true}
23+
LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: ${LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES:-true}
24+
CLICKHOUSE_MIGRATION_URL: ${CLICKHOUSE_MIGRATION_URL:-clickhouse://clickhouse:9000}
25+
CLICKHOUSE_URL: ${CLICKHOUSE_URL:-http://clickhouse:8123}
26+
CLICKHOUSE_USER: ${CLICKHOUSE_USER:-clickhouse}
27+
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD:-clickhouse}
28+
CLICKHOUSE_CLUSTER_ENABLED: ${CLICKHOUSE_CLUSTER_ENABLED:-false}
29+
LANGFUSE_USE_AZURE_BLOB: ${LANGFUSE_USE_AZURE_BLOB:-false}
30+
LANGFUSE_S3_EVENT_UPLOAD_BUCKET: ${LANGFUSE_S3_EVENT_UPLOAD_BUCKET:-langfuse}
31+
LANGFUSE_S3_EVENT_UPLOAD_REGION: ${LANGFUSE_S3_EVENT_UPLOAD_REGION:-auto}
32+
LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID: ${LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID:-minio}
33+
LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY: ${LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY:-miniosecret}
34+
LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT: ${LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT:-http://minio:9000}
35+
LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE: ${LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE:-true}
36+
LANGFUSE_S3_EVENT_UPLOAD_PREFIX: ${LANGFUSE_S3_EVENT_UPLOAD_PREFIX:-events/}
37+
LANGFUSE_S3_MEDIA_UPLOAD_BUCKET: ${LANGFUSE_S3_MEDIA_UPLOAD_BUCKET:-langfuse}
38+
LANGFUSE_S3_MEDIA_UPLOAD_REGION: ${LANGFUSE_S3_MEDIA_UPLOAD_REGION:-auto}
39+
LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID: ${LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID:-minio}
40+
LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY: ${LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY:-miniosecret}
41+
LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT: ${LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT:-http://localhost:9090}
42+
LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE: ${LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE:-true}
43+
LANGFUSE_S3_MEDIA_UPLOAD_PREFIX: ${LANGFUSE_S3_MEDIA_UPLOAD_PREFIX:-media/}
44+
LANGFUSE_S3_BATCH_EXPORT_ENABLED: ${LANGFUSE_S3_BATCH_EXPORT_ENABLED:-false}
45+
LANGFUSE_S3_BATCH_EXPORT_BUCKET: ${LANGFUSE_S3_BATCH_EXPORT_BUCKET:-langfuse}
46+
LANGFUSE_S3_BATCH_EXPORT_PREFIX: ${LANGFUSE_S3_BATCH_EXPORT_PREFIX:-exports/}
47+
LANGFUSE_S3_BATCH_EXPORT_REGION: ${LANGFUSE_S3_BATCH_EXPORT_REGION:-auto}
48+
LANGFUSE_S3_BATCH_EXPORT_ENDPOINT: ${LANGFUSE_S3_BATCH_EXPORT_ENDPOINT:-http://minio:9000}
49+
LANGFUSE_S3_BATCH_EXPORT_EXTERNAL_ENDPOINT: ${LANGFUSE_S3_BATCH_EXPORT_EXTERNAL_ENDPOINT:-http://localhost:9090}
50+
LANGFUSE_S3_BATCH_EXPORT_ACCESS_KEY_ID: ${LANGFUSE_S3_BATCH_EXPORT_ACCESS_KEY_ID:-minio}
51+
LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY: ${LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY:-miniosecret}
52+
LANGFUSE_S3_BATCH_EXPORT_FORCE_PATH_STYLE: ${LANGFUSE_S3_BATCH_EXPORT_FORCE_PATH_STYLE:-true}
53+
LANGFUSE_INGESTION_QUEUE_DELAY_MS: ${LANGFUSE_INGESTION_QUEUE_DELAY_MS:-}
54+
LANGFUSE_INGESTION_CLICKHOUSE_WRITE_INTERVAL_MS: ${LANGFUSE_INGESTION_CLICKHOUSE_WRITE_INTERVAL_MS:-}
55+
REDIS_HOST: ${REDIS_HOST}
56+
REDIS_PORT: ${REDIS_PORT}
57+
REDIS_AUTH: ${REDIS_AUTH}
58+
REDIS_TLS_ENABLED: ${REDIS_TLS_ENABLED:-false}
59+
EMAIL_FROM_ADDRESS: ${EMAIL_FROM_ADDRESS:-}
60+
SMTP_CONNECTION_URL: ${SMTP_CONNECTION_URL:-}
61+
62+
langfuse-web:
63+
image: docker.io/langfuse/langfuse:sha-7e31dda
64+
restart: always
65+
depends_on: *langfuse-depends-on
66+
ports:
67+
- 3000:3000
68+
environment:
69+
<<: *langfuse-worker-env
70+
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
71+
LANGFUSE_INIT_ORG_ID: ${LANGFUSE_INIT_ORG_ID:-}
72+
LANGFUSE_INIT_ORG_NAME: ${LANGFUSE_INIT_ORG_NAME:-}
73+
LANGFUSE_INIT_PROJECT_ID: ${LANGFUSE_INIT_PROJECT_ID:-}
74+
LANGFUSE_INIT_PROJECT_NAME: ${LANGFUSE_INIT_PROJECT_NAME:-}
75+
LANGFUSE_INIT_PROJECT_PUBLIC_KEY: ${LANGFUSE_INIT_PROJECT_PUBLIC_KEY:-}
76+
LANGFUSE_INIT_PROJECT_SECRET_KEY: ${LANGFUSE_INIT_PROJECT_SECRET_KEY:-}
77+
LANGFUSE_INIT_USER_EMAIL: ${LANGFUSE_INIT_USER_EMAIL:-}
78+
LANGFUSE_INIT_USER_NAME: ${LANGFUSE_INIT_USER_NAME:-}
79+
LANGFUSE_INIT_USER_PASSWORD: ${LANGFUSE_INIT_USER_PASSWORD:-}
80+
81+
clickhouse:
82+
image: docker.io/clickhouse/clickhouse-server
83+
restart: always
84+
user: "101:101"
85+
environment:
86+
CLICKHOUSE_DB: default
87+
CLICKHOUSE_USER: clickhouse
88+
CLICKHOUSE_PASSWORD: clickhouse
89+
volumes:
90+
- langfuse_clickhouse_data:/var/lib/clickhouse
91+
- langfuse_clickhouse_logs:/var/log/clickhouse-server
92+
ports:
93+
- 127.0.0.1:8123:8123
94+
- 127.0.0.1:9000:9000
95+
healthcheck:
96+
test: wget --no-verbose --tries=1 --spider http://localhost:8123/ping || exit 1
97+
interval: 5s
98+
timeout: 5s
99+
retries: 10
100+
start_period: 1s
101+
102+
minio:
103+
image: docker.io/minio/minio
104+
restart: always
105+
entrypoint: sh
106+
# create the 'langfuse' bucket before starting the service
107+
command: -c 'mkdir -p /data/langfuse && minio server --address ":9000" --console-address ":9001" /data'
108+
environment:
109+
MINIO_ROOT_USER: minio
110+
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
111+
ports:
112+
- 9090:9000
113+
- 127.0.0.1:9091:9001
114+
volumes:
115+
- langfuse_minio_data:/data
116+
healthcheck:
117+
test: ["CMD", "mc", "ready", "local"]
118+
interval: 1s
119+
timeout: 5s
120+
retries: 5
121+
start_period: 1s
122+
123+
volumes:
124+
langfuse_minio_data:
125+
driver: local
126+
langfuse_clickhouse_data:
127+
driver: local
128+
langfuse_clickhouse_logs:
129+
driver: local

0 commit comments

Comments
 (0)