Files
ClassHelper/docs/get-started/server.md
T
LoveChengke 19c2aa07b2 feat(docs,scripts,build): 用 docfx 搭文档站并发布到 GitHub Pages,版本号收口成脚本迭代
文档站(`docs/` 就是 docfx 项目,发布在 https://lovechengke.github.io/ClassHelper/):

- 四章 + 常见问题 + 完整参考,共 44 页:快速上手(8 页)/ 应用帮助(10 页)/
  管理运维(6 页)/ 开发文档(11 页)。信息架构照 ClassIsland 文档站来:
  顶栏分章、左侧章节导航、右侧本页目录、上一页 / 下一页、站内搜索、深色主题跟随系统;
- 自定义模板覆盖(`templates/classhelper/`):把 docfx modern 模板那套英文 UI 文案
  (In this article / Improve this doc / Next…)换成中文,补 GitHub 入口与版本徽标,
  并加一层只调排版与配色的 `public/main.css`(不动 DOM 结构);
- 站点顶栏的版本徽标取自根 `package.json`(`docs/build.mjs` 用 `--metadata` 注入),
  不在文档里写第二份 —— 否则一定漂;
- 404 页单独生成:GitHub Pages 的项目页挂在 `/<仓库名>/` 子路径下,而浏览器是按**被请求的路径**
  解析页面里的相对链接的,所以 `<base>` 必须钉到站点根,由 `build.mjs`(本地 `./`)与
  workflow(CI 传 `/<仓库名>/`)分别注入;
- 构建前清空 `_site`:docfx 只覆盖不清理,删掉或改名的页面会以旧文件留在目录里,
  而 Pages 上传的是整个目录。

版本迭代(**每一次 releases,不是每一次提交**):

- 新增 `scripts/version.mjs`。这个仓库里同一个版本号散在 **10 个文件**里(5 份 `package.json`、
  `deploy/package.runtime.json`、两个 compose 的镜像 tag、插件 `manifest.yml`、以及插件 C# 里的
  `PluginVersion` 常量),手工改必然漏一处,而漏掉的那处**不会报错**,只在某个不常走的分支上
  表现为"版本号对不上"。现在收口成两条命令:`pnpm version:check`(逐处比对,不一致 exit 1)
  与 `pnpm version:bump patch|minor|major`(一次改写全部 10 处,任何一处匹配不到或匹配到多处
  就直接失败退出,不做尽力而为的部分改写);
- `AGENTS.md` 新增 §4.4「版本迭代(每一次 releases,不是每一次提交)」:写清版本号落在哪 10 处、
  完整发布命令序列(体检 → 验收 → `dist:all` → 哈希清单 → 推 master → `gh release create` →
  Linux 包由 CI 合并哈希行),以及"已发布的版本号不要复用"的理由。

其它:

- `.github/workflows/docs.yml`:推 master(`docs/**` / `package.json` / workflow 自身有变)即构建并
  部署到 Pages;构建带 `--check`,把 docfx 的警告当错误 —— 最常见的警告是"某个 `.md` 没被任何
  `toc.yml` 引用",那种页面有内容但没有侧边栏,属于必须修掉的疏漏;
- docs 目录重组后的引用同步:`production` / `mysql` / `linux-deploy` / `winisland-design-tokens`
  移到新位置后,AGENTS.md、`deploy/`、`scripts/`、客户端源码注释里的路径引用一并更新;
- 文档站只发布 `docs/` 这一棵树,页面里指向树外的相对链接(`../AGENTS.md` 等)改成 GitHub 绝对 URL,
  否则上线全是 404;
- 图标派生清单补上文档站模板里的 `logo.png` 与 `favicon.png`(`pnpm icons` 一并生成,
  仍然只有一个图形源 `build/classhelper.{png,ico}`);
- `docs/_site` 进 `.gitignore` / `.prettierignore` 与 ESLint ignores;
- 根脚本补 `version:check` / `version:bump` / `docs:build` / `docs:serve` / `docs:check`。
2026-10-06 16:27:44 +08:00

140 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 安装服务端
description: 用 Windows 安装包、Linux 一键脚本、Docker 或源码把班级小助手服务端跑起来。
---
# 安装服务端
服务端是整个系统的中心:它存数据、发实时推送,**并且顺带托管 Web 管理端**(所以老师那一端不用单独装东西)。
四种装法按场景选,任选一种即可:
| 方式 | 适合 | 一句话 |
| --------------------------------- | -------------------------------------- | ------------------------------- |
| [Windows 安装包](#windows-安装包) | 学校机房、教师办公电脑、单机即完整系统 | 双击 exe,装完自动启动 |
| [Linux 一键安装](#linux-一键安装) | 学校已有 Linux 服务器 | 一条命令,带 systemd 与运维命令 |
| [Docker](#docker) | 云服务器、想跟别的服务共用一台机器 | `docker compose up -d` |
| [源码跑](#从源码跑开发模式) | 想改代码、想先看看它长什么样 | `pnpm dev` |
## Windows 安装包
### 生成安装包
安装包不入库(体积大),从 [Releases](https://github.com/LoveChengke/classhelper/releases) 直接下载
`班级小助手服务端-<版本>-x64-setup.exe` 即可。要自己打:
```bash
pnpm dist:server # 首次会执行一次 npm install(约 2 分钟)
pnpm dist:server -- --reuse-deps # 迭代打包:复用已装依赖,跳过 npm install
```
产物:
| 路径 | 说明 |
| --------------------------------------------------------------------- | ------------------------------------------- |
| `releases/server/<版本>/安装包/班级小助手服务端-<版本>-x64-setup.exe` | 安装程序(约 62 MB,NSIS) |
| `releases/server/<版本>/免安装/` | 免安装目录,拷到任意 Windows x64 机器即可跑 |
包内自带 Node 运行时、后端产物、Web 管理端产物、生产依赖、迁移 SQL、随机 `JWT_SECRET` 的 `.env`
与启停脚本。目标机器**不需要预先安装 Node.js**。
### 安装与启动
双击安装程序即可,**不需要管理员权限**(当前用户级安装)。
- 安装目录:`%LOCALAPPDATA%\Programs\ClassHelperServer`
- 静默安装:`"班级小助手服务端-<版本>-x64-setup.exe" /S`
- 开始菜单:启动服务 / 停止服务 / 重启服务 / 打开管理端 / 使用说明 / 卸载
- 自动加入当前用户开机自启
装完服务会自动启动并完成首次初始化:数据库为空则执行随包迁移建表 → 创建管理员账号 →
`http://127.0.0.1:4000/` 就是 Web 管理端。
常用脚本(都在安装目录里):
```cmd
start.cmd :: 启动并等待就绪(已在运行则直接返回)
stop.cmd :: 按 PID 精确停止
restart.cmd :: 重启
status.cmd :: 查看状态与 HTTP 探针结果
```
机房主机这种无人值守的机器,建议以**管理员身份**跑一次 `install-service.cmd`,
把服务注册成开机启动的计划任务(比注册表 Run 更稳):
```cmd
install-service.cmd :: schtasks /Create /SC ONSTART /RL HIGHEST
uninstall-service.cmd :: 删除计划任务
```
安装目录结构与配置见[生产部署指南](../management/production.md);
安装程序里的默认管理员口令**第一次登录后必须改掉**。
## Linux 一键安装
从 Release 下载 `classhelper-server-linux-x64-<版本>.tar.gz`(以及旁边的 `.sha256`),连同
`install.sh` 一起拷到服务器:
```bash
scp releases/server/<版本>/linux-x64/classhelper-server-linux-x64-*.tar.gz \
install.sh verify-linux.sh root@<主机>:/tmp/
ssh root@<主机> 'bash /tmp/install.sh --check' # 先体检,不改任何东西
ssh root@<主机> "printf '%s\n' '<管理员密码>' | bash /tmp/install.sh --yes --admin-password-stdin \
--package /tmp/classhelper-server-linux-x64-*.tar.gz"
```
安装器会装好内置 Node、把程序放到 `/opt/classhelper`、写好 systemd 单元、
把 `classhelper` 运维命令软链到 `/usr/local/bin/`。之后:
```bash
classhelper status # 服务状态
classhelper doctor # 一整套自检(配置软链、权限、依赖完整性…)
classhelper backup # 立即备份
classhelper upgrade # 升级到最新 Release(自动校验 sha256)
```
完整的目录布局、配置项、升级回滚、反向代理与故障排查见 [Linux 部署与运维](../management/linux-deploy.md)。
## Docker
```bash
cd deploy
cp .env.example .env # 至少改 JWT_SECRET
docker compose up -d # 默认 SQLite 单容器,数据卷挂在本机
```
要 MySQL 就用 `docker-compose.yml`(带一个 MySQL 服务),只想要单容器 SQLite 用
`docker-compose.sqlite.yml`。细节见[生产部署指南](../management/production.md)。
## 从源码跑(开发模式)
想改代码或只想先看看,用这条路。需要 **Node ≥ 20.19** 与 **pnpm 11**。
```bash
pnpm install
cp packages/server/.env.example packages/server/.env # 至少改 JWT_SECRET
pnpm db:generate
pnpm --filter @classhelper/server db:deploy # 应用数据库迁移
pnpm build:shared # 必须先构建 shared,否则后面会 ERR_MODULE_NOT_FOUND
pnpm db:seed # 写演示数据(会清空业务表)
pnpm dev # 后端 4000 + Web 端 5173 一起起
```
演示账号见 [README 的「默认账号与种子数据」](https://github.com/LoveChengke/classhelper#readme);
**演示口令只用于本地开发,别带到真实环境**。
| 端口 | 用途 |
| ---- | -------------------------------------------------------- |
| 4000 | 后端 REST + Socket.IO + (构建后)Web 管理端静态托管 |
| 5173 | Web 管理端开发服务器(`/api`、`/socket.io` 代理到 4000) |
| 5174 | 桌面客户端渲染进程开发服务器 |
> 改动 `packages/shared` 之后必须 `pnpm build:shared`(或让它跑着 watch)——
> 三端都从它的 `dist` 导入。
## 装完之后
打开 `http://<服务器地址>:4000/`,用管理员账号登录。下一页:
[认识 Web 管理端](web-admin.md)。