Illustration for the article: Cloudflare Workers a D1: backend bez servera

Cloudflare Workers a D1: backend bez servera

Čo sú Cloudflare Workers a databáza D1, ako začať s nástrojom wrangler, pre koho sa hodia a na aké pasce si dať pozor. Návod pre začiatočníkov.

Tomáš Renčík4 min read

Stručne: Cloudflare Workers je kód, ktorý beží v sieti Cloudflare blízko návštevníka, bez vlastného servera. D1 je k nemu serverless databáza postavená na SQLite. Spolu stačia na backend mnohých webov a aplikácií — bez správy Linuxu, záloh a nočných výpadkov.

Keď som začínal, „backend“ znamenal prenajať si server, nainštalovať naň Linux, webový server, databázu, nastaviť zálohy a modliť sa, aby sa to v noci nezrútilo. Dnes pre veľa projektov stačí niečo omnoho jednoduchšie.

Ukážem vám, ako funguje Cloudflare Workers s databázou D1.

Čo je Worker

Worker je kúsok JavaScriptu (alebo TypeScriptu), ktorý beží na sieti Cloudflare — blízko používateľa, nie na jednom serveri niekde v dátovom centre. Príde požiadavka, Worker ju spracuje a vráti odpoveď.

Najjednoduchší Worker:

export default {
  async fetch(request) {
    return new Response('Ahoj zo sveta!')
  },
}

Žiadny server, žiadny port, žiadny proces, ktorý treba strážiť.

Čo je D1

D1 je databáza postavená na SQLite. Píšete normálne SQL. Worker k nej pristupuje cez takzvaný binding — premennú, ktorú mu Cloudflare pripojí.

export default {
  async fetch(request, env) {
    const { results } = await env.DB
      .prepare('SELECT id, nazov FROM ulohy WHERE hotova = ? ORDER BY id DESC')
      .bind(0)
      .all()
    return Response.json(results)
  },
}

Všimnite si bind(0) — hodnoty nikdy nelepte do SQL textu. Vždy cez parametre. Je to najjednoduchšia ochrana pred SQL injection.

Nástroj wrangler

Všetko ovládate cez príkazový riadok wrangler:

npx wrangler dev                      # lokálny vývoj
npx wrangler d1 create moja-db        # nová databáza
npx wrangler d1 execute moja-db --local  --file=migracia.sql
npx wrangler d1 execute moja-db --remote --file=migracia.sql
npx wrangler deploy                   # nasadenie

Pozor na rozdiel --local a --remote. Lokálna databáza je len na vašom počítači, vzdialená je tá ostrá. Keď si to raz pomýlite, zapamätáte si to navždy.

Čo sa mi na tom páči

  • Nulová správa servera. Neriešim aktualizácie systému ani výpadky disku.
  • Rýchlosť pre používateľa. Kód beží blízko neho.
  • Zálohy a návrat v čase. D1 si pamätá históriu, takže sa dá vrátiť do stavu spred chyby (tzv. Time Travel — pozrite si v dokumentácii, na koľko dní dozadu to vo vašom pláne ide).
  • Cena. Na malé projekty často stačí bezplatný plán, platený je lacný. Aktuálne limity a ceny si vždy overte na stránke Cloudflare, menia sa.

Pasce, ktoré stoja za zmienku

1. Limity výpočtového času. Worker má obmedzený čas procesora na jednu požiadavku (na bezplatnom pláne je malý). Na bežné API stačí, ale ťažké vykresľovanie veľkých stránok na serveri ho vie prekročiť. Riešenie: menej práce na jednu požiadavku, stránkovanie, prípadne platený plán.

2. Nie je to Node.js. Worker beží v inom prostredí. Veľa balíčkov z npm funguje, ale tie, ktoré potrebujú súborový systém alebo špeciálne Node moduly, nie (alebo len so zapnutou kompatibilitou).

3. Čas je v UTC. datetime('now') v D1 vráti čas v UTC, nie slovenský. Na tomto som stratil viac hodín, než by som chcel priznať — píšem o tom samostatný článok.

4. Migrácie robte premyslene. Najprv pridať stĺpec, potom nasadiť kód, ktorý ho používa. Nikdy naopak.

5. Tajomstvá nepatria do kódu. API kľúče ukladajte ako secrets (wrangler secret put NAZOV), nie do súboru v gite.

Pre koho to je

Workers + D1 je výborné na:

  • API pre mobilnú alebo webovú aplikáciu,
  • administrácie a interné nástroje,
  • menšie weby s databázou,
  • automatizácie (Workers vedia bežať aj podľa časovača).

Menej vhodné je na dlhé výpočty, veľké súbory (na tie je úložisko R2) a veci, ktoré potrebujú plnohodnotný server.

Prečo nie klasický server?

Klasický server má stále svoje miesto — dlhé výpočty, špeciálny softvér, plná kontrola. Pre väčšinu malých a stredných aplikácií však prináša starosti, ktoré nesúvisia s vaším produktom: aktualizácie, zabezpečenie, monitorovanie, zálohy disku. Workers vám ich zoberú a vy sa sústredíte na to, čo aplikácia robí.

Časté otázky

Je D1 vhodná na veľkú aplikáciu? Na menšie a stredné projekty áno. Má limity na veľkosť databázy a počet operácií — pozrite si ich v dokumentácii a porovnajte s tým, čo plánujete. Ak rastiete, dá sa dáta rozdeliť alebo zvoliť inú databázu.

Môžem mať web aj API spolu? Áno. Cloudflare Pages vie hostiť web a zároveň spúšťať serverový kód, ktorý pristupuje k D1. Veľa frameworkov (Nuxt, Astro, SvelteKit) má na to pripravený adaptér.

Ako zálohujem dáta? Okrem návratu v čase si viete databázu exportovať príkazom wrangler d1 export a uložiť kópiu mimo Cloudflare. Záloha, ktorú máte len u jedného poskytovateľa, nie je úplná záloha.

Čo lokálny vývoj? wrangler dev spustí lokálnu verziu vrátane databázy. Dáta sú v skrytom priečinku projektu — nezmažte ho omylom, keď upratujete.

Ako začať

  1. Založte si bezplatný účet na Cloudflare.
  2. npm create cloudflare@latest a vyberte jednoduchý Worker.
  3. Pridajte D1 databázu a jednu tabuľku.
  4. Napíšte dve cesty: zoznam a pridanie záznamu.
  5. Nasaďte a pošlite odkaz kamarátovi.

Za jeden večer máte backend, ktorý beží po celom svete. Keď som začínal, o takom som mohol len snívať.

Súvisiace články

  • #Cloudflare
  • #Workers
  • #D1
  • #SQLite
  • #serverless

More from the blog