# Справка: как задеплоить изменения Как обновить уже работающий стенд (код на сервере + фронт в 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` (см. скрипт деплоя). - **Общие константы**: каталог `shared/constants/` синхронизируется скриптом деплоя вместе с `server/` (автоматически в `deploy_backend`). ## 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. Что не потерять при деплое - Каталоги **`shared/`** и **`server/`** должны быть рядом на одном уровне (например, `/opt/craftshop/shared/constants/order-status.js` и `/opt/craftshop/server/src/lib/order-status.js`). Скрипт деплоя синхронизирует оба. - Файл **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)**.