- Add multi-stage Dockerfile (node:22-alpine build → nginx:alpine serve) - Add nginx.conf for SPA routing inside container - Add .dockerignore - Deploy to dshkabatur.ru server with Docker + host Nginx + SSL (Certbot) - Live at https://diet.dshkabatur.ru Co-authored-by: Cursor <cursoragent@cursor.com>
3.3 KiB
3.3 KiB
Lessons Learned — Опыт разработки
Этот файл фиксирует важные уроки, решения и инсайты, полученные в ходе разработки.
2026-02-11 — Старт проекта
Выбор стека
- Vite + React + TS выбран вместо Astro/Next.js: проект интерактивный (поиск, фильтры, BMI калькулятор), Astro избыточен для SPA, Next.js избыточен без SSR.
- Tailwind CSS 4 — utility-first, быстрая стилизация, отличная поддержка dark mode.
- React Router 7 — client-side routing для SPA, нет нужды в серверном роутинге.
Решения по архитектуре
- Данные хранятся как TS-модули (не JSON) — это даёт типизацию на уровне данных.
- localStorage для пользовательских настроек (тема, закладки) — достаточно для статического приложения.
as constобъекты вместо enum — лучше tree-shaking и удобнее в использовании с типами.
Проблемы и решения
- Vite create cancelled:
npm create vite@latest .отказывается работать в непустой директории. Решение: ручная инициализация проекта. __dirnameв ESM: Вvite.config.tsнельзя использовать__dirname(CommonJS). Решение:fileURLToPath(new URL("./src", import.meta.url)).- Tailwind CSS 4: Использует
@import "tailwindcss"вместо@tailwindдиректив. Кастомные цвета через@theme {}. - React Router 7:
NavLinkсendпропом для exact matching. Безendна/он будет активен на всех роутах.
UX решения
- Тема: 3 режима (light/dark/system) — system слушает
prefers-color-schemeи реагирует на изменения. - Мобильное меню закрывается при навигации —
onClick={() => setMobileOpen(false)}. ScrollToTopкомпонент обязателен для SPA — без него при навигации страница остаётся на том же скролле.
Деплой
- Docker multi-stage build: node:22-alpine для сборки → nginx:alpine для раздачи. Итоговый образ маленький, без Node.js.
- Nginx на хосте как reverse proxy: конфиг в
/etc/nginx/conf.d/diet.dshkabatur.ru.conf, проксирует на127.0.0.1:3080. - Certbot:
--nginx --non-interactive --agree-tos --redirect— автоматически модифицирует nginx-конфиг, добавляет SSL и редирект HTTP→HTTPS. - Heredoc + sudo: через SSH нельзя легко передать heredoc в sudo tee. Решение: записать в
/tmp/, потомsudo cpна место. --restart unless-stopped: контейнер перезапускается при ребуте сервера.