165 lines
8.8 KiB
Markdown
165 lines
8.8 KiB
Markdown
|
|
# alibb 服务器重装后完整恢复部署方案(Runbook)
|
||
|
|
|
||
|
|
> 2026-08-25。配合 [2026-08-25-server-reinstall-backup.md](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. 前置:本机能连上新服务器
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 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)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 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 传备包 + 建库授权导入
|
||
|
|
```bash
|
||
|
|
# 本机推备包
|
||
|
|
/c/Windows/System32/OpenSSH/scp.exe -i 'C:\Users\30997\.ssh\alibb_deploy' -r 'D:\alibb-server\backups' kt@219.157.255.213:~/
|
||
|
|
```
|
||
|
|
```bash
|
||
|
|
# 服务器上(替换 <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 验证行数(必须与下表一致,否则停)
|
||
|
|
```bash
|
||
|
|
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. 恢复后端
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 解包代码(~/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):
|
||
|
|
```bash
|
||
|
|
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. 前端文件(二选一):
|
||
|
|
```bash
|
||
|
|
# 方案 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. 端到端验证(全部通过才算恢复完成)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
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](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 已放行
|