Indeks dziennikaDockup / notatka terenowa
Note / self-host-ghost

Jak uruchomić Ghost na własnym serwerze w 2026 roku: MySQL, newslettery i backupy treści

Praktyczny przewodnik po self-hostingu Ghost obejmujący Docker, porty, trwałość danych, TLS, bezpieczeństwo, backupy i problemy blokujące użycie produkcyjne. Krok po kroku.

Nieudane wdrożenie Ghost nie zawsze kończy się awarią. Aplikacja może wyświetlać stronę logowania, mimo że ustawienie url ma wartość HTTP albo volume z treścią został podmieniony. Zamiast tego rozpocznij od testu end-to-end: dokończ konfigurację właściciela, opublikuj wpis z obrazem, zasubskrybuj członka i wyślij testowy newsletter za pośrednictwem skonfigurowanej poczty.

Taki test odpowiada katalogowemu przeznaczeniu Ghost: platformie publikacyjnej z obsługą członkostw i newsletterów. Ujawnia też brakujące zależności, błędne założenia dotyczące proxy oraz efemeryczne dane wcześniej niż test uptime.

Wyznacz granice środowiska uruchomieniowego Ghost

Wyznacz trzy granice wokół Ghost: ingress do portu 2368, trwały stan oraz wymagania pomocnicze. Kontener można zastąpić, ale pozostałe dwa elementy wymagają jasno określonych właścicieli. Kontrakt sieciowy Ghost obejmuje MySQL 8, SMTP oraz opcjonalny object storage dla witryn intensywnie korzystających z mediów. Prywatne endpointy utrzymuj w wewnętrznym DNS, zezwalaj wyłącznie na wymagane połączenia wychodzące i nadaj Ghost ograniczone uprawnienia poświadczeń usługi.

Diagram jest kompletny, gdy czysty klient może dokończyć konfigurację właściciela, opublikować wpis z obrazem, zasubskrybować członka i wysłać testowy newsletter za pośrednictwem skonfigurowanej poczty. Zbieraj dane o czasie i zasobach dla zapytań MySQL, storage’u obrazów, renderowania motywu, liczby członków oraz limitów dostawcy masowej poczty. Jeśli transakcja się nie powiedzie, pierwsza granica, która nie zachowuje się zgodnie z dokumentacją, wskazuje, czy należy zbadać routing, lokalną wydajność czy usługę pomocniczą.

Sprawdź, czy Ghost przetrwa zastąpienie

Obraz kontenera można pobrać ponownie, ale bazy MySQL oraz motywów, obrazów i plików treści nie da się po prostu odtworzyć z obrazu. Zamontuj /var/lib/ghost/content przed bootstrapem, zapisz nieszkodliwe przykładowe dane i zastąp kontener, aby potwierdzić, że ta ścieżka jest rzeczywiście trwała. Sprawdź faktycznie używany mount zamiast ufać nazwie pliku Compose i upewnij się, że użytkownik uruchomieniowy może zapisywać w miejscu, którego oczekuje Ghost.

Ustal retencję i lokalizację poza hostem, a następnie przećwicz odtwarzanie bez dotykania produkcji. Próba kończy się powodzeniem tylko wtedy, gdy wrócą wpisy, członkowie, newslettery, motywy i obrazy, a testowy członek będzie mógł otworzyć odtworzoną publikację. W przypadku stanu opartego na bazie danych połącz snapshoty storage’u z eksportami spójnymi z aplikacją, zgodnie z opisem w artykule point-in-time recovery a snapshoty.

Poświadczenia, role i powierzchnie wystawione na zewnątrz

Specyficzne dla aplikacji ryzyko bezpieczeństwa polega na użyciu SQLite w niewspieranej topologii produkcyjnej albo na ujawnieniu poświadczeń poczty. Odpowiedzią operacyjną jest ochrona Ghost Admin, przechowywanie poświadczeń poczty i bazy danych po stronie serwera oraz ustawienie docelowego adresu HTTPS przed publikacją. Dokończ bootstrap przez ograniczoną trasę i natychmiast potem usuń tymczasowy dostęp konfiguracyjny.

