florianmoser / plesk-deployer
将 Deployer 常见配方修复用于在 Plesk 共享主机上部署
Requires
- deployer/deployer: >=6.0 <7.0
README
将应用程序自动部署到共享主机可能会非常痛苦,有时甚至不可能。这个 Deployer 配方覆盖了一些常见的 Deployer 任务,以允许部署到 Plesk chroot 环境。
使用这些修复已经成功测试了由 Metanet 提供的共享主机部署。但它们也可能适用于满足以下要求的其他供应商。
以下还包含了一个关于 chroot 环境常见问题的描述,这可能有助于将类似的修复应用到其他部署工具(Ansible、Capistrano 等)。
谁需要这个
希望使用 Deployer 将其应用程序部署到 chroot 托管环境的 PHP 开发者。
要求
您的托管应提供以下工具
- SSH 访问
- Git
- PHP CLI
- 设置网页根目录路径的选项
- Composer(可选,如果您需要安装依赖项)
安装
使用 Composer
$ composer require florianmoser/plesk-deployer
应用修复
要应用修复,只需在您的 deploy.php 文件中将 chroot_fixes.php 文件加载到常见 Deployer 配方之后
<?php namespace Deployer; require 'vendor/deployer/deployer/recipe/common.php'; require 'vendor/florianmoser/plesk-deployer/recipe/chroot_fixes.php';
您还需要提供以下 Deployer 环境变量
- chroot_path_prefix:此前缀将被添加到所有 SSH 根路径之前(有关如何设置此前缀的说明,请参阅下一节)
- chroot_index_file:相对于项目根目录的网页项目索引文件路径(通常是 index.php)
set( 'chroot_path_prefix', '<your-path-prefix>' ); set( 'chroot_index_file', 'index.php' );
当连接到主机时,使用您的 SSH 路径作为部署目录(有关如何获取此路径的说明,请参阅下文章节)
host( 'your-host.com' ) ->user( 'username' ) ->set( 'deploy_path', '<your-ssh-root>' );
有关完整使用示例,请参阅 examples/deploy.php
。
设置您的服务器
1. 在 Plesk 中创建您的域名
假设您创建了一个名为 "staging.domain.com" 的域名,它将成为 "/staging.domain.com"。在 Plesk 中,如果您创建了一个新域名而不是子域名,则很可能是 "/httpdocs"。
2. 创建子目录
我建议在子目录中部署,因为您的网页根目录将包含服务器特定的文件和目录,如 "cgi-bin"。假设您创建了目录 "deploy",现在它将成为 "/staging.domain.com/deploy"。使用此目录作为连接到您的服务器的部署目录。
3. 确定您的绝对文档根目录
在您的网页根目录中创建文件 test.php
并添加以下内容
<?php echo $_SERVER['DOCUMENT_ROOT'];
在您的网页浏览器中打开 test.php 并复制显示的路径。它应该是类似于 "/home/httpd/vhosts/domain.com/staging.domain.com/deploy/current" 的路径。从该路径中减去步骤 2 中的部分。使用步骤 2 中的示例,路径将变为 "/home/httpd/vhosts/domain.com"。这就是您应提供的 Deployer 环境 'chroot_path_prefix'(请参阅上面)。
别忘了删除 test.php 文件。
4. 配置 Plesk
您需要告诉服务器要提供部署内容。在 Plesk 中,转到您新创建的域名,选择“主机设置”,然后转到名为“文档根”的字段。在那里,您可能会看到 "/staging.domain.com"。将其更改为步骤 2 中创建的子目录,并添加 "current",即 "/staging.domain.com/deploy/current"。
"current" 是 Deployer 在部署时创建的符号链接。注意,如果您部署的应用程序在子目录中具有索引文件,则还需要将此子目录添加到您的网页根目录中,即 "/staging.domain.com/deploy/current/web"。还要注意,Plesk 已经添加了前导斜杠 "/"。
部署
像往常一样部署
$ dep deploy
如果在检出Git仓库的过程中遇到部署过程的问题,请阅读下面的“无SSH代理转发”部分。
部署到chroot环境时的常见问题
如果您只是使用Deployer修复程序,您不需要阅读以下部分。如果您想了解更多关于chroot部署的详细信息,请阅读它们。
不同的目录结构
chroot主机的问题之一是,您的SSH root与服务器root不同。使用SSH时的目录结构(在部署期间)与Apache用于托管您站点的目录结构不同。您的SSH root是真实根的一个子目录。提供的任务修复了这个问题,但它们需要您完整的服务器路径前缀才能工作。
这些任务通过部署到SSH目录来解决这个问题,但在部署后更改到绝对路径的符号链接。为了保持原子部署,必须在更新符号链接之前很短的时间内完成。这可以在Deployer中轻松实现,因为Deployer在部署期间创建了一个“发布”符号链接,然后使用它来更新“当前”符号链接。因此,在“符号链接”钩子之前更新“发布”符号链接可以解决这个问题。
当然,还需要更新所有共享目录和回滚任务中的符号链接。
有限的命令
大多数SSH对chroot环境的访问都只能使用有限的一组bash命令。Deployer使用的许多命令在有限的SSH访问中不可用。解决方案是使用PHP CLI在PHP中运行替代函数。
无SSH代理转发
SSH代理转发在大多数共享托管账户上已被禁用。这意味着您无法在Git仓库中拥有本地私钥,以将仓库克隆到服务器上。在这种情况下,您必须在服务器本身上生成公钥/私钥SSH密钥对。
为此,请在您的服务器上运行以下命令(如果不可用,则仅创建.ssh目录)
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ cd .ssh
$ ssh-keygen -t rsa
不要选择密码(只需按回车键),否则您将无法自动部署。
然后您需要将服务器的公钥添加到您的仓库中。运行
$ cat ~/.ssh/id_rsa.pub
这将显示您的公钥,您可以将它复制/粘贴到仓库提供商。
注意:不允许其他仓库的读写权限,否则如果您的服务器遭到入侵,您可能会丢失代码。
例如,在Bitbucket中,您可以打开您的仓库,转到“设置”,“访问密钥”,然后点击“添加密钥”以粘贴您的公钥,为您的服务器授予只读权限。
无FPM重启
在部署到使用FPM运行的PHP的服务器后,应该重启FPM服务。在共享托管上无法实现这一点。
此问题的修复方案仍然是实验性的。但似乎,触摸上一个版本(这是当前在FPM缓存中的版本)的索引文件,可以迫使FPM重新加载其缓存(并因此缓存新版本,因为当前符号链接已经在该时间更新)。
不支持的GIT_SSH_COMMAND
Deployer 7将默认值ssh -o StrictHostKeyChecking=accept-new
添加到环境变量GIT_SSH_COMMAND,如文档中所述。一些托管公司不支持此选项。
在这种情况下,只需将值恢复到ssh
set('git_ssh_command', 'ssh');