diff --git a/README.md b/README.md index 179fb23..2c6924d 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,33 @@ مونوریپوی سایت گروه ساختمانی آرامش شامل: -- **`frontend/`** — سایت React + Vite + Tailwind (همه محتوا از API خوانده می‌شود) -- **`backend/`** — بک‌اند FastAPI + SQLAlchemy 2 + PostgreSQL + JWT +- **`frontend/`** — سایت React + Vite + Tailwind (تمام متن‌ها و تصاویر از API خوانده می‌شود) +- **`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 │ ├── src/ # کد منبع (api.tsx = لایه اتصال به بک‌اند) -│ ├── Dockerfile # بیلد Node + سرو با nginx -│ └── nginx.conf # پروکسی /api به بک‌اند +│ ├── Dockerfile # بیلد Node + سرو استاتیک با Caddy +│ └── Caddyfile # فقط سرو فایل‌های استاتیک (مسیریابی روی Traefik است) ├── backend/ # بک‌اند FastAPI -│ ├── app/ # کد منبع +│ ├── app/ # کد منبع (آپلود تصویر: app/api/admin.py) │ ├── requirements.txt │ ├── Dockerfile │ └── .env.example @@ -26,11 +41,13 @@ docker compose up --build ``` -- سایت: http://localhost:5173 -- مستندات API: http://localhost:8000/docs -- دیتابیس PostgreSQL در کانتینر جدا (داده‌ها در volume ذخیره می‌شوند) -- بک‌اند هنگام شروع، خودش جداول و داده‌های اولیه سایت را seed می‌کند -- nginx درخواست‌های `/api` را خودش به بک‌اند پروکسی می‌کند — نیازی به تنظیم CORS نیست +- سایت: http://localhost:5173 (از طریق Traefik) +- مستندات API: http://localhost:8001/docs (با `docker-compose.override.yml` محلی) +- کنسول MinIO: http://localhost:9001 — کاربر/رمز از متغیرهای `MINIO_ROOT_*` در compose +- دیتابیس PostgreSQL و آبجکت‌استور MinIO هر دو در کانتینر جدا با volume دائمی +- بک‌اند هنگام شروع، خودش جداول را می‌سازد و **فقط جدول‌های خالی** را seed می‌کند — + ارتقای نسخه داده‌های فعلی را از بین نمی‌برد +- در اولین اجرا، سرویس `minio-setup` باکت `aramesh-media` را می‌سازد و خواندن عمومی را فعال می‌کند ## اجرای محلی (توسعه) @@ -52,23 +69,29 @@ uvicorn app.main:app --reload ```bash cd frontend npm install -npm run dev # http://localhost:5173 +npm run dev ``` -آدرس بک‌اند در `frontend/src/config.ts` از `VITE_API_URL` خوانده می‌شود؛ -اگر تنظیم نشود پیش‌فرض `http://localhost:8000` است. +در حالت توسعه، Vite درخواست‌های `/api` و `/media` را به Traefik (پورت ۵۱۷۳) پروکسی می‌کند؛ +پس استک Docker باید در حال اجرا باشد. آدرس بک‌اند در `frontend/src/config.ts` از +`VITE_API_URL` خوانده می‌شود — پیش‌فرض خالی یعنی درخواست‌های هم‌مبدأ. ## امکانات بک‌اند -- **API عمومی**: برند، خدمات، پروژه‌ها، مقالات، نظرات، سوالات متداول، تیم، تایم‌لاین، آمار و... +- **API عمومی**: برند، منو، هیرو، خدمات، پروژه‌ها، مقالات، نظرات، سوالات متداول، تیم، + تایم‌لاین، آمار، دفاتر، مدل‌های سرمایه‌گذاری و... — همه در دیتابیس - **فرم تماس** `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` -> در محیط واقعی حتماً `SECRET_KEY` و `ADMIN_PASSWORD` را تغییر دهید. +> در محیط واقعی حتماً `SECRET_KEY`، `ADMIN_PASSWORD` و `MINIO_ROOT_PASSWORD` را تغییر دهید. ## نکات امنیتی - فایل `.env` هرگز commit نمی‌شود (در `.gitignore` است) - رمز عبور ادمین با bcrypt هش می‌شود - توکن‌های JWT امضا دارند و مدت اعتبارشان قابل تنظیم است +- تصاویر باکت MinIO عمومی (فقط خواندن) هستند؛ آپلود فقط با توکن ادمین ممکن است