Files
tehran_taj/DOCKER.md
T
s.esmaeili 03119cd655 docs: add comprehensive Docker usage documentation (DOCKER.md)
Includes explanation of multi-stage Turborepo builds, Nginx SPA routing, and docker-compose deployment steps.
2026-09-09 19:49:27 +03:30

63 lines
5.2 KiB
Markdown

# راهنمای استفاده از Docker در پروژه Gold Bank Monorepo
این پروژه به منظور استقرار (Deployment) در محیط عملیاتی و همچنین استفاده در محیط توسعه (در صورت نیاز) به صورت کامل **داکرایز (Dockerized)** شده است. در اینجا از معماری **Turborepo** به همراه مدیر بسته‌ی **pnpm** استفاده می‌شود، لذا استراتژی داکرایز کردن به گونه‌ای طراحی شده تا با کش (Cache) هوشمند و استفاده از `turbo prune` بالاترین سرعت بیلد و کمترین حجم نهایی ایمیج‌ها را به همراه داشته باشد.
## معماری و ساختار ایمیج‌ها
برای هر یک از سرویس‌های پروژه یک فایل `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
```
پس از اجرای موفقیت‌آمیز، سرویس‌ها به این ترتیب در دسترس خواهند بود:
- دیتابیس (PostgreSQL): `localhost:5432`
- رابط کاربری ادمین (Admin Panel): `http://localhost:8080`
- اپلیکیشن کاربران (User App): `http://localhost:8081`
- سرویس بک‌اند (API): `http://localhost:3000`
### 3. اجرای مایگریشن‌های دیتابیس
در صورت بالا آمدن کانتینرها برای اولین بار، دیتابیس شما خالی است. لازم است تا با استفاده از Prisma مایگریشن‌ها را روی دیتابیس اجرا کنید:
```bash
# از روی سیستم اصلی و در مسیر روت پروژه:
pnpm --filter api exec prisma migrate deploy
# یا استفاده از:
pnpm --filter api exec prisma db push
```
*(توجه: آدرس `DATABASE_URL` در فایل `.env` باید به صورت لوکال به `localhost:5432` اشاره کند تا از خارج کانتینر نیز در دسترس باشد)*.