{"id":90,"date":"2025-10-02T00:00:00","date_gmt":"2025-10-01T22:00:00","guid":{"rendered":"https:\/\/helloblog.io\/cs\/zero-downtime-deployment-pro-wordpress-s-trellis\/"},"modified":"2026-01-20T06:32:58","modified_gmt":"2026-01-20T05:32:58","slug":"zero-downtime-deployment-pro-wordpress-s-trellis","status":"publish","type":"post","link":"https:\/\/helloblog.io\/cs\/zero-downtime-deployment-pro-wordpress-s-trellis\/","title":{"rendered":"Zero-downtime deployment pro WordPress s Trellis: atomicky, bez stresu a s rollbackem"},"content":{"rendered":"\n<p>V modern\u00edm v\u00fdvoji aplikac\u00ed je samoz\u0159ejmost, \u017ee nasazen\u00ed nov\u00e9 verze neznamen\u00e1 n\u011bkolik minut \u201ep\u0159echodov\u00e9ho stavu\u201c, kdy produkce serv\u00edruje nap\u016fl star\u00fd a nap\u016fl nov\u00fd k\u00f3d. U WordPressu je tohle bohu\u017eel po\u0159\u00e1d b\u011b\u017en\u00fd sc\u00e9n\u00e1\u0159 \u2014 a \u010dasto to kon\u010d\u00ed rozbit\u00fdm frontendem, fat\u00e1ln\u00edmi errory nebo t\u00edm, \u017ee se u\u017eivatel\u016fm zrovna p\u0159i nasazen\u00ed nena\u010dte ko\u0161\u00edk, formul\u00e1\u0159 nebo administrace.<\/p>\n\n\n\n<p>Trellis (sou\u010d\u00e1st ekosyst\u00e9mu Roots) jde na deployment stejn\u011b jako modern\u00ed aplika\u010dn\u00ed stacky: <strong>atomicky<\/strong> (p\u0159epnut\u00ed prob\u011bhne najednou) a <strong>immutably<\/strong> (nasazen\u00fd release se u\u017e nikdy \u201enep\u0159episuje\u201c). V\u00fdsledek je tzv. <em>zero downtime deployment<\/em> \u2014 web je dostupn\u00fd a funk\u010dn\u00ed po celou dobu nasazen\u00ed.<\/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\">D\u016fle\u017eit\u00e9 up\u0159esn\u011bn\u00ed<\/h4>\n\n\n<p>Trellis nemus\u00ed\u0161 pou\u017e\u00edvat jako kompletn\u00ed workflow pro lok\u00e1ln\u00ed v\u00fdvoj. V praxi d\u00e1v\u00e1 smysl i jen jako nasazovac\u00ed n\u00e1stroj pro Bedrock projekty, zat\u00edmco lok\u00e1ln\u011b jede\u0161 t\u0159eba na DDEV, Lando nebo Valet.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Co p\u0159esn\u011b znamen\u00e1 \u201ezero downtime deployment\u201c<\/h2>\n\n\n\n<p>V kontextu WordPressu t\u00edm obvykle mysl\u00edme to, \u017ee b\u011bhem nasazov\u00e1n\u00ed nedojde k obdob\u00ed, kdy se na serveru m\u00edchaj\u00ed star\u00e9 a nov\u00e9 soubory. Tradi\u010dn\u00ed nasazen\u00ed \u010dasto prob\u00edh\u00e1 tak, \u017ee se za b\u011bhu p\u0159episuje \u010d\u00e1st PHP soubor\u016f, \u0161ablon nebo asset\u016f \u2014 a web mezit\u00edm obsluhuje po\u017eadavky. Pokud u\u017e v tu chv\u00edli nov\u00fd k\u00f3d o\u010dek\u00e1v\u00e1 novou strukturu soubor\u016f nebo nov\u00e9 dependency, je zad\u011bl\u00e1no na chybu.<\/p>\n\n\n\n<p>Atomick\u00fd deployment tento mezistav eliminuje: nov\u00fd release se kompletn\u011b p\u0159iprav\u00ed mimo \u017eivou verzi a teprve a\u017e je hotov\u00fd, provede se rychl\u00fd p\u0159ep\u00edna\u010d (typicky symlink).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pro\u010d jsou \u201eb\u011b\u017en\u00e9\u201c WordPress deploye problematick\u00e9<\/h2>\n\n\n\n<p>Nej\u010dast\u011bj\u0161\u00ed zp\u016fsoby nasazen\u00ed WordPressu maj\u00ed spole\u010dn\u00fd rys: aktualizuj\u00ed soubory p\u0159\u00edmo na m\u00edst\u011b (in-place). To je p\u0159esn\u011b ten okam\u017eik, kdy se m\u016f\u017ee produkce rozb\u00edt.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>FTP uploady<\/strong>: ru\u010dn\u011b p\u0159ep\u00ed\u0161e\u0161 zm\u011bn\u011bn\u00e9 soubory; web m\u016f\u017ee n\u011bkolik minut serv\u00edrovat mix star\u00e9ho a nov\u00e9ho.<\/li>\n\n\n<li><strong>Synchronizace (nap\u0159. <code>rsync<\/code>)<\/strong>: rychlej\u0161\u00ed ne\u017e FTP, ale princip je stejn\u00fd \u2014 za b\u011bhu p\u0159episuje\u0161 soubory, kter\u00e9 web pr\u00e1v\u011b pou\u017e\u00edv\u00e1.<\/li>\n\n\n<li><strong>Pluginov\u00e9 deploye na managed hostingu<\/strong>: pohodln\u00e9, ale \u010dasto po\u0159\u00e1d jde o in-place update bez skute\u010dn\u011b spolehliv\u00e9ho rollbacku.<\/li>\n\n<\/ul>\n\n\n\n<p>Kdy\u017e se n\u011bco pokaz\u00ed, b\u00fdv\u00e1 probl\u00e9m nejen samotn\u00e1 chyba, ale i n\u00e1vrat zp\u011bt: \u010dasto neexistuje jednoduch\u00fd rollback, nebo je rollback ru\u010dn\u00ed a pomal\u00fd.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak to Trellis \u0159e\u0161\u00ed: atomick\u00e9 a \u201eimmutable\u201c releasy<\/h2>\n\n\n\n<p>Trellis pou\u017e\u00edv\u00e1 strategii, kdy ka\u017ed\u00e9 nasazen\u00ed vytvo\u0159\u00ed <strong>nov\u00fd release adres\u00e1\u0159<\/strong>. Ten se p\u0159iprav\u00ed cel\u00fd bokem (checkout z Gitu, instalace z\u00e1vislost\u00ed p\u0159es Composer, propojen\u00ed sd\u00edlen\u00fdch dat) a a\u017e nakonec dojde k okam\u017eit\u00e9mu p\u0159epnut\u00ed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Adres\u00e1\u0159ov\u00e1 struktura na serveru<\/h3>\n\n\n\n<p>Na c\u00edlov\u00e9m serveru se typicky vytvo\u0159\u00ed struktura, kde webserver obsluhuje v\u017edy obsah z <code>current\/<\/code>, kter\u00e9 je jen symlink na konkr\u00e9tn\u00ed release ve <code>releases\/<\/code>.<\/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 na aktivn\u00ed release\n\u251c\u2500\u2500 releases\/            # Historie release\u016f\n\u2502   \u251c\u2500\u2500 20250930124530\/\n\u2502   \u251c\u2500\u2500 20250930083045\/\n\u2502   \u2514\u2500\u2500 20250930141622\/  # Nejnov\u011bj\u0161\u00ed\n\u251c\u2500\u2500 shared\/              # Sd\u00edlen\u00e1 data nap\u0159\u00ed\u010d releasy\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 na aktivn\u00ed 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\">            # Historie release\u016f<\/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\">  # Nejnov\u011bj\u0161\u00ed<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> shared\/<\/span><span style=\"color:#6A737D\">              # Sd\u00edlen\u00e1 data nap\u0159\u00ed\u010d releasy<\/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>Kl\u00ed\u010dov\u00e1 je slo\u017eka <code>shared\/<\/code>: sem pat\u0159\u00ed v\u011bci, kter\u00e9 nesm\u00ed zmizet s releasem \u2014 typicky <code>uploads<\/code> (nahran\u00e1 m\u00e9dia). Ka\u017ed\u00fd release si pak do sebe jen \u201ep\u0159ipoj\u00ed\u201c (symlink) sd\u00edlen\u00e9 adres\u00e1\u0159e.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Co se d\u011bje p\u0159i <code>trellis deploy production<\/code><\/h3>\n\n\n\n<p>Z pohledu v\u00fdvoj\u00e1\u0159e jde o jeden p\u0159\u00edkaz, ale Trellis v pozad\u00ed provede n\u011bkolik krok\u016f tak, aby live verze z\u016fstala nedot\u010den\u00e1 a\u017e do posledn\u00ed chv\u00edle.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Initialize<\/strong>: ov\u011b\u0159\u00ed existenci struktury a vytvo\u0159\u00ed nov\u00fd release adres\u00e1\u0159 s timestampem.<\/li>\n\n\n<li><strong>Update<\/strong>: st\u00e1hne aktu\u00e1ln\u00ed k\u00f3d z Git repozit\u00e1\u0159e do separ\u00e1tn\u00edho do\u010dasn\u00e9ho m\u00edsta mimo live web.<\/li>\n\n\n<li><strong>Prepare<\/strong>: p\u0159iprav\u00ed obsah releasu (kop\u00edrov\u00e1n\u00ed do nov\u00e9ho release adres\u00e1\u0159e).<\/li>\n\n\n<li><strong>Build<\/strong>: spust\u00ed <code>composer install<\/code> a doinstaluje dependency.<\/li>\n\n\n<li><strong>Share<\/strong>: p\u0159ipoj\u00ed sd\u00edlen\u00e9 soubory\/adres\u00e1\u0159e ze <code>shared\/<\/code> do releasu (nap\u0159. <code>uploads<\/code>).<\/li>\n\n\n<li><strong>Finalize<\/strong>: p\u0159epne symlink <code>current<\/code> na nov\u00fd release.<\/li>\n\n<\/ol>\n\n\n\n<p>To \u201ekouzlo\u201c je pr\u00e1v\u011b ve fin\u00e1ln\u00edm kroku: v jeden okam\u017eik web serv\u00edruje star\u00fd release, v dal\u0161\u00ed milisekund\u011b u\u017e nov\u00fd. Bez p\u0159episov\u00e1n\u00ed soubor\u016f za b\u011bhu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Datab\u00e1ze: k\u00f3d bez v\u00fdpadku neznamen\u00e1 automaticky bezrizikov\u00e9 migrace<\/h2>\n\n\n\n<p>Je f\u00e9r \u0159\u00edct nahlas jednu v\u011bc: Trellis \u0159e\u0161\u00ed zero downtime pro <strong>souborovou \u010d\u00e1st<\/strong> (k\u00f3d, \u0161ablony, z\u00e1vislosti). Datab\u00e1zov\u00e9 migrace jsou samostatn\u00e9 t\u00e9ma \u2014 a podle dokumentace Trellis nejsou sou\u010d\u00e1st\u00ed samotn\u00e9ho deploy procesu.<\/p>\n\n\n\n<p>Pokud pou\u017e\u00edv\u00e1\u0161 Acorn (framework z Roots, kter\u00fd p\u0159in\u00e1\u0161\u00ed do WordPressu \u010d\u00e1st Laravel ergonomie), m\u016f\u017ee\u0161 migrace \u0159e\u0161it p\u0159es Laravel migrations a zajistit jejich spou\u0161t\u011bn\u00ed jako sou\u010d\u00e1st nasazen\u00ed. V praxi to typicky znamen\u00e1 i p\u0159em\u00fd\u0161let nad kompatibilitou sch\u00e9matu: ide\u00e1ln\u011b d\u011blat zm\u011bny tak, aby star\u00fd i nov\u00fd k\u00f3d kr\u00e1tce p\u0159e\u017eily paraleln\u011b (tzv. backward-compatible migrace).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rollback je v Trellis ot\u00e1zka jednoho p\u0159\u00edkazu<\/h2>\n\n\n\n<p>Atomick\u00fd a immutable p\u0159\u00edstup m\u00e1 jeden z\u00e1sadn\u00ed bonus: rollback neznamen\u00e1 \u201evr\u00e1tit soubory\u201c, ale prost\u011b p\u0159epnout symlink <code>current<\/code> zp\u011bt na p\u0159edchoz\u00ed release. To je rychl\u00e9 a dob\u0159e predikovateln\u00e9.<\/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>Standardn\u011b se na serveru dr\u017e\u00ed n\u011bkolik posledn\u00edch release\u016f (v z\u00e1kladu p\u011bt), tak\u017ee n\u00e1vrat zp\u011bt nen\u00ed z\u00e1visl\u00fd na tom, jestli m\u00e1\u0161 n\u011bkde po ruce zip, backup nebo \u0161t\u011bst\u00ed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deploy hooks: jak do nasazen\u00ed p\u0159idat vlastn\u00ed kroky<\/h2>\n\n\n\n<p>Trellis m\u00e1 hooky (body v procesu, kde se d\u00e1 spustit vlastn\u00ed logika) pro r\u016fzn\u00e9 f\u00e1ze deploye. Hod\u00ed se, kdy\u017e pot\u0159ebuje\u0161 nasazen\u00ed doplnit o konkr\u00e9tn\u00ed provozn\u00ed kroky bez toho, aby ses vzdal atomick\u00e9ho modelu.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>deploy_build_before<\/code> a <code>deploy_build_after<\/code> pro vlastn\u00ed build kroky<\/li>\n\n\n<li><code>deploy_finalize_before<\/code> a <code>deploy_finalize_after<\/code> pro \u00falohy t\u011bsn\u011b p\u0159ed\/po p\u0159epnut\u00ed<\/li>\n\n\n<li>Hooky i pro jednotliv\u00e9 hlavn\u00ed f\u00e1ze: initialize, update, prepare, build, share, finalize<\/li>\n\n<\/ul>\n\n\n\n<p>Typick\u00e9 pou\u017eit\u00ed v praxi: z\u00e1loha datab\u00e1ze p\u0159ed nasazen\u00edm, pro\u010di\u0161t\u011bn\u00ed cache po nasazen\u00ed, pos\u00edl\u00e1n\u00ed notifikac\u00ed t\u00fdmu nebo jednoduch\u00e9 smoke testy proti nov\u00e9mu releasu je\u0161t\u011b p\u0159edt\u00edm, ne\u017e se p\u0159epne <code>current<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak za\u010d\u00edt: minimum krok\u016f, maximum efektu<\/h2>\n\n\n\n<p>Pokud chce\u0161 Trellis vyu\u017e\u00edt \u010dist\u011b pro spolehliv\u011bj\u0161\u00ed nasazov\u00e1n\u00ed, typick\u00fd postup vypad\u00e1 takto:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Postav projekt na Bedrocku (\u010dist\u0161\u00ed struktura WordPress projektu a dependency p\u0159es Composer).<\/li>\n\n\n<li>Nainstaluj Trellis a nastav deployment konfiguraci.<\/li>\n\n\n<li>Dopl\u0148 <code>wordpress_sites.yml<\/code> o informace o Git repozit\u00e1\u0159i.<\/li>\n\n\n<li>Spus\u0165 <code>trellis deploy production<\/code>.<\/li>\n\n<\/ol>\n\n\n\n<p>Prvn\u00ed deploy b\u00fdv\u00e1 pomalej\u0161\u00ed (vytvo\u0159en\u00ed struktury, sta\u017een\u00ed z\u00e1vislost\u00ed). Dal\u0161\u00ed nasazen\u00ed u\u017e jsou obvykle rychl\u00e1 \u2014 a hlavn\u011b bez toho nep\u0159\u00edjemn\u00e9ho momentu, kdy si nejsi jist\u00fd, jestli se zrovna n\u011bkomu nerozbila produkce uprost\u0159ed kop\u00edrov\u00e1n\u00ed soubor\u016f.<\/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\">Pozor na hranice \u201ezero downtime\u201c<\/h4>\n\n\n<p>Atomick\u00e9 releasy vy\u0159e\u0161\u00ed konzistenci soubor\u016f a rychl\u00fd rollback. Pokud ale nasazen\u00ed obsahuje rizikov\u00e9 datab\u00e1zov\u00e9 zm\u011bny nebo z\u00e1vis\u00ed na extern\u00edch slu\u017eb\u00e1ch, po\u0159\u00e1d je pot\u0159eba \u0159e\u0161it kompatibilitu a provozn\u00ed sc\u00e9n\u00e1\u0159e.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Shrnut\u00ed: pro\u010d to d\u00e1v\u00e1 smysl i u men\u0161\u00edch WordPress projekt\u016f<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>\u017d\u00e1dn\u00e9 p\u0159episov\u00e1n\u00ed soubor\u016f za b\u011bhu \u2192 m\u00e9n\u011b n\u00e1hodn\u00fdch chyb p\u0159i deployi.<\/li>\n\n\n<li>Ka\u017ed\u00fd release je izolovan\u00fd a nem\u011bnn\u00fd \u2192 l\u00e9pe se diagnostikuje, co je nasazeno.<\/li>\n\n\n<li>Okam\u017eit\u00fd rollback \u2192 men\u0161\u00ed stres, rychlej\u0161\u00ed reakce na incident.<\/li>\n\n\n<li>Hooky \u2192 mo\u017enost doplnit deployment o provozn\u00ed hygienu (cache, backupy, notifikace).<\/li>\n\n<\/ul>\n\n\n<div class=\"references-section\">\n                <h2>Reference \/ Zdroje<\/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\">Deployments &#8211; Trellis Documentation<\/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 &#8211; Acorn Documentation<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Klasick\u00e9 nasazov\u00e1n\u00ed WordPressu p\u0159es p\u0159episov\u00e1n\u00ed soubor\u016f za b\u011bhu je recept na n\u00e1hodn\u00e9 chyby a nep\u0159\u00edjemn\u00e9 v\u00fdpadky. Trellis \u0159e\u0161\u00ed deployment atomicky: p\u0159iprav\u00ed cel\u00fd release bokem a pak jen p\u0159epne symlink \u2014 v\u010detn\u011b rychl\u00e9ho rollbacku.<\/p>\n","protected":false},"author":33,"featured_media":89,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[76,77,78,75,10],"class_list":["post-90","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ekosystem-wordpress","tag-bedrock","tag-deploy","tag-devops","tag-trellis","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/cs\/wp-json\/wp\/v2\/posts\/90","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/cs\/wp-json\/wp\/v2\/users\/33"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/cs\/wp-json\/wp\/v2\/comments?post=90"}],"version-history":[{"count":1,"href":"https:\/\/helloblog.io\/cs\/wp-json\/wp\/v2\/posts\/90\/revisions"}],"predecessor-version":[{"id":102,"href":"https:\/\/helloblog.io\/cs\/wp-json\/wp\/v2\/posts\/90\/revisions\/102"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/cs\/wp-json\/wp\/v2\/media\/89"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/cs\/wp-json\/wp\/v2\/media?parent=90"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/cs\/wp-json\/wp\/v2\/categories?post=90"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/cs\/wp-json\/wp\/v2\/tags?post=90"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}