{"id":125,"date":"2025-10-02T00:00:00","date_gmt":"2025-10-01T22:00:00","guid":{"rendered":"https:\/\/helloblog.io\/el\/zero-downtime-deployments-wordpress-me-trellis\/"},"modified":"2026-01-20T06:38:52","modified_gmt":"2026-01-20T05:38:52","slug":"zero-downtime-deployments-wordpress-me-trellis","status":"publish","type":"post","link":"https:\/\/helloblog.io\/el\/zero-downtime-deployments-wordpress-me-trellis\/","title":{"rendered":"Zero downtime deployments \u03b3\u03b9\u03b1 WordPress \u03bc\u03b5 Trellis: atomic releases, rollback \u03ba\u03b1\u03b9 hooks"},"content":{"rendered":"\n<p>\u03a3\u03c4\u03bf WordPress \u03bf\u03b9\u03ba\u03bf\u03c3\u03cd\u03c3\u03c4\u03b7\u03bc\u03b1, \u03c4\u03bf deployment \u03c3\u03c5\u03c7\u03bd\u03ac \u03c0\u03b1\u03c1\u03b1\u03bc\u03ad\u03bd\u03b5\u03b9 \u03bc\u03b9\u03b1 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1 \u00ab\u03b1\u03bd\u03ad\u03b2\u03b1\u03c3\u03b5 \u03b1\u03c1\u03c7\u03b5\u03af\u03b1 \u03ba\u03b1\u03b9 \u03c0\u03c1\u03bf\u03c3\u03b5\u03c5\u03c7\u03ae\u03c3\u03bf\u03c5\u00bb \u2014 \u03b5\u03b9\u03b4\u03b9\u03ba\u03ac \u03cc\u03c4\u03b1\u03bd \u03c4\u03bf project \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c1\u03ba\u03b5\u03c4\u03ac plugins, custom theme, Composer dependencies \u03ae build \u03b2\u03ae\u03bc\u03b1\u03c4\u03b1. \u03a3\u03b5 \u03c0\u03b9\u03bf \u201c\u03bc\u03bf\u03bd\u03c4\u03ad\u03c1\u03bd\u03b1\u201d stacks, \u03c4\u03bf <strong>zero downtime deployment<\/strong> \u03b8\u03b5\u03c9\u03c1\u03b5\u03af\u03c4\u03b1\u03b9 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03bf: \u03bf \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7\u03c2 \u03b4\u03b5\u03bd \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03ba\u03b1\u03c4\u03b1\u03bb\u03ac\u03b2\u03b5\u03b9 \u03c0\u03bf\u03c4\u03ad \u03cc\u03c4\u03b9 \u03ad\u03b3\u03b9\u03bd\u03b5 release.<\/p>\n\n\n\n<p>\u03a4\u03bf <strong>Trellis<\/strong> (\u03c4\u03bf server\/provisioning &#038; deployment framework \u03c4\u03c9\u03bd Roots, \u03b2\u03b1\u03c3\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf \u03c3\u03b5 Ansible) \u03c6\u03ad\u03c1\u03bd\u03b5\u03b9 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bc\u03bf\u03bd\u03c4\u03ad\u03bb\u03bf \u03ba\u03b1\u03b9 \u03c3\u03c4\u03bf WordPress, \u03bc\u03b5 <strong>atomic<\/strong> \u03ba\u03b1\u03b9 <strong>immutable<\/strong> deployments out of the box. \u039a\u03b1\u03b9 \u03c4\u03bf \u03b5\u03bd\u03b4\u03b9\u03b1\u03c6\u03ad\u03c1\u03bf\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03cc\u03c4\u03b9 \u03b4\u03b5\u03bd \u03c7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b1\u03bb\u03bb\u03ac\u03be\u03b5\u03b9\u03c2 \u03cc\u03bb\u03bf \u03c4\u03bf workflow \u03c3\u03bf\u03c5: \u03b1\u03c1\u03ba\u03b5\u03c4\u03bf\u03af \u03c4\u03bf \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03bf\u03cd\u03bd <em>\u03bc\u03cc\u03bd\u03bf<\/em> \u03b3\u03b9\u03b1 deploy \u03b5\u03bd\u03cc\u03c2 Bedrock site, \u03ba\u03c1\u03b1\u03c4\u03ce\u03bd\u03c4\u03b1\u03c2 \u03c4\u03bf\u03c0\u03b9\u03ba\u03ac \u03cc,\u03c4\u03b9 \u03c0\u03b5\u03c1\u03b9\u03b2\u03ac\u03bb\u03bb\u03bf\u03bd \u03b8\u03ad\u03bb\u03bf\u03c5\u03bd (Valet, Lando, DDEV \u03ba.\u03bb\u03c0.).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u03a4\u03b9 \u03c3\u03b7\u03bc\u03b1\u03af\u03bd\u03b5\u03b9 \u03c3\u03c4\u03b7\u03bd \u03c0\u03c1\u03ac\u03be\u03b7 \u201czero downtime\u201d \u03c3\u03c4\u03bf deployment<\/h2>\n\n\n\n<p>Zero downtime \u03c3\u03b7\u03bc\u03b1\u03af\u03bd\u03b5\u03b9 \u03cc\u03c4\u03b9 \u03c4\u03bf site \u03c0\u03b1\u03c1\u03b1\u03bc\u03ad\u03bd\u03b5\u03b9 \u03c0\u03bb\u03ae\u03c1\u03c9\u03c2 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03b9\u03ba\u03cc \u03ba\u03b1\u03b8\u2019 \u03cc\u03bb\u03b7 \u03c4\u03b7 \u03b4\u03b9\u03ac\u03c1\u03ba\u03b5\u03b9\u03b1 \u03c4\u03bf\u03c5 deploy. \u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03c0\u03b5\u03c1\u03af\u03bf\u03b4\u03bf\u03c2 \u03cc\u03c0\u03bf\u03c5 \u03bf server \u03c3\u03b5\u03c1\u03b2\u03af\u03c1\u03b5\u03b9 \u00ab\u03bc\u03b9\u03c3\u03ac \u03c0\u03b1\u03bb\u03b9\u03ac, \u03bc\u03b9\u03c3\u03ac \u03ba\u03b1\u03b9\u03bd\u03bf\u03cd\u03c1\u03b9\u03b1\u00bb \u03b1\u03c1\u03c7\u03b5\u03af\u03b1, \u03bf\u03cd\u03c4\u03b5 \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf \u03cc\u03c0\u03bf\u03c5 \u03bb\u03b5\u03af\u03c0\u03bf\u03c5\u03bd dependencies \u03ae \u03b4\u03b5\u03bd \u03ad\u03c7\u03b5\u03b9 \u03bf\u03bb\u03bf\u03ba\u03bb\u03b7\u03c1\u03c9\u03b8\u03b5\u03af \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf build step.<\/p>\n\n\n\n<p>\u03a4\u03bf \u03ba\u03bb\u03b5\u03b9\u03b4\u03af \u03b5\u03b4\u03ce \u03b5\u03af\u03bd\u03b1\u03b9 \u03b7 \u03bb\u03ad\u03be\u03b7 <strong>atomic<\/strong>: \u03b7 \u03bc\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u03c0\u03b1\u03bb\u03b9\u03ac \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03c3\u03c4\u03b7 \u03bd\u03ad\u03b1 \u03b3\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03c3\u03b5 \u03bc\u03af\u03b1 \u03ba\u03af\u03bd\u03b7\u03c3\u03b7 (\u03c3\u03b1\u03bd \u201cswitch\u201d), \u03c7\u03c9\u03c1\u03af\u03c2 \u03b5\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03b7 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u03a4\u03bf \u03ba\u03bb\u03b1\u03c3\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03c3\u03c4\u03b1 \u03c0\u03b1\u03c1\u03b1\u03b4\u03bf\u03c3\u03b9\u03b1\u03ba\u03ac WordPress deployments<\/h2>\n\n\n\n<p>\u039f\u03b9 \u03c0\u03b9\u03bf \u03c3\u03c5\u03bd\u03b7\u03b8\u03b9\u03c3\u03bc\u03ad\u03bd\u03b5\u03c2 \u03c0\u03c1\u03bf\u03c3\u03b5\u03b3\u03b3\u03af\u03c3\u03b5\u03b9\u03c2 \u03c3\u03c4\u03bf WordPress \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03ba\u03cc\u03bc\u03b1 \u03bf\u03b9 \u03c0\u03b1\u03c1\u03b1\u03ba\u03ac\u03c4\u03c9 \u2014 \u03ba\u03b1\u03b9 \u03cc\u03bb\u03b5\u03c2 \u03ad\u03c7\u03bf\u03c5\u03bd \u03c4\u03bf \u03af\u03b4\u03b9\u03bf \u03b8\u03b5\u03bc\u03b5\u03bb\u03b9\u03ce\u03b4\u03b5\u03c2 \u03bc\u03b5\u03b9\u03bf\u03bd\u03ad\u03ba\u03c4\u03b7\u03bc\u03b1: \u03b5\u03bd\u03b7\u03bc\u03b5\u03c1\u03ce\u03bd\u03bf\u03c5\u03bd \u03b1\u03c1\u03c7\u03b5\u03af\u03b1 <em>in-place<\/em> \u03cc\u03c3\u03bf \u03c4\u03bf site \u03b5\u03af\u03bd\u03b1\u03b9 live.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>FTP uploads<\/strong>: \u03b1\u03bd\u03b5\u03b2\u03ac\u03b6\u03b5\u03b9\u03c2 \u03b1\u03bb\u03bb\u03b1\u03b3\u03bc\u03ad\u03bd\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03b1 \u03ba\u03b1\u03b9 \u03b3\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 overwrite. \u0391\u03bd \u03c4\u03bf upload \u03ba\u03c1\u03b1\u03c4\u03ae\u03c3\u03b5\u03b9 \u03bb\u03b5\u03c0\u03c4\u03ac, \u03bf \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7\u03c2 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u201c\u03c0\u03b5\u03c4\u03cd\u03c7\u03b5\u03b9\u201d \u03bc\u03af\u03be\u03b7 \u03c0\u03b1\u03bb\u03b9\u03ce\u03bd\/\u03bd\u03ad\u03c9\u03bd \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd (fatal errors, missing classes, broken templates).<\/li>\n\n\n<li><strong>File sync (\u03c0.\u03c7. <code>rsync<\/code>)<\/strong>: \u03c0\u03b9\u03bf \u03b3\u03c1\u03ae\u03b3\u03bf\u03c1\u03bf \u03b1\u03c0\u03cc FTP, \u03b1\u03bb\u03bb\u03ac \u03c0\u03ac\u03bb\u03b9 \u03b3\u03c1\u03ac\u03c6\u03b5\u03b9 \u03c0\u03ac\u03bd\u03c9 \u03c3\u03c4\u03bf live filesystem. \u03a4\u03bf \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03c4\u03b7\u03c2 \u03bc\u03af\u03be\u03b7\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd \u03b4\u03b5\u03bd \u03b5\u03be\u03b1\u03c6\u03b1\u03bd\u03af\u03b6\u03b5\u03c4\u03b1\u03b9.<\/li>\n\n\n<li><strong>Plugin-based deployment \u03c3\u03b5 managed hosts<\/strong>: \u03b2\u03bf\u03bb\u03b9\u03ba\u03cc, \u03b1\u03bb\u03bb\u03ac \u03c3\u03c5\u03c7\u03bd\u03ac \u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b5\u03af \u03c4\u03b7\u03bd \u03af\u03b4\u03b9\u03b1 \u03bb\u03bf\u03b3\u03b9\u03ba\u03ae (update in-place) \u03ba\u03b1\u03b9 \u03c3\u03c5\u03bd\u03ae\u03b8\u03c9\u03c2 \u03b4\u03b5\u03bd \u03b4\u03af\u03bd\u03b5\u03b9 \u03c0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03b9\u03ba\u03ac \u03ba\u03b1\u03b8\u03b1\u03c1\u03cc rollback \u03bc\u03b7\u03c7\u03b1\u03bd\u03b9\u03c3\u03bc\u03cc.<\/li>\n\n<\/ul>\n\n\n\n<p>\u039a\u03bf\u03b9\u03bd\u03ac \u03c3\u03c5\u03bc\u03c0\u03c4\u03ce\u03bc\u03b1\u03c4\u03b1: \u03c3\u03c4\u03b9\u03b3\u03bc\u03b9\u03b1\u03af\u03b1 500\u03ac\u03c1\u03b9\u03b1, \u201cClass not found\u201d \u03bb\u03cc\u03b3\u03c9 Composer autoload \u03c0\u03bf\u03c5 \u03b4\u03b5\u03bd \u03ad\u03c7\u03b5\u03b9 \u03bf\u03bb\u03bf\u03ba\u03bb\u03b7\u03c1\u03ce\u03c3\u03b5\u03b9, assets mismatch, \u03ba\u03b1\u03b9 \u03c4\u03bf \u03c0\u03b9\u03bf \u03b5\u03bd\u03bf\u03c7\u03bb\u03b7\u03c4\u03b9\u03ba\u03cc: \u03cc\u03c4\u03b1\u03bd \u03ba\u03ac\u03c4\u03b9 \u03c0\u03ac\u03b5\u03b9 \u03c3\u03c4\u03c1\u03b1\u03b2\u03ac \u03b4\u03b5\u03bd \u03ad\u03c7\u03b5\u03b9\u03c2 \u03b5\u03cd\u03ba\u03bf\u03bb\u03bf, \u03ac\u03bc\u03b5\u03c3\u03bf \u03b3\u03cd\u03c1\u03b9\u03c3\u03bc\u03b1 \u03c3\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7 \u03c3\u03c4\u03b1\u03b8\u03b5\u03c1\u03ae \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u03a0\u03ce\u03c2 \u03c4\u03bf Trellis \u03c4\u03bf \u03bb\u03cd\u03bd\u03b5\u03b9: atomic + immutable releases<\/h2>\n\n\n\n<p>\u03a4\u03bf Trellis \u03b5\u03c6\u03b1\u03c1\u03bc\u03cc\u03b6\u03b5\u03b9 \u03ad\u03bd\u03b1 deployment \u03bc\u03bf\u03bd\u03c4\u03ad\u03bb\u03bf \u03c0\u03bf\u03c5 \u03c3\u03c5\u03bd\u03b1\u03bd\u03c4\u03ac\u03c2 \u03c3\u03b5 \u03c3\u03cd\u03b3\u03c7\u03c1\u03bf\u03bd\u03b1 apps: \u03ba\u03ac\u03b8\u03b5 deploy \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03b5\u03af \u03ad\u03bd\u03b1 <strong>\u03bd\u03ad\u03bf, \u03b1\u03c0\u03bf\u03bc\u03bf\u03bd\u03c9\u03bc\u03ad\u03bd\u03bf release directory<\/strong>. \u03a4\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03b1 \u03b5\u03bd\u03cc\u03c2 release \u03b4\u03b5\u03bd \u201c\u03c0\u03b5\u03b9\u03c1\u03ac\u03b6\u03bf\u03bd\u03c4\u03b1\u03b9\u201d \u03bc\u03b5\u03c4\u03ac (immutable). \u038c\u03c4\u03b1\u03bd \u03cc\u03bb\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03c4\u03bf\u03b9\u03bc\u03b1, \u03b3\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03c4\u03bf switch \u03bc\u03b5 \u03ad\u03bd\u03b1 <strong>symlink<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0397 \u03b4\u03bf\u03bc\u03ae \u03c6\u03b1\u03ba\u03ad\u03bb\u03c9\u03bd \u03c3\u03c4\u03bf\u03bd server<\/h3>\n\n\n\n<p>\u039c\u03b5 Trellis, \u03ad\u03bd\u03b1 \u03c4\u03c5\u03c0\u03b9\u03ba\u03cc site \u03c3\u03c4\u03bf\u03bd server \u03ba\u03b1\u03c4\u03b1\u03bb\u03ae\u03b3\u03b5\u03b9 \u03bd\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c5\u03c4\u03ae \u03c4\u03b7 \u03bb\u03bf\u03b3\u03b9\u03ba\u03ae \u03b4\u03bf\u03bc\u03ae:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/srv\/www\/example.com\/\n\u251c\u2500\u2500 current\/             # Symlink \u03c0\u03c1\u03bf\u03c2 \u03c4\u03bf \u03b5\u03bd\u03b5\u03c1\u03b3\u03cc release\n\u251c\u2500\u2500 releases\/            # \u038c\u03bb\u03b1 \u03c4\u03b1 deployed releases\n\u2502   \u251c\u2500\u2500 20250930124530\/\n\u2502   \u251c\u2500\u2500 20250930083045\/\n\u2502   \u2514\u2500\u2500 20250930141622\/  # \u03a0\u03b9\u03bf \u03c0\u03c1\u03cc\u03c3\u03c6\u03b1\u03c4\u03bf\n\u251c\u2500\u2500 shared\/              # \u039a\u03bf\u03b9\u03bd\u03ac\/shared \u03b1\u03bd\u03ac\u03bc\u03b5\u03c3\u03b1 \u03c3\u03b5 releases\n\u2502   \u2514\u2500\u2500 uploads\/\n\u2514\u2500\u2500 logs\/\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">\/srv\/www\/example.com\/<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> current\/<\/span><span style=\"color:#6A737D\">             # Symlink \u03c0\u03c1\u03bf\u03c2 \u03c4\u03bf \u03b5\u03bd\u03b5\u03c1\u03b3\u03cc release<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> releases\/<\/span><span style=\"color:#6A737D\">            # \u038c\u03bb\u03b1 \u03c4\u03b1 deployed releases<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u2502<\/span><span style=\"color:#9ECBFF\">   \u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> 20250930124530\/<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u2502<\/span><span style=\"color:#9ECBFF\">   \u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> 20250930083045\/<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u2502<\/span><span style=\"color:#9ECBFF\">   \u2514\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> 20250930141622\/<\/span><span style=\"color:#6A737D\">  # \u03a0\u03b9\u03bf \u03c0\u03c1\u03cc\u03c3\u03c6\u03b1\u03c4\u03bf<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> shared\/<\/span><span style=\"color:#6A737D\">              # \u039a\u03bf\u03b9\u03bd\u03ac\/shared \u03b1\u03bd\u03ac\u03bc\u03b5\u03c3\u03b1 \u03c3\u03b5 releases<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u2502<\/span><span style=\"color:#9ECBFF\">   \u2514\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> uploads\/<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u2514\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> logs\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\u039f web server (Nginx) \u03c3\u03b5\u03c1\u03b2\u03af\u03c1\u03b5\u03b9 \u03c0\u03ac\u03bd\u03c4\u03b1 \u03b1\u03c0\u03cc \u03c4\u03bf <code>current\/<\/code>, \u03c4\u03bf \u03bf\u03c0\u03bf\u03af\u03bf \u03c3\u03c4\u03b7\u03bd \u03c0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03b9\u03ba\u03cc\u03c4\u03b7\u03c4\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 symlink \u03c0\u03bf\u03c5 \u03b4\u03b5\u03af\u03c7\u03bd\u03b5\u03b9 \u03c3\u03b5 <em>\u03ad\u03bd\u03b1<\/em> release \u03bc\u03ad\u03c3\u03b1 \u03c3\u03c4\u03bf <code>releases\/<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u03a4\u03b9 \u03ba\u03ac\u03bd\u03b5\u03b9 \u03c4\u03bf <code>trellis deploy production<\/code> \u03b2\u03ae\u03bc\u03b1-\u03b2\u03ae\u03bc\u03b1<\/h3>\n\n\n\n<p>\u038c\u03c4\u03b1\u03bd \u03c4\u03c1\u03ad\u03c7\u03b5\u03b9\u03c2:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>trellis deploy production\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">trellis<\/span><span style=\"color:#9ECBFF\"> deploy<\/span><span style=\"color:#9ECBFF\"> production<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\u03c4\u03bf Trellis \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03af \u03bc\u03b9\u03b1 \u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03af\u03b1 \u03c3\u03c4\u03b1\u03b4\u03af\u03c9\u03bd \u03c0\u03bf\u03c5 \u03ba\u03c1\u03b1\u03c4\u03ac \u03c4\u03bf live site \u00ab\u03ba\u03b1\u03b8\u03b1\u03c1\u03cc\u00bb \u03b1\u03c0\u03cc \u03b5\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03b5\u03c2 \u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ac\u03c3\u03b5\u03b9\u03c2:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Initialize<\/strong>: \u03b4\u03b9\u03b1\u03c3\u03c6\u03b1\u03bb\u03af\u03b6\u03b5\u03b9 \u03cc\u03c4\u03b9 \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03b7 \u03b4\u03bf\u03bc\u03ae \u03c6\u03b1\u03ba\u03ad\u03bb\u03c9\u03bd \u03ba\u03b1\u03b9 \u03b1\u03bd\u03bf\u03af\u03b3\u03b5\u03b9 \u03bd\u03ad\u03bf release directory \u03bc\u03b5 timestamp.<\/li>\n\n\n<li><strong>Update<\/strong>: \u03ba\u03ac\u03bd\u03b5\u03b9 clone \u03c4\u03bf \u03c4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03bf code \u03b1\u03c0\u03cc \u03c4\u03bf Git repository \u03c3\u03b5 \u03c0\u03c1\u03bf\u03c3\u03c9\u03c1\u03b9\u03bd\u03cc source directory (\u03be\u03b5\u03c7\u03c9\u03c1\u03b9\u03c3\u03c4\u03ac \u03b1\u03c0\u03cc \u03c4\u03bf live).<\/li>\n\n\n<li><strong>Prepare<\/strong>: \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c6\u03b5\u03b9\/\u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c4\u03b5\u03af \u03c4\u03b1 \u03b1\u03c0\u03b1\u03c1\u03b1\u03af\u03c4\u03b7\u03c4\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03b1 \u03c3\u03c4\u03bf \u03bd\u03ad\u03bf release directory.<\/li>\n\n\n<li><strong>Build<\/strong>: \u03c4\u03c1\u03ad\u03c7\u03b5\u03b9 <code>composer install<\/code> \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03ba\u03b1\u03c4\u03ad\u03b2\u03bf\u03c5\u03bd dependencies.<\/li>\n\n\n<li><strong>Share<\/strong>: \u03ba\u03ac\u03bd\u03b5\u03b9 symlink shared resources (\u03c0.\u03c7. <code>uploads\/<\/code>) \u03b1\u03c0\u03cc \u03c4\u03bf <code>shared\/<\/code> \u03c3\u03c4\u03bf \u03bd\u03ad\u03bf release.<\/li>\n\n\n<li><strong>Finalize<\/strong>: \u03b1\u03bb\u03bb\u03ac\u03b6\u03b5\u03b9 \u03c4\u03bf <code>current<\/code> symlink \u03ce\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b5\u03af\u03c7\u03bd\u03b5\u03b9 \u03c3\u03c4\u03bf \u03bd\u03ad\u03bf release.<\/li>\n\n<\/ol>\n\n\n\n<p>\u03a4\u03bf \u03ba\u03c1\u03af\u03c3\u03b9\u03bc\u03bf \u03c3\u03b7\u03bc\u03b5\u03af\u03bf \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03bf <strong>Finalize<\/strong>: \u03c4\u03b7 \u03bc\u03af\u03b1 \u03c3\u03c4\u03b9\u03b3\u03bc\u03ae \u03c4\u03bf <code>current<\/code> \u03b4\u03b5\u03af\u03c7\u03bd\u03b5\u03b9 \u03c3\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf release, \u03c4\u03b7\u03bd \u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03b4\u03b5\u03af\u03c7\u03bd\u03b5\u03b9 \u03c3\u03c4\u03bf \u03ba\u03b1\u03b9\u03bd\u03bf\u03cd\u03c1\u03b9\u03bf. \u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03c7\u03c1\u03bf\u03bd\u03b9\u03ba\u03cc \u03b4\u03b9\u03ac\u03c3\u03c4\u03b7\u03bc\u03b1 \u03cc\u03c0\u03bf\u03c5 \u03c4\u03bf filesystem \u03c4\u03bf\u03c5 \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03cd release \u201c\u03c7\u03c4\u03af\u03b6\u03b5\u03c4\u03b1\u03b9\u201d \u03bc\u03c0\u03c1\u03bf\u03c3\u03c4\u03ac \u03c3\u03c4\u03b1 \u03bc\u03ac\u03c4\u03b9\u03b1 \u03c4\u03c9\u03bd \u03b5\u03c0\u03b9\u03c3\u03ba\u03b5\u03c0\u03c4\u03ce\u03bd.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0397 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03be\u03b5\u03c7\u03c9\u03c1\u03b9\u03c3\u03c4\u03cc \u03ba\u03b5\u03c6\u03ac\u03bb\u03b1\u03b9\u03bf<\/h2>\n\n\n\n<p>\u03a4\u03bf zero downtime \u03c0\u03bf\u03c5 \u03c0\u03c1\u03bf\u03c3\u03c6\u03ad\u03c1\u03b5\u03b9 \u03c4\u03bf Trellis \u03b1\u03c6\u03bf\u03c1\u03ac \u03c4\u03bf <strong>codebase\/filesystem<\/strong>. \u039f\u03b9 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ad\u03c2 \u03c3\u03c4\u03bf schema \u03c4\u03b7\u03c2 \u03b2\u03ac\u03c3\u03b7\u03c2 (migrations) \u03b5\u03af\u03bd\u03b1\u03b9 \u03ac\u03bb\u03bb\u03bf \u03b8\u03ad\u03bc\u03b1. \u038c\u03c0\u03c9\u03c2 \u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03b9 \u03ba\u03b1\u03b9 \u03c4\u03bf documentation \u03c4\u03bf\u03c5 Trellis, migrations \u03c3\u03b5 \u03bd\u03ad\u03bf schema \u03b4\u03b5\u03bd \u03b1\u03c0\u03bf\u03c4\u03b5\u03bb\u03bf\u03cd\u03bd \u03bc\u03ad\u03c1\u03bf\u03c2 \u03c4\u03bf\u03c5 deploy \u03b1\u03c0\u03cc \u03c0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae: <a href=\"https:\/\/roots.io\/trellis\/docs\/deployments\/\">https:\/\/roots.io\/trellis\/docs\/deployments\/<\/a><\/p>\n\n\n\n<p>\u0391\u03bd \u03b4\u03bf\u03c5\u03bb\u03b5\u03cd\u03b5\u03b9\u03c2 \u03bc\u03b5 <strong>Acorn<\/strong> (\u03c4\u03bf framework \u03c4\u03c9\u03bd Roots \u03c0\u03bf\u03c5 \u03c6\u03ad\u03c1\u03bd\u03b5\u03b9 Laravel-like \u03b4\u03bf\u03bc\u03ae \u03c3\u03b5 WordPress projects), \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c2 \u03bd\u03b1 \u03bf\u03c1\u03af\u03c3\u03b5\u03b9\u03c2 <strong>Laravel migrations<\/strong> \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03c4\u03b9\u03c2 \u03b5\u03bd\u03c4\u03ac\u03be\u03b5\u03b9\u03c2 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1: <a href=\"https:\/\/roots.io\/acorn\/docs\/creating-and-running-laravel-migrations\/\">https:\/\/roots.io\/acorn\/docs\/creating-and-running-laravel-migrations\/<\/a><\/p>\n\n\n\n<div class=\"wp-block-group callout callout-warning is-style-warning is-layout-flow wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:8px;padding-top:1rem;padding-right:1.5rem;padding-bottom:1rem;padding-left:1.5rem\">\n\n<h4 class=\"wp-block-heading callout-title\">\u03a0\u03c1\u03b1\u03ba\u03c4\u03b9\u03ba\u03ae \u03bb\u03b5\u03c0\u03c4\u03bf\u03bc\u03ad\u03c1\u03b5\u03b9\u03b1 \u03b3\u03b9\u03b1 \u03c0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03b9\u03ba\u03cc \u201czero downtime\u201d<\/h4>\n\n\n<p>\u0391\u03bd \u03ba\u03ac\u03bd\u03b5\u03b9\u03c2 migrations, \u03c3\u03c7\u03b5\u03b4\u03af\u03b1\u03c3\u03ad \u03c4\u03b5\u03c2 \u03bc\u03b5 backward compatibility \u03cc\u03c0\u03bf\u03c5 \u03b3\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 (\u03c0.\u03c7. additive changes) \u03ce\u03c3\u03c4\u03b5 \u03b7 \u03c0\u03b1\u03bb\u03b9\u03ac \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 \u03bd\u03b1 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c4\u03c1\u03ad\u03be\u03b5\u03b9 \u03b3\u03b9\u03b1 \u03bb\u03af\u03b3\u03bf \u03c0\u03ac\u03bd\u03c9 \u03c3\u03c4\u03bf \u03bd\u03ad\u03bf schema \u03b1\u03bd \u03c7\u03c1\u03b5\u03b9\u03b1\u03c3\u03c4\u03b5\u03af rollback.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Rollback \u03c7\u03c9\u03c1\u03af\u03c2 \u03b4\u03c1\u03ac\u03bc\u03b1\u03c4\u03b1: \u03b1\u03bb\u03bb\u03ac\u03b6\u03b5\u03b9\u03c2 symlink \u03ba\u03b1\u03b9 \u03c4\u03b5\u03bb\u03b5\u03af\u03c9\u03c3\u03b5\u03c2<\/h2>\n\n\n\n<p>\u03a3\u03b5 atomic\/immutable deployments, \u03c4\u03bf rollback \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c0\u03bb\u03cc \u03b5\u03c0\u03b5\u03b9\u03b4\u03ae \u03c4\u03b1 \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b1 releases \u03c0\u03b1\u03c1\u03b1\u03bc\u03ad\u03bd\u03bf\u03c5\u03bd \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 \u03c9\u03c2 \u03c0\u03bb\u03ae\u03c1\u03b5\u03b9\u03c2, \u00ab\u03c0\u03b1\u03b3\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2\u00bb \u03b5\u03ba\u03b4\u03cc\u03c3\u03b5\u03b9\u03c2. \u03a4\u03bf Trellis \u03c0\u03b1\u03c1\u03ad\u03c7\u03b5\u03b9 \u03ad\u03c4\u03bf\u03b9\u03bc\u03b7 \u03b5\u03bd\u03c4\u03bf\u03bb\u03ae:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>trellis rollback production\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">trellis<\/span><span style=\"color:#9ECBFF\"> rollback<\/span><span style=\"color:#9ECBFF\"> production<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\u0391\u03c5\u03c4\u03cc \u03b3\u03c5\u03c1\u03af\u03b6\u03b5\u03b9 \u03c4\u03bf <code>current<\/code> symlink \u03c3\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf release. \u0391\u03c0\u03cc \u03c0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae, \u03c4\u03bf Trellis \u03b4\u03b9\u03b1\u03c4\u03b7\u03c1\u03b5\u03af \u03c4\u03b1 5 \u03c0\u03b9\u03bf \u03c0\u03c1\u03cc\u03c3\u03c6\u03b1\u03c4\u03b1 releases \u03c3\u03c4\u03bf\u03bd server, \u03ce\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03ac\u03bc\u03b5\u03c3\u03b7 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03b5\u03c0\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae\u03c2.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deployment hooks: \u03b5\u03ba\u03b5\u03af \u03c0\u03bf\u03c5 \u03c4\u03bf Trellis \u03b3\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03c0\u03c1\u03b1\u03b3\u03bc\u03b1\u03c4\u03b9\u03ba\u03ac \u03b5\u03c5\u03ad\u03bb\u03b9\u03ba\u03c4\u03bf<\/h2>\n\n\n\n<p>\u03a4\u03bf Trellis \u03ad\u03c7\u03b5\u03b9 <strong>hooks<\/strong> (\u03b4\u03b7\u03bb\u03b1\u03b4\u03ae \u03c3\u03b7\u03bc\u03b5\u03af\u03b1 \u03b5\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7\u03c2 \u03bc\u03ad\u03c3\u03b1 \u03c3\u03c4\u03b7 \u03c1\u03bf\u03ae \u03c4\u03bf\u03c5 deploy) \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03ba\u03bf\u03c5\u03bc\u03c0\u03ce\u03c3\u03b5\u03b9\u03c2 \u03b4\u03b9\u03ba\u03ac \u03c3\u03bf\u03c5 tasks \u03c0\u03c1\u03b9\u03bd\/\u03bc\u03b5\u03c4\u03ac \u03b1\u03c0\u03cc \u03b2\u03b1\u03c3\u03b9\u03ba\u03ac \u03c3\u03c4\u03ac\u03b4\u03b9\u03b1. \u0395\u03bd\u03b4\u03b5\u03b9\u03ba\u03c4\u03b9\u03ba\u03ac:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>deploy_build_before<\/code> \u03ba\u03b1\u03b9 <code>deploy_build_after<\/code> \u03b3\u03b9\u03b1 custom build \u03b2\u03ae\u03bc\u03b1\u03c4\u03b1.<\/li>\n\n\n<li><code>deploy_finalize_before<\/code> \u03ba\u03b1\u03b9 <code>deploy_finalize_after<\/code> \u03b3\u03b9\u03b1 \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b5\u03c2 \u03c0\u03c1\u03b9\u03bd\/\u03bc\u03b5\u03c4\u03ac \u03c4\u03bf \u201cswitch\u201d.<\/li>\n\n\n<li>Hooks \u03b1\u03bd\u03ac \u03c3\u03c4\u03ac\u03b4\u03b9\u03bf (initialize, update, prepare, build, share, finalize) \u03b3\u03b9\u03b1 \u03c0\u03b9\u03bf \u03bb\u03b5\u03c0\u03c4\u03bf\u03bc\u03b5\u03c1\u03ae \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf.<\/li>\n\n<\/ul>\n\n\n\n<p>\u039c\u03b5 \u03b1\u03c5\u03c4\u03ac \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c2 \u03bd\u03b1 \u03c5\u03bb\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03b9\u03c2 \u03c0\u03c1\u03b1\u03ba\u03c4\u03b9\u03ba\u03ac patterns \u03c0\u03bf\u03c5 \u03c3\u03b5 WordPress projects \u03c3\u03c5\u03bd\u03b1\u03bd\u03c4\u03ac\u03bc\u03b5 \u03c3\u03c5\u03c7\u03bd\u03ac \u03c3\u03c4\u03b7\u03bd \u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03ae: backup \u03c0\u03c1\u03b9\u03bd \u03c4\u03bf deploy, cache clears \u03bc\u03b5\u03c4\u03ac \u03c4\u03bf deploy, notifications, \u03ae \u03b1\u03ba\u03cc\u03bc\u03b1 \u03ba\u03b1\u03b9 smoke tests \u03c0\u03ac\u03bd\u03c9 \u03c3\u03c4\u03bf \u03bd\u03ad\u03bf release \u03c0\u03c1\u03b9\u03bd \u03b3\u03af\u03bd\u03b5\u03b9 \u03c4\u03bf \u03c4\u03b5\u03bb\u03b9\u03ba\u03cc switch.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u03a0\u03ce\u03c2 \u03be\u03b5\u03ba\u03b9\u03bd\u03ac\u03c2 (\u03c7\u03c9\u03c1\u03af\u03c2 \u03bd\u03b1 \u03b1\u03bb\u03bb\u03ac\u03be\u03b5\u03b9\u03c2 \u03b1\u03c0\u03b1\u03c1\u03b1\u03af\u03c4\u03b7\u03c4\u03b1 \u03c4\u03bf local setup \u03c3\u03bf\u03c5)<\/h2>\n\n\n\n<p>\u03a3\u03c4\u03bf \u03c0\u03b9\u03bf \u03b1\u03c0\u03bb\u03cc \u03c3\u03b5\u03bd\u03ac\u03c1\u03b9\u03bf, \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b1\u03c0\u03bf\u03ba\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 zero downtime deployments \u03bc\u03b5 Trellis, \u03b7 \u03c1\u03bf\u03ae \u03b5\u03af\u03bd\u03b1\u03b9 \u03b7 \u03b5\u03be\u03ae\u03c2:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>\u03a3\u03c4\u03ae\u03bd\u03b5\u03b9\u03c2 \u03c4\u03bf project \u03bc\u03b5 <strong>Bedrock<\/strong> \u03b3\u03b9\u03b1 \u03c0\u03b9\u03bf \u03ba\u03b1\u03b8\u03b1\u03c1\u03ae \u03b4\u03bf\u03bc\u03ae WordPress \u03ba\u03b1\u03b9 \u03b4\u03b9\u03b1\u03c7\u03b5\u03af\u03c1\u03b9\u03c3\u03b7 dependencies: <a href=\"https:\/\/roots.io\/bedrock\/\">https:\/\/roots.io\/bedrock\/<\/a><\/li>\n\n\n<li>\u0395\u03b3\u03ba\u03b1\u03b8\u03b9\u03c3\u03c4\u03ac\u03c2\/\u03c1\u03c5\u03b8\u03bc\u03af\u03b6\u03b5\u03b9\u03c2 <strong>Trellis<\/strong> \u03ba\u03b1\u03b9 \u03c4\u03b1 deployment settings: <a href=\"https:\/\/roots.io\/trellis\/\">https:\/\/roots.io\/trellis\/<\/a><\/li>\n\n\n<li>\u03a3\u03c5\u03bc\u03c0\u03bb\u03b7\u03c1\u03ce\u03bd\u03b5\u03b9\u03c2 \u03c3\u03c4\u03bf <code>wordpress_sites.yml<\/code> \u03c4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c4\u03bf\u03c5 site \u03ba\u03b1\u03b9 \u03c4\u03bf Git repository.<\/li>\n\n\n<li>\u03a4\u03c1\u03ad\u03c7\u03b5\u03b9\u03c2 <code>trellis deploy production<\/code>.<\/li>\n\n<\/ol>\n\n\n\n<p>\u03a4\u03bf \u03c0\u03c1\u03ce\u03c4\u03bf deploy \u03c3\u03c5\u03bd\u03ae\u03b8\u03c9\u03c2 \u03b1\u03c1\u03b3\u03b5\u03af \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03bf, \u03b3\u03b9\u03b1\u03c4\u03af \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03b5\u03af\u03c4\u03b1\u03b9 \u03b7 \u03b4\u03bf\u03bc\u03ae \u03ba\u03b1\u03b9 \u03ba\u03b1\u03c4\u03b5\u03b2\u03b1\u03af\u03bd\u03bf\u03c5\u03bd dependencies. \u0391\u03c0\u03cc \u03b5\u03ba\u03b5\u03af \u03ba\u03b1\u03b9 \u03c0\u03ad\u03c1\u03b1, \u03c4\u03bf \u03c3\u03b7\u03bc\u03b1\u03bd\u03c4\u03b9\u03ba\u03cc\u03c4\u03b5\u03c1\u03bf \u03ba\u03ad\u03c1\u03b4\u03bf\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03bc\u03cc\u03bd\u03bf \u03b7 \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1 \u03b1\u03bb\u03bb\u03ac \u03b7 \u03c0\u03c1\u03bf\u03b2\u03bb\u03b5\u03c8\u03b9\u03bc\u03cc\u03c4\u03b7\u03c4\u03b1: \u03ba\u03ac\u03b8\u03b5 release \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c0\u03bf\u03bc\u03bf\u03bd\u03c9\u03bc\u03ad\u03bd\u03bf, \u03c4\u03bf switch \u03b5\u03af\u03bd\u03b1\u03b9 atomic, \u03ba\u03b1\u03b9 \u03c4\u03bf rollback \u03b5\u03af\u03bd\u03b1\u03b9 \u03ac\u03bc\u03b5\u03c3\u03bf.<\/p>\n\n\n\n<div class=\"wp-block-group callout callout-info is-style-info is-layout-flow wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:8px;padding-top:1rem;padding-right:1.5rem;padding-bottom:1rem;padding-left:1.5rem\">\n\n<h4 class=\"wp-block-heading callout-title\">\u03a3\u03b7\u03bc\u03b5\u03af\u03c9\u03c3\u03b7 \u03b3\u03b9\u03b1 hosting<\/h4>\n\n\n<p>\u03a3\u03cd\u03bc\u03c6\u03c9\u03bd\u03b1 \u03bc\u03b5 \u03c4\u03b7\u03bd \u03b1\u03bd\u03b1\u03ba\u03bf\u03af\u03bd\u03c9\u03c3\u03b7, \u03b1\u03c1\u03ba\u03b5\u03c4\u03bf\u03af \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03bf\u03cd\u03bd \u03c4\u03bf Trellis \u03b1\u03c0\u03bf\u03ba\u03bb\u03b5\u03b9\u03c3\u03c4\u03b9\u03ba\u03ac \u03b3\u03b9\u03b1 deployments Bedrock sites \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b9\u03ac\u03c6\u03bf\u03c1\u03bf\u03c5\u03c2 providers (\u03c0.\u03c7. Kinsta, RunCloud \u03ba\u03b1\u03b9 \u03ac\u03bb\u03bb\u03bf\u03c5\u03c2 managed hosts), \u03b1\u03ba\u03cc\u03bc\u03b1 \u03ba\u03b9 \u03b1\u03bd \u03bf server \u03b4\u03b5\u03bd \u03ad\u03c7\u03b5\u03b9 \u03b3\u03af\u03bd\u03b5\u03b9 provision \u03b1\u03c0\u03cc Trellis.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u03a3\u03cd\u03bd\u03bf\u03c8\u03b7<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>\u03a4\u03bf \u201czero downtime\u201d \u03c3\u03c4\u03bf WordPress \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03c6\u03b9\u03ba\u03c4\u03cc \u03cc\u03c4\u03b1\u03bd \u03b1\u03c0\u03bf\u03c6\u03b5\u03cd\u03b3\u03b5\u03b9\u03c2 updates in-place.<\/li>\n\n\n<li>\u03a4\u03bf Trellis \u03c4\u03bf \u03c0\u03b5\u03c4\u03c5\u03c7\u03b1\u03af\u03bd\u03b5\u03b9 \u03bc\u03b5 <strong>atomic deployments<\/strong> \u03ba\u03b1\u03b9 <strong>immutable releases<\/strong> (\u03bd\u03ad\u03bf\u03c2 \u03c6\u03ac\u03ba\u03b5\u03bb\u03bf\u03c2 \u03b1\u03bd\u03ac deploy + <code>current<\/code> symlink switch).<\/li>\n\n\n<li>\u03a4\u03bf rollback \u03b3\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03c3\u03b5 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1 \u03bc\u03b5 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ae symlink (<code>trellis rollback<\/code>).<\/li>\n\n\n<li>\u0397 \u03b2\u03ac\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd\/migrations \u03c7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9 \u03be\u03b5\u03c7\u03c9\u03c1\u03b9\u03c3\u03c4\u03cc \u03c3\u03c7\u03b5\u03b4\u03b9\u03b1\u03c3\u03bc\u03cc (\u03ba\u03b1\u03b9 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c2 \u03bd\u03b1 \u03b1\u03be\u03b9\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03b9\u03c2 Acorn migrations).<\/li>\n\n\n<li>\u03a4\u03b1 hooks \u03c4\u03bf\u03c5 Trellis \u03c3\u03bf\u03c5 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03bf\u03c5\u03bd \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03cc\u03c3\u03b5\u03b9\u03c2 \u03c0\u03bb\u03ae\u03c1\u03c9\u03c2 \u03c4\u03b7 \u03c1\u03bf\u03ae \u03c4\u03bf\u03c5 deployment.<\/li>\n\n<\/ul>\n\n\n<div class=\"references-section\">\n                <h2>\u0391\u03bd\u03b1\u03c6\u03bf\u03c1\u03ad\u03c2 \/ \u03a0\u03b7\u03b3\u03ad\u03c2<\/h2>\n                <ul class=\"references-list\"><li><a href=\"https:\/\/roots.io\/zero-downtime-wordpress-deployments-with-trellis\/\" target=\"_blank\" rel=\"noopener noreferrer\">Zero Downtime WordPress Deployments with Trellis<\/a><\/li><li><a href=\"https:\/\/roots.io\/trellis\/docs\/deployments\/\" target=\"_blank\" rel=\"noopener noreferrer\">Trellis deployments documentation<\/a><\/li><li><a href=\"https:\/\/roots.io\/bedrock\/\" target=\"_blank\" rel=\"noopener noreferrer\">Bedrock<\/a><\/li><li><a href=\"https:\/\/roots.io\/trellis\/\" target=\"_blank\" rel=\"noopener noreferrer\">Trellis<\/a><\/li><li><a href=\"https:\/\/roots.io\/acorn\/docs\/creating-and-running-laravel-migrations\/\" target=\"_blank\" rel=\"noopener noreferrer\">Creating and running Laravel migrations (Acorn)<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>\u0391\u03bd \u03ba\u03ac\u03bd\u03b5\u03b9\u03c2 deploy WordPress \u00ab\u03c0\u03ac\u03bd\u03c9\u00bb \u03c3\u03c4\u03bf live site (FTP\/rsync\/plugins), \u03ad\u03c7\u03b5\u03b9\u03c2 \u03b4\u03b5\u03b9 \u03c4\u03bf \u03ba\u03bb\u03b1\u03c3\u03b9\u03ba\u03cc \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf \u03cc\u03c0\u03bf\u03c5 \u03ba\u03ac\u03c4\u03b9 \u03c3\u03c0\u03ac\u03b5\u03b9. \u039c\u03b5 \u03c4\u03bf Trellis \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c2 \u03bd\u03b1 \u03c0\u03b5\u03c1\u03ac\u03c3\u03b5\u03b9\u03c2 \u03c3\u03b5 atomic deployments: \u03ba\u03ac\u03b8\u03b5 release \u03b5\u03c4\u03bf\u03b9\u03bc\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9 \u03b1\u03c0\u03bf\u03bc\u03bf\u03bd\u03c9\u03bc\u03ad\u03bd\u03b1 \u03ba\u03b1\u03b9 \u03b3\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 switch \u03bc\u03b5 \u03ad\u03bd\u03b1 symlink, \u03c7\u03c9\u03c1\u03af\u03c2 downtime \u03ba\u03b1\u03b9 \u03bc\u03b5 \u03ac\u03bc\u03b5\u03c3\u03bf rollback.<\/p>\n","protected":false},"author":68,"featured_media":124,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[43],"tags":[72,77,78,76,10],"class_list":["post-125","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oikosystima-wordpress","tag-bedrock","tag-deployments","tag-devops","tag-trellis","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/el\/wp-json\/wp\/v2\/posts\/125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/el\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/el\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/el\/wp-json\/wp\/v2\/users\/68"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/el\/wp-json\/wp\/v2\/comments?post=125"}],"version-history":[{"count":1,"href":"https:\/\/helloblog.io\/el\/wp-json\/wp\/v2\/posts\/125\/revisions"}],"predecessor-version":[{"id":141,"href":"https:\/\/helloblog.io\/el\/wp-json\/wp\/v2\/posts\/125\/revisions\/141"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/el\/wp-json\/wp\/v2\/media\/124"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/el\/wp-json\/wp\/v2\/media?parent=125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/el\/wp-json\/wp\/v2\/categories?post=125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/el\/wp-json\/wp\/v2\/tags?post=125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}