前端部署
Admin 后台 (admin.sayclaw.ai)
| 项目 | 值 |
|---|---|
| 框架 | Soybean Admin (Vue 3 + Vite) |
| 仓库 | sayclaw/sayclaw-admin |
| 分支 | main |
| 部署目录 | /var/www/sayclaw-admin/ |
| 域名 | admin.sayclaw.ai |
构建与部署
# 1. 克隆 & 构建(在 Mac mini 或有 Node 的机器)
git clone https://oauth2:[email protected]/sayclaw/sayclaw-admin.git
cd sayclaw-admin
npm install
npm run build
# 2. 上传到服务器
tar czf dist.tar.gz -C dist .
scp -i ~/.ssh/id_ed25519_openclaw dist.tar.gz [email protected]:/tmp/
# 3. 在服务器上部署
ssh [email protected]
cd /var/www/sayclaw-admin
rm -rf assets *.js *.css *.html
tar xzf /tmp/dist.tar.gz
chown -R www-data:www-data /var/www/sayclaw-admin
chmod -R 755 /var/www/sayclaw-admin
必做:重建 auth-callback.html
每次重新部署 Admin 前端后,必须手动重建 auth-callback.html,因为它不在 Vite 构建产物中:
cat > /var/www/sayclaw-admin/auth-callback.html << 'EOF'
<!DOCTYPE html>
<html>
<head><title>Auth Callback</title></head>
<body>
<script>
const params = new URLSearchParams(window.location.search);
const token = params.get('token');
if (token) {
localStorage.setItem('SC_token', JSON.stringify(token));
// roles 固定为 R_SUPER
localStorage.setItem('SC_userInfo', JSON.stringify({roles:['R_SUPER']}));
window.location.href = '/';
} else {
document.body.innerText = 'Auth failed: no token';
}
</script>
</body>
</html>
EOF
chown www-data:www-data /var/www/sayclaw-admin/auth-callback.html
关键环境变量 (.env.prod)
VITE_SERVICE_BASE_URL=https://api.sayclaw.ai
VITE_ROUTE_HOME=web_dashboard
VITE_OTHER_SERVICE_BASE_URL={}
Portal 前端 (app.sayclaw.ai / m.sayclaw.ai)
| 项目 | 值 |
|---|---|
| 框架 | Vue 3 CDN SPA(单 HTML 文件) |
| 仓库 | sayclaw/sayclaw-app |
| 分支 | main |
| 部署目录 | /var/www/sayclaw-app/ |
| 域名 | app.sayclaw.ai (PC) / m.sayclaw.ai (移动) |
目录结构
/var/www/sayclaw-app/
├── index.html # 首页(重定向到 portal)
├── portal/
│ ├── index.html # Portal 主入口
│ ├── login/index.html # 登录页
│ ├── dashboard/index.html # 工作台(我的实例)
│ ├── chat/index.html # WebChat 对话页
│ ├── usage/index.html # 使用记录
│ ├── marketplace/index.html # 应用市场
│ └── settings/index.html # 个人设置
└── auth/
└── callback/index.html # Google OAuth 回调
部署
Portal 前端是纯静态 HTML(Vue 3 CDN 模式),直接上传即可:
# 从 Git 拉取最新
cd /opt/sayclaw-repo
git pull
# 复制到 web 目录
rsync -av --delete portal/ /var/www/sayclaw-app/portal/
chown -R www-data:www-data /var/www/sayclaw-app
chmod -R 755 /var/www/sayclaw-app
API 配置
Portal 前端通过 JS 变量配置 API 地址:
const API_BASE = 'https://portal-api.sayclaw.ai/api/v1'
设计预览中心 (design.sayclaw.ai)
| 项目 | 值 |
|---|---|
| 仓库 | sayclaw/sayclaw-design |
| 部署目录 | /var/www/sayclaw-design/ |
| 域名 | design.sayclaw.ai |
设计预览中心是所有页面的原型/预览集合,包含左侧导航。部署方式同 Portal。
文档站 (doc.sayclaw.ai)
| 项目 | 值 |
|---|---|
| 框架 | Docusaurus 3 |
| 仓库 | sayclaw/sayclaw-docs |
| 分支 | main |
| 源码目录 | /opt/sayclaw-docs/ |
| 部署目录 | /var/www/sayclaw-docs/build/ |
| 域名 | doc.sayclaw.ai |
构建与部署
服务器 OOM
小龙服务器内存有限,直接在服务器 npm run build 会 OOM。建议在 Mac mini 本地构建后 rsync。
# 方式 A:Mac mini 本地构建 + rsync(推荐)
cd ~/sayclaw-docs
npm install
npm run build
rsync -avz --delete build/ [email protected]:/var/www/sayclaw-docs/build/
# 方式 B:服务器直接构建(可能 OOM)
cd /opt/sayclaw-docs
npm install
NODE_OPTIONS='--max-old-space-size=512' npm run build
cp -r build/* /var/www/sayclaw-docs/build/
部署后修复权限:
chown -R www-data:www-data /var/www/sayclaw-docs/build
chmod -R 755 /var/www/sayclaw-docs/build
修改侧边栏
编辑 /opt/sayclaw-docs/sidebars.ts,新增文档条目后重新构建。