# Muse 2.0.0 单人版一体化编排(S9):muse-server 单体 + PostgreSQL + Redis。 # # 边界:Dify 沿用其官方 compose 独立部署,本栈通过 env 指向 Dify(base-url 与两类 key: # 写作/解析 app key 走 muse.ai.dify、知识 dataset key 走 muse.knowledge.dify)。 # 租户机制保持开启,单人部署所有请求固定 tenant-id=1;多用户 worker 全关(见 env_file)。 # # 用法: # 1. mvn -pl muse-server -am -Dmaven.test.skip=true clean package # 先出可运行 jar(Dockerfile 只 COPY jar) # 2. cp scripts/dev/solo-compose.env.example .env.solo # 填 Dify 真实凭据与 PG/Redis 密码 # 3. docker compose -f docker-compose.solo.yml --env-file .env.solo up -d --build # 首次 up 时 PostgreSQL 空卷会执行 yudao 基座 SQL(initdb),muse-server 启动再跑 Flyway 建 muse 表; # 菜单数据见部署手册的 system_menu solo SQL(provision 后单独执行)。 services: postgres: image: postgres:16-alpine environment: POSTGRES_USER: ${MUSE_POSTGRES_USERNAME:-muse} POSTGRES_PASSWORD: ${MUSE_POSTGRES_PASSWORD:?solo 部署必须显式设置 PG 密码} POSTGRES_DB: ${MUSE_POSTGRES_DATABASE:-muse} volumes: - solo-pgdata:/var/lib/postgresql/data # 基座 schema+seed 仅在空卷首次初始化时执行(docker-entrypoint-initdb.d 约定);muse 表由 muse-server 的 Flyway 建。 - ./sql/dev/yudao-base-schema-postgres.sql:/docker-entrypoint-initdb.d/01-yudao-base-schema.sql:ro - ./sql/dev/yudao-base-seed-postgres.sql:/docker-entrypoint-initdb.d/02-yudao-base-seed.sql:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U ${MUSE_POSTGRES_USERNAME:-muse} -d ${MUSE_POSTGRES_DATABASE:-muse}"] interval: 5s timeout: 5s retries: 10 restart: unless-stopped redis: image: redis:8-alpine # 生产稳定:solo 部署 Redis 必须设密码 + 开 AOF 持久化(草稿安全网/幂等键不可随重启丢失)。 command: ["redis-server", "--requirepass", "${MUSE_REDIS_PASSWORD:?solo 部署必须显式设置 Redis 密码}", "--appendonly", "yes"] volumes: - solo-redisdata:/data healthcheck: test: ["CMD-SHELL", "redis-cli -a \"$$MUSE_REDIS_PASSWORD\" ping | grep -q PONG"] interval: 5s timeout: 5s retries: 10 environment: MUSE_REDIS_PASSWORD: ${MUSE_REDIS_PASSWORD} restart: unless-stopped muse-server: build: context: ./muse-server dockerfile: Dockerfile depends_on: postgres: condition: service_healthy redis: condition: service_healthy # 单人版默认开关(tenant on / 多用户 worker 全关 / New-API off / Dify on / 超时对齐)。 env_file: - scripts/dev/solo-compose.env.example environment: # --- 数据库/Redis 指向本栈服务(覆盖 infra profile 默认的远端 host)--- MUSE_POSTGRES_HOST: postgres MUSE_POSTGRES_PORT: "5432" MUSE_POSTGRES_DATABASE: ${MUSE_POSTGRES_DATABASE:-muse} MUSE_POSTGRES_USERNAME: ${MUSE_POSTGRES_USERNAME:-muse} MUSE_POSTGRES_PASSWORD: ${MUSE_POSTGRES_PASSWORD} MUSE_REDIS_HOST: redis MUSE_REDIS_PORT: "6379" MUSE_REDIS_PASSWORD: ${MUSE_REDIS_PASSWORD} # --- 知识运行时 = Dify(S6d 后 RAGFlow 运行时已删,provider 未设也缺省 Dify)--- MUSE_KNOWLEDGE_RUNTIME_PROVIDER: dify # --- Dify 凭据(从 --env-file .env.solo 注入,勿在此硬编明文)--- MUSE_AI_DIFY_BASE_URL: ${MUSE_AI_DIFY_BASE_URL} MUSE_AI_DIFY_WRITING_APP_ID: ${MUSE_AI_DIFY_WRITING_APP_ID} MUSE_AI_DIFY_WRITING_API_KEY: ${MUSE_AI_DIFY_WRITING_API_KEY} MUSE_AI_DIFY_PARSER_APP_ID: ${MUSE_AI_DIFY_PARSER_APP_ID} MUSE_AI_DIFY_PARSER_API_KEY: ${MUSE_AI_DIFY_PARSER_API_KEY} MUSE_KNOWLEDGE_DIFY_BASE_URL: ${MUSE_KNOWLEDGE_DIFY_BASE_URL} MUSE_KNOWLEDGE_DIFY_DATASET_API_KEY: ${MUSE_KNOWLEDGE_DIFY_DATASET_API_KEY} # --- 无 Nacos 干净启动(无注册中心环境,关服务发现避免持续重连噪声)--- SPRING_CLOUD_NACOS_DISCOVERY_ENABLED: "false" # --- JVM 与代理(内网直连 Dify/PG/Redis 禁用系统代理,避免 fake-ip 劫持)--- JAVA_OPTS: "-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom -Djava.net.useSystemProxies=false -Dhttp.proxyHost= -Dhttps.proxyHost=" ARGS: "--spring.profiles.active=local,infra" volumes: # muse 业务表的 36 个 Flyway 迁移脚本在 sql/muse/,application.yaml 的 # flyway.locations 含 filesystem:sql/muse(相对容器 WORKDIR /muse-server); # 脚本未打进 jar(classpath:db/migration/muse 为空),必须在此挂载,否则 Flyway # "No migrations found" → muse 表全缺 → AI worker 每秒报 relation does not exist。 # 经 mini-infra 从零起全栈真验:挂载后 applied 36 migrations、now at v37、121 表。 - ./sql/muse:/muse-server/sql/muse:ro ports: - "48080:48080" restart: unless-stopped volumes: solo-pgdata: solo-redisdata: