Skip to content

部署说明

本文档指导您从零开始部署 Think Site Manager 平台。


环境要求

软件最低版本用途
JDK17后端运行环境
Node.js18.x+前端构建环境
MySQL8.0+数据库
Maven3.6+后端构建
pnpm8.x+前端包管理器
Nginx1.20+反向代理 (可选)
SSH 客户端内置 (MINA SSHD)主机管理一键部署

推荐

建议使用 Linux 服务器部署(CentOS 7+ / Ubuntu 20.04+),以下以 CentOS 为例。


第一步:数据库初始化

1.1 创建数据库

sql
CREATE DATABASE IF NOT EXISTS think_site_management
  DEFAULT CHARACTER SET utf8mb4
  DEFAULT COLLATE utf8mb4_general_ci;

1.2 导入表结构

项目 database/ 目录下包含完整的数据库 dump 文件:

bash
mysql -u root -p think_site_management < database/dump-think_site_management-*.sql

1.3 配置数据库连接

编辑 backend/admin/src/main/resources/application.yml

yaml
spring:
  datasource:
    url: jdbc:mysql://<您的数据库IP>:3306/think_site_management?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: <数据库用户名>
    password: <数据库密码>

第二步:后端部署

2.1 编译打包

bash
cd backend
mvn clean package -DskipTests

编译成功后,可执行 JAR 位于:

backend/admin/target/admin-0.0.1-SNAPSHOT.jar

2.2 启动服务

启动前 必须 配置主机凭据加密主密钥(详见下方"主机凭据加密密钥"章节)。

bash
# 默认端口 8300,context-path=/api
java -jar admin/target/admin-0.0.1-SNAPSHOT.jar

2.3 后台运行(推荐)

bash
nohup java -jar admin/target/admin-0.0.1-SNAPSHOT.jar > app.log 2>&1 &

2.4 验证启动

bash
# 检查进程
ps aux | grep admin

# 检查日志
tail -f app.log

# 测试接口
curl http://localhost:8300/api/license/status

首次启动

首次启动时 License 处于未激活状态,所有接口会被 LicenseFilter 拦截。需要先完成 License 激活


第三步:前端部署

3.1 安装依赖

bash
cd frontend
pnpm install

3.2 配置 API 代理

编辑 frontend/.umirc.ts,将代理目标指向后端地址:

typescript
proxy: {
  '/api': {
    target: 'http://<后端服务器IP>:8300',
    changeOrigin: true,
  },
},

3.3 构建生产版本

bash
pnpm build

构建产物位于 frontend/dist/ 目录。

3.4 Nginx 部署

dist/ 目录内容拷贝到 Nginx 静态目录,并配置反向代理:

