6.5 KiB
通过 Gitea Actions 部署官网
推送到网站仓库的 main 后,Gitea 把任务交给 Ubuntu 部署机上的专用 Runner。Runner 检出该次提交,使用锁文件安装前端依赖,执行前端构建、go test ./... 和启用 CGO 的 Go 编译。每次发布生成独立目录,原子切换 current,重启 systemd 服务并检查首页和 /api/health。检查失败时自动切回上一发布,并将本次任务标记为失败。
1. 准备 Ubuntu 部署机
安装 Bash、Git、curl、sudo、build-essential、util-linux、Go 1.25.6 或更新版本、Node.js 22.13 或更新版本。确认 Runner 的服务环境中能找到 git、node、npm、go 和 gcc,并能访问 Gitea、GitHub 上固定版本的 checkout Action、npm registry 和 Go 模块代理。
网站继续使用现有的 autolibrary 账号。首次接入时创建专用部署账号和发布目录。已有部署账号时复用,并确认组和权限与示例相符。
sudo useradd --system --user-group --create-home --home-dir /var/lib/autolibrary-runner autolibrary-deploy
sudo chmod 0700 /var/lib/autolibrary-runner
sudo install -d -o root -g autolibrary-deploy -m 1775 /opt/autolibrary
sudo install -d -o autolibrary-deploy -g autolibrary-deploy -m 0755 /opt/autolibrary/releases
sudo install -d -o root -g autolibrary -m 0751 /opt/autolibrary/shared
sudo ln -s /home/autolibrary/logs /opt/autolibrary/shared/logs
现网的基础 unit 为 autolibrary-webserver.service,运行账号为 autolibrary,原程序和配置位于 /home/autolibrary。按 Ubuntu 部署说明 备份后,将原配置复制到 /opt/autolibrary/shared/config.json,设为 root:autolibrary、权限 0640。调整副本中的路径:
- 将三个 SQLite 数据库和主题文件目录的路径改为现有
/home/autolibrary/backend/data/下的绝对路径,继续使用原数据。运行用户需要对数据库所在目录和主题文件目录有写权限。 - 将
frontend.static.path改为./frontend/dist,让程序从本次发布目录读取资源。沿用前端3003、后端8080及现有监听地址。 - 保留现有 API Key 和
backend.casdoor配置。网站通过http://127.0.0.1:8000使用 Casdoor 处理账户和认证。现网的autolibrary-casdoor.service独立运行,发布任务只重启autolibrary-webserver.service。
首次接入时,以部署账号创建指向原站的链接,作为首次发布失败时的回退目标。已有 current 时,确认链接指向可用的上一版并由部署账号拥有。
sudo -u autolibrary-deploy ln -s /home/autolibrary /opt/autolibrary/current
2. 安装网站服务和 Runner
在现有网站 unit 上安装 drop-in,只调整工作目录和启动命令。原 unit 继续提供运行账号、重启策略和 /home/autolibrary/logs/errors.log 的 stderr 设置。新服务器可先按 Ubuntu 部署说明 安装基础 unit。已有站点执行 daemon-reload 后,覆盖配置会在下一次网站服务启动时生效。
sudo install -d -m 0755 /etc/systemd/system/autolibrary-webserver.service.d
sudo install -m 0644 deploy/systemd/10-gitea-release.conf /etc/systemd/system/autolibrary-webserver.service.d/10-gitea-release.conf
sudo systemctl daemon-reload
sudo visudo -f /etc/sudoers.d/autolibrary-deploy
加入以下精确授权,使 Runner 可以操作网站 unit。
autolibrary-deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart autolibrary-webserver.service, /usr/bin/systemctl stop autolibrary-webserver.service
在 Gitea 创建一个空的网站源码仓库,启用仓库的 Actions 功能并保护 main。使用该网站仓库的 Runner 注册令牌,在部署机安装 Gitea Runner,然后以部署账号交互注册:
sudo -u autolibrary-deploy -H sh -c 'cd "$HOME" && gitea-runner register'
输入实例地址和仓库级令牌,标签只填写 autolibrary-production:host。以同一账号和工作目录运行 gitea-runner daemon。可用下面的 systemd unit 持久运行,将 ExecStart 与 PATH 调整到实际安装位置。
[Unit]
Description=AutoLibrary Gitea Runner
Wants=network-online.target
After=network-online.target
[Service]
User=autolibrary-deploy
WorkingDirectory=/var/lib/autolibrary-runner
Environment=PATH=/usr/local/go/bin:/usr/local/bin:/usr/bin:/bin
ExecStart=/usr/local/bin/gitea-runner daemon
Restart=on-failure
[Install]
WantedBy=multi-user.target
例如保存为 /etc/systemd/system/autolibrary-runner.service 后,执行 sudo systemctl daemon-reload 和 sudo systemctl enable --now autolibrary-runner.service。旧版 Runner 的二进制名可能为 act_runner,按实际名称替换。确认仓库设置页中 Runner 在线,并且标签与工作流的 runs-on 一致。宿主机任务使用部署账号的权限直接运行,只将这个 Runner 分配给受信任的网站仓库。
3. 首次推送
在 Gitea 仓库的 Actions Variables 中将 AUTOLIBRARY_PORT 设为生产 frontend.port;省略时为 3003,若沿用通用示例配置则设置为 3000。
在本地网站源码目录绑定新建仓库的克隆地址并推送:
git remote add origin <Gitea 网站源码仓库的克隆地址>
git push -u origin main
在 Gitea 的 Actions 页确认部署任务完成。之后日常发布只需推送 main。发布脚本在切换前读取远端 main,已过时的任务会跳过部署。生产密钥、数据库、上传目录和 Casdoor 实例数据由部署机保存。
排查和回滚
- 任务排队时,检查仓库 Actions 设置、Runner 在线状态和标签。
- 重启或健康检查失败时,检查 Actions 日志、
sudo journalctl -u autolibrary-webserver.service -n 100和/home/autolibrary/logs/errors.log。检查端口、共享配置、数据路径和权限。 - 网站发布检查覆盖首页和网站后端。排查账户或登录时,分别查看
systemctl status autolibrary-casdoor.service和curl -fsS http://127.0.0.1:8000/.well-known/openid-configuration。 - 发生业务回归时,用
git revert后推送main重新构建上一份可用代码。紧急切回已有目录时,先确保 Runner 没有在部署,再按 Ubuntu 部署说明 切换current。清理历史发布目录前确认其未被current使用,并至少保留一个可用的上一版。 - 自动回滚切换的是程序和静态文件。涉及数据库结构变化时,上线前备份共享数据,并确认旧版本兼容变更后的结构。