У меня проблема: у меня два противоречащих друг другу требования к системе управления контентом. Главный операционный директор хочет, чтобы я по возможности избегал управления серверами или, по крайней мере, отдавал это на аутсорсинг. С другой стороны, генеральному директору и маркетингу нужно что-то, основанное на сети и простое в использовании. WordPress и CraftCMS, конечно же, кандидаты. Но это будет означать управление инфраструктурой LAMP. Юк.
«Ни у кого нет времени на DevOps»
Я согласен с обеими вышеупомянутыми противоречащими друг другу целями. У кого есть время нянчиться с серверами? Не я. Мне нужно написать код, и клиенты будут довольны. Я мог бы использовать просто генератор статических сайтов вроде Jekyll, но нам нужно больше. У меня есть важные внутренние клиенты - отдел маркетинга. Люди, которые ожидают красивого веб-интерфейса от своей CMS. Как я собираюсь сделать это со статическим веб-сайтом?
Чем так привлекательна бессерверная архитектура? Amazon Web Services перечисляет эти преимущества:
- Нет операционных систем для выбора, защиты или управления
- Нет серверов подходящего размера, мониторинга или масштабирования
- Отсутствие риска для ваших расходов из-за избыточного выделения ресурсов
- Отсутствие риска для вашей производительности из-за недостаточного выделения ресурсов
Уже существуют сотни тысяч производственных систем, использующих один из старейших и наиболее успешных бессерверных продуктов в мире: Amazon S3. - Оби Фернандес
К счастью, мне не пришлось писать веб-интерфейс для администратора. Contentful уже имеет это. Бум - Готово! Contentful радует моих специалистов по маркетингу на стороне администратора. Мне как разработчику это тоже нравится. Contentful выплевывает JSON, который я могу использовать как захочу. У них есть SDK для JavaScript, Ruby и других популярных языков.
Я решил использовать этот JSON из Contentful в генераторе статических сайтов. Почему? Потому что статические сайты могут размещаться без серверов. На Amazon S3, а еще лучше - на Высшем пилотажном.
Aerobatic позволяет мне ускорить предоставление лучших практик веб-хостинга:
- У меня могут быть промежуточные сайты на основе веток git.
- Я могу защитить паролем свои сайты.
- Я легко могу добавить безопасные сертификаты.
- Я могу легко делать запросы к API, не беспокоясь о CORS.
- и другие функции экономии времени.
Вот архитектурная схема:
Посмотрев на эту диаграмму, вы можете задаться вопросом - почему мы просто не выбрали 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.