Files
xiaobaifupan/next/docs/portainer-preflight.md
T

3.7 KiB
Raw Blame History

Portainer 网页端预检

本流程适用于不使用 SSH、通过 Portainer 管理 192.168.200.11 Docker 的环境。 它只在 8876 启动重建版,不停止、不修改现有 8765 容器,也不授权正式切换。

1. 准备独立数据目录

通过 NAS 文件管理器创建只供预检使用的目录,例如:

/volume1/docker/xiaobai-next-preflight

实际路径以 NAS 的 Docker 共享目录为准。不得指向旧容器当前使用的数据目录。

先停止旧系统写入或创建 SQLite 一致性备份,再把备份复制到该目录并固定命名为:

legacy-review.db

同时把管理员私有 Skill 放入该目录的 private-mentor-skills/。不要把 .env、数据库、 访问令牌或私有 Skill 提交到 Gitea。APP_ENCRYPTION_KEY必须使用旧系统现有值,不得重新生成。

2. 创建 Git Stack

在 Portainer 中依次进入 StacksAdd stackGit Repository,填写:

项目
Name xiaobai-next-preflight
Repository URL http://192.168.200.36:3200/leefer/xiaobaifupan.git
Repository reference refs/heads/main
Compose path next/compose.preflight.yaml

私有 Gitea 仓库使用 Portainer 的仓库认证字段填写用户名和访问令牌,不把凭据拼进 URL。 关闭自动更新;预检阶段只部署已经记录 Git 提交号的版本。

在 Stack 环境变量中填写:

变量
APP_ENCRYPTION_KEY 与旧数据库配套的原始 Fernet 密钥
APP_STORAGE_PATH 第 1 步创建的 NAS 绝对路径
APP_IMAGE xiaobai-review-next:preflight-<Git短哈希>
APP_PUBLISH_PORT 8876
APP_LOG_LEVEL INFO
APP_TIMEZONE Asia/Shanghai

APP_STORAGE_PATH是强制项,预检编排不会默认为正式数据目录。Portainer 展开 Compose 时若 缺少密钥或目录会直接拒绝部署,不会启动一个使用临时密钥或错误数据卷的容器。

3. 部署与迁移判定

点击 Deploy the stack。该编排先运行一次性 migration 服务,只有迁移退出码为 0 web 服务才会启动。迁移器只读打开 legacy-review.db,写入独立的 xiaobai.db 重复部署使用同一目录时保持幂等。

Portainer 中应看到:

  • migration容器状态为正常退出,退出码 0
  • web容器持续运行并最终显示 healthy;
  • 数据目录出现 xiaobai.dbmigration-report.json
  • 8765容器仍在运行,配置和数据卷没有变化。

迁移失败时不要手工修改目标库。保留 migration日志,删除预检目录中的失败目标副本后, 从最新一致旧库副本重新部署。

4. 网页验收

访问:

http://192.168.200.11:8876/
http://192.168.200.11:8876/api/health

使用真实管理员账号抽验登录、管理员与会员双标识、行情日期、自选、复盘、模型配置、 问师记录、问天历史、选股历史和策略跟踪。再从 Portainer 重启 web 容器,确认数据仍在。

在 Portainer 的容器详情中确认:

  • 镜像标签与记录的 Git 提交一致;
  • 容器用户不是 root
  • Root filesystem 为只读;
  • Capabilities 已全部移除;
  • /app/data指向独立预检目录;
  • 端口只有宿主 8876映射到容器 8765

完成日间、夜间、1080P、4K 和 390px 抽验后,将结果登记到 final/cutover-checklist.md。正式端口和流量仍保持不变。

5. 撤销预检

Portainer 删除 xiaobai-next-preflight Stack 即可停止预检容器。不要勾选删除旧正式容器、 旧数据卷或共享目录。独立预检目录保留到正式切换完成;它既可作为问题取证,也能避免重新迁移。