- 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.
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.js → images.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.