Files
hamed ee1192b5b9 feat: prepare nobat724_front for deployment on Liara platform
- Added Node.js engine requirement in package.json to ensure compatibility.
- Created liara-deploy.md for deployment instructions and environment setup.
- Added example environment variables in .env.liara.example for clarity.
- Introduced .liaraignore to exclude unnecessary files from deployment.
- Created liara.json for Liara configuration, including health check settings.
- Removed redundant next.config.mjs file to prevent configuration conflicts.
2026-06-30 14:48:21 +03:30

8.9 KiB

دیپلوی nobat724_front روی Liara (پلتفرم Next.js)

پروژه

nobat724_front (سایت عمومی، Next.js 15 App Router، چند-دامنه‌ای). Infra/deploy.

مرجع: Liara Next.js quick-start و set-envs.

زمینه

سایت باید روی پلتفرم nextjs لیارا دیپلوی شود (نه Docker — Dockerfile/docker-compose.yml موجود برای Coolify هستند و روی پلتفرم nextjs استفاده نمی‌شوند). لیارا خودش npm install و npm run build را اجرا می‌کند، سپس npm start. backend قبلاً روی Liara مستقر شده (https://clinicpro.liara.run) و این سایت کلاینت همان API است.

نکات کلیدی پلتفرم nextjs لیارا (از داک):

  • فقط پروژه‌های ساخته‌شده با create-next-app پشتیبانی می‌شوند؛ package.json باید اسکریپت استاندارد dev/build/start داشته باشد. این پروژه دارد.
  • متغیرهای محیطی در زمان build هم در دسترس‌اند — برای NEXT_PUBLIC_* که در باندل کلاینت bake می‌شوند، باید قبل از اولین build در کنسول Liara ست شوند.
  • اگر env بعد از دیپلوی اضافه شد، باید اپ restart شود.

مشکل / هدف

آماده‌سازی پروژه برای دیپلوی صحیح روی Liara nextjs، شامل رفع ریسک‌های فعلی و افزودن فایل‌های لازم.

فایل‌های مرتبط

فایل نقش
next.config.js کانفیگ اصلی (images، headers/CSP، output: 'standalone')
next.config.mjs فایل تکراریِ خالی — باید حذف شود
package.json اسکریپت‌ها؛ افزودن engines.node
liara.json (جدید) کانفیگ پلتفرم Liara
.liaraignore (جدید) exclude کردن Docker/.env/node_modules از آپلود
lib/getStateInfo.js تشخیص شهر از Host (multi-domain) — نباید تغییر کند، فقط درک شود
.env فقط مرجع مقادیر؛ روی Liara از کنسول ست می‌شوند

وضعیت فعلی

۱) دو فایل کانفیگ Next هم‌زمان وجود داردnext.config.mjs خالی است و می‌تواند کانفیگ واقعی (output: standalone، images, headers) را override/خنثی کند:

// next.config.mjs  (خالی و خطرناک)
/** @type {import('next').NextConfig} */
const nextConfig = {};
export default nextConfig;
// next.config.js  (کانفیگ واقعی — این باید بماند)
const nextConfig = {
  reactStrictMode: true,
  images: { remotePatterns: [ /* api.clinic-pro.ir, clinic-pro.ddev.site, ... */ ] },
  env: { DEV_MODE: process.env.DEV_MODE },
  output: 'standalone',
  async headers() { /* CSP که apiOrigin را از NEXT_PUBLIC_API_URL می‌سازد */ },
};
module.exports = nextConfig;

۲) تشخیص شهر از Host (server-side) — روی Liara باید همه‌ی دامنه‌های شهرها به همین اپ وصل شوند:

// lib/getStateInfo.js
const headersList = await headers();
const host = headersList.get("host") || "";
const subdomain = host.split(".")[0];          // مثلاً "yazd-nobat"
// match با city.domain در data/city.json

۳) env فعلی (.env — مرجع):

NEXT_PUBLIC_API_URL=https://clinic-pro.ddev.site   # باید به backend پروداکشن تغییر کند
DEV_MODE=FALSE
NEXT_PUBLIC_CLIENT_ID=...
NEXT_PUBLIC_CLIENT_SECRET=...
NODE_TLS_REJECT_UNAUTHORIZED=0                      # فقط dev — روی Liara ست نشود

وظایف

۱. حذف فایل کانفیگ تکراری

next.config.mjs را حذف کن. Next با وجود هر دو فایل رفتار قطعی ندارد و ممکن است نسخه‌ی خالی بارگذاری شود و output: 'standalone'، images.remotePatterns و headers() را از دست بدهد.

rm next.config.mjs

سپس با npm run build محلی تأیید کن build سالم است و .next/standalone ساخته می‌شود.

۲. تعیین نسخه Node در package.json

