As we approach the midpoint of 2025, the AI landscape continues to evolve at a dizzying pace. What worked six months ago might already be outdated, and new tools emerge almost weekly. Today (March 14th, 2025), I'm sharing my current AI stack — the collection of tools, services, and workflows that I've found most effective for my daily use.
This is very much a snapshot in time. The beauty (and challenge) of working with AI in 2025 is that everything is subject to ongoing change and evolution as the underlying technologies improve and new approaches emerge. Consider this less of a recommendation and more of a field report from someone deep in the AI trenches.
I've also published this stack as a GitHub repository for those who want to track changes over time or perhaps fork it as a starting point for documenting their own AI toolkit.
Quick Navigation
Docker Implementation
Here's my complete Docker Compose configuration that brings together all the core components of my AI stack:
AI Stack Docker Compose Configuration
Complete Docker Compose configuration for a comprehensive AI stack including OpenWebUI, PostgreSQL, Qdrant vector database, Redis, and supporting services. This configuration includes RAG capabilities, multiple LLM provider integrations, and production-ready health checks.
1services:
2 # OpenWebUI and its dependencies
3 openwebui:
4 image: ghcr.io/open-webui/open-webui:latest
5 container_name: openwebui
6 hostname: openwebui
7 restart: unless-stopped
8 depends_on:
9 - postgres
10 - qdrant
11 environment:
12 - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/openwebui
13 - QDRANT_URI=http://qdrant:${QDRANT_PORT:-6333}
14 - VECTOR_DB=${VECTOR_DB:-qdrant}
15 - QDRANT_API_KEY=${QDRANT_API_KEY:-$QDRANT_KEY}
16 - PORT=${OPENWEBUI_PORT:-8080}
17 # RAG Configuration
18 - RAG_EMBEDDING_ENGINE=${RAG_EMBEDDING_ENGINE:-openai}
19 - CHUNK_SIZE=${CHUNK_SIZE:-400}
20 - CHUNK_OVERLAP=${CHUNK_OVERLAP:-50}
21 - RAG_TOP_K=${RAG_TOP_K:-4}
22 - RAG_RELEVANCE_THRESHOLD=${RAG_RELEVANCE_THRESHOLD:-0.15}
23 - RAG_TEXT_SPLITTER=${RAG_TEXT_SPLITTER:-character}
24 - ENABLE_RAG_HYBRID_SEARCH=${ENABLE_RAG_HYBRID_SEARCH:-True}
25 - CONTENT_EXTRACTION_ENGINE=${CONTENT_EXTRACTION_ENGINE:-unstructured}
26 - UNSTRUCTURED_API_URL=http://unstructured:8000
27 - UNSTRUCTURED_API_KEY=${UNSTRUCTURED_API_KEY:-$UNSTRUCTURED_KEY}
28 - PDF_EXTRACT_IMAGES=${PDF_EXTRACT_IMAGES:-True}
29 - RAG_FILE_MAX_SIZE=${RAG_FILE_MAX_SIZE:-10}
30 - RAG_FILE_MAX_COUNT=${RAG_FILE_MAX_COUNT:-5}
31 # Enable Redis for caching
32 - REDIS_URL=redis://default:${REDIS_PASSWORD:-$REDIS_PASS}@redis:6379
33 # API Keys for various LLM providers
34 - OPENAI_API_KEY=${OPENAI_API_KEY:-$OPENAI_KEY}
35 - ANTHROPIC_API_KEY=${ANTHROPIC_KEY:-$ANTHROPIC_KEY}
36 - GOOGLE_API_KEY=${GOOGLE_API_KEY:-$GOOGLE_KEY}
37 - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-$DEEPSEEK_KEY}
38 - OPENROUTER_API_KEY=${OPENROUTER_API_KEY:-$OPENROUTER_KEY}
39 - MISTRAL_API_KEY=${MISTRAL_API_KEY:-$MISTRAL_KEY}
40 - PERPLEXITY_API_KEY=${PERPLEXITY_API_KEY:-$PERPLEXITY_KEY}
41 - COHERE_API_KEY=${COHERE_API_KEY:-$COHERE_KEY}
42 # Google Drive authentication
43 - GOOGLE_CLIENT_ID=$GOOGLE_CLIENT_ID
44 - GOOGLE_CLIENT_SECRET=$GOOGLE_CLIENT_SECRET
45 - GOOGLE_REDIRECT_URI=$GOOGLE_REDIRECT_URI
46 - GOOGLE_AUTH_ENABLED=true
47 - ENABLE_GOOGLE_DRIVE_INTEGRATION=true
48 # Performance optimization settings
49 - ENABLE_WEBSOCKET_SUPPORT=true
50 - WEBSOCKET_MANAGER=redis
51 - WEBSOCKET_REDIS_URL=redis://default:${REDIS_PASSWORD:-$REDIS_PASS}@redis:6379
52 - DATABASE_POOL_SIZE=20
53 - DATABASE_POOL_MAX_OVERFLOW=10
54 - DATABASE_POOL_TIMEOUT=30
55 - DATABASE_POOL_RECYCLE=1800
56 # Disable autocomplete
57 - ENABLE_AUTOCOMPLETE_GENERATION=false
58 # Admin credentials
59 - DEFAULT_USER_EMAIL=$DEFAULT_USER_EMAIL
60 - DEFAULT_USER_PASSWORD=$DEFAULT_USER_PASSWORD
61 - DEFAULT_USER_FIRST_NAME=$DEFAULT_USER_FIRST_NAME
62 - DEFAULT_USER_LAST_NAME=$DEFAULT_USER_LAST_NAME
63 - DEFAULT_USER_ROLE=admin
64 # CORS configuration
65 - CORS_ALLOW_ORIGIN=$CORS_ALLOW_ORIGIN
66 volumes:
67 - openwebui_data:/app/backend/data
68 networks:
69 - dsrholdingsai
70 healthcheck:
71 test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"]
72 interval: 30s
73 timeout: 10s
74 retries: 3
75 start_period: 40s
76
77 postgres:
78 image: postgres:15-alpine
79 container_name: postgres
80 hostname: postgres
81 restart: unless-stopped
82 environment:
83 - POSTGRES_DB=postgres
84 - POSTGRES_USER=postgres
85 - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
86 volumes:
87 - postgres_data:/var/lib/postgresql/data
88 networks:
89 - dsrholdingsai
90 healthcheck:
91 test: ["CMD-SHELL", "pg_isready -U postgres"]
92 interval: 30s
93 timeout: 10s
94 retries: 3
95
96 qdrant:
97 image: qdrant/qdrant:latest
98 container_name: qdrant
99 hostname: qdrant
100 restart: unless-stopped
101 environment:
102 - QDRANT__SERVICE__HTTP_PORT=${QDRANT_PORT:-6333}
103 - QDRANT__SERVICE__GRPC_PORT=6334
104 - QDRANT__LOG_LEVEL=INFO
105 volumes:
106 - qdrant_data:/qdrant/storage
107 networks:
108 - dsrholdingsai
109 healthcheck:
110 test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:6333/health"]
111 interval: 30s
112 timeout: 10s
113 retries: 3
114
115 redis:
116 image: redis:7-alpine
117 container_name: redis
118 hostname: redis
119 restart: unless-stopped
120 command: redis-server --requirepass ${REDIS_PASSWORD:-$REDIS_PASS}
121 volumes:
122 - redis_data:/data
123 networks:
124 - dsrholdingsai
125 healthcheck:
126 test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
127 interval: 30s
128 timeout: 10s
129 retries: 3
130
131networks:
132 dsrholdingsai:
133 external: true
134 name: dsrholdingsai_network
135
136volumes:
137 openwebui_data:
138 postgres_data:
139 qdrant_data:
140 redis_data:
This configuration includes OpenWebUI as the primary interface, PostgreSQL for data persistence, Qdrant for vector storage, Redis for caching, and comprehensive health checks for production deployment.
Automation specialist and technical communications professional bridging AI systems, workflow orchestration, and strategic communications for enhanced business performance.
Learn more about Daniel