ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Deployer Databases Recipe 实战指南:一条命令完成 MySQL / MariaDB / PostgreSQL 数据库供给

Deployer Databases Recipe 实战指南:一条命令完成 MySQL / MariaDB / PostgreSQL 数据库供给 Deployer Databases Recipe 实战指南一条命令完成 MySQL / MariaDB / PostgreSQL 数据库供给【免费下载链接】deployerThe PHP deployment tool with support for popular frameworks out of the box项目地址: https://gitcode.com/gh_mirrors/de/deployer导读recipe/provision/databases.php是 Deployer 提供服务器供给provision能力的核心配方之一它负责在全新的 Ubuntu 服务器上自动安装数据库服务、创建数据库账号、授权并建库。阅读本文后你将掌握如何通过provision:databases任务一键部署 MySQL、MariaDB 或 PostgreSQL理解db_type、db_name、db_user、db_password四个配置项的取值与底层交互逻辑并能在自己的部署脚本中安全、正确地组合使用这套数据库供给任务。一、Databases Recipe 是什么Databases Recipe 是 Deployer 供给体系Provision中的数据库子模块对应仓库文件 recipe/provision/databases.php。它不是一个独立可部署的应用配方而是被上层 recipe/provision.php 通过require __DIR__ . /provision/databases.php;引入作为provision大任务链条中的一环见 recipe/provision.php。它的职责非常聚焦在目标服务器上完成数据库层面的初始化包括安装数据库服务端软件MySQL / MariaDB / PostgreSQL 三选一创建可远程登录的数据库用户并授权按指定字符集与排序规则创建应用数据库。整套数据库任务都依赖 Deployer 的 SSH 执行能力属于“服务器供给”而非“应用部署”范畴通常只在服务器首次初始化时运行一次。二、引入方式与 Deployer 中所有配方一致Databases Recipe 通过require引入。在部署脚本deploy.php顶部添加require recipe/provision/databases.php;如果引入了完整供给配方则无需单独引入require recipe/provision.php;因为 recipe/provision.php 已经替你引入了databases.php同时还会引入nodejs.php、php.php、user.php、website.php等兄弟模块。注意仓库中对应的说明文档 docs/recipe/provision/databases.md 为自动生成产物头部明确标注DO NOT EDIT THIS FILE!源码唯一权威入口是 recipe/provision/databases.php文档由bin/docgen生成。三、配置项详解ConfigurationDatabases Recipe 定义了 4 个配置项全部采用**惰性求值闭包**方式定义即只有在任务执行中真正访问它们时才会触发交互式提问。这与 Deployer 中set()get()的配置体系完全一致参见 src/functions.php 中set/get的实现set将值与闭包存入配置容器get在访问时才求值闭包。3.1db_type—— 选择数据库类型自动生成set(db_type, function () { $supportedDbTypes [ none, mysql, mariadb, postgresql, ]; return askChoice( What DB to install? , $supportedDbTypes, 0); });取值none、mysql、mariadb、postgresql对应源码 recipe/provision/databases.php。交互方式通过askChoice()弹出选择列表默认选中索引0即none不安装数据库。特别说明该配置项是“autogenerated on access”意味着它不会预先写入配置只有在访问时才触发提问。选择none时provision:databases任务会直接跳过数据库安装见下文任务实现。推荐做法在部署脚本中通过set(db_type, mysql)预先固定避免每次执行都进入交互式选择也便于 CI 环境使用--option或配置注入。3.2db_name—— 数据库名称return ask( DB name: , prod);默认值prod。交互方式ask()普通文本提问可输入任意数据库名。用途该名称会用于CREATE DATABASE IF NOT EXISTSMySQL/MariaDB或CREATE DATABASEPostgreSQL建库操作。3.3db_user—— 数据库用户return ask( DB user: , deployer);默认值deployer。用途用于创建数据库账号并授予权限。Deployer 默认使用与部署用户一致的命名便于后续应用连接。3.4db_password—— 数据库密码隐藏输入return askHiddenResponse( DB password: );交互方式askHiddenResponse()以隐藏输入方式提问不显示回显且关闭了隐藏回退setHiddenFallback(false)确保密码不会出现在终端上见 src/functions.php。安全机制该密码在任务内部通过secrets机制%db_password%占位符传递在run()输出中会被脱敏不会泄露到终端日志。这三个配置项同样支持在部署脚本中预先set()固定例如host(prod) -set(db_type, mysql) -set(db_name, myapp) -set(db_user, myapp_user) -set(db_password, S3cret!Pass);固定后provision任务链中的provision:configure会检测到这些参数已显式配置通过hasOwn判断从而跳过交互式收集并直接打印已生成的配置代码块见 recipe/provision.php。四、任务详解TasksDatabases Recipe 共定义 4 个任务其中 1 个调度任务 3 个具体数据库供给任务。4.1provision:databases—— 供给调度任务desc(Provision databases); task(provision:databases, function () { set(remote_user, get(provision_user)); $dbType get(db_type); if ($dbType none) { return; } invoke(provision: . $dbType); }) -limit(1);核心逻辑先设置remote_user为provision_user默认root见 recipe/provision.php随后读取db_type若为none直接返回否则通过invoke(provision: . $dbType)动态调用对应子任务见 recipe/provision/databases.php。invoke()机制invoke是 Deployer 提供的内置函数用于在任务内部调用另一个任务见 src/functions.php它会启动/结束日志记录并执行目标任务。这里通过字符串拼接实现“任务分发”是典型的策略模式用法。-limit(1)限定该任务在多主机并行场景下只在一台主机上执行避免在集群环境中重复安装数据库。4.2provision:mysql—— 安装并初始化 MySQLdesc(Provision MySQL); task(provision:mysql, function () { run(apt-get install -y mysql-server, env: [DEBIAN_FRONTEND noninteractive], timeout: 900); run(mysql --user\root\ -e \CREATE USER IF NOT EXISTS {{db_user}}0.0.0.0 IDENTIFIED BY %db_password%;\, secrets: [db_password get(db_password)]); run(mysql --user\root\ -e \CREATE USER IF NOT EXISTS {{db_user}}% IDENTIFIED BY %db_password%;\, secrets: [db_password get(db_password)]); run(mysql --user\root\ -e \GRANT ALL PRIVILEGES ON *.* TO {{db_user}}0.0.0.0 WITH GRANT OPTION;\); run(mysql --user\root\ -e \GRANT ALL PRIVILEGES ON *.* TO {{db_user}}% WITH GRANT OPTION;\); run(mysql --user\root\ -e \FLUSH PRIVILEGES;\); run(mysql --user\root\ -e \CREATE DATABASE IF NOT EXISTS {{db_name}} character set UTF8mb4 collate utf8mb4_bin;\); });执行步骤如下见 recipe/provision/databases.php安装apt-get install -y mysql-server通过env: [DEBIAN_FRONTEND noninteractive]禁止 apt 交互式提问timeout: 900将命令超时放宽到 900 秒默认超时为default_timeout即 300 秒见 src/functions.php确保大体积安装包能在慢速网络上完成。创建用户同时创建{{db_user}}0.0.0.0与{{db_user}}%两个主机匹配项分别覆盖通过 IPv4 任意地址和任意主机名连接的场景。授予权限GRANT ALL PRIVILEGES ON *.* ... WITH GRANT OPTION赋予全部库表的全权限并允许继续授权。刷新权限FLUSH PRIVILEGES。建库CREATE DATABASE IF NOT EXISTS {{db_name}} character set UTF8mb4 collate utf8mb4_bin字符集使用UTF8mb4、排序规则使用utf8mb4_bin兼容 Emoji 与二进制排序语义。安全细节密码通过secrets: [db_password get(db_password)]传入命令中的%db_password%占位符在run()执行时被脱敏替换run()的secrets参数签名见 src/functions.php确保密码不会明文出现在进程参数与日志中。4.3provision:mariadb—— 安装并初始化 MariaDBdesc(Provision MariaDB); task(provision:mariadb, function () { run(apt-get install -y mariadb-server, env: [DEBIAN_FRONTEND noninteractive], timeout: 900); // ...与 MySQL 相同的建用户、授权、建库 SQL });逻辑与provision:mysql完全一致见 recipe/provision/databases.php唯一区别是安装包改为mariadb-server其余CREATE USER、GRANT、FLUSH PRIVILEGES、CREATE DATABASE语句与 MySQL 分支相同——因为 MariaDB 使用mysql命令行客户端SQL 方言兼容。4.4provision:postgresql—— 安装并初始化 PostgreSQLdesc(Provision PostgreSQL); task(provision:postgresql, function () { run(apt-get install -y postgresql postgresql-contrib, env: [DEBIAN_FRONTEND noninteractive], timeout: 900); run(sudo -u postgres psql $CREATE DATABASE {{db_name}};); run(sudo -u postgres psql $CREATE USER {{db_user}} WITH ENCRYPTED PASSWORD \%db_password%\;, secrets: [db_password get(db_password)]); run(sudo -u postgres psql $GRANT ALL PRIVILEGES ON DATABASE {{db_name}} TO {{db_user}};); });PostgreSQL 分支实现差异明显见 recipe/provision/databases.php安装安装postgresql与postgresql-contrib后者提供常用扩展与工具同样使用noninteractive环境变量与 900 秒超时。建库通过sudo -u postgres psql切换到 postgres 超级用户执行CREATE DATABASE {{db_name}}。注意 PostgreSQL 没有IF NOT EXISTS语法此处为直接创建重复执行会报错。建用户CREATE USER {{db_user}} WITH ENCRYPTED PASSWORD ...使用加密密码存储密码经secrets机制脱敏传递。授权GRANT ALL PRIVILEGES ON DATABASE {{db_name}} TO {{db_user}}将目标库的全部权限授予应用用户。与 MySQL/MariaDB 的差异PostgreSQL 使用psql工具、以postgres系统用户身份执行 SQL、权限作用域是单个数据库而非*.*。同时其run()调用以sudo开头会触发 src/functions.php 中内置的 sudo 密码处理逻辑若当前用户无免密 sudoDeployer 会通过sudo_askpass机制交互式收集 sudo 密码。五、与 Provision 主任务链的集成Databases Recipe 是整个provision供给流程的组成部分。在 recipe/provision.php 中provision是一个包含 15 个子任务的组任务task(provision, [ provision:check, provision:configure, provision:update, provision:upgrade, provision:install, provision:ssh, provision:firewall, provision:user, provision:php, provision:node, provision:databases, // ← 数据库供给在此位置 provision:composer, provision:server, provision:website, provision:verify, ]);provision:databases被编排在 PHP、Node 供给之后、Composer 与 Web 站点配置之前这符合依赖顺序先有数据库才能为站点与应用提供数据存储。你可以单独运行dep provision:databases也可以随完整供给流程运行dep provision运行dep provision时provision:configure见 recipe/provision.php会提前收集db_type并仅在db_type ! none时继续收集db_user、db_name、db_password随后把收集到的参数以host(...)-set(...)代码块的形式打印出来方便固化到部署脚本中。运行示例以默认交互方式单独执行数据库供给dep provision:databases终端将依次出现如下交互默认值用括号标注What DB to install? [0] none: [1] mysql [2] mariadb [3] postgresql 1 DB name: (prod) myapp DB user: (deployer) myapp_user DB password: ********全部回答后Deployer 通过 SSH 以rootprovision_user身份在服务器上完成安装、建用户、授权与建库。注意由于数据库密码默认来自交互输入在 CI/CD 等非交互环境中务必提前通过set(db_password, ...)固定或在host()定义中注入。六、源码级要点总结要点实现位置说明配置项惰性求值recipe/provision/databases.phpset() 闭包访问时才触发askChoice/ask/askHiddenResponse交互式选择src/functions.phpaskChoice基于 SymfonyChoiceQuestionnone为默认索引 0隐藏密码输入src/functions.phpaskHiddenResponse设置setHidden(true)且禁止回退明文密码脱敏src/functions.phprun()的secrets参数%db_password%占位符不落入日志任务分发src/functions.phpinvoke(provision: . $dbType)动态调用子任务单机限制recipe/provision/databases.php-limit(1)避免多主机重复建库安装超时src/functions.phptimeout: 900覆盖默认 300 秒Ubuntu 支持recipe/provision.phpprovision:check仅校验 Ubuntu 20其余系统会告警七、实践建议与注意事项首次供给务必交互式运行db_password默认无默认值非交互环境-q下askHiddenResponse会返回空字符串导致创建出空密码用户务必显式配置。db_type固定为none可跳过若服务器已有数据库如云厂商托管 RDS将db_type设为noneprovision:databases会立即返回不干扰既有环境。MySQL/MariaDB 是幂等的CREATE USER IF NOT EXISTS、GRANT、CREATE DATABASE IF NOT EXISTS均可重复执行PostgreSQL 分支非幂等CREATE DATABASE/CREATE USER无IF NOT EXISTS重复执行会报错需注意脚本重跑场景。远程访问授权MySQL/MariaDB 分支创建了0.0.0.0和%两个主机项允许数据库用户从任意地址连接若仅需本机访问可自行覆写任务收紧 host 匹配。安全基线供给完成后建议在防火墙provision:firewall已放行 22/80/443见 recipe/provision.php基础上根据实际需要决定是否对外暴露数据库端口本配方默认不修改 MySQL/MariaDB 的监听配置。相关资源配方源码recipe/provision/databases.php自动生成文档docs/recipe/provision/databases.md上层供给配方recipe/provision.php 与 docs/recipe/provision.md交互函数实现src/functions.phpask/askChoice/askHiddenResponse/run/invoke/set/get兄弟供给模块recipe/provision/nodejs.php、recipe/provision/php.php、recipe/provision/user.php、recipe/provision/website.php【免费下载链接】deployerThe PHP deployment tool with support for popular frameworks out of the box项目地址: https://gitcode.com/gh_mirrors/de/deployer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表