Alexander Mirvis

Функции моей кастомной CMS

Подробный обзор кастомной CMS, лежащей в основе AlexanderMirvis.com: публикация материалов, быстрые посты, SEO, платный доступ через Stripe, платные комментарии, средства безопасности, управление медиафайлами, автоматизация и интерактивные функции сайта.

Возможности сайта

Создан с нуля, потому что, видимо, мне понадобилась собственная CMS.

AlexanderMirvis.com работает на собственной системе управления контентом, созданной специально для того, как я пишу, публикую, организую, защищаю и автоматизирую контент. Она объединяет публикацию материалов, искусственный интеллект, SEO-инструменты, платежи, мониторинг безопасности, управление медиафайлами, короткие публикации, переводы и несколько ненужных визуальных эффектов на космическую тему, которые стали необходимыми в тот момент, когда я их добавил.

Собственная система управления контентом

Сайт работает не на WordPress. Он использует собственную систему управления контентом на PHP и MySQL, разработанную с учётом функций, которыми я действительно пользуюсь. Страницы, публикации, медиафайлы, меню, настройки SEO, комментарии, пользователи, перенаправления, баннеры, переводы, инструменты ИИ, платежи и средства контроля безопасности управляются из единого административного интерфейса.

Создание CMS своими силами также означает, что я знаю, где находится код, что он делает и зачем он существует. Если что-то ломается, мне не приходится выяснять, возникла ли проблема из-за WordPress, темы, плагина номер 37 или аварийного плагина совместимости для плагина номер 37.

Страницы и публикации

CMS поддерживает обычные страницы сайта и длинные публикации. Статьи могут содержать категории, подкатегории, теги, избранные изображения, пользовательские URL, отрывки, метаданные SEO, запланированную публикацию, баннеры, комментарии, переводы и настройки платного контента.

Публикации используют чистые иерархические URL-адреса и могут быть организованы по темам без необходимости помещать каждый фрагмент контента в одну и ту же структуру. Редакторы также могут сразу открыть опубликованную страницу, что избавляет от традиционного ритуала открытия трёх вкладок браузера и попыток вспомнить, в какой из них находится общедоступная версия.

Быстрые публикации

Отдельный раздел Posts предназначен для коротких мыслей, ссылок, новостей, технических заметок и идей, которые не должны превращаться в полноценную статью. Публикации могут содержать до 500 слов и поддерживают фотографии, кликабельные ссылки, хэштеги, карточки общих ссылок, видео YouTube, временные метки, поиск и публикацию по расписанию.

Представьте это как мою собственную небольшую социальную ленту, без необходимости спорить с алгоритмом о том, может ли кто-нибудь увидеть то, что я опубликовал.

Платный контент Stripe

Отдельные страницы, публикации и быстрые записи можно разместить за пейволлом Stripe. Для каждого элемента можно установить собственную цену, а я могу точно решить, где заканчивается бесплатная часть, вставив Paywall Break в контент.

Сначала посетители видят введение или выбранный предварительный просмотр. Если они хотят продолжить чтение, они могут открыть остальную часть с помощью разового платежа Stripe. Когда я вошёл в CMS как администратор, весь контент остаётся видимым для меня без необходимости платить самому себе, что было бы довольно неэффективной бизнес-моделью.

Платные статьи, удобные для поиска

Платные статьи могут оставаться доступными для индексации поисковыми системами, пока ограниченный раздел визуально защищён для обычных посетителей. Структурированные данные указывают на платную часть страницы, позволяя поисковым системам понять, что статья содержит премиум-контент, а не интерпретировать ограничение как случайно скрытый текст.

Для отдельных материалов по-прежнему можно установить noindex и nofollow, если я специально не хочу, чтобы они отображались в результатах поиска.

Центр SEO

Центр SEO предоставляет инструменты для управления заголовками, описаниями, ключевыми словами, каноническими URL, настройками индексации, созданием карт сайта, перенаправлениями, переведёнными URL и другими настройками, связанными с поиском. При необходимости страницы и публикации можно по отдельности исключать из поисковых систем.

CMS автоматически создаёт и обновляет XML-карту сайта, содержащую подходящий общедоступный контент. Публикации, страницы, категории, переводы, быстрые публикации и поддерживаемые отдельные общедоступные приложения могут обнаруживаться и добавляться без необходимости каждый раз вручную редактировать XML-файл при изменении содержимого.

Входящие ссылки и анализ трафика

Центр SEO фиксирует внешние URL источников переходов, которые фактически направляют посетителей на сайт. Это позволяет увидеть, какие домены ссылаются на сайт, на какие страницы переходят посетители, и как часто происходят такие переходы.

