version: '3.8' services: portainer: image: portainer/portainer-ce:latest container_name: portainer restart: always ports: - "8000:8000" - "9000:9000" - "9443:9443" volumes: - /var/run/docker.sock:/var/run/docker.sock - portainer_data:/data - /backups/docker/portainer:/backups - /etc/localtime:/etc/localtime environment: - TZ=Europe/Tallinn - LANG=C.UTF-8 networks: - ai_network postgres: image: kartoza/postgis:16 container_name: postgres_postgis restart: always ports: - "5432:5432" environment: POSTGRES_USER: ai_user POSTGRES_PASSWORD: ai_secure_pass_2026 POSTGRES_DB: research_db POSTGRES_INITDB_ARGS: "-c shared_buffers=256MB -c max_connections=200" PGDATA: /var/lib/postgresql/data/pgdata TZ: Europe/Tallinn LANG: C.UTF-8 mem_limit: 4g volumes: - postgres_data:/var/lib/postgresql/data - ./init-db:/docker-entrypoint-initdb.d - /backups/docker/postgres:/backups - /etc/localtime:/etc/localtime healthcheck: test: ["CMD-SHELL", "pg_isready -U ai_user -d research_db"] interval: 10s timeout: 5s retries: 5 networks: - ai_network mariadb: image: mariadb:11 container_name: mariadb restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: ai_root_pass_2026 MYSQL_DATABASE: research_mariadb MYSQL_USER: ai_mariadb_user MYSQL_PASSWORD: ai_mariadb_pass_2026 TZ: Europe/Tallinn LANG: C.UTF-8 mem_limit: 4g volumes: - mariadb_data:/var/lib/mysql - /backups/docker/mariadb:/backups - /etc/localtime:/etc/localtime healthcheck: test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "-uai_mariadb_user", "-pai_mariadb_pass_2026"] interval: 10s timeout: 5s retries: 5 networks: - ai_network weaviate: mem_limit: 4g image: semitechnologies/weaviate:1.28.0 container_name: weaviate restart: always ports: - "8080:8080" - "50051:50051" environment: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' DEFAULT_VECTORIZER_MODULE: 'none' CLUSTER_HOSTNAME: 'weaviate' LANG: C.UTF-8 volumes: - weaviate_data:/var/lib/weaviate - /backups/docker/weaviate:/backups - /etc/localtime:/etc/localtime networks: - ai_network # Qdrant vektoriandmebaas (toetab Open WebUI) qdrant: mem_limit: 4g image: qdrant/qdrant:v1.18.2 container_name: qdrant restart: unless-stopped ports: - "6333:6333" # REST API - "6334:6334" # gRPC API environment: TZ: Europe/Tallinn LANG: C.UTF-8 volumes: - qdrant_data:/qdrant/storage - ./qdrant-config.yaml:/qdrant/config/production.yaml:ro - /backups/docker/qdrant:/backups - /etc/localtime:/etc/localtime networks: - ai_network healthcheck: test: ["CMD", "bash", "-c", " bash -c "pip install jupyter notebook tensorboard transformers datasets huggingface_hub scikit-learn pandas psycopg2-binary && jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='ai_pytorch_2026'" rag-api: mem_limit: 4g build: context: /opt/docker-compose/main/Dockerfile/rag-api dockerfile: Dockerfile container_name: rag_api restart: always ports: - "8072:8000" environment: LLAMA_CPP_URL: http://100.87.1.24:8070/completion WEAVIATE_HOST: weaviate WEAVIATE_HTTP_PORT: 8080 WEAVIATE_URL: http://weaviate:8080 WEAVIATE_CLASS: ScientificArticle DB_HOST: postgres DB_PORT: 5432 DB_NAME: pdf_research DB_USER: osm DB_PASSWORD: osm OLLAMA_URL: http://100.87.1.24:11434 TZ: Europe/Tallinn LANG: C.UTF-8 MARIADB_HOST: mariadb MARIADB_PORT: 3306 MARIADB_DB: research_mariadb MARIADB_USER: ai_mariadb_user MARIADB_PASSWORD: ai_mariadb_pass_2026 volumes: - /data/docker/rag-api/src:/app/src - /backups/docker/rag-api:/backups - /etc/localtime:/etc/localtime depends_on: - weaviate - postgres networks: - ai_network healthcheck: test: ["CMD", "true"] interval: 30s timeout: 10s retries: 3 start_period: 40s volumes: portainer_data: driver: local postgres_data: driver: local weaviate_data: driver: local jupyter_data: driver: local rocm_pytorch_data: driver: local mariadb_data: driver: local qdrant_data: external: true name: qdrant_data networks: ai_network: driver: bridge