8.8 KiB
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 两种都支持,加这句最稳)
- ⚠️ 若商店已无 5.7 → 装 8.0 也可:dump 为 utf8mb4,兼容;仅 §4.1 建用户时多加一句
装好后记下 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. 站点 + 前端
- 1Panel → 网站 → 创建网站:名称
alibb,域名219.157.255.213,端口23010,根目录用默认站点 index 路径。 - 站点配置替换为备份内容(面板「配置文件」里改,或直接编辑 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 块为骨架,把上面四项并进去。 - 前端文件(二选一):
# 方案 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) - 云安全组放行 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 处:
- 扩展 popup 的 serverUrl →
http://<新IP>:23010 - 站点 conf 的
server_name→ 新 IP - 云安全组规则跟随新 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,已完成 ✅)
新环境与原方案的差异(下次重装直接按这个来):
- MySQL 8.4.11(容器
1Panel-mysql-YL0F),非 5.7 → dump 直接导入零问题;alibaba@%用户保持默认 caching_sha2_password,Prisma 连接正常,无需切 native 插件 - OpenResty 1.31 是 host 网络模式 → 容器名 DNS 不可用,
/api反代必须proxy_pass http://127.0.0.1:8090(backend 的宿主映射),不能用http://backend:8080 - 1Panel 新路径
/opt/1panel/www(挂载到容器/www,与旧 conf 完全兼容):站点在www/sites/alibb/,conf 在www/conf.d/alibb.conf - 站点目录//conf 为手工创建,1Panel 面板里不显示该站点(如需面板管理,后续在面板建同名站再合并 conf)
- 精确行数(COUNT(*)):inquiries 14817 / customers 15402 / chat_messages 68268(高于备份时 information_schema 估算值,属正常)
- 验证结果:外网
http://219.157.255.213:23010index 200 / SPA 200 / api/health{"ok":true},migrate 无缺项,安全组 23010 已放行