105 lines
5.8 KiB
Markdown
105 lines
5.8 KiB
Markdown
<div dir="rtl">
|
||
|
||
# راهنمای دیپلوی روی Liara
|
||
|
||
این پروژه دو سرویسِ مستقل دارد که جدا دیپلوی میشوند:
|
||
|
||
1. **بکاند (API + اسکرپرها)** → پلتفرم **Docker** لیارا (بهخاطر Playwright/Chromium) + **دیسکِ پایدار** برای SQLite و گزارشها.
|
||
2. **فرانتاند (TanStack Start)** → پلتفرم **Node** لیارا، یا کلودفلر (تارگتِ پیشفرضِ بیلد).
|
||
3. **پنل ادمین (`:8001`)** → عمومی نکن؛ فقط لوکال/SSH/VPN.
|
||
|
||
> قبل از شروع: `npm i -g @liara/cli` و `liara login`.
|
||
|
||
---
|
||
|
||
## گام ۱ — بکاند روی Liara (Docker)
|
||
|
||
آرتیفکتها از قبل ساخته شدهاند: `backend/Dockerfile`، `backend/requirements.txt`، `backend/liara.json`.
|
||
|
||
```powershell
|
||
# ۱) ساخت برنامه (یکبار) — پلتفرم docker
|
||
liara app:create --name didvan-api --platform docker
|
||
|
||
# ۲) ساخت دیسکِ پایدار برای دیتابیس + گزارشها (روی /data مونت میشود)
|
||
liara disk:create --app didvan-api --name data --size 5 # گیگابایت دلخواه
|
||
|
||
# ۳) تنظیم متغیرهای محیطی (حتماً قبل از دیپلوی)
|
||
liara env:set --app didvan-api `
|
||
DB_PATH=/data/asianmetal.db `
|
||
REPORTS_DIR=/data/reports `
|
||
ADMIN_PASSWORD=یکرمزِخیلیقوی `
|
||
ASIANMETAL_TOKEN=توکنِتازهٔمنبع `
|
||
ALLOWED_ORIGINS=https://didvan.example.com `
|
||
COOKIE_SECURE=1 `
|
||
COOKIE_SAMESITE=none
|
||
|
||
# ۴) دیپلوی از داخل پوشهٔ backend
|
||
cd backend
|
||
liara deploy --app didvan-api --port 8000
|
||
```
|
||
|
||
نکتهها:
|
||
- `liara.json` داخلِ `backend/` پلتفرم/پورت/دیسک را تعریف کرده؛ پس `liara deploy` را از همان پوشه بزن.
|
||
- Chromium در خودِ image نصب میشود (`playwright install --with-deps chromium`) → بیلدِ اول کند است. پلنِ حداقل **۱GB RAM**.
|
||
- بعد از دیپلوی، آدرسِ بکاند مثلاً میشود `https://didvan-api.liara.run`.
|
||
|
||
### آپلودِ آرشیو گزارشها (PDFها)
|
||
گزارشها (~۵۰۰۰ فایل) باید روی دیسک باشند. بعد از اولین دیپلوی، از پنل لیارا (بخش دیسک/فایلمنیجر) یا با ابزارِ لیارا فایلها را در `/data/reports` بریز، با همان ساختار `<منبع> - <دسته>/<file>.pdf`. اگر حجم زیاد است، گزینهٔ بهترْ **آبجکتاستوریجِ S3ای لیارا** است (نیازمندِ تغییر `reports.py` برای خواندن از S3).
|
||
|
||
---
|
||
|
||
## گام ۲ — فرانتاند
|
||
|
||
فرانت با URLِ بکاند کار میکند؛ متغیرِ بیلد را ست کن:
|
||
|
||
```
|
||
VITE_API_BASE=https://didvan-api.liara.run
|
||
```
|
||
|
||
(در حالت dev این خالی میماند و از پراکسیِ Vite استفاده میشود — چیزی خراب نمیشود.)
|
||
|
||
پروژه برای لیارا تنظیم شده تا خروجیِ **سرورِ Node** بدهد (در `vite.config.ts` ⇠ `nitro: { preset: "node-server" }`). بیلد، `.output/server/index.mjs` میسازد و اسکریپتِ `start` (در `package.json`) آن را اجرا میکند. کانفیگ در `liara.json`ِ ریشه (پلتفرم node، پورت 3000) است.
|
||
|
||
```powershell
|
||
# از ریشهٔ پروژه
|
||
liara app:create --name didvan --platform node
|
||
liara env:set --app didvan VITE_API_BASE=https://didvan-api.liara.run
|
||
liara deploy --app didvan
|
||
```
|
||
|
||
لیارا هنگام دیپلوی `npm install` → `npm run build` → `npm start` (یعنی `node .output/server/index.mjs`) را اجرا میکند؛ سرورِ Nitro روی متغیرِ `PORT` که لیارا میدهد گوش میدهد. (تستشده: سرور بوت میشود و صفحات را سرو میکند.)
|
||
|
||
---
|
||
|
||
## گام ۳ — کوکیِ ورود (مهم)
|
||
|
||
ورود با **کوکیِ نشستِ httpOnly** کار میکند. بسته به اینکه فرانت و بکاند همدامنهاند یا نه:
|
||
|
||
| حالت | تنظیمات بکاند |
|
||
|---|---|
|
||
| **همدامنه** (توصیهشده) | `COOKIE_SAMESITE=lax` ، `COOKIE_SECURE=1` |
|
||
| **دامنهٔ جدا** (فرانت و API فرق دارند) | `COOKIE_SAMESITE=none` ، `COOKIE_SECURE=1` ، و `ALLOWED_ORIGINS=https://<دامنهٔ فرانت>` |
|
||
|
||
فرانت همهٔ درخواستهای احراز را با `credentials:"include"` میزند (از قبل انجام شده). CORS هم با `allow_credentials=True` تنظیم شده.
|
||
|
||
---
|
||
|
||
## چکلیستِ قبل از انتشار
|
||
|
||
- [ ] توکنِ قدیمیِ منبعِ داده را **باطل** کن (در git history لو رفته) و مقدارِ تازه را در `ASIANMETAL_TOKEN` بگذار.
|
||
- [ ] `ADMIN_PASSWORD` قوی (بدونش پنل ادمین بالا نمیآید).
|
||
- [ ] `COOKIE_SECURE=1` روی HTTPS.
|
||
- [ ] `ALLOWED_ORIGINS` دقیقاً دامنهٔ فرانت (نه `*`).
|
||
- [ ] `DB_PATH` و `REPORTS_DIR` روی دیسکِ `/data`.
|
||
- [ ] پنل ادمین (`:8001`) عمومی نشود.
|
||
- [ ] `__pycache__` از گیت پاک شود: `git rm -r --cached backend/__pycache__`.
|
||
- [ ] (اختیاری ولی بهتر) مهاجرت SQLite → **PostgreSQLِ مدیریتشدهٔ لیارا** برای پایداری/مقیاس.
|
||
|
||
---
|
||
|
||
## یادآوریِ معماری
|
||
- اسکرپرها داخلِ پروسهٔ بکاند (FastAPI lifespan) اجرا میشوند؛ تا پروسه بالا باشد کار میکنند. ریاستارت، کشِ حافظه را پاک میکند ولی از DB دوباره seed میشود.
|
||
- جزئیات کامل سیستم در `README.md`.
|
||
|
||
</div>
|