指南:零停機部署、共享文件與可寫目錄配置詳解)
Deployer 部署 Prestashop 項目實戰(zhàn)指南零停機部署、共享文件與可寫目錄配置詳解【免費下載鏈接】deployerThe PHP deployment tool with support for popular frameworks out of the box項目地址: https://gitcode.com/gh_mirrors/de/deployerDeployer 是一款用 PHP 編寫的免費開源部署工具本文圍繞 docs/recipe/prestashop.md 講解如何用其官方 Prestashop 配方recipe將 Prestashop 電商應(yīng)用部署到遠程服務(wù)器涵蓋deploy任務(wù)完整執(zhí)行鏈、shared_files/shared_dirs/writable_dirs三組核心配置的默認值與覆蓋方式以及零停機發(fā)布、回滾與權(quán)限機制的源碼級原理。讀完本文你將能夠編寫一份可直接運行的 Prestashop 部署腳本并理解每次dep deploy在服務(wù)器上究竟發(fā)生了什么。認識 Prestashop 配方在deploy.php或deploy.yaml中引入 Prestashop 配方即可獲得整套部署能力require recipe/prestashop.php;該配方源碼位于 recipe/prestashop.php它僅依賴并擴展了 common 配方require_once __DIR__ . /common.php;同時通過add(recipes, [prestashop]);聲明自身身份。也就是說Prestashop 配方?jīng)]有引入任何額外依賴所有任務(wù)與默認配置都來自 common 配方及其內(nèi)部引入的 deploy/* 系列子配方。Deployer 面向 Prestashop 場景的核心價值有三點Provisioning服務(wù)器預(yù)置用provision配方自動完成服務(wù)器初始化創(chuàng)建用戶、安裝 PHP/Nginx/Caddy 等詳見 docs/recipe/provision.mdZero downtime deployment零停機部署通過“新版本目錄 原子切換符號鏈接”的方式發(fā)布期間舊版本持續(xù)對外服務(wù)Rollbacks回滾若發(fā)布后發(fā)現(xiàn)問題可一鍵回滾到上一版本。此外 Deployer 還以并行 SSH 連接加速執(zhí)行、天然支持所有主流 PHP 框架。更完整的入門指引見 docs/getting-started.md。安裝與初始化全局安裝推薦日常使用composer global require deployer/deployer或?qū)/.composer/vendor/bin加入PATH寫入.bashrc/.zshrc隨后在項目目錄運行dep init生成deploy.php。詳見 docs/installation.md。項目級安裝推薦 CI/CDcomposer require --dev deployer/deployer alias depvendor/bin/dep vendor/bin/dep init最小可用配置// deploy.php namespace Deployer; require recipe/prestashop.php; host(example.org) -set(remote_user, deployer) -set(deploy_path, ~/prestashop) -set(repository, gitgithub.com:your/prestashop.git);其中deploy_path為必填項若未設(shè)置recipe/common.php 會直接拋出ConfigurationException提示 “Please, specifydeploy_path.”。repository默認值為空字符串部署前必須顯式設(shè)置。deploy 任務(wù)執(zhí)行鏈一次部署的完整旅程Prestashop 配方的deploy任務(wù)定義在 recipe/prestashop.phpdesc(Deploys your project); task( deploy, [ deploy:prepare, deploy:vendors, deploy:publish, ], );它在 common 配方的deploy僅deploy:preparedeploy:publish基礎(chǔ)上額外插入了deploy:vendors通過 Composer 安裝 PHP 依賴Prestashop 依賴 vendor 目錄這一步必不可少。整體調(diào)用樹如下deploy:prepare—— 準備一個新版本releasedeploy:info—— 展示部署信息主機、倉庫、分支等deploy:setup—— 在服務(wù)器上創(chuàng)建部署目錄結(jié)構(gòu)releases、shared、.dep等deploy:lock—— 加部署鎖防止并發(fā)部署deploy:release—— 準備 release 目錄新版本號deploy:update_code—— 拉取代碼到 release 目錄deploy:env—— 配置.env文件deploy:shared—— 為共享文件與目錄創(chuàng)建符號鏈接deploy:writable—— 設(shè)置可寫目錄權(quán)限deploy:vendors—— 在 release 目錄安裝 Composer 依賴deploy:publish—— 發(fā)布該版本deploy:symlink—— 將current符號鏈接切換到新 releasedeploy:unlock—— 解除部署鎖deploy:cleanup—— 清理過期 release默認保留 10 個deploy:success—— 輸出成功信息deploy:prepare與deploy:publish都是定義在 recipe/common.php 的組任務(wù)group task上述子任務(wù)順序與源碼完全一致。發(fā)布失敗時Deployer 會自動觸發(fā)deploy:failed鉤子見 recipe/common.php 的fail(deploy, deploy:failed);。執(zhí)行部署dep deploy失敗時可按--start-from從指定步驟繼續(xù)例如dep deploy --start-from deploy:shared或執(zhí)行dep ssh登錄服務(wù)器排查dep releases可查看歷史版本列表。配置一shared_files共享文件Prestashop 配方覆蓋override了 deploy/shared 配方 中默認的shared_files空數(shù)組默認值如下見 recipe/prestashop.phpset(shared_files, [ config/settings.inc.php, .htaccess, ]);config/settings.inc.phpPrestashop 1.x 的核心數(shù)據(jù)庫配置文件保存數(shù)據(jù)庫主機、用戶名、密碼與表前綴等連接信息屬于每臺服務(wù)器各不相同的敏感配置絕不能隨代碼發(fā)布被覆蓋.htaccessApache 下的 URL 重寫與訪問控制配置通常與服務(wù)器環(huán)境RewriteBase、域名、SSL 重定向強相關(guān)。deploy:shared任務(wù)recipe/deploy/shared.php的處理邏輯是將共享文件復(fù)制到{{deploy_path}}/shared目錄刪除 release 中的原文件再建立shared/file→{{release_path}}/file的符號鏈接。每次新 release 都會自動鏈接到同一份持久化文件因此數(shù)據(jù)庫配置、偽靜態(tài)規(guī)則在版本更新后保持不變。若 shared 目錄中文件尚不存在而 release 中存在會先復(fù)制再鏈接文件目錄缺失時會自動mkdir -p并touch占位。如需追加額外共享文件可在你的deploy.php中合并覆蓋set(shared_files, array_merge(get(shared_files), [ config/xml, // 例如共享 XML 緩存 var/logs/.htaccess, ]));配置二shared_dirs共享目錄覆蓋shared_dirs默認值如下recipe/prestashop.phpset(shared_dirs, [ img, log, download, upload, translations, mails, themes/default-bootstrap/lang, themes/default-bootstrap/mails, themes/default-bootstrap/pdf/lang, ]);這些目錄都是 Prestashop 運行期會持續(xù)寫入、且必須跨版本保留的業(yè)務(wù)數(shù)據(jù)img商品、分類、品牌等圖片上傳目錄log日志輸出目錄download虛擬商品下載文件upload用戶自定義上傳如附加文件translations后臺翻譯文件覆蓋語言包mails郵件模板可能被運營定制themes/default-bootstrap/lang、themes/default-bootstrap/mails、themes/default-bootstrap/pdf/lang默認主題下的語言、郵件與 PDF 模板翻譯目錄對應(yīng) Prestashop 1.6 默認主題結(jié)構(gòu)若使用其他主題請自行調(diào)整。共享目錄的處理機制與共享文件一致release 中的對應(yīng)目錄被移動到shared目錄并替換為符號鏈接。特別地deploy:shared會先對shared_dirs做重復(fù)路徑校驗——若兩個共享目錄互為包含關(guān)系如img與img/cache會拋出 “Can not share same dirs” 異常見 recipe/deploy/shared.php避免產(chǎn)生沖突的符號鏈接。提示切換默認主題時務(wù)必同步調(diào)整shared_dirs與下文writable_dirs中的主題路徑否則新主題的翻譯/郵件目錄將無法跨版本共享。配置三writable_dirs可寫目錄覆蓋writable_dirs默認值如下recipe/prestashop.phpset(writable_dirs, [ img, log, cache, download, upload, translations, mails, themes/default-bootstrap/lang, themes/default-bootstrap/mails, themes/default-bootstrap/pdf/lang, themes/default-bootstrap/cache, ]);該列表在shared_dirs基礎(chǔ)上增加了cacheSmarty 模板編譯緩存與themes/default-bootstrap/cache主題緩存。deploy:writable任務(wù)會先在{{release_or_current_path}}下mkdir -p創(chuàng)建這些目錄再按writable_mode賦予權(quán)限。writable_mode 權(quán)限模式writable_mode默認值為acl見 recipe/deploy/writable.php可選值如下模式行為適用場景acl默認使用setfaclLinux或chmod amacOS為 http 用戶與部署用戶授予rwX權(quán)限現(xiàn)代 Linux ext4推薦首選chown將目錄屬主改為自動探測的http_user傳統(tǒng)主機目錄歸 Web 用戶所有chgrp改屬組為http_group并加grwx多用戶協(xié)作環(huán)境chmod按writable_chmod_mode默認0755執(zhí)行 chmod簡單直接權(quán)限粒度較粗sticky設(shè)置屬組與目錄 sticky 位grwxs類 Unix 共享目錄慣例skip不做任何權(quán)限變更已手工配置好權(quán)限的環(huán)境常用相關(guān)參數(shù)定義于 recipe/deploy/writable.phpwritable_use_sudo默認false權(quán)限命令是否加sudowritable_recursive默認false是否遞歸-R應(yīng)用writable_chmod_mode默認0755chmod模式下的權(quán)限位writable_acl_groups默認[]額外授予寫權(quán)限的用戶組列表writable_acl_force默認false無 sudo 時強制重放 ACL用于修復(fù)深層嵌套目錄http_user/http_group自動從進程列表探測apache/httpd/www-data/nginx失敗時拋異常要求手動指定。deploy:writable會拒絕絕對路徑writable_dirs中出現(xiàn)以空格分隔的/開頭路徑將拋出異常并始終基于 release/current 目錄執(zhí)行mkdir -p后再做權(quán)限設(shè)置見 recipe/deploy/writable.php。需要切換到chmod模式時可在deploy.php中配置set(writable_mode, chmod); set(writable_chmod_mode, 0775); set(writable_use_sudo, true);服務(wù)器目錄布局與零停機原理首次部署成功后{{deploy_path}}下的結(jié)構(gòu)如下可對照 docs/getting-started.md~/prestashop // deploy_path |- current - releases/1 // 指向當前版本的符號鏈接 |- releases // 歷史版本目錄 |- 1 // 最新 release |- config/settings.inc.php - ../../shared/config/settings.inc.php |- img - ../../shared/img |- ... |- shared // 跨版本共享的文件與目錄 |- config/settings.inc.php |- img |- ... |- .dep // Deployer 內(nèi)部狀態(tài)鎖、部署記錄等零停機的關(guān)鍵在deploy:publish階段的原子切換deploy:symlink使用ln -nfs必要時帶--relative由use_relative_symlink自動探測見 recipe/common.php將current從舊 release 重定向到新 release。由于符號鏈接替換是原子操作切換瞬間舊版本仍對外服務(wù)切完后流量無縫落到新版本期間無任何請求中斷窗口。Web 服務(wù)器只需將站點根目錄指向current目錄Nginx 示例見 docs/getting-started.mdPrestashop 在current下訪問共享的img、settings.inc.php等資源即可。版本保留數(shù)量由keep_releases控制默認 10recipe/common.phpdeploy:cleanup會在每次發(fā)布后清理超出數(shù)量的舊 release。若新版本異常執(zhí)行dep rollback即可讓current指回上一版本——回滾同樣依賴符號鏈接原子切換因此過程同樣零停機。Prestashop 配方基于 common 配方天然繼承了這一整套能力。實戰(zhàn)建議與進階配置緩存清理Prestashop 的 Smarty 緩存可能造成版本更新后頁面不刷新可在deploy.php中新增自定義任務(wù)并在發(fā)布前清理緩存目錄task(prestashop:clear-cache, function () { cd({{release_or_current_path}}); run(rm -rf var/cache/prod/* var/cache/dev/* 2/dev/null || true); })-once(); before(deploy:symlink, prestashop:clear-cache);部署構(gòu)建與 CI在 CI 場景下可以借助deploy:update_code的子目錄策略sub_directoryarchive 策略下有效只發(fā)布倉庫內(nèi)指定子目錄生產(chǎn)環(huán)境依賴建議依賴deploy:vendors在服務(wù)器上以--no-dev --optimize-autoloader安裝相關(guān)默認值見 docs/recipe/deploy/vendors.md。也可參考 docs/ci-cd.md 設(shè)計流水線。部署失敗排查首次部署失敗常見原因是deploy_path未設(shè)置或 SSH 密鑰未配置deploy:writable報 “Cant detect http user name” 時手動設(shè)置set(http_user, www-data);ACL 模式缺少setfacl時按提示執(zhí)行sudo apt-get install acl或切換為chmod/chgrp模式。小結(jié)Prestashop 配方本身極簡約 46 行源碼其價值在于精準的三組默認配置config/settings.inc.php與.htaccess跨版本共享、8 個業(yè)務(wù)目錄持久化共享、11 個可寫目錄自動授權(quán)。配合 common 配方提供的deploy:prepare/deploy:publish任務(wù)鏈、符號鏈接原子切換與keep_releases清理機制即可在 Prestashop 項目上獲得開箱即用的零停機部署與回滾能力。將dep deploy接入 CI 后每次提交都能以可重復(fù)、可回滾、可審計的方式發(fā)布上線?!久赓M下載鏈接】deployerThe PHP deployment tool with support for popular frameworks out of the box項目地址: https://gitcode.com/gh_mirrors/de/deployer創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考