nystudio107/craft-scripts

Shell 脚本,用于管理 Craft CMS 环境之间的数据库备份、资产备份、文件权限、资产同步、缓存清理和数据库同步

资助包维护!
khalwat

安装次数: 54,097

依赖项: 10

建议者: 0

安全: 0

星星: 361

关注者: 14

分支: 61

开放问题: 11

语言:Shell

1.2.13 2021-05-24 13:37 UTC

This package is auto-updated.

Last update: 2024-08-24 20:45:26 UTC


README

Shell 脚本,用于管理 Craft CMS 环境之间的数据库备份、资产备份、文件权限、资产同步、缓存清理和数据库同步

概述

craft-scripts 中包含几个脚本,每个脚本执行不同的功能。它们都使用一个共享的 .env.sh 文件来工作。这个 .env.sh 文件应该在您希望运行 craft-scripts 的每个环境中创建,并且应该通过 .gitignore 被排除在您的 git 仓库之外。

Craft-Scripts 与 Craft 2.x 和 Craft 3.x 都兼容,并内置了对 mysqlpostgres 数据库的支持。

安装

  • 将脚本文件夹复制到 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 的 userphotosrebrand 目录。它将拉取的目录指定在 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 的 userphotosrebrand 目录从 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/cachedata/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创建的备份中恢复目录。

设置方法

  1. 下载或克隆craft-scripts的git仓库
  2. scripts目录复制到Craft CMS项目的根目录中
  3. 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的默认值有所不同。
  4. .env.sh添加到.gitignore文件中
  5. 然后,使用您喜欢的编辑器打开.env.sh文件,并将REPLACE_ME替换为适当的设置。

所有配置都在.env.sh文件中完成,而不是在脚本本身中。这样可以确保相同的脚本可以在多个环境中使用,例如local开发、staginglive生产,而无需修改。只需在每个环境中创建一个.env.sh文件,并通过.gitignore将其排除在外。

全局设置

所有以GLOBAL_开头设置的设置都适用于所有环境。

GLOBAL_DB_TABLE_PREFIX是Craft数据库表的前缀,通常为craft_

GLOBAL_CRAFT_PATHcraft文件夹的路径,相对于根路径。这通常是craft/,除非您将其移动到了其他位置。路径应该始终以/结尾

GLOBAL_DB_BACKUPS_MAX_AGE是本地备份的最大年龄(以天为单位);超过此年龄的备份将被自动轮换(删除)。

GLOBAL_DB_DRIVER是此Craft安装的数据库驱动程序(mysqlpgsql

本地设置

所有以LOCAL_开头设置的设置都指的是脚本运行的本地环境,而不是您的local开发环境。

LOCAL_ROOT_PATH是您本地Craft安装根的绝对路径,路径后跟一个/

LOCAL_ASSETS_PATH是您本地资产目录的相对路径,路径后跟一个/

LOCAL_CHOWN_USER是您的整个Craft安装的所有者。

LOCAL_CHOWN_GROUP是您的web服务器的组,通常是nginxapache

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中的userphotosrebrand目录,这些目录通常不会保留在git中。如果您不想同步任何内容,只需将设置留空,例如:LOCAL_CRAFT_FILE_DIRS=()

LOCAL_DIRS_TO_BACKUP是一个数组,包含要备份的目录的绝对路径,除LOCAL_ASSETS_DIRSLOCAL_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 数据库主机端口号。这通常是 mysql3306,对于 postgres5432

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 数据库主机的端口号。这通常是 mysql3306,而对于 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

如果您使用 gitcraft-scripts 中包含一个名为 example.gitignore 的示例 .gitignore 文件,您可以对其进行修改并用于您的 Craft CMS 项目。如果您希望使用它,应将其复制到您的 Craft CMS 项目根目录,并重命名为 .gitignore

如果您更改远程服务器的文件权限,则在尝试部署时可能会遇到 git 抱怨 覆盖现有本地更改。这是因为 git 将更改可执行标志视为对文件的更改,因此它认为您已更改服务器上的文件(并且这些更改尚未提交到您的 git 仓库)。

要解决这个问题,我们只需告诉 git 忽略服务器上的权限更改。您可以在服务器上更改 gitfileMode 设置,告诉它忽略服务器上文件的权限更改。

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_PATHREMOTE_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提供