Files
hedena_gold/docs/SERVER-SETUP-CHECKLIST.md
T
s.esmaeiliandClaude Opus 5.5 7f851676b5 fix(sms): inside Docker, send the server's public IP as the relay host, not the container's
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>
2026-10-10 12:58:13 +03:30

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» دیدید، این متغیر را پر کنید.


بعد از تنظیم

  1. سرور را دوباره راه‌اندازی کنید.
  2. در گزارش سرور باید Nest application successfully started دیده شود. اگر سرور بالا نیامد، فهرست ایرادها همان‌جا چاپ شده است.
  3. پنل مدیریت و هر دو اپ را باز کنید و یک بار وارد شوید.
  4. ورود مشتری با پیامک را امتحان کنید. کد ثابت دیگر نباید کار کند.