Messages went out locally but not from the server. The relay gateway identifies the sending server by `host`, and the owner's ruling (D26) is that this is the server's IP. With SMS_RELAY_HOST unset, the driver sent the machine's first external IPv4. On the bare PHP server that was the real IP; inside the API container it is the container's (172.x). Reproduced: a container on this machine reports 172.17.0.3. - relay.driver: when SMS_RELAY_HOST is unset and the machine address is private (RFC 1918, CGNAT, link-local), the public IPv4 is looked up once (ipify, ifconfig.me, icanhazip in turn) and cached. If every lookup fails, it falls back to the old value. SMS_RELAY_HOST still wins. - SmsService logs the host it will send at boot, and warns when it is still private, so a wrong value is visible instead of silent. - Removed a debug console.log that wrote every recipient's mobile to the server log. - .env.example and SERVER-SETUP-CHECKLIST: SMS_RELAY_HOST = this server's public IP. Tests: relay-host.spec (5). All 254 API tests pass. اپ: پیامک کد ورود دوباره بهدرستی ارسال میشود. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4.5 KiB
فهرست تنظیمات سرور اصلی
برای کسی که به سرور اصلی (سرور واقعیِ مشتریها) دسترسی دارد.
از این نسخه به بعد، سرور تا وقتی سه مورد زیر درست نشده باشند روشن نمیشود. در گزارش سرور، فهرست کامل ایرادها با هم چاپ میشود؛ همه را درست کنید و یک بار دوباره راهاندازی کنید.
این بررسی فقط در حالت اصلی (NODE_ENV=production) انجام میشود. تصویر داکرِ
سرور همیشه در این حالت است.
۱. حذف کد ثابت ورود آزمایشی
| متغیر | مقدار درست |
|---|---|
OTP_MASTER_CODE |
خالی یا کلاً حذفشده |
تا وقتی این کد هست، هر کسی که آن را بداند وارد حساب هر مشتری میشود.
سرور آزمایشیای که عمداً این کد را لازم دارد، باید کنارش
TEST_SERVER_ALLOW_MASTER_CODE=yesبگذارد. این را هرگز روی سرور اصلی نگذارید.
۲. کلید جدا برای مشتریها
| متغیر | مقدار درست |
|---|---|
JWT_SECRET |
یک رشتهی تصادفی، دستکم ۳۲ نویسه (کلید ورود مدیرها) |
JWT_CUSTOMER_SECRET |
یک رشتهی تصادفیِ دیگر، دستکم ۳۲ نویسه (کلید ورود مشتریها و کارشناسها) |
دو مقدار نباید یکی باشند. ساختن مقدار تصادفی، روی هر سیستمی که Node دارد:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
دو بار اجرا کنید و هر خروجی را برای یکی از دو متغیر بگذارید.
⚠ عوض کردن این کلیدها همه را از حساب بیرون میکند. مدیرها و مشتریها یک بار دوباره وارد میشوند. اطلاعات کسی از بین نمیرود.
⚠ اگر ACCOUNTING_SECRET_KEY خالی باشد، رمز ذخیرهشدهی نرمافزار حسابداری از
JWT_SECRET ساخته میشود. با عوض شدن JWT_SECRET باید یک بار دوباره در
«تنظیمات حسابداری» پنل وارد شوید. بهتر است ACCOUNTING_SECRET_KEY هم یک مقدار
تصادفیِ جدا بگیرد و دیگر عوض نشود.
۳. نشانیهای مجاز
| متغیر | مقدار درست |
|---|---|
CORS_ORIGINS |
نشانی کامل پنل و اپها، با ویرگول جدا |
نمونه:
CORS_ORIGINS=https://adm.henzagold.ir,https://app.henzagold.ir,https://app2.henzagold.ir
- هر نشانی با
https://شروع شود و مسیر نداشته باشد؛ مثلاً/adminدر آخرش نیاید. - هر دامنهای که پنل یا یکی از دو اپ از آن باز میشود باید در فهرست باشد؛ وگرنه آن صفحه نمیتواند با سرور حرف بزند.
*پذیرفته نمیشود.
۴. پیامک: نشانی سرور
| متغیر | مقدار درست |
|---|---|
SMS_RELAY_HOST |
نشانی IP عمومی همین سرور |
سرویس پیامک، سرور فرستنده را با این مقدار میشناسد. اگر خالی باشد، برنامه خودش
نشانی عمومی سرور را پیدا میکند؛ ولی نوشتن آن مطمئنترین راه است. داخل داکر،
نشانیِ خودِ برنامه یک نشانی داخلی (172.x) است و سرویس پیامک آن را نمیشناسد.
بعد از راهاندازی، در گزارش سرور خطی مثل SMS relay host: … نشانیای را که
فرستاده میشود نشان میدهد. اگر هشدار «private address» دیدید، این متغیر را پر کنید.
بعد از تنظیم
- سرور را دوباره راهاندازی کنید.
- در گزارش سرور باید
Nest application successfully startedدیده شود. اگر سرور بالا نیامد، فهرست ایرادها همانجا چاپ شده است. - پنل مدیریت و هر دو اپ را باز کنید و یک بار وارد شوید.
- ورود مشتری با پیامک را امتحان کنید. کد ثابت دیگر نباید کار کند.