从我的经验,一个更大的问题,我们遇到过我们的webdevelopment过程是保持不同的设置,更新和安全在不同的服务器。

我的公司都有它自己的CMS这是目前安装在100多个服务器。目前,我们使用一个黑客上下的FTP为基础的方法,结合升级的脚本在特定地点的升级我们的所有CMS设置。有效地管理这些设置变得越来越困难和危险时,有几个定义模块的参与。

  • 什么是最好的方式保持多个设置的一个网络应用程序的安全和up-to-date?
  • 如何做 你的 这样做?
  • 是否有任何具体的技巧有关的模块化中的应用程序,以便保持灵活性向我们的客户,但仍然能够有效地管理多个"分支"的应用程序?

一些背景信息:我们主要发展上的灯-叠。其中一个主要因素,可以帮助我们出售我们的CMS是,我们可以插件很多东西我们的客户想要的。这可能非常从10至10.000线的定义的代码。

大量的定制工作由非常小的碎片的代码;管理所有的这些小块代码在颠复似乎相当繁琐,效率低下给我(由于我们提供约2的网站每周,这将导致一个 很多 的分支)。

如果有什么我可以俯瞰,我很想听听你的。

在此先感谢。


综述: 首先,感谢您所有的答案。所有这些都是真的很有帮助。

我将很可能使用SVN为基础的方法,这使得 benlumley's解决方案最接近什么我会使用。由于这个问题的答案可能不同于在其他用例,我会接受的回答与大多数选民在运行结束.

请检查的答案并投票支持那些你认为具有最大的附加价值。

有帮助吗?

解决方案

我认为使用一个版本控制系统和"分支"的一部分代码,必须修改可能是最好的方法方面的稳健性和效率。

分布式系统版本可能是最适合你的需要,因为它会让你来更新你的"核心"设无缝上不同的"分支",同时保持一些改变的地方如果需要的话。

编辑: 我敢肯定,保持所有最新的一个分布式系统版本将远远少繁琐的比什么你似乎期望:你可以保持改变你确定你永远不会需要在其他地方地方、及分发方面意味着每个已部署的应用程序实际上是独立于其他人而只有解决你的意思是传播,将传播。

其他提示

如果你定制的应用涉及改变许多小块的代码这可能是一个迹象,应用程序的设计是有缺陷的。你应该有一定的稳定的核心码,扩展点为定义的库插入,有能力改变外使用的模板,并能够改变行为和安插件使用配置文件。这样,你不需要一个独立的SVN支为每个客户。相反,保持核心的代码和延长的插图书馆源的控制,作为正常的。在另一个储存库,创建一个文件夹,用于每个客户,并保持他们所有的模板和配置文件。

现在,创造SVN分支机构可能是唯一的解决办法,可以帮助你保持你的理智。在您目前的状态,这几乎不可避免的,你犯了一个错误,搞砸了一个客户的网站。至少有分支机构你保证有一个稳定的码基于每个客户。唯一的疑难杂症与SVN分支机构是如果你移动或重新命名的文件的一个分支,这是不可能的合并,改变,回到主干(你必须做手工).

祝你好运!

编辑:对于一个例子的一个精心设计的应用中使用的所有原则我上面概述的,查看 Magento电子商务.Magento是最强大的、可扩展的和易于定制网络应用程序,我已经与那么远。

我可能是错误的,但它似乎对我有什么阿隆是之后 版本控制。版本是巨大的,我敢肯定他们使用它已经,但是对于管理更新数百个定制的安装,你需要别的东西。

我想沿线的东西了 专用软件包系统.你会想要的每一个版本的一个模块,跟踪其个人依赖关系和'保证兼容性',并利用这些信息自动更新的"安全"的模块。

E.g。让我们说你已经建立了一个新的第3版您的'Wiki'模块。你想要传播的新版本的所有服务器运行应用程序,但是你已经改变了一个接口内Wiki模块,因为第2版。现在,对所有缺省安装,这是没有问题,但它会破坏安装自定义扩展上的老式接口。一个良好的计划包装系统将照顾这一点。

解决安全问题,你应该看看使用数字签字在你的修补程序。有很多良好的图书馆可用于公共钥匙基础的签名,因此只是跟什么似乎是标准为你选择的平台。

