Przejdź do treści

Zmigrowałem bloga z Next.js do Astro

Next.js to był overkill, a Strapi wymagał ciągłego klikania po UI. Przeniosłem bloga na Astro i Cloudflare, posty trzymam w repo jako MDX, infrastrukturę w OpenTofu, a Lighthouse pokazuje 100/100.

Franek WojtasBuild in Public3 min czytania

Uszanowanko!

Dawno mnie tu nie było. Tęskniliście?

No więc tak, jak mówi tytuł. Pierwotnie mój blog działał na Next.js, a hostowany na Vercel i Strapi CMS hostowany na Railway. Jednak po pewnym czasie stwierdziłem, że to nie jest najlepsze rozwiązanie. Dlatego postanowiłem zmigrować bloga do Astro bez dedykowanego CMS. Jak chcecie przeczytać o tym, dlaczego pierwotnie wybrałem Next.js i Strapi, to odsyłam do mojego poprzedniego wpisu jak stworzyłem bloga w Next.js i Strapi.

Dlaczego odszedłem z Next.js i Strapi?

Nic do Next.js nie mam. Dalej uważam, że to świetny framework. Jednak w moim przypadku Next.js to był trochę overkill. Mój blog nie potrzebuje wielu funkcji, które oferuje Next.js. Z tego powodu postanowiłem zmigrować bloga do Astro, który jest lżejszy i bardziej odpowiedni do tego typu projektów. Next.js wysyła sporo JS do przeglądarki, a ja tego nie potrzebuje. Chcę, aby mój blog był szybki i lekki, dlatego Astro jest lepszym wyborem.

Dodatkowo jest kwestia CMS. W tym projekcie po raz pierwszy korzystałem ze Strapi. Ogólnie całkiem spoko CMS, ale nie dla mnie. Nie za bardzo lubię klikać po UI. Każda zmiana, każdy nowy post wymagał ode mnie logowania się do Strapi i klikania po UI. Dużo wygodniej, jeśli wszystko mam w jednym miejscu, czyli w repo. Na Strapi wpisy i tak pisałem w Markdown, więc po co mi CMS? Lokalnie mogę sobie odpalić dev server i od razu wszystko testować, na Strapi ustawienie live preview wymagało dodatkowej konfiguracji. No i kwestia utrzymania dwóch osobnych projektów. Więcej roboty przy aktualizacjach, utrzymanie dwóch osobnych aplikacji, dodatkowe koszty hostingu. A teraz? Wszystko w jednym miejscu, jeden projekt, jeden hosting, statyczne posty w Markdown, które mogę edytować w VS Code. Prosto i wygodnie.

Przed: Next.js + Strapi

Przed: Next.js + StrapiNext.js na Vercel pobiera treść przez API ze Strapi hostowanego na Railway i zdjęcia z Cloudflare R2. Domena jest na Cloudflare.VercelNext.jsSSG + ISRRailwayStrapi CMSpanel adminaCloudflareR2storageDNSdomenatreśćzdjęcia

Po: Astro

Po: AstroCały blog działa na Cloudflare: Astro z treścią i zdjęciami w repozytorium, domena oraz R2 ze stanem OpenTofu.CloudflareAstrotreść i zdjęcia w repoDNSdomenaR2stan OpenTofu
Przed: Vercel, Railway i Cloudflare. Po: wszystko na Cloudflare, treść w repo.

Hosting na Cloudflare zamiast Vercela

W nowej wersji, bloga przeniosłem na Cloudflare. Głównym powodem był koszt hostingu, a że domenę i R2 już tak czy siak miałem na Cloudflare to był dodatkowy atut. Napisałem proste CI/CD, które publikuję nową wersje bloga przez Cloudflare Wrangler po merge PR. Nic specjalnego, ale bardzo wygodne (na Vercel też to było). Przez chwilę chciałem też dodać środowisko testowe na subdomenie, ale na szczęście szybko zrozumiałem, że dla bloga, którego tworzę samodzielnie to zdecydowanie overkill. Musiałem kilka rzeczy wyklikać na UI, a jak już wcześniej wspomniałem, nie jestem tego największym fanem. Więc w przypływie olśnienia uznałem, że dołożę infrastructure as a code co idealnie pasuje do mojego przypadku. I wybór padł na OpenTofu.

Droga requestu na buildandmarket.devRequest z przeglądarki trafia do Cloudflare (TLS, WAF, przekierowanie z www). Większość ścieżek obsługują statyczne assety bez uruchamiania Workera. Worker obsługuje tylko trzy ścieżki: / wybiera język, /_actions/* to Astro Actions, a /a/* to proxy PostHog.PrzeglądarkaCloudflareTLS, WAF, przekierowanie wwwAssety statyczneHTML, CSS, 404.htmlWorker
Większość requestów obsługują statyczne assety. Worker odpala się tylko dla trzech endpointów.

Infrastruktura jako kod w OpenTofu

OpenTofu, mój wybór dla IaC. Dla niewtajemniczych, to jest to fork Terraforma, który powstał w odpowiedzi na zamianę licencji tego drugiego. To narzędzie pozwala konfigurować środowisko i ustawienia na platformach takich jak Cloudflare czy AWS. Wszystko co możemy wyklikać w UI jest konfigurowalne z poziomu kodu. Spełnienie marzeń. W przypadku bloga konfiguracja jest dość prosta, nie ma tu żadnych fajnych bajerów, ale jest to mega wygodne. W razie jakiejś zmiany to trzeba dopisać tylko troszku kodu, kilka komend i gotowe. Zero klikania po UI.

resource "cloudflare_workers_custom_domain" "production" {
  account_id = var.account_id
  zone_id    = var.zone_id
  hostname   = "buildandmarket.dev"
  service    = "buildandmarket"
}

Wydajność po migracji: 100/100 w Lighthouse

Astro słynie z tego, że do przeglądarki wysyła minimum JS, więc zaskoczeniem nie będzie, że blog śmiga. Praktycznie bez większego nakładu Lighthouse wszędzie pokazał 100/100. Dodatkowo serwowanie statycznych plików oraz cache na Cloudflare, więc blog nie ma innej możliwości niż śmiganie.

Wyniki testu wydajności bloga po migracji z Next.js do Astro w Google PageSpeed Insights. Wydajność 100/100, dostępność 100/100, najlepsze praktyki 100/100, SEO 100/100.

Teraz pozostaje już tylko najważniejsza część bloga: pisanie postów.