feat: serverrun/serverdata 全服务栈(参考 PineSoundServer)

- serverrun/:start-all.sh 一键编排 + start-compute/start-emqx + envcopy/encrypt-certs
- 服务编排:core(Dockerfile+compose)、compute-engine(build.sh+compose)、mysql、redis、mqtt(EMQX)
- serverdata/:新增 compute-data/compute-logs/mysql-data/redis-data/emqx-data/emqx-log
- 全服务仅 loopback 暴露,算力引擎 :3000 经 core 代理
This commit is contained in:
2026-08-24 01:00:52 +08:00
parent 0c0e2586ed
commit a813a139dc
13 changed files with 234 additions and 86 deletions
+20
View File
@@ -0,0 +1,20 @@
#!/bin/bash
# 构建算力引擎镜像(new-api 源码在 code/compute-engineserver-core 的兄弟仓库)
set -euo pipefail
# 本脚本位于 server-core/serverrun/compute-engine/
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# 计算源仓库:server-core/serverrun/compute-engine → ../../.. → code/ → compute-engine
SRC_DIR="$(cd "$SCRIPT_DIR/../../.." && pwd)"
ENGINE_SRC="${ENGINE_SRC:-$SRC_DIR/compute-engine}"
TAG="${COMPUTE_ENGINE_TAG:-opc-compute-engine:latest}"
if [ ! -f "$ENGINE_SRC/Dockerfile" ]; then
echo "错误:未找到算力引擎源码 $ENGINE_SRC/Dockerfile" >&2
echo "clone: git clone http://code.infoepoch.cn/Pine/compute-engine.git $ENGINE_SRC" >&2
exit 1
fi
echo "构建算力引擎镜像:$TAG(源码 $ENGINE_SRC..."
docker build -t "$TAG" "$ENGINE_SRC"
echo "构建完成:$TAG"
@@ -0,0 +1,27 @@
# 算力调度服务(compute-engine / new-api)编排
# 仅服务:OpenAI 兼容 /v1 中继 + 额度/令牌/流水;仅 loopback :3000,不对外暴露。
# 镜像:本地构建(build.sh)或 calciumion/new-api:latest。
services:
compute-engine:
image: ${COMPUTE_ENGINE_IMAGE:-opc-compute-engine: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 # 或 MySQL: SQL_DSN=mysql+asyncmy://...
- REDIS_CONN_STRING=redis://:redis_pass@redis:6379/0
- SESSION_SECRET=${SESSION_SECRET:?请设置 SESSION_SECRET}
- TZ=Asia/Shanghai
volumes:
- ../../serverdata/compute-data:/data
- ../../serverdata/compute-logs:/app/logs
networks:
- opc-network
networks:
opc-network:
name: opc-network
external: true
+30
View File
@@ -0,0 +1,30 @@
# 主服务 coreserver-core / dispatcher)编排
# 统一对外生产服务 opc.pinesound.cn → core:8090(经网关,仅 loopback
services:
core:
build:
context: ../..
dockerfile: serverrun/Dockerfile
image: opc-core:latest
container_name: opc-core
restart: always
ports:
- "127.0.0.1:8090:8090"
environment:
- PINEAGENTS_DEMO_DATABASE_URL=mysql+asyncmy://opc:opc_pass@mysql:3306/opc?charset=utf8mb4
- REDIS_URL=redis://:redis_pass@redis:6379/0
- SESSION_SECRET=${SESSION_SECRET:?请设置 SESSION_SECRET}
- TZ=Asia/Shanghai
volumes:
- ../../serverdata:/app/serverdata
depends_on:
- redis
- mysql
networks:
- opc-network
networks:
opc-network:
name: opc-network
external: true
-85
View File
@@ -1,85 +0,0 @@
# 云超服后端服务群编排(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
+23
View File
@@ -0,0 +1,23 @@
#!/bin/bash
# 证书加密打包(参考 PineSoundServer encrypt-certs.sh
# 用途:微信/HTTPS 证书加密归档,不入库。
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT"
ENC_KEY="${ENC_KEY:-}"
if [ -z "$ENC_KEY" ]; then
echo "错误:请设置 ENC_KEY" >&2
exit 1
fi
CERT_DIR="serverdata/keys/certs"
if [ ! -d "$CERT_DIR" ]; then
echo "目录不存在:$CERT_DIR(先放置证书)" >&2
exit 1
fi
tar -czf - -C "$CERT_DIR" . | openssl enc -aes-256-cbc -pbkdf2 -salt \
-out serverrun/certs.tar.gz.enc -pass pass:"$ENC_KEY"
echo "已加密:serverrun/certs.tar.gz.enc"
+18
View File
@@ -0,0 +1,18 @@
#!/bin/bash
# 配置加密:.env → .env.enc(参考 PineSoundServer envcopy.sh
# 用途:生产机不落明文配置,仅保留加密包;部署时解密注入。
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT"
ENC_KEY="${ENC_KEY:-}"
if [ -z "$ENC_KEY" ]; then
echo "错误:请设置 ENC_KEYopenssl rand -hex 32" >&2
exit 1
fi
SRC="${1:-.env}"
DST="${SRC}.enc"
openssl enc -aes-256-cbc -pbkdf2 -salt -in "$SRC" -out "$DST" -pass pass:"$ENC_KEY"
echo "已加密:$SRC -> $DST"
+23
View File
@@ -0,0 +1,23 @@
# MQTT 消息服务(EMQX,大屏/桌面端实时总线)
services:
emqx:
image: emqx/emqx:5.8
container_name: opc-emqx
restart: always
ports:
- "127.0.0.1:1883:1883" # MQTT
- "127.0.0.1:18083:18083" # 管理 API
- "127.0.0.1:8083:8083" # WebSocket
environment:
- EMQX_NAME=opc
- EMQX_HOST=node1.emqx.local
volumes:
- ../../serverdata/emqx-data:/opt/emqx/data
- ../../serverdata/emqx-log:/opt/emqx/log
networks:
- opc-network
networks:
opc-network:
name: opc-network
external: true
+23
View File
@@ -0,0 +1,23 @@
# MySQL 服务(业务主库,后续启用;先建编排)
services:
mysql:
image: mysql:8
container_name: opc-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root_pass}
MYSQL_DATABASE: opc
MYSQL_USER: opc
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-opc_pass}
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
ports:
- "127.0.0.1:3306:3306"
volumes:
- ../../serverdata/mysql-data:/var/lib/mysql
networks:
- opc-network
networks:
opc-network:
name: opc-network
external: true
+18
View File
@@ -0,0 +1,18 @@
# Redis 缓存服务(会话/缓存/限流/分布式锁)
services:
redis:
image: redis:7
container_name: opc-redis
restart: always
command: ["redis-server", "--requirepass", "redis_pass"]
ports:
- "127.0.0.1:6379:6379"
volumes:
- ../../serverdata/redis-data:/data
networks:
- opc-network
networks:
opc-network:
name: opc-network
external: true
+28
View File
@@ -0,0 +1,28 @@
#!/bin/bash
# 一键编排启动全部服务(serverrun/,参考 PineSoundServer start-all.sh
# 顺序:基础设施(redis/mysql/emqx) → 算力调度 → 主服务 core
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT/serverrun"
echo "=========================================="
echo "① 基础设施:Redis / MySQL / MQTT(EMQX)"
echo "=========================================="
docker compose -f redis/docker-compose.yml up -d || true
docker compose -f mysql/docker-compose.yml up -d || true
docker compose -f mqtt/docker-compose.yml up -d || true
echo "=========================================="
echo "② 算力调度服务 compute-engine"
echo "=========================================="
bash start-compute.sh || true
echo "=========================================="
echo "③ 主服务 coredispatcher 统一入口)"
echo "=========================================="
docker compose -f core/docker-compose.yml up -d --build || true
echo "=========================================="
echo "完成。core 地址:http://127.0.0.1:8090(对外经网关 opc.pinesound.cn"
echo "=========================================="
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
# 算力调度服务(compute-engine / new-api)启动
set -euo pipefail
cd "$(dirname "${BASH_SOURCE[0]}")/compute-engine"
echo "构建算力引擎镜像..."
bash build.sh
echo "启动算力引擎(仅 loopback :3000..."
docker compose up -d
echo "算力引擎就绪:http://127.0.0.1:3000(经 core 算力服务代理,不对外直连)"
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
# MQTT 消息服务(EMQX)启动
set -euo pipefail
cd "$(dirname "${BASH_SOURCE[0]}")/mqtt"
docker compose up -d
echo "EMQX 就绪::1883(MQTT) / :18083(API)"