diff --git a/apps/course/token-join-guide.md b/apps/course/token-join-guide.md index 9e0e157..7386951 100644 --- a/apps/course/token-join-guide.md +++ b/apps/course/token-join-guide.md @@ -3,7 +3,7 @@ این راهنما خلاصه می‌کند که برای سناریوی استاد/دانشجو چگونه از سرویس plugNmeet توکن بگیریم و کلاینت فرانت‌اند (`client/`) با آن وارد کلاس شود. ## پیش‌نیازها -- آدرس سرویس: `window.PLUG_N_MEET_SERVER_URL = "https://meet.newhorizonco.uk"` (در `config.js`). +- آدرس سرویس: `window.PLUG_N_MEET_SERVER_URL = "https://meet.imamjavad.online"` (در `config.js`). - `api_key` و `secret` از فایل پیکربندی بک‌اند (`services/plugnmeet-server/config.yaml`). - بدنهٔ درخواست‌ها باید با پروتکل JSON متناظر با پیام‌های پروتوباف (`plugnmeet-protocol`) ارسال شود؛ سرور طبق `HandleAuthHeaderCheck` هدرهای امنیتی را بررسی می‌کند. @@ -194,12 +194,12 @@ if not is_admin: فرانت با این `token` می‌تواند کاربر را به PlugNMeet وارد کند: ``` -https://meet.newhorizonco.uk/?access_token= +https://meet.imamjavad.online/?access_token= ``` ## گام ۳: ورود کلاینت با توکن ۱. توکن را در URL یا کوکی قرار دهید؛ کلاینت مقدار را از `access_token` در کوئری‌استرینگ یا از کوکی `pnm_access_token` می‌خواند (`getAccessToken` در `client/src/helpers/utils.ts`). -۲. آدرس ورود: `https://meet.newhorizonco.uk/?access_token=`. +۲. آدرس ورود: `https://meet.imamjavad.online/?access_token=`. ۳. اپلیکیشن React موجود در `client/src/components/app/index.tsx` پس از بارگذاری: - درخواست `POST /api/verifyToken` را با هدر `Authorization: ` می‌فرستد (`HandleVerifyToken`). - اگر توکن معتبر باشد، لیست آدرس‌های NATS و موضوعات لازم را می‌گیرد و اتصال را آغاز می‌کند (`startNatsConn`). diff --git a/apps/course/views/course.py b/apps/course/views/course.py index f48db03..36bb66e 100644 --- a/apps/course/views/course.py +++ b/apps/course/views/course.py @@ -1,6 +1,7 @@ from django.conf import settings import logging +from django.conf import settings from django.contrib.auth import get_user_model from django.db.models import Count, Q, F from django.shortcuts import get_object_or_404 @@ -379,7 +380,7 @@ class CourseOnlineClassTokenAPIView(GenericAPIView): examples={ "application/json": { "token": "abc123xyz789...", - "url": "https://imamjavad.newhorizonco.uk/join-class?token=abc123xyz789...&slug=python-basics", + "url": "https://imamjavad.online/join-class?token=abc123xyz789...&slug=python-basics", "expires_in": 300, } } @@ -413,7 +414,8 @@ class CourseOnlineClassTokenAPIView(GenericAPIView): }) # ساخت URL ثابت با token و course slug - entry_url = f"https://imamjavad.newhorizonco.uk/join-class?token={token}&slug={course.slug}" + frontend_base = getattr(settings, "ONLINE_CLASS_FRONTEND_DOMAIN", getattr(settings, "SITE_DOMAIN", "")).rstrip("/") + entry_url = f"{frontend_base}/join-class?token={token}&slug={course.slug}" return Response({ 'token': token, @@ -819,4 +821,4 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView): ) if updated_count > 0: - logger.info(f"[Room Sync] User sessions closed - session_id={session.id} count={updated_count}") \ No newline at end of file + logger.info(f"[Room Sync] User sessions closed - session_id={session.id} count={updated_count}") diff --git a/config/settings/base.py b/config/settings/base.py index 5e7b9d0..e480ba0 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -310,11 +310,11 @@ FILER_ENABLE_LOGGING = True FILER_DEBUG = True ADMIN_TITLE = 'Imam Javad App' ADMIN_INDEX_TITLE = 'Imam Javad Administration' -SITE_DOMAIN = "https://imamjavad.newhorizonco.uk" +SITE_DOMAIN = "https://imamjavad.online" DOVODI_DOMAIN = "https://dovodi.newhorizonco.uk" ONLINE_CLASS_FRONTEND_DOMAIN = env('ONLINE_CLASS_FRONTEND_DOMAIN', default=SITE_DOMAIN) ONLINE_CLASS_TOKEN_TTL = env.int('ONLINE_CLASS_TOKEN_TTL', default=3000) -PLUGNMEET_SERVER_URL ='https://meet.newhorizonco.uk' +PLUGNMEET_SERVER_URL ='https://meet.imamjavad.online' PLUGNMEET_API_KEY ='habibmeet_api_key_2024' PLUGNMEET_API_SECRET ='habibmeet_secret_zumyyYWqv7KR2kUqvYdq4z4sXg7XTBD2ljT6_2024' PLUGNMEET_TIMEOUT = env.float('PLUGNMEET_TIMEOUT', default=10.0) @@ -941,4 +941,4 @@ sentry_sdk.init( INTERNAL_WEBHOOK_SECRET = env('INTERNAL_WEBHOOK_SECRET', default='super-secret-key-12345') -FASTAPI_SERVER_URL = env('FASTAPI_SERVER_URL', default='http://88.99.212.243:8020') \ No newline at end of file +FASTAPI_SERVER_URL = env('FASTAPI_SERVER_URL', default='http://88.99.212.243:8020') diff --git a/create_live_room.sh b/create_live_room.sh index 7568f71..a68bfc5 100755 --- a/create_live_room.sh +++ b/create_live_room.sh @@ -2,8 +2,8 @@ set -e -API_BASE="https://imamjavad.newhorizonco.uk/api" -LIVE_BASE="https://live.newhorizonco.uk" +API_BASE="https://imamjavad.online/api" +LIVE_BASE="https://meet.imamjavad.online" DEFAULT_COURSE_SLUG="test-1-ghorbani" DEFAULT_AUTH_TOKEN="e5ec00c7660302c3225276eaf7be99459c9a7012" diff --git a/docs/CHANGELOG_EXCHANGE_TOKEN.md b/docs/CHANGELOG_EXCHANGE_TOKEN.md index 0406cab..87051be 100644 --- a/docs/CHANGELOG_EXCHANGE_TOKEN.md +++ b/docs/CHANGELOG_EXCHANGE_TOKEN.md @@ -53,7 +53,7 @@ ```json { "token": "abc123xyz789", - "url": "https://imamjavad.newhorizonco.uk/join-class?token=abc123xyz789&slug=python-basics", + "url": "https://imamjavad.online/join-class?token=abc123xyz789&slug=python-basics", "expires_in": 300 } ``` @@ -74,7 +74,7 @@ دیگر از تنظیمات یا environment variable استفاده نمی‌شود. URL ثابت است: ``` -https://imamjavad.newhorizonco.uk/join-class?token={TEMP_TOKEN}&slug={COURSE_SLUG} +https://imamjavad.online/join-class?token={TEMP_TOKEN}&slug={COURSE_SLUG} ``` ### مزایای تغییرات diff --git a/docs/exchange_token_api.md b/docs/exchange_token_api.md index 120c108..57da26d 100644 --- a/docs/exchange_token_api.md +++ b/docs/exchange_token_api.md @@ -91,7 +91,7 @@ curl -X POST http://localhost:8000/api/courses/1/online/token/ \ ```json { "token": "abc123xyz789...", - "url": "https://imamjavad.newhorizonco.uk/join-class?token=abc123xyz789...&slug=python-basics", + "url": "https://imamjavad.online/join-class?token=abc123xyz789...&slug=python-basics", "expires_in": 300 } ``` @@ -154,7 +154,7 @@ Headers: Authorization: Token ↓ Response: { "token": "abc123", - "url": "https://imamjavad.newhorizonco.uk/join-class?token=abc123&slug=python-basics" + "url": "https://imamjavad.online/join-class?token=abc123&slug=python-basics" } ↓ 📱 Open URL in Browser diff --git a/docs/live-session-api.md b/docs/live-session-api.md index 3b6790d..8bcf135 100644 --- a/docs/live-session-api.md +++ b/docs/live-session-api.md @@ -3,7 +3,7 @@ این راهنما خلاصه می‌کند که برای سناریوی استاد/دانشجو چگونه از سرویس plugNmeet توکن بگیریم و کلاینت فرانت‌اند (`client/`) با آن وارد کلاس شود. ## پیش‌نیازها -- آدرس سرویس: `window.PLUG_N_MEET_SERVER_URL = "https://meet.newhorizonco.uk"` (در `config.js`). +- آدرس سرویس: `window.PLUG_N_MEET_SERVER_URL = "https://meet.imamjavad.online"` (در `config.js`). - `api_key` و `secret` از فایل پیکربندی بک‌اند (`services/plugnmeet-server/config.yaml`). - بدنهٔ درخواست‌ها باید با پروتکل JSON متناظر با پیام‌های پروتوباف (`plugnmeet-protocol`) ارسال شود؛ سرور طبق `HandleAuthHeaderCheck` هدرهای امنیتی را بررسی می‌کند. @@ -251,12 +251,12 @@ if not is_admin: فرانت با این `token` می‌تواند کاربر را به PlugNMeet وارد کند: ``` -https://meet.newhorizonco.uk/?access_token= +https://meet.imamjavad.online/?access_token= ``` ## گام ۳: ورود کلاینت با توکن ۱. توکن را در URL یا کوکی قرار دهید؛ کلاینت مقدار را از `access_token` در کوئری‌استرینگ یا از کوکی `pnm_access_token` می‌خواند (`getAccessToken` در `client/src/helpers/utils.ts`). -۲. آدرس ورود: `https://meet.newhorizonco.uk/?access_token=`. +۲. آدرس ورود: `https://meet.imamjavad.online/?access_token=`. ۳. اپلیکیشن React موجود در `client/src/components/app/index.tsx` پس از بارگذاری: - درخواست `POST /api/verifyToken` را با هدر `Authorization: ` می‌فرستد (`HandleVerifyToken`). - اگر توکن معتبر باشد، لیست آدرس‌های NATS و موضوعات لازم را می‌گیرد و اتصال را آغاز می‌کند (`startNatsConn`). diff --git a/docs/online_class_entry_flow.md b/docs/online_class_entry_flow.md index c77d25f..2e4a74a 100644 --- a/docs/online_class_entry_flow.md +++ b/docs/online_class_entry_flow.md @@ -22,12 +22,12 @@ curl --request POST \ ```json { "token": "5f7b8c...e1", - "url": "https://imamjavad.newhorizonco.uk/join-class?token=5f7b8c...e1&slug=dars-akhlagh", + "url": "https://imamjavad.online/join-class?token=5f7b8c...e1&slug=dars-akhlagh", "expires_in": 300 } ``` -**نکته:** URL ثابت است: `https://imamjavad.newhorizonco.uk/join-class?token={TOKEN}&slug={COURSE_SLUG}` +**نکته:** URL ثابت است: `https://imamjavad.online/join-class?token={TOKEN}&slug={COURSE_SLUG}` ## 2. اعتبارسنجی توکن و دریافت داده‌های کلاس diff --git a/nginx/imamjavad.conf b/nginx/imamjavad.conf index a58a016..0785f9f 100644 --- a/nginx/imamjavad.conf +++ b/nginx/imamjavad.conf @@ -9,7 +9,7 @@ server { listen 80; listen 443 ssl; - server_name imamjavad.online imamjavad.nwhco.ir imamjavad.newhorizonco.uk; + server_name imamjavad.online imamjavad.nwhco.ir; ssl_certificate /etc/nginx/letsencrypt/live/imamjavad.online/fullchain.pem; ssl_certificate_key /etc/nginx/letsencrypt/live/imamjavad.online/privkey.pem; @@ -88,7 +88,7 @@ server { client_max_body_size 1200M; } - location /chat { + location /chat/ { proxy_pass http://88.99.212.243:8020; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; @@ -223,4 +223,55 @@ server { expires 30d; add_header Access-Control-Allow-Origin *; } -} \ No newline at end of file +} + +# ======================================== +# 3. PLUGNMEET / ONLINE CLASS SERVER BLOCK +# ======================================== +server { + listen 80; + server_name meet.imamjavad.online; + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl http2; + server_name meet.imamjavad.online; + + ssl_certificate /etc/nginx/letsencrypt/live/meet.imamjavad.online/fullchain.pem; + ssl_certificate_key /etc/nginx/letsencrypt/live/meet.imamjavad.online/privkey.pem; + include /etc/nginx/options-ssl-nginx.conf; + + client_max_body_size 500M; + client_body_timeout 600s; + client_header_timeout 60s; + proxy_connect_timeout 600s; + proxy_send_timeout 600s; + proxy_read_timeout 3600s; + + location /nats { + proxy_pass http://88.99.212.243:8222; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + 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 3600s; + proxy_send_timeout 3600s; + } + + location / { + proxy_pass http://88.99.212.243:8082; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + 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 3600s; + proxy_send_timeout 3600s; + } +} diff --git a/utils/admin.py b/utils/admin.py index d4930a7..097ec96 100644 --- a/utils/admin.py +++ b/utils/admin.py @@ -169,7 +169,7 @@ class FormulaAdminSite(UnfoldAdminSite): context["site_dropdown"] = [ { "title": _("Imam Javad Site"), - "link": "https://imamjavad.newhorizonco.uk/", + "link": "https://imamjavad.online/", "icon": "diamond", }, { @@ -287,12 +287,12 @@ class DovoodiAdminSite(UnfoldAdminSite): }, { "title": _("Imam Javad Site"), - "link": "https://imamjavad.newhorizonco.uk/", + "link": "https://imamjavad.online/", "icon": "diamond", }, { "title": _("Imam Javad Admin"), - "link": "https://imamjavad.newhorizonco.uk/admin/", + "link": "https://imamjavad.online/admin/", "icon": "diamond", } ] @@ -624,4 +624,4 @@ def dashboard_callback(request, context): except Exception as e: print(f"Dashboard KPI Error (Dovoodi Panel): {e}") - return context \ No newline at end of file + return context