Add digital catalog with shareable flipbook and ktg.montzar.ir deploy files.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-19 14:37:49 +03:30
co-authored by Cursor
commit a8374e7d6c
54 changed files with 8462 additions and 0 deletions
+6
View File
@@ -0,0 +1,6 @@
NODE_ENV=production
PORT=3020
API_PORT=3020
PUBLIC_BASE_URL=https://ktg.montzar.ir
STORAGE_DIR=/var/www/ktg/storage
DATABASE_PATH=/var/www/ktg/data/catalogs.sqlite
+167
View File
@@ -0,0 +1,167 @@
# استقرار کاتالوگ — `ktg.montzar.ir`
هاست مشترک مونتایم: `185.50.38.53` (SSH پورت `3031`، کاربر `montime`)
دامنه: `https://ktg.montzar.ir`
پورت داخلی: `3020` (۳۰۰۰ مونتایم، ۳۰۰۱ فوری‌سند، ۳۰۱۰ سوپرادمین)
دیتابیس Postgres بقیه پروژه‌ها را لمس نکنید. این اپ SQLite خودش را در `/var/www/ktg/data` دارد.
---
## کارهایی که روی لپ‌تاپ شماست
### ۱) بستهٔ ارسال را بسازید
در PowerShell:
```powershell
cd E:\projeha\DigitalCatalog
if (Test-Path catalog-deploy.tar) { Remove-Item catalog-deploy.tar }
tar --exclude=node_modules --exclude=dist --exclude=storage --exclude=data --exclude=.env --exclude=catalog-deploy.tar -cvf catalog-deploy.tar .
```
### ۲) آپلود روی سرور
رمز SSH همانی است که برای سوپرادمین/مونتایم می‌زنید:
```powershell
scp -P 3031 catalog-deploy.tar montime@185.50.38.53:/tmp/catalog-deploy.tar
```
بعد از آپلود، فایل `catalog-deploy.tar` روی ویندوز را می‌توانید پاک کنید.
---
## کارهایی که روی سرور است
SSH:
```bash
ssh -p 3031 montime@185.50.38.53
```
### ۳) پوشه و باز کردن فایل‌ها
```bash
sudo mkdir -p /var/www/ktg
sudo chown montime:montime /var/www/ktg
cd /var/www/ktg
tar -xvf /tmp/catalog-deploy.tar
rm /tmp/catalog-deploy.tar
```
اگر پوشه از قبل چیزی داشت و آپدیت است، `storage` و `data` را پاک نکنید.
### ۴) پورت آزاد باشد
```bash
pm2 list
ss -tlnp | grep -E '3000|3001|3010|3020' || netstat -tlnp | grep -E '3000|3001|3010|3020'
```
۳۰۲۰ باید خالی باشد. اگر اشغال بود بگویید تا پورت عوض شود؛ خودتان پورت بقیه را عوض نکنید.
### ۵) فایل `.env` سرور
```bash
cd /var/www/ktg
cp deploy/.env.production.example .env
nano .env
```
باید دقیقاً این باشد (مگر پورت عوض شده باشد):
```env
NODE_ENV=production
PORT=3020
API_PORT=3020
PUBLIC_BASE_URL=https://ktg.montzar.ir
STORAGE_DIR=/var/www/ktg/storage
DATABASE_PATH=/var/www/ktg/data/catalogs.sqlite
```
دیتابیس Postgres و `DATABASE_URL` سوپرادمین را اینجا نگذارید.
### ۶) نصب، بیلد، پوشه‌ها
Node ۲۰ یا جدیدتر.
```bash
cd /var/www/ktg
npm ci
npm run build
mkdir -p storage data
```
### ۷) PM2 — فقط این پروسهٔ جدید
پروسه‌های `montime` / `superadmin-api` / فوری‌سند را stop نکنید.
```bash
pm2 start /var/www/ktg/deploy/ecosystem.config.cjs
pm2 save
pm2 list
curl -sI http://127.0.0.1:3020
```
باید `HTTP/1.1 200` بیاید. اگر خطا بود: `pm2 logs ktg-catalog --lines 80`
### ۸) Nginx — فقط سایت جدید
```bash
sudo cp /var/www/ktg/deploy/nginx-ktg.montzar.ir.conf /etc/nginx/sites-available/ktg.montzar.ir
sudo ln -sf /etc/nginx/sites-available/ktg.montzar.ir /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
```
اگر `nginx -t` خطا داد، فایل‌های `adm.montzar.ir` را ویرایش نکنید؛ بگویید خروجی را بفرستید.
### ۹) گواهی SSL
DNS این زیردامنه از قبل مثل `adm.montzar.ir` روی همان IP است. اگر مرورگر هنوز به سرور نرسید، در پنل دامنه تأیید کنید `ktg.montzar.ir` رکورد `A` مثل `adm.montzar.ir` دارد.
```bash
sudo certbot --nginx -d ktg.montzar.ir
```
Certbot خودش HTTPS را به همین vhost اضافه می‌کند، نه به سایت‌های دیگر.
### ۱۰) تست نهایی
1. `https://ktg.montzar.ir` صفحهٔ ساخت فارسی
2. یک PDF/تصویر کوچک بسازید
3. QR و لینک باید با `https://ktg.montzar.ir/c/...` باشد نه localhost
4. لینک مشاهده در تب دیگر باز شود
کاتالوگ‌های لوکال (`127.0.0.1:3000`) روی این دامنه کار نمی‌کنند؛ باید روی سرور دوباره ساخته شوند.
---
## آپدیت بعدی کد
روی ویندوز دوباره مرحلهٔ ۱ و ۲. روی سرور:
```bash
cd /var/www/ktg
# اگر tar روی فایل‌های قبلی unpacked می‌شود:
tar -xvf /tmp/catalog-deploy.tar
npm ci
npm run build
pm2 restart ktg-catalog
```
پوشه‌های `storage` و `data` و فایل `.env` را پاک نکنید.
---
## تداخل نداشتن (یادآوری)
| این پروژه | بقیه — دست نزنید |
|---|---|
| دامنه `ktg.montzar.ir` | `adm.montzar.ir` و دامنهٔ مونتایم |
| پورت ۳۰۲۰ | ۳۰۰۰ / ۳۰۰۱ / ۳۰۱۰ |
| PM2 نام `ktg-catalog` | پروسه‌های موجود |
| `/var/www/ktg` | `/var/www/superadmin` و پوشهٔ مونتایم |
| SQLite داخل `data/` | Postgres |
لاگین و پروفایل اگر بعداً آمد، باز هم داخل همین دامنه و همین پوشه است؛ به دیتابیس Nest وصل نمی‌شود.
+26
View File
@@ -0,0 +1,26 @@
/**
* PM2 — Digital Catalog on the shared montime host.
* Port 3020 avoids clash with montime (:3000), forisanad (:3001), superadmin (:3010).
*
* On server (as montime):
* pm2 start /var/www/ktg/deploy/ecosystem.config.cjs
* pm2 save
*/
module.exports = {
apps: [
{
name: "ktg-catalog",
cwd: "/var/www/ktg",
script: "node_modules/tsx/dist/cli.mjs",
args: "--env-file=.env server/index.ts",
instances: 1,
exec_mode: "fork",
env: {
NODE_ENV: "production",
PORT: "3020",
},
max_memory_restart: "500M",
time: true,
},
],
};
+28
View File
@@ -0,0 +1,28 @@
# Place under /etc/nginx/sites-available/ktg.montzar.ir
# First deploy: HTTP only. Then: sudo certbot --nginx -d ktg.montzar.ir
#
# Do not copy this into adm.montzar.ir or montime vhosts.
# Do not change client_max_body_size on other sites.
upstream ktg_catalog {
server 127.0.0.1:3020;
keepalive 8;
}
server {
listen 80;
listen [::]:80;
server_name ktg.montzar.ir;
client_max_body_size 100M;
location / {
proxy_pass http://ktg_catalog;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 120s;
}
}