بهروزرسانی README ریشه: معماری جدید (Traefik + Caddy + MinIO)
- نمودار مسیریابی Traefik (/ و /api و /media) جایگزین توضیحات nginx - مستندسازی «همه متنها در دیتابیس» و آپلود تصویر به MinIO - پورتهای جدید: سایت ۵۱۷۳ (Traefik)، کنسول MinIO ۹۰۰۱ - رفتار seed در ارتقا (فقط جدولهای خالی) و پروکسی dev فرانتاند
This commit is contained in:
@@ -2,18 +2,33 @@
|
|||||||
|
|
||||||
مونوریپوی سایت گروه ساختمانی آرامش شامل:
|
مونوریپوی سایت گروه ساختمانی آرامش شامل:
|
||||||
|
|
||||||
- **`frontend/`** — سایت React + Vite + Tailwind (همه محتوا از API خوانده میشود)
|
- **`frontend/`** — سایت React + Vite + Tailwind (تمام متنها و تصاویر از API خوانده میشود)
|
||||||
- **`backend/`** — بکاند FastAPI + SQLAlchemy 2 + PostgreSQL + JWT
|
- **`backend/`** — بکاند FastAPI + SQLAlchemy 2 + PostgreSQL + JWT + MinIO
|
||||||
|
|
||||||
|
## معماری
|
||||||
|
|
||||||
|
```
|
||||||
|
Traefik (پورت ۵۱۷۳ — تنها نقطه ورود)
|
||||||
|
├── / → Caddy (فایلهای استاتیک SPA)
|
||||||
|
├── /api → FastAPI (بکاند)
|
||||||
|
└── /media → MinIO (باکت aramesh-media — تصاویر آپلودی)
|
||||||
|
```
|
||||||
|
|
||||||
|
- **همه محتوای متنی سایت در PostgreSQL است** — هیچ متنی در کد فرانتاند هاردکد نشده؛
|
||||||
|
با یک درخواست `GET /api/site` بارگذاری و از پنل مدیریت ویرایش میشود
|
||||||
|
- **تصاویر آپلودی در MinIO** (Object Storage سازگار با S3) ذخیره میشوند و با مسیر نسبی
|
||||||
|
`/media/...` برگردانده میشوند — بکاند ذخیرهسازی بدون تغییر محتوای دیتابیس قابل تعویض است
|
||||||
|
- مسیریابی همهچیز روی **Traefik** است (با Docker labels) — nginx در پروژه وجود ندارد
|
||||||
|
|
||||||
## ساختار
|
## ساختار
|
||||||
|
|
||||||
```
|
```
|
||||||
├── frontend/ # سایت React
|
├── frontend/ # سایت React
|
||||||
│ ├── src/ # کد منبع (api.tsx = لایه اتصال به بکاند)
|
│ ├── src/ # کد منبع (api.tsx = لایه اتصال به بکاند)
|
||||||
│ ├── Dockerfile # بیلد Node + سرو با nginx
|
│ ├── Dockerfile # بیلد Node + سرو استاتیک با Caddy
|
||||||
│ └── nginx.conf # پروکسی /api به بکاند
|
│ └── Caddyfile # فقط سرو فایلهای استاتیک (مسیریابی روی Traefik است)
|
||||||
├── backend/ # بکاند FastAPI
|
├── backend/ # بکاند FastAPI
|
||||||
│ ├── app/ # کد منبع
|
│ ├── app/ # کد منبع (آپلود تصویر: app/api/admin.py)
|
||||||
│ ├── requirements.txt
|
│ ├── requirements.txt
|
||||||
│ ├── Dockerfile
|
│ ├── Dockerfile
|
||||||
│ └── .env.example
|
│ └── .env.example
|
||||||
@@ -26,11 +41,13 @@
|
|||||||
docker compose up --build
|
docker compose up --build
|
||||||
```
|
```
|
||||||
|
|
||||||
- سایت: http://localhost:5173
|
- سایت: http://localhost:5173 (از طریق Traefik)
|
||||||
- مستندات API: http://localhost:8000/docs
|
- مستندات API: http://localhost:8001/docs (با `docker-compose.override.yml` محلی)
|
||||||
- دیتابیس PostgreSQL در کانتینر جدا (دادهها در volume ذخیره میشوند)
|
- کنسول MinIO: http://localhost:9001 — کاربر/رمز از متغیرهای `MINIO_ROOT_*` در compose
|
||||||
- بکاند هنگام شروع، خودش جداول و دادههای اولیه سایت را seed میکند
|
- دیتابیس PostgreSQL و آبجکتاستور MinIO هر دو در کانتینر جدا با volume دائمی
|
||||||
- nginx درخواستهای `/api` را خودش به بکاند پروکسی میکند — نیازی به تنظیم CORS نیست
|
- بکاند هنگام شروع، خودش جداول را میسازد و **فقط جدولهای خالی** را seed میکند —
|
||||||
|
ارتقای نسخه دادههای فعلی را از بین نمیبرد
|
||||||
|
- در اولین اجرا، سرویس `minio-setup` باکت `aramesh-media` را میسازد و خواندن عمومی را فعال میکند
|
||||||
|
|
||||||
## اجرای محلی (توسعه)
|
## اجرای محلی (توسعه)
|
||||||
|
|
||||||
@@ -52,23 +69,29 @@ uvicorn app.main:app --reload
|
|||||||
```bash
|
```bash
|
||||||
cd frontend
|
cd frontend
|
||||||
npm install
|
npm install
|
||||||
npm run dev # http://localhost:5173
|
npm run dev
|
||||||
```
|
```
|
||||||
|
|
||||||
آدرس بکاند در `frontend/src/config.ts` از `VITE_API_URL` خوانده میشود؛
|
در حالت توسعه، Vite درخواستهای `/api` و `/media` را به Traefik (پورت ۵۱۷۳) پروکسی میکند؛
|
||||||
اگر تنظیم نشود پیشفرض `http://localhost:8000` است.
|
پس استک Docker باید در حال اجرا باشد. آدرس بکاند در `frontend/src/config.ts` از
|
||||||
|
`VITE_API_URL` خوانده میشود — پیشفرض خالی یعنی درخواستهای هممبدأ.
|
||||||
|
|
||||||
## امکانات بکاند
|
## امکانات بکاند
|
||||||
|
|
||||||
- **API عمومی**: برند، خدمات، پروژهها، مقالات، نظرات، سوالات متداول، تیم، تایملاین، آمار و...
|
- **API عمومی**: برند، منو، هیرو، خدمات، پروژهها، مقالات، نظرات، سوالات متداول، تیم،
|
||||||
|
تایملاین، آمار، دفاتر، مدلهای سرمایهگذاری و... — همه در دیتابیس
|
||||||
- **فرم تماس** `POST /api/contact` و **خبرنامه** `POST /api/newsletter`
|
- **فرم تماس** `POST /api/contact` و **خبرنامه** `POST /api/newsletter`
|
||||||
- **پنل مدیریت** با JWT: ورود `POST /api/auth/login` (پیشفرض: `admin` / `aramesh123`) و سپس CRUD کامل همه محتواها در `/api/admin/...`
|
- **پنل مدیریت** با JWT: ورود `POST /api/auth/login` (پیشفرض: `admin` / `aramesh123`)
|
||||||
|
و سپس CRUD کامل همه محتواها در `/api/admin/...`
|
||||||
|
- **آپلود تصویر** `POST /api/admin/upload` (فقط توکن ادمین، حداکثر ۱۰MB) — فایل در MinIO
|
||||||
|
ذخیره و URL نسبی `/media/...` برمیگردد
|
||||||
- همه محتوا در یک درخواست: `GET /api/site`
|
- همه محتوا در یک درخواست: `GET /api/site`
|
||||||
|
|
||||||
> در محیط واقعی حتماً `SECRET_KEY` و `ADMIN_PASSWORD` را تغییر دهید.
|
> در محیط واقعی حتماً `SECRET_KEY`، `ADMIN_PASSWORD` و `MINIO_ROOT_PASSWORD` را تغییر دهید.
|
||||||
|
|
||||||
## نکات امنیتی
|
## نکات امنیتی
|
||||||
|
|
||||||
- فایل `.env` هرگز commit نمیشود (در `.gitignore` است)
|
- فایل `.env` هرگز commit نمیشود (در `.gitignore` است)
|
||||||
- رمز عبور ادمین با bcrypt هش میشود
|
- رمز عبور ادمین با bcrypt هش میشود
|
||||||
- توکنهای JWT امضا دارند و مدت اعتبارشان قابل تنظیم است
|
- توکنهای JWT امضا دارند و مدت اعتبارشان قابل تنظیم است
|
||||||
|
- تصاویر باکت MinIO عمومی (فقط خواندن) هستند؛ آپلود فقط با توکن ادمین ممکن است
|
||||||
|
|||||||
Reference in New Issue
Block a user