لیارا نسخه Node را از engines می‌خواند. Next 15 حداقل Node 18.18 می‌خواهد؛ Node 20 پیشنهاد می‌شود:

"engines": {
  "node": ">=20"
}

۳. ساخت liara.json

{
  "app": "nobat724",
  "platform": "nextjs",
  "port": 3000,
  "build": {
    "location": "germany"
  }
}
  • port: 3000 — همان پورتی که next start پیش‌فرض روی آن گوش می‌دهد.
  • app را با نام واقعی اپ Liara یکی کن.

۴. ساخت .liaraignore

تا فایل‌های بی‌ربط/حساس آپلود نشوند (Liara خودش npm install و build می‌کند):

.git
.github
node_modules
.next

# Docker / Coolify artifacts — روی پلتفرم nextjs استفاده نمی‌شوند
Dockerfile
.dockerignore
docker-compose.yml

# Local env & secrets — روی Liara از کنسول ست می‌شوند
.env
.env.local
.env.*.local

# tests / dev
tests
__tests__
vitest.config.*
coverage
.vscode
.idea
*.log

۵. ست کردن env روی Liara (قبل از اولین build)

چون NEXT_PUBLIC_* در زمان build در باندل کلاینت bake می‌شوند، اول این‌ها را در کنسول Liara (یا CLI) ست کن، بعد deploy:

liara env:set \
  NEXT_PUBLIC_API_URL=https://clinicpro.liara.run \
  NEXT_PUBLIC_CLIENT_ID=<client_id> \
  NEXT_PUBLIC_CLIENT_SECRET=<client_secret> \
  DEV_MODE=FALSE \
  --app nobat724

نکات:

  • NEXT_PUBLIC_API_URL → آدرس backend پروداکشن (https://clinicpro.liara.run یا دامنه‌ی API اختصاصی). این هم در CSP (connect-src) و هم در همه‌ی fetchها استفاده می‌شود.
  • DEV_MODE=FALSE → اجازه‌ی index شدن توسط موتورهای جستجو (در app/robots.js و app/layout.js استفاده می‌شود). اگر staging است، TRUE بگذار.
  • NODE_TLS_REJECT_UNAUTHORIZED را روی Liara ست نکن (فقط برای cert self-signed محیط dev بود).
  • NEXT_PUBLIC_CLIENT_SECRET در باندل کلاینت قابل‌مشاهده است (طراحی فعلی پروژه همین است) — تغییرش خارج از این تسک.

۶. اتصال دامنه‌های چند-شهری

getStateInfo.js شهر را از هدر Host تشخیص می‌دهد. در کنسول Liara، همه‌ی دامنه‌های شهرها (مثل yazd-nobat.ir، tehran-nobat.ir، nobat724.com، ...) را به همین یک اپ وصل کن و برای هرکدام TLS بگیر. نیازی به env جداگانه per-domain نیست — هدر Host خودکار شهر را تعیین می‌کند.

۷. (در صورت نیاز) افزودن دامنه backend به images.remotePatterns

اگر تصاویر از backend جدید (clinicpro.liara.run یا دامنه‌ی API پروداکشن) با next/image لود می‌شوند، باید host آن در next.config.jsimages.remotePatterns اضافه شود؛ وگرنه next/image آن‌ها را بلاک می‌کند. host فعلی فقط api.clinic-pro.ir/clinic-pro.ddev.site و... را دارد.

{ protocol: 'https', hostname: 'clinicpro.liara.run' },

۸. دیپلوی

liara deploy --app nobat724 --platform nextjs --port 3000

(یا روی CI/کنسول). بعد از set کردن env جدید پس از دیپلوی، اپ را restart کن.

نکات مهم

  • حتماً next.config.mjs را حذف کن — مهم‌ترین ریسک؛ بدون آن output: standalone و CSP و images از کانفیگ واقعی اعمال نمی‌شوند.
  • env های NEXT_PUBLIC_* build-time هستند: اگر بعد از build عوض شوند، تا rebuild/redeploy در باندل کلاینت اعمال نمی‌شوند (نه فقط restart).
  • backend باید CORS سایت را اجازه دهد — دامنه‌های nobat724 در clinicpro (ALLOWED_FRONTEND_HOSTS/CORS_ALLOW_ORIGIN) از قبل لیست شده‌اند؛ مطمئن شو دامنه‌ای که روی Liara می‌سازی در آن لیست هست.
  • output: 'standalone' با پلتفرم nextjs لیارا سازگار است و حجم/سرعت بهتر می‌دهد؛ نگهش دار.
  • تست محلی قبل از دیپلوی: npm run build باید بدون خطا تمام شود (خطاهای صفحه/متادیتا اینجا ظاهر می‌شوند).
  • این تغییرات infra هستند؛ منطق برنامه عوض نمی‌شود. فقط حذف فایل تکراری + ۳ فایل کانفیگ + env.