不确定是否有人说,有一个很长的答复在这里,我还没有阅读他们所有。

我觉得一个更好的方法来版本控制会有你的CMS坐在自己在其自己的仓库和各个项目在自己。(或者,所有这些可能是子文件夹在一个仓库我猜)

然后可以使用它的行李箱(或者一个具体分支/标记如果你愿意),为svn:外部在每个项目需要它。这种方式,任何更新的CMS可以致力于回到其存储库,并将被拉入其他项目如,当他们svn更新(或外部是svn:关'ed)。

作为一部分,使这容易,你会需要确保CMS和自定义功能坐在不同的文件夹,以便svn外部工作正常。

即:

project
 project/cms <-- cms here, via svn external
 project/lib <-- custom bits here
 project/www <-- folder to point apache/iis at

(你可能会有cms和lib在万维网文件夹,如果需要的)

这会让你分支/标记的每个项目作为你的愿望。你也可以开关svn:外部的地理位置在一个每分支/标记的基础。

在得到改变生活,我会建议你立刻摆脱ftp和使用可或svn结账/出口。这两个工作以及,选择是给你的。

我已经得到了大多数的经验可的路线,rsyncing svn出口的服务器。如果你走这条路,编写脚本,并且可以创建一个试验壳脚本,以显示你的文件将上传而不上传他们,使用了-n的标志。我通常使用的一对脚本,用于每一个环境--一个测试,而一个实际上这样做。

共用钥匙验证,所以你不需要密码发送传达可能也是有用的,取决于如何保护服务器给予的访问。

你也可以维持的另一个脚本用的做散的升级,这只是呼吁相关的脚本为每个项目要的升级。

你有没有看着推?不,不部署和取代什么,你有,但看看他们是如何处理定义和定点模块?

基本上,有一个"地点"文件夹,其中有一个目录中每一个的网站上,你正在主办。在每个文件夹是一个独立的settings.php 它可以指定一个不同的数据库。最后,可以(可选)有"的主题"和"模块"的文件夹内网站。

这可以让你做的站点的具体定义的特定模块和限制某些模块的那些网站。因此,你们结束了一个网站,绝大多数的一切都是完全相同,唯一的差异得到复制。结合的方式处理升级和更新,并可能有一个可行的模型。

建立入代码自我更新的过程。
它将检查更新,并运行它们在何处/如何配置其为客户。

你将要建立某种形式的模块列表(定义或不是),需要进行测试,与新建立之前推出。当部署的更新,你会必须确保这些都经过测试和集成正确的。希望你的设计可以处理这个问题。

更新是理想的一些关键步骤。

  1. a) 备份,所以你可以回来了。 你应该能够回来 在整个更新在任何时间。所以, 这意味着建立一个本地存档 该应用程序和数据库 第一次。

    b) 更新监测程 -有CMS系统电话的家庭寻找一个新的建立。

    c) 计划更新酒店 -你不想更新运行的第二它是可用的。这意味着你必须创建一个cron/剂的某种做到的系统会自动更新在中间的夜晚。你也可以考虑客户的要求更新在周末或在特定日子。你也可以错开推出了更新,所以你不更新1000客户在1天,并获得技术支持地狱。交错的推行某种可能有益于你。

    d) 增加的维护方式更新该网站 --踢网站维护模式。

    e) SVN结账或下载的软件包 --理想的情况可以部署通过svn结账时,如果没有,安装服务器提供svn产生包的进入档案,可以部署在客户的网站。

    f) 部署DB脚本 -备份的数据库,更新他们,填写它们

    g) 更新网站的代码 -所有这些工作的一个步骤。

    h) 跑一些测试。 如果你的代码中有自我测试的内,它将是理想的。

这里我做什么...

具体客户包括路径

  • 共享、共同的代码中 共享/current_version/lib/
  • 网站的特定的代码中 客户/foo。com/lib
  • 包括道路被设定为包括从 客户/foo。com/lib, ,然后 分享/lib
  • 整个事情是在一个版本控制系统

这保证了代码使用的共享文件中只要有可能,但是,如果我需要替代特定类或文件由于某些原因,我可以写一个客户的特定版本在他们的文件夹。

