Skip to content

Commit 0301381

Browse files
committed
automatic docker-image building
1 parent 7a9df1d commit 0301381

File tree

3 files changed

+306
-17
lines changed

3 files changed

+306
-17
lines changed

.github/workflows/docker-build.yml

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
name: Build and Push Advanced Backend Docker Images
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
- develop
8+
paths:
9+
- 'backends/advanced-backend/**'
10+
pull_request:
11+
branches:
12+
- main
13+
paths:
14+
- 'backends/advanced-backend/**'
15+
workflow_dispatch:
16+
17+
env:
18+
REGISTRY: ghcr.io
19+
IMAGE_NAME_BACKEND: ${{ github.repository }}/friend-backend
20+
IMAGE_NAME_WEBUI: ${{ github.repository }}/friend-webui
21+
22+
jobs:
23+
build-backend:
24+
runs-on: ubuntu-latest
25+
permissions:
26+
contents: read
27+
packages: write
28+
29+
steps:
30+
- name: Checkout repository
31+
uses: actions/checkout@v4
32+
33+
- name: Set up Docker Buildx
34+
uses: docker/setup-buildx-action@v3
35+
36+
- name: Log in to Container Registry
37+
uses: docker/login-action@v3
38+
with:
39+
registry: ${{ env.REGISTRY }}
40+
username: ${{ github.actor }}
41+
password: ${{ secrets.GITHUB_TOKEN }}
42+
43+
- name: Extract metadata for backend
44+
id: meta-backend
45+
uses: docker/metadata-action@v5
46+
with:
47+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_BACKEND }}
48+
tags: |
49+
type=ref,event=branch
50+
type=ref,event=pr
51+
type=sha,prefix={{branch}}-
52+
type=raw,value=latest,enable={{is_default_branch}}
53+
54+
- name: Build and push backend Docker image
55+
uses: docker/build-push-action@v5
56+
with:
57+
context: ./backends/advanced-backend
58+
file: ./backends/advanced-backend/Dockerfile
59+
push: true
60+
tags: ${{ steps.meta-backend.outputs.tags }}
61+
labels: ${{ steps.meta-backend.outputs.labels }}
62+
cache-from: type=gha
63+
cache-to: type=gha,mode=max
64+
platforms: linux/amd64,linux/arm64
65+
66+
build-webui:
67+
runs-on: ubuntu-latest
68+
permissions:
69+
contents: read
70+
packages: write
71+
72+
steps:
73+
- name: Checkout repository
74+
uses: actions/checkout@v4
75+
76+
- name: Set up Docker Buildx
77+
uses: docker/setup-buildx-action@v3
78+
79+
- name: Log in to Container Registry
80+
uses: docker/login-action@v3
81+
with:
82+
registry: ${{ env.REGISTRY }}
83+
username: ${{ github.actor }}
84+
password: ${{ secrets.GITHUB_TOKEN }}
85+
86+
- name: Extract metadata for webui
87+
id: meta-webui
88+
uses: docker/metadata-action@v5
89+
with:
90+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_WEBUI }}
91+
tags: |
92+
type=ref,event=branch
93+
type=ref,event=pr
94+
type=sha,prefix={{branch}}-
95+
type=raw,value=latest,enable={{is_default_branch}}
96+
97+
- name: Build and push webui Docker image
98+
uses: docker/build-push-action@v5
99+
with:
100+
context: ./backends/advanced-backend
101+
file: ./backends/advanced-backend/Dockerfile.webui
102+
push: true
103+
tags: ${{ steps.meta-webui.outputs.tags }}
104+
labels: ${{ steps.meta-webui.outputs.labels }}
105+
cache-from: type=gha
106+
cache-to: type=gha,mode=max
107+
platforms: linux/amd64,linux/arm64

