nystudio107 / craft-scripts
Shell 脚本,用于管理 Craft CMS 环境之间的数据库备份、资产备份、文件权限、资产同步、缓存清理和数据库同步
README
Shell 脚本,用于管理 Craft CMS 环境之间的数据库备份、资产备份、文件权限、资产同步、缓存清理和数据库同步
概述
在 craft-scripts
中包含几个脚本,每个脚本执行不同的功能。它们都使用一个共享的 .env.sh
文件来工作。这个 .env.sh
文件应该在您希望运行 craft-scripts
的每个环境中创建,并且应该通过 .gitignore
被排除在您的 git 仓库之外。
Craft-Scripts 与 Craft 2.x 和 Craft 3.x 都兼容,并内置了对 mysql
和 postgres
数据库的支持。
安装
- 将脚本文件夹复制到 Craft CMS 项目的根目录
- 复制示例.env.sh 文件,并将其重命名为 .env.sh
- 将 .env.sh 添加到您的 .gitignore 文件中
- 然后使用您喜欢的编辑器打开 .env.sh 文件,并将 REPLACE_ME 替换为适当的设置。
升级
要将 Craft-Scripts 升级到较新版本,请将您的 scripts
文件夹的内容替换为最新的 Craft-Scripts,同时保留现有的 .env.sh
文件。
Craft-Scripts 默认设置,即使较旧的 .env.sh
文件也应与最新的 Craft-Scripts 一起使用。
set_perms.sh
set_perms.sh
脚本以严格的方式设置 Craft CMS 安装文件权限,以帮助加强 Craft CMS 安装。
有关详细信息,请参阅加强 Craft CMS 权限。
注意:如果您使用 git
,请参阅下方的权限和 Git 部分。
clear_caches.sh
clear_caches.sh
脚本通过删除所有 craft/storage/runtime/
缓存目录以及清空 craft_templatecaches
数据库表来清除 Craft CMS 缓存。
如果设置了 LOCAL_REDIS_DB_ID
,它还可以清除 Redis 数据库缓存;如果设置了 LOCAL_FASTCGI_CACHE_DIR
,它还可以清除 FastCGI 缓存。
如果您想将此添加到 Forge / DeployBot / Buddy.works 部署脚本中,以便在部署时自动清除缓存,请在您的远程服务器上设置 .env.sh
,然后将其添加到部署脚本中
scripts/clear_caches.sh
以上假设当前工作目录已经是项目根目录。
pull_db.sh
pull_db.sh
脚本从远程服务器拉取数据库转储,并将其倒入本地数据库。在转储之前,它将备份本地数据库。
Craft-Scripts 执行的数据库转储将排除我们不希望在备份/恢复中包含的临时/缓存表,例如 templatecaches
表。
有关详细信息,请参阅Craft CMS 环境之间数据库和资产同步。
注意:pull_db.sh
脚本即使在本地和远程都在同一服务器上也可以使用。
pull_assets.sh
pull_assets.sh
脚本从远程服务器拉取任意数量的资产目录,因为我们把可由客户端上传的资产排除在 git 仓库之外。它将拉取的目录指定在 LOCAL_ASSETS_DIRS
默认情况下,它还会从 craft/storage
中拉取 Craft 的 userphotos
和 rebrand
目录。它将拉取的目录指定在 LOCAL_CRAFT_FILE_DIRS
有关详细信息,请参阅Craft CMS 环境之间数据库和资产同步。
注意: 即使本地和远程在同一台服务器上,也可以使用 pull_assets.sh
脚本。
pull_backups.sh
pull_backups.sh
脚本从远程服务器拉取由 craft-scripts
创建的备份,并将其同步到 LOCAL_BACKUPS_PATH
对于数据库备份,使用 REMOTE_BACKUPS_PATH
目录中的 REMOTE_DB_NAME/db
子目录进行数据库备份。
对于资产备份,使用 REMOTE_BACKUPS_PATH
目录中的 REMOTE_DB_NAME/assets
子目录进行资产备份。
因为这些备份使用了 rsync
,您可以在任何目录中放置一个 .rsync-filter
文件来定义要忽略的文件/文件夹。 更多信息
请参阅 通过网站备份减轻灾害 以获取详细说明。
sync_backups_to_s3.sh
sync_backups_to_s3.sh
脚本将 LOCAL_BACKUPS_PATH
中的备份同步到在 REMOTE_S3_BUCKET
中指定的 Amazon S3 存储桶。
如果您已定义一个可选的子文件夹,它将包含到在 REMOTE_S3_PATH
中定义的路径的备份。
此脚本假定您已经 安装了 awscli 并使用您的凭据 配置了它。
建议您设置一个只能访问 S3 的单独用户,并为您的备份设置一个私有的 S3 存储桶。
您可以将 LOCAL_AWS_PROFILE
设置为确定要连接的 AWS 配置文件。
请参阅 通过网站备份减轻灾害 以获取详细说明。
backup_db.sh
backup_db.sh
脚本将本地数据库备份到通过 LOCAL_BACKUPS_PATH
设置的目录中,以时间戳命名的、gzip
压缩的存档。它还将自动删除(删除)任何超过 GLOBAL_DB_BACKUPS_MAX_AGE
旧的备份。
数据库备份排除了临时/缓存表,并存储在 LOCAL_BACKUPS_PATH
内的 LOCAL_DB_NAME/db
子目录中。
备份存档末尾的数字是一个格式为 YYYYMMDD-HHMMSS
的时间戳。
有关如何自动运行此脚本的详细信息,请参阅下面的 自动脚本执行 部分。
请参阅 通过网站备份减轻灾害 以获取详细说明。
backup_assets.sh
backup_assets.sh
脚本将任意数量的资产目录备份到在 LOCAL_BACKUPS_PATH
中指定的目录。它备份的目录指定在 LOCAL_ASSETS_DIRS
中,就像 pull_assets.sh
脚本一样。
它还将默认备份 Craft 的 userphotos
和 rebrand
目录从 craft/storage
中。它将备份的目录指定在 LOCAL_CRAFT_FILE_DIRS
中。
因为这些备份使用了 rsync
,您可以在任何目录中放置一个 .rsync-filter
文件来定义要忽略的文件/文件夹。 更多信息
例如,如果您不想备份任何 Craft 图像转换,您的每个资产目录中的 .rsync-filter
文件可能看起来像这样
# This file allows you to add filter rules to rsync, one per line, preceded by either
# `-` or `exclude` and then a pattern to exclude, or `+` or `include` and then a pattern
# to include. More info: http://askubuntu.com/questions/291322/how-to-exclude-files-in-rsync
- _*/**
有关如何自动运行此脚本的详细信息,请参阅下面的 自动脚本执行 部分。
请参阅 通过网站备份减轻灾害 以获取详细说明。
backup_dirs.sh
backup_dirs.sh
脚本将任意数量的目录备份到在 LOCAL_BACKUPS_PATH
中指定的目录。它备份的目录指定在 LOCAL_DIRS_TO_BACKUP
中。
提供此脚本是为了以防您有需要备份的项目外的其他文件。例如,您可能有一个单独的维基或配置文件目录。
因为这些备份使用了 rsync
,您可以在任何目录中放置一个 .rsync-filter
文件来定义要忽略的文件/文件夹。 更多信息
例如,如果您有一个维基,其中包含不想备份的 data/cache
和 data/tmp
目录,您的维基目录中的 .rsync-filter
文件可能看起来像这样
# This file allows you to add filter rules to rsync, one per line, preceded by either
# `-` or `exclude` and then a pattern to exclude, or `+` or `include` and then a pattern
# to include. More info: http://askubuntu.com/questions/291322/how-to-exclude-files-in-rsync
- public/data/cache
- public/data/tmp
有关如何自动运行此脚本的详细信息,请参阅下面的 自动脚本执行 部分。
请参阅 通过网站备份减轻灾害 以获取详细说明。
restore_db.sh
restore_db.sh
脚本用于将本地数据库恢复到通过命令行参数传入的数据库dump。在恢复之前,它会先备份你的本地数据库。
你可以将.sql
文件或.gz
文件的路径传递给restore_db.sh
,它将根据文件类型执行相应的操作。
请参阅 通过网站备份减轻灾害 以获取详细说明。
restore_assets.sh
restore_assets.sh
脚本用于从使用backup_assets.sh
创建的备份中恢复资产。
restore_dirs.sh
restore_dirs.sh
脚本用于从使用backup_dirs.sh
创建的备份中恢复目录。
设置方法
- 下载或克隆
craft-scripts
的git仓库 - 将
scripts
目录复制到Craft CMS项目的根目录中 - 在
scripts
目录中,复制craft2-example.env.sh
(适用于Craft 2.x项目)或craft3-example.env.sh
(适用于Craft 3.x项目)文件,并将其重命名为.env.sh
。这些*-example.env.sh
文件大致相同,只是Craft 2.x和Craft 3.x的默认值有所不同。 - 将
.env.sh
添加到.gitignore
文件中 - 然后,使用您喜欢的编辑器打开
.env.sh
文件,并将REPLACE_ME
替换为适当的设置。
所有配置都在.env.sh
文件中完成,而不是在脚本本身中。这样可以确保相同的脚本可以在多个环境中使用,例如local
开发、staging
和live
生产,而无需修改。只需在每个环境中创建一个.env.sh
文件,并通过.gitignore
将其排除在外。
全局设置
所有以GLOBAL_
开头设置的设置都适用于所有
环境。
GLOBAL_DB_TABLE_PREFIX
是Craft数据库表的前缀,通常为craft_
GLOBAL_CRAFT_PATH
是craft
文件夹的路径,相对于根路径。这通常是craft/
,除非您将其移动到了其他位置。路径应该始终以/
结尾
GLOBAL_DB_BACKUPS_MAX_AGE
是本地备份的最大年龄(以天为单位);超过此年龄的备份将被自动轮换(删除)。
GLOBAL_DB_DRIVER
是此Craft安装的数据库驱动程序(mysql
或pgsql
)
本地设置
所有以LOCAL_
开头设置的设置都指的是脚本运行的本地环境,而不是您的local
开发环境。
LOCAL_ROOT_PATH
是您本地Craft安装根的绝对路径,路径后跟一个/
。
LOCAL_ASSETS_PATH
是您本地资产目录的相对路径,路径后跟一个/
。
LOCAL_CHOWN_USER
是您的整个Craft安装的所有者。
LOCAL_CHOWN_GROUP
是您的web服务器的组,通常是nginx
或apache
。
LOCAL_WRITEABLE_DIRS
是一个目录列表,这些目录相对于LOCAL_ROOT_PATH
应该可由您的web服务器写入。
LOCAL_ASSETS_DIRS
是一个目录列表,这些目录相对于LOCAL_ASSETS_PATH
,您希望从远程服务器拉取。这样做是为了在您希望同步某些资产目录但不是所有目录的情况下。如果您想拉取LOCAL_ASSETS_PATH
中的所有资产目录,只需在此数组中留一个空的引号字符串即可
LOCAL_CRAFT_FILE_DIRS
是一个目录列表,这些目录相对于LOCAL_CRAFT_FILES_PATH
,您希望从远程服务器拉取。默认情况下,它将拉取craft/storage
中的userphotos
和rebrand
目录,这些目录通常不会保留在git
中。如果您不想同步任何内容,只需将设置留空,例如:LOCAL_CRAFT_FILE_DIRS=()
LOCAL_DIRS_TO_BACKUP
是一个数组,包含要备份的目录的绝对路径,除LOCAL_ASSETS_DIRS
和LOCAL_CRAFT_FILE_DIRS
外
LOCAL_FASTCGI_CACHE_DIR
是本地 FastCGI 缓存路径;如果不使用 FastCGI 缓存,请留空 (""); 路径应该始终以 /
结尾。当 clear_caches.sh
脚本执行时(例如,在部署时),它将删除此目录中的所有内容
LOCAL_REDIS_DB_ID
是本地 Redis 数据库 ID;如果不使用 Redis,请留空 (""); 当 clear_caches.sh
脚本执行时(例如,在部署时),它将清除此 Redis 数据库
LOCAL_DB_NAME
是本地 mysql Craft CMS 数据库的名称
LOCAL_DB_PASSWORD
是本地 mysql Craft CMS 数据库的密码
LOCAL_DB_USER
是本地 mysql Craft CMS 数据库的用户
LOCAL_DB_HOST
是本地 mysql 数据库主机的主机名。这通常是 localhost
LOCAL_DB_PORT
是本地 mysql 数据库主机端口号。这通常是 mysql
的 3306
,对于 postgres
是 5432
LOCAL_MYSQL_CMD
是本地 mysql 可执行文件的命令,通常是 mysql
。它提供此命令是因为某些设置(如 MAMP)需要指向应用捆绑包内 mysql
副本的完整路径。
LOCAL_MYSQLDUMP_CMD
是本地 mysqldump 可执行文件的命令,通常是 mysqldump
。它提供此命令是因为某些设置(如 MAMP)需要指向应用捆绑包内 mysqldump
副本的完整路径。
LOCAL_PSQL_CMD
是本地 postgres 可执行文件的命令,通常是 psql
。
LOCAL_PG_DUMP_CMD
是本地 pg_dump 可执行文件的命令,通常是 pg_dump
。
LOCAL_DB_LOGIN_PATH
如果设置了此选项,它将使用 --login-path=
来使用本地 db 凭据,而不是通过命令行发送(见下文)
LOCAL_BACKUPS_PATH
是本地备份应存储的目录的绝对路径。对于数据库备份,将在 LOCAL_BACKUPS_PATH
目录内创建子目录 LOCAL_DB_NAME/db
来存储数据库备份。路径应该始终以 /
结尾
LOCAL_AWS_PROFILE
是一个 AWS 命名配置文件,您可以使用它来确定连接到 S3 的配置文件。
在本地 docker 容器中使用 mysql
LOCAL_MYSQL_CMD
通常只是 mysql
,在容器内执行命令时,前面加上 docker exec -i CONTAINER_NAME
。 (示例:docker exec -i container_mysql_1 mysql
)
LOCAL_MYSQLDUMP_CMD
通常只是 mysqldump
,在容器内执行命令时,前面加上 docker exec CONTAINER_NAME
。 (示例:docker exec container_mysql_1 mysqldump
)
远程设置
所有以 REMOTE_
开头的设置都指的是将从中提取资源和数据库的远程环境。
REMOTE_SSH_LOGIN
是您的远程服务器 ssh 登录,例如:user@domain.com
REMOTE_SSH_PORT
是远程服务器上用于 ssh 的端口号。这通常是 22
REMOTE_DB_USING_SSH
确定是否需要通过 ssh
执行数据库连接,或者数据库应直接连接(例如,对于 Heroku 或 Amazon RDS 服务)。这通常是 yes
REMOTE_ROOT_PATH
是远程服务器上 Craft 安装根的绝对路径,后面跟一个 /
REMOTE_ASSETS_PATH
是远程资产目录的相对路径,后面跟一个 /
REMOTE_DB_NAME
是远程 mysql Craft CMS 数据库的名称
REMOTE_DB_PASSWORD
是远程 mysql Craft CMS 数据库的密码
REMOTE_DB_USER
是远程 mysql Craft CMS 数据库的用户。
REMOTE_DB_HOST
是远程 mysql 数据库主机的名称。这通常是 localhost
。
REMOTE_DB_PORT
是远程 mysql 数据库主机的端口号。这通常是 mysql
的 3306
,而对于 postgres
则是 5432
。
REMOTE_MYSQL_CMD
是本地 mysql 可执行文件的命令,通常是 mysql
。
REMOTE_MYSQLDUMP_CMD
是本地 mysqldump 可执行文件的命令,通常是 mysqldump
。
REMOTE_PSQL_CMD
是远程 postgres 可执行文件的命令,通常是 psql
。
REMOTE_PG_DUMP_CMD
是远程 pg_dump 可执行文件的命令,通常是 pg_dump
。
REMOTE_DB_LOGIN_PATH
如果设置了此值,将使用 --login-path=
为您的远程数据库凭据,而不是通过命令行发送(请参见下文)。
REMOTE_BACKUPS_PATH
是远程备份存储的目录的绝对路径。对于数据库备份,将在 REMOTE_BACKUPS_PATH
目录内使用子目录 REMOTE_DB_NAME/db
来进行数据库备份。路径应始终以 /
结尾。
REMOTE_S3_BUCKET
是要通过 sync_backups_to_s3.sh
脚本进行备份的 Amazon S3 存储桶的名称。
REMOTE_S3_PATH
是可选的相对路径,相对于 Amazon S3 存储桶,其中 sync_backups_to_s3.sh
脚本将包含备份(如果指定)。
设置 SSH 密钥
通常,当您通过 ssh
登录远程服务器时(如一些 craft-scripts
所做的那样),您必须输入密码。从安全角度来看,最佳实践是不允许基于密码的登录,而是使用 SSH 密钥。
设置 SSH 密钥的好处在于您永远不必再次输入密码,因此它可以实现各种 craft-scripts
的自动化执行。请使用出色的 如何设置 SSH 密钥 文章作为设置您的 SSH 密钥的指南。
权限和 Git
如果您使用 git
,craft-scripts
中包含一个名为 example.gitignore
的示例 .gitignore
文件,您可以对其进行修改并用于您的 Craft CMS 项目。如果您希望使用它,应将其复制到您的 Craft CMS 项目根目录,并重命名为 .gitignore
。
如果您更改远程服务器的文件权限,则在尝试部署时可能会遇到 git 抱怨 覆盖现有本地更改
。这是因为 git 将更改可执行标志视为对文件的更改,因此它认为您已更改服务器上的文件(并且这些更改尚未提交到您的 git 仓库)。
要解决这个问题,我们只需告诉 git 忽略服务器上的权限更改。您可以在服务器上更改 git
的 fileMode
设置,告诉它忽略服务器上文件的权限更改。
git config --global core.fileMode false
有关详细信息,请参阅 git-config 手册页。
另一种解决问题的方法是在本地 dev
中使用 set_perms.sh
设置权限,然后将文件检入到您的 git 仓库中。这将导致它们从一开始就保存为 git 仓库中正确的权限。
这种方法的一个缺点是您必须在本地 dev
和生产环境 live
中都有匹配的用户/组。
自动脚本执行
如果您想按照预定的时间表自动运行这些脚本中的任何一个,以下是操作方法。我们将以 backup_db.sh
脚本为例,但同样适用于其他脚本。
请参阅设置 SSH 密钥部分,在设置自动脚本执行之前,先设置您的 SSH 密钥。
在 Linux 上
如果您使用的是 Forge,您可以通过调度程序将 backup_db.sh
脚本设置为每晚(或您想要的任何间隔)运行。如果您使用的是 ServerPilot.io 或自行管理服务器,只需将 backup_db.sh
脚本设置为通过 cron
在所需的任何间隔运行。
craft-scripts
包含一个 crontab-helper.txt
,您可以将它添加到您的 crontab
中,以使配置 cron
更容易。请记住,在通过 cron
运行脚本时,使用脚本的完整、绝对路径,因为 cron
没有访问您的环境路径,例如。
/home/forge/nystudio107.com/scripts/backup_db.sh
在 Mac 上
如果您使用的是 Mac 并且想在本地执行脚本,Apple 使用的是 Launch Daemons 而不是 cron
。
注意:即使您在 Mac 上,如果您在 VM(如 Vagrant/Homestead)中运行 local
开发,您也需要在 VM 内部执行 craft-scripts
,而不是在您的本地 Mac 上。如果您使用 Valet 或 Mamp 等工具,请继续阅读。
craft-scripts
包含一个 com.example.launch_daemon.plist
文件,可以帮助您入门。此文件是一个 XML
文件,其名称应采用唯一的反向 DNS 风格名称,并以 .plist
后缀结尾。此文件相当于 crontab
文件中的一行。
将 com.example.launch_daemon.plist
重命名为您项目/脚本独特的名称,例如:com.clientdomain.backup_db.plist
,并将其放置在 /Library/LaunchDaemons/
目录中(您需要 sudo
权限来完成此操作)。
Launch Daemon .plist
文件是一个包含一系列 <key></key>
的 XML
文件,后跟一些类型的值,这些值是相应键的值。对于 <key>Label</key>
的值应与文件名称匹配,不包括 .plist
扩展名,例如:<string>com.clientdomain.backup_db</string>
。对于 <key>UserName</key>
的值应为您希望任务运行的用户名,例如:<string>andrew</string>
<key>Program</key>
的值是执行命令的路径,例如:<string>/Users/andrew/webdev/sites/nystudio107/scripts/backup_db.sh</string>
Launch Daemons 提供了多种方式来安排它们的执行时间和方式;请参阅Launch Daemon 文档以获取详细信息。
在 /Library/LaunchDaemons/
创建文件后,需要通过 launchctl
加载(您只需这样做一次),例如。
sudo launchctl load /Library/LaunchDaemons/com.clientdomain.backup_db.plist
有关配置 Launch Daemons 的更多信息,请参阅优秀的 launchd.info 网站。
使用 mysql 5.6 中的 login-path
如果您使用的是 mysql 5.6
或更高版本,您会注意到 mysql 的警告(如果您使用的是 MariaDB,则这不是一个问题)。
mysql: [Warning] Using a password on the command line interface can be insecure.
使用craft-scripts
执行的操作并不比您亲自在命令行输入的更不安全;通过网络发送的所有内容都始终通过ssh加密。但是,您可以根据使用mysql_config_editor与MySQL 5.6实现无密码认证这篇文章,设置login-path
以将凭据存储在加密文件中。
如果您设置了LOCAL_DB_LOGIN_PATH
或REMOTE_DB_LOGIN_PATH
,它将使用--login-path=
来在相应环境中使用数据库凭据,而不是通过命令行发送。
例如,对于我的local
开发设置
mysql_config_editor set --login-path=localdev --user=homestead --host=localhost --port=3306 --password
...然后输入该用户的密码。然后在.env.sh
中设置它为
LOCAL_DB_LOGIN_PATH="localdev"
...它将使用我存储的加密凭据,而不是通过命令行传递。您也可以在远程服务器上设置此配置,然后通过REMOTE_DB_LOGIN_PATH
设置
由nystudio107提供