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.
This commit is contained in:
@@ -0,0 +1,188 @@
|
|||||||
|
# دیپلوی 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=<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` و... را دارد.
|
||||||
|
|
||||||
|
```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.
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# ============================================================
|
||||||
|
# Liara env vars — nobat724_front (Next.js platform)
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# NEXT_PUBLIC_* are baked into the client bundle AT BUILD TIME, so set them in the
|
||||||
|
# Liara console BEFORE the first deploy; changing them later needs a REDEPLOY
|
||||||
|
# (not just a restart). Set via console (Environment tab) or:
|
||||||
|
# liara env:set KEY=VALUE --app nobat724
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Backend API base — all /api/v1/* and /oauth/token calls hit this origin.
|
||||||
|
NEXT_PUBLIC_API_URL=https://clinic-pro.ir
|
||||||
|
|
||||||
|
# FALSE → allow search-engine indexing (production). TRUE → noindex + block crawlers (staging).
|
||||||
|
DEV_MODE=FALSE
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# Liara upload excludes. Liara runs `npm install` + `npm run build` itself, so
|
||||||
|
# local build artifacts and deps are not uploaded.
|
||||||
|
.git
|
||||||
|
.github
|
||||||
|
node_modules
|
||||||
|
.next
|
||||||
|
|
||||||
|
# Docker / Coolify artifacts — unused on the Next.js platform.
|
||||||
|
Dockerfile
|
||||||
|
.dockerignore
|
||||||
|
docker-compose.yml
|
||||||
|
|
||||||
|
# Local env & secrets — set these in the Liara console (build-time NEXT_PUBLIC_*).
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.*.local
|
||||||
|
|
||||||
|
# Tests, editor, runtime noise.
|
||||||
|
tests
|
||||||
|
__tests__
|
||||||
|
vitest.config.*
|
||||||
|
coverage
|
||||||
|
.vscode
|
||||||
|
.idea
|
||||||
|
*.log
|
||||||
|
.DS_Store
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"port": 3000,
|
||||||
|
"platform": "next",
|
||||||
|
"app": "nobat724",
|
||||||
|
"build": {
|
||||||
|
"location": "germany"
|
||||||
|
},
|
||||||
|
"healthCheck": {
|
||||||
|
"command": "node -e \"require('http').get('http://127.0.0.1:3000/',r=>process.exit(r.statusCode?0:1)).on('error',()=>process.exit(1))\"",
|
||||||
|
"interval": 30,
|
||||||
|
"timeout": 10,
|
||||||
|
"retries": 3,
|
||||||
|
"startPeriod": 40
|
||||||
|
},
|
||||||
|
"next": {
|
||||||
|
"nodeVersion": "22"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,10 @@ const nextConfig = {
|
|||||||
protocol: 'https',
|
protocol: 'https',
|
||||||
hostname: 'api.clinic-pro.ir',
|
hostname: 'api.clinic-pro.ir',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
protocol: 'https',
|
||||||
|
hostname: 'clinicpro.liara.run',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
protocol: 'http',
|
protocol: 'http',
|
||||||
hostname: 'clinic-pro.ir',
|
hostname: 'clinic-pro.ir',
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
/** @type {import('next').NextConfig} */
|
|
||||||
const nextConfig = {};
|
|
||||||
|
|
||||||
export default nextConfig;
|
|
||||||
Generated
-9736
File diff suppressed because it is too large
Load Diff
@@ -2,6 +2,9 @@
|
|||||||
"name": "nobat724",
|
"name": "nobat724",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20"
|
||||||
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "cross-env HOST=yazd-nobat.localhost PORT=3000 NODE_TLS_REJECT_UNAUTHORIZED=0 next dev",
|
"dev": "cross-env HOST=yazd-nobat.localhost PORT=3000 NODE_TLS_REJECT_UNAUTHORIZED=0 next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
|
|||||||
Reference in New Issue
Block a user