Files
shop-server/docs/deploy-changes.md
T
@kirill.komarov 33e387d05c deploy
2026-05-11 21:00:56 +05:00

103 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Справка: как задеплоить изменения
Как обновить уже работающий стенд (код на сервере + фронт в nginx) после правок в репозитории.
## 1. Перед выкладкой (локально, по желанию)
- **Фронт**: `cd client && npm run lint && npm run build` — убедиться, что сборка проходит.
### Windows: `npm ci` / сборка падает с EPERM на `.node`
Часто файл держит **запущенный `npm run dev`** (Vite), другой терминал с Node или антивирус. Сделайте:
1. Остановить все dev-серверы и лишние процессы `node`.
2. Запускать деплой из **Git Bash** или через **`.\scripts\deploy-ssh.ps1`** (не вызывайте `deploy-ssh.sh` напрямую из PowerShell без `bash`).
3. Повторить `./scripts/deploy-ssh.sh` (скрипт перед `npm ci` удаляет каталоги `@unrs` и `@rolldown` в `client/node_modules`, если EPERM из‑за блокировок).
4. Если не помогло: вручную `cd client && npm run build`, затем **`./scripts/deploy-ssh.sh --frontend-only --skip-build`** (выложится уже готовый `client/dist`).
- **Бэкенд**: при изменениях в `server/prisma` — миграции должны быть в репозитории; на сервере выполнится `prisma migrate deploy` (см. скрипт деплоя).
## 2. Переменные окружения на сервере
После обновления кода сверьте `server/.env` с актуальным **`server/.env.example`** на предмет новых переменных.
Актуально для загрузок файлов (если нужны нестандартные лимиты):
- `ADMIN_IMAGE_MAX_FILE_BYTES` (или устаревшее `PRODUCT_IMAGE_MAX_FILE_BYTES`) — одно изображение в админке: товары, галерея (по умолчанию 20 МБ).
- `OTHER_UPLOAD_MAX_FILE_BYTES` — отзывы, чек оплаты и т.п. (по умолчанию 2 МБ).
- `MAX_UPLOAD_BODY_BYTES` — весь POST multipart (по умолчанию рассчитывается от лимита фото товара × 10 + запас).
**413 на проде, локально ок:** чаще всего **nginx** с лимитом по умолчанию 1 МБ. См. **[docs/nginx-upload-limit.md](nginx-upload-limit.md)** — добавьте `client_max_body_size` для `location /api/`.
Общие для публикации: `JWT_SECRET`, `ADMIN_EMAIL`, `DATABASE_URL`, `CORS_ORIGIN`, при раздельных доменах — `VITE_*` на этапе сборки фронта, `SERVER_PUBLIC_URL` / `CLIENT_PUBLIC_URL` для OAuth.
После правок `.env` **перезапустите API** (systemd или ваша команда).
## 3. Автоматический деплой по SSH (рекомендуется)
1. Скопируйте `scripts/deploy.env.example` в **`scripts/deploy.env`** и заполните:
- `DEPLOY_HOST`, `DEPLOY_USER`, `DEPLOY_PATH`, `DEPLOY_FRONTEND_DIST`;
- при необходимости `DEPLOY_SSH_IDENTITY`, `DEPLOY_RESTART_CMD` (например `systemctl restart craftshop-api`).
2. Из корня репозитория (нужен **bash**: Git Bash / WSL / Linux/macOS):
```bash
./scripts/deploy-ssh.sh --all
```
Варианты:
- `--frontend-only` / `-f` — только сборка `client` и выкладка `dist` на сервер.
- `--backend-only` / `-b` — только `server` (rsync, `npm ci`, Prisma migrate), плюс `DEPLOY_RESTART_CMD` если задан.
- `--all` / `-a` — и фронт, и бэкенд (поведение по умолчанию).
3. Убедитесь, что после бэкенд-части API перезапущен (`DEPLOY_RESTART_CMD` или вручную).
Подробности опций: в начале файла **`scripts/deploy-ssh.sh`** (справка `usage`).
## 4. Первичный деплой с нуля (LAN / один раз)
Если сервер ещё не настроен, используйте сценарий первичной подготовки (bootstrap, systemd, первый выклад):
- **`scripts/complete-lan-deploy.ps1`** (Windows) — нужны `scripts/deploy.env` и `scripts/craftshop-remote-lan.env`, см. комментарии в скрипте.
Черновик архитектуры и требований к ВМ: **[docs/test-deploy-proxmox.md](test-deploy-proxmox.md)**.
## 5. Ручное обновление (если без скрипта)
**Бэкенд** (на сервере, в каталоге приложения, например `/opt/craftshop/server`):
```bash
git pull
npm ci
npx prisma migrate deploy
# при необходимости: npx prisma db seed
```
Перезапуск процесса Node (пример):
```bash
systemctl restart craftshop-api
```
**Фронт** (на машине разработчика):
```bash
cd client
npm ci
npm run build
```
Содержимое **`client/dist/`** скопируйте в каталог статики nginx (как у вас настроено, часто совпадает с `DEPLOY_FRONTEND_DIST` из `deploy.env.example`).
## 6. Что не потерять при деплое
- Файл **SQLite** и каталог **`server/uploads/`** должны лежать на **персистентном диске** (не внутри временного слоя контейнера без тома).
- Nginx (или аналог): **`/api`** → прокси на Fastify, **`/uploads`** → те же файлы, что пишет сервер, либо прокси на `@fastify/static` (см. [test-deploy-proxmox.md](test-deploy-proxmox.md)).
## 7. Проверка после выкладки
- `GET https://<ваш-домен>/api/health` или `curl http://127.0.0.1:3333/health` на сервере.
- Открыть витрину, при необходимости войти в админку и проверить загрузку фото (лимиты см. выше).
Дополнительно: общий обзор проекта и локальный запуск — **[README.md](../README.md)**.