- Start Open WebUI, Ollama, and Qdrant with Docker Compose.
- Understand what each service does and how they communicate.
- Verify that the stack is responding before uploading documents.
Project structure
aulafy-stack/
docker-compose.yml
data/
ollama/
open-webui/
qdrant/docker-compose.yml
services:
ollama:
image: ollama/ollama:latest
container_name: aulafy-ollama
ports:
- "11434:11434"
volumes:
- ./data/ollama:/root/.ollama
restart: unless-stopped
qdrant:
image: qdrant/qdrant:latest
container_name: aulafy-qdrant
ports:
- "6333:6333"
- "6334:6334"
volumes:
- ./data/qdrant:/qdrant/storage
restart: unless-stopped
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: aulafy-open-webui
ports:
- "3000:8080"
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- VECTOR_DB=qdrant
- QDRANT_URI=http://qdrant:6333
volumes:
- ./data/open-webui:/app/backend/data
depends_on:
- ollama
- qdrant
restart: unless-stoppedStartup
mkdir aulafy-stack cd aulafy-stack # create docker-compose.yml with the content above docker compose up -d docker compose ps
Download a model
Evaluate before trusting
Uploading documents and receiving a nice answer does not prove that RAG works. Create a small test battery with expected answer, expected source, and failure criteria.
rag_evals:
- id: "manual-001"
question: "What is the return period?"
expected_source: "customer_manual.pdf#p12"
must_contain:
- "30 days"
- "purchase receipt"
fail_if:
- "does not cite source"
- "mixes old policy"
- "answers without evidence"Test at least ten questions: five with an answer in documents, three that should not be answered, and two with similar but contradictory information. If the system cannot abstain, it is not ready yet.
docker exec -it aulafy-ollama ollama pull qwen3:4b docker exec -it aulafy-ollama ollama run qwen3:4b
Useful commands
docker compose logs -f open-webui docker compose logs -f ollama docker compose logs -f qdrant docker compose pull docker compose up -d docker compose down