Fix some for production
This commit is contained in:
@@ -1,62 +1,50 @@
|
||||
# راهنمای استفاده از Docker در پروژه Gold Bank Monorepo
|
||||
# Docker — copy-only deploy (Dokploy)
|
||||
|
||||
این پروژه به منظور استقرار (Deployment) در محیط عملیاتی و همچنین استفاده در محیط توسعه (در صورت نیاز) به صورت کامل **داکرایز (Dockerized)** شده است. در اینجا از معماری **Turborepo** به همراه مدیر بستهی **pnpm** استفاده میشود، لذا استراتژی داکرایز کردن به گونهای طراحی شده تا با کش (Cache) هوشمند و استفاده از `turbo prune` بالاترین سرعت بیلد و کمترین حجم نهایی ایمیجها را به همراه داشته باشد.
|
||||
Build artifacts are produced **on the developer machine** and committed to git.
|
||||
Dokploy only builds thin images that copy those files (no `pnpm install` on the server).
|
||||
|
||||
## معماری و ساختار ایمیجها
|
||||
## One-time / before each deploy
|
||||
|
||||
برای هر یک از سرویسهای پروژه یک فایل `Dockerfile` چندمرحلهای (Multi-stage) ایجاد شده است:
|
||||
|
||||
### 1. بکاند (`apps/api`)
|
||||
- **تکنولوژی:** NestJS + Prisma
|
||||
- **مسیر:** `apps/api/Dockerfile`
|
||||
- **شرح استیجها:**
|
||||
- **Builder:** با استفاده از `turbo prune api --docker`، کدهای مربوط به این اپلیکیشن و وابستگیهای آن از مونوریپو ایزوله میشود.
|
||||
- **Installer:** پکیجها به وسیلهی `pnpm install` روی کدهای ایزولهشده نصب میگردند.
|
||||
- **Build:** پس از تولید Prisma Client، اپلیکیشن با دستور `turbo run build` کامپایل میگردد.
|
||||
- **Runner:** کدهای کامپایلشده (پوشه `dist`) در یک کانتینر سبُک `node:20-alpine` کپی شده و اپلیکیشن از طریق فایل `dist/main.js` روی پورت `3000` سرو میشود. کانتینر در این استیج به دلایل امنیتی با یوزر `nestjs` (غیر از root) اجرا میشود.
|
||||
|
||||
### 2. پنل ادمین (`apps/admin-panel`)
|
||||
- **تکنولوژی:** Vue 3 + Vite
|
||||
- **مسیر:** `apps/admin-panel/Dockerfile`
|
||||
- **شرح استیجها:**
|
||||
پس از طی شدن مراحل ایزوله کردن و کامپایل کد (مشابه API)، فایلهای استاتیک نهایی به یک ایمیج `nginx:alpine` منتقل میگردند تا با پرفورمنس بالا سرو شوند (پورت `8080`).
|
||||
|
||||
### 3. سمت کاربر (`apps/user-app`)
|
||||
- **تکنولوژی:** Vue 3 + Vite (PWA)
|
||||
- **مسیر:** `apps/user-app/Dockerfile`
|
||||
- **شرح استیجها:**
|
||||
دقیقاً مشابه پنل ادمین، پس از بیلد شدن، کدهای استاتیک PWA به وسیلهی وبسرور Nginx (روی پورت `8081`) در دسترس قرار میگیرند.
|
||||
|
||||
## پیکربندی Nginx (مسیردهی SPA)
|
||||
فایل `nginx-spa.conf` در مسیر روت پروژه قرار دارد. وظیفه اصلی آن هدایت تمام درخواستهایی است که Route متناظر برای آنها یافت نمیشود به `index.html`. این کار برای کارکرد صحیح Vue Router (به صورت History Mode) ضروری است. این فایل به صورت خودکار در ایمیجهای فرانتاند کپی میشود.
|
||||
|
||||
---
|
||||
|
||||
## نحوهی اجرا (Docker Compose)
|
||||
|
||||
یک فایل `docker-compose.yml` در مسیر اصلی ریپازیتوری جهت هماهنگسازی (Orchestration) تمام سرویسها در کنار هم قرار داده شده است.
|
||||
|
||||
### 1. تنظیم فایل `.env`
|
||||
در روت پروژه فایلی با نام `.env.example` وجود دارد. قبل از اجرا، یک کپی از آن با نام `.env` بگیرید.
|
||||
متغیرهای درون این فایل شامل تنظیمات دیتابیس (مانند `POSTGRES_USER` و `POSTGRES_PASSWORD`) است که هم در دیتابیس و هم در `DATABASE_URL` استفاده میشود.
|
||||
|
||||
### 2. راهاندازی (Build & Up)
|
||||
کافیست دستور زیر را اجرا کنید تا داکر به صورت خودکار تمام ایمیجها را ساخته و کانتینرها را استارت کند:
|
||||
```bash
|
||||
docker-compose up --build -d
|
||||
pnpm install
|
||||
pnpm build:release
|
||||
git add apps/api/release apps/admin-panel/dist apps/user-app/dist
|
||||
git commit -m "chore: refresh release artifacts"
|
||||
git push
|
||||
```
|
||||
پس از اجرای موفقیتآمیز، سرویسها به این ترتیب در دسترس خواهند بود:
|
||||
- دیتابیس (PostgreSQL): `localhost:5432`
|
||||
- رابط کاربری ادمین (Admin Panel): `http://localhost:8080`
|
||||
- اپلیکیشن کاربران (User App): `http://localhost:8081`
|
||||
- سرویس بکاند (API): `http://localhost:3000`
|
||||
|
||||
### 3. اجرای مایگریشنهای دیتابیس
|
||||
در صورت بالا آمدن کانتینرها برای اولین بار، دیتابیس شما خالی است. لازم است تا با استفاده از Prisma مایگریشنها را روی دیتابیس اجرا کنید:
|
||||
What this produces:
|
||||
|
||||
| App | Artifact | Image |
|
||||
|---|---|---|
|
||||
| API | `apps/api/release/app.js` (+ Prisma under `release/node_modules`) | `docker.arvancloud.ir/node:20-alpine` |
|
||||
| Admin | `apps/admin-panel/dist/` | `docker.arvancloud.ir/nginx:latest` |
|
||||
| User | `apps/user-app/dist/` | `docker.arvancloud.ir/nginx:latest` |
|
||||
|
||||
## Dokploy Environment
|
||||
|
||||
```env
|
||||
POSTGRES_USER=goldbank
|
||||
POSTGRES_PASSWORD=...
|
||||
POSTGRES_DB=goldbank
|
||||
EXTERNAL_DB_PORT=5433
|
||||
DATABASE_URL=postgresql://goldbank:...@db:5432/goldbank?schema=public
|
||||
PORT=3000
|
||||
```
|
||||
|
||||
## Domains (container ports)
|
||||
|
||||
| Service | Domain | Port |
|
||||
|---|---|---|
|
||||
| `admin-panel` | admin.example.com | **80** |
|
||||
| `user-app` | app.example.com | **80** |
|
||||
| `api` | (optional) | **3000** |
|
||||
|
||||
Frontends call `/api` on their own domain; nginx proxies to `api:3000`.
|
||||
|
||||
## Local compose smoke test
|
||||
|
||||
```bash
|
||||
# از روی سیستم اصلی و در مسیر روت پروژه:
|
||||
pnpm --filter api exec prisma migrate deploy
|
||||
# یا استفاده از:
|
||||
pnpm --filter api exec prisma db push
|
||||
pnpm build:release
|
||||
docker compose up --build -d
|
||||
```
|
||||
*(توجه: آدرس `DATABASE_URL` در فایل `.env` باید به صورت لوکال به `localhost:5432` اشاره کند تا از خارج کانتینر نیز در دسترس باشد)*.
|
||||
|
||||
Reference in New Issue
Block a user