version: '3.8' # Library - Front Desk API (Coordination Service) # Application Layer # Port: 8089 (HTTP) # GPU: No # Storage: SSD (venv, logs) services: library-desk: image: python:3.12-slim container_name: library-desk restart: unless-stopped ports: - "8089:8089" # FastAPI HTTP volumes: # Mount source code for live editing - /home/jpmschweitzer/Projects/portainer-core/services/library-desk:/app # Persist container's venv for fast restarts - /home/jpmschweitzer/docker-data/library-desk/venv:/venv working_dir: /app command: > sh -c " echo 'Installing system dependencies...' && apt-get update -qq && apt-get install -y --no-install-recommends curl >/dev/null 2>&1 && rm -rf /var/lib/apt/lists/* && echo 'Setting up Python environment...' && if [ ! -f /venv/bin/python ]; then echo 'Initializing venv...' && python3 -m venv --clear /venv; fi && echo 'Upgrading pip...' && /venv/bin/python -m pip install --upgrade pip --quiet && echo 'Installing dependencies from requirements.txt...' && /venv/bin/python -m pip install -r /app/requirements.txt --quiet && echo 'Starting Library Desk API...' && /venv/bin/python -m uvicorn src.main:app --host 0.0.0.0 --port 8089 --workers 2 " environment: # API Configuration - LIBRARY_API_KEY=${LIBRARY_API_KEY} # Neo4j Configuration - NEO4J_URI=bolt://neo4j:7687 - NEO4J_USER=neo4j - NEO4J_PASSWORD=${NEO4J_PASSWORD} # Qdrant Configuration - QDRANT_HOST=qdrant - QDRANT_PORT=6333 # Wiki.js Configuration - WIKIJS_URL=http://wiki:3000 - WIKIJS_USERNAME=librarian@schweitz.net - WIKIJS_PASSWORD=${WIKIJS_PASSWORD} - WIKIJS_DB_PASSWORD=${WIKIJS_DB_PASSWORD} # SearXNG Configuration - SEARXNG_URL=http://searxng:8080 # Ollama Configuration (for embeddings) - OLLAMA_URL=http://ollama:11434 - OLLAMA_MODEL=nomic-embed-text # Redis Configuration - REDIS_HOST=redis-shared - REDIS_PORT=6379 - REDIS_DB=4 # Python Configuration - PYTHONUNBUFFERED=1 - TZ=${TZ:-Europe/Amsterdam} networks: - docker-dataplane deploy: resources: reservations: memory: 256M limits: memory: 768M healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8089/health')"] interval: 30s timeout: 10s retries: 3 start_period: 60s networks: docker-dataplane: external: true name: docker-dataplane # ⚠️ SECURITY WARNING: # Set these in environment variables before deploying: # - LIBRARY_API_KEY (generate with: openssl rand -hex 32) # - NEO4J_PASSWORD (from library-neo4j deployment) # - LIBRARY_DB_PASSWORD (from library-wiki deployment) # - WIKIJS_API_KEY (from Wiki.js admin panel → API Access) # # Prerequisites: # 1. Create /home/jpmschweitzer/Projects/portainer-core/services/library/services/front-desk/ # 2. Create requirements.txt (see DEPLOYMENT.md Phase 4.3) # 3. Create main.py with FastAPI app (see DEPLOYMENT.md Phase 4.3) # # API Endpoints (once implemented): # Query: # POST /query/hybrid # HybridRAG (graph + vector + web) # POST /query/semantic # Vector search only # POST /query/graph # Graph traversal only # GET /query/related/{id} # Find related content # # Content Management: # POST /ingest/document # Index new document # POST /ingest/wiki-page # Sync Wiki.js page # POST /wiki/dossier # Create dossier (proxies to Wiki.js) # PUT /wiki/dossier/{id} # Update dossier # DELETE /wiki/dossier/{id} # Delete dossier # # Graph Operations: # GET /graph/entities # List entities # GET /graph/mindmap/{id} # Generate mind map for dossier # POST /graph/query # Execute Cypher query # # Deduplication: # POST /deduplicate/find # Find potential duplicates # POST /deduplicate/merge # Merge duplicate entities # # System: # GET /stats # System statistics # GET /health # Health check # # API Documentation: # - Interactive docs: http://192.168.86.149:8089/docs # - OpenAPI spec: http://192.168.86.149:8089/openapi.json # # Features: # - HybridRAG queries (Neo4j + Qdrant + SearXNG) # - Document ingestion and indexing # - Entity extraction and relationship mapping # - Mind map generation # - Deduplication detection # - Wiki.js API proxy # # Dependencies: # - Neo4j (knowledge graph) # - Qdrant (vector search) # - Wiki.js (wiki operations) # - SearXNG (web search) # - Ollama (embeddings) # - Redis (caching)