بیلد: انتقال بیلد فرانت‌اند به هاست + پیش‌فرض هم‌مبدأ API

- Dockerfile فرانت‌اند: npm ci داخل کانتینر بیلد به‌دلیل محدودیت شبکه
  (registry.npmjs.org از داخل VM داکر در دسترس نیست) غیرقابل‌اعتماد بود؛
  ایمیج حالا فقط Caddy است و خروجی بیلد هاست (npm run build → dist/) را
  سرو می‌کند — بیلد ایمیج از چند دقیقه آویزان به چند ثانیه رسید
- docker-compose.yml: حذف build args از سرویس frontend
- config.ts: پیش‌فرض VITE_API_URL خالی است (درخواست هم‌مبدأ از طریق
  Traefik) — مقدار قبلی http://localhost:8000 میراث معماری قبل بود و
  بیلد هاست را خراب می‌کرد
- README ریشه: بخش وبلاگ (ویرایشگر WYSIWYG، فرمت سند JSON، مهاجرت
  خودکار مقالات قدیمی) + یادداشت بیلد هاست برای فرانت‌اند
This commit is contained in:
MMD
2026-09-06 23:33:28 +03:30
parent cfe5512ec7
commit 70cf9616c1
4 changed files with 25 additions and 26 deletions
+16
View File
@@ -108,6 +108,22 @@ npm run dev
مدیریتی `401` برمی‌گردند) مدیریتی `401` برمی‌گردند)
- تمام تغییرها بلافاصله در PostgreSQL ثبت می‌شوند — با Ctrl+F5 هم می‌مانند - تمام تغییرها بلافاصله در PostgreSQL ثبت می‌شوند — با Ctrl+F5 هم می‌مانند
## وبلاگ — نوشتن با ویرایشگر WYSIWYG
مقالات با ویرایشگر غنی **TipTap** نوشته می‌شوند (همان تجربه Medium):
- در حالت ویرایش، روی هر مقاله در صفحه وبلاگ دکمه ویرایش را بزنید — کشوی نوشتن باز می‌شود
- تیتر (H2/H3)، بولد/ایتالیک/زیرخط، لیست نقطه‌ای و شماره‌ای، نقل‌قول، لینک و واگرد
- **درج تصویر داخل متن**: دکمه تصویر، یا چسباندن/کشیدن تصویر داخل نوشته — فایل مستقیم
در MinIO ذخیره و در متن قرار می‌گیرد
- راست‌به‌چپ کامل با فونت و تم سایت
- ذخیره خودکار: هر مکث کوتاه در تایپ، تغییرها را ذخیره می‌کند؛ بستن کشو هم ذخیره می‌کند
**فرمت ذخیره**: بدنه مقاله یک سند ساختاریافته TipTap (JSON) در PostgreSQL است — نه HTML خام.
صفحه مقاله آن را با رندر استاتیک TipTap به HTML تبدیل می‌کند، پس فقط تگ‌های شناخته‌شده
(پاراگراف، تیتر، لیست، نقل‌قول، تصویر، لینک) تولید می‌شوند. مقالات قدیمی (لیست پاراگراف)
در اولین اجرا به‌صورت خودکار به این فرمت تبدیل می‌شوند.
## نکات امنیتی ## نکات امنیتی
- فایل `.env` هرگز commit نمی‌شود (در `.gitignore` است) - فایل `.env` هرگز commit نمی‌شود (در `.gitignore` است)
+2 -5
View File
@@ -98,12 +98,9 @@ services:
- traefik.http.routers.api.priority=100 - traefik.http.routers.api.priority=100
- traefik.http.services.api.loadbalancer.server.port=8000 - traefik.http.services.api.loadbalancer.server.port=8000
# فقط سرو فایل‌های استاتیک SPA — همه مسیریابی‌ها روی Traefik است # فقط سرو فایل‌های استاتیک SPA — بیلد روی هاست (npm run build) انجام شده است
frontend: frontend:
build: build: ./frontend
context: ./frontend
args:
VITE_API_URL: ""
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- backend - backend
+4 -18
View File
@@ -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 FROM caddy:2-alpine
COPY Caddyfile /etc/caddy/Caddyfile COPY Caddyfile /etc/caddy/Caddyfile
COPY --from=build /app/dist /srv COPY dist /srv
EXPOSE 80 EXPOSE 80
+3 -3
View File
@@ -1,3 +1,3 @@
// آدرس بک‌اند FastAPI — در محیط تولید مقدار VITE_API_URL را در فایل .env تنظیم کنید. // آدرس بک‌اند — پیش‌فرض خالی یعنی درخواست‌های هم‌مبدأ (/api از طریق Traefik).
export const API_URL: string = // فقط اگر بک‌اند روی مبدأ دیگری سرو می‌شود VITE_API_URL را تنظیم کنید.
(import.meta.env.VITE_API_URL as string | undefined) ?? 'http://localhost:8000' export const API_URL: string = (import.meta.env.VITE_API_URL as string | undefined) ?? ''