An on-premise, containerized Enterprise AI Platform with multimodal input processing, a Meeting Intelligence module, agentic orchestration, RAG pipelines, and enterprise-grade observability. No external API calls at runtime — all models and services run inside an isolated Docker network.
Architecture reference: Project_Files/High Level design Diagram.png
| Module | Description |
|---|---|
| RAG (Document Q&A) | Hybrid semantic + keyword search over enterprise documents (PDF, DOCX, XLSX). Arabic + English OCR. |
| Meeting Intelligence | Upload recordings → auto-transcription (Whisper) → speaker diarization (pyannote) → AI summary + action items |
| RBAC | Role-based document access control enforced at query time |
| Observability | Structured JSON logs → Elasticsearch, distributed traces → Grafana Tempo, Prometheus metrics |
| Living Docs | Auto-generated platform documentation (Markdown, PPTX, DOCX) from live system introspection |
This repo includes a migration/export CLI in export_tool/ for exporting PostgreSQL, Neo4j, Milvus, and Elasticsearch data into portable filesystem artifacts with manifests and SHA256 checksums.
cd export_tool
python main.py --output-dir ./exports
See export_tool/README.md for setup, filtering, compression, incremental export, and restore notes.
The matching import CLI lives in import_tool/ and restores those artifacts into target PostgreSQL, Neo4j, Milvus, and Elasticsearch environments:
cd import_tool
python main.py --input-dir ./exports --dry-run
| Developer Laptop | Full Stack (VM / Workstation) | |
|---|---|---|
| RAM | 4 GB minimum | 16 GB recommended |
| Disk | ~8 GB | ~30 GB (includes ML models) |
| Ollama (LLM) | opt-in (--profile llm) or native | always on |
| Monitoring stack | opt-in (--profile monitoring) | opt-in (--profile monitoring) |
| Live reload | yes (src/ mounted read-write) | no (read-only mount) |
| Image size | ~1 GB (slim, no PyTorch) | ~11 GB (full ML stack) |
| Command | make dev-up | docker compose up -d |
Jump to: Developer Laptop Setup · Full Stack Setup
| Requirement | Minimum Version | Notes |
|---|---|---|
| Docker Engine | 24.x | Install guide |
| Docker Compose | v2.24 | Bundled with Docker Desktop |
| Python | 3.11 | For local dev / venv only |
| Free disk space | ~20 GB | More if downloading Whisper/pyannote models |
| Free RAM | 8 GB | 16 GB recommended for LLM + Meeting Intelligence |
| NVIDIA GPU | optional | Required for WHISPER_DEVICE=cuda in Meeting Intelligence |
Ports that must be free before starting:
| Port | Service |
|---|---|
| 8000 | API |
| 9000, 9001 | MinIO |
| 9090 | Prometheus |
| 9091 | Milvus health |
| 11434 | Ollama |
| 19530 | Milvus gRPC |
| 3000 | Grafana |
| 3001 | Attu (Milvus UI) |
| 4317, 4318 | OTel Collector |
| 5432 | PostgreSQL |
| 6379 | Redis |
| 2379 | etcd |
cp .env.example .env
Open .env and replace every change_me_* placeholder with real values:
POSTGRES_PASSWORD=<strong-password>
REDIS_PASSWORD=<strong-password>
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=<strong-password>
GRAFANA_ADMIN_PASSWORD=<strong-password>
SECRET_KEY=<random-32-char-string>
Generate a strong SECRET_KEY:
python3 -c "import secrets; print(secrets.token_hex(32))"
docker compose up --build -d
First run pulls all images and builds the application image — allow several minutes. Subsequent starts are fast.
docker compose logs -f api # watch startup
# Document RAG (light model)
docker exec enterprise_ai_ollama ollama pull qwen2.5:3b
# Meeting Intelligence (better quality, more RAM)
docker exec enterprise_ai_ollama ollama pull llama3.1:8b
The PostgreSQL init scripts in infra/docker/postgres/ run automatically on first container start. For an existing database, apply any new DDL files manually:
docker exec -i enterprise_ai_postgres psql -U aiuser -d enterprise_ai \
< infra/docker/postgres/05_meeting_intelligence_ddl.sql
# Upload PDFs from data/ to MinIO
make upload-data
# Extract → embed → index documents
make run-pipeline
# API health
curl http://localhost:8000/health
# Expected: {"status":"ok"}
# Interactive API docs
open http://localhost:8000/docs
# Milvus health
curl http://localhost:9091/healthz
# PostgreSQL
docker exec enterprise_ai_postgres pg_isready -U aiuser -d enterprise_ai
# Redis
docker exec enterprise_ai_redis redis-cli -a <REDIS_PASSWORD> ping
# Ollama — list available models
curl http://localhost:11434/api/tags
# All containers at once
docker compose ps
| Service | URL / Port | Credentials |
|---|---|---|
| API | http://localhost:8000 | — |
| API Docs | http://localhost:8000/docs | — |
| Grafana | http://localhost:3000 | admin / GRAFANA_ADMIN_PASSWORD |
| Prometheus | http://localhost:9090 | — |
| Attu (Milvus UI) | http://localhost:3001 | — |
| MinIO Console | http://localhost:9001 | MINIO_ROOT_USER / MINIO_ROOT_PASSWORD |
| Milvus gRPC | localhost:19530 | — |
| PostgreSQL | localhost:5432 | aiuser / POSTGRES_PASSWORD |
| Redis | localhost:6379 | REDIS_PASSWORD |
| Ollama | http://localhost:11434 | — |
| pgAdmin (monitoring profile) | http://localhost:5050 | [email protected] / admin |
| Kibana (monitoring profile) | http://localhost:5601 | — |
| Tempo (monitoring profile) | http://localhost:3200 | — |
All variables are set in .env (copied from .env.example). Key variables:
| Variable | Description |
|---|---|
POSTGRES_PASSWORD | PostgreSQL password for the aiuser account |
REDIS_PASSWORD | Redis auth password |
MINIO_ROOT_USER | MinIO admin username |
MINIO_ROOT_PASSWORD | MinIO admin password |
GRAFANA_ADMIN_PASSWORD | Grafana admin user password |
SECRET_KEY | 32-char secret for JWT signing |
LLM_MODEL | Ollama model for document RAG (default: qwen2.5:3b) |
MEETING_LLM_MODEL | Ollama model for meeting analysis (default: qwen2.5:3b) |
EMBEDDING_MODEL | Document embedding model (default: paraphrase-multilingual-MiniLM-L12-v2) |
MEETING_EMBEDDING_MODEL | Meeting embedding model (default: BAAI/bge-large-en-v1.5) |
WHISPER_MODEL | Whisper model for transcription (default: whisper-large-v3) |
WHISPER_DEVICE | cuda or cpu |
PYANNOTE_MODEL | pyannote model path or HF ID |
PYANNOTE_HF_TOKEN | HuggingFace token (needed for initial model download only) |
See .env.example for the full list including development overrides.
A slim Docker Compose override (docker-compose.dev.yaml) is provided for laptops. It:
src/ read-write for live reload (no rebuild on code changes)| Requirement | Notes |
|---|---|
| Docker Engine 24.x | Docker Desktop is fine |
| 4 GB free RAM | 8 GB recommended |
| 8 GB free disk | No Ollama models or ML models by default |
make (optional) | winget install GnuWin32.Make on Windows |
cp .env.example .env
The example file includes inline dev/prod guidance. For a developer laptop, use the "Dev:" values noted in the comments (weak passwords, CPU models, lighter LLM).
make dev-up
First build takes a few minutes. Subsequent starts are fast.
| Service | Port | mem_limit |
|---|---|---|
| api (uvicorn --reload) | 8000 | 512 MB |
| worker (concurrency 1) | — | 256 MB |
| postgres | 5432 | 256 MB |
| redis | 6379 | 128 MB |
| etcd | 2379 | 128 MB |
| milvus | 19530 | 512 MB |
| minio | 9000, 9001 | 128 MB |
| elasticsearch | 9200 | 512 MB |
Total: ~2.4 GB RAM cap across all containers.
| Profile | What it adds | Command |
|---|---|---|
llm | Ollama (local LLM inference) | make dev-up PROFILES=llm |
monitoring | OTel Collector, Prometheus, Grafana, Attu, Kibana, Filebeat, Tempo | make dev-up PROFILES=monitoring |
frontend | React app (nginx, port 3010) | make dev-up PROFILES=frontend |
| all | Everything | make dev-up PROFILES=llm,monitoring,frontend |
Tip: For Meeting Intelligence on a laptop, set dev-friendly model overrides in
.env:WHISPER_MODEL=whisper-base WHISPER_DEVICE=cpu WHISPER_COMPUTE=int8 MEETING_LLM_MODEL=qwen2.5:3b MEETING_EMBEDDING_MODEL=all-MiniLM-L6-v2
Edit any Python file under src/ — the API reloads automatically within 1–2 seconds.
make dev-logs # watch reloads
make dev-down # stops everything including monitoring-profile containers
Upload any meeting recording and the platform processes it end-to-end in the background.
MP4, MKV, MOV, MP3, WAV, M4A, WEBM
meeting_transcript_chunks, 1024-dim)meeting_chunks)| Method | Path | Description |
|---|---|---|
| POST | /api/meetings/upload | Upload recording (returns immediately, processing is async) |
| GET | /api/meetings/ | List all meetings with status |
| GET | /api/meetings/{id} | Meeting detail |
| GET | /api/meetings/{id}/transcript | Full transcript + per-segment speaker/timing data |
| GET | /api/meetings/{id}/summary | AI-generated summary |
| GET | /api/meetings/{id}/action-items | Extracted action items |
pyannote models can be pre-downloaded and served from a local directory:
# Download once on an internet-connected machine
huggingface-cli download pyannote/speaker-diarization-3.1 \
--local-dir /models/speaker-diarization-3.1 --token hf_...
huggingface-cli download pyannote/segmentation-3.0 \
--local-dir /models/segmentation-3.0 --token hf_...
Then update config.yaml inside the pipeline dir to reference local model paths, and set:
PYANNOTE_MODEL=/models/speaker-diarization-3.1
No HuggingFace token is needed at runtime.
data/ (PDFs, DOCX, XLSX)
→ MinIO (enterprise-ai-docs bucket)
→ Text extraction (pypdf / python-docx / openpyxl)
→ OCR on embedded images (tesseract ara+eng)
→ Embeddings (paraphrase-multilingual-MiniLM-L12-v2, 384-dim)
→ Milvus — vector embeddings for semantic search (document_chunks)
→ Elasticsearch — keywords + BM25 full-text search (document_chunks)
→ Postgres — document registry, pipeline run status, audit events
Enterprise_AI/
├── CLAUDE.md # Architecture and developer guide
├── Dockerfile # Multi-stage Python 3.11 build (dev + prod paths)
├── docker-compose.yaml # Full on-premise service stack
├── docker-compose.dev.yaml # Developer laptop override (slim, memory-capped)
├── Makefile # Convenience targets
├── requirements.txt # Full Python dependencies (includes PyTorch, ML libs)
├── requirements.dev.txt # Slim dependencies for dev image (no PyTorch/CV)
├── .env.example # Environment variable template (includes dev/prod guidance inline)
├── src/
│ ├── api/ # FastAPI application (docs, meetings, query, pipeline routes)
│ ├── agents/ # Agent orchestration
│ ├── multimodal/ # Audio / video / document processing
│ ├── services/ # LLM, RAG, embeddings, Meeting Intelligence pipeline
│ ├── workers/ # Celery task workers (meeting_pipeline.py)
│ ├── data/ # Milvus, Elasticsearch, PostgreSQL, Redis adapters
│ └── observability/ # Logging, tracing, metrics
├── infra/docker/ # Service config files (OTel, Prometheus, Grafana, Tempo)
├── scripts/ # Data management + living documentation pipeline
├── templates/ # Jinja2 templates for doc generation
└── tests/ # Unit, integration, e2e
The frontend/ directory contains a React 18 + TypeScript + Tailwind UI.
Local development (recommended):
make frontend-install # first time
make frontend # http://localhost:3002
Production (Docker, port 3010):
docker compose --profile frontend up -d frontend
# Stop all services (preserves data volumes)
make full-down
# Stop and wipe all data volumes (full reset)
docker compose down -v
Warning:
-vpermanently deletes all stored data including the vector store, database, and uploaded files.
Milvus takes a long time to become healthy Allow up to 60 seconds on first start. If it never becomes healthy:
docker compose logs milvus
docker compose logs etcd
Port already in use
# Linux/macOS
lsof -i :<PORT>
# Windows
netstat -ano | findstr :<PORT>
Meeting processing stuck at "processing"
make dev-logs # check worker output
docker logs enterprise_ai_worker
api container exits immediately
The API depends on PostgreSQL, Redis, Milvus, and Elasticsearch being healthy:
docker compose ps
docker compose logs postgres redis milvus elasticsearch
MinIO bucket not found
docker exec enterprise_ai_minio mc alias set local http://localhost:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD
docker exec enterprise_ai_minio mc mb local/enterprise-ai-docs
docker exec enterprise_ai_minio mc mb local/enterprise-ai-meetings
Ollama model not found
docker exec enterprise_ai_ollama ollama pull qwen2.5:3b
docker exec enterprise_ai_ollama ollama pull llama3.1:8b
An on-premise, containerized Enterprise AI Platform with multimodal input processing, a Meeting Intelligence module, agentic orchestration, RAG pipelines, and enterprise-grade observability. No external API calls at runtime — all models and services run inside an isolated Docker network.
Architecture reference: Project_Files/High Level design Diagram.png
| Module | Description |
|---|---|
| RAG (Document Q&A) | Hybrid semantic + keyword search over enterprise documents (PDF, DOCX, XLSX). Arabic + English OCR. |
| Meeting Intelligence | Upload recordings → auto-transcription (Whisper) → speaker diarization (pyannote) → AI summary + action items |
| RBAC | Role-based document access control enforced at query time |
| Observability | Structured JSON logs → Elasticsearch, distributed traces → Grafana Tempo, Prometheus metrics |
| Living Docs | Auto-generated platform documentation (Markdown, PPTX, DOCX) from live system introspection |
This repo includes a migration/export CLI in export_tool/ for exporting PostgreSQL, Neo4j, Milvus, and Elasticsearch data into portable filesystem artifacts with manifests and SHA256 checksums.
cd export_tool
python main.py --output-dir ./exports
See export_tool/README.md for setup, filtering, compression, incremental export, and restore notes.
The matching import CLI lives in import_tool/ and restores those artifacts into target PostgreSQL, Neo4j, Milvus, and Elasticsearch environments:
cd import_tool
python main.py --input-dir ./exports --dry-run
| Developer Laptop | Full Stack (VM / Workstation) | |
|---|---|---|
| RAM | 4 GB minimum | 16 GB recommended |
| Disk | ~8 GB | ~30 GB (includes ML models) |
| Ollama (LLM) | opt-in (--profile llm) or native | always on |
| Monitoring stack | opt-in (--profile monitoring) | opt-in (--profile monitoring) |
| Live reload | yes (src/ mounted read-write) | no (read-only mount) |
| Image size | ~1 GB (slim, no PyTorch) | ~11 GB (full ML stack) |
| Command | make dev-up | docker compose up -d |
Jump to: Developer Laptop Setup · Full Stack Setup
| Requirement | Minimum Version | Notes |
|---|---|---|
| Docker Engine | 24.x | Install guide |
| Docker Compose | v2.24 | Bundled with Docker Desktop |
| Python | 3.11 | For local dev / venv only |
| Free disk space | ~20 GB | More if downloading Whisper/pyannote models |
| Free RAM | 8 GB | 16 GB recommended for LLM + Meeting Intelligence |
| NVIDIA GPU | optional | Required for WHISPER_DEVICE=cuda in Meeting Intelligence |
Ports that must be free before starting:
| Port | Service |
|---|---|
| 8000 | API |
| 9000, 9001 | MinIO |
| 9090 | Prometheus |
| 9091 | Milvus health |
| 11434 | Ollama |
| 19530 | Milvus gRPC |
| 3000 | Grafana |
| 3001 | Attu (Milvus UI) |
| 4317, 4318 | OTel Collector |
| 5432 | PostgreSQL |
| 6379 | Redis |
| 2379 | etcd |
cp .env.example .env
Open .env and replace every change_me_* placeholder with real values:
POSTGRES_PASSWORD=<strong-password>
REDIS_PASSWORD=<strong-password>
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=<strong-password>
GRAFANA_ADMIN_PASSWORD=<strong-password>
SECRET_KEY=<random-32-char-string>
Generate a strong SECRET_KEY:
python3 -c "import secrets; print(secrets.token_hex(32))"
docker compose up --build -d
First run pulls all images and builds the application image — allow several minutes. Subsequent starts are fast.
docker compose logs -f api # watch startup
# Document RAG (light model)
docker exec enterprise_ai_ollama ollama pull qwen2.5:3b
# Meeting Intelligence (better quality, more RAM)
docker exec enterprise_ai_ollama ollama pull llama3.1:8b
The PostgreSQL init scripts in infra/docker/postgres/ run automatically on first container start. For an existing database, apply any new DDL files manually:
docker exec -i enterprise_ai_postgres psql -U aiuser -d enterprise_ai \
< infra/docker/postgres/05_meeting_intelligence_ddl.sql
# Upload PDFs from data/ to MinIO
make upload-data
# Extract → embed → index documents
make run-pipeline
# API health
curl http://localhost:8000/health
# Expected: {"status":"ok"}
# Interactive API docs
open http://localhost:8000/docs
# Milvus health
curl http://localhost:9091/healthz
# PostgreSQL
docker exec enterprise_ai_postgres pg_isready -U aiuser -d enterprise_ai
# Redis
docker exec enterprise_ai_redis redis-cli -a <REDIS_PASSWORD> ping
# Ollama — list available models
curl http://localhost:11434/api/tags
# All containers at once
docker compose ps
| Service | URL / Port | Credentials |
|---|---|---|
| API | http://localhost:8000 | — |
| API Docs | http://localhost:8000/docs | — |
| Grafana | http://localhost:3000 | admin / GRAFANA_ADMIN_PASSWORD |
| Prometheus | http://localhost:9090 | — |
| Attu (Milvus UI) | http://localhost:3001 | — |
| MinIO Console | http://localhost:9001 | MINIO_ROOT_USER / MINIO_ROOT_PASSWORD |
| Milvus gRPC | localhost:19530 | — |
| PostgreSQL | localhost:5432 | aiuser / POSTGRES_PASSWORD |
| Redis | localhost:6379 | REDIS_PASSWORD |
| Ollama | http://localhost:11434 | — |
| pgAdmin (monitoring profile) | http://localhost:5050 | [email protected] / admin |
| Kibana (monitoring profile) | http://localhost:5601 | — |
| Tempo (monitoring profile) | http://localhost:3200 | — |
All variables are set in .env (copied from .env.example). Key variables:
| Variable | Description |
|---|---|
POSTGRES_PASSWORD | PostgreSQL password for the aiuser account |
REDIS_PASSWORD | Redis auth password |
MINIO_ROOT_USER | MinIO admin username |
MINIO_ROOT_PASSWORD | MinIO admin password |
GRAFANA_ADMIN_PASSWORD | Grafana admin user password |
SECRET_KEY | 32-char secret for JWT signing |
LLM_MODEL | Ollama model for document RAG (default: qwen2.5:3b) |
MEETING_LLM_MODEL | Ollama model for meeting analysis (default: qwen2.5:3b) |
EMBEDDING_MODEL | Document embedding model (default: paraphrase-multilingual-MiniLM-L12-v2) |
MEETING_EMBEDDING_MODEL | Meeting embedding model (default: BAAI/bge-large-en-v1.5) |
WHISPER_MODEL | Whisper model for transcription (default: whisper-large-v3) |
WHISPER_DEVICE | cuda or cpu |
PYANNOTE_MODEL | pyannote model path or HF ID |
PYANNOTE_HF_TOKEN | HuggingFace token (needed for initial model download only) |
See .env.example for the full list including development overrides.
A slim Docker Compose override (docker-compose.dev.yaml) is provided for laptops. It:
src/ read-write for live reload (no rebuild on code changes)| Requirement | Notes |
|---|---|
| Docker Engine 24.x | Docker Desktop is fine |
| 4 GB free RAM | 8 GB recommended |
| 8 GB free disk | No Ollama models or ML models by default |
make (optional) | winget install GnuWin32.Make on Windows |
cp .env.example .env
The example file includes inline dev/prod guidance. For a developer laptop, use the "Dev:" values noted in the comments (weak passwords, CPU models, lighter LLM).
make dev-up
First build takes a few minutes. Subsequent starts are fast.
| Service | Port | mem_limit |
|---|---|---|
| api (uvicorn --reload) | 8000 | 512 MB |
| worker (concurrency 1) | — | 256 MB |
| postgres | 5432 | 256 MB |
| redis | 6379 | 128 MB |
| etcd | 2379 | 128 MB |
| milvus | 19530 | 512 MB |
| minio | 9000, 9001 | 128 MB |
| elasticsearch | 9200 | 512 MB |
Total: ~2.4 GB RAM cap across all containers.
| Profile | What it adds | Command |
|---|---|---|
llm | Ollama (local LLM inference) | make dev-up PROFILES=llm |
monitoring | OTel Collector, Prometheus, Grafana, Attu, Kibana, Filebeat, Tempo | make dev-up PROFILES=monitoring |
frontend | React app (nginx, port 3010) | make dev-up PROFILES=frontend |
| all | Everything | make dev-up PROFILES=llm,monitoring,frontend |
Tip: For Meeting Intelligence on a laptop, set dev-friendly model overrides in
.env:WHISPER_MODEL=whisper-base WHISPER_DEVICE=cpu WHISPER_COMPUTE=int8 MEETING_LLM_MODEL=qwen2.5:3b MEETING_EMBEDDING_MODEL=all-MiniLM-L6-v2
Edit any Python file under src/ — the API reloads automatically within 1–2 seconds.
make dev-logs # watch reloads
make dev-down # stops everything including monitoring-profile containers
Upload any meeting recording and the platform processes it end-to-end in the background.
MP4, MKV, MOV, MP3, WAV, M4A, WEBM
meeting_transcript_chunks, 1024-dim)meeting_chunks)| Method | Path | Description |
|---|---|---|
| POST | /api/meetings/upload | Upload recording (returns immediately, processing is async) |
| GET | /api/meetings/ | List all meetings with status |
| GET | /api/meetings/{id} | Meeting detail |
| GET | /api/meetings/{id}/transcript | Full transcript + per-segment speaker/timing data |
| GET | /api/meetings/{id}/summary | AI-generated summary |
| GET | /api/meetings/{id}/action-items | Extracted action items |
pyannote models can be pre-downloaded and served from a local directory:
# Download once on an internet-connected machine
huggingface-cli download pyannote/speaker-diarization-3.1 \
--local-dir /models/speaker-diarization-3.1 --token hf_...
huggingface-cli download pyannote/segmentation-3.0 \
--local-dir /models/segmentation-3.0 --token hf_...
Then update config.yaml inside the pipeline dir to reference local model paths, and set:
PYANNOTE_MODEL=/models/speaker-diarization-3.1
No HuggingFace token is needed at runtime.
data/ (PDFs, DOCX, XLSX)
→ MinIO (enterprise-ai-docs bucket)
→ Text extraction (pypdf / python-docx / openpyxl)
→ OCR on embedded images (tesseract ara+eng)
→ Embeddings (paraphrase-multilingual-MiniLM-L12-v2, 384-dim)
→ Milvus — vector embeddings for semantic search (document_chunks)
→ Elasticsearch — keywords + BM25 full-text search (document_chunks)
→ Postgres — document registry, pipeline run status, audit events
Enterprise_AI/
├── CLAUDE.md # Architecture and developer guide
├── Dockerfile # Multi-stage Python 3.11 build (dev + prod paths)
├── docker-compose.yaml # Full on-premise service stack
├── docker-compose.dev.yaml # Developer laptop override (slim, memory-capped)
├── Makefile # Convenience targets
├── requirements.txt # Full Python dependencies (includes PyTorch, ML libs)
├── requirements.dev.txt # Slim dependencies for dev image (no PyTorch/CV)
├── .env.example # Environment variable template (includes dev/prod guidance inline)
├── src/
│ ├── api/ # FastAPI application (docs, meetings, query, pipeline routes)
│ ├── agents/ # Agent orchestration
│ ├── multimodal/ # Audio / video / document processing
│ ├── services/ # LLM, RAG, embeddings, Meeting Intelligence pipeline
│ ├── workers/ # Celery task workers (meeting_pipeline.py)
│ ├── data/ # Milvus, Elasticsearch, PostgreSQL, Redis adapters
│ └── observability/ # Logging, tracing, metrics
├── infra/docker/ # Service config files (OTel, Prometheus, Grafana, Tempo)
├── scripts/ # Data management + living documentation pipeline
├── templates/ # Jinja2 templates for doc generation
└── tests/ # Unit, integration, e2e
The frontend/ directory contains a React 18 + TypeScript + Tailwind UI.
Local development (recommended):
make frontend-install # first time
make frontend # http://localhost:3002
Production (Docker, port 3010):
docker compose --profile frontend up -d frontend
# Stop all services (preserves data volumes)
make full-down
# Stop and wipe all data volumes (full reset)
docker compose down -v
Warning:
-vpermanently deletes all stored data including the vector store, database, and uploaded files.
Milvus takes a long time to become healthy Allow up to 60 seconds on first start. If it never becomes healthy:
docker compose logs milvus
docker compose logs etcd
Port already in use
# Linux/macOS
lsof -i :<PORT>
# Windows
netstat -ano | findstr :<PORT>
Meeting processing stuck at "processing"
make dev-logs # check worker output
docker logs enterprise_ai_worker
api container exits immediately
The API depends on PostgreSQL, Redis, Milvus, and Elasticsearch being healthy:
docker compose ps
docker compose logs postgres redis milvus elasticsearch
MinIO bucket not found
docker exec enterprise_ai_minio mc alias set local http://localhost:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD
docker exec enterprise_ai_minio mc mb local/enterprise-ai-docs
docker exec enterprise_ai_minio mc mb local/enterprise-ai-meetings
Ollama model not found
docker exec enterprise_ai_ollama ollama pull qwen2.5:3b
docker exec enterprise_ai_ollama ollama pull llama3.1:8b