sourcebroker / deployer-extended-wordpress
使用 deployer.org 的 WordPress 部署工具
README
- 它做什么?
- 我应该使用 "deployer-extended-wordpress" 还是 "deployer-extended-wordpress-composer"?
- 依赖项
- 安装
- 项目文件夹结构
- Composer
- 同步数据库
- 同步媒体 & WordPress / 插件代码
它做什么?
本包提供使用 deployer (deployer.org) 部署 WordPress 的任务,以及同步数据库和媒体文件的额外任务。
部署被简化,以便能够自动升级 WordPress 和通过管理员面板(或使用 InfiniteWP 等工具自动)手动升级插件。这在完全不部署和完全由 composer 驱动的部署之间是一种折中方案。如果您想完全使用 composer 来管理 WordPress 和插件,请查看 https://roots.io/ 和 sourcebroker/deployer-extended-wordpress-composer。
我应该使用 "deployer-extended-wordpress" 还是 "deployer-extended-wordpress-composer"?
在 sourcebroker/deployer-extended-wordpress 中,WordPress 和第三方插件是手动安装的。在 GIT 中,您基本上只有主题/插件/muplugins。好处是您可以自动更新 WordPress 和插件。这可以被认为是对低预算 WordPress 网站有利的方案。
在 sourcebroker/deployer-extended-wordpress-composer 中,WordPress 和第三方插件使用 composer 安装。这种方法可以让你更好地控制安装的内容,但安装新的 WordPress 或新版本的插件时,您需要首先修改 composer.json 或进行 composer update(取决于升级的大小)。然后您需要提交 composer.json / composer.lock 并执行部署,这将安装 WordPress 和插件的新版本。这是一项无法轻易自动化的额外工作。这种解决方案的另一个额外优点是您可以轻松清理受感染的 WordPress/plugins 文件,因为每次部署时,所有 PHP 文件都是新的(部分来自您的 GIT,部分来自 composer 存储库)。
依赖项
本包依赖于以下包
- sourcebroker/deployer-extended 提供了一些 deployer 任务,这些任务可以用于任何框架或 CMS。
- sourcebroker/deployer-extended-database 提供了一些与 PHP 框架无关的 deployer 任务来同步数据库。
- sourcebroker/deployer-extended-media 提供了一些与 PHP 框架无关的 deployer 任务来同步媒体。
- wp-cli/search-replace-command 包在数据库同步后更改域名。wp-cli/wp-cli 实用程序的一部分。
安装
使用 composer 安装包
composer require sourcebroker/deployer-extended-wordpress
在您的 deploy.php 中添加以下行
require __DIR__ . '/vendor/autoload.php'; new \SourceBroker\DeployerExtendedWordpress\Loader();
从您的 deploy.php 中删除任务 "deploy"。否则,您将覆盖 deployer/deploy/task/deploy.php 中定义的部署任务
示例 deploy.php 文件
<?php namespace Deployer; require __DIR__.'/vendor/autoload.php'; new \SourceBroker\DeployerExtendedWordpress\Loader(); set('repository', 'git@my-git:my-project.git'); host('live') ->setHostname('example.com') ->setRemoteUser('deploy') ->set('shared_files', array_merge(get('shared_files'), ['config/.env.live.local'])) ->set('public_urls', ['https://www.example.com/']) ->set('deploy_path', '/var/www/example.com/live'); host('beta') ->setHostname('example.com') ->setRemoteUser('deploy') ->set('shared_files', array_merge(get('shared_files'), ['config/.env.beta.local'])) ->set('public_urls', ['https://beta.example.com/']) ->set('deploy_path', '/var/www/example.com/beta'); host('dev') ->set('public_urls', ['https://example-com.ddev.site/']) ->set('deploy_path', getcwd());
注意 host('dev'); 的声明,这对于数据库任务来说,需要声明域名替换和数据库转储的存储路径。
项目文件夹结构
此部署有以下假设:
WordPress源代码不在GIT中,以便能够从管理面板轻松升级它们。
为了能够从管理面板轻松升级,
wp-content/plugins
应该尽可能不包含在GIT中。不过,如果您愿意,也可以在GIT中包含一些插件。wp-content/mu-plugins
可以部分不包含在GIT中,但也可以在那里包含包含在GIT中的插件。config/environments
以及使用wp-config
和.env
的想法是从bedrock反向移植的,并扩展了symfony/dotenv
的概念。考虑上述各点,GIT中仅有的文件将是:
/config/environments/development.php /config/environments/staging.php /config/application.php /config/.env /config/.env.beta /config/.env.dev /config/.env.live /config/.env.dev.local.dist /config/.htaccess /wp-content/plugins/my-plugin-in-git /wp-content/mu-plugins/my-mu-plugin.php /wp-content/themes/my-theme/ .gitignore deploy.php composer.lock composer.json wp-config.php
注意.env.beta
、.env.dev
、.env.live
文件,这些文件存储特定于实例的数据,但可以存储在git中。例如,数据库名称、数据库用户、数据库主机、SMTP设置(不包含密码)。密码应存储在每个实例主机外的文件中,例如.env.beta.local
、.env.dev.local
、.env.live.local
,或者如果您不太关心安全性,也可以将它们存储在git中。
- 您还需要为每个实例添加共享的本地env文件。您可以这样操作。看看第4行。
host('live') ->setHostname('example.com') ->setRemoteUser('deploy') ->set('shared_files', array_merge(get('shared_files'), ['config/.env.live.local'])) ->set('public_urls', ['https://www.example.com/']) ->set('deploy_path', '/var/www/example.com/live');
实例上唯一必需的、不包含在git中的文件是/config/.env.local
,其中您设置实例信息。/config/.env.local
的内容应该是仅包含WP_INSTANCE='live'
等,具体取决于哪个实例。
查看sourcebroker/wordpress-starter的示例,了解如何在您的WordPress中使用它。
- 在
deployer/set.php
中定义的共享目录是: set('shared_dirs', [ 'wp-content/uploads', 'wp-content/languages', 'wp-content/upgrade', ] );
- 在
deployer/set.php
中定义的共享文件是: set('shared_files', [ '.htaccess', 'config/.env.local', ]);
Composer
您可以使用composer_channel
(值:1、2、stable、prelive、snapshot)或composer_version
来设置合适的composer版本,后者接受精确的标签作为参数(https://github.com/composer/composer/tags)。为了稳定性和安全性,建议您使用值1
或2
设置composer_channel
,这样它将自动更新,但不会在未来安装任何新的主要版本,因此您的部署将保持相当稳定。
set('composer_channel', 2);
同步数据库
数据库同步是通过sourcebroker/deployer-extended-database完成的。以下是从生产环境到本地实例同步数据库的命令示例
dep db:pull live
域名替换
“post_command”任务“db:import:post_command:wp_domains”将更改“public_urls”中声明的域名。域名替换是通过wp-cli的“search-replace”命令完成的,来自wp-cli/wp-cli。
请注意,为了使域名替换针对每对对应URL进行,每个实例的“public_urls”必须相同。
查看以下示例,以获得灵感。
host('live') ->setHostname('example.com') ->setRemoteUser('deploy') ->set('shared_files', array_merge(get('shared_files'), ['config/.env.live.local'])) ->set('public_urls', ['https://www.example.com', 'https://sub.example.com']) ->set('deploy_path', '/var/www/example.com.live'); host('beta') ->setHostname('example.com') ->setRemoteUser('deploy') ->set('shared_files', array_merge(get('shared_files'), ['config/.env.live.local'])) ->set('public_urls', ['https://beta.example.com', 'https://beta-sub.example.com']) ->set('deploy_path', '/var/www/example.com.beta'); host('dev') ->set('public_urls', ['https://example-com.ddev.site', 'https://sub-example-com.ddev.site']) ->set('deploy_path', getcwd());
如果您将执行以下命令:
dep db:pull live
数据库导入后,将自动执行以下命令。
wp search-replace https://www.example.com https://example-com.dev wp search-replace https://sub.example.com https://sub-example-com.dev
配置
请注意,在开始数据库同步之前,“deploy.php”文件必须在所有实例上保持相同。
同步媒体 & WordPress / 插件代码
媒体同步是通过包sourcebroker/deployer-extended-media完成的。同步媒体和不在git中的PHP文件的命令是:
dep media:pull live
因为我们不使用composer获取WordPress和插件,所以我们将把WordPress和插件的代码视为一种媒体来同步。这是对sourcebroker/deployer-extended-media的一点点误用,但如果我们认为媒体是项目的一部分,它需要在不同实例之间同步,那么我们不在git中的WordPress和插件PHP代码就是需要在不同实例之间同步的一组文件。
因此,我们同步媒体和WordPress/插件代码的配置如下:
set('media', [ 'filter' => [ '+ /wp-content/', '- /wp-content/mu-plugins/*', '- /wp-content/themes/*', '+ /wp-content/**', '+ /wp-admin/', '+ /wp-admin/**', '+ /wp-includes/', '+ /wp-includes/**', '+ .htaccess', '+ wp-activate.php', '+ wp-blog-header.php', '+ wp-comments-post.php', '+ wp-config-sample.php', '+ wp-config.php', '+ wp-cron.php', '+ wp-links-opml.php', '+ wp-load.php', '+ wp-login.php', '+ wp-mail.php', '+ wp-settings.php', '+ wp-signup.php', '+ wp-trackback.php', '+ xmlrpc.php', '+ index.php', '- *' ] ]);