Rejstřík deníkuDockup / terénní poznámka
Note / self-host-ghost

Jak hostovat Ghost na vlastním serveru v roce 2026: MySQL, newslettery a zálohy obsahu

Praktický návod na self-hosting Ghostu zahrnující Docker, porty, persistentní data, TLS, zabezpečení, zálohy a problémy, které brání použití v produkci. Krok za krokem.

Neúspěšný deployment Ghostu nemusí vždy skončit pádem. Může zobrazovat přihlašovací stránku, i když je nastavení url na HTTP nebo byl nahrazen content volume. Místo toho začněte end-to-end kontrolou: dokončete nastavení vlastníka, publikujte příspěvek s obrázkem, přihlaste člena k odběru a odešlete testovací newsletter přes nakonfigurovaný e-mail.

Tato kontrola odpovídá deklarovanému účelu Ghostu: publikační platformě s memberships a newslettery. Také odhalí chybějící závislosti, nesprávné předpoklady o proxy a pomíjivá data dříve než probe dostupnosti.

Vymezte runtime hranici Ghostu

Kolem Ghostu vymezte tři hranice: vstupní provoz na port 2368, trvalý stav a podpůrné požadavky. Kontejner lze nahradit, ale u zbývajících dvou oblastí musí být jednoznačně určeno, kdo je spravuje. Síťová smlouva Ghostu zahrnuje MySQL 8, SMTP a volitelné object storage pro weby s velkým objemem médií. Soukromé endpointy ponechte na interním DNS, povolte pouze nezbytná odchozí volání a Ghostu přidělte service credential s omezeným rozsahem oprávnění.

Diagram je úplný ve chvíli, kdy čistý klient dokáže dokončit nastavení vlastníka, publikovat příspěvek s obrázkem, přihlásit člena k odběru a odeslat testovací newsletter přes nakonfigurovaný e-mail. Shromažďujte údaje o časech a zdrojích pro MySQL queries, ukládání obrázků, vykreslování šablon, počet členů a limity poskytovatele hromadné pošty. Pokud transakce selže, první hranice, která se nechová podle dokumentace, určí, zda je třeba prověřit routing, lokální kapacitu nebo podpůrnou službu.

Ověřte, že Ghost přežije nahrazení

Image kontejneru lze znovu stáhnout, databázi MySQL spolu se šablonami, obrázky a soubory obsahu nikoli. Před bootstrapem připojte /var/lib/ghost/content, zapište neškodná testovací data a nahraďte kontejner, abyste ověřili, že je tato cesta skutečně persistentní. Zkontrolujte efektivní mount místo slepé důvěry v název Compose souboru a ověřte, že runtime user může zapisovat tam, kam Ghost očekává.

Zvolte retention a umístění mimo hostitele, poté si obnovu nacvičte bez zásahu do produkce. Test je úspěšný pouze tehdy, když se vrátí příspěvky, členové, newslettery, šablony a obrázky a testovací člen může otevřít obnovenou publikaci. U stavu uloženého v databázi kombinujte storage snapshots s exporty konzistentními z pohledu aplikace, jak je popsáno v článku point-in-time recovery versus snapshots.

Přihlašovací údaje, role a vystavené plochy

Specifickým bezpečnostním rizikem aplikace je použití SQLite v nepodporované produkční topologii nebo únik přihlašovacích údajů k poště. Provozním řešením je chránit Ghost Admin, uchovávat přihlašovací údaje k poště a databázi na straně serveru a před publikováním nastavit finální HTTPS URL. Bootstrap dokončete přes omezenou route a dočasný přístup k nastavení ihned poté odstraňte.

url je konfigurace, nikoli tajný údaj; jeho hodnotu udržujte explicitní a chraňte oddělené přihlašovací údaje používané Ghostem. Procesu Ghostu přidělte pouze zdokumentované mounty a route k závislostem; vyhněte se přístupu ke kořenu hostitele a Docker socketu. Logujte neúspěšná ověření a chyby konfigurace, ale redigujte tokeny, connection strings a uživatelský obsah.

Ověřte deployment Ghostu end to end

Záznam o release Ghostu musí obsahovat fakta, nikoli „vypadá to dobře“. Uložte zvolený image digest, checksum konfigurace, veřejný hostname a výsledek s timestampem pro tyto kroky: dokončení nastavení vlastníka, publikování příspěvku s obrázkem, přihlášení člena k odběru a odeslání testovacího newsletteru přes nakonfigurovaný e-mail. Používejte neprodukční testovací data, aby bylo možné kontrolu spouštět po každém deploymentu.

Ověřte dvě události životního cyklu odděleně. Nahrazení kontejneru musí zachovat běžný provoz; čistá obnova musí prokázat, že se vrátí příspěvky, členové, newslettery, šablony a obrázky a testovací člen může otevřít obnovenou publikaci. Během kontrol měřte MySQL queries, ukládání obrázků, vykreslování šablon, počet členů a limity poskytovatele hromadné pošty a výsledek uchovejte jako očekávaný envelope pro tuto verzi.

Otestujte také zamítnutý nebo neplatný stav: dočasně testovací identitě odepřete přístup k MySQL 8, SMTP a volitelnému object storage pro weby s velkým objemem médií. Ghost by měl selhat diagnostikovatelným způsobem a neměl by přepsat zdravý stav. Vraťte platný stav, znovu spusťte testovací scénář a přiložte relevantní redigované logy. Tyto artefakty poskytnou budoucímu rozhodnutí o rollbacku konkrétní důkazy.

