← Блог
·1 мин

Как устроен этот блог


Блог — это markdown-файлы, скрипт сборки и nginx. Ни генератора, ни базы, ни единой строки клиентского JavaScript. Мне хотелось, чтобы через год я мог открыть папку и сразу понять, что там происходит.

Что внутри

content/posts/*.md   посты с frontmatter
build.py             сборка: markdown → dist/
static/style.css     единственный стиль
Dockerfile           python собирает, nginx отдаёт

Новый пост — это новый файл. Больше ничего делать не нужно: сборка сама подхватит его, отсортирует по дате и добавит в ленту.

Frontmatter

В начале каждого файла — четыре строки:

---
title: Как устроен этот блог
date: 2026-09-29
description: Строка для превью и og:description
---

Разбирает их не YAML-парсер, а десять строк на регулярках. Значения здесь всегда простые, а лишняя зависимость в сборке — лишняя причина ей однажды сломаться. Если в файле нет title или date, сборка его пропустит и напишет об этом в stderr: недописанный черновик в папке не должен мешать выкатить остальное.

Сборка

Контейнер двухстадийный. Python ставит markdown с подсветкой кода, прогоняет build.py и отдаёт готовый dist/ в образ с nginx:

Стадия Что делает
build markdown → html, генерация ленты Atom
runtime nginx отдаёт статику, ~50 МБ образ

В финальном образе нет ни Python, ни исходников — только html, css и конфиг nginx.

Что осталось за бортом

Комментариев нет и не планирую. Аналитики нет. Тёмной темы нет — блог читают днём, а переключатель тем это ещё одна вещь, за которой надо следить.

Зато есть RSS: /feed.xml.

Сергей Гуськов
ML Team Lead. Пишу про модели в проде, железо под ними и то, что делаю по вечерам.