florianmoser/plesk-deployer

将 Deployer 常见配方修复用于在 Plesk 共享主机上部署

v6.2.1 2023-02-14 17:58 UTC

This package is auto-updated.

Last update: 2024-09-14 21:33:46 UTC


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');

感谢deflox提到这个问题问题