Základní Docker konfigurace pro Ghost

Počáteční spuštění Ghostu udržujte dostatečně reprodukovatelné, aby ho bylo možné zkontrolovat v pull requestu.

docker run -d \
  --name ghost \
  --restart unless-stopped \
  -p 127.0.0.1:2368:2368 \
  -v ghost-data:/var/lib/ghost/content \
  -e url=https://app.example.com \
  -e database__client=mysql \
  -e database__connection__host=mysql.internal \
  -e database__connection__user=ghost \
  -e database__connection__password=replace-with-a-strong-database-password \
  -e database__connection__database=ghost \
  ghost:latest

Po uložení skutečných dat nespoléhejte na latest. Zachyťte funkční digest, uživatele kontejneru a vlastnictví mountu. Sledujte aplikační log během kompletního testu — dokončení nastavení vlastníka, publikování příspěvku s obrázkem, přihlášení člena k odběru a odeslání testovacího newsletteru přes nakonfigurovaný e-mail — a před vystavením route produkčnímu provozu zaznamenejte případné migrace.

TLS je snadné, generované URL nikoli

Před publikováním nastavte url na finální HTTPS doménu. Zvolený hostname směrujte na port kontejneru 2368, předávejte původní host a HTTPS scheme a nezveřejňujte druhý přímý origin.

Otestujte Ghost z čistého externího klienta. Oddělte selhání ingressu od známé aplikační hranice — nastavení url je HTTP nebo byl nahrazen content volume. Chyba certifikátu, DNS nebo 502 patří do routingu; požadavek, který dorazí do Ghostu a selže až později, patří do stavu aplikace, kapacity nebo jejích podpůrných požadavků. Průvodce TLS pro vlastní doménu pokrývá první skupinu.

Kontroly kapacity a aktualizací

Testy kapacity musí zatěžovat MySQL queries, ukládání obrázků, vykreslování šablon, počet členů a limity poskytovatele hromadné pošty, nikoli opakovaný požadavek na /. Spusťte scénář „dokončení nastavení vlastníka, publikování příspěvku s obrázkem, přihlášení člena k odběru a odeslání testovacího newsletteru přes nakonfigurovaný e-mail“ při realistické souběžnosti a zaznamenejte latenci, chybovost a růst úložiště.

Plánování aktualizací musí zohlednit toto riziko: Ghost migrations, očekávání ohledně Node runtime a vlastní šablony se musí testovat na klonovaném webu. Otestujte nové release s reprezentativním vstupem, poté zopakujte akceptační transakci a porovnejte její výsledek. Pokud je nastavení url na HTTP nebo byl nahrazen content volume, zachyťte selhávající transakci a prozkoumejte první zapojenou hranici, místo abyste automaticky předpokládali, že za problém může ingress.

Přesuňte opakovatelnou infrastrukturní práci do Dockup

Routing, certifikáty, nahrazování služeb a připojené úložiště jsou rozumné cíle pro automatizaci. Dockup je pro Ghost zajišťuje a může také zřídit související managed databázi nebo se připojit ke službám na vlastním serveru zákazníka.

Neměl by však vymýšlet trust policy Ghostu. Po deploymentu nastavte url na finální HTTPS doménu před publikováním, vynucujte tuto hranici — chraňte Ghost Admin, uchovávejte přihlašovací údaje k poště a databázi na straně serveru a před publikováním nastavte finální HTTPS URL — a ověřte výsledek tohoto scénáře: dokončení nastavení vlastníka, publikování příspěvku s obrázkem, přihlášení člena k odběru a odeslání testovacího newsletteru přes nakonfigurovaný e-mail. Výsledkem je infrastruktura na jedno kliknutí s aplikačním akceptačním testem.

Často kladené otázky

Co Ghost potřebuje pro produkční deployment?

Kontejner Ghostu směrujte přes port 2368 skrze jediný HTTPS origin. Síťové podpůrné požadavky zahrnují MySQL 8, SMTP a volitelné object storage pro weby s velkým objemem médií. Ghost nepovažujte za připravený, dokud nedokážete dokončit nastavení vlastníka, publikovat příspěvek s obrázkem, přihlásit člena k odběru a odeslat testovací newsletter přes nakonfigurovaný e-mail.

Která data Ghostu patří do zálohy?

Zachovejte /var/lib/ghost/content a do stejného recovery manifestu zahrňte databázi MySQL spolu se šablonami, obrázky a soubory obsahu. Čistá obnova Ghostu je úspěšná pouze tehdy, když se vrátí příspěvky, členové, newslettery, šablony a obrázky a testovací člen může otevřít obnovenou publikaci.

Vyžaduje Ghost za reverse proxy HTTPS?

Pro veřejný origin Ghostu používejte HTTPS a port 2368 ponechte na interní route. Nastavení Ghostu aplikujte správně: před publikováním nastavte url na finální HTTPS doménu. U Ghostu HTTPS chrání přihlašovací údaje nebo uživatelský obsah při přenosu a udržuje konzistentní chování klienta závislé na originu.

Jak testovat aktualizaci Ghostu?

Obnovte aktuální stav Ghostu do izolovaného deploymentu, aplikujte kandidátní verzi a zopakujte jeho akceptační transakci. Zvláštní pozornost věnujte tomu, že Ghost migrations, očekávání ohledně Node runtime a vlastní šablony se musí testovat na klonovaném webu. Předchozí Ghost image ponechte, dokud nebudou jasné hranice migrace dat a rollbacku.