【问题标题】:How to move data from development server to production server? [closed]如何将数据从开发服务器移动到生产服务器? [关闭]
【发布时间】:2014-02-07 13:51:51
【问题描述】:

我们在 GoDaddy 中有两台“Linux Deluxe”服务器。

我习惯于使用两台相同的服务器进行开发和生产,但是我从未设置或管理过它们,所以我想知道该怎么做。

文件如何在服务器之间移动?我可以使用哪些工具来自动化这个过程?

【问题讨论】:

  • 这个问题有几个问题可以解释缺乏关注。首先,它相当广泛。此外,它必然会吸引自以为是的答案,因为有很多方法可以解决这个问题。要求工具推荐也不在 Stackoverflow 的范围内。最后,您可能想进行一些研究,并使用早期结果更新您的问题。搜索软件部署可能是一个很好的起点。另外,不要忘记好的 ol' Rsync。

标签: apache cpanel


【解决方案1】:

如前所述,我们需要更多地了解您的系统才能给出好的答案。

但我要指出,在大多数环境中,将生产机器设置为git 主机并使用git push 管理来自开发环境的同步是值得的。 (如果您曾经使用过 Heroku,这似乎很熟悉。)

原因:

  1. 它使您无需记住哪些文件已更新。推一下。
  2. 它提供了一种快速简单的回滚机制。如果您推动了一项更改,结果发现它被破坏了,只需roll back as shown here
  3. 无论如何,您都应该有一个本地存储库来进行变更管理。

git 使用后接收挂钩可以轻松更新生产机器。在生产服务器上的登录主页中设置一个裸存储库。

mkdir site.git
cd site.git
git init --bare

设置站点根目录,例如:

mkdir /var/www/www.mysite.com

然后创建 n 个 shell 脚本 hooks/post-receive(不要忘记 chomod +x),其中包含以下内容:

#!/bin/sh
GIT_WORK_TREE=/var/www/www.mysite.com git checkout --force

现在添加site.git 作为开发机器存储库的远程。推送到该目标将更新生产机器。

注意

我并不是在提倡 git 是一个完整的解决方案。正如@Will I Am 在 cmets 中所说,您确实需要根据存储库的存储位置来考虑敏感数据。然而即便如此,git 可以成为一个有用的工具,如果设置正确的方式e.g. as explained here。敏感数据的一般想法是使用git 和一个单独的 repo 或子模块作为安全 FTP 的智能形式。当然,如果敏感数据的数量和/或复杂性很小,一个简单的副本或远程 shell 脚本也可以。

【讨论】:

  • 这适用于应用程序文件,但配置数据和非公开密钥不应存储在 git 存储库中。此类数据应存储在环境变量中或通过 SSH 从一台服务器发送到另一台服务器的文件中。
【解决方案2】:

文件移动方式:

  1. FTP:可在 Windows 和 Linux 上运行,但非常不安全 - 你永远不应该使用它。

  2. SFTP:高度安全,但您需要通过 shell (SSH) 访问您的 linux 服务器。

    • 如果您使用 Windows 进行开发,您可以安装 OpenSSH for Windows,您将获得命令行 SCP。
    • 如果您使用的是 Linux,它与 SCP 捆绑在一起,因此您可以立即开始使用它。
    • SCP 的简短语法如下,more details here。此命令在您的本地开发服务器中运行,它将文件复制到生产服务器。

      scp <your-local-files> <prod-username>@<prod-host>:<prod-port>

    • 还有像 WinSCP 和 Putty/SuperPutty 这样的 GUI,用于从 Windows 到 Linux 执行 SCP。

  3. RSync:对 SCP 的包装器,可用于有效复制大量文件,因为它可以执行很多操作,例如仅复制更改的文件、压缩等。适用于 Linux,但您可能找不到适用于 Windows。

移动数据的方式:我假设您在谈论数据库数据?在这种情况下,这取决于您的数据库。同样,一般说明是:

  1. 请参阅您的数据库文档,了解如何将导出/快照/备份(术语不同,但含义相同)所有数据放入文件中。例如

  2. 使用上述文件复制方法复制生成的转储文件。

  3. 再次参考您的数据库文档,了解如何导入此文件。

自动化此过程的工具:我假设您问的是如何自动化复制这些文件。以下是选项:

  • SCP 和 RSync 是命令行工具,因此您可以简单地使用 Linux 中的 Cron(作业调度程序)在每天的某个给定时间自动复制文件。如果您使用的是 Windows,则需要查找其他一些日程安排工具。

  • 如果您要实现自动化,您需要一些方法来保存密码。但建议您使用无密码的基于密钥的身份验证,这比在脚本中的某处硬编码密码更安全。你可以在SSH Public-key authentication找到很多教程。

最后,有各种工具和包装器可以简化(或有时使其复杂化)这个过程。但是它们将需要安装/设置其他软件包等。通常它们属于软件部署领域,但我不会进一步解释这一点,因为它可能会变得非常固执。在进行更高级别的抽象之前,请先更好地了解基本工具。

【讨论】:

    【解决方案3】:

    确实,你没有给我们足够的信息,但话虽如此,我会采用@Gene 所说的方法,但有一些变化:

    1. 对测试服务器进行源代码控制
    2. 在生产服务器上打开并正确设置 SSH,但不要使用 root 连接到它
    3. 在设置为连接到生产服务器的测试服务器上具有 SSH 有效登录,理想情况下,您将在双方(生产和测试)上使用证书,以便您可以从测试连接到生产无密码(您'将在测试服务器上安装来自 prod 的公钥),请查看this link 了解如何操作
    4. 在您的源代码控制中使用提交策略,以便您知道某些分支或标签是预先测试的版本或已经通过 QA 流程。这很重要!
    5. 在测试服务器(GITSubversion)上设置提交后挂钩,执行以下操作:
      1. 检查是否已创建标签
      2. 如果是这样,请复制标签文件夹文件并通过您正确设置的无密码 SSH 帐户将它们上传到生产服务器
      3. 在同一个提交后 shell 脚本上通过 ssh 在生产服务器上执行您需要执行的任何操作(例如在生产环境中重新启动 apache,以防 .htaccess 文件发生更改或类似情况)

    这样做有一些好处:

    • 您确保该过程是自动的,因此如果您仅将标签或某些分支用于生产代码,您将能够附加一个由您的 post-commit SCM 挂钩调用的自动部署脚本
    • 您在同一脚本上执行安装后步骤
    • 您可以控制同一脚本中是否出现问题,并通过邮件通知某人或执行任何需要回滚生产的操作
    • ...而且您不需要在生产服务器上安装 SCM。

    当然,这只是一种方法,因为您没有提供太多关于您的应用程序是什么以及如何使用源代码控制或正确设置应用程序配置所需的信息,但我认为这应该适用于大多数基本设置。

    祝你好运!

    【讨论】:

      【解决方案4】:

      我会使用这些工具来自动复制文件:

      1. ftp 或 sftp - 这些用于在两个服务器之间复制文件。但是,他们要求手动输入用户名和密码。
      2. expect - Expect 可用于自动手动输入用户和密码。
      3. scp - 这是另一个选项,可以设置为自动复制文件。

      看看这个:linux script to automate ftp operation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多