自部署
用 Docker Compose 运行自己的实例。按运行的位置选择对应的部署方式。
一个容器在 8000 端口同时提供 API 和网页应用,全部数据都在一个 Docker 卷里。你需要装有 Compose 插件的 Docker,以及约 4 GB 内存(小镜像约 1 GB)。
仓库和镜像都是公开的,不需要登录任何账号。每种部署方式都从这里开始:
git clone https://github.com/jinyuanZhou-Leo/Semestra-Next.git
cd Semestra-Next/deploy/selfhost
cp .env.example .env选择部署方式
| 运行在哪里 | 用户打开的地址 | 指南 |
|---|---|---|
| 你自己的电脑,或家里局域网中的一台机器 | http://localhost:8000 或 http://<IP>:8000 | 本机或局域网 |
| 有域名的服务器,由内置的 Caddy 提供 HTTPS | https://semestra.example.com | 有域名的服务器 |
| 服务器上已经有 nginx、Traefik 等反向代理 | https://semestra.example.com | 放在已有的反向代理后面 |
之后,无论哪种方式:
- 邮件:把验证码发到邮箱,而不是打印在日志里。
- 升级与备份:首先保管好
/data/secrets.env。 - 镜像:默认镜像或小镜像、固定版本、自己构建。
- 可选功能:Canvas 学校账号登录、全实例 AI 服务商。
- 全部设置
排错
| 现象 | 检查 |
|---|---|
| 容器反复重启 | docker compose logs semestra |
| 登录后又回到登录页 | SEMESTRA_PUBLIC_URL 以 https:// 开头,但你打开的是 http:// 地址。请打开 https 地址 |
| 收不到验证码 | 没有配置邮件时,验证码在 docker compose logs semestra 里 |
| “SEMESTRA_SECRET_KEY and SEMESTRA_ENCRYPTION_KEY must be set in prod” | compose 文件里的 SEMESTRA_AUTO_SECRETS 被删掉了,且没有设置密钥 |
| “SEMESTRA_ENCRYPTION_KEY is not a Fernet key” | .env 里的 SEMESTRA_ENCRYPTION_KEY 不是 Fernet.generate_key() 生成的密钥(44 个字符,以 = 结尾)。删掉它改用自动生成的密钥,或换回你备份的那个 |
| 绑定挂载的目录报权限错误 | sudo chown -R 10001:10001 <目录>:容器以 uid 10001 运行 |
进程运行时 /healthz 就有响应,数据库和后台任务就绪后 /readyz 才返回成功(否则返回 503)。镜像自带 Docker HEALTHCHECK。