Directus open-source headless CMS

Kai pradedi naują projektą ir reikia greitai sukurti backend’ą su patogiu administravimo interfeisu, dažnai susiduri su dilema: rašyti viską nuo nulio ar ieškoti gatavo sprendimo? Čia į pagalbą ateina Directus – open-source headless CMS, kuris pastaraisiais metais įgavo nemažą populiarumą tarp kūrėjų. Bet ar tikrai verta dėmesio, ar tai tik dar vienas įrankis perpildytoje rinkoje?

Kas tas Directus ir kodėl jis kitoks

Directus iš pirmo žvilgsnio gali atrodyti kaip dar viena content management sistema, bet iš tikrųjų tai kiek daugiau nei tradicinis CMS. Pagrindinė idėja – jūs naudojate savo SQL duomenų bazę (PostgreSQL, MySQL, SQLite ar net MS SQL), o Directus tiesiog „apsivynioja” aplink ją, suteikdamas REST ir GraphQL API, kartu su vizualia administravimo sąsaja.

Skirtumas nuo kitų sprendimų yra tas, kad Directus neprimetą savo duomenų struktūros. Jūsų lentelės lieka jūsų lentelės, be jokių keistų prefiksų ar papildomų meta stulpelių, kuriuos įprastai prideda kiti CMS. Galite net prijungti Directus prie jau egzistuojančios duomenų bazės, ir jis tiesiog pradės su ja dirbti. Tai ypač patogu, kai turite legacy projektą ir norite greitai pridėti modernų admin panelą.

Sistema parašyta naudojant Node.js ir Vue.js, kas reiškia, kad jei dirbi su šiomis technologijomis, kodas tau bus suprantamas ir lengvai pritaikomas. Bet net jei ne – dokumentacija tikrai gera, o bendruomenė aktyvi.

Kaip tai veikia praktikoje

Įdiegimas paprastas kaip trys kapeikos. Gali naudoti Docker (rekomenduoju), npm arba tiesiog parsisiųsti ir paleisti. Štai greitas Docker Compose pavyzdys:

version: '3'
services:
  directus:
    image: directus/directus:latest
    ports:
      - 8055:8055
    environment:
      KEY: 'your-secret-key'
      SECRET: 'another-secret-key'
      DB_CLIENT: 'postgres'
      DB_HOST: 'database'
      DB_PORT: '5432'
      DB_DATABASE: 'directus'
      DB_USER: 'directus'
      DB_PASSWORD: 'directus'
      ADMIN_EMAIL: '[email protected]'
      ADMIN_PASSWORD: 'password'

Po kelių minučių jau turi veikiančią sistemą. Prisijungi prie admin panelo, ir čia prasideda magija. Sąsaja intuityvi – gali kurti collections (lenteles), nustatyti laukų tipus, ryšius tarp lentelių, teises. Viskas drag-and-drop principu, be jokio kodo rašymo.

Bet štai kur įdomiausia dalis – visi pakeitimai, kuriuos darai per admin panelą, iš karto atsispindi duomenų bazėje kaip normalios SQL lentelės. Nėra jokio tarpinio sluoksnio ar abstraktaus modelio. Tai reiškia, kad gali tiesiogiai dirbti su duomenų baze per SQL, jei reikia, ir Directus vis tiek supras, kas vyksta.

API galimybės ir integracija

Directus automatiškai generuoja REST API endpoint’us visiems tavo collections. Nereikia rašyti jokių controller’ių ar route’ų – viskas veikia iš karto. Pavyzdžiui, jei sukūrei „articles” collection, automatiškai gauni:

  • GET /items/articles – gauti visus įrašus
  • GET /items/articles/:id – gauti konkretų įrašą
  • POST /items/articles – sukurti naują
  • PATCH /items/articles/:id – atnaujinti
  • DELETE /items/articles/:id – ištrinti

O jei labiau mėgsti GraphQL – ir tai yra. Vienas endpoint’as, per kurį gali daryti bet kokias užklausas. Filtering, sorting, pagination, nested relations – viskas veikia out of the box. Štai pavyzdys:

query {
  articles(filter: { status: { _eq: "published" } }, sort: "-date_created") {
    id
    title
    author {
      first_name
      last_name
    }
    categories {
      categories_id {
        name
      }
    }
  }
}

Kas man asmeniškai patinka – galimybė naudoti field’ų filtravimą tiesiogiai per API. Nereikia gauti viso objekto, jei tau reikia tik kelių laukų. Tai sutaupo tiek trafiko, tiek serverio resursų.

Teisių valdymas ir saugumas

Čia Directus tikrai gerai padirbėjo. Teisių sistema labai detali – gali nustatyti, kas gali matyti, kurti, redaguoti ar trinti konkrečius collection’us, net konkrečius laukus. Gali sukurti custom roles ir priskirti jiems specifines teises.

Bet dar įdomiau – gali nustatyti teises pagal duomenų turinį. Pavyzdžiui, vartotojas gali redaguoti tik tuos straipsnius, kurių autorius yra jis pats. Arba gali matyti tik tuos įrašus, kurie pažymėti kaip „published”. Tai daroma per field permissions ir custom filters.

Autentifikacija palaiko JWT tokens, OAuth2, SSO. Gali integruoti su Google, Facebook, GitHub ar bet kokiu kitu OAuth provider’iu. Jei reikia kažko specifinio – yra hooks sistema, per kurią gali įterpti savo logiką.

Failų valdymas ir transformacijos

Viena iš stipriausių Directus pusių – failų tvarkymas. Upload’ini failą, ir jis automatiškai saugomas (gali rinktis local storage, S3, Google Cloud Storage, Azure). Bet čia ne viskas – Directus turi integruotą image transformation engine.