url jest konfiguracją, a nie sekretem; jego wartość powinna być jawna, natomiast należy chronić oddzielne poświadczenia używane przez Ghost. Nadaj procesowi Ghost wyłącznie udokumentowane mounty i trasy do zależności; unikaj dostępu do głównego katalogu hosta oraz socketu Dockera. Rejestruj nieudane uwierzytelnianie i błędy konfiguracji, ale maskuj tokeny, connection stringi i treści użytkowników.

Sprawdź wdrożenie Ghost end-to-end

Dokument wdrożenia Ghost powinien zawierać fakty, a nie informację „wygląda dobrze”. Zapisz wybrany digest obrazu, checksum konfiguracji, publiczny hostname oraz wynik wraz z timestampem dla następujących czynności: dokończenia konfiguracji właściciela, publikacji wpisu z obrazem, zasubskrybowania członka i wysłania testowego newslettera za pośrednictwem skonfigurowanej poczty. Używaj przykładowych danych nieprodukcyjnych, aby test można było uruchamiać po każdym wdrożeniu.

Sprawdź osobno dwa zdarzenia cyklu życia. Zastąpienie kontenera musi zachować normalne działanie, a czyste odtwarzanie musi pokazać, że wracają wpisy, członkowie, newslettery, motywy i obrazy oraz że testowy członek może otworzyć odtworzoną publikację. Podczas testów mierz zapytania MySQL, storage obrazów, renderowanie motywu, liczbę członków i limity dostawcy masowej poczty, a wynik zachowaj jako oczekiwany zakres dla tej wersji.

Przetestuj także warunek odrzucenia lub nieprawidłowy warunek: tymczasowo odbierz testowej tożsamości dostęp do MySQL 8, SMTP i opcjonalnego object storage dla witryn intensywnie korzystających z mediów. Ghost powinien zakończyć działanie w sposób możliwy do zdiagnozowania i nie powinien nadpisywać poprawnego stanu. Przywróć prawidłowy warunek, ponownie uruchom przykład i dołącz odpowiednie zredagowane logi. Te artefakty dostarczają konkretnych dowodów potrzebnych przy podejmowaniu przyszłej decyzji o rollbacku.

Bazowa konfiguracja Ghost w Dockerze

Początkowe uruchomienie Ghost powinno być wystarczająco powtarzalne, aby można je było zrecenzować w pull requeście.

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

Nie polegaj na latest, gdy istnieją już rzeczywiste dane. Zapisz działający digest, użytkownika kontenera i właściciela mountu. Śledź log aplikacji podczas pełnego testu — dokończenia konfiguracji właściciela, publikacji wpisu z obrazem, zasubskrybowania członka i wysłania testowego newslettera za pośrednictwem skonfigurowanej poczty — oraz odnotuj wszelkie migracje przed skierowaniem trasy do ruchu produkcyjnego.

TLS jest proste; generowane URL-e już nie

Ustaw url na docelową domenę HTTPS przed publikacją. Skieruj wybrany hostname do portu kontenera 2368, przekaż oryginalny host i schemat HTTPS oraz unikaj publikowania drugiego, bezpośredniego originu.

Przetestuj Ghost z czystego klienta zewnętrznego. Oddziel awarię ingressu od znanej granicy aplikacji — ustawienie url ma wartość HTTP albo volume z treścią został podmieniony. Błąd certyfikatu, DNS lub 502 należy do routingu; żądanie, które dociera do Ghost i kończy się niepowodzeniem później, dotyczy stanu aplikacji, wydajności albo jej wymagania pomocniczego. Przewodnik po TLS dla własnej domeny omawia pierwszą grupę problemów.

Sprawdzanie wydajności i aktualizacji

