# AutoLibrary Ubuntu 部署与迁移 日常发布可交给 [Gitea 自动部署](gitea-deployment.md)。本页用于首次迁移、数据备份与人工恢复。 ## 部署组成 - Go 服务器:`webserver frontend`、`webserver backend`,或 `webserver start` 同时运行。 - 前端构建:Vue 应用的 `frontend/dist`,部署后无需 Node 服务。 - 运行数据:现有的三个 SQLite 数据库、主题文件目录、Casdoor 数据与配置。 - 入口:Nginx 继续反向代理 Go 前端;Go 将 `/api/*` 去掉 `/api` 前缀后代理到后端。 保留当前实际端口和域名。仓库内 Nginx 示例使用前端 3003、后端 8080,通用配置示例使用前端 3000。以部署机 `config.json` 为准。 ## 1. 准备新版本 开发或构建机器需要 Go 1.25.6+ 和 Node.js 22.13+。推荐使用 Node 当前 LTS。 ```sh npm --prefix frontend ci npm --prefix frontend run build go test ./... go build -o webserver . ``` SQLite 驱动使用 CGO;建议在 Ubuntu 上安装 `build-essential` 并在目标平台构建 Go 可执行文件,不要把 Windows 可执行文件直接部署到 Linux。 为每次发布准备单独目录,例如 `/opt/autolibrary/releases/20261016`。目录应包含: ```text webserver frontend/dist/ backend/templates/ config.json # 部署机自己的配置,不用示例覆盖 ``` 保留 `frontend/dist` 中的完整资源目录,包括字体、截图与品牌图标。 ## 2. 备份运行数据 停止旧 AutoLibrary 服务,保证 SQLite 备份与主题文件一致,再备份: - 原部署程序和前端资源。 - `config.json`。 - `versions.db`、`bulletins.db`、`themes.db`,以及存在的 `-wal`、`-shm` 文件。 - 整个 `themes_files` 目录。 - Casdoor 数据库、证书和配置。 本次不重置数据库或 Casdoor。使用部署机既有账户;不要重新导入初始化数据覆盖账户。 ## 3. 配置路径 推荐将持久数据放在 `/opt/autolibrary/shared/`,在 `config.json` 中使用绝对路径。例如: ```json { "backend": { "host": "127.0.0.1", "port": "8080", "database": { "versions": { "path": "/opt/autolibrary/shared/versions.db" }, "bulletins": { "path": "/opt/autolibrary/shared/bulletins.db" }, "themes": { "path": "/opt/autolibrary/shared/themes.db" }, "themes_files": { "path": "/opt/autolibrary/shared/themes_files" } } }, "frontend": { "host": "127.0.0.1", "port": "3003", "static": { "path": "./frontend/dist" } } } ``` 以上仅展示需调整的字段;合并至实际完整配置,保留原 API Key、Casdoor client ID、secret 和证书。完整无密钥模板见根目录 `config.example.json`。 旧配置若仍指向 `frontend/public`,服务器在其同级找到 `dist/index.html` 时会使用新构建;仍建议显式改为 `frontend/dist`。 启动会为版本表添加 `gitea_*_url` 和 `release_notes_url` 列,不删除旧字段。历史 GitHub 下载地址不会被盲目改写。通过原版本管理 API 填入真实 Gitea 下载地址;未填写时,新官网引导访问 Gitea 发行页,云盘仍按原数据提供。 ## 4. systemd 将 `/opt/autolibrary/current` 指向当前发布目录,并配置: ```ini [Unit] Description=AutoLibrary Website After=network.target [Service] Type=simple WorkingDirectory=/opt/autolibrary/current ExecStart=/opt/autolibrary/current/webserver start --config /opt/autolibrary/shared/config.json Restart=on-failure RestartSec=5 TimeoutStopSec=20 [Install] WantedBy=multi-user.target ``` Go 服务收到 SIGTERM 后先等待请求结束,再关闭数据库。Casdoor 继续使用原独立服务运行;若配置了服务依赖,沿用现有的 Casdoor unit 名称。 Nginx 通常无需更改。检查 `proxy_pass` 指向的端口与当前配置一致。`/changelog` 的永久跳转和页面路由由 Go 处理;不要增加将所有未知资源重写到首页的规则。 ## 5. 上线验证 ```sh curl -I http://127.0.0.1:3003/ curl -I http://127.0.0.1:3003/marketplace/profile curl -I http://127.0.0.1:3003/changelog curl -i http://127.0.0.1:3003/not-a-real-page curl http://127.0.0.1:3003/api/download/latest curl http://127.0.0.1:8080/health ``` 应分别得到页面成功、深层页面成功、301 跳转 `/downloads`、404、真实稳定版或空数据、健康状态。检查浏览器中的深浅主题、下载入口、市场筛选、登录、主题上传与管理员审核。 网站不再实时请求 GitHub 或 Gitea API 获取版本。发行说明与源码入口统一使用 Gitea;公告服务仍保留。 ## 回滚 如需回滚,停止新服务,将 `current` 指回旧发布目录并恢复原配置,再启动旧程序。新增版本列属于增量改动,旧程序可忽略;若要恢复上线前的数据状态,应在停服后恢复同一批备份的数据库和主题文件。不要只回滚其中一部分。