bash
cp -r frontend/dist/* /usr/share/nginx/html/

Nginx 配置示例:

nginx
server {
    listen       80;
    server_name  your-domain.com;

    # 前端静态资源
    location / {
        root   /usr/share/nginx/html;
        index  index.html;
        try_files $uri $uri/ /index.html;
    }

    # API 反向代理到后端
    location /api/ {
        proxy_pass http://127.0.0.1:8300;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

SPA 路由注意

try_files $uri $uri/ /index.html 是必需的,确保前端 SPA 路由刷新后不会 404。

3.5 重载 Nginx

bash
nginx -t           # 检查配置
nginx -s reload    # 重载生效

第四步:License 生成工具

平台包含一个独立的 License 生成 CLI 工具。

4.1 编译 License 工具

bash
cd backend
mvn clean package -pl license-gen -DskipTests

4.2 生成 License 文件

bash
java -jar license-gen/target/license-gen-0.0.1-SNAPSHOT.jar \
  --expire 2027-12-31 \
  --output license.lic

参数说明:

参数说明
--expire过期日期 (yyyy-MM-dd)
--mac绑定 MAC 地址(可选)
--ip绑定 IP 地址(可选)
--output输出文件路径

第五步:主机凭据加密密钥 (THINK_HOST_CRYPTO_KEY)

如果需要使用「主机管理 / 站点发布」功能,必须 配置 32 字节 hex 主密钥,用于 SSH 密码 / 私钥 / passphrase 的 AES-256-GCM 加密。

5.1 生成密钥

bash
# 生成 32 字节 (64 hex 字符) 强随机密钥
openssl rand -hex 32
# 输出示例:9f3a1b8c4d2e7f6a5b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a

密钥安全

  • 密钥一旦丢失,所有已加密的主机凭据全部无法解密 —— 需要重新录入主机
  • 请将密钥保存到 K8s Secret / Vault / 安全密码管理器
  • 切勿提交到 Git 仓库

5.2 配置环境变量

Linux / macOS:

bash
# ~/.bashrc 或 /etc/profile
export THINK_HOST_CRYPTO_KEY=9f3a1b8c4d2e7f6a5b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a

Windows PowerShell:

powershell
[System.Environment]::SetEnvironmentVariable(
  'THINK_HOST_CRYPTO_KEY',
  '9f3a1b8c4d2e7f6a5b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a',
  'User'
)

Docker:

bash
docker run -d \
  -e THINK_HOST_CRYPTO_KEY=9f3a1b8c4d2e7f6a5b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a \
  -p 8300:8300 \
  --name think-site-manager \
  think-site-manager:latest

Kubernetes Secret:

yaml
apiVersion: v1
kind: Secret
metadata:
  name: think-site-manager-secret
type: Opaque
stringData:
  THINK_HOST_CRYPTO_KEY: "9f3a1b8c4d2e7f6a5b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a"

5.3 启动校验

AdminApplication 启动时会读取 THINK_HOST_CRYPTO_KEY:

  • 未设置 / 长度不是 64 hex 字符fail-fast 退出,日志提示 THINK_HOST_CRYPTO_KEY missing or invalid (need 32-byte hex)
  • 校验通过 → 后续 SSH 凭据加解密正常工作

5.4 密文格式

存储在 host 表的密码 / 私钥密文格式:

base64(IV 12B || ciphertext || GCM tag 16B)
  • IV 12 字节随机,每条记录独立
  • GCM tag 16 字节,提供认证加密防篡改
  • 整体 base64 编码后存 cipher_text 字段

详见 主机管理 / 凭据加密

5.5 密钥轮换 (可选)

如需更换密钥:

  1. 准备新密钥 NEW_KEY 和旧密钥 OLD_KEY
  2. 启动时同时设置两个环境变量:导出 THINK_HOST_CRYPTO_KEY=NEW_KEY + THINK_HOST_CRYPTO_KEY_OLD=OLD_KEY
  3. 平台读到新密钥写密文,但读旧密文时先用 OLD_KEY 解密、NEW_KEY 重加密、写回 db
  4. 全部迁移完成后,移除 THINK_HOST_CRYPTO_KEY_OLD 环境变量

第六步:License 激活

5.1 访问激活页面

部署完成后,访问 http://your-domain.com/activate 进入 License 激活页面。

5.2 上传 License 文件

  1. 点击上传区域,选择生成的 .lic 文件
  2. 点击「激活」按钮
  3. 激活成功后自动跳转到登录页

5.3 API 方式激活

bash
curl -X POST http://localhost:8300/api/license/activate \
  -F "file=@license.lic"

第七步:创建初始账号

6.1 生成邀请码

由于平台注册需要邀请码,您需要先在数据库中手动插入一个邀请码,或通过 API 创建一个管理员账号。

6.2 直接创建管理员(数据库方式)

sql
-- 插入 SYSTEM 管理员(密码需要 BCrypt 加密)
-- 示例密码: admin123
INSERT INTO user (un_code, account, username, password, role, status_flag, create_by, create_time, update_by, update_time, del_flag)
VALUES (
  UUID(),
  'admin',
  '系统管理员',
  '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EHsM8lE9l',
  'system',
  'ENABLED',
  'SYSTEM',
  NOW(),
  'SYSTEM',
  NOW(),
  0
);

安全提示

请务必在生产环境修改默认密码!BCrypt 密码可通过在线工具或 spring-boot-starter-security 生成。


完整部署架构图

                    ┌──────────────┐
                    │   Nginx:80   │
                    └──────┬───────┘

              ┌────────────┼────────────┐
              │            │            │
              ▼            ▼            ▼
        ┌──────────┐ ┌──────────┐ ┌──────────┐
        │ 前端静态  │ │ /api/*   │ │ 文档站点  │
        │ dist/    │ │ 反向代理  │ │ (可选)   │
        └──────────┘ └────┬─────┘ └──────────┘


                 ┌─────────────────┐
                 │ Spring Boot     │
                 │ Port 8300       │
                 └────────┬────────┘


                 ┌─────────────────┐
                 │ MySQL 8.x       │
                 │ Port 3306       │
                 └─────────────────┘

常见问题排查

启动报错 "LICENSE_INVALID"

License 未激活或已过期,访问 /activate 页面上传有效的 .lic 文件。

数据库连接失败

检查 MySQL 是否启动、端口是否正确、用户名密码是否正确、网络是否可达。

前端页面 404

检查 Nginx 配置中是否包含 try_files $uri $uri/ /index.html

登录后一直跳转

确认后端 /api/user/login 返回的 Token 格式为 Bearer xxx,且前端 app.tsx 中的请求拦截器正确携带了 Token。


部署完成

完成以上所有步骤后,您就可以正常使用 Think Site Manager 了。如需了解更多功能,请阅读 功能介绍

基于 VitePress 构建