本项目z站内源代码资源下载地址

水浒传:AI江湖 — 项目部署指南

目标环境: Linux (amd64/arm64)


1. 环境要求

1.1 硬件最低要求

资源 最低配置 推荐配置
CPU 2 核 4 核+
内存 1 GB 2 GB+
磁盘 500 MB 2 GB+(含数据库增长)
网络 公网/内网访问 带宽 ≥ 1 Mbps

1.2 软件依赖

软件 版本要求 用途 安装方式
Bun ≥ 1.3.0 JavaScript 运行时 & 包管理器 curl -fsSL https://bun.sh/install | bash
Caddy ≥ 2.x 反向代理 & SSL 见下方安装说明
SQLite ≥ 3.35 嵌入式数据库 通常系统自带
git ≥ 2.x 代码拉取(可选) 系统包管理器

1.3 安装 Caddy

# Debian/Ubuntu
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy

# 验证安装
caddy version

2. 部署架构总览

2.1 整体部署拓扑

服务器 (Linux)

外部网络

AI 外部依赖

可选服务

主服务

HTTP :81

reverse_proxy

XTransformPort 查询

XTransformPort 查询

HTTP POST

玩家浏览器
HTTP/HTTPS

Caddy 反向代理
:81 → localhost:3000
支持 XTransformPort 查询参数

Next.js Standalone Server
bun server.js
localhost:3000

mini-service-1
bun xxx.js

mini-service-2
bun yyy.js

SQLite
/app/db/custom.db

自定义 LLM API
OpenAI 兼容接口

开始前需配置模型,不然会报通信异常,见下图所示:
在这里插入图片描述

2.2 请求处理流程

AI API SQLite Next.js :3000 Caddy :81 AI API SQLite Next.js :3000 Caddy :81 alt [需要 AI 叙事] 玩家 GET/POST / reverse_proxy localhost:3000 Prisma 查询 数据 /v1/chat/completions AI 生成文本 HTML / JSON 响应 玩家

3. 快速开始(本地开发)

3.1 一键启动(推荐)

# 克隆项目
git clone <your-repo-url> my-project
cd my-project

# 使用内置开发脚本启动
bash .zscripts/dev.sh

该脚本会自动完成:

  1. bun install — 安装依赖
  2. bun run db:push — 初始化数据库
  3. bun run dev — 启动 Next.js 开发服务器(端口 3000)
  4. 健康检查 curl localhost:3000
  5. 启动 mini-services(如果存在)

3.2 手动启动

cd my-project

# 1. 安装依赖
bun install

# 2. 配置环境变量
cp .env.example .env    # 如不存在则手动创建
# 编辑 .env: DATABASE_URL=file:./db/custom.db

# 3. 初始化数据库
bun run db:push

# 4. 启动开发服务器
bun run dev
# 访问 http://localhost:3000

3.3 开发环境目录结构

my-project/
├── src/                    # 源代码
├── prisma/
│   └── schema.prisma       # 数据模型
├── db/
│   └── custom.db           # SQLite 数据库(开发环境)
├── .env                    # 环境变量(本地)
├── .zscripts/
│   ├── dev.sh              # 开发启动脚本
│   ├── build.sh            # 生产构建脚本
│   └── start.sh            # 生产启动脚本
├── package.json
└── Caddyfile               # Caddy 配置

4. 生产部署流程

4.1 部署全流程

缺失

就绪

开始部署

检查环境
Bun + Caddy + SQLite?

安装缺失依赖

拉取代码
git clone / 解压 tar.gz

bun install
安装项目依赖

配置环境变量
DATABASE_URL
LLM_API_KEY 等

bun run db:push
初始化数据库结构

bun run build
生成 .next/standalone/

复制静态资源
cp -r .next/static .next/standalone/.next/
cp -r public .next/standalone/

准备数据库
cp db/custom.db 到合适位置

bun .next/standalone/server.js
后台运行 (端口 3000)

启动 Caddy
caddy run --config Caddyfile

健康检查
curl localhost:3000
curl localhost:81