Из аналитики также можно исключить определённые IP-адреса, диапазоны сетей и домены источников переходов. Это полезно для фильтрации ботов, систем мониторинга, серверного трафика и других посетителей, которые могут быть технически реальными, но не особенно полезны при попытке понять фактический трафик от людей.

OpenAI и публикация с помощью ИИ

Искусственный интеллект интегрирован непосредственно в CMS, а не существует как отдельный инструмент для копирования и вставки. ИИ может помогать с написанием текстов, улучшением контента, SEO-анализом, метаданными, обработкой документов, переводом и другими задачами публикации.

Для длительных операций ИИ используется возобновляемая обработка, поэтому крупному заданию по переводу или SEO не требуется завершаться в рамках одного огромного веб-запроса. Цель состоит в том, чтобы сделать ИИ частью рабочего процесса приложения, а не воспринимать его как чат-бота, находящегося рядом с CMS.

Многоязычная публикация

Сайт поддерживает контент на английском, русском, китайском и арабском языках с отдельными URL для каждого языка. Страницы, публикации, категории и другой поддерживаемый контент могут иметь переведённые версии, сохраняя структуру URL сайта, SEO-метаданные и языковые связи.

В рабочем процессе перевода может использоваться помощь ИИ, а внутренние маркеры контента, такие как повторно используемые теги баннеров и маркеры пейвола, сохраняются, поэтому при переводе статьи логика приложения не переводится случайно вместе с ней.

Повторно используемые баннеры контента

CMS включает варианты повторно используемых баннеров, которые можно вставлять на страницы и в публикации с помощью простых тегов, таких как {*banner1*} или {*banner2*}. Контент баннеров можно централизованно редактировать, не копируя вручную один и тот же HTML в несколько статей.

Благодаря этому легко изменить рекламное сообщение, объявление или призыв к действию в одном месте, вместо того чтобы просматривать десятки старых публикаций в поисках того, где я вставил его шесть месяцев назад.

Медиафайлы и избранные изображения

Изображения, загруженные через CMS, проверяются и обрабатываются перед использованием на сайте. Для главных изображений публикаций используется квадратный формат, чтобы полностью сохранять видимым всё произведение, а не агрессивно обрезать его по центру до формы, для которой оно изначально не предназначалось.

CMS также может переименовывать медиафайлы для создания более аккуратных URL и обновлять ссылки на содержимое, когда имя управляемого медиафайла изменяется.

Платные комментарии

Публикации и быстрые записи могут принимать комментарии через платёжные процессы на базе Stripe. Для комментариев к быстрым записям используется отдельная категория стоимостью один доллар, тогда как для комментариев к публикациям можно использовать независимо настроенную цену.

Успешная оплата не приводит к автоматической публикации комментария на сайте. Платные комментарии всё равно сначала проходят модерацию, поскольку уплата одного доллара не делает автоматически хорошей идеей всё, что человек написал.

Платная контактная форма

Контактная система использует Stripe, прежде чем запрос считается доставленным. Посетители могут отправить свои данные и сообщение, но их уведомляют, что запрос остаётся заблокированным до подтверждения оплаты.

Внутри системы ожидающие запросы всё ещё можно просматривать из панели администрирования. Это позволяет мне увидеть, что кто-то пытался отправить, не изменяя публичное правило о том, что запрос не считается доставленным, пока Stripe не подтвердит оплату.

Центр безопасности

CMS включает специальный Центр безопасности, который регистрирует подозрительную активность, сбои аутентификации, заблокированные запросы, административные действия, проверки WordPress, проблемы с вебхуками Stripe и другие события, связанные с безопасностью. В журналах могут содержаться исходный IP-адрес, запрошенный путь, user agent, аутентифицированный администратор, уровень серьёзности, временная метка и количество повторных обращений.

Конфиденциальная информация, такая как пароли, файлы cookie, заголовки авторизации, API-ключи, секреты Stripe и токены CSRF, намеренно исключается или редактируется. Журнал безопасности должен помогать расследовать действия злоумышленника, а не предоставлять ему аккуратно проиндексированную коллекцию всего, что он пытался украсть.

Блокировка IP-адресов и сетей

Отдельные адреса IPv4 и IPv6 можно заблокировать, а диапазоны CIDR при необходимости ограничить. Система может применять блокировки внутри CMS, а также создавать правила на уровне Apache для отклонения запросов на более раннем этапе жизненного цикла запроса.

Заблокированные посетители получают пользовательскую страницу безопасности, а не полезные сведения о том, какое именно правило они нарушили. Если кто-то сканирует веб-сайт в поисках уязвимостей, я не считаю себя обязанным бесплатно оказывать техническую поддержку и подробно объяснять, как именно я это обнаружил.

Ловушка WordPress