Testy wydajności powinny obejmować zapytania MySQL, storage obrazów, renderowanie motywu, liczbę członków i limity dostawcy masowej poczty, a nie powtarzane żądania do /. Uruchom scenariusz „dokończ konfigurację właściciela, opublikuj wpis z obrazem, zasubskrybuj członka i wyślij testowy newsletter za pośrednictwem skonfigurowanej poczty” przy realistycznej równoległości oraz zapisz opóźnienie, współczynnik błędów i przyrost storage’u.

Planowanie aktualizacji musi uwzględniać to ryzyko: migracje Ghost, wymagania środowiska uruchomieniowego Node oraz własne motywy należy testować na sklonowanej witrynie. Przetestuj nowe wydanie z reprezentatywnymi danymi wejściowymi, a następnie ponownie wykonaj transakcję akceptacyjną i porównaj jej wynik. Jeśli ustawienie url ma wartość HTTP albo volume z treścią został podmieniony, zapisz nieudaną transakcję i sprawdź pierwszą zaangażowaną granicę, zamiast zakładać, że odpowiada za to ingress.

Przenieś powtarzalne zadania infrastrukturalne do Dockup

Routing, certyfikaty, zastępowanie usług i dołączony storage to rozsądne cele automatyzacji. Dockup obsługuje je dla Ghost i może udostępnić powiązaną zarządzaną bazę danych albo połączyć się z usługami na własnym serwerze klienta.

Nie powinien jednak samodzielnie wymyślać polityki zaufania Ghost. Po wdrożeniu ustaw url na docelową domenę HTTPS przed publikacją, wymuś tę granicę — chroń Ghost Admin, przechowuj poświadczenia poczty i bazy danych po stronie serwera oraz ustaw docelowy adres HTTPS przed publikacją — i zweryfikuj wynik następującego scenariusza: dokończ konfigurację właściciela, opublikuj wpis z obrazem, zasubskrybuj członka i wyślij testowy newsletter za pośrednictwem skonfigurowanej poczty. Rezultatem jest infrastruktura wdrażana jednym kliknięciem wraz z testem akceptacyjnym specyficznym dla aplikacji.

Najczęściej zadawane pytania

Czego Ghost potrzebuje do wdrożenia produkcyjnego?

Skieruj kontener Ghost przez port 2368 do jednego originu HTTPS. Wymagania sieciowe obejmują MySQL 8, SMTP i opcjonalny object storage dla witryn intensywnie korzystających z mediów. Nie uznawaj Ghost za gotowy, dopóki nie możesz dokończyć konfiguracji właściciela, opublikować wpisu z obrazem, zasubskrybować członka i wysłać testowego newslettera za pośrednictwem skonfigurowanej poczty.

Które dane Ghost powinny być objęte backupem?

Utrwal /var/lib/ghost/content i uwzględnij bazę MySQL oraz motywy, obrazy i pliki treści w tym samym manifeście odtwarzania. Czyste odtworzenie Ghost kończy się powodzeniem tylko wtedy, gdy wrócą wpisy, członkowie, newslettery, motywy i obrazy, a testowy członek będzie mógł otworzyć odtworzoną publikację.

Czy Ghost wymaga HTTPS za reverse proxy?

Używaj HTTPS dla publicznego originu Ghost, a port 2368 pozostaw na trasie wewnętrznej. Zastosuj prawidłowo ustawienie Ghost: ustaw url na docelową domenę HTTPS przed publikacją. W przypadku Ghost HTTPS chroni poświadczenia lub treści użytkowników podczas transmisji i zapewnia spójne działanie klienta zależne od originu.

Jak należy testować aktualizację Ghost?

Odtwórz bieżący stan Ghost w odizolowanym wdrożeniu, zastosuj wersję kandydującą i ponownie wykonaj transakcję akceptacyjną. Zwróć szczególną uwagę na to, że migracje Ghost, wymagania środowiska uruchomieniowego Node oraz własne motywy należy testować na sklonowanej witrynie. Zachowaj poprzedni obraz Ghost do czasu zrozumienia granic migracji danych i rollbacku.