Files
alibaba/docs/superpowers/plans/2026-08-25-server-restore-redeploy.md
T
2026-08-27 16:12:37 +08:00

8.8 KiB

alibb 服务器重装后完整恢复部署方案(Runbook)

2026-08-25。配合 2026-08-25-server-reinstall-backup.md 使用。 目标:新装系统后,把 alibb 恢复到与重装前业务完全一致(数据、密钥、访问方式、扩展零改动)。 备份位置:本机 D:\alibb-server\backups\(SHA256 已校验)。

0. 恢复后与重装前的差异(预期内,不影响业务)

项 重装前 重装后 影响
MySQL 容器名 1Panel-mysql-sLiG 1Panel-mysql-<新随机后缀> compose 的 DATABASE_URL 要 sed 替换(见 §4.2)
1Panel 面板/MySQL root 密码 旧值 装机新设 无(alibb 只用 alibaba 账号)
SSH host key / kt 用户 有 新建 本机要清 known_hosts + 重新传公钥(§1)
公网 IP 219.157.255.213 云盘重装一般保留 若 IP 变了,要改 3 处(§8)
数据 — 恢复到 2026-08-25 14:14 备份时点 之后的新数据需重装前重导(见备份方案 §五)

1. 前置:本机能连上新服务器

# 1) 清掉旧 host key(重装后会报 REMOTE HOST IDENTIFICATION HAS CHANGED)
/c/Windows/System32/OpenSSH/ssh.exe -i 'C:\Users\30997\.ssh\alibb_deploy' kt@219.157.255.213 'true' 2>&1 | head -3
# 报错则执行:
/c/Windows/System32/OpenSSH/ssh-keygen.exe -R 219.157.255.213

# 2) 新系统建 kt 用户(sudo 免密)+ 传公钥(用 root/云控制台密码登录一次)
ssh root@219.157.255.213 'useradd -m -s /bin/bash kt && echo "kt ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/kt && mkdir -p /home/kt/.ssh'
/c/Windows/System32/OpenSSH/scp.exe 'C:\Users\30997\.ssh\alibb_deploy.pub' root@219.157.255.213:/home/kt/.ssh/authorized_keys
ssh root@219.157.255.213 'chown -R kt:kt /home/kt/.ssh && chmod 700 /home/kt/.ssh && chmod 600 /home/kt/.ssh/authorized_keys'

2. 系统基础(Ubuntu 24.04)

# Docker(官方脚本)
curl -fsSL https://get.docker.com | sudo sh
# 镜像加速(照旧)
sudo tee /etc/docker/daemon.json <<'EOF'
{ "registry-mirrors": ["https://docker.1panel.live"] }
EOF
sudo systemctl restart docker
# 1Panel(官方脚本,装时设新面板密码)
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh

3. 1Panel 应用安装

面板 → 应用商店,安装:

  • OpenResty(必须先于建站)
  • MySQL 5.7.44(与重装前一致,优先选 5.7)
    • ⚠️ 若商店已无 5.7 → 装 8.0 也可:dump 为 utf8mb4,兼容;仅 §4.1 建用户时多加一句 IDENTIFIED WITH mysql_native_password BY '...'(防老驱动连不上,Prisma/mysql2 两种都支持,加这句最稳)

装好后记下 MySQL 容器实际名称(下称 <MYSQL容器名>,形如 1Panel-mysql-XXXX)和 root 密码。

4. 恢复数据库

4.1 传备包 + 建库授权导入

# 本机推备包
/c/Windows/System32/OpenSSH/scp.exe -i 'C:\Users\30997\.ssh\alibb_deploy' -r 'D:\alibb-server\backups' kt@219.157.255.213:~/
# 服务器上(替换 <MYSQL容器名> 和 <root密码>)
M=<MYSQL容器名>; R=<root密码>
sudo docker exec -i $M mysql -uroot -p"$R" <<'SQL'
CREATE DATABASE alibaba CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'alibaba'@'%' IDENTIFIED BY 'wecbni5zRRnZrMMh';
GRANT ALL PRIVILEGES ON `alibaba`.* TO 'alibaba'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
SQL
sudo docker exec -i $M mysql -uroot -p"$R" alibaba < ~/backups/alibaba-db.sql

注:mysqldump 不含用户授权,以上 CREATE USER/GRANT 来自重装前实机导出(RESTORE-NOTES.md)。

4.2 验证行数(必须与下表一致,否则停)

sudo docker exec -i $M mysql -ualibaba -pwecbni5zRRnZrMMh alibaba -e \
"SELECT (SELECT COUNT(*) FROM inquiries) inquiries,(SELECT COUNT(*) FROM customers) customers,(SELECT COUNT(*) FROM chat_messages) chat_messages;"

期望:inquiries 13570 / customers 14794 / chat_messages 61872(若重装前重导过,以最终 dump 为准)。

5. 恢复后端

# 解包代码(~/alibb-server,compose 已是生产值,严禁再跑 sed 替换 dev 值)
tar xzf ~/backups/alibb-server-code.tgz -C ~

# ★ 关键一步:DATABASE_URL 里的旧容器名替换为新容器名
cd ~/alibb-server/backend
M=<MYSQL容器名>
sed -i "s/1Panel-mysql-sLiG/$M/g" docker-compose.yml
grep DATABASE_URL docker-compose.yml   # 人工确认已指向新容器名

