feat: serve the same CRM on crm.montact.ir as an alias

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-15 23:24:50 +03:30
co-authored by Cursor
parent a494b5308e
commit 9611803567
6 changed files with 69 additions and 11 deletions
+6 -1
View File
@@ -17,8 +17,13 @@ async function bootstrap() {
}),
);
const corsRaw = config.get<string>('CORS_ORIGIN') ?? 'http://localhost:5173';
const corsOrigins = corsRaw
.split(',')
.map((origin) => origin.trim())
.filter(Boolean);
app.enableCors({
origin: config.get<string>('CORS_ORIGIN') ?? 'http://localhost:5173',
origin: corsOrigins.length <= 1 ? (corsOrigins[0] ?? 'http://localhost:5173') : corsOrigins,
credentials: true,
});
+1 -1
View File
@@ -49,7 +49,7 @@ export class TrackingService {
publicBaseUrl(): string {
const explicit = this.config.get<string>('PUBLIC_API_BASE_URL')?.trim();
if (explicit) return explicit.replace(/\/$/, '');
const cors = this.config.get<string>('CORS_ORIGIN')?.trim();
const cors = this.config.get<string>('CORS_ORIGIN')?.split(',')[0]?.trim();
if (cors) return `${cors.replace(/\/$/, '')}/api`;
return 'http://localhost:3000/api';
}
+3
View File
@@ -3,6 +3,9 @@
NODE_ENV=production
PORT=3030
# چند دامنه با ویرگول — همان اپ روی crm.montzar.ir و crm.montact.ir
CORS_ORIGIN=https://crm.montzar.ir,https://crm.montact.ir
# لینک‌های عمومی/وب‌هوک (اولین دامنهٔ اصلی)
PUBLIC_API_BASE_URL=https://crm.montzar.ir/api
+26 -7
View File
@@ -22,7 +22,7 @@ pm2 restart mento-crm-api
---
هاست مشترک مونتایم: `185.50.38.53` (SSH پورت `3031`، کاربر `montime`)
دامنه: `https://crm.montzar.ir`
دامنه‌ها (همان اپ و همان مسیر): `https://crm.montzar.ir` و `https://crm.montact.ir`
مسیر کد: `/var/www/crm`
پورت داخلی API: `3030`
PM2: `mento-crm-api` (cwd: `apps/api`، اسکریپت: `dist/src/main.js`)
@@ -37,10 +37,11 @@ PM2: `mento-crm-api` (cwd: `apps/api`، اسکریپت: `dist/src/main.js`)
## کارهایی که شما باید انجام دهید (قبل/همراه استقرار)
1. **DNS:** رکورد `A` برای `crm.montzar.ir` مثل `ktg.montzar.ir` / `adm.montzar.ir` روی همان IP.
2. **Postgres:** دیتابیس و کاربر جدا (`mento_crm`) — به دیتابیس مونتایم دست نزنید.
3. **SMS:** همان حساب ترِز/رایگان مونتایم در `.env` (`SMS_USERNAME` / `SMS_PASSWORD` / `SMS_SENDER`).
4. **دسترسی Gitea** برای `git clone` / `git pull` روی سرور.
1. **DNS:** رکورد `A` برای `crm.montzar.ir` و `crm.montact.ir` مثل `ktg.montzar.ir` / `adm.montzar.ir` روی همان IP.
2. **پروکسی جلویی SSL:** مثل `crm.montzar.ir`، برای `crm.montact.ir` هم HTTPS تمام شود و به این سرور **HTTP :80** برسد.
3. **Postgres:** دیتابیس و کاربر جدا (`mento_crm`) — به دیتابیس مونتایم دست نزنید.
4. **SMS:** همان حساب ترِز/رایگان مونتایم در `.env` (`SMS_USERNAME` / `SMS_PASSWORD` / `SMS_SENDER`).
5. **دسترسی Gitea** برای `git clone` / `git pull` روی سرور.
---
@@ -83,7 +84,7 @@ nano apps/api/.env
|---|---|
| `DATABASE_URL` | Postgres روی **`127.0.0.1:15432`** است نه `5432` |
| `PORT` | `3030` |
| `CORS_ORIGIN` | `https://crm.montzar.ir` |
| `CORS_ORIGIN` | `https://crm.montzar.ir,https://crm.montact.ir` |
| `SMS_*` | همان ترِز مونتایم |
| `PORTAL_SHOW_OTP` | در production حتماً `false` |
| `INTEGRATIONS_ENCRYPTION_KEY` | ۶۴ کاراکتر hex برای رمز توکن ته‌حساب (`openssl rand -hex 32`) |
@@ -180,9 +181,27 @@ sudo ln -sf /etc/nginx/sites-available/crm.montzar.ir /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
```
فایل vhost هر دو نام را دارد: `crm.montzar.ir` و `crm.montact.ir` → همان `root` و همان API روی پورت ۳۰۳۰.
**HTTPS روی همین باکس:** مثل `ktg.montzar.ir`، فرانت‌پروکسی (`91.247.174.1`) SSL را تمام می‌کند و به این سرور **HTTP :80** می‌زند.
اگر Certbot روی این vhost `return 404` یا فقط HTTPS بگذارد، سایت از بیرون قطع می‌شود — vhost را روی الگوی HTTP نگه دارید (فایل `deploy/nginx-crm.montzar.ir.conf`).
### ۸ب) اضافه کردن دامنهٔ alias (`crm.montact.ir`) روی همین استقرار
بعد از `git pull` و آپدیت سریع:
```bash
# CORS هر دو دامنه
nano /var/www/crm/apps/api/.env
# CORS_ORIGIN=https://crm.montzar.ir,https://crm.montact.ir
sudo cp /var/www/crm/deploy/nginx-crm.montzar.ir.conf /etc/nginx/sites-available/crm.montzar.ir
sudo nginx -t && sudo systemctl reload nginx
pm2 restart mento-crm-api
```
تست: `https://crm.montact.ir` و `https://crm.montzar.ir` هر دو همان پنل را نشان دهند.
### ۹) تست
1. `https://crm.montzar.ir` → ورود پنل
@@ -281,7 +300,7 @@ grep -c AutomationAction /var/www/crm/node_modules/@mento/shared/dist/index.d.ts
| این پروژه | بقیه — دست نزنید |
|---|---|
| دامنه `crm.montzar.ir` | `ktg` / `adm` / مونتایم |
| دامنه‌های `crm.montzar.ir` و `crm.montact.ir` | `ktg` / `adm` / مونتایم |
| پورت ۳۰۳۰ و ۳۰۴۰ (STT فقط localhost) | ۳۰۰۰ / ۳۰۰۱ / ۳۰۱۰ / ۳۰۲۰ |
| PM2 نام `mento-crm-api` و `mento-stt` | پروسه‌های موجود |
| `/var/www/crm` | `/var/www/ktg` و … |
+30
View File
@@ -0,0 +1,30 @@
# Alias for the same CRM app — optional second site file.
# Prefer adding both names on crm.montzar.ir (see nginx-crm.montzar.ir.conf).
# If you enable this file separately, do NOT redefine upstream mento_crm_api.
server {
listen 80;
listen [::]:80;
server_name crm.montact.ir;
client_max_body_size 50M;
root /var/www/crm/apps/web/dist;
index index.html;
location /api/ {
proxy_pass http://mento_crm_api;
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_connect_timeout 60s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
location / {
try_files $uri $uri/ /index.html;
}
}
+3 -2
View File
@@ -1,5 +1,6 @@
# Place under /etc/nginx/sites-available/crm.montzar.ir
# First deploy: HTTP only. Then: sudo certbot --nginx -d crm.montzar.ir
# Same app for crm.montzar.ir and crm.montact.ir (alias).
# Front proxy terminates SSL and forwards HTTP :80 here — do not put Certbot-only HTTPS on this box.
#
# Do not edit adm.montzar.ir / ktg.montzar.ir / montime vhosts for this.
@@ -11,7 +12,7 @@ upstream mento_crm_api {
server {
listen 80;
listen [::]:80;
server_name crm.montzar.ir;
server_name crm.montzar.ir crm.montact.ir;
client_max_body_size 50M;