mirror of
https://github.com/KingHWJ/WeReadBoard.git
synced 2026-11-03 18:24:58 +08:00
75 lines
3.3 KiB
Markdown
75 lines
3.3 KiB
Markdown
# master 自动部署
|
||
|
||
GitHub Actions workflow 位于 `.github/workflows/deploy.yml`。每次 `master` 分支 push 后,Actions 会通过 SSH 登录服务器,在部署目录执行根目录 `deploy.sh`,拉取最新 `master`、安装依赖、执行全部数据库迁移并重启服务。手动触发时也固定部署 `master`,不能选择其他分支发布。
|
||
|
||
## GitHub 配置
|
||
|
||
已配置的仓库 Secrets:
|
||
|
||
- `SERVER_HOST`
|
||
- `SERVER_PORT`
|
||
- `SERVER_SSH_KEY`
|
||
- `SERVER_USER`
|
||
|
||
可选再配置两个仓库 Variables:
|
||
|
||
- `DEPLOY_PATH`:服务器上的项目目录,例如 `/opt/WeReadBoard`
|
||
- `SERVICE_NAME`:systemd 服务名,例如 `weread.service`
|
||
|
||
未配置 Variables 时,workflow 默认使用 `/opt/weread-board/WeReadBoard` 和 `weread.service`。
|
||
|
||
## 服务器要求
|
||
|
||
服务器部署目录需要已经是本仓库的 Git checkout,并且能访问 `origin/master`。运行服务的环境变量仍按现有应用配置,例如 `WEREAD_API_KEY`、`WEREAD_DB_HOST`、`WEREAD_DB_PORT`、`WEREAD_DB_USER`、`WEREAD_DB_PASSWORD` 和 `WEREAD_DB_NAME`。
|
||
|
||
如果这些变量放在项目目录的 `.env` 文件中,部署脚本会先加载 `.env`,再执行数据库迁移。SSH 用户需要能执行 `systemctl restart <服务名>`;非 root 用户需要配置免密 `sudo systemctl restart/status <服务名>`。
|
||
|
||
`deploy.sh` 会执行:
|
||
|
||
```bash
|
||
git fetch origin
|
||
git checkout master
|
||
git pull --ff-only origin master
|
||
python3 -m venv .venv # 仅 .venv 不存在时执行
|
||
.venv/bin/python -m pip install -r requirements.txt
|
||
# 读取 reading_api.MYSQL_CONFIG 后按顺序执行 migrations/*.sql
|
||
sudo systemctl restart "$SERVICE_NAME"
|
||
```
|
||
|
||
其中迁移实际通过 `reading_api.MYSQL_CONFIG` 读取数据库配置并执行 SQL 文件;SQL 使用 `CREATE TABLE IF NOT EXISTS`,可重复执行。
|
||
|
||
脚本默认部署 `master`,显式传入其他 `DEPLOY_BRANCH` 时会在拉取代码、安装依赖和重启服务之前退出。
|
||
|
||
## systemd 示例
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=WeReadBoard
|
||
After=network.target
|
||
|
||
[Service]
|
||
WorkingDirectory=/opt/weread-board/WeReadBoard
|
||
Environment=WEREAD_API_KEY=wrk-xxxxxxxx
|
||
Environment=WEREAD_DB_HOST=127.0.0.1
|
||
Environment=WEREAD_DB_PORT=3306
|
||
Environment=WEREAD_DB_USER=weread
|
||
Environment=WEREAD_DB_PASSWORD=change-me
|
||
Environment=WEREAD_DB_NAME=weread
|
||
Environment=PORT=8770
|
||
Environment=WEREAD_SESSION_SECRET=<服务器生成的随机密钥>
|
||
Environment=WEREAD_AUTH_SETUP_TOKEN=<仅首次初始化使用的随机口令>
|
||
Environment=WEREAD_SESSION_COOKIE_SECURE=1
|
||
ExecStart=/opt/weread-board/WeReadBoard/.venv/bin/python app.py
|
||
Restart=always
|
||
RestartSec=3
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
如果服务名或部署目录不同,在仓库 Variables 中调整 `SERVICE_NAME` 和 `DEPLOY_PATH`。
|
||
|
||
登录认证还需配置 `WEREAD_SESSION_SECRET` 和首次使用的 `WEREAD_AUTH_SETUP_TOKEN`。在服务器分别运行两次 `python3 -c 'import secrets; print(secrets.token_urlsafe(48))'` 生成不同的值。迁移自动创建 `weread_auth` 表;首次访问 `/login` 时输入初始化口令、管理员账号和至少 12 位密码。初始化成功后,从 systemd 配置中删除 `WEREAD_AUTH_SETUP_TOKEN` 并重启服务。数据库中的密码只保存哈希。
|
||
|
||
`WEREAD_SESSION_COOKIE_SECURE=1` 要求浏览器通过 HTTPS 访问。仅本机 HTTP 验收可临时设为 `0`,不要在公网 HTTP 下传输登录密码。
|