Blog na Ghostu na vlastním serveru potřebuje méně, než lidé čekají: zhruba 1 GB paměti pro osobní web, doménu s HTTPS před ním, nastavení url, které přesně odpovídá té doméně, a fungující odchozí poštu. Právě na posledních dvou bodech selže skoro každá rozbitá instalace Ghostu. Nastav adresu a poštu hned první den, drž kopii složky content někde jinde než na samotném serveru a všechno ostatní - šablony, členové, newslettery, aktualizace - je běžná práce v administraci.
Tento návod ukazuje, z čeho se Ghost na serveru doopravdy skládá, jak velký server potřebuje, těch pár nastavení, na kterých záleží, rozdíl mezi dvěma druhy e-mailů, které Ghost posílá, šablony, zálohy a aktualizace a chyby, na které lidé narážejí nejčastěji.
Z čeho se skládá Ghost na vlastním serveru#
Ghost je aplikace v Node.js. Všechno, co vidíš - veřejný web, portál pro členy, editor na adrese /ghost - obsluhuje jeden dlouho běžící proces, který poslouchá na jediném portu. Ve výchozím stavu je to port 2368. Ghost nepotřebuje PHP, samostatný webový server ani úlohy cronu; je to jeden proces a jeho soubory.
Ty soubory se dělí do dvou skupin a pochopit tohle rozdělení je to nejužitečnější, co můžeš udělat, než na cokoli sáhneš:
- Aplikace - vlastní kód Ghostu a jeho závislosti pro Node.js. Při každé aktualizaci se nahradí a nikdy bys ho neměl upravovat.
- Složka `content` - všechno, co je tvoje. Tvoje šablony v
content/themes, nahrané obrázky vcontent/images, soubor s routami vcontent/settings, logy vcontent/logsa databáze vcontent/data.
K tomu jeden konfigurační soubor, config.production.json, který Ghostu říká jeho veřejnou adresu, kde je databáze, jak posílat poštu a na jaké adrese a portu má poslouchat.
Třetím dílem je databáze. Ghost umí MySQL nebo SQLite. Vlastní dokumentace Ghostu doporučuje pro produkci MySQL 8 a SQLite bere jako odlehčenou možnost, jenže SQLite je jeden soubor uvnitř content/data, takže malá publikace se s ní velmi snadno provozuje i zálohuje: není tu žádný další server, který by bylo potřeba dimenzovat, zabezpečit a platit. Pro blog s jedním nebo několika autory je to rozumná volba. Kde rozumná být přestává, najdeš v FAQ.
Na RE:NODE je Ghost jednou z řad aplikací na jedno kliknutí. Server Ghost nainstaluje a sestaví při prvním spuštění a data drží v SQLite přímo na serveru, takže nemusíš kupovat databázi. Každý soubor, který instalátor zapíše, vidíš ve správci souborů i přes SFTP, stejně jako na jakémkoli jiném serveru, a změny, které uděláš v šablonách a konfiguraci, aktualizace nepřepíše.
Jak velký server Ghost potřebuje#
Vlastní minimum Ghostu je 1 GB paměti. To je poctivé číslo: nečinný proces Ghostu se drží pohodlně pod ním a osobní blog s několika tisíci návštěvami denně na tom běží bez potíží. Paměť a procesor nezvedají zobrazení stránek - Ghost dobře cachuje a většina stránek je levná - ale tohle:
- Nahrávání obrázků. Ghost ke každému obrázku generuje zmenšené kopie pro responzivní layout. Nahrát dvacet velkých fotografií za sebou je to nejtěžší, co malý server s Ghostem dělá.
- Členové a newslettery. Rozeslání newsletteru velkému seznamu, import CSV se členy a vykreslení členské sekce stojí víc než servírování článků.
- Sestavení při prvním spuštění. Instalace závislostí a sestavení potřebují víc paměti než samotný běh. Proběhne to jednou.
Disk zabírají hlavně obrázky. Samotná aplikace má pár set megabajtů, textové články jsou drobné a fotoblog roste o velikost nahraných souborů plus zmenšené kopie, které z nich Ghost dělá, takže počítej zhruba s dvojnásobkem toho, co nahraješ.
| Plán | RAM / disk / CPU | Pro koho |
|---|---|---|
| Ghost Starter | 1 GB / 10 GB / 1 vCPU | Osobní blog nebo malý newsletter |
| Ghost Standard | 2 GB / 20 GB / 1.5 vCPU | Rostoucí publikace se členy |
| Ghost Advanced | 4 GB / 30 GB / 2 vCPU | Navštěvované weby a velké seznamy odběratelů |
| Ghost Pro | 6 GB / 50 GB / 3 vCPU | Velké publikace s hodně médii |
To jsou plány Ghostu na RE:NODE, od $5 měsíčně. Začni malým: přechod na vyšší tarif změní limity na serveru, který už máš, a Ghost není potřeba přeinstalovat. Pokud chceš obecné vysvětlení, který zdroj ve skutečnosti dojde jako první, článek o limitech paměti v Node platí přímo, protože Ghost je proces Node jako každý jiný.
První spuštění a účet administrátora#
Na stroji, který spravuješ sám, se Ghost obvykle instaluje přes Ghost-CLI: ghost install na připraveném linuxovém serveru nastaví závislosti Node.js, databázi MySQL, nginx, certifikát a službu systemd. Je to dobrý nástroj, ale počítá s tím, že celý stroj je tvůj, a proto se hodí na VDS, ne na server v panelu.
Na řadě na jedno kliknutí je kroků méně:
- Objednej plán. Server vznikne, jakmile projde platba, obvykle do minuty.
- Spusť ho a sleduj konzoli. První spuštění Ghost stáhne a sestaví, což trvá déle než jakékoli další spuštění. Počkej, až Ghost ohlásí, že běží.
- Otevři adresu zobrazenou v panelu a přidej na konec
/ghost. První návštěva/ghostje obrazovka nastavení: název webu, tvoje jméno, e-mail a heslo. Tento účet se stane vlastníkem. - Nastav doménu (další sekce), než někoho pozveš nebo něco zveřejníš, protože odkazy a e-maily používají tu adresu, kterou Ghost považuje za svou.
Nastavení udělej hned. Dokud vlastník neexistuje, vytvoří ho ten, kdo se na /ghost dostane jako první. Na čerstvém serveru adresu zatím nikdo nezná, ale není to krok na příští týden.
Potom přijdou účty redakce: Ghost má role Contributor, Author, Editor a Administrator a právě jednoho Ownera. Autory zveš e-mailem z nastavení redakce - což znamená, že pošta musí fungovat dřív, a proto sekce o poště níže není volitelná.
Nastavení url a tvoje doména#
url je nastavení, které rozbije víc webů na Ghostu než kterékoli jiné. Ghost z něj skládá každý odkaz, canonical tag, položku RSS, záznam v sitemapě, adresu obrázku i odkaz v e-mailu a přesměrovává na něj návštěvníky. Musí to být přesná veřejná adresa včetně schématu:
{ "url": "https://blog.example.com", "server": { "host": "0.0.0.0", "port": 2368 }}Stejné hodnoty můžou místo ze souboru přijít z proměnných prostředí. Ghost čte vnořené klíče s dvojitým podtržítkem, takže server__port nastaví server.port a mail__transport nastaví mail.transport:
url=https://blog.example.comserver__host=0.0.0.0server__port=2368Proměnná prostředí má přednost před souborem. To se vyplatí pamatovat si, když se zdá, že úprava config.production.json je ignorovaná: stejný klíč nastavuje něco jiného. Na serveru v panelu jsou adresa a port, na kterých Ghost poslouchá, už instalací sladěné s portem přiděleným serveru, takže server.host a server.port nech být, pokud nevíš, proč je měníš. Měníš url.
Na RE:NODE obsahují aplikační plány slot reverzní proxy. Přidej doménu do slotu proxy, nasměruj její záznam A na adresu, kterou ukazuje panel, a certifikát se vydá a obnovuje automaticky. Pak nastav url na https:// plus tu doménu a restartuj Ghost. Na pořadí záleží: když do url dáš doménu dřív, než jsou DNS a certifikát hotové, Ghost přesměruje každého návštěvníka, tebe včetně, na adresu, která ještě neodpovídá.
Stranu domény - záznamy A, jak dlouho trvá DNS a co potřebuje certifikát - popisuje článek o doméně a jejím certifikátu a článek o tom, co dělá reverzní proxy, vysvětluje, proč tu Ghost sám nikdy neřeší HTTPS. Jeden důsledek proxy: Ghost vidí všechny návštěvníky, jako by přicházeli z proxy, a skutečná adresa klienta dorazí v hlavičce X-Forwarded-For.
Pokud chceš, aby fungovalo example.com i www.example.com, vyber jedno jako url a druhé na něj přesměruj; Ghost odpovídá na jedné kanonické adrese. Kterou zvolit, rozebírá článek o www, holé doméně a přesměrováních.
Pošta: transakční e-maily a newslettery#
Ghost posílá dva různé druhy e-mailů dvěma různými cestami a jejich záměna je nejčastější důvod, proč nový web působí napůl rozbitě.
Transakční pošta je jedna zpráva jednomu člověku: pozvánky do redakce, obnova hesla a - to nejdůležitější - přihlašovací odkazy pro členy. Členové Ghostu nemají hesla; přihlašují se odkazem poslaným e-mailem. Když transakční pošta nefunguje, nikdo se nemůže zaregistrovat ani přihlásit a portál z pohledu čtenáře potichu selže. Tahle pošta odchází přes blok mail v konfiguraci, obvykle přes SMTP:
{ "mail": { "from": "'Example Blog' <noreply@example.com>", "transport": "SMTP", "options": { "host": "smtp.example.com", "port": 465, "secure": true, "auth": { "user": "noreply@example.com", "pass": "your-smtp-password" } } }}| Klíč | Typická hodnota | Co dělá |
|---|---|---|
mail.transport | SMTP | Odesílání přes SMTP server |
mail.from | tvoje adresa | Odesílatel, kterého čtenáři vidí |
mail.options.host | hostitel poskytovatele | SMTP server, ke kterému se připojit |
mail.options.port | 465 nebo 587 | 465 s secure: true, 587 bez něj |
mail.options.auth | jméno a heslo | Přihlášení k SMTP |
Port 465 používá TLS od prvního bajtu a chce secure: true; port 587 začíná nešifrovaně a pak přejde na šifrování, takže secure necháš na false. Když je zaměníš, dostaneš timeout nebo chybu TLS místo užitečné zprávy. Adresa from musí být taková, za kterou smí SMTP server odesílat, na doméně, jejíž záznamy SPF a DKIM ten server zahrnují, jinak pošta skončí ve spamu - záznamy prochází článek o tom, proč e-maily padají do spamu.
Odkud SMTP server vezmeš, je na tobě: poskytovatel transakční pošty, odchozí server existující schránky, nebo vlastní. RE:NODE prodává řadu Mail Server se Stalwartem, která může Ghostu sloužit jako SMTP server - popisuje ji článek o nastavení poštovního serveru Stalwart a možnosti porovnává článek o transakčních e-mailech z aplikace. Ghost se potřebuje dostat jen na odesílací port jako 587 nebo 465; port 25 nikdy nepotřebuje.
Newslettery jsou hromadná cesta: jeden článek poslaný e-mailem každému odběrateli. Newslettery Ghost přes SMTP neposílá. Hromadné odesílání jde přes Mailgun, který se nastavuje v administraci Ghostu v nastavení e-mailů pro newslettery pomocí domény Mailgunu a klíče API, ne v config.production.json. Bez něj Ghost dál publikuje články a nechá členy registrovat, jen možnost poslat článek e-mailem nebude dostupná. Blog bez newsletteru se bez Mailgunu obejde úplně; blog, jehož smyslem je právě newsletter, ne.
Šablony a úpravy vzhledu#
Šablona (theme) Ghostu je složka se šablonami Handlebars (soubory .hbs), CSS, JavaScriptem a souborem package.json, který šablonu a její nastavení popisuje. Novější verze mají výchozí šablonu a oficiální šablony i ty z marketplace jsou bezplatné nebo placené archivy zip.
Nainstalovat ji můžeš dvěma způsoby:
- Nahrát zip v administraci Ghostu v nastavení vzhledu. Ghost ji ověří, vypíše chyby nebo varování a nechá tě ji aktivovat. To je běžná cesta.
- Zkopírovat složku do `content/themes` přes SFTP nebo správce souborů, pak restartovat Ghost, aby novou šablonu zaznamenal, a aktivovat ji v administraci. Hodí se pro šablonu, kterou vyvíjíš, nebo pro takovou, která je na pohodlné nahrání příliš velká.
Šablonu upravuj jako kopii, nikdy na místě. Přejmenuj složku (a name v jejím package.json), aby aktualizace šablony od autora potichu nepřepsala tvoje změny, a upravenou šablonu drž v Gitu nebo aspoň jako zip na svém počítači. Údaje pro připojení, abys mohl pracovat přímo se soubory, najdeš v článku o SFTP a správci souborů.
Ve složce content a v administraci stojí za to znát ještě dvě věci:
content/settings/routes.yamlřídí strukturu URL: vlastní kolekce, statickou úvodní stránku, taxonomie. Dá se stáhnout i nahrát z administrace. Chybný soubor s routami umí způsobit, že celé sekce webu vracejí 404, takže si před změnou schovej předchozí verzi.- Code injection v administraci přidává úryvky do hlavičky a patičky webu - analytiku, font, drobnou opravu stylů - bez sahání do šablony. Pro malé změny ho upřednostni; přežijí výměnu šablony.
Velké změny šablony se lépe testují jinde než na ostrém webu. Druhý malý server s Ghostem na testování stojí málo a popisuje ho článek o testovacím serveru vedle produkce.
Zálohy, které obsahují všechno#
Web na Ghostu jsou tři věci: databáze, složka content a config.production.json. Záloha, které kterákoli z nich chybí, není úplná.
Se SQLite leží databáze uvnitř content/data, takže úplná záloha je kopie content plus konfigurační soubor. Háček je v konzistenci. Kopírování souboru SQLite ve chvíli, kdy do něj Ghost zapisuje, může vytvořit kopii, která nepůjde otevřít. Bezpečné možnosti, seřazené podle preference:
- Zastavit Ghost, zkopírovat soubory a znovu ho spustit. Pár sekund výpadku a zaručeně čistá kopie.
- Použít vlastní zálohovací příkaz SQLite, pokud je k dispozici nástroj
sqlite3; vytvoří konzistentní kopii živé databáze. - Zálohovat v klidnou hodinu a držet jich několik, aby jedna vadná kopie nebyla tvoje jediná.
$ sqlite3 content/data/ghost.db ".backup 'ghost-backup.db'"$ tar czf ghost-content-$(date +%F).tar.gz content config.production.jsonNázev souboru ghost.db je obvyklý, ale než cokoli naskriptuješ, zkontroluj, co ve složce content/data doopravdy je.
Ghost má v nastavení i export, který stáhne články, stránky, štítky a nastavení jako soubor JSON, a členy lze exportovat jako CSV. To se hodí - export JSON je způsob, jak přenést obsah mezi instalacemi Ghostu různých verzí - ale sám o sobě to záloha není. Export JSON neobsahuje obrázky ani šablony a obnova celého webu z něj je pomalejší a ztrátovější než obnova souborů.
Na RE:NODE má každý plán Ghostu sloty na zálohy: od jednoho na Starteru po čtyři na Pro. Záloha jde udělat ručně nebo podle plánu, ukládá se mimo stroj, který chrání, dá se stáhnout a obnovuje se tlačítkem. Záložka Schedules umí v jedné seřazené úloze server zastavit, udělat zálohu a znovu ho spustit, což je postup „zastavit, zkopírovat, spustit“ z výše, jen bez toho, aby u toho někdo musel být vzhůru. Zálohu udělanou před aktualizací zamkni, aby ji rotace nesmazala. Smazání serveru smaže i jeho zálohy, včetně zamčených, takže si od všeho, o co nechceš přijít, drž staženou kopii. Proč jednou za čas nějakou zálohu obnovit, vysvětluje článek o zálohách, které se opravdu obnoví, a postup v panelu je v návodu k zálohám.
Jak Ghost bezpečně aktualizovat#
Ghost vychází často. Menší aktualizace jsou běžně bezbolestné; hlavní verze mění věci, na kterých závisí šablony a integrace, a poznámky k vydání říkají které. Na stroji, který spravuješ přes Ghost-CLI, ghost update stáhne novou verzi, spustí migrace databáze a restartuje. Jak se verze posouvá na serveru na jedno kliknutí, záleží na jeho instalaci; sleduj výstup konzole při spuštění a před hlavní aktualizací se zeptej podpory, pokud si nejsi jistý, co se stane.
Ať aktualizaci provádí cokoli, postup je stejný:
- Přečti poznámky k vydání pro každou hlavní verzi mezi tvou a cílovou.
- Zkontroluj šablonu vůči nové verzi. Validátor šablon Ghostu (ten samý, který běží při nahrání) hlásí šablony a helpery, které už nejsou podporované. Šablona, která fungovala na staré hlavní verzi, se na nové nemusí dát aktivovat.
- Zazálohuj se zastaveným Ghostem a tu zálohu zamkni.
- Aktualizuj a sleduj log, zatímco Ghost provádí migrace databáze. Uprostřed migrace server nezastavuj.
- Proklikej web: úvodní stránku, článek, stránku štítku, členský portál, editor v administraci. Pošli si testovací e-mail.
Když se aktualizace pokazí, obnovení zálohy vrátí soubory i databázi přesně do stavu před ní - proto se záloha dělá před aktualizací, ne až po první chybě. Obecné návyky k tomu popisuje článek o nasazování bez výpadku na malém serveru, i když jeden proces Ghostu bude mít krátký restart tak jako tak.
Řešení problémů#
Web se zacyklí v přesměrování nebo tě pořád posílá na špatnou adresu. url neodpovídá tomu, jak se na web přistupuje. Zkontroluj schéma (https proti http), název hostitele (s www nebo bez) a že na konec nepřibyla žádná cesta. Za reverzní proxy Ghost navíc spoléhá na to, že mu proxy hlavičkou X-Forwarded-Proto řekne, že původní požadavek šel přes HTTPS; když chybí, url s https způsobí nekonečné přesměrování.
Členům nikdy nepřijde přihlašovací odkaz. Transakční pošta není nastavená nebo selhává. Najdi chybu SMTP v logu Ghostu. Časté příčiny: špatná kombinace portu a secure, přihlášení k SMTP, které nesmí odesílat za adresu from, nebo pošta dorazí, ale skončí ve spamu, protože chybí SPF nebo DKIM.
Chybí možnost poslat článek e-mailem. Newslettery potřebují Mailgun nastavený v administraci. Nastavení SMTP hromadné odesílání nezapne.
Obrázky nebo odkazy po změně domény míří na starou adresu. Změň url, restartuj a generované odkazy se přizpůsobí. Obrázky vložené do článků před změnou jsou uložené s cestami, které Ghost přepisuje podle url, ale cokoli natvrdo zapsaného v šabloně nebo v code injection musíš upravit ručně.
Nahrání šablony selže s chybami. Validátor našel šablony nebo helpery, které běžící verze Ghostu nepodporuje. Přečti vypsané chyby; uvádějí konkrétní soubor. Oprav je ve své kopii šablony, nebo sežeň verzi šablony postavenou pro tvé vydání Ghostu.
Ghost se restartuje při velkém nahrávání nebo importu. Proces narazil na limit paměti. Nahrávej méně obrázků najednou, zmenši fotografie před nahráním, nebo přejdi na vyšší tarif. Smyčku restartů, která nepřestává, rozebírá článek o tom, proč se server pořád restartuje - diagnóza je pro jakýkoli proces stejná.
Úprava `config.production.json` nic nezmění. Buď Ghost nebyl restartován (soubor čte jen při spuštění), nebo stejný klíč nastavuje proměnná prostředí a ta vyhrává.
FAQ#
Stačí SQLite pro blog na Ghostu?
Pro osobní blog nebo malou publikaci ano - je rychlá, nepotřebuje samostatný server a zálohuje se jako soubor. Vlastní doporučení Ghostu pro produkci dává přednost MySQL 8 a web s mnoha autory, velmi velkým seznamem členů nebo hodně souběžnými zápisy je místo, kde se MySQL začíná vyplácet. Pozdější přechod znamená export obsahu a import do nové instalace nastavené na MySQL.
Potřebuju k provozu Ghostu Mailgun?
Jen pro newslettery. Přihlašovací odkazy, pozvánky do redakce a obnova hesla jdou přes obyčejné SMTP. Blog, který nikdy neposílá články odběratelům e-mailem, může běžet bez Mailgunu libovolně dlouho.
Můžu použít vlastní doménu s bezplatným HTTPS?
Ano. Přidej doménu do slotu proxy, nasměruj záznam A na adresu serveru, počkej na certifikát, pak nastav url na adresu s https a restartuj Ghost. Certifikát se obnovuje automaticky.
Kolik paměti blog na Ghostu potřebuje?
Zhruba 1 GB pro osobní blog, což je i oficiálně uváděné minimum Ghostu. Víc pomůže při nahrávání velkých obrázků, velkých importech členů a rozesílání newsletterů. Samotná zobrazení stránek větší plán ospravedlní jen zřídka.
Přepíše aktualizace moje úpravy šablony?
Aktualizace Ghostu nahrazuje aplikaci, ne složku content, takže tvoje šablony a obrázky zůstanou. Riziko je jinde: aktualizace šablony od jejího autora může přepsat tvoje úpravy, a proto se upravená šablona přejmenovává. Před každou aktualizací stejně zálohuj.
Můžu přesunout existující web na Ghostu na nový server?
Ano. Na starém webu exportuj obsah jako JSON, zkopíruj složku content/images a svou šablonu, pak JSON naimportuj do nové instalace a nahraj šablonu. Členové se exportují a importují jako CSV. Funguje i zkopírování celé složky content, pokud obě instalace běží na stejné verzi Ghostu.


