首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Acquia pull的DDEV多站点设置

带有Acquia pull的DDEV多站点设置
EN

Stack Overflow用户
提问于 2021-07-23 23:25:46
回答 3查看 138关注 0票数 2

我刚刚安装了DDEV,并且通过手动运行ddev import-db --target-db=[db-name]来进行多站点工作。它工作得很好,但我想弄清楚如何让数据库从Acquia拉取到我可以指定从中拉出的站点。

我已经让这个脚本正常工作了,但是有没有一种方法可以使用DDEV命令来做这件事,这样会更干净一些?

首先,我将acquia.yaml修改为:

代码语言:javascript
复制
environment_variables:
  project_id: mysite.dev
  uri: mysite.com
  db_name: mysite_us

#uri: mysite.ca
#db_name: mysite_canada

#uri: mysite.co.uk
#db_name: mysite_unitedkingdom

# etc etc

db_pull_command:
  command: |
    # set -x   # You can enable bash debugging output by uncommenting
    ls /var/www/html/.ddev >/dev/null # This just refreshes stale NFS if possible
    pushd /var/www/html/.ddev/.downloads >/dev/null
    acli remote:drush -n ${project_id} -- sql-dump --extra-dump=--no-tablespaces --uri=${uri}  >${db_name}.sql

然后我写了下面的脚本,我称之为类似于:

代码语言:javascript
复制
./ddev-refresh-db.sh mysite_us mysite.com
代码语言:javascript
复制
#!/bin/bash

site="$1"
uri="$2"

ddev pull acquia
ddev import-db --target-db=${site} --src=.ddev/.downloads/${site}.sql
ddev drush --uri=${uri} cr

但是,这仍然需要我们在运行此命令之前更改acquia.yaml文件中的站点和URI。

有没有办法把一个变量传递给ddev pull acquia?还有一种方法来模仿这个脚本使用真正的DDEV命令所做的事情吗?

EN

回答 3

Stack Overflow用户

发布于 2021-09-30 18:19:27

这是一个更完整的答案,Acquia多站点拉动,拉动所有站点。从DDEV1.18.0开始,ddev pull本身还不足以拉取多个站点,因为它假设有一个数据库和一组文件。这适用于@kelly howard在https://stackoverflow.com/a/68553116/215713中的答案不够充分的地方。(在她的示例中,她只拉取了多站点中的一个,这对于这种情况非常有效。)

但在这里,我们将把所有逻辑放在DDEV自定义命令中,并提取任何命名站点的所有数据库和文件,因此ddev acquiapull <sitename>

将此文件作为.ddev/commands/web/acquiapull放入项目中

代码语言:javascript
复制
#!/bin/bash

# This DDEV custom command is set up to pull database and files from Acquia for several subsites.
# Usage: `ddev acquiapull [ --skip-db ] [ --skip-files ] <site1> <site2>
# Example: `ddev acquiapull subsite1`

# This assumes that each subsite has its own database (named for the site)
# and that each subsite has its own files in sites/<sitename>/files

# To use it set up the needed ACQUIA_API_KEY and ACQUIA_API_SECRET in global 
# or project config, just as described in 
# https://ddev.readthedocs.io/en/stable/users/providers/acquia/

acquia_project_id=myprojectid.dev
tmpdir=/tmp  #inside web container

set -eu -o pipefail

while :; do
  case ${1:-} in
  -h | -\? | --help)
    show_help
    exit
    ;;
  -y|--yes)
    SKIP_CONFIRMATION=true
    ;;
  --skip-files)
    SKIP_FILES=true
    ;;
  --skip-db)
    SKIP_DB=true
    ;;
  --) # End of all options.
    shift
    break
    ;;
  -?*)
    printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2
    ;;
  *) # Default case: No more options, so break out of the loop.
    break ;;
  esac

  shift
done


# Map sitename to database name
function target_db_name() {
  site_name=$1
  echo $site_name
}

# Map sitename to files dir
function target_files_dir() {
  site_name=$1
  echo "sites/${site_name}/files"
}

# Get the files from upstream and load them.
function files_pull() {
  #set -x                           # You can enable bash debugging output by uncommenting
  set -eu -o pipefail
  site_name=$1
  files_dir=$(target_files_dir $1)
  mkdir -p ${DDEV_DOCROOT}/${files_dir}/
  echo "Using drush rsync to update files for ${site_name}..."
  drush rsync --alias-path=~/.drush -q -y -r ${DDEV_DOCROOT} --verbose @${acquia_project_id}:${files_dir}/ ${DDEV_DOCROOT}/${files_dir}/
}

# Get the db from upstream and load it
function db_pull() {
  #set -x   # You can enable bash debugging output by uncommenting
  set -eu -o pipefail
  site_name=$1
  target_db=$(target_db_name ${site_name})
  echo "Downloading ${site_name} database..."
  acli remote:drush -n ${acquia_project_id} -- sql-dump --uri=${site_name} --extra-dump=--no-tablespaces >${tmpdir}/${site_name}.sql
  echo "Loading ${site_name} into database '${target_db}'..."
  mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS ${target_db}; GRANT ALL ON ${target_db}.* TO 'db'@'%'"
  mysql -uroot -proot ${target_db} <${tmpdir}/${site_name}.sql
  drush -r root --uri=${site_name} cr
}

# Handle initial authentication via Acquia secrets and ssh
function authenticate() {
  if [ -z "${ACQUIA_API_KEY:-}" ] || [ -z "${ACQUIA_API_SECRET:-}" ]; then echo "Please make sure you have set ACQUIA_API_KEY and ACQUIA_API_SECRET in your project or global config" && exit 1; fi
  if ! command -v drush >/dev/null; then echo "Please make sure your project contains drush, ddev composer require drush/drush" && exit 1; fi
  ssh-add -l >/dev/null || (echo "Please 'ddev auth ssh' before running this command." && exit 1)
  acli auth:login -n --key="${ACQUIA_API_KEY}" --secret="${ACQUIA_API_SECRET}"
  acli remote:aliases:download -n >/dev/null
}

# Main script
authenticate || (printf "Failed to authenticate" && exit $?)

if [ $# -eq 0 ]; then
  printf "Usage: ddev acquiapull [ --skip-db ] [ --skip-files ] <sitename>"
  exit 1
fi

if [ ${SKIP_CONFIRMATION:-} != "true" ]; then
  echo "This will overwrite your database and files for sites $*. OK?"
  select yn in "Yes" "No"; do
      case $yn in
          No ) exit;;
      esac
  done
fi

for subsite in $*; do
  echo "Pulling subsite: $subsite"
  if [ "${SKIP_DB:-}" != "true" ]; then
    db_pull ${subsite} || (printf "Failed to pull db for ${subsite}" && exit $?)
  else
    echo "Skipping db pull for ${subsite}"
  fi

  if [ "${SKIP_FILES:-}" != "true" ]; then
    files_pull ${subsite} || (printf "Failed to pull files for ${subsite}" && exit $?)
  else
    echo "Skipping files pull for ${subsite}"
  fi
done
票数 2
EN

Stack Overflow用户

发布于 2021-07-28 08:42:24

多亏了@rfay的指导,我在每个国家/地区的.ddev/provider中设置了一组文件。每一个都是这样的结构:

代码语言:javascript
复制
environment_variables:
  uri: mysite.be
  db_name: belgium

auth_command:
  command: |
   <no changes>

db_pull_command:
  command: |
    # set -x   # You can enable bash debugging output by uncommenting
    ls /var/www/html/.ddev >/dev/null # This just refreshes stale NFS if possible
    pushd /var/www/html/.ddev/.downloads >/dev/null
    acli remote:drush -n ${ACQUIA_PROJECT_ID} -- sql-dump --extra-dump=--no-tablespaces --uri=${uri}  >${db_name}.sql

然后,我在.ddev/commands/host中创建了一个包含脚本内容的自定义命令。在真实的脚本中有更多的案例来涵盖所有国家。

代码语言:javascript
复制
#!/usr/bin/env bash

## Description: Refresh a database from Acquia and run post-db commands
## Usage: refresh-db [dbname]
## Example: "ddev refresh-db france"

site="$1"

case $site in
  canada)
    uri="mysite.ca"
    ;;
  australia)
    uri="mysite.com.au"
    ;;
  belgium)
    uri="mysite.be"
    ;;
  brazil)
    uri="mysite.com.br"
    ;;
  *)
    site="db"
    uri="mysite.com"
    ;;
esac

ddev pull ${site} -y 2>/dev/null # suppress pull failed message since it really didn't
ddev import-db --target-db=${site} --src=${DDEV_APPROOT}/.ddev/.downloads/${site}.sql
ddev drush --uri=${uri} cr
ddev drush --uri=${uri} -y pmu simplesamlphp_auth
ddev drush --uri=${uri} -y config-set system.performance css.preprocess 0
ddev drush --uri=${uri} -y config-set system.performance js.preprocess 0

我试图按照建议在导入期间处理db导入,但是我无法通过数据库权限错误来导入我尚未使用ddev db_pull_command - DB导入的数据库。但是,使用自定义命令,我还可以合并DB导入后的步骤,如果通过config.yaml完成,这些步骤通常只对默认DB运行。

我所做的另一个更改是将项目ID移动到global_config.yaml文件的web环境设置中。这样,如果我们想要更改我们想要从中拉出的环境,我们只需对那里的项目ID进行编辑,而不必编辑提供程序文件。

我没有回馈开源项目的经验,但如果这对其他人有帮助,我很乐意与某人合作,在文档或任何属于它的地方做拉请求。

票数 1
EN

Stack Overflow用户

发布于 2021-07-24 21:11:41

我将继续大体回答,但您可以在解决此问题后添加完整的答案。(我无法访问Acquia multisite。)

您在正确的轨道上,但是您可以在pull脚本中完成所有这些操作。您遇到的问题是ddev只假设一个数据库,而您有多个数据库。

这是你的acquia.yaml的一个策略:

  1. 创建所有数据库。你可以使用mysql -e "CREATE DATABASE IF NOT EXISTS <dbname>;,使用几行或者一个for循环。
  2. 拉取所有的数据库。您可以使用单独的ACLI行或使用for循环来执行此操作。
  3. 使用mysql命令导入不是主数据库的数据库。同样,这可以是几行代码,也可以是mysql <dbname> < <dbname.sql循环。(您也可以只导入主数据库,ddev只会重新导入它,如果它不大,也不会有什么坏处。)

谢谢你的好问题,我希望你能在这里给出一个完整的答案。你的答案也可以合并到https://ddev.readthedocs.io/en/stable/users/providers/acquia/中-你可以通过点击右上角的铅笔链接在那里做一次公关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68501566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档