Pavyzdžiui, upload’inai high-resolution nuotrauką, o per API gali gauti bet kokio dydžio, formato ar kokybės versiją on-the-fly:

/assets/abc123.jpg?width=400&height=300&fit=cover&quality=80&format=webp

Sistema automatiškai sugeneruos ir cache’ins transformuotą versiją. Tai neįtikėtinai patogu, kai dirbi su responsive dizainu ar reikia optimizuoti puslapio įkėlimo greitį. Nebereikia rašyti custom image processing logikos ar naudoti trečiųjų šalių servisų.

Extensibility ir customization

Nors Directus out-of-the-box suteikia daug funkcionalumo, tikrasis jo potencialas atsiskleidžia, kai pradedi customize’inti. Yra keletas būdų, kaip tai padaryti:

Extensions – gali kurti custom interfaces (kaip laukai atrodys admin panele), displays (kaip duomenys rodomi sąrašuose), layouts (kaip organizuoti collection’ų vaizdavimą), modules (visiškai nauji admin panelo skyriai). Pavyzdžiui, sukūriau custom interface WYSIWYG editoriui su specifinėmis funkcijomis – užtruko gal valandą laiko.

Hooks – tai event’ai, kurie triggerinasi tam tikrais momentais (prieš/po create, update, delete operacijų). Per juos gali įterpti bet kokią custom logiką. Pavyzdžiui, siųsti email’ą, kai sukuriamas naujas įrašas, arba validuoti duomenis pagal sudėtingas taisykles.

Custom Endpoints – jei standartinių API endpoint’ų nepakanka, gali sukurti savo. Tai paprasti Express.js route’ai, kurie turi prieigą prie Directus services ir duomenų bazės.

Štai paprastas hook’o pavyzdys, kuris automatiškai generuoja slug’ą iš pavadinimo:

export default ({ filter }, { services, exceptions }) => {
  filter('articles.items.create', async (input, meta, context) => {
    if (input.title && !input.slug) {
      input.slug = input.title
        .toLowerCase()
        .replace(/[^a-z0-9]+/g, '-')
        .replace(/(^-|-$)/g, '');
    }
    return input;
  });
};

Realūs use case’ai ir patirtis

Naudojau Directus keliuose projektuose, ir kiekvienas buvo skirtingas. Vienas – e-commerce backend’as su sudėtinga produktų struktūra ir inventoriaus valdymu. Kitas – content platform’a su multi-language palaikymu ir sudėtinga workflow sistema. Trečias – paprastas blog’as su keliais autoriais.

Kas veikė gerai: greitas setup’as, nereikėjo rašyti CRUD operacijų, admin panelas iš karto funkcionalus ir gražus. Klientai galėjo pradėti naudoti sistemą be jokio apmokymo – viskas intuityvu. Multi-language palaikymas veikia puikiai, tereikia įjungti translations extension’ą.

Kur buvo iššūkių: performance su labai dideliais duomenų kiekiais. Kai lentelėje yra šimtai tūkstančių įrašų, admin panelas gali lėtėti. Sprendimas – optimizuoti indeksus ir naudoti custom queries sudėtingesnėms operacijoms. Taip pat, jei reikia labai specifinės logikos, kartais lengviau parašyti custom endpoint’ą nei bandyti pritaikyti standartinius.

Dar vienas dalykas – versijų suderinamumas. Directus aktyviai vystomas, ir kartais major update’ai gali reikalauti migration’ų. Bet dokumentacija paprastai gera, ir upgrade path’as aiškus.

Ar verta rinktis ir kada ne

Directus tikrai verta dėmesio, jei:

  • Reikia greitai sukurti backend’ą su admin panelu
  • Nori turėti pilną kontrolę virš duomenų bazės struktūros
  • Projektas reikalauja API-first požiūrio
  • Dirbi su komanda, kur ne visi yra programuotojai
  • Reikia multi-language palaikymo

Bet galbūt ne geriausias pasirinkimas, jei:

Projektas turi labai specifinę logiką, kuri nesiderina su CRUD operacijomis. Pavyzdžiui, real-time aplikacijos su WebSocket’ais ar sudėtingi calculation engine’ai – čia geriau rašyti custom backend’ą. Arba jei dirbi su NoSQL duomenų bazėmis (MongoDB ir pan.) – Directus orientuotas į SQL.

Taip pat, jei komandoje niekas nežino Node.js ir nenori mokytis – gali būti sunku customize’inti sistemą. Nors basic funkcionalumas veikia be programavimo, bet realūs projektai dažnai reikalauja bent minimalaus kodo rašymo.

Performance klausimas irgi svarbus. Jei žinai, kad projektas turės milžinišką traffic’ą ir labai sudėtingas užklausas, galbūt verta pagalvoti apie custom sprendimą, optimizuotą konkrečiam use case’ui. Bet daugumai projektų Directus performance yra daugiau nei pakankamas, ypač jei teisingai sukonfigūruoji caching ir database indeksus.

Asmeniškai rekomenduoju išbandyti Directus naujuose projektuose, ypač jei dirbi su startup’ais ar MVP. Sutaupysi daug laiko, kurį galėsi skirti verslo logikai vietoj CRUD operacijų rašymo. O jei vėliau supratai, kad reikia kažko specifinio – visada gali išplėsti funkcionalumą per extensions arba net migruoti duomenis kitur, nes duomenų bazė lieka tavo kontrolėje. Tai tikrai vienas iš lankščiausių headless CMS sprendimų rinkoje šiuo metu.

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *