version: '3.8' services: # PostgreSQL - 共用資料庫(支援 pgvector) postgres: image: pgvector/pgvector:pg15 container_name: tobiichiGPT-postgres restart: unless-stopped environment: POSTGRES_DB: tobiichiGPT POSTGRES_USER: tobiichi3227 POSTGRES_PASSWORD: ${DB_PASSWORD} volumes: - /mnt/data/External/tobiichiGPT/db_data/pg:/var/lib/postgresql/data networks: - tobiichiGPT-network healthcheck: test: ["CMD-SHELL", "pg_isready -U tobiichi3227"] interval: 10s timeout: 5s retries: 5 # MongoDB - Rocket.Chat 資料庫 mongo: image: mongo:7.0 container_name: tobiichiGPT-mongo restart: unless-stopped volumes: - /mnt/data/External/tobiichiGPT/db_data/mongo:/data/db networks: - tobiichiGPT-network command: mongod --oplogSize 128 --replSet rs0 healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 10s timeout: 5s retries: 5 # MongoDB Replica Set 初始化 mongo-init-replica: image: mongo:7.0 container_name: tobiichiGPT-mongo-init restart: "no" depends_on: mongo: condition: service_healthy networks: - tobiichiGPT-network command: > bash -c " for i in {1..30}; do mongosh mongo/rocketchat --eval \" rs.initiate({ _id: 'rs0', members: [ { _id: 0, host: 'mongo:27017' } ] })\" && break || echo \"嘗試 $$i 次,等待 5 秒...\" && sleep 5; done " # API 轉接層 - 偽裝 OpenAI API api: image: python:3.11-slim container_name: tobiichiGPT-api restart: unless-stopped ports: - "18000:8000" environment: - DB_HOST=postgres - DB_PORT=5432 - DB_NAME=tobiichiGPT - DB_USER=tobiichi3227 - DB_PASSWORD=${DB_PASSWORD} - ROCKETCHAT_URL=http://rocketchat:3000 - ROCKETCHAT_USER=${ROCKETCHAT_USER} - ROCKETCHAT_PASSWORD=${ROCKETCHAT_PASSWORD} volumes: - /mnt/data/External/tobiichiGPT/api_data:/app working_dir: /app command: > sh -c " pip install --no-cache-dir -r requirements.txt && python server.py " networks: - tobiichiGPT-network depends_on: postgres: condition: service_healthy rocketchat: condition: service_started # Open WebUI - 用戶對話介面 openwebui: image: ghcr.io/open-webui/open-webui:main container_name: tobiichiGPT-ui restart: unless-stopped ports: - "10060:8080" environment: - DATABASE_URL=postgresql://tobiichi3227:${DB_PASSWORD}@postgres:5432/tobiichiGPT - WEBUI_AUTH=True - ENABLE_FORWARD_USER_INFO_HEADERS=True volumes: - /mnt/data/External/tobiichiGPT/ui_data:/app/backend/data networks: - tobiichiGPT-network depends_on: postgres: condition: service_healthy # Rocket.Chat - 管理員對話介面 rocketchat: image: registry.rocket.chat/rocketchat/rocket.chat:latest container_name: tobiichiGPT-rocketchat restart: unless-stopped ports: - "13000:3000" environment: MONGO_URL: mongodb://mongo:27017/rocketchat?replicaSet=rs0 MONGO_OPLOG_URL: mongodb://mongo:27017/local?replicaSet=rs0 ROOT_URL: http://localhost:13000 PORT: 3000 DEPLOY_METHOD: docker networks: - tobiichiGPT-network depends_on: mongo: condition: service_healthy mongo-init-replica: condition: service_completed_successfully networks: tobiichiGPT-network: driver: bridge name: tobiichiGPT-network # 固定網路名稱,讓 proxy stack 可以連接