4.9 KiB
Тестовый деплой на Proxmox (локально у вас в ЦОД)
Цель — один недорогой стенд: витрина + API + SQLite, без отказоустойчивого кластера.
Серверов и ресурсов
Рекомендация для минимального тестового инстанса на Proxmox:
| Вариант | Ресурс | Комментарий |
|---|---|---|
| 1× LXC Debian 12 или Ubuntu 22.04 | CPU: 2 vCPU, RAM: 1–2 GB, Диск: 15–25 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(SPAtry_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):
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/serverExecStart=/usr/bin/node src/index.js(перед этим экспортировать env черезEnvironmentFile=к вашему.env)- После деплоя:
systemctl daemon-reload && systemctl enable --now craftshop-api
Персистентность: файл SQLite и каталог uploads/ должны жить на диске, который не теряется при пересборке образа контейнера.
Контрольный чеклист перед «тестом в бою»
- Прогон миграций на чистую БД:
npm run db:reset:test(только в закрытом окружении — стирает данные). - Сборка фронта и выставление
VITE_API_URL(если API не на том же origin, что SPA). CORS_ORIGIN— URL публичного фронта.- Выключить
DEFAULT_CODEна внешнем стенде.
Краткая схема
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