- docker-compose.solo.yml:muse-server 单体+PG+Redis 一体化编排,固化 sql/muse Flyway 迁移只读挂载(mini-infra 从零真验暴露漏挂致 muse 表全缺、AI worker 每秒报 relation does not exist) - 2.0.0-单人版部署手册.md:双栈拓扑/凭据清单/从零步骤/回滚恢复多用户/Dify 升级约定 - 进度总账:§9 判据 0–7 全留证(黄金旅程 workId98 七步 PG 核验+compose 从零 36 迁移 121 表) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
99 lines
4.9 KiB
YAML
99 lines
4.9 KiB
YAML
# 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:
|