Архитектура сайта VI Industries: статический генератор на Python
Почему сайт собран как статический: минимальная нагрузка на VPS, простое сопровождение, воспроизводимые сборки.
Английская версия статьи: VI Industries site architecture: a Python static generator
Архитектурная задача для VI Industries формулируется просто: публичный сайт, который должен пережить долгосрочное развитие экосистемы, при этом работать на VPS с ограниченными ресурсами (1 vCPU, около 1.6 GiB RAM, без Docker).
Почему статический
- Нагрузка. Nginx отдаёт готовые HTML-файлы. Никаких runtime-процессов, баз данных и OOM-рисков на слабом сервере.
- Безопасность. Земля атаки минимальна: нет исполняемых обработчиков форм, баз данных, админок на сервере.
- Воспроизводимость. Сборка детерминирована:
tools/build.pyчитает структурированные данные (JSON + Markdown) и однозначно восстанавливает каталогdist/. - Простота отката. Каталог релиза заменяется целиком; резервная копия прошлой версии всегда сохраняется.
Что именно «генерируется»
- Страница проектов строится из
src/content/projects/projects.json— включая детальные страницы каждого проекта. - Страница робной карты — из
src/content/roadmap.json. - Страница состояния — счётчики считаются при сборке из тех же файлов; «Нет данных» показывается честно, когда источник пуст.
- База знаний — Markdown со структурированной шапкой (front-matter). Добавление статьи не требует правки HTML.
Что осознанно не делалось
- Не используется Node.js/Astro только потому, что окружение разработчика не имеет Node, а польза ограничена для проекта такого размера.
- Не появились никакие backend-компоненты. Форма сотрудничества на первом этапе работает через почтовый клиент (это указано прямо на странице), серверная обработка появится отдельным релизом.
Вывод: статический генератор на Python (Jinja2 + Markdown) — минимальная работающая архитектура, которую можно развивать без переделки.