NeonXP.log / Блог

Пишу как про околоайти, так и просто что придёт в голову

Директория 23:00 19.05.2025

Дозрел до своей 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 блогу в силу его статичности