Appearance
VM 到物理机迁移实战手册 (Hand-holding Guide)
任务: 将核心服务 (Hub, Neat) 从虚拟机 (192.168.233.130) 迁移到 物理笔记本 (Ubuntu 20.04)。 同时部署: 将新的个人主页 (Home) 部署到物理机。 状态: 虚拟机作为测试环境保留,物理机作为生产环境。
📋 1. 迁移前准备 (Preparation)
1.1 物理机网络配置
- 目标: 确保物理机有一个固定的内网 IP,防止重启后 IP 变动。
- 操作:
- 登录物理机终端。
- 查看网卡名称:
ip addr(通常是enpXsX或wlpXsX)。 - 编辑 Netplan 配置 (假设使用有线连接):bash
sudo nano /etc/netplan/00-installer-config.yaml - 参考配置 (请根据实际路由器网段修改,假设路由是 192.168.31.1):yaml
network: ethernets: enp3s0: # 替换为你的网卡名 dhcp4: no addresses: [192.168.31.200/24] # 物理机固定IP gateway4: 192.168.31.1 nameservers: addresses: [223.5.5.5, 114.114.114.114] version: 2 - 应用配置:
sudo netplan apply - 记录: 物理机新 IP =
192.168.31.200(示例)
1.2 目录结构初始化 (物理机)
- 目标: 建立标准的
/srv目录结构 (参考之前的架构文档)。 - 操作:bash
# 切换到 root 或使用 sudo sudo mkdir -p /srv/{core,site,app,hub,monitor,data,backup} sudo chown -R $USER:$USER /srv # 将权限给当前用户,方便操作
1.3 基础软件检查
- 检查清单:
- [ ]
docker -v(应 > 20.10) - [ ]
docker compose version(应 > v2.0) - [ ]
rsync --version(用于同步数据) - [ ]
git --version
- [ ]
🚚 2. 数据迁移 (Data Migration)
策略: 使用
rsync从虚拟机 推 数据到 物理机,或者在物理机上 拉 数据。这里推荐在 虚拟机 上操作,推送到物理机。
2.1 停止虚拟机服务 (VM)
为了保证数据一致性(特别是数据库),建议先停止服务。
bash
# 在虚拟机 (192.168.233.130) 上执行
cd /srv/hub
docker compose down
cd /srv/app/neat
docker compose down2.2 同步数据 (VM -> Laptop)
假设物理机 IP 为 192.168.31.200,用户名为 allen。
bash
# 在虚拟机上执行 rsync
# 1. 同步 Hub 数据
rsync -avzP /srv/hub/ allen@192.168.31.200:/srv/hub/
# 2. 同步 Neat 项目
rsync -avzP /srv/app/neat/ allen@192.168.31.200:/srv/app/neat/
# 3. 同步持久化数据 (如果有独立挂载的 data 目录)
rsync -avzP /srv/data/ allen@192.168.31.200:/srv/data/注意: 如果 SSH 端口不是 22,请加
-e 'ssh -p 端口号'参数。
🚀 3. 服务启动与配置调整 (Service Startup)
3.1 启动 Hub 服务 (物理机)
- 登录物理机。
- 进入目录:
cd /srv/hub - 修改配置:
- 检查
frp/frpc.ini: 确保server_addr指向你的公网 VPS IP (通常不用变)。 - 检查
docker-compose.yml: 确认端口没有冲突。
- 检查
- 启动:bash
docker compose up -d - 验证:
docker compose ps确保所有容器 (nginx, frpc, nextcloud...) 状态为 Up。
3.2 启动 Neat 项目 (物理机)
- 进入目录:
cd /srv/app/neat - 修改配置:
- 检查
deploy/nginx/conf.d/app.conf: 确认反向代理指向正确的后端容器。
- 检查
- 启动:bash
docker compose up -d
3.3 部署个人主页 (Home) - 新部署
由于这是新部署,我们需要将本地构建好的静态文件上传到物理机。
- 本地构建 (Windows):powershell
cd c:\Users\hongj\source\lab\home npm run generate # 生成 .output/public 目录 - 上传文件:powershell
# 使用 scp 上传到物理机 /srv/site/home scp -r .output/public/* allen@192.168.31.200:/srv/site/home/ - Nginx 配置 (物理机):
- 在 Hub 的 Nginx 配置目录 (
/srv/hub/nginx/conf.d/) 新增home.conf:
nginxserver { listen 80; server_name home.hongjy.cn; # 你的域名 location / { root /srv/site/home; # 指向刚才上传的目录 index index.html; try_files $uri $uri/ /index.html; } }- 注意:需要将
/srv/site/home挂载到 Hub 的 Nginx 容器中。 - 修改
/srv/hub/docker-compose.yml:yamlservices: nginx: volumes: - /srv/site:/srv/site:ro # 添加这就行 - 重启 Nginx:
docker compose restart nginx
- 在 Hub 的 Nginx 配置目录 (
🔄 4. 流量切换 (Traffic Switch)
4.1 修改 DNS / Host
- 在局域网内,将域名的 DNS 解析指向 物理机 IP (192.168.31.200)。
- 或者在路由器中设置静态 DHCP 和 端口转发(如果需要公网直连)。
4.2 验证访问
- 访问
http://192.168.31.200(Hub 首页) - 访问
http://192.168.31.200:xxx(Neat 服务) - 访问
home.hongjy.cn(如果配置了本地 hosts 或 DNS)
4.3 虚拟机处理
- 确认物理机运行稳定 3-7 天后,可以关闭虚拟机,或将其重置用于其他测试。
🛠️ 5. 故障排查 (Troubleshooting)
- 端口冲突: 如果启动失败,检查
netstat -tulpn | grep 端口号。 - 权限问题: 确保
/srv/data下的数据库文件权限正确 (通常 docker 容器会自动处理,若不行则sudo chown -R 1001:1001 ...)。 - FRP 连不上: 检查物理机能否 ping 通公网 VPS,检查防火墙
sudo ufw status是否允许了相关端口。