别名共同文件

我的虚拟的机构将包含一条线像

Alias /common <path>/shared/current_version/public_html/common

它允许共同界面、图标等共享项目

标记的通用代码与每个站点释放

之后的每个网站发布,我标记的通用代码,通过创建一支有效地冻结这点时间。这让我可以部署/shared/version_xyz/现场服务器。然后我可以有一个虚拟的主机使用一种特殊版本的通用文件,或把它指向的current_version如果我想它捡起最新更新。

你有没有看过这样的工具来作 傀儡 (为系统管理,包括。应用程序署)或 Capistrano (部署的应用程序在RubyOnRails但不限于这些)?

一个选择将是设立了一个只读版本控制系统(颠复).你可以把储存库的存到您的CMS和调用更新过的菜单,或者自动的,如果你不想让用户有一个选择有关的更新(可能是关键)。使用一个版本控制的系统还将让你保持不同的树枝很容易

因为人们已经提到,使用的版本控制(我喜欢颠复由于功能性)和分支将是最好的选择。另一个开放源码软件可以在sourceforge称为cruisecontrol.其惊人,配置cruisecontrol与颠复sach一种方式,任何代码修改或者新的码加入serversion,巡航控制将知道自动并将建立用于你。它将保存你的地狱的时间。

我已经做了同样的方式在我的公司。我们有四个项目,并部署该项目在不同的服务器上。我已经设置cruiseconrol在这样一种方式,任何修改代码基触发的自动生成。和另一个脚本将部署,建立在服务器上。你是好去。

如果你使用一堆灯我肯定会把该方案文件成的一揽子分发和使用它为传播的变化。我建议对于这个问题Redhat/软呢因为转,这就是我们的经验。无论如何可以使用任何基于Debian分发。

一段时间前我做了一个灯管理解决方案的一个主机ISP服务器。他们有多个服务器上的照顾网络托管和我需要一种方法来部署更改我的经理,因为每一个机是独立的,并有一个在线管理。我做了一个转包含的解决方案的文件(php大)和一些部署的脚本拼命地跑的转。

自动更新我们有我们自己的转存储库集中每个服务器上百胜。conf.我设置的实务工作,更新服务器,每天的最新Rpm,受信赖的存储库。

忠实可以实现,因为可以使用信托设置在转包,如签署他们用你的公共关键文件和接受仅签署的软件包。

嗯这可能是一个想法,以增加配置文件吗?是你写的很多小脚本正在做的事情。现在如果你愿意建立它们进入来源,并指导他们使用配置文件不应该是"轻松"呢?

另一方面具有分支机构为每个客户都看起来像一个呈指数级增长给我。你会怎么"知道"这领域已经做了一些事情,并不要忘了"作出"改变所有其他分支机构。这看起来很丑陋到我。

这似乎是一个结合修订的控制,配置选择和/或部署的收入似乎是一个"好"主意。....

与许多变化核心软件,我认为你真的需要一个版本控制系统的推动更新干线来的各个客户的网站。

所以如果你认为的颠复将冗长乏味,你已经有了一个良好的感觉为什么痛苦点将...就个人而言,我不会推荐颠复这一点,因为它不是真正的良好管理和跟踪分支机构。虽然benlumley的建议使用外部核心软件是一个很好的,这打破了如果你需要调整的核心码为你的客户网站。

看到工版本控制,这是建立分支,并且很快。

检查Capistrano管理你的部署。这是一个红宝石的脚本中,经常使用与轨道,但它可用于各种各样的文件管理上的远程服务器,甚至非红宝石的网站。它可以得到的内容远程端通过各种stragegies包括ftp,scp,再同步,以及作为自动检查最新的版本,从你的储存库。不错的功能,它提供了包括回调挂钩的每一步部署过程(例如所以你可以复制你的站点的具体结构文件,这可能不是在版本控制),和释放日志系统--通过链接-这样你就可以迅速回滚到一个以前释放的情况下麻烦了。

我会推荐的配置文件的列表中的分支机构和其托管的位置,然后通过与一个脚本,检查了每个分支中转载的最新变化。这可能是cron会做每晚自动更新。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top