My AI Stack - March 2025

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.

yaml
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.

Daniel Rosehill

Automation specialist and technical communications professional bridging AI systems, workflow orchestration, and strategic communications for enhanced business performance.

Learn more about Daniel