# دیپلوی nobat724_front روی Liara (پلتفرم Next.js) ## پروژه `nobat724_front` (سایت عمومی، Next.js 15 App Router، چند-دامنه‌ای). Infra/deploy. مرجع: [Liara Next.js quick-start](https://docs.liara.ir/paas/nextjs/quick-start/) و [set-envs](https://docs.liara.ir/paas/nextjs/how-tos/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/خنثی کند: ```js // next.config.mjs (خالی و خطرناک) /** @type {import('next').NextConfig} */ const nextConfig = {}; export default nextConfig; ``` ```js // 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 باید همه‌ی دامنه‌های شهرها به همین اپ وصل شوند: ```js // 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()` را از دست بدهد. ```bash rm next.config.mjs ``` سپس با `npm run build` محلی تأیید کن build سالم است و `.next/standalone` ساخته می‌شود. ### ۲. تعیین نسخه Node در `package.json` لیارا نسخه Node را از `engines` می‌خواند. Next 15 حداقل Node 18.18 می‌خواهد؛ Node 20 پیشنهاد می‌شود: ```json "engines": { "node": ">=20" } ``` ### ۳. ساخت `liara.json` ```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: ```bash liara env:set \ NEXT_PUBLIC_API_URL=https://clinicpro.liara.run \ NEXT_PUBLIC_CLIENT_ID= \ NEXT_PUBLIC_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.js` → `images.remotePatterns` اضافه شود؛ وگرنه `next/image` آن‌ها را بلاک می‌کند. host فعلی فقط `api.clinic-pro.ir`/`clinic-pro.ddev.site` و... را دارد. ```js { protocol: 'https', hostname: 'clinicpro.liara.run' }, ``` ### ۸. دیپلوی ```bash 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.