✅ 部署完成
可通过 :81 端口访问

4.2 构建产物打包部署

项目内置构建脚本,可将所有产物打包为单个 tar.gz 文件,便于分发:

# 在开发机上执行构建
cd my-project
BUILD_ID=prod-v1.0 bash .zscripts/build.sh

构建脚本会生成 /tmp/build_fullstack_prod-v1.0.tar.gz,包含:

内容 路径(包内) 说明
Next.js standalone next-service-dist/ 独立运行包
静态资源 next-service-dist/.next/static/ CSS/JS/字体
Public 目录 next-service-dist/public/ 静态文件
数据库 db/custom.db 预置种子数据
Mini-services mini-services-dist/ 微服务构建产物
Caddy 配置 Caddyfile 反向代理配置
启动脚本 start.sh 一键启动脚本

4.3 目标服务器部署

# 1. 上传打包文件到目标服务器
scp /tmp/build_fullstack_prod-v1.0.tar.gz user@target-server:/app/

# 2. 在目标服务器上解压
ssh user@target-server
cd /app
mkdir -p shuihu-release
tar -xzf build_fullstack_prod-v1.0.tar.gz -C shuihu-release
cd shuihu-release

# 3. 一键启动
bash start.sh

4.4 手动生产部署(不使用打包脚本)

cd my-project

# 1. 安装依赖
bun install

# 2. 生成 Prisma Client
bun run db:generate

# 3. 初始化/迁移数据库
bun run db:push

# 4. 构建生产版本
bun run build

# 5. 设置环境变量
export NODE_ENV=production
export PORT=3000
export HOSTNAME=0.0.0.0
export DATABASE_URL=file:./db/custom.db

# 6. 后台启动
nohup bun .next/standalone/server.js > server.log 2>&1 &

# 7. 启动 Caddy(前台运行)
caddy run --config Caddyfile --adapter caddyfile

5. 构建产物说明

5.1 Next.js Standalone 模式

项目使用 Next.js 的 output: 'standalone' 模式构建,特点:

  • 自包含:包含所有运行时依赖(node_modules 最小化)
  • 无 Node.js 要求:通过 Bun 运行时启动
  • 体积优化:只打包必要的文件

5.2 构建产物结构

.next/standalone/
├── server.js              # 入口文件
├── .next/
│   ├── static/            # 静态资源(CSS/JS/字体)
│   └── ...
├── node_modules/          # 最小化依赖
├── package.json
└── public/                # 静态文件目录

5.3 构建命令详解

# package.json 中的构建脚本
"build": "next build && cp -r .next/static .next/standalone/.next/ && cp -r public .next/standalone/"
步骤 命令 说明
1 next build Next.js 构建(含 standalone 输出)
2 cp -r .next/static .next/standalone/.next/ 复制静态资源到 standalone
3 cp -r public .next/standalone/ 复制 public 目录

6. 配置文件详解

6.1 next.config.ts

// 关键配置项
const nextConfig = {
  output: 'standalone',        // 独立部署模式
  experimental: {
    turbopack: true,           // 使用 Turbopack 加速构建
  },
  // ... 其他配置
};

6.2 Caddyfile

:81 {
    @transform_port_query {
        query XTransformPort=*
    }
    handle @transform_port_query {
        reverse_proxy localhost:{query.XTransformPort} {
            header_up Host {host}
            header_up X-Forwarded-For {remote_host}
            header_up X-Forwarded-Proto {scheme}
            header_up X-Real-IP {remote_host}
        }
    }
    handle {
        reverse_proxy localhost:3000 {
            header_up Host {host}
            header_up X-Forwarded-For {remote_host}
            header_up X-Forwarded-Proto {scheme}
            header_up X-Real-IP {remote_host}
        }
    }
}

配置说明

配置项 说明
:81 Caddy 监听端口
@transform_port_query 匹配含 ?XTransformPort=xxx 参数请求
reverse_proxy localhost:3000 默认转发到 Next.js 服务
header_up 转发客户端真实 IP 和协议头

6.3 .env 环境变量