AlexanderMirvis.com не использует WordPress, но автоматические сканеры об этом не знают. Поэтому запросы к распространённым адресам входа WordPress могут перенаправляться на поддельный экран входа WordPress, специально созданный в качестве ловушки.

Ловушка записывает полезную информацию о попытке, намеренно отказываясь сохранять пароль, введённый посетителем. Кто угодно может тратить сколько угодно времени на попытки войти в WordPress. Есть лишь одна небольшая проблема: за экраном входа нет установки WordPress.

По сути, это цифровая дверь, нарисованная на кирпичной стене.

Защищённая конфигурация и секретные файлы

Конфигурация сервера отклоняет запросы к файлам окружения, каталогам систем контроля версий, дампам баз данных, резервным копиям, конфигурационным файлам, скрытым файлам, временным файлам и другим ресурсам, которые ни в коем случае не должны быть доступны для публичного скачивания.

Автоматические сканеры по-прежнему каждый день запрашивают такие пути, как /.env, /.git/config, /backup.sql и подобные. Пусть продолжают. Это даёт журналам безопасности работу.

Безопасные административные сеансы

При административной аутентификации используются более строгие требования к паролям, современное хеширование паролей, если оно поддерживается, регенерация сеансов, безопасные настройки cookie, ограничение частоты попыток входа, ограничения по бездействию, абсолютное истечение срока действия сеанса, защита от CSRF и проверки авторизации на стороне сервера.

Конфиденциальные административные функции защищены не просто скрытием кнопок. Сервер независимо проверяет разрешения, поскольку удаление кнопки с помощью CSS обычно считается плохой заменой контроля доступа.

Безопасность загрузки файлов

Загруженные файлы проверяются, а не принимаются вслепую на основании имени файла или MIME-типа, переданного браузером. Изображения могут декодироваться и повторно кодироваться в новые файлы WebP, расширения исполняемых файлов отклоняются, а каталоги загрузки настроены так, чтобы файлы неожиданно не могли стать исполняемыми PHP-файлами.

Иными словами, загрузка файла с именем totally-a-photo.php не заставляет сервер автоматически поверить, что этот файл был создан камерой.

Заголовки безопасности и усиление защиты сервера

Сайт использует HTTP-заголовки безопасности для принудительного применения HTTPS, защиты типа содержимого, ограничений на встраивание во фреймы, управления поведением реферера, разрешениями и политикой безопасности содержимого. Просмотр каталогов отключён, внутренние каталоги приложения защищены, а ненужный публичный доступ к исходным файлам ограничен.

Ни один из этих механизмов не делает сайт волшебным образом неуязвимым. Идея заключается в эшелонированной защите: несколько уровней, благодаря которым удачная ошибка в одной области с меньшей вероятностью приведёт к успешной компрометации всего остального.

Пользовательские страницы 404 и заблокированного доступа

Страницы ошибок являются частью сайта, а не стандартными экранами сервера. На странице 404 используется лёгкий анимированный дизайн чёрной дыры, а заблокированные посетители получают отдельную фирменную страницу безопасности.

Если страница исчезает за горизонтом событий, по крайней мере сообщение об ошибке выглядит намеренным.

Движущиеся звёзды, падающие звёзды, солнце и луна

Публичный сайт включает лёгкое анимированное небо, работающее за интерфейсом. Звёзды медленно движутся, падающие звёзды появляются через случайные промежутки времени, а солнце и луна следуют 24-часовому циклу, основанному на местном времени браузера посетителя.

Луна также меняет свою видимую фазу в соответствии с лунным циклом, включая состояния растущего серпа, первой четверти, выпуклой луны, полнолуния и новолуния. Небольшой дисплей местного неба может показывать текущее время и лунную освещённость, не запрашивая местоположение посетителя.

Интерактивная Солнечная система

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

На мобильных устройствах отображается упрощённая версия с четырьмя планетами, чтобы анимация была чище и работала быстрее на небольших экранах. Солнце или Луна могут перемещаться над Солнечной системой в зависимости от местного времени посетителя.

Создано для сайта, а не вокруг него

Главная особенность заключается в том, что система создана специально для этой задачи. Я могу добавлять функциональность непосредственно в приложение, вместо того чтобы перестраивать весь сайт с учётом ограничений сторонней CMS. Публикация материалов, безопасность, платежи, ИИ, SEO, автоматизация и визуальные функции работают как части одной и той же системы.

Не слишком ли избыточно создавать целую CMS для одного сайта? Вероятно. Но теперь на сайте уже есть лунные фазы, платёжные стены Stripe, honeypot WordPress, интерактивная Солнечная система и собственный центр безопасности, так что, думаю, этот корабль уже отчалил.