diff --git a/docs/DEPLOY.md b/docs/DEPLOY.md new file mode 100644 index 0000000..382cebd --- /dev/null +++ b/docs/DEPLOY.md @@ -0,0 +1,156 @@ +# Деплой — oclinica-brandbook + +## Текущее состояние + +| Сервис | Статус | URL | Платформа | +|------------|-------------|----------------------------------------|---------------| +| Фронтенд | ✅ Активен | https://web-oclinica.vercel.app | Vercel Hobby | +| Бэкенд | локально | http://localhost:3001 | Docker Compose | +| База данных | локально | localhost:5433 | PostgreSQL 16 | + +--- + +## Фронтенд — Vercel + +### Первоначальная настройка (уже выполнена) + +```bash +# 1. Установить Vercel CLI +npm install -g vercel + +# 2. Войти в аккаунт (однократно, открывает браузер) +vercel login + +# 3. Первый деплой из директории apps/web +cd apps/web +vercel --yes +``` + +### Деплой обновлений + +```bash +cd apps/web +vercel --prod --yes +``` + +Деплой занимает ~30 секунд. После завершения изменения сразу доступны по адресу: +**https://web-oclinica.vercel.app** + +### Как это работает + +- Vercel автоматически определяет Next.js и использует pnpm для сборки +- Каждый `vercel --prod` создаёт новый immutable deployment и привязывает его к production URL +- Предыдущие деплои остаются доступны по уникальным preview URL +- Логи билда: https://vercel.com/oclinica/web + +### Ограничения Vercel Hobby (бесплатный план) + +| Параметр | Лимит | +|-----------------------|-------------------------| +| Bandwidth | 100 GB / месяц | +| Builds | 6000 минут / месяц | +| Serverless Functions | 100 GB-hours / месяц | +| Тип использования | Только некоммерческие | + +Для брендбука (внутренний инструмент) лимитов более чем достаточно. + +--- + +## Локальная разработка + +### Запуск фронтенда + +```bash +# Из корня monorepo +pnpm dev + +# Или только фронтенд +cd apps/web && pnpm dev +``` + +Доступен на: http://localhost:3001 + +### Запуск бэкенда + БД + +```bash +# Запустить PostgreSQL +docker compose up -d + +# Запустить NestJS +cd apps/api && pnpm dev +``` + +### .env файлы + +```bash +# Скопировать и заполнить +cp .env.example .env +``` + +Содержимое `.env.example`: +``` +DATABASE_URL="postgresql://brandbook:brandbook@localhost:5433/brandbook" +API_PORT=3001 +NEXT_PUBLIC_API_URL=http://localhost:3001 +``` + +--- + +## Автодеплой через Gitea Actions (планируется в Sprint 12) + +Для автоматического деплоя при пуше в ветку `main` создать файл +`.gitea/workflows/deploy-frontend.yml`: + +```yaml +name: Deploy Frontend to Vercel + +on: + push: + branches: [main] + paths: + - 'apps/web/**' + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + cache-dependency-path: apps/web/pnpm-lock.yaml + + - name: Install Vercel CLI + run: npm install -g vercel + + - name: Deploy to Vercel + run: cd apps/web && vercel --prod --yes --token ${{ secrets.VERCEL_TOKEN }} +``` + +**Настройка:** +1. Получить Vercel Token: https://vercel.com/account/tokens +2. Добавить в Gitea: Settings → Secrets → `VERCEL_TOKEN` + +--- + +## Хостинг бэкенда (планируется к Sprint 11) + +Бэкенд (NestJS + PostgreSQL) потребуется для экспериментальной секции (Sprint 11). +Варианты для рассмотрения: + +| Платформа | PostgreSQL | Бесплатно | Карта | +|-----------|-----------|-----------|-------| +| Railway | ✅ | $5 кредит / месяц | нужна | +| Supabase | ✅ | ✅ (PostgreSQL managed) | нет | +| Fly.io | ✅ | ✅ ограниченно | нет | +| VPS клиники | ✅ | ✅ (если есть) | нет | + +Рекомендация: **Supabase** для БД (бесплатно, managed PostgreSQL) + **Railway** или VPS для NestJS. diff --git a/docs/SPRINTS.md b/docs/SPRINTS.md index 1091079..add0370 100644 --- a/docs/SPRINTS.md +++ b/docs/SPRINTS.md @@ -88,6 +88,7 @@ - Страница `/offline/print` — макеты визитки (лицо/оборот) и листовки А5, Telegram-бот - Sidebar: убраны «скоро» для Цветов, Типографики и всех 5 страниц Оффлайн - Версия обновлена до **Sprint 2 · v0.2.0** +- **Деплой на Vercel:** https://web-oclinica.vercel.app (production, бесплатно) ### Технические решения Sprint 2 - Страница «Цвета» — `"use client"` для clipboard API и экспорта JSON @@ -252,20 +253,25 @@ --- -## Sprint 12 — Деплой, полировка, документация +## Sprint 12 — Полировка, финальный деплой и документация -**Цель:** Финальный релиз и публикация. +**Цель:** Финальный релиз. Фронтенд уже живёт на Vercel с Sprint 2, Sprint 12 — финальная полировка и production-готовность бэкенда. ### Задачи - [ ] BE + FE: Полный smoke-тест всего брендбука - [ ] FE: Мобильная адаптация — финальная проверка всех страниц - [ ] FE: Accessibility-аудит (WCAG AA) -- [ ] Деплой: настройка CI/CD, публикация на сервере -- [ ] Docs: Создание `docs/deployment.md` -- [ ] Docs: Обновление README.md финальными инструкциями +- [ ] Деплой BE: выбрать и настроить хостинг для NestJS + PostgreSQL +- [ ] Деплой: настроить автоматический деплой через Gitea Actions → Vercel (при пуше в `main`) +- [ ] Docs: Обновление `docs/DEPLOY.md` финальными инструкциями - [ ] Design: Финальный ревью брендбука -**Результат спринта:** Брендбук задеплоен и доступен по URL. +### Текущий статус деплоя +- **Фронтенд:** https://web-oclinica.vercel.app (Vercel Hobby, задеплоен в Sprint 2) +- **Команда деплоя:** `cd apps/web && vercel --prod --yes` +- **Бэкенд:** локально (Docker Compose), хостинг выбирается в Sprint 12 + +**Результат спринта:** Брендбук полностью готов, оба сервиса задеплоены, автодеплой настроен. --- diff --git a/docs/TZ.md b/docs/TZ.md index 7bf71a9..88229d1 100644 --- a/docs/TZ.md +++ b/docs/TZ.md @@ -37,9 +37,10 @@ | Краткое название | oclinica-brandbook | | Сайт клиники | https://oclinica.ru | | Тип системы | Веб-приложение (Living Styleguide) | -| Режим работы | Локальная разработка + деплой на сервер | +| Режим работы | Локальная разработка + Vercel (preview + production) | | Аудитория | Внутренние дизайнеры клиники, внешние подрядчики | -| Хостинг | TBD — будет прописан отдельно | +| Хостинг (фронтенд) | Vercel Hobby (бесплатно) — https://web-oclinica.vercel.app | +| Хостинг (бэкенд + БД) | TBD — уточняется при переходе к Sprint 11 (экспериментальная секция) | --- @@ -393,17 +394,18 @@ | Слой | Технология | Версия | Обоснование | |-------------------|-----------------------|----------|--------------------------------------------------| -| Фронтенд | Next.js (App Router) | 15.x | SSR/SSG, оптимизация, экосистема React | -| Бэкенд | NestJS | 10.x | Типизированный Node.js фреймворк, DI, модули | +| Фронтенд | Next.js (App Router) | 16.x | SSR/SSG, оптимизация, экосистема React | +| Бэкенд | NestJS | 11.x | Типизированный Node.js фреймворк, DI, модули | | База данных | PostgreSQL | 16.x | Надёжная реляционная БД, JSON-поля для атрибутов | -| ORM | Prisma | 5.x | Type-safe запросы, миграции, seed | -| Стилизация | CSS Modules | — | Изоляция стилей, нет рантайм-зависимостей | +| ORM | Prisma | 7.x | Type-safe запросы, миграции, seed | +| Стилизация | Tailwind CSS | 4.x | Utility-first, CSS-переменные, нет рантайм-overhead | | Дизайн-токены | CSS Custom Properties | — | Нативно поддерживается всеми браузерами | | Шрифт (бренд) | DINPro | — | Фирменный шрифт бренда, оффлайн-носители | -| Шрифт (веб) | Fira Sans | — | Google Fonts, кириллица, веса 300 и 400, сайт | +| Шрифт (веб) | Fira Sans | — | Google Fonts, кириллица, веса 300/400/500/600 | | Авторизация | JWT + httpOnly cookie | — | Безопасное хранение токена | -| Пакетный менеджер | pnpm | 9.x | Monorepo workspaces, скорость | -| Контейнеризация | Docker + Compose | — | Единообразное окружение dev/prod | +| Пакетный менеджер | pnpm | 10.x | Monorepo workspaces, скорость | +| Контейнеризация | Docker + Compose | — | Единообразное окружение локальной разработки | +| Хостинг фронтенда | Vercel | — | Нативная поддержка Next.js, бесплатный Hobby-план | --- @@ -480,16 +482,29 @@ oclinica-brandbook/ | Docker | >= 24 | | Docker Compose | >= 2 | -### 12.2 Production-сервер +### 12.2 Деплой фронтенда (Vercel) -> TBD — параметры хостинга будут прописаны отдельно. +Фронтенд (`apps/web`) деплоится на Vercel Hobby (бесплатно). -Минимальные ожидаемые требования: -- ОС: Ubuntu 22.04+ -- RAM: 2 GB -- Disk: 20 GB -- PostgreSQL 16 (или managed database) -- Node.js 20 LTS +**Production URL:** https://web-oclinica.vercel.app + +**Команда деплоя** (из директории `apps/web`): +```bash +vercel --prod --yes +``` + +**Требования:** +- Vercel CLI установлен глобально: `npm install -g vercel` +- Выполнен `vercel login` (однократно) + +**Деплой занимает ~30 секунд.** После команды изменения сразу доступны по production URL. + +### 12.3 Бэкенд и база данных + +> TBD — параметры хостинга бэкенда (NestJS + PostgreSQL) будут определены к Sprint 11, +> когда потребуется работающий API для экспериментальной секции. + +Варианты для рассмотрения: Railway, Render, VPS клиники. --- @@ -511,11 +526,11 @@ oclinica-brandbook/ | № | Вопрос | Ответственный | Срок | |----|--------------------------------------------------------------------------------------|---------------|----------| | ОВ-01 | Доступен ли JSON API или REST API на oclinica.ru? Каков формат ответов? | Клиника | Sprint 1 | -| ОВ-02 | Параметры хостинга для production-деплоя | Клиника | TBD | +| ОВ-02 | ~~Параметры хостинга для production-деплоя~~ **Закрыт:** фронтенд — Vercel Hobby (https://web-oclinica.vercel.app); бэкенд — TBD к Sprint 11 | — | Частично закрыт | | ОВ-03 | Нужна ли страница «Заболевание» как отдельный тип, или это подвид страницы «Услуга»? | Клиника | Sprint 9 | | ОВ-04 | Список иконок — какую стороннюю библиотеку утвердить? (Lucide, Heroicons, и др.) | Совместно | Sprint 2 | | ОВ-05 | ~~Нужен ли раздел «Логотип» в v1.0 или ждём вектор?~~ **Закрыт:** страница логотипа реализуется в Sprint 1 с PNG-версией; вектор будет добавлен позже | — | Закрыт | -| ОВ-06 | HEX-эквиваленты цветов Oracal (053M, 073M, 066M, 050M, 081M, 080M) для использования в токенах | Совместно | Sprint 2 | +| ОВ-06 | ~~HEX-эквиваленты цветов Oracal~~ **Закрыт:** приблизительные HEX зафиксированы в Sprint 2 и подтверждены как рабочие (053M=#7ecfca, 073M=#5b7b87, 066M=#5bb5ad, 050M=#1b4c72, 081M=#c4a882, 080M=#5c2e0e). Точная калибровка — при получении физических образцов. | — | Закрыт | ---