我们有一个设置,不同的人在本地机器上进行开发,然后将更改提交到本地服务器存储库。
为了将更改同步到我们的外部生产服务器,我们运行一个脚本,将本地 subversion 导出到该服务器。
我们在执行此同步时遇到一个问题,因为为了工作,在远程服务器上执行同步的用户需要是远程文件的所有者。
我们的解决方案是:
在远程服务器上创建一个用户 (siteowner) 授予他网站所有权 (chown siteowner.siteowner /var/www/site) 将 apache 添加到 siteowner 的组(我们在 htaccess 检查方面遇到了一些问题,我们无法 chown siteowner.apache,因为当 rsync 进行同步时,它会将权限更改为 siteowner.siteowner)
我的问题是...这个设置看起来合理吗?你知道其他更好的设置吗?提前谢谢!
答案1
我们对基于 PHP 的网站使用以下工作流程。
用户将他们的工作提交给 Subversion。我们不允许开发人员手动将代码部署到 Staging 和 Live。为什么不部署到 Staging?因为我们希望它能够紧密模拟 Live。部署通过以下方式完成韦比斯特拉诺,这是一个著名且功能强大的卡皮斯特拉诺部署工具。我们创建了所谓的脚本来编写部署。它大致可以完成以下工作:
- Webistrano 以用户“deploy”身份通过 ssh 登录服务器
- 它更新远程工作副本缓存
- 它使用硬链接将生成的工作副本复制到 releases// 文件夹(以节省磁盘空间并提高速度)。
- 将客户数据(即未存储在 Subversion 中的文件)符号链接到正确的位置。
- 新版本的 chmodded 为 775,以赋予组写权限。
- 如果以上所有步骤都成功,它会将“当前”符号链接更改为 /releases// 文件夹。
- 它执行“apache2ctl graceful”来刷新仍然缓存以前版本的任何缓存(例如 php 的 realpath())。
- 如果存储的版本数量超过一定数量,则会清除最旧的版本。
网络服务器的配置使得虚拟主机的文档根目录指向“当前”符号链接,因此在部署期间旧站点可见,而部署成功后新站点会立即出现。
代码归 deploy:deploy 所有,但客户数据目录归 deploy:upload 所有和在创建时设置其 SGID 位。
Apache 的 www-data 用户是“deploy”和“upload”组的成员。开发人员在服务器上拥有个人 scp 帐户,并且是“upload”组的成员。这种设置对我们来说非常有效,因为开发人员只能通过 Webistrano 与代码交互。它可以防止管理员以外的人使用“实时快速修复”,并大大减少了事故。Webistrano 的内置回滚功能可以快速恢复错误的部署。
由于存在上传组,开发人员被授予对客户数据目录的写权限,因此他们可以上传占位符内容或帮助客户预填充站点。毕竟,没有客户内容存储在 svn 中。目录上的 SGID 位确保只有上传文件的用户所有权才设置为执行上传的用户(提供一些责任)。组所有权仍然由 SGID 设置为“上传”,因此 Apache 或其他开发人员仍然可以读写创建的文件和目录。
清晰的 Webistrano 界面已被证明非常有用,而且由于 Capistrano 内置了上述大部分功能,我们的部署方案只有二十几行。其中大部分是覆盖 Ruby-on-Rails 特定的默认值。
答案2
您可以按如下方式重新考虑工作流程:
每个人都可以提交到 SVN 服务器,而不必使用 apache 权限,而是在生产服务器上创建用户并添加 SFTP 服务器。
每个人都处理自己的文件,当提交到 SVN 服务器后,他们使用 SFTP 客户端将文件投入生产。(因为他们都使用同一个用户,所以您不必担心权限)
实际上,在投入生产之前,您应该有一台额外的服务器用于预生产。
在每次提交到生产服务器之前,他们会将文件添加到预生产服务器,理想情况下,该服务器必须是生产服务器的精确复制。
当更改得到验证后,他们就可以将文件投入生产。