diff --git a/README.md b/README.md index c83e635..4dcd4cf 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,22 @@ npm run dev مدیریتی `401` برمی‌گردند) - تمام تغییرها بلافاصله در PostgreSQL ثبت می‌شوند — با Ctrl+F5 هم می‌مانند +## وبلاگ — نوشتن با ویرایشگر WYSIWYG + +مقالات با ویرایشگر غنی **TipTap** نوشته می‌شوند (همان تجربه Medium): + +- در حالت ویرایش، روی هر مقاله در صفحه وبلاگ دکمه ویرایش را بزنید — کشوی نوشتن باز می‌شود +- تیتر (H2/H3)، بولد/ایتالیک/زیرخط، لیست نقطه‌ای و شماره‌ای، نقل‌قول، لینک و واگرد +- **درج تصویر داخل متن**: دکمه تصویر، یا چسباندن/کشیدن تصویر داخل نوشته — فایل مستقیم + در MinIO ذخیره و در متن قرار می‌گیرد +- راست‌به‌چپ کامل با فونت و تم سایت +- ذخیره خودکار: هر مکث کوتاه در تایپ، تغییرها را ذخیره می‌کند؛ بستن کشو هم ذخیره می‌کند + +**فرمت ذخیره**: بدنه مقاله یک سند ساختاریافته TipTap (JSON) در PostgreSQL است — نه HTML خام. +صفحه مقاله آن را با رندر استاتیک TipTap به HTML تبدیل می‌کند، پس فقط تگ‌های شناخته‌شده +(پاراگراف، تیتر، لیست، نقل‌قول، تصویر، لینک) تولید می‌شوند. مقالات قدیمی (لیست پاراگراف) +در اولین اجرا به‌صورت خودکار به این فرمت تبدیل می‌شوند. + ## نکات امنیتی - فایل `.env` هرگز commit نمی‌شود (در `.gitignore` است) diff --git a/docker-compose.yml b/docker-compose.yml index ccec156..5de208b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -98,12 +98,9 @@ services: - traefik.http.routers.api.priority=100 - traefik.http.services.api.loadbalancer.server.port=8000 - # فقط سرو فایل‌های استاتیک SPA — همه مسیریابی‌ها روی Traefik است + # فقط سرو فایل‌های استاتیک SPA — بیلد روی هاست (npm run build) انجام شده است frontend: - build: - context: ./frontend - args: - VITE_API_URL: "" + build: ./frontend restart: unless-stopped depends_on: - backend diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 38973e8..496113a 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,24 +1,10 @@ -# ---------- مرحله ساخت ---------- -FROM node:22-alpine AS build +# ---------- فرانت‌اند فقط سرو می‌کند ---------- +# بیلد روی هاست انجام می‌شود (npm install && npm run build) و خروجی dist/ +# داخل ایمیج کپی می‌شود — شبکه کانتینر بیلد برای npm قابل‌اعتماد نیست. -WORKDIR /app - -COPY package.json package-lock.json ./ -RUN npm ci - -COPY . . - -# آدرس API در زمان بیلد؛ پیش‌فرض خالی یعنی درخواست‌های نسبی (/api) که Traefik مسیریابی می‌کند -ARG VITE_API_URL="" -ENV VITE_API_URL=$VITE_API_URL - -RUN npm run build - -# ---------- مرحله سرو ---------- -# Caddy فقط فایل‌های استاتیک SPA را سرو می‌کند؛ مسیریابی /api و /media روی Traefik است FROM caddy:2-alpine COPY Caddyfile /etc/caddy/Caddyfile -COPY --from=build /app/dist /srv +COPY dist /srv EXPOSE 80 diff --git a/frontend/src/config.ts b/frontend/src/config.ts index f6ba382..528d239 100644 --- a/frontend/src/config.ts +++ b/frontend/src/config.ts @@ -1,3 +1,3 @@ -// آدرس بک‌اند FastAPI — در محیط تولید مقدار VITE_API_URL را در فایل .env تنظیم کنید. -export const API_URL: string = - (import.meta.env.VITE_API_URL as string | undefined) ?? 'http://localhost:8000' +// آدرس بک‌اند — پیش‌فرض خالی یعنی درخواست‌های هم‌مبدأ (/api از طریق Traefik). +// فقط اگر بک‌اند روی مبدأ دیگری سرو می‌شود VITE_API_URL را تنظیم کنید. +export const API_URL: string = (import.meta.env.VITE_API_URL as string | undefined) ?? ''