به‌روزرسانی README ریشه: معماری جدید (Traefik + Caddy + MinIO)

- نمودار مسیریابی Traefik (/ و /api و /media) جایگزین توضیحات nginx
- مستندسازی «همه متن‌ها در دیتابیس» و آپلود تصویر به MinIO
- پورت‌های جدید: سایت ۵۱۷۳ (Traefik)، کنسول MinIO ۹۰۰۱
- رفتار seed در ارتقا (فقط جدول‌های خالی) و پروکسی dev فرانت‌اند
This commit is contained in:
MMD
2026-09-06 20:51:26 +03:30
parent 3a7c7b0908
commit bf3c67f405
+39 -16
View File
@@ -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 عمومی (فقط خواندن) هستند؛ آپلود فقط با توکن ادمین ممکن است