Files
shop-server/docs/test-deploy-proxmox.md
T
@kirill.komarov f56d6a79fb base commit
2026-05-10 14:38:32 +05:00

79 lines
4.9 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.
# Тестовый деплой на Proxmox (локально у вас в ЦОД)
Цель — один недорогой стенд: витрина + API + SQLite, без отказоустойчивого кластера.
## Серверов и ресурсов
Рекомендация для **минимального тестового** инстанса на Proxmox:
| Вариант | Ресурс | Комментарий |
|---------|--------|---------------|
| **1× LXC Debian 12 или Ubuntu 22.04** | CPU: **2 vCPU**, RAM: **12 GB**, Диск: **1525 GB** (SSD/pool SSD) | Один контейнер: Node (API), при желании статика фронта с того же узла через nginx |
Для сборки (`npm ci` + `vite build`) и запасов по памяти лучше **2 GB RAM**; на **1 GB** возможны OOM при параллельной сборке — собирать фронт можно на машине разработчика и копировать `client/dist`.
Отделять приложение на **два LXC** (фронт / бэкенд) для теста обычно не нужно; имеет смысл только если хотите явно ограничить поверхность API.
### Сеть и доступ
- Одна виртуальная сеть VM/LAN вашего хостинга до Proxmox.
- Открыть снаружи (если нужен доступ из браузера): **80/tcp** и **443/tcp** на reverse proxy; прямой порт Fastify (**3333**) наружу не публиковать.
- Сервер приложения слушает **опционально** `127.0.0.1:3333`, наружу отдаёт **nginx** или **caddy**:
- статика из `client/dist` (SPA `try_files`);
- `location /api/` → proxy на `http://127.0.0.1:3333`;
- `location /uploads/` → те же файлы с диска, что использует сервер (`server/uploads/` рядом с процессом) или через тот же origin с proxy на Fastify `@fastify/static`.
## Очистка БД локально перед тестом
В каталоге `server/` (нужны Node **20.6+** или **22+** для флага `--env-file`; иначе скопируйте переменные из `.dev_env` в `.env` и используйте обычные команды Prisma):
```bash
npm run db:reset:test
```
Удалит данные SQLite, заново применит миграции и выполнит `prisma`-seed из `server/package.json`.
## Программный стек на ВМ/LXC
- **Node.js** LTS (20.6+, лучше 22; скрипты `dev`, `start:dev_env`, `db:*:test` читают `server/.dev_env` через `node --env-file=.dev_env`).
- Приложение ставится так: склонировать репозиторий, на сервере в `server/``npm ci`, `npm run db:migrate:test` (или `migrate deploy`), при необходимости `npm run db:seed:test`.
- Переменные окружения: скопировать `server/.dev_env` или `server/.env.example`, задать **сильный** `JWT_SECRET`, свой `ADMIN_EMAIL`, `DATABASE_URL=file:./dev.db` или путь под персистентный раздел (`/var/lib/craftshop/data.db`).
- Для прод-подобного теста: **`IS_DEFAULT_CODE_ENABLED=false`** (не оставлять общий код на поставку наружу).
## Сервис (systemd, пример)
Один юнит `craftshop-api.service`:
- `WorkingDirectory=/opt/craftshop/server`
- `ExecStart=/usr/bin/node src/index.js` (перед этим экспортировать env через `EnvironmentFile=` к вашему `.env`)
- После деплоя: `systemctl daemon-reload && systemctl enable --now craftshop-api`
Персистентность: файл SQLite и каталог **`uploads/`** должны жить на диске, который не теряется при пересборке образа контейнера.
## Контрольный чеклист перед «тестом в бою»
1. Прогон миграций на чистую БД: `npm run db:reset:test` (только в **закрытом** окружении — стирает данные).
2. Сборка фронта и выставление `VITE_API_URL` (если API не на том же origin, что SPA).
3. `CORS_ORIGIN` — URL публичного фронта.
4. Выключить `DEFAULT_CODE` на внешнем стенде.
## Краткая схема
```mermaid
flowchart LR
User[Браузер]
Px[nginx на LXC]
Api[Fastify Node :3333]
Db[(SQLite файл)]
Up[диск uploads]
User --> Px
Px -->|"/api"| Api
Px -->|"статика /"| Ui[client dist]
Api --> Db
Api --> Up
```