У меня проблема: у меня два противоречащих друг другу требования к системе управления контентом. Главный операционный директор хочет, чтобы я по возможности избегал управления серверами или, по крайней мере, отдавал это на аутсорсинг. С другой стороны, генеральному директору и маркетингу нужно что-то, основанное на сети и простое в использовании. WordPress и CraftCMS, конечно же, кандидаты. Но это будет означать управление инфраструктурой LAMP. Юк.

«Ни у кого нет времени на DevOps»

Я согласен с обеими вышеупомянутыми противоречащими друг другу целями. У кого есть время нянчиться с серверами? Не я. Мне нужно написать код, и клиенты будут довольны. Я мог бы использовать просто генератор статических сайтов вроде Jekyll, но нам нужно больше. У меня есть важные внутренние клиенты - отдел маркетинга. Люди, которые ожидают красивого веб-интерфейса от своей CMS. Как я собираюсь сделать это со статическим веб-сайтом?

Чем так привлекательна бессерверная архитектура? Amazon Web Services перечисляет эти преимущества:

  • Нет операционных систем для выбора, защиты или управления
  • Нет серверов подходящего размера, мониторинга или масштабирования
  • Отсутствие риска для ваших расходов из-за избыточного выделения ресурсов
  • Отсутствие риска для вашей производительности из-за недостаточного выделения ресурсов

Уже существуют сотни тысяч производственных систем, использующих один из старейших и наиболее успешных бессерверных продуктов в мире: Amazon S3. - Оби Фернандес

К счастью, мне не пришлось писать веб-интерфейс для администратора. Contentful уже имеет это. Бум - Готово! Contentful радует моих специалистов по маркетингу на стороне администратора. Мне как разработчику это тоже нравится. Contentful выплевывает JSON, который я могу использовать как захочу. У них есть SDK для JavaScript, Ruby и других популярных языков.

Я решил использовать этот JSON из Contentful в генераторе статических сайтов. Почему? Потому что статические сайты могут размещаться без серверов. На Amazon S3, а еще лучше - на Высшем пилотажном.

Aerobatic позволяет мне ускорить предоставление лучших практик веб-хостинга:

Вот архитектурная схема:

Посмотрев на эту диаграмму, вы можете задаться вопросом - почему мы просто не выбрали WordPress? Если вышеуказанные причины отказа от управления серверами не позволяют вам покупать, примите во внимание следующее:

  • Вы хотите застрять в программировании устаревшего PHP-фреймворка в обозримом будущем в своей профессиональной карьере?
  • Вы хотите гибкости для создания рабочих процессов, выходящих за рамки того, что есть в WP или других CMS из коробки?
  • Вам нужен сайт, который легко и автоматически реплицируется в сеть доставки контента по всему миру, что делает его высокодоступным для ваших клиентов? Некоторые хосты используют CDN, но они не встроены в WordPress автоматически. Aerobatic делает это намного проще, без каких-либо плагинов и дополнительных сборов.
  • Вы хотите разделить редактирование и презентацию контента? Разве это не кажется действительно хорошей идеей - может быть, стоит приложить немного дополнительных усилий? Вы можете использовать современные передовые технологии, такие как ReactJS, Angular 2, TypeScript или даже Elm.
  • Использование статического сайта позволит вам гораздо меньше беспокоиться о безопасности, чем включение серверного кода, такого как PHP или даже Rails.
  • Никакого администрирования или настройки базы данных не требуется, и ваш сайт не ждет базу данных при каждой загрузке страницы.

Итак, каковы подробности того, как это произошло? Я выбрал GatsbyJS, потому что он позволяет мне создавать свой сайт с помощью React. Вы можете узнать больше о Гэтсби в моем посте о том, как разместить его на Высший пилотаж.

Ключевым фрагментом кода является этап перед сборкой, который считывает записи содержимого из Contentful и создает файлы JSON в файловой структуре сайта Gatsby, которые превращаются в страницы с настраиваемой оболочкой. Вот как это выглядит:

#!/usr/bin/env babel-node
require('dotenv').config()
import contentful from 'contentful'
import fs from 'fs-extra-promise'
// Contentful Config
const apiToken = process.env.CONTENTFUL_DELIVERY_API_TOKEN
const spaceId = process.env.CONTENTFUL_SPACE_ID
const client = contentful.createClient({ accessToken: apiToken, space: spaceId })
async function getEntriesByType (contentType, fields) {
  const options = { content_type: contentType, fields }
  try {
    return await client.getEntries(options)
  } catch (error) {
    console.log('fetching from contentful error: ', error)
    return []
  }
}
async function renderPost (post) {
  try {
    return fs.outputFile(
      `pages/blog/${post.fields.slug}/index.json`,
      JSON.stringify(post, null, 2)
    )
  } catch (error) {
    console.log('Error creating post', error)
    return Promise.reject('error')
  }
}
async function renderPage (page) {
  try {
    return fs.outputFile(
      `pages/${page.fields.slug}/index.json`,
      JSON.stringify(page, null, 2)
    )
  } catch (error) {
    console.log('Error creating page', error)
    return Promise.reject('error')
  }
}
async function main () {
  try {
    const posts = await getEntriesByType('post', { published: true })
    const postPromises = posts.items.map(post => renderPost(post))
    await Promise.all(postPromises)
    const pages = await getEntriesByType('page', { active: true })
    const pagePromises = pages.items.map(page => renderPage(page))
    await Promise.all(pagePromises)
  } catch (error) { console.log(error) }
}
main()

Чтобы понять этот код, посмотрите на основную функцию. Он ожидает загрузки записей из Contentful. Затем он перебирает каждую запись до файла создания на диске, который Гэтсби использует в процессе сборки статического сайта. Я использовал асинхронные / ожидающие функции Promises и ES2016, чтобы упростить асинхронный характер используемого кода.

В целом, разработка статического веб-сайта / «бессерверной» системы CMS стоила затраченных усилий. Я счастлив, что у меня нет возможности управлять серверами LAMP и платить за них. У моих пользователей неплохой пользовательский интерфейс, который мне не приходилось разрабатывать самостоятельно. А у посетителей моего сайта есть быстрый, отзывчивый сайт, который может справиться с любой нагрузкой, которую на него бросают. Я рекомендую вам мыслить нестандартно и рассмотреть эту архитектуру для своего следующего проекта CMS.