自定义 DDEV 拉取提供程序以更新本地数据库和用户生成的文件

custom DDEV pull provider to update local database and user generated files

我正在尝试创建自定义 DDEV 提供程序,以导入当前数据库以及用户从 Web 服务器生成的文件。

我想将它与 TYPO3 项目一起使用,我在其中使用 DDEV 在本地开发 EXT(因为它很棒 :))并且我想更新我的本地数据库以及借助 ddev pull函数。

我已经阅读了文档:Introduction to Hosting Provider Integration 并且我在 DDEV 容器 (ddev ssh) 中本地测试了 bash 命令并且我能够连接到远程 Web 服务器并进行数据库转储并将其传输到本地 DDEV 容器。

因此,我将 bash 命令添加到 /provider/ 文件夹中我的自定义提供程序 .yaml 文件中。

这是当前文件:

environment_variables:
  DB_NAME: db_name
  DB_USER: password
  DB_PASSWORD: password
  HOST_IP: 11.11.11.11
  SSH_USERNAME: username
  SSH_PASSWORD: password
  SSH_PORT: 22

db_pull_command:
  command: |
    # Creates the .download folder if it doesn't exist
    mkdir -p /var/www/html/.ddev/.downloads
    # execute the mysqldump on the remote webserver via SSH
    ssh -p ${SSH_PORT} ${SSH_USERNAME}@${HOST_IP} 'mysqldump -h 127.0.0.1 -u ${DB_USER} -p ${DB_PASSWORD} ${DB_NAME} > /tmp/${DB_NAME}.sql.gz'
    # download to sql file to the ddev folder
    scp -P ${SSH_PORT} ${SSH_USERNAME}@${HOST_IP}:/tmp/${DB_NAME}.sql.gz /var/www/html/.ddev/.downloads/db.sql.gz.

如果我使用 ddev pull my-provider 执行拉取,我会收到以下错误:

Downloading database...
bash: 03: command not found
Pull failed: Failed to exec mkdir -p /var/www/html/.ddev/.downloads

我假设命令的执行方式与我在 DDEV 容器中执行的方式相同(ddev ssh)。我错过了什么?

我的环境:

网络服务器运行正在 Plesk 上。

注意:到目前为止,我只尝试执行 db pull 命令。


更新 09.11.21:

到目前为止,我已经可以更新和下载文件了。但是,如果我对变量进行硬编码,我只能这样做。每次我尝试设置 environment_variables: 我都会收到以下错误,如果我 运行 ddev pull myProvider:

Downloading database...
bash: 03: command not found

这是我当前的带有 environment_variables: 的 .yaml 文件,目前无法使用。我已经测试了 ddev ssh 中的所有命令 如果我手动调用它们,它会起作用。

environment_variables:
  DB_NAME: db_name
  DB_USER: db_user
  DB_PASSWORD: 'Password$'
  HOST_IP: 10.10.10.10
  SSH_USERNAME: username
  SSH_PORT: 21

auth_command:
  command: |
    ssh-add -l >/dev/null || ( echo "Please 'ddev auth ssh' before running this command." && exit 1 )

db_pull_command:
  command: |
    mkdir -p /var/www/html/.ddev/.downloads
    ssh -p ${SSH_PORT} ${SSH_USERNAME}@${HOST_IP} "mysqldump -h 127.0.0.1 -u ${DB_USER} -p'${DB_PASSWORD}' ${DB_NAME} > /tmp/${DB_NAME}.sql"
    scp -P ${SSH_PORT} ${SSH_USERNAME}@${HOST_IP}:/tmp/${DB_NAME}.sql /var/www/html/.ddev/.downloads/db.sql
    gzip -f /var/www/html/.ddev/.downloads/db.sql

files_pull_command:
  command: |
    scp -P ${SSH_PORT} -r ${SSH_USERNAME}@${HOST_IP}:/path/to/public/fileadmin/user_upload /var/www/html/.ddev/.downloads/files

我是否以错误的方式声明了变量?或者我缺少什么?


对于在没有密码提示的情况下通过 ssh 连接有困难的任何人,您可以运行以下命令:

  1. ssh-keygen -t rsa
  2. ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 username@host
  3. 之后您应该可以在没有密码提示的情况下连接。尝试以下操作:ssh -p 22 username@host
  4. 在尝试 ddev puul 之前,您必须执行 ddev auth ssh

感谢@rfay 为我指明了正确的方向。

问题是,我的密码包含一个需要转义的特殊字符(虽然不是 $)。

像这样正确转义后

environment_variables:
  DB_PASSWORD: 'Password\&\'

ddev pull 有效。

我希望我的 .yaml 文件可以帮助其他需要从网络服务器中提取数据的人。