feat: serverdata 资源目录 + serverrun 运维编排

- serverdata/:统一承载全部资源目录(data/logs/files/keys/prompts/uploads)
- data/→serverdata/data、templates/→serverdata/prompts、uploads/→serverdata/uploads
- config.py 集中 serverdata 路径;培训子应用 db/uploads 指到 serverdata
- serverrun/:start.sh(初始化资源目录+启动 dispatcher)、Dockerfile、docker-compose(core+compute-engine+redis+mysql)
- 66 测试全绿
This commit is contained in:
2026-08-24 00:42:35 +08:00
parent a869b2934a
commit 0c0e2586ed
45 changed files with 171 additions and 16 deletions
+17
View File
@@ -0,0 +1,17 @@
# server-core 镜像(多阶段)
FROM ghcr.io/astral-sh/uv:python3.12 AS base
WORKDIR /app
ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy
# 依赖层(利用缓存)
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev --no-install-project
# 代码层
COPY app ./app
COPY dispatcher.py main.py pyproject.toml uv.lock ./
COPY serverdata ./serverdata
COPY serverrun ./serverrun
EXPOSE 8090
CMD ["bash", "serverrun/start.sh"]
+85
View File
@@ -0,0 +1,85 @@
# 云超服后端服务群编排(serverrun/)
# 服务:coreserver-core,统一入口)+ compute-engine(算力引擎)+ 基础设施(redis/mysql/emqx
# 对外统一生产服务 opc.pinesound.cn → core:8090
services:
core:
build:
context: ..
dockerfile: serverrun/Dockerfile
container_name: opc-core
restart: always
ports:
- "127.0.0.1:8090:8090" # 统一入口(经网关暴露,仅 loopback)
environment:
- PINEAGENTS_DEMO_DATABASE_URL=mysql+asyncmy://opc:opc_pass@mysql:3306/opc?charset=utf8mb4
- REDIS_URL=redis://:redis_pass@redis:6379/0
- TZ=Asia/Shanghai
volumes:
- ./../serverdata:/app/serverdata # 资源目录挂载
depends_on:
- redis
- mysql
networks:
- opc-network
compute-engine:
image: calciumion/new-api:latest
container_name: opc-compute-engine
restart: always
command: --log-dir /app/logs
ports:
- "127.0.0.1:3000:3000" # 仅 loopback,算力服务经内部 IP 调用
environment:
- SQLITE_PATH=/data/new-api.db
- REDIS_CONN_STRING=redis://:redis_pass@redis:6379/0
- SESSION_SECRET=${SESSION_SECRET:?请设置 SESSION_SECRET}
- TZ=Asia/Shanghai
volumes:
- compute-data:/data
- compute-logs:/app/logs
depends_on:
- redis
networks:
- opc-network
redis:
image: redis:7
container_name: opc-redis
restart: always
command: ["redis-server", "--requirepass", "redis_pass"]
networks:
- opc-network
mysql:
image: mysql:8
container_name: opc-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root_pass
MYSQL_DATABASE: opc
MYSQL_USER: opc
MYSQL_PASSWORD: opc_pass
volumes:
- mysql-data:/var/lib/mysql
networks:
- opc-network
# emqx(消息总线,大屏/桌面端实时)——可选,启用时打开注释
# emqx:
# image: emqx/emqx:5.8
# container_name: opc-emqx
# restart: always
# ports:
# - "127.0.0.1:1883:1883"
# networks:
# - opc-network
volumes:
compute-data:
compute-logs:
mysql-data:
networks:
opc-network:
driver: bridge
+40
View File
@@ -0,0 +1,40 @@
#!/bin/bash
# server-core 启动脚本(serverrun/,参考 PineSoundServer 工程化)
# 职责:初始化 serverdata 资源目录 → 启动服务
set -euo pipefail
# 项目根(本脚本位于 serverrun/ 下)
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT"
echo "=========================================="
echo "初始化 serverdata 资源目录..."
echo "=========================================="
SERVERDATA_DIRS=(
"serverdata/data"
"serverdata/logs"
"serverdata/files"
"serverdata/keys"
"serverdata/prompts"
"serverdata/uploads"
)
for dir in "${SERVERDATA_DIRS[@]}"; do
if [ ! -d "$dir" ]; then
echo "✗ 创建 $dir"
mkdir -p "$dir"
else
echo "$dir"
fi
done
echo "=========================================="
echo "启动 coredispatcher 统一入口)"
echo "=========================================="
# 生产模式:uv 管理,uvicorn dispatcher
if command -v uv >/dev/null 2>&1 && [ -f pyproject.toml ]; then
exec uv run uvicorn dispatcher:app --host 0.0.0.0 --port "${PORT:-8090}"
else
exec uvicorn dispatcher:app --host 0.0.0.0 --port "${PORT:-8090}"
fi