version: "3.8" services: # ── 应用服务 ── app: build: context: . dockerfile: Dockerfile container_name: edu-brain-app restart: unless-stopped ports: - "${APP_PORT:-8000}:8000" volumes: - ./data:/app/data # 数据目录挂载 env_file: - .env depends_on: db: condition: service_healthy environment: - DATABASE_URL=postgresql+asyncpg://postgres:${POSTGRES_PASSWORD:-postgres}@db:5432/edu_brain healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"] interval: 30s timeout: 10s retries: 3 start_period: 60s # ── PostgreSQL 数据库(pgvector + zhparser 自定义镜像) ── db: build: context: . dockerfile: Dockerfile.db container_name: edu-brain-db restart: unless-stopped ports: - "${DB_PORT:-5432}:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./sql/init.sql:/docker-entrypoint-initdb.d/01-init.sql:ro environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} POSTGRES_DB: edu_brain POSTGRES_HOST_AUTH_METHOD: scram-sha-256 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d edu_brain"] interval: 10s timeout: 5s retries: 5 start_period: 30s volumes: postgres_data: driver: local