Files
fabric_trade_server/README.md
T
mohmdsdgandCursor d5dfd6a0f0 Ship prebuilt Prisma client so the server never runs prisma generate
prisma generate needs over three minutes on the production host, which made
every deploy hang on that build step. The client is now generated on the dev
machine into prisma-client.tar.gz (tracked, 8.5MB) and the image just untars
it. Dropping the unused linux-musl engine target halves that payload.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-08 16:35:06 +03:30

124 lines
3.9 KiB
Markdown

# Fabric Trade Server
بک‌اند NestJS + Prisma + PostgreSQL برای اپ کاربر و پنل ادمین تجارت پارچه.
## پیش‌نیاز
- Node.js 20+
- Docker (برای PostgreSQL)
اگر به Docker دسترسی ندارید:
```bash
sudo usermod -aG docker "$USER"
# سپس یک‌بار logout/login کنید
```
## راه‌اندازی سریع (لوکال بدون Docker برای API)
```bash
cd fabric_trade_server
docker compose up -d postgres
npm install
npx prisma migrate deploy
npm run prisma:seed
npm run start:dev
```
## دیپلوی: بیلد روی سیستم خودت، اجرا روی سرور
روی سرور هیچ `npm` و هیچ دستور `prisma` اجرا نمی‌شود. سه چیز از قبل ساخته و روی
گیت هستند: `dist`، `prisma-client.tar.gz` (کلاینت Prisma) و
`deploy-bundle.tar.gz` (`node_modules` پروداکشن).
**۱) روی سیستم خودت:**
```bash
cd fabric_trade_server
npm run deploy:build
git add dist prisma-client.tar.gz && git commit -m "..." && git push
```
**۲) روی سرور:**
```bash
cd /opt/parche/server
git pull
docker compose up -d --build
docker compose logs -f api
```
`Dockerfile` باندل را باز می‌کند، بعد `dist` و `prisma` و کلاینت آماده‌ی Prisma
را روی آن می‌نویسد. `prisma generate` روی هاست پروداکشن چند دقیقه طول می‌کشد،
پس عمداً آنجا اجرا نمی‌شود.
هر بار که `prisma/schema.prisma` را عوض کردی، `npm run deploy:build` را بزن تا
`prisma-client.tar.gz` هم به‌روز شود؛ وگرنه سرور با کلاینت قدیمی بالا می‌آید.
**فقط اگر پکیج npm جدید اضافه شد** باندل را دوباره بساز و push کن:
```bash
bash scripts/pack-bundle.sh
git add deploy-bundle.tar.gz && git commit -m "refresh deploy bundle" && git push
```
- `env` سرور از `.env` همان پوشه خوانده می‌شود (`env_file` در compose)
- API روی `127.0.0.1:${API_PORT}` بالا می‌آید (سرور: `8585`)
- مایگریشن موقع استارت کانتینر اجرا می‌شود
- LiteSpeed را Reverse Proxy کنید به `http://127.0.0.1:8585`
مثال مسیر LiteSpeed: `https://domain.com/api/` → `http://127.0.0.1:3000/api/`
- API: http://localhost:3000/api
- Swagger: http://localhost:3000/api/docs
## حساب‌های تست (پس از seed)
| نقش | ورود | رمز / OTP |
|------|------|-----------|
| ادمین | `09121112222` | `admin123` |
| مشتری | `09121234567` | OTP پیامکی (۴ رقم) — با `SMS_ENABLED=false` کد ثابت: `1234` |
## متغیرهای محیطی
فایل `.env`:
```
DATABASE_URL=postgresql://fabric:fabric123@localhost:5432/fabric_trade?schema=public
JWT_SECRET=fabric-trade-dev-secret-change-me
JWT_EXPIRES_IN=7d
PORT=3000
MOCK_OTP_CODE=1234
OTP_TTL_MINUTES=5
SMS_ENABLED=true
SMS_API_URL=http://185.231.112.101/api/createsms
SMS_SECRET_KEY=...
SMS_PLATFORM=rayegansms
SMS_HOST=پارچه
SMS_APP_NAME=پارچه
```
## اسکریپت‌ها
| دستور | کار |
|--------|-----|
| `npm run db:up` | بالا آوردن Postgres |
| `npm run prisma:migrate` | مایگریشن توسعه |
| `npm run prisma:seed` | دیتای فیک |
| `npm run start:dev` | سرور با watch |
| `npm run db:reset` | ریست کامل دیتابیس |
## ساختار API (خلاصه)
### کاربر (Bearer JWT مشتری)
- `POST /api/auth/otp/request` / `verify`
- `GET /api/auth/me` · `PATCH /api/auth/profile`
- `GET /api/companies` · catalogs · products · bank-accounts
- `GET/POST /api/carts` …
- `GET/POST /api/orders` · `POST /api/orders/:id/cash-receipt`
### ادمین (Bearer JWT ادمین)
- `POST /api/admin/auth/login`
- `GET /api/admin/dashboard` · `/admin/reports` · `/admin/settings`
- CRUD: companies, catalogs, products, customers, users, orders, checks, cash-payments, shipments