Сайт шахового клубу «Хід» із власною системою керування контентом
Повний цикл: архітектура, backend, frontend, кастомна адмінка й деплой на VPS. Власник клубу без технічного бекграунду самостійно керує розкладом, тренерами, турнірами, блогом і цінами через власну CMS з автозбереженням — без Django-admin і сторонніх платформ.
01
Про продукт
«Хід» — шаховий клуб із Харкова, що формує лідерів у класі та громаді: щотижневі заняття, освіта через шахи, шкільні й клубні турніри. Клуб працює на кількох майданчиках у Харкові та Полтаві й об’єднує понад 250 учасників.
Ми спроєктували й розробили сайт клубу з нуля: публічна частина з розкладом, локаціями, турнірами та блогом, особистий кабінет учасника і, головне, власна CMS, через яку команда клубу веде весь контент самостійно.
02
Завдання
Клубу потрібен був сайт, яким власник керує сам, без розробника на кожну правку. Готові CMS не підходили: перевантажена адмінка, зайві сутності, оплата за платформу. Контент специфічний — розклади по днях і локаціях, турніри зі статусами, рівні навчання, тренери.
За основу взяли власний движок Artbrain CMS (початково — під e-commerce) і повністю переробили його під предметну область шахового клубу: свої сутності, свій UI адмінки, автозбереження замість кнопок «Зберегти».
03
Перегляд на десктопі
Освіта, турніри, про клуб, локації та блог на широкому екрані 1440 px. Натисніть на плитку, щоб збільшити.
khidchessclub.com.ua
Освіта через шахи
khidchessclub.com.ua
Турніри клубу
khidchessclub.com.ua
Про клуб і вплив
khidchessclub.com.ua
Локації та візит
khidchessclub.com.ua
Блог клубу
04
Перегляд на смартфоні
Головна, освіта, турніри та сторінка участі у вузькому мобільному форматі.
Головна
Освіта
Турніри
Стати учасником
05
Технологічний стек
CMS
Власна CMS (автозбереження, 132 маршрути)
Backend
Python (Django 6.0 + DRF), SQLite / PostgreSQL
Frontend
Django-шаблони, Tailwind, ванільний JS
Інфраструктура
nginx + gunicorn + systemd, i18n uk/en
06
Що зроблено
Власна CMS з автозбереженням
Будь-яка форма з data-autosave шле FormData і патчить DOM по [data-bind] — без кнопок «Зберегти». Редагування у виїзних бічних панелях, темна/світла тема через CSS-змінні. Власник клубу веде розклад, тренерів, турніри, блог, ціни та локації самостійно.
40 моделей, 132 маршрути адмінки
13 400 рядків Python, 65 HTML-шаблонів, ~7 000 рядків рукописного CSS/JS адмінки, 29 міграцій. Ієрархія сторінок навчання (home → розділ → рівень → літній табір), турніри з дивізіонами й результатами, локації з власним графіком роботи.
Промислова SEO-інфраструктура
Єдине джерело JSON-LD (Organization, Website, Course, SportsEvent, FAQPage, LocalBusiness, BlogPosting) з даними прямо з CMS. Динамічний sitemap.xml, покритий тестом на розсинхрон із в’юхами, robots.txt, /llms.txt під AI-краулери, canonical, OG та hreflang.
Безпека контенту від замовника
HTML, який вводить замовник, санітизується через bleach + BeautifulSoup + lxml (захист від stored XSS). Rate-limit на логін і реєстрацію, canonical-host middleware із 301 зі старого домену, CORS, анти-XSS екранування всередині тегів <script>.
SSOT-патерни й «радіус поразки»
Розклад дня (schedule_today.py), SEO-дані та статуси турнірів — єдині джерела, які використовуються і в шапці, і на сторінках. Синхронізацію в’юх із sitemap покрито тестом, який падає при розсинхроні.
Автоматизація та швидкодія
Systemd-таймер щодня о 00:05 оновлює статуси турнірів за датами: реєстрація відкрита, закрита або завершено. Зображення проходять авто-ресайз і конвертацію у WebP через Pillow, плюс lazy-loading, preconnect і decoding для швидкого завантаження.
07
Підсумок
Клуб отримав сайт, який повністю обслуговує сам: контент, розклад, турніри, блог і ціни оновлюються через власну адмінку за секунди, без звернень до розробника.
Під капотом — промислова архітектура: 40 моделей, REST API, SSOT-патерни, покриті тестами інваріанти, промислове SEO та автоматизація через systemd. Сайт задеплоєно на VPS (nginx + gunicorn + systemd) із двома мовами інтерфейсу.
08
Часті запитання
Сайт працює на Python (Django 6.0) із Django REST Framework. База даних — SQLite на проді зі схемою, сумісною з PostgreSQL. Фронтенд публічної частини — Django-шаблони й ванільний JS, адмінка — Tailwind плюс рукописний CSS. Сервер: nginx + gunicorn + systemd.
Це написана з нуля адмінка саме під шаховий клуб: автозбереження без кнопок «Зберегти», виїзні панелі редагування, темна й світла теми та лише ті сутності, що потрібні клубу. Стандартний Django-admin навмисно заблоковано — власник працює тільки у власній CMS.
Так, у цьому й суть проєкту. Розклад занять, тренери, турніри, блог, ціни, локації та юридичні сторінки редагуються через CMS без розробника, а зміни зберігаються автоматично.
JSON-LD генерується з єдиного джерела з даними прямо з CMS (Organization, Course, SportsEvent, FAQPage, LocalBusiness, BlogPosting). Sitemap.xml динамічний і покритий тестом на розсинхрон, є robots.txt, /llms.txt під AI-краулери, canonical, hreflang та OG-теги.
Так. Ми розробляємо сайти з кастомними адмінками під конкретну галузь — коли готові CMS не підходять під задачу. Залиште заявку, і ми повернемось протягом кількох робочих годин.
Почніть свій шлях до успіху
Маєте проект? Давайте реалізуємо його разом.
Потрібен сайт із власною адмінкою під вашу галузь, щоб керувати контентом без розробника? Розкажіть про задачу — повернемось протягом кількох робочих годин.