Skip to content

啊,原来是Docker环境!这太棒了,Docker让环境迁移变得更加标准化和可靠。

您提供的 docker ps 信息非常关键,感谢!这说明您使用的是官方推荐的 frappe_docker 项目来部署的。

核心区别: 与上次的“裸机”安装不同,这次我们的所有命令都不是直接在服务器上运行,而是需要通过 docker exec 命令,进入到指定的“集装箱”(Container)内部去执行。这就好比,上次我们是在院子里直接干活,这次我们需要先走进指定的房间(集装箱),再在房间里干活。

我们的“搬家”类比依然适用,只是每个步骤的工具变成了Docker命令。


Docker环境下的数据迁移(搬家)指南

前提条件:

  1. 您已经在测试服务器上,使用与生产环境完全相同的 docker-compose.yml 文件和自定义镜像 hzcork-ERP:v15.1 部署好了一套全新的、空的ERP环境。
  2. 测试环境的站点名称可以和生产环境不同,便于区分(例如,生产是 erp.hzcork.com,测试是 test.hzcork.com)。

第1步:在生产服务器上“打包” (备份数据)

  1. 定位正确的容器: 根据您的 docker ps 输出,我们需要操作的核心容器是 hzcork-v156-backend-1。所有的 bench 命令都在这里面执行。

  2. 进入项目目录: 通过SSH登录到您的生产服务器,并进入包含 docker-compose.yml 文件的目录。

    bash
    cd ~/github/frapper-docker
  3. 在容器内执行备份命令: 运行以下命令。这会告诉Docker,在 hzcork-v156-backend-1 这个容器里执行备份操作。

    bash
    docker exec -it hzcork-v156-backend-1 bench --site [your-production-site.com] backup --with-files
    • [your-production-site.com]:替换成您生产站点的真实名称。假设是 erp.hzcork.com
  4. 将备份文件从容器“搬”到服务器: 备份文件现在位于容器的内部 (/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_backups
  • user@test-server-ip:替换成您登录测试服务器的用户名和IP。

第3步:在测试服务器上“开箱归位” (恢复数据)

现在,我们要在测试环境的容器里,把数据恢复进去。

  1. 登录测试服务器: SSH登录到测试服务器,并进入 frappe_docker 项目目录。

  2. 定位测试环境的容器: 运行 docker ps 查看测试环境的 backend 容器叫什么名字。它可能叫 hzcork-test-backend-1 之类的。为清晰起见,我们假设它也叫 hzcork-v156-backend-1(如果您用的项目名一样的话)。

  3. 将备份文件从服务器“搬”进容器: 我们需要把 ~/test_backups 里的文件复制到测试容器的临时目录里,比如 /tmp/

    bash
    # 语法: docker cp [服务器路径] [容器名]:[容器内路径]
    docker cp ~/test_backups/. hzcork-v156-backend-1:/tmp/
    • hzcork-v156-backend-1:请确保这是您测试服务器上的容器名!
    • 执行后,所有备份文件都被复制到了测试容器的 /tmp 目录中。
  4. 在容器内执行恢复命令: 这是最后的恢复步骤。

    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步:“调试新家”,防止冲突

这一步的目标和上次完全一样,只是执行方式略有不同。

  1. 更新数据库结构 (Migrate)

    bash
    docker exec -it hzcork-v156-backend-1 bench --site [your-test-site.com] migrate
  2. 清除缓存

    bash
    docker exec -it hzcork-v156-backend-1 bench --site [your-test-site.com] clear-cache
  3. 重启所有服务: 在Docker环境中,我们不使用 supervisorctl。最简单彻底的方式是重启所有容器。在测试服务器frappe_docker 目录下运行:

    bash
    docker compose down
    docker compose up -d

    这会关闭并移除旧容器,然后根据 docker-compose.yml 的定义重新创建并启动它们,所有配置都会重新加载。

  4. 登录网页界面,进行安全设置

    • 访问您的测试环境URL。
    • 立即禁用邮件发送! (路径: 集成 -> 邮件账户 -> 取消勾选 "启用发送")
    • 检查并禁用所有其他第三方集成。

总结

Docker环境的操作初看会多几个 docker execdocker cp 的步骤,但其核心逻辑——备份、传输、恢复、配置——是完全一样的。而且因为环境被容器隔离得很好,这种方式其实更安全、更不容易出错。