# build + 起(首次 migrate 会显示全部 already applied)
sudo docker compose build backend && sudo docker compose up -d
sudo docker compose logs backend | tail -20
  • compose 声明 1panel-network 为 external——1Panel 装好后已存在,无需改。
  • 密钥(JWT_SECRET/INGEST_TOKEN/ADMIN_PASSWORD/ADMIN_USERNAME)已内嵌在 compose 里,保持不变 → 扩展 token、登录账号全部沿用。

6. 站点 + 前端

  1. 1Panel → 网站 → 创建网站:名称 alibb,域名 219.157.255.213,端口 23010,根目录用默认站点 index 路径。
  2. 站点配置替换为备份内容(面板「配置文件」里改,或直接编辑 conf 后在面板重载 OpenResty):
    sudo cp ~/backups/alibb-site.conf /opt/1panel/apps/openresty/openresty/conf/conf.d/alibb.conf
    # 面板 → OpenResty → 重载
    

    conf 要点:listen 23010、root 指向站点 index、/api → http://backend:8080、try_files … /index.html、client_max_body_size 50m。若 1Panel 生成的路径/结构与 conf 里写的不一致,以面板生成的 server 块为骨架,把上面四项并进去。

  3. 前端文件(二选一):
    # 方案 A(快,直接用备包):解包即完整 dist
    sudo tar xzf ~/backups/alibb-frontend-dist.tgz -C /opt/1panel/apps/openresty/openresty/www/sites/alibb/
    sudo chmod -R a+rX /opt/1panel/apps/openresty/openresty/www/sites/alibb/index
    # 方案 B(干净,代码重 build):同 7 月部署文档 Step 4(docker node:22-alpine npm ci && npm run build 后复制 dist)
    
  4. 云安全组放行 TCP 23010 入方向。

7. 端到端验证(全部通过才算恢复完成)

curl http://219.157.255.213:23010/            # 200,返回 index.html
curl http://219.157.255.213:23010/inquiries   # 200(SPA fallback)
curl http://219.157.255.213:23010/api/health  # {"ok":true}
  • 浏览器开 http://219.157.255.213:23010 → admin / ADMIN_PASSWORD(compose 里的原值)登录成功
  • 询盘/客户/聊天页数据齐全,条数与 §4.2 一致
  • Chrome 扩展 popup:配置不变,点「测试连接」通过 → 恢复日常抓取

8. 若公网 IP 变了(默认不变,仅备用)

需要同步改 3 处:

  1. 扩展 popup 的 serverUrl → http://<新IP>:23010
  2. 站点 conf 的 server_name → 新 IP
  3. 云安全组规则跟随新 IP/网卡

9. 收尾

  • 把 ~/backups/alibb-secrets.txt 复制回 ~/alibb-secrets.txt(惯例位置),chmod 600
  • 服务器上留一份 ~/alibb-backup-20260825/(把 ~/backups 里文件拷过去),本机 D:\alibb-server\backups\ 永久保留
  • 更新 2026-07-15-deploy-test-env.md 里的 MySQL 容器名/端口等(或注明以本 runbook 为准)

10. 故障速查

症状 原因 → 处理
/api 502 ① backend 没起来:docker compose logs backend;② OpenResty 与 backend 不在同网络/别名丢失:确认 compose networks 段 1panel-network: external: true 且容器别名含 backend;③ OpenResty 容器未加入 1panel-network
后端起不来,连接拒绝 DATABASE_URL 容器名没替换对(§5),grep DATABASE_URL 核对
登录 401 ADMIN_USERNAME/ADMIN_PASSWORD 与旧值不一致——用备包 compose,别用本地 dev compose 覆盖
扩展测试连接失败 INGEST_TOKEN 变了(同上)或 23010 未放行
MySQL 8.0 下用户连不上 ALTER USER 'alibaba'@'%' IDENTIFIED WITH mysql_native_password BY 'wecbni5zRRnZrMMh';
migrate 报表不存在 dump 导入的库不对/没选 alibaba 库,重做 §4

11. 实际恢复记录(2026-08-27,已完成 ✅)

新环境与原方案的差异(下次重装直接按这个来):

  1. MySQL 8.4.11(容器 1Panel-mysql-YL0F),非 5.7 → dump 直接导入零问题;alibaba@% 用户保持默认 caching_sha2_password,Prisma 连接正常,无需切 native 插件
  2. OpenResty 1.31 是 host 网络模式 → 容器名 DNS 不可用,/api 反代必须 proxy_pass http://127.0.0.1:8090(backend 的宿主映射),不能用 http://backend:8080
  3. 1Panel 新路径 /opt/1panel/www(挂载到容器 /www,与旧 conf 完全兼容):站点在 www/sites/alibb/,conf 在 www/conf.d/alibb.conf
  4. 站点目录//conf 为手工创建,1Panel 面板里不显示该站点(如需面板管理,后续在面板建同名站再合并 conf)
  5. 精确行数(COUNT(*)):inquiries 14817 / customers 15402 / chat_messages 68268(高于备份时 information_schema 估算值,属正常)
  6. 验证结果:外网 http://219.157.255.213:23010 index 200 / SPA 200 / api/health {"ok":true},migrate 无缺项,安全组 23010 已放行