Appearance
啊,原来是Docker环境!这太棒了,Docker让环境迁移变得更加标准化和可靠。
您提供的 docker ps 信息非常关键,感谢!这说明您使用的是官方推荐的 frappe_docker 项目来部署的。
核心区别: 与上次的“裸机”安装不同,这次我们的所有命令都不是直接在服务器上运行,而是需要通过 docker exec 命令,进入到指定的“集装箱”(Container)内部去执行。这就好比,上次我们是在院子里直接干活,这次我们需要先走进指定的房间(集装箱),再在房间里干活。
我们的“搬家”类比依然适用,只是每个步骤的工具变成了Docker命令。
Docker环境下的数据迁移(搬家)指南
前提条件:
- 您已经在测试服务器上,使用与生产环境完全相同的
docker-compose.yml文件和自定义镜像hzcork-ERP:v15.1部署好了一套全新的、空的ERP环境。 - 测试环境的站点名称可以和生产环境不同,便于区分(例如,生产是
erp.hzcork.com,测试是test.hzcork.com)。
第1步:在生产服务器上“打包” (备份数据)
定位正确的容器: 根据您的
docker ps输出,我们需要操作的核心容器是hzcork-v156-backend-1。所有的bench命令都在这里面执行。进入项目目录: 通过SSH登录到您的生产服务器,并进入包含
docker-compose.yml文件的目录。bashcd ~/github/frapper-docker在容器内执行备份命令: 运行以下命令。这会告诉Docker,在
hzcork-v156-backend-1这个容器里执行备份操作。bashdocker exec -it hzcork-v156-backend-1 bench --site [your-production-site.com] backup --with-files[your-production-site.com]:替换成您生产站点的真实名称。假设是erp.hzcork.com。
将备份文件从容器“搬”到服务器: 备份文件现在位于容器的内部 (
/home/frappe/frappe-bench/sites/...)。我们需要把它复制到服务器的硬盘上,才能进行下一步的传输。首先,在您的服务器上创建一个临时目录来存放备份文件:
bash# 在您的 home 目录下创建一个叫 prod_backups 的文件夹 mkdir ~/prod_backups然后,使用
docker cp命令复制文件。这是最关键的一步。bash# 语法: docker cp [容器名]:[容器内路径] [服务器路径] # 注意路径最后的 “.”,它表示复制目录下的所有内容 docker cp hzcork-v156-backend-1:/home/frappe/frappe-bench/sites/[your-production-site.com]/private/backups/. ~/prod_backups/- 同样,将
[your-production-site.com]替换成您的站点名。 - 执行后,您生产环境的数据库和文件备份就都位于服务器的
~/prod_backups目录下了。
- 同样,将
第2步:将备份文件“运输”到测试服务器
这一步和上次完全一样。使用 scp 或 SFTP 工具将 ~/prod_backups 目录下的所有文件,从生产服务器传输到测试服务器的某个临时目录下(例如 ~/test_backups)。
在生产服务器上执行 scp 的示例:
bash
# -r 参数表示递归复制整个目录
scp -r ~/prod_backups user@test-server-ip:~/test_backupsuser@test-server-ip:替换成您登录测试服务器的用户名和IP。
第3步:在测试服务器上“开箱归位” (恢复数据)
现在,我们要在测试环境的容器里,把数据恢复进去。
登录测试服务器: SSH登录到测试服务器,并进入
frappe_docker项目目录。定位测试环境的容器: 运行
docker ps查看测试环境的backend容器叫什么名字。它可能叫hzcork-test-backend-1之类的。为清晰起见,我们假设它也叫hzcork-v156-backend-1(如果您用的项目名一样的话)。将备份文件从服务器“搬”进容器: 我们需要把
~/test_backups里的文件复制到测试容器的临时目录里,比如/tmp/。bash# 语法: docker cp [服务器路径] [容器名]:[容器内路径] docker cp ~/test_backups/. hzcork-v156-backend-1:/tmp/hzcork-v156-backend-1:请确保这是您测试服务器上的容器名!- 执行后,所有备份文件都被复制到了测试容器的
/tmp目录中。
在容器内执行恢复命令: 这是最后的恢复步骤。
bash# 进入容器内执行恢复命令 # 注意,路径现在是容器内的 /tmp/ docker exec -it hzcork-v156-backend-1 bench --site [your-test-site.com] --force restore /tmp/[数据库备份文件名] --with-private-files /tmp/[私有文件备份名] --with-public-files /tmp/[公共文件备份名][your-test-site.com]:您测试站点的名称。[...备份文件名]:请替换成您在/tmp目录中看到的具体文件名。- 智能恢复:同样,您也可以只提供数据库文件路径,系统会自动查找同目录下的文件备份:bash
docker exec -it hzcork-v156-backend-1 bench --site [your-test-site.com] --force restore /tmp/[数据库备份文件名]
第4步:“调试新家”,防止冲突
这一步的目标和上次完全一样,只是执行方式略有不同。
更新数据库结构 (Migrate):
bashdocker exec -it hzcork-v156-backend-1 bench --site [your-test-site.com] migrate清除缓存:
bashdocker exec -it hzcork-v156-backend-1 bench --site [your-test-site.com] clear-cache重启所有服务: 在Docker环境中,我们不使用
supervisorctl。最简单彻底的方式是重启所有容器。在测试服务器的frappe_docker目录下运行:bashdocker compose down docker compose up -d这会关闭并移除旧容器,然后根据
docker-compose.yml的定义重新创建并启动它们,所有配置都会重新加载。登录网页界面,进行安全设置:
- 访问您的测试环境URL。
- 立即禁用邮件发送! (路径: 集成 -> 邮件账户 -> 取消勾选 "启用发送")
- 检查并禁用所有其他第三方集成。
总结
Docker环境的操作初看会多几个 docker exec 和 docker cp 的步骤,但其核心逻辑——备份、传输、恢复、配置——是完全一样的。而且因为环境被容器隔离得很好,这种方式其实更安全、更不容易出错。