Дозрел до своей CMS
Долгое время я пользовался Hugo (а одно время, даже WordPress!). И в целом, всем он меня устраивал. Но недавно, произошло, казалось бы не связанное. Я снова воспылал интересом к треккерной музыке. При этом я немного полазал по сети, поспрашивал знакомых и собрал достаточно большую (>80Гб!) коллекцию. Но просто хранить на диске было скучно и я решил её выложить во внешку. Так появился shelter.neonxp.ru (сейчас не работает, почему - объясню ниже). Сначала список файлов сервил в веб просто Caddy, но у него был недостаток: он не мог дать послушать треккерный файл без скачивания. Тогда я накидал простенькую программку, которая так же просто отдаёт содержимое директории, но позволяла слушать треккерную музыку.
Через некоторое время я подумал, а почему бы не прикрутить к ней и предпросмотр и других файлов? Сказано-сделано. Прикрутил сначала просмотрщик markdown и txt файлов. Дальше, мысль полетела уже по накатанной, и подумалось мне, что это же простенькая CMS. В эту сторону проектик я и стал развивать. И вот вчера я таки перевёл этот сайт на мою собственную CMS! Но пишу только сейчас, потому что вчера после переезда уже ничего не хотел писать, ибо переезд был непрост. И как я уже выше говорил, пока отключил shelter в пользу этого сайта. Позже заведу и shelter.
Особенности моей CMS:
- минимум конфигурации: один бинарник, который при запуске сервит сайт из текущей рабочей директории.
- структура сайта ~= файловая структура, отсюда и листинг файлов на каждой странице
- нет какого-то общего файла конфигурации (аля /etc/...), вместо этого для каждой директории можно создать свой файл .config.json (формат hjson, на самом деле), который распространяет своё действие на текущую директорию, и на все вложенные. Вложенные директории могут иметь свои конфиги, которые могут или частично или полностью переопределять родительский конфиг. Например:
/var/www/neonxp.ru/.config.json { "title": "NeonXP.log", "description": "Личный сайт Go-разработчика из Казани", "index": [ "index.gmi", "index.md", "index.txt"], "url": "https://neonxp.ru/", }
а для директории постов важно, чтобы сортировка была в обратном порядке, поэтому её конфиг выглядит следующим образом:
/var/www/neonxp.ru/posts/.config.json { "description": "Блог", # <- перезапись родительского конфига "desc": true, }
Немного напоминает дедушку Apache2 с его .htaccess :) Но мне это кажется весьма удачной идеей.
- Основной формат разметки — gemtext. Просто потому что мне он нравится своим радикальным минимализмом. Минималистично настолько, что его парсер в html для этой CMS я написал примерно за час с нуля.
На самом деле, написать свою CMSку — достаточно старая мечта, и в своём прошлом, я неоднократно это делал, ещё на PHP (ну тогда это было модно). Ну и кто мне запретит сделать это сейчас, с теми идеями что я указал выше?) По факту получилось что-то среднее между веб-сервером аля Apache2 и классическими CMS, и мне это нравится.
Что дальше?
А дальше я буду развивать её в сторону тех фич, что нужны лично мне:
- Доделать миграцию постов и материалов из старого блога. Сейчас всё импортировано в автоматическом режиме и выглядит откровенно плохо
- Поддержка предпросмотра большего числа форматов файлов
- Хотелось бы сделать Basic авторизацию + загрузку файлов по http
- Раз уж используется gemtext — сделать и поддержку gemini протокола
- Прикрутить cgi или скрипты на lua? А почему-бы и нет? :) Хотя бы сделаю какую-нибудь олдскульную гостевуху
- Прикрутить все эти клёвые indieweb штуки, которые было весьма проблемно прикрутить к Hugo блогу в силу его статичности