GoCMS: технологический стек, исходники и архитектурные решения

GoCMS: технологический стек, исходники и архитектурные решения

В этой статье мы разберём, на чём построена система, почему выбран именно такой стек и где найти исходный код

Author: Mr Gopher

Published: 2026-05-11T16:06:37Z

Theme: gocms-default | Preset: default

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

Три слоя: Framework, UI8Kit и GoCMS

Всё начинается с fastygo/framework — небольшого, самобытного Go-фреймворка. Его задача — предоставить безопасные и предсказуемые примитивы для веб-приложений с серверным рендерингом, без навязывания CLI, DI-контейнера или ORM.

На нём строится UI8Kit — набор type-safe UI-компонентов для Go + templ + Tailwind CSS, выполненный в духе shadcn/ui. Он даёт атомы и композиты интерфейса, которые рендерятся на сервере и используют только семантические токены.

И наконец, сам GoCMS — реализация CMS, которая следует контракту совместимости, описанному в go-codex/en. GoCMS добавляет контент-модель, админку, REST, runtime-профили и плагинную архитектуру.

Framework: минимализм как принцип

Фреймворк построен на трёх «не»:

  • Никакого лишнего кода. Если 30 строк на stdlib решают задачу — не тащим 30 тысяч строк сторонней библиотеки.

  • Никаких скрытых запросов. Нет неожиданных походов в БД, фоновых горутин без явного контракта и утечек ресурсов.

  • Никаких ненужных зависимостей. Прямые зависимости помещаются в одну строку: github.com/a-h/templ, goldmark (опционально) и goleak (только для тестов).

Архитектура слоистая и строгая:

  1. Go stdlib (net/http, log/slog, crypto/rand).

  2. Доменные примитивы (pkg/core, pkg/cache, pkg/observability).

  3. HTTP-слой и авторизация (pkg/web/*, pkg/auth).

  4. Интеграционный слой (pkg/app — AppBuilder, Feature, lifecycle).

Приложение пишет main, который конструирует всё явно (composition root). Фреймворк не прячет ничего за реестрами и не запускает сервер сам.

Ключевой контракт — Feature. Каждый модуль (блог, профиль, дашборд) реализует интерфейс с методами ID(), Routes() и NavItems(). Опциональные возможности (Initializer, Closer, HealthChecker, BackgroundProvider) подключаются через type assertion — мелкие фичи остаются маленькими.

Middleware-цепочка фиксирована и включает защиту по умолчанию: RequestID, Recover, Security Headers, BodyLimit, AntiBot, RateLimit, структурированное логирование. Health- и metrics-эндпоинты используют укороченную цепочку, чтобы не мешать оркестраторам.

UI8Kit: компоненты без «магии»

UI8Kit — это не дизайн-система и не набор готовых страниц. Это слой примитивов и нейтральных композитов:

  • ui/ — атомы и контролы форм.

  • components/ — переиспользуемые композиты, собранные из примитивов.

  • utils/variants.go и props — для типобезопасных вариантов и стилей.

Принципы просты и жёсткие:

  • Только семантические токены из styles/base.css. Никаких брендовых градиентов и ad-hoc утилит в .templ.

  • В шаблонах — class={ helpers }, а не сырые Tailwind-строки.

  • Теги с жёсткой моделью контента (table, li, details) имеют свои примитивы; Box и Stack не становятся свалкой всех HTML5-тегов.

  • CSS-only взаимодействия где возможно; ARIA и клавиатурная навигация — обязательно.

  • Примеры в tests/examples/ — это чистая точка отсчёта для внешних репозиториев Elements и Blocks.

Результат: один и тот же компонент можно использовать и в админке GoCMS, и в публичном сайте, и в дашборде — без дублирования классов и без риска сломать стили при обновлении.

GoCMS: CMS поверх проверенного фундамента

GoCMS добавляет:

  • Runtime-профили (full, headless, admin, playground, conformance).

  • Storage-профили (sqlite, memory, json-fixtures, browser-indexeddb и планируемые SQL).

  • Контент-модель (типы, таксономии, media metadata, меню, настройки).

  • Capability-based авторизация и Argon2id-аутентификация.

  • Аудит, health-checks, snapshot backup/restore.

  • Плагинную модель (runtime, admin, интеграционные плагины).

Всё это — один Go-бинарник. Нет PHP, нет внешних зависимостей в runtime, нет «плагин уронил сайт». Безопасность встроена в middleware и lifecycle, а не прикручена позже.

Где посмотреть исходники

Полный обзор и навигацию по репозиториям можно найти здесь:

https://sourcecraft.dev/fastygo/overview

Основные репозитории:

  • github.com/fastygo/framework — ядро фреймворка (pkg/app, pkg/web, pkg/auth и т.д.).

  • UI8Kit — компоненты и стили (входит в состав GoCMS или отдельным модулем).

  • GoCMS — github.com/fastygo/gocms (или эквивалент) — реализация CMS-контракта go-codex/en.

В каждом репозитории есть docs/, ADRs, примеры и тесты. Документация обновляется вместе с кодом в том же коммите.

Что это значит на практике

Если вы Go-разработчик — вы получаете:

  • Полный контроль над main и композицией.

  • Предсказуемое поведение при shutdown, panic recovery и graceful degradation.

  • Type-safe UI без JavaScript-тяжёлых админок.

  • Возможность взять только нужные слои (например, только Framework + свой UI).

Если вы не пишете на Go — подождите. Полноценное тестирование, conformance-тесты и исчерпывающая Wiki ещё в работе. Когда они будут готовы, появится подробная документация для интеграторов и не-Go команд. До тех пор экспериментировать с исходниками без знания языка и модели ошибок — не лучшая идея.

GoCMS — это не «ещё один CMS». Это инфраструктурный фундамент, который позволяет Go-командам сосредоточиться на бизнес-логике, а не на написании безопасного HTTP-сервера и UI-примитивов с нуля.

Author

Mr Gopher

Fixtures author for GoCMS content

Mr Gopher

/source/