backends/advanced-backend/docker-compose.yml

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,56 @@ services:
1313
- ./data/debug_dir:/app/debug_dir
1414
- ./data:/app/data
1515
environment:
16+
# Core backend settings
17+
- HOST=${HOST:-0.0.0.0}
18+
- PORT=${PORT:-8000}
19+
- DEBUG=${DEBUG:-false}
20+
- DEBUG_DUMP_DIR=${DEBUG_DUMP_DIR:-debug_dumps}
21+
22+
# Database connections
23+
- MONGODB_URI=${MONGODB_URI:-mongodb://mongo:27017}
24+
- QDRANT_BASE_URL=${QDRANT_BASE_URL:-qdrant}
25+
26+
# Audio processing
27+
- NEW_CONVERSATION_TIMEOUT_MINUTES=${NEW_CONVERSATION_TIMEOUT_MINUTES:-1.5}
28+
- AUDIO_CROPPING_ENABLED=${AUDIO_CROPPING_ENABLED:-true}
29+
- MIN_SPEECH_SEGMENT_DURATION=${MIN_SPEECH_SEGMENT_DURATION:-1.0}
30+
- CROPPING_CONTEXT_PADDING=${CROPPING_CONTEXT_PADDING:-0.1}
31+
32+
# Authentication (required)
33+
- AUTH_SECRET_KEY=${AUTH_SECRET_KEY}
34+
- ADMIN_PASSWORD=${ADMIN_PASSWORD}
35+
- ADMIN_EMAIL=${ADMIN_EMAIL:-admin@example.com}
36+
- COOKIE_SECURE=${COOKIE_SECURE:-false}
37+
38+
# Transcription providers
39+
- TRANSCRIPTION_PROVIDER=${TRANSCRIPTION_PROVIDER}
1640
- DEEPGRAM_API_KEY=${DEEPGRAM_API_KEY}
1741
- MISTRAL_API_KEY=${MISTRAL_API_KEY}
18-
- MISTRAL_MODEL=${MISTRAL_MODEL}
19-
- TRANSCRIPTION_PROVIDER=${TRANSCRIPTION_PROVIDER}
20-
- OFFLINE_ASR_TCP_URI=${OFFLINE_ASR_TCP_URI}
42+
- MISTRAL_MODEL=${MISTRAL_MODEL:-voxtral-mini-2507}
43+
- OFFLINE_ASR_TCP_URI=${OFFLINE_ASR_TCP_URI:-tcp://localhost:8765}
44+
45+
# LLM providers
46+
- LLM_PROVIDER=${LLM_PROVIDER:-openai}
47+
- OPENAI_API_KEY=${OPENAI_API_KEY}
48+
- OPENAI_BASE_URL=${OPENAI_BASE_URL:-https://api.openai.com/v1}
49+
- OPENAI_MODEL=${OPENAI_MODEL:-gpt-4o}
50+
- OPENAI_EMBEDDER_MODEL=${OPENAI_EMBEDDER_MODEL:-text-embedding-3-small}
2151
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL}
22-
- HF_TOKEN=${HF_TOKEN}
52+
- OLLAMA_EMBEDDER_MODEL=${OLLAMA_EMBEDDER_MODEL:-nomic-embed-text:latest}
53+
54+
# Memory services
55+
- NEO4J_HOST=${NEO4J_HOST:-neo4j-mem0}
56+
- NEO4J_USER=${NEO4J_USER:-neo4j}
57+
- NEO4J_PASSWORD=${NEO4J_PASSWORD:-password}
58+
- MEM0_TELEMETRY=${MEM0_TELEMETRY:-false}
59+
- MEM0_ORGANIZATION_ID=${MEM0_ORGANIZATION_ID:-friend-lite-org}
60+
- MEM0_PROJECT_ID=${MEM0_PROJECT_ID:-audio-conversations}
61+
- MEM0_APP_ID=${MEM0_APP_ID:-omi-backend}
62+
63+
# Additional services
2364
- SPEAKER_SERVICE_URL=${SPEAKER_SERVICE_URL}
24-
- ADMIN_PASSWORD=${ADMIN_PASSWORD}
25-
- ADMIN_EMAIL=${ADMIN_EMAIL}
26-
- AUTH_SECRET_KEY=${AUTH_SECRET_KEY}
27-
- LLM_PROVIDER=${LLM_PROVIDER}
28-
- OPENAI_API_KEY=${OPENAI_API_KEY}
29-
- OPENAI_BASE_URL=${OPENAI_BASE_URL}
30-
- OPENAI_MODEL=${OPENAI_MODEL}
31-
- NEO4J_HOST=${NEO4J_HOST}
32-
- NEO4J_USER=${NEO4J_USER}
33-
- NEO4J_PASSWORD=${NEO4J_PASSWORD}
65+
- HF_TOKEN=${HF_TOKEN}
3466
depends_on:
3567
qdrant:
3668
condition: service_started
@@ -53,9 +85,10 @@ services:
5385
ports:
5486
- "8501:8501"
5587
environment:
56-
- BACKEND_API_URL=http://friend-backend:8000
57-
- BACKEND_PUBLIC_URL=http://100.99.62.5:8000 # Your BROWSER should be able to access this (Only for displaying audio)
58-
- STREAMLIT_SERVER_ENABLE_CORS=false
88+
- BACKEND_API_URL=${BACKEND_API_URL:-http://friend-backend:8000}
89+
- BACKEND_PUBLIC_URL=${BACKEND_PUBLIC_URL:-http://localhost:8000}
90+
- STREAMLIT_SERVER_ENABLE_CORS=${STREAMLIT_SERVER_ENABLE_CORS:-false}
91+
- DEBUG=${DEBUG:-false}
5992
depends_on:
6093
friend-backend:
6194
condition: service_healthy

docker-compose.yml

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
services:
2+
friend-backend:
3+
image: ghcr.io/AnkushMalaker/friend-lite/friend-backend:latest
4+
ports:
5+
- "8000:8000"
6+
env_file:
7+
- backends/advanced-backend/.env
8+
volumes:
9+
- ./data/audio_chunks:/app/audio_chunks
10+
- ./data/debug_dir:/app/debug_dir
11+
- ./data:/app/data
12+
environment:
13+
# Core backend settings
14+
- HOST=${HOST:-0.0.0.0}
15+
- PORT=${PORT:-8000}
16+
- DEBUG=${DEBUG:-false}
17+
- DEBUG_DUMP_DIR=${DEBUG_DUMP_DIR:-debug_dumps}
18+
19+
# Database connections
20+
- MONGODB_URI=${MONGODB_URI:-mongodb://mongo:27017}
21+
- QDRANT_BASE_URL=${QDRANT_BASE_URL:-qdrant}
22+
23+
# Audio processing
24+
- NEW_CONVERSATION_TIMEOUT_MINUTES=${NEW_CONVERSATION_TIMEOUT_MINUTES:-1.5}
25+
- AUDIO_CROPPING_ENABLED=${AUDIO_CROPPING_ENABLED:-true}
26+
- MIN_SPEECH_SEGMENT_DURATION=${MIN_SPEECH_SEGMENT_DURATION:-1.0}
27+
- CROPPING_CONTEXT_PADDING=${CROPPING_CONTEXT_PADDING:-0.1}
28+
29+
# Authentication (required)
30+
- AUTH_SECRET_KEY=${AUTH_SECRET_KEY}
31+
- ADMIN_PASSWORD=${ADMIN_PASSWORD}
32+
- ADMIN_EMAIL=${ADMIN_EMAIL:-admin@example.com}
33+
- COOKIE_SECURE=${COOKIE_SECURE:-false}
34+
35+
# Transcription providers
36+
- TRANSCRIPTION_PROVIDER=${TRANSCRIPTION_PROVIDER}
37+
- DEEPGRAM_API_KEY=${DEEPGRAM_API_KEY}
38+
- MISTRAL_API_KEY=${MISTRAL_API_KEY}
39+
- MISTRAL_MODEL=${MISTRAL_MODEL:-voxtral-mini-2507}
40+
- OFFLINE_ASR_TCP_URI=${OFFLINE_ASR_TCP_URI:-tcp://localhost:8765}
41+
42+
# LLM providers
43+
- LLM_PROVIDER=${LLM_PROVIDER:-openai}
44+
- OPENAI_API_KEY=${OPENAI_API_KEY}
45+
- OPENAI_BASE_URL=${OPENAI_BASE_URL:-https://api.openai.com/v1}
46+
- OPENAI_MODEL=${OPENAI_MODEL:-gpt-4o}
47+
- OPENAI_EMBEDDER_MODEL=${OPENAI_EMBEDDER_MODEL:-text-embedding-3-small}
48+
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL}
49+
- OLLAMA_EMBEDDER_MODEL=${OLLAMA_EMBEDDER_MODEL:-nomic-embed-text:latest}
50+
51+
# Memory services
52+
- NEO4J_HOST=${NEO4J_HOST:-neo4j-mem0}
53+
- NEO4J_USER=${NEO4J_USER:-neo4j}
54+
- NEO4J_PASSWORD=${NEO4J_PASSWORD:-password}
55+
- MEM0_TELEMETRY=${MEM0_TELEMETRY:-false}
56+
- MEM0_ORGANIZATION_ID=${MEM0_ORGANIZATION_ID:-friend-lite-org}
57+
- MEM0_PROJECT_ID=${MEM0_PROJECT_ID:-audio-conversations}
58+
- MEM0_APP_ID=${MEM0_APP_ID:-omi-backend}
59+
60+
# Additional services
61+
- SPEAKER_SERVICE_URL=${SPEAKER_SERVICE_URL}
62+
- HF_TOKEN=${HF_TOKEN}
63+
depends_on:
64+
qdrant:
65+
condition: service_started
66+
mongo:
67+
condition: service_started
68+
healthcheck:
69+
test: ["CMD", "curl", "-f", "http://localhost:8000/readiness"]
70+
interval: 10s
71+
timeout: 5s
72+
retries: 5
73+
start_period: 5s
74+
restart: unless-stopped
75+
76+
streamlit:
77+
image: ghcr.io/AnkushMalaker/friend-lite/friend-webui:latest
78+
ports:
79+
- "8501:8501"
80+
environment:
81+
- BACKEND_API_URL=http://friend-backend:8000
82+
- BACKEND_PUBLIC_URL=${BACKEND_PUBLIC_URL:-http://localhost:8000}
83+
- STREAMLIT_SERVER_ENABLE_CORS=false
84+
depends_on:
85+
friend-backend:
86+
condition: service_healthy
87+
mongo:
88+
condition: service_started
89+
qdrant:
90+
condition: service_started
91+
92+
qdrant:
93+
image: qdrant/qdrant:latest
94+
ports:
95+
- "6333:6333" # gRPC
96+
- "6334:6334" # HTTP
97+
volumes:
98+
- ./data/qdrant_data:/qdrant/storage
99+
100+
mongo:
101+
image: mongo:4.4.18
102+
ports:
103+
- "27017:27017"
104+
volumes:
105+
- ./data/mongo_data:/data/db
106+
107+
# Optional services (uncomment to enable)
108+
109+
# neo4j-mem0:
110+
# image: neo4j:5.15-community
111+
# ports:
112+
# - "7474:7474" # HTTP
113+
# - "7687:7687" # Bolt
114+
# environment:
115+
# - NEO4J_AUTH=neo4j/${NEO4J_PASSWORD:-password}
116+
# - NEO4J_PLUGINS=["apoc"]
117+
# - NEO4J_dbms_security_procedures_unrestricted=apoc.*
118+
# - NEO4J_dbms_security_procedures_allowlist=apoc.*
119+
# volumes:
120+
# - ./data/neo4j_data:/data
121+
# - ./data/neo4j_logs:/logs
122+
# restart: unless-stopped
123+
124+
# ollama:
125+
# image: ollama/ollama:latest
126+
# container_name: ollama
127+
# ports:
128+
# - "11434:11434"
129+
# volumes:
130+
# - ollama_data:/root/.ollama
131+
# deploy:
132+
# resources:
133+
# reservations:
134+
# devices:
135+
# - driver: nvidia
136+
# count: all
137+
# capabilities: [gpu]
138+
139+
# nginx:
140+
# image: nginx:alpine
141+
# depends_on: [friend-backend, streamlit]
142+
# volumes:
143+
# - ./backends/advanced-backend/nginx.conf:/etc/nginx/nginx.conf:ro
144+
# ports:
145+
# - "80:80"
146+
147+
# volumes:
148+
# ollama_data:
149+
# driver: local

0 commit comments

Comments
 (0)