3
部署指南
biss edited this page 2026-10-02 13:51:12 +08:00
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.

部署指南

本地开发

开发环境固定使用 SQLite,首次运行会创建 src/Jiaowu.Api/data/jiaowu-dev.sqlite,只初始化系统角色和课程分类,不自动写入演示组织、人员、课程、业务记录或测试账号。

$env:SeedAdmin__UserName = 'admin'
$env:SeedAdmin__Password = '请替换为本机开发密码'
$env:SeedAdmin__DisplayName = '系统管理员'
dotnet run --project src/Jiaowu.Api

另开终端运行前端:

Set-Location web
npm install
npm run dev

访问 http://localhost:5173。首次管理员创建成功后,立即清除三个 SeedAdmin__* 环境变量。若不需要前端热更新,可先执行 npm --prefix web run build,再启动 API,访问 http://localhost:5255。

构建与发布

生产构建使用:

dotnet publish src/Jiaowu.Api -c Release -o .artifacts/publish

发布时会自动执行前端依赖安装和构建,并把静态文件写入发布目录 wwwroot。特殊 CI 流水线需要跳过此步骤时可传递 -p:BuildFrontendOnPublish=false。构建发布包不需要生产连接串、JWT 密钥或真实密码,且不应把这些秘密写入包中。

生产配置

将发布目录中的 .env.example 复制为 .env 并填入真实配置。程序读取可执行文件所在目录的 .env;也可用 JIAOWU_ENV_FILE 指定位置。真实进程环境变量优先级高于 .env。

核心配置包括:

配置组 用途
Database__*、ConnectionStrings__MySql MySQL 8.4 连接、超时和迁移行为。
Jwt__* 签发者、受众、至少 32 随机字节的密钥及会话时长。
AllowedHosts、Cors__Origins__* 公开域名和跨域来源白名单。
ConnectionStrings__Redis 多实例缓存和共享短期状态,可选。
RabbitMq__*、BackgroundJobs__* 多实例后台任务消息传输与并发。
OfficialDocuments__* 凭证机构信息和最终 HTTPS 公网根地址。
Sso__* 可选 Keycloak 单点登录。
Operations__* 备份目录、MySQL 客户端路径和运维工具超时。
Plugins__* 签名插件存储目录、包大小上限和受信任发布者公钥。

生产非 Development 环境只允许 MySQL。数据库使用 utf8mb4,连接建议启用 TLS 并校验证书。.env 不得提交到仓库、打进发布包或允许非服务账号读取;Linux/macOS 建议 chmod 600 .env,Windows 使用 ACL 限制服务账号和管理员。

签名插件的存储目录必须放在持久化卷,并仅允许服务账号读写;发布者公钥可读但不可由应用进程或普通运维账号随意替换,签名私钥不得部署到服务器。示例配置:

Plugins__StoragePath=/var/lib/jiaowu/plugins
Plugins__MaximumPackageMegabytes=20
Plugins__TrustedPublishers__0__Id=school-it
Plugins__TrustedPublishers__0__PublicKeyPath=/etc/jiaowu/plugin-publishers/school-it-public.pem

数据库迁移与升级

首次部署及每次升级服务端前,先停止旧实例,在目标环境执行:

Jiaowu.Api --migrate-only

确认迁移成功、备份有效和健康检查通过后再启动服务。不要用应用业务账号覆盖未知数据库,也不要把生产库文件复制到开发环境继续使用。仅对专用空演示库使用演示数据命令,并遵循命令的生产确认参数。

systemd(Linux)

仓库提供 deploy/systemd/jiaowu.service 示例。假定发布包位于 /opt/jiaowu,服务账号为无登录权限的 jiaowu。部署前创建服务账号、设置发布目录和备份目录权限,配置 /opt/jiaowu/.env,然后安装服务单元:

sudo install --owner=root --group=root --mode=0644 deploy/systemd/jiaowu.service /etc/systemd/system/jiaowu.service
sudo systemctl daemon-reload
sudo systemctl enable --now jiaowu.service
sudo systemctl status jiaowu.service --no-pager
curl --fail http://127.0.0.1:8080/health/ready

升级流程:停止服务 → 替换发布文件 → 执行 --migrate-only → 启动服务 → 检查日志、健康检查、插件装载、关键页面与后台任务。实时日志:journalctl --unit=jiaowu.service --follow。如插件中心存在待激活或待回滚版本,应在维护窗口重启后确认其状态和插件日志;不要仅凭上传成功判断插件已经运行。

Docker 与反向代理

仓库提供 Dockerfile 和 Compose 示例,可用于连接外部 MySQL 或启动一体化演示环境。容器运行时把 .env / 密钥通过安全的环境变量或密钥管理系统注入,数据卷挂载到持久化存储。反向代理必须正确传递 HTTPS 与主机信息,并使用最终公网 HTTPS 地址配置 CORS、SSO 回调和电子凭证二维码根地址。

上线验收清单

  • MySQL 连接、迁移和备份恢复演练通过。
  • /health/ready 可用,HTTPS 证书和反向代理正确。
  • 管理员可登录,验证码获取/刷新/一次性校验、学生自助激活和普通登录可用。
  • CORS、JWT、SSO 回调与公开域名一致。
  • 排课、选课、成绩、考试、凭证验真等关键链路按角色验证。
  • 体测批次导入/计分/发布、学生本人查询和更正后重新发布按角色验证。
  • 插件存储和公钥权限正确;内置插件停用不丢数据,签名插件暂存/激活/重启装载/回滚链路通过。
  • Redis/RabbitMQ(如启用)连接、后台消费者和失败告警可用。
  • Swagger 默认为关闭,仅在受控窗口按需开放。