Ворклог по задаче "Разработать и запустить сайт"
Прогресс: проверка архитектуры haih.site на реальном проекте
Изучили текущую реализацию haih.site и уточнили критерий минимальности архитектуры. Важный вывод: минимализм нельзя измерять количеством технологий или зависимостей. Нужно минимизировать суммарный friction разработки, эксплуатации и дальнейших изменений, включая feedback loop человека и AI.
Development stack
React/Vite сами по себе не являются избыточностью даже для сайта, который в production в основном отдаёт статический контент.
Vite оправдан реальным требованием к разработке: быстрый edit → HMR → browser feedback loop без ручных reload/cache-reset действий пользователя.
React может быть оправдан компонентной моделью и локальностью изменений растущего UI. Для AI это также даёт предсказуемую, хорошо известную структуру кода.
Уточнённый принцип:
Не минимизировать число зависимостей. Минимизировать friction. Каждая добавленная технология должна уменьшать суммарную сложность сильнее, чем увеличивает её.
Production serving: baseline
После build запущен npm run start и проведён synthetic benchmark:
ab -c 1000 -n 100000 http://localhost:3000/
Результат:
- 100 000 запросов;
- concurrency 1000;
- 0 failed requests;
- 11 515.51 req/s;
- p50 27 ms;
- p95 37 ms;
- p99 67 ms;
- max 8658 ms.
Типичная latency низкая, но присутствовали единичные большие outliers.
Docker + Traefik + Varnish
Затем тот же workload запущен через production-like цепочку:
client → Traefik → Varnish → app
Benchmark:
ab -c 1000 -n 100000 http://localhost:8088/
Результат:
- 100 000 запросов;
- concurrency 1000;
- 0 failed requests;
- 15 871.02 req/s;
- p50 62 ms;
- p95 74 ms;
- p99 88 ms;
- max 129 ms.
По сравнению с прямым app-server throughput вырос примерно на 38%, а распределение latency стало существенно более стабильным: исчез многосекундный tail.
Поведение origin
docker stats показал, что во время 100k запросов app практически не участвовал в обработке повторных запросов.
До теста app имел примерно:
NET I/O 9.56kB / 126B
MEM 25.73 MiB
После:
NET I/O 10.9kB / 3.68kB
MEM 26.16 MiB
При этом Traefik обработал порядка 370MB / 394MB, Varnish — 41MB / 328MB.
Это подтверждает полезную архитектурную границу: cacheable delivery-нагрузка заканчивается на Varnish и почти не доходит до application layer.
Почему Varnish нужен проекту
Критически важное требование: сайт использует динамический resize/processing изображений через Node + Sharp.
Без cache повторный запрос одного варианта изображения потенциально повторяет дорогой цикл:
request
→ Node
→ Sharp
→ decode
→ resize
→ encode
→ response
С Varnish вычисление выполняется на cache miss, после чего одинаковый вариант может обслуживаться из cache без повторной работы Sharp:
request
→ Varnish
├─ HIT → response
└─ MISS → Node → Sharp → result → cache → response
Поэтому Varnish оправдан не просто увеличением RPS статического HTML, а изоляцией application layer и кешированием результатов дорогих повторяемых вычислений.
Архитектурный вывод
Текущий стек следует оценивать не как список технологий:
React + Vite + Node + Sharp + Varnish + Traefik + Docker
а как набор решений конкретных требований:
- Vite → быстрый development feedback loop;
- React → композиция и локальность изменений UI;
- Node + Sharp → on-demand подготовка изображений нужного размера/формата;
- Varnish → не повторять дорогую обработку и не пропускать cacheable нагрузку до origin;
- Traefik → routing/deployment boundary;
- Docker → воспроизводимый runtime/deployment.
Хороший критерий для каждого архитектурного компонента:
Какую измеримую стоимость этот компонент уменьшает и превышает ли выигрыш стоимость самого компонента?
Это уточнение нужно использовать при разработке showcase и best practices HAIH: не навязывать минимальное количество технологий, а показывать минимально достаточную суммарную стоимость решения с evidence.
Следующая полезная проверка
Для чистого сравнения cache layer имеет смысл позже получить третий datapoint:
A. app
B. Traefik → app
C. Traefik → Varnish → app
с одинаковым workload и отдельной метрикой количества запросов, реально дошедших до origin.
Маркетинговую статью по этим выводам в рамках данного worklog не публикуем — оформить отдельно позже.
Задача: Разработать и запустить сайт
Разработать и запустить haih.site как продуктовый сайт новой концепции HAIH: минимальная архитектура, которая растёт вместе с требованиями, и живые showcase от статического сайта и отдельного API до полноценного интернет-магазина.