Kiedy postanowiłem odpalić własnego bloga, stanąłem przed klasycznym dylematem: WordPress, Ghost, Hugo, a może coś własnego? Wybrałem stworzenie własnego rozwiązania, które finalnie generuje statyczną stronę HTML. Dlaczego? Bo wyznaje zasadę: im prościej coś jest zrobione, tym łatwiej mi to utrzymać.
TL;DR
| Aspekt | Moje rozwiązanie |
|---|---|
| Framework | Symfony 7.3 |
| Generowanie | StaticContentGeneratorBundle |
| Hosting | Mikrus (VPS) |
| Deploy | GitHub Actions |
| Migracja | ~30 minut |
Dlaczego statyczne strony?
Prostota przede wszystkim. Statyczne strony to:
- Zero backendu - nie ma co się zepsuć
- Błyskawiczne ładowanie - serwer wysyła gotowy HTML
- Tani hosting - wystarczy nginx serwujący pliki
W odcinku Patoarchitektów #155 o "biedahostingu" padł cytat, który dobrze podsumowuje moje podejście:
Są w życiu rzeczy, które warto i są takie, które się opłaca. Nie zawsze to co warto się opłaca, nie zawsze to co się opłaca warto.
Jak to działa?
Używam paczki StaticContentGeneratorBundle autorstwa Norberta Orzechowicza. Realne przykłady wykorzystania znajdziesz w repo norbert.tech (strona autora) oraz na przykładzie dokumentacji Flow PHP.
Działa to tak:
- Piszę kod jak normalną aplikację Symfony - kontrolery, Twig, routing
- Odpalamy build - bundle przechodzi po wszystkich routach i zapisuje wyrenderowany HTML
- Output to folder ze statycznymi plikami - gotowy do wrzucenia na dowolny serwer
# Cały proces budowania
composer build
Pod spodem dzieje się magia:
# Czyścimy cache
APP_ENV=prod bin/console cache:clear
# Budujemy assety (Tailwind, JS)
APP_ENV=prod bin/console tailwind:build --minify
APP_ENV=prod bin/console asset-map:compile
# Generujemy statyczne HTML
APP_ENV=prod bin/console static-content-generator:generate:routes
# Sitemap dla SEO
APP_ENV=prod bin/console presta:sitemaps:dump
# Kopiujemy assety do outputu
APP_ENV=prod bin/console static-content-generator:copy:assets
Struktura contentu
Artykuły trzymam jako pliki Markdown z frontmatterem:
content/
├── static-site-symfony/
│ ├── pl.md # Polska wersja
│ └── en.md # Angielska wersja
└── helm-vs-kustomize/
├── pl.md
└── en.md
Każdy artykuł to zwykły Markdown z YAML-owym nagłówkiem. Przetwarzam go przez league/commonmark z dodatkami jak GFM, tabele czy automatyczne anchory do nagłówków.
Hosting i deploy
Całość hostuję na Mikrusie - polskim VPS za grosze. Sam korzystam z Mikrus 3.5 (4 GB RAM, 40 GB dysku), bo oprócz bloga trzymam tam kilka innych aplikacji i stronę firmową.
Do samego bloga wystarczy znacznie mniej - Mikrus 1.0 albo nawet darmowy Frog spokojnie obsłuży statyczne pliki.
Szukasz taniego VPS-a pod własne projekty? Polecam - link z refem.
Deploy? Push do main odpala GitHub Actions, który buduje stronę i rsync'uje na serwer:
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build static site
run: composer build
- name: Deploy to server
run: rsync -avz output/ user@server:/var/www/blog/
Migracja? 30 minut
To jest moja ulubiona część. Chcę przenieść bloga na inny serwer? Oto cały proces:
- Postawić nginx na nowym serwerze (~5 min)
- Wygenerować klucze SSH i zmienić sekrety w GitHub Actions (~5 min)
- Uruchomić akcję deployującą na nowy serwer (~1 min)
- Przepiąć DNS (~20 min na propagację)
Nie ma bazy do migracji. Nie ma środowiska PHP do konfiguracji. Nie ma zależności od konkretnego hostingu.
Gdybym używał WordPressa, migracja to: eksport bazy, import bazy, konfiguracja wp-config, testowanie czy wszystko działa, modlenie się żeby pluginy nie zrobiły problemów...
Dlaczego Symfony, a nie Hugo/Jekyll?
Mógłbym użyć dedykowanego generatora statycznych stron. Ale:
- Znam Symfony - nie muszę się uczyć nowego toola
- Pełna kontrola - mogę dodać dowolną logikę w PHP
- Reużywalność - te same komponenty co w komercyjnych projektach
- Twig - potężny system szablonów, który znam na pamięć
Wady?
Żeby być fair:
- Brak komentarzy out-of-the-box - musiałbym dodać Disqus lub coś podobnego
- Brak CMS-a - piszę w Markdownie w edytorze kodu
Dla mnie te kompromisy są akceptowalne. Wolę pisać w IDE niż utrzymywać WordPressa.
Podsumowanie
Nudne rozwiązania to inwestycja w spokój. Statyczny HTML może nie jest sexy, ale w perspektywie miesięcy i lat zwraca się z nawiązką – działa stabilnie, utrzymuje się sam, przeniosę go gdziekolwiek w 30 minut.
Jeśli budujesz bloga i znasz PHP - rozważ to podejście. Nie potrzebujesz Kubernetesa, bazy danych ani skomplikowanej infrastruktury. Czasem nginx serwujący pliki HTML to wszystko, czego potrzebujesz.
Masz pytania? Napisz na LinkedIn.