首页 > 解决方案 > 自定义 DDEV 拉取提供程序以更新本地数据库和用户生成的文件

问题描述

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

我想将它与 TYPO3 项目一起使用,在那里我使用 DDEV 在本地开发 EXT(因为它很棒:))并且我想在该功能的帮助下更新我的本地数据库以及“fileadmin”文件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)。我错过了什么?

我的环境:

Web 服务器在 Plesk 上运行。

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


更新 09.11.21:

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

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

这是我当前的 .yaml 文件environment_variables:,它目前不起作用。我已经测试了其中的所有命令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

标签: typo3ddev

解决方案


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

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

像这样正确转义后

environment_variables:
  DB_PASSWORD: 'Password\&\'

ddev pull作品。

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


推荐阅读