# 数据库连接(SQLite 文件路径)
DATABASE_URL=file:./db/custom.db

# AI 模型配置(可选,通过 /api/llm-config 接口设置)
# LLM_API_URL=https://your-llm-api.com/v1
# LLM_API_KEY=sk-xxxxxxxxxxxxxxxx
# LLM_MODEL_ID=gpt-4o

注意.env 文件中的变量仅在开发环境生效。生产环境通过 export 命令或 systemd 环境变量设置。

6.4 Prisma Schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}

7. 数据库管理

7.1 数据库架构

has

takes

records

references

references

Player

string

id

PK

string

name

UK

int

level

int

hp

int

gold

int

strength

string

currentLocId

FK

string

skillLevels

JSON

string

pets

JSON

PlayerItem

PlayerQuest

DialogueLog

Item

Quest

Location

string

code

PK

string

name

string

north

→ Location.code

string

south

→ Location.code

string

east

→ Location.code

string

west

→ Location.code

Npc

string

code

PK

string

name

string

locationCode

FK

7.2 常用数据库操作

# 查看数据库结构
bun run db:push         # 同步 schema 到数据库(不丢失数据)
bun run db:generate     # 重新生成 Prisma Client
bun run db:migrate      # 执行迁移(有迁移文件时)
bun run db:reset        # 重置数据库(⚠️ 会删除所有数据)

# 直接操作 SQLite
sqlite3 db/custom.db ".tables"          # 查看所有表
sqlite3 db/custom.db ".schema Player"   # 查看 Player 表结构
sqlite3 db/custom.db "SELECT COUNT(*) FROM Player;"  # 查询玩家数量

7.3 备份与恢复

# 备份
cp db/custom.db "db/backup_$(date +%Y%m%d_%H%M%S).db"

# 恢复
cp db/backup_20260604_120000.db db/custom.db

# 自动备份(crontab)
0 3 * * * cp /app/shuihu-release/db/custom.db /app/backups/db_$(date +\%Y\%m\%d).db

7.4 数据库迁移策略

生产环境

bun run build

解压部署

bun run db:push

开发数据库
db/custom.db

构建产物
tar.gz 包

生产数据库
/app/db/custom.db

同步 schema
不丢数据

重要:生产环境首次部署时,构建产物中已包含开发环境的数据库副本作为种子数据。后续更新使用 db:push 同步 schema 变更,不会删除已有数据


8. AI 模型配置

8.1 AI 架构

成功

超时/失败

游戏引擎

getLlmConfig()
有自定义配置?

customChatCompletion()

z-ai-web-dev-sdk
内置模型

POST {url}/v1/chat/completions
Headers: Authorization Bearer {key}
Body: model, messages, max_tokens, temperature

返回 AI 文本

8.2 配置方式

AI 模型配置通过运行时 API 接口设置,无需重启服务:

# 设置自定义 LLM
curl -X POST http://localhost:3000/api/llm-config \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://api.openai.com/v1",
    "apiKey": "sk-xxxxxxxxxxxxxxxx",
    "modelId": "gpt-4o"
  }'

# 查看当前配置
curl http://localhost:3000/api/llm-config

8.3 支持的 AI 服务

服务商 API URL 示例 模型示例
OpenAI https://api.openai.com/v1 gpt-4o, gpt-4o-mini
Azure OpenAI https://xxx.openai.azure.com 部署名称
本地模型 http://localhost:11434/v1 llama3, qwen2
任何 OpenAI 兼容 API 自定义 URL 任意

8.4 AI 调用参数

参数 说明
max_tokens 1024 单次生成最大 token 数
temperature 0.8 创意度(0=确定性,1=高创意)
timeout 30s 请求超时时间

9. 反向代理(Caddy)

9.1 端口映射

外部端口 内部服务 说明
:81 localhost:3000 默认转发到 Next.js
:81?XTransformPort=xxxx localhost:xxxx 动态转发到 mini-service

9.2 添加 HTTPS(生产推荐)

your-domain.com {
    reverse_proxy localhost:3000 {
        header_up Host {host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto {scheme}
        header_up X-Real-IP {remote_host}
    }
}

Caddy 会自动从 Let’s Encrypt 获取 SSL 证书,无需额外配置。

9.3 常用 Caddy 命令

# 启动(前台)
caddy run --config Caddyfile --adapter caddyfile

# 后台启动
caddy start --config Caddyfile --adapter caddyfile

# 停止
caddy stop

# 重载配置(不中断服务)
caddy reload --config Caddyfile --adapter caddyfile

# 验证配置
caddy validate --config Caddyfile --adapter caddyfile

10. Mini-Services 管理

10.1 架构说明

构建产物

构建流程

mini-services/ 目录

bun run

bun run

bun run

service-a/
package.json
src/index.ts

service-b/
package.json
index.ts

service-c/
package.json
src/index.js

mini-services-build.sh

mini-services-dist/
mini-service-a.js

mini-services-dist/
mini-service-b.js

mini-services-dist/
mini-service-c.js

进程 1

进程 2

进程 3

10.2 添加新的 Mini-Service

# 1. 创建服务目录
mkdir -p mini-services/my-service

# 2. 创建 package.json
cat > mini-services/my-service/package.json << 'EOF'
{
  "name": "my-service",
  "scripts": {
    "dev": "bun run src/index.ts"
  }
}
EOF

# 3. 创建入口文件
cat > mini-services/my-service/src/index.ts << 'EOF'
// 你的服务逻辑
const server = Bun.serve({
  port: 4001,
  fetch(req) {
    return new Response("Hello from my-service!");
  },
});
console.log("my-service running on port 4001");
EOF

开发时,dev.sh 会自动扫描 mini-services/ 并启动所有子服务。生产构建时,build.sh 会将其编译为单文件 JS。


11. 环境变量参考

11.1 完整变量列表

变量名 必需 默认值 说明
DATABASE_URL file:./db/custom.db SQLite 数据库路径
NODE_ENV development 运行环境
PORT 3000 Next.js 服务端口
HOSTNAME 0.0.0.0 绑定地址
NEXT_TELEMETRY_DISABLED 1 禁用遥测

11.2 生产环境设置示例

# 创建环境变量文件
cat > /app/shuihu-release/.env.production << 'EOF'
DATABASE_URL=file:/app/shuihu-release/db/custom.db
NODE_ENV=production
PORT=3000
HOSTNAME=0.0.0.0
NEXT_TELEMETRY_DISABLED=1
EOF

# 启动时加载
export $(cat .env.production | xargs)
bun .next/standalone/server.js

12. 常见问题排查

12.1 问题诊断流程

服务无法访问

bun 进程在运行?

检查日志: cat server.log
手动启动: bun server.js

端口 3000 可访问?

检查端口占用: lsof -i :3000
确认 HOSTNAME=0.0.0.0

Caddy 在运行?

启动 Caddy
caddy run --config Caddyfile

端口 81 可访问?

检查防火墙: ufw status
检查 Caddy 日志

数据库文件存在?

检查 DATABASE_URL
确认 db/custom.db 存在

AI 模型正常?

检查 LLM 配置
curl /api/llm-config

✅ 服务正常

12.2 常见错误及解决方案

错误现象 可能原因 解决方案
Cannot find module 'next' 依赖未安装 bun install
PrismaClientInitializationError 数据库路径错误 检查 DATABASE_URL 是否正确
EADDRINUSE :3000 端口被占用 lsof -i :3000 查看并 kill 占用进程
ECONNREFUSED Caddy 未启动或 Next.js 未运行 按顺序启动 Next → Caddy
AI 返回空白 LLM API 不可用 检查 API URL 和 Key,内置 SDK 可回退
数据库文件只读 权限问题 chmod 644 db/custom.db
构建失败 内存不足 增加 swap 或内存,使用 NODE_OPTIONS=--max-old-space-size=2048

12.3 日志查看

# Next.js 服务日志
tail -f server.log

# Caddy 日志
journalctl -u caddy -f

# 系统资源
top -p $(pgrep -f "bun server.js")

# 检查数据库完整性
sqlite3 db/custom.db "PRAGMA integrity_check;"

13. 运维脚本参考

13.1 systemd 服务配置

创建 /etc/systemd/system/shuihu.service

[Unit]
Description=水浒传 AI江湖 Next.js Server
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/app/shuihu-release/next-service-dist
Environment=NODE_ENV=production
Environment=PORT=3000
Environment=HOSTNAME=0.0.0.0
Environment=DATABASE_URL=file:/app/shuihu-release/db/custom.db
ExecStart=/usr/local/bin/bun server.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

启动服务:

sudo systemctl daemon-reload
sudo systemctl enable shuihu
sudo systemctl start shuihu
sudo systemctl status shuihu

13.2 健康检查脚本

#!/bin/bash
# health-check.sh

NEXT_URL="http://localhost:3000"
CADDY_URL="http://localhost:81"
MAX_RETRIES=3
RETRY_INTERVAL=5

check_service() {
    local url=$1
    local name=$2
    local retries=0
    
    while [ $retries -lt $MAX_RETRIES ]; do
        if curl -fsS --connect-timeout 5 --max-time 10 "$url" > /dev/null 2>&1; then
            echo "✅ $name ($url) is healthy"
            return 0
        fi
        retries=$((retries + 1))
        echo "⚠️  $name check attempt $retries/$MAX_RETRIES failed, retrying in ${RETRY_INTERVAL}s..."
        sleep $RETRY_INTERVAL
    done
    
    echo "❌ $name ($url) is DOWN after $MAX_RETRIES attempts"
    return 1
}

check_service "$NEXT_URL" "Next.js"
check_service "$CADDY_URL" "Caddy"

13.3 自动部署脚本

#!/bin/bash
# auto-deploy.sh

set -e

RELEASE_DIR="/app/shuihu-release"
PACKAGE="$1"

if [ -z "$PACKAGE" ]; then
    echo "Usage: $0 <package.tar.gz>"
    exit 1
fi

echo "🚀 开始自动部署..."

# 1. 停止现有服务
echo "🛑 停止现有服务..."
sudo systemctl stop shuihu 2>/dev/null || true
caddy stop 2>/dev/null || true

# 2. 备份数据库
if [ -f "$RELEASE_DIR/db/custom.db" ]; then
    echo "💾 备份数据库..."
    cp "$RELEASE_DIR/db/custom.db" "/tmp/db_backup_$(date +%Y%m%d_%H%M%S).db"
fi

# 3. 解压新版本
echo "📦 解压新版本..."
rm -rf "$RELEASE_DIR"
mkdir -p "$RELEASE_DIR"
tar -xzf "$PACKAGE" -C "$RELEASE_DIR"

# 4. 启动服务
echo "▶️  启动服务..."
cd "$RELEASE_DIR"
bash start.sh &

# 5. 等待启动
sleep 5

# 6. 健康检查
if curl -fsS --max-time 10 http://localhost:81 > /dev/null 2>&1; then
    echo "✅ 部署成功!"
else
    echo "❌ 部署后健康检查失败,请检查日志"
    exit 1
fi

13.4 定时备份

# 添加到 crontab
# 每天凌晨 3 点备份数据库,保留最近 7 天
0 3 * * * cp /app/shuihu-release/db/custom.db /app/backups/db_$(date +\%Y\%m\%d).db && find /app/backups/ -name "db_*.db" -mtime +7 -delete

附录:部署清单速查

步骤 命令 预计耗时
安装 Bun curl -fsSL https://bun.sh/install | bash 30s
安装 Caddy sudo apt install caddy 20s
安装依赖 bun install 30-60s
初始化数据库 bun run db:push 5s
构建项目 bun run build 60-120s
启动服务 bun .next/standalone/server.js 5s
启动 Caddy caddy run --config Caddyfile 2s
总计(首次部署) 约 3-5 分钟

如有其他部署问题,请检查项目 agent-ctx/ 目录下的开发日志,或参考 .zscripts/ 中的脚本实现细节。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