Commit Graph
117 Commits
Author SHA1 Message Date
aramesh-site deploy edcbd0dc58 feat(projects): فیلدهای «نوع پروژه» و «کاربری» + فهرست مشخصات جدید صفحهٔ جزئیات
- دیتابیس/مدل/اسکیما: ستون‌های project_type/usage دوزبانه (مهاجرت DDL
  idempotent — با استارت بک‌اند اعمال می‌شود)
- پنل: کشویر پروژه‌ها دو فیلد تازه گرفت
- صفحهٔ جزئیات: فهرست مشخصات مطابق داده‌های تیم — وضعیت / سال / طبقات /
  واحدها / نوع پروژه / زیربنا / کاربری (ردیف‌های خالی پنهان‌اند)
2026-09-28 10:17:25 +00:00
aramesh-site deploy 5cf7b51686 revert(ui): بازگردانی دکمه‌های فرم تماس، خبرنامه، مقالات، داستان و صفحهٔ مقاله به طرح قبلی
همه جای Button/PremiumButton جابه‌جا شده بودند؛ به Button/ButtonLink قبلی
برگشتند (کامپوننت Button قبلاً بازگردانده شده بود).
2026-09-28 09:58:49 +00:00
aramesh-site deploy 531e8d63c1 revert(ui): بازگردانی هیروی صفحهٔ اصلی به حالت پیش از UI v1
- دکمه‌های CTA: بازگشت به ButtonLink شیشه‌ای (اصلی با دایرهٔ مسی، ثانویه مات)
- کارت شناور آمار (badge_value/badge_label) که UI v1 حذف کرده بود برگشت —
  فیلدهایش در کشوی «تنظیمات هیرو» دوباره معنا دارند
- Button.tsx که قبلاً بازگردانده شده بود دوباره استفاده می‌شود
2026-09-28 09:52:21 +00:00
aramesh-site deploy dc7a92f040 revert(ui): بازگردانی کامپوننت Button (ButtonLink) — وابستگی ساختار قدیمی جزئیات پروژه
UI v1 این کامپوننت را حذف کرده بود؛ ساختار قدیمی صفحهٔ جزئیات پروژه به آن
وابسته است (دکمهٔ بازگشت به فهرست پروژه‌ها).
2026-09-28 09:41:11 +00:00
aramesh-site deploy 11552d6124 revert(ui): بازگردانی سه بخش به حالت پیش از UI v1 (کامیت 853ad67)
- دکمهٔ تغییر زبان: کپسول بزرگ دوزبانه → دکمهٔ کوچک آیکون+متن (طرح قبلی)
- ساختار صفحهٔ جزئیات پروژه: بازگشت به چیدمان قبلی (دیتابیس‌محور بود و می‌ماند)
- قالب پرسش‌وپاسخ: بازگشت به چیدمان دوستونه (تیتر کنار آکاردئون)

توجه: بخشی از UI v1 (fatemeh) عمداً برگردانده شده به درخواست تیم UI؛
بقیهٔ تغییرات آن کامیت سر جایش است. ویرایش‌پذیری دیتابیس‌محور پروژه‌ها
و دکمهٔ ویرایش، روی همین ساختار قدیمی دوباره اعمال شده‌اند.
2026-09-28 09:30:15 +00:00
aramesh-site deploy 7b4783bb3e feat(admin): ویرایش‌پذیری هیروی صفحه‌ها و پروژه‌ها
- page-heroes به فهرست موجودیت‌های پنل اضافه شد و PageHero یک دکمهٔ واضح
  «عنوان، سرآغاز و تصویر هیروی این صفحه» گرفت (پیش‌تر فقط ویرایش درجای
  نامرئی روی خود متن بود).
- صفحهٔ پروژه‌ها و صفحهٔ جزئیات پروژه حالا از دیتابیس خوانده می‌شوند
  (فایل استاتیک projectsData فقط جانشین دیتابیس خالی/اسلاگ‌های قدیمی است) —
  پیش‌تر ویرایش پنل روی این دو صفحه اصلاً نمایش داده نمی‌شد.
- روی لیست پروژه‌ها دکمهٔ ویرایش/جابه‌جایی/حذف و «افزودن پروژه» اضافه شد و
  روی صفحهٔ جزئیات هر پروژه دکمهٔ ویرایش همان پروژه.
2026-09-28 08:36:30 +00:00
aramesh-site deploy 98c7977a19 fix(frontend): کپشن وسط‌چین، نام تصویر در Alt، و تورفتگی واضح H3 در فهرست
- کپشن: قاعدهٔ وسط‌چینِ .article-body figcaption با قاعده‌های [data-dir=...] برای
  راست/چپ‌چین بازنویسی می‌شد و عملاً وسط‌چین نمی‌شد؛ figcaption از آن فهرست‌ها
  برداشته شد. متن کپشن در ویرایشگر هم وسط‌چین شد تا با خروجی سایت یکی باشد.
- نام تصویر: نامی که پیش از بارگذاری نوشته می‌شود، حالا همان Alt تصویر می‌شود
  (پیش‌تر نام فایل مبنا بود و باید دستی در جعبهٔ زیر تصویر اصلاح می‌شد).
- فهرست مطالب: H3 با ps-4 فقط ۴ پیکسل بیشتر از H2 تورفتگی داشت (عملاً نامرئی)؛
  حالا ps-6 با فونت یک پله کوچک‌تر.
2026-09-28 07:49:08 +00:00
aramesh-site deploy c9e0720764 feat(preview): پنل مدیریت و API از گیت Basic Auth مستثنی شدند
پیش‌نمایش خصوصی دو بار احراز هویت می‌خواست (Basic Auth لبه + ورود خود پنل) و
هر origin (www/apex/.ir) هم پرسش جداگانه‌ای داشت؛ نتیجه سردرگمی تیم.
حالا روترهای /admin و /api میدل‌ور preview-auth ندارند (noindex می‌ماند) و
پنل با همان ورود خودش کار می‌کند؛ صفحات عمومی همچنان خصوصی‌اند.
2026-09-27 11:20:17 +00:00
aramesh-site deploy 87b744c9c7 fix(scripts): جلوگیری از خرابی Basic Auth با کوتیشن‌کردن مقدارهای دارای $
docker compose مقادیر .env را خودش تفسیر می‌کند؛ هش htpasswd شامل $apr1$...
است و بدون کوتیشن، $apr1 و بخش‌های بعدی به‌عنوان متغیر خالی جایگزین می‌شدند
(برچسب تبدیل به preview:/OBoRS/... می‌شد) و پیش‌نمایش خصوصی هرگز رمز را
نمی‌پذیرفت. حالا env_set مقدارهای دارای $ را تک‌کوتیشن می‌گذارد و env_get
کوتیشن را برمی‌دارد.
2026-09-27 10:41:00 +00:00
aramesh-site deploy 275c3d6bb3 fix(chatbot): row_factory=dict_row در sync_chunks و fetch_all_chunks
بدون آن، psycopg3 تاپل برمی‌گرداند و row["model"] خطای
«tuple indices must be integers or slices, not str» می‌داد؛ نتیجه:
«Initial index sync failed» و unavailable ماندن چت با وجود امبد موفق.
2026-09-27 10:32:48 +00:00
aramesh-site deploy ef619c635e fix(chatbot): کوتیشن desc در سه کوئری دیگر ایندکس
همان باگ قبلی در investment_models/process_steps/why_us/timeline هم بود؛
بدون این، سینک ایندکس ناقص می‌ماند و بخشی از محتوا هرگز بردار نمی‌گرفت.
2026-09-27 10:31:12 +00:00
aramesh-site deploy d55c8cc1e5 fix(chatbot): کوئری خدمات و نصب torch نسخهٔ CPU
- content.py: ستون desc در SQL بدون کوتیشن بود و PostgreSQL آن را کلمهٔ کلیدی
  می‌گیرد؛ نتیجه: «Initial index sync failed: syntax error at or near "desc"»
  در استارت و غیرقابل استفاده ماندن چت تا reindex. حالا "desc" کوتیشن شده.
- Dockerfile: با این‌که سرور GPU ندارد، pip نسخهٔ CUDA تورچ را از PyPI می‌گرفت
  (ایمیج ۹.۷GB با کتابخانه‌های nvidia). اول torch از ایندکس CPU نصب می‌شود.
2026-09-26 22:04:29 +00:00
aramesh-site deploy 9d0015808c feat(frontend): تحلیل رفتار با OpenPanel به‌جای اجرای نمونهٔ دوم Umami
نمونهٔ OpenPanel موجود (stats.*) با یک پروژهٔ دوم برای این سایت استفاده می‌شود؛
VITE_OPENPANEL_URL/VITE_OPENPANEL_CLIENT_ID در زمان بیلد تزریق می‌شوند و در
نبودشان همه‌چیز بی‌اثر است. API عمومی track() تغییر نکرده و مسیر Umami هم
برای عقب‌نشینی دست‌نخورده مانده.
2026-09-26 21:43:59 +00:00
aramesh-site deploy 8600d2d4a3 fix(scripts): جلوگیری از تولید راز خالی و اجرای اسکریپت پیش‌نمایش با python3
- gen-env.sh: rand با دو آرگومان صدا زده می‌شد ولی فقط $1 را می‌خواند؛
  openssl rand -hex بدون تعداد بایت خروجی خالی و کد ۰ می‌دهد، پس fallback
  هرگز اجرا نمی‌شد و .env با رازهای خالی ساخته می‌شد. حالا تعداد بایت
  رعایت می‌شود و اگر مقداری خالی بماند، اسکریپت با خطا متوقف می‌شود.
- preview-mode.sh: python روی اوبونتو ۲۴.۰۴ وجود ندارد (فقط python3).
2026-09-26 21:43:59 +00:00
MMD 846682ac4a صفحه تماس: حذف بخش دفاتر مطابق تصمیم تیم UI
CI / tests (push) Canceled after 0s
CI / images (push) Canceled after 0s
بازگرداندن من اشتباه بود — تیم UI عمداً این بخش را برداشته/جابه‌جا کرده است.
جای‌نگهدار خودشان (section خالی با aria-label) حفظ شد و فقط importهای
بی‌استفاده حذف شدند تا تایپ‌چک تمیز بماند.
2026-09-26 23:30:18 +03:30
MMD f7105a62cc بازگرداندن بخش دفاتر در صفحه تماس
شاخه UI این بخش را به یک section خالی تبدیل کرده بود (کار ناتمام)؛
ادغام خودکار آن را بی‌صدا حذف می‌کرد. محتوای دفاتر (شهر/نشانی/ساعات)
با همان چیدمان و ویرایش‌پذیری مدیریتی برگردانده شد.
2026-09-26 23:09:13 +03:30
MMD 0628344dcf Merge remote-tracking branch 'origin/feature/ui-updates-v1' into new-one 2026-09-26 23:04:15 +03:30
MMD d25db9367c پیش‌نمایش خصوصی: سایت آنلاین اما غیرعمومی تا زمان انتشار
- گیت ورود Traefik (Basic Auth) روی همه مسیرها: سایت، API، تصاویر و چت — بدون رمز فقط ۴۰۱
- لایه دوم noindex: هدر X-Robots-Tag روی همه پاسخ‌ها + robots.txt مسدودکننده + نقشه سایت خالی
- اسکریپت scripts/preview-mode.sh on|off|status — ساخت خودکار نام کاربری/رمز و هماهنگ‌کردن .env
- دو دامنه (DOMAIN + DOMAIN_ALIAS) با گواهی TLS و ریدایرکت ۳۰۱ دامنه دوم به اصلی در زمان انتشار
- اسکیمای FAQPage در پوسته سئوی سمت سرور (فارسی و انگلیسی) برای خزنده‌های بدون جاوااسکریپت
- مستندسازی جریان پیش‌نمایش و چک‌لیست انتشار در README و .env.example
2026-09-26 22:47:04 +03:30
MMD 1d29e50852 وبلاگ: نام‌گذاری و متادیتای تصاویر، پرسش‌وپاسخ مقاله، میزبانی تصاویر چسبانده‌شده
- Alt/Title تصویر شاخص اکنون ذخیره می‌شود (ستون‌های جدید image_alt/image_title — قبلاً بی‌صدا دور ریخته می‌شد)
- Alt و Title تصاویر داخل متن پس از درج هم قابل ویرایش‌اند (کنار کپشن)
- نام فایل ذخیره‌سازی خوانا: نام دلخواه هنگام درج یا نام خود فایل (به‌جای UUID خالی)
- پنل پرسش‌وپاسخ پایان مقاله (ستون‌های faqs/faqs_en) با ظاهر آکاردئونی سایت و اسکیمای FAQPage
- چسباندن از Outline و هر منبع خارجی: تصاویر خودکار دانلود و در Object Storage سایت میزبانی می‌شوند (endpoint جدید import-image با محافظ SSRF) + دکمه میزبانی مجدد روی تصاویر خارجی موجود
2026-09-26 22:46:56 +03:30
fatemeh sane 853ad67db5 feat(ui): update UI v1 2026-09-25 22:49:30 +03:30
MMD 851e3fc2dc fix(compose): umami healthcheck via 127.0.0.1 — localhost resolves to ::1 and umami listens on IPv4 only 2026-09-19 01:24:15 +03:30
MMD 74770cd99d fix(stack): bring-up fixes from first local deployment
- traefik pin v3.3 -> v3.6: v3.3's old docker client fails against
  Engine 29 socket proxy (empty daemon errors, no routers)
- backend/minio/chatbot/umami: traefik.docker.network hint — Traefik
  picked the internal-network IP for multi-network services and replies
  were hairpin-dropped (all backend routes hung)
- db-init: psql needs an explicit -d arameshplaza (no default db 'aramesh'),
  set -e so failures actually fail; one-shot folded-YAML needs semicolons
- chatbot image: drop g++ (apt unreachable in build network; all wheels
  prebuilt) and mkdir /data before chown (VOLUME does not create it)
- frontend image: create caddy user (alpine image has none) with writable
  /config and /data
- monitoring: blackbox probes replace raw metric scrapes of JSON/HTML
  health endpoints (they reported 'down' while healthy); blackbox joins
  edge; SITE_URL passed via env (Prometheus has no ${VAR:-default}
  expansion); ContainerMemoryNearLimit PromQL fixed (comparison inside
  label braces); HostDiskAlmostFull filters WSL/Docker-Desktop
  pseudo-mounts
- alertmanager: config rendered by stack.sh (no env expansion in AM) and
  delivered to Bale (tapi.bale.ai); stack.sh monitoring command
- machine-local override: minio console/API moved to 29001/29000
2026-09-19 01:22:02 +03:30
MMD ce0735d775 feat(stack): full overhaul — hardening, ops tooling, monitoring, analytics, chatbot
Security: deep /api/health (DB+MinIO probes, 503 on failure) + /api/live;
rate-limited public forms with honeypots; real client IP behind Traefik
(--proxy-headers); TipTap URL sanitization on write (nh3); non-root
containers + slim .dockerignore; prod MinIO console bound to 127.0.0.1;
HSTS/nosniff on TLS routers; JWT 8h; no default credentials in code.

Reliability: Alembic migrations (create_all baseline); graceful shutdown
(exec uvicorn); hardened backups (checksums, sanity check, freshness gauge,
optional rclone off-site) + restore.sh + hourly db-backup sidecar (ops
profile); stack.sh ops tooling (deploy/logs/health/backup/restore/monitoring);
.gitattributes LF for shell scripts.

Orchestration: json-file log rotation, pinned images, per-service memory
limits, edge/internal networks, Traefik ping/accesslog/metrics + flood
limiter, conditional minio-setup, pgvector db image, one-shot db-init
(umami + aramesh_chatbot databases).

Chatbot: unified from site-chatbot branch (RAG + pgvector, SSE, ChatWidget).

Monitoring: Prometheus/Alertmanager/Loki/Promtail/Grafana + cAdvisor,
node/postgres/blackbox exporters, provisioned dashboards and 10 alert
rules; alerts delivered to Bale (tapi.bale.ai — Telegram-compatible).

Analytics: Umami on shared Postgres, build-time tracker injection, custom
events (contact/newsletter/phone/chat/lang) via frontend/src/analytics.ts.

Hygiene: CSV export for contact messages and subscribers; upload image
optimization (Pillow); CI script + GitHub-compatible workflow; audit.sh;
gen-env.sh for strong credentials.
2026-09-19 00:24:57 +03:30
MMD 805f4594d4 Merge remote-tracking branch 'origin/dashboard/blog-changes'
# Conflicts:
#	frontend/src/App.tsx
#	frontend/src/admin/ArticleWritePage.tsx
#	frontend/src/admin/EntityDrawer.tsx
#	frontend/src/pages/ArticleDetail.tsx
2026-09-17 12:31:04 +03:30
fatemeh sane 7a0defc3d4 fix(admin): resolve Tiptap editor bugs, dynamic RTL/LTR layout, sticky TOC, and equalize Bidi typography 2026-09-17 10:10:50 +03:30
MMD fe6957bf83 Merge remote-tracking branch 'origin/dashboard/blog-changes'
# Conflicts:
#	frontend/src/admin/ArticleWritePage.tsx
#	frontend/src/admin/EntityDrawer.tsx
#	frontend/src/admin/entities.ts
#	frontend/src/components/ArticleCard.tsx
#	frontend/src/index.css
2026-09-15 14:41:46 +03:30
fatemeh sane 049291c109 feat(admin): enhance editor UI (links, image captions) & fix categories
Added animated auto-opening link modal, custom image node with isolated caption deletion, fixed single-select category data binding, improved featured image layout, and updated README.
2026-09-15 11:33:04 +03:30
MMD 53673d0f9b Merge branch 'bilingual-en'
# Conflicts:
#	frontend/src/admin/ArticleWritePage.tsx
#	frontend/src/admin/EntityDrawer.tsx
#	frontend/src/admin/entities.ts
#	frontend/src/components/ArticleCard.tsx
#	frontend/src/index.css
#	frontend/src/pages/ArticleDetail.tsx
2026-09-13 18:45:06 +03:30
MMD 9d55f521a0 Merge remote-tracking branch 'origin/dashboard/blog-changes' 2026-09-13 18:29:51 +03:30
MMD 35c03ef35e اصلاح عنوان تب صفحات جزئیات — brand به‌جای brand.name 2026-09-13 18:29:34 +03:30
fatemeh sane bb6c586d99 Update blog editor features 2026-09-13 10:39:25 +03:30
MMD 4fb57dfd67 اصلاحات بازبینی: تطبیق backfill با متن فارسی، رفع باگ متای /blog (ستون image ناموجود)، پاک‌سازی og:locale و برند در پوسته سئو، محدودکردن Traefik به پروژه خود، اصلاح مسیریابی Routes و عنوان برند در صفحات جزئیات 2026-09-13 00:10:53 +03:30
MMD 6b49d035c2 فرانت‌اند: نسخه انگلیسی با مسیر /en/ — مسیریابی دوزبانه، دیکشنری رابط، بومی‌سازی داده، تغییر زبان در هدر، ویرایش انگلیسی در پنل و پشتیبانی LTR 2026-09-12 23:37:55 +03:30
MMD 6bb6226e06 بک‌اند: مدل دوزبانه — ستون‌های _en، ترجمه کامل seed انگلیسی، backfill خودکار و پوسته سئوی /en/ 2026-09-12 22:57:06 +03:30
MMD 9242b87677 ادغام site-v2: به‌روزرسانی رابط کاربری (صفحات پروژه‌ها، نمونه‌کارها، تایم‌لاین، سرمایه‌گذاری و کارت‌ها) 2026-09-12 20:08:11 +03:30
fatemeh sane 20c95e73b3 Merge branch 'site-v2' of https://git.bennu-api-bahrestan.ir/Behrad/aramesh-backend 2026-09-12 19:19:45 +03:30
fatemeh sane 5837e4b0d9 Update README file 2026-09-12 10:56:03 +03:30
MMD 1fb5d57da1 مستندات: راه‌اندازی روشن برای تازه‌واردها در README
- مرحله npm run build فرانت‌اند (لازم برای اولین اجرا) اضافه شد
- اشاره به seed شدن خودکار تصاویر از seed-media در بیلد تازه
- یادآوری اینکه هیچ فایل رمزدار در گیت نیست و فقط .env.example کپی شود
2026-09-12 10:52:34 +03:30
Behrad 8abc70dcf1 Add new updated site 2026-09-12 10:35:17 +03:30
MMD f2e5a9e58b فونت: آوردن فونت اصلی Pinar (۵ وزن) به‌جای جانشین Vazirmatn
فایل‌های اصلی Pinar از شاخه feature/frontend-updates گرفته شد (fatemeh sane آن‌ها را
سلف‌هاست کرده بود) — همان فونتی که پیش‌تر CDN از کار افتاده‌اش را سرو می‌کرد:
- ۵ وزن (Light 300، Regular 400، Bold 700، ExtraBold 800، Black 900) در
  frontend/public/fonts/pinar به‌صورت woff2 + ttf
- index.css: Pinar فونت اصلی و Vazirmatn جایگزین پشتیبان
- tailwind: کلاس pinar دوباره Pinar را اول می‌گذارد
2026-09-12 10:25:49 +03:30
MMD 5ae5421c5c رسانه: پیش‌بارگذاری تصاویر در بیلد تازه — seed-media + سینک خودکار MinIO
تا وقتی کسی کلون/بیلد تازه می‌گیرد، همان تصاویر را داشته باشد:
- seed-media شامل هر ۱۹ فایل تصویری است که در دیتابیس با پیشوند /media ثبت‌اند
- minio-setup بعد از ساخت باکت، محتوای seed-media را با mc mirror در bucket
  می‌گذارد — روی حجم موجود idempotent است و داده تازه را نمی‌خورد
2026-09-08 14:46:06 +03:30
MMD c169703a17 رسانه: اسکریپت انتقال تصاویر CDN به MinIO (migrate-media.py)
ابزار یک‌باره برای وقتی میزبان عکس (مثل i.postimg.cc) در دسترس است:
- از /api/site فهرست همه تصاویرِ URL خارجی را می‌گیرد، هرکدام را دانلود و از
  انتهای ادمین در MinIO آپلود می‌کند و مقدار فیلد را به /media/... بازنویسی می‌کند
- اعتبارسنجی فایل با هدر (تا HTML/خطا ذخیره نشود) + فرمت واقعی برای آپلود
- خروجی گزارش ردیف‌های ناتمام برای اجرای دوباره
دیتابیسِ همین سایت هم با آن منتقل شد: ۱۹ تصویر در باکت aramesh-media و دیگر
هیچ URL خارجی (postimg/housedesign) در محتوای سایت نیست.
2026-09-08 14:24:58 +03:30
MMD 07da45467b وبلاگ: دکمه «نوشتن مقاله جدید» فقط در حالت ویرایش ادمین دیده می‌شود
قبلاً برای بازدیدکننده عادی هم نمایش داده می‌شد
2026-09-08 13:27:40 +03:30
MMD 4b9cc13163 فونت: سلف‌هاست Vazirmatn — بدون دانلود هر بار از CDN
- فونت قبلی (Pinar) از fontcdn.ir دانلود می‌شد که از کار افتاده و گوگل‌فونت هم در ایران مسدود است؛ در نتیجه هر بار فونت دانلود می‌شد و در نهایت Tahoma نمایش داده می‌شد
- فایل‌های woff2 (Light/Regular/Bold) یک بار در public/fonts ذخیره شده و از همان سرور سرو می‌شوند — مرورگر کش می‌کند و هیچ وابستگی خارجی ندارد
- کلاس font-pinar برای سازگاری با کامپوننت‌ها نگه داشته شد
2026-09-08 13:27:40 +03:30
MMD f1046a6598 رفع: مقدار پیش‌فرض CORS_ORIGINS در compose بدون کوتیشن — بک‌اند بالا می‌آمد
پیش‌فرض داخل interpolate با کوتیشن تک، به‌صورت حرفی وارد env می‌شد و pydantic
JSON را پارس نمی‌کرد (SettingsError) — باعث restart-loop بک‌اند می‌شد
2026-09-08 12:22:40 +03:30
MMD 5731eda438 توسعه: برگرداندن پروکسی Vite و پورت‌های compose به مسیر Traefik
- vite.config.ts دوباره /api و /media را به Traefik (پورت 5173) پروکسی می‌کند
- compose: بدون پورت مستقیم 8000/9000 — بک‌اند لوکال اینجا روی 8001 است و پورت 8000 متعلق به استک دیگر
2026-09-08 12:14:56 +03:30
Behrad 17bddd3adf feat: update UI to glassmorphic design and copper theme 2026-09-08 12:07:34 +03:30
MMD 2ad3ad7367 زیرساخت: رمزهای اجباری از .env + لایه تولید با TLS + healthcheck و مسیر سئوی Traefik + پشتیبان‌گیری
- docker-compose.yml همه مقادیر محرمانه را با ${VAR:?} از .env می‌خواند — بدون .env استک بالا نمی‌آید
- docker-compose.prod.yml: ورودی 443 + ریدایرکت HTTP به HTTPS + گواهی Let's Encrypt و قواعد Host برای همه روترها
- healthcheck بک‌اند (api/health) و فرانت (wget) + سوار کردن frontend/dist در بک‌اند برای تزریق متا + روتر سئو (robots/sitemap/blog/projects) با اولویت 50
- سرویس mc با پروفایل tools + scripts/backup.sh (pg_dump + آینه MinIO با نگهداری ۱۴ روزه)
- .env.example ریشه + بروزرسانی READMEها
2026-09-07 04:26:18 +03:30
MMD b31124e1e4 وبلاگ و سئو: پیش‌نویس/انتشار مقاله + کلمه کلیدی سئو در دیتابیس + OG/canonical/JSON-LD و متای سمت سرور + تغییر رمز و محدودسازی ورود + تست‌ها
- مقاله‌ها ستون status (draft/published) گرفتند — GET /api/site و همه انتهای عمومی فقط منتشرشده را برمی‌گردانند؛ autosave دیگر پیش‌نویس نیمه‌کاره را زنده نمی‌کند
- کلمه کلیدی هدف چک‌لیست سئو فیلد seo_keyphrase شد (قبلاً localStorage بود)
- robots.txt و sitemap.xml از بک‌اند + سرو /blog و /projects با تزریق title/description/OG/JSON-LD از دیتابیس برای خزنده‌های بدون JS (app/seo_pages.py)
- فرانت: applySeo در seo.ts (OG/توییتر/canonical/JSON-LD)، ادغام پیش‌نویس برای ادمین، برچسب پیش‌نویس در وبلاگ، حالت خالی وبلاگ، دکمه انتشار در صفحه نوشتن
- تغییر رمز ادمین POST /api/auth/change-password + دیالوگ «رمز» در نوار مدیریت
- محدودسازی ورود: ۵ تلاش ناموفق در ۱۵ دقیقه از هر IP → 429
- ساخت دکمه + برای ردیف سئوی صفحه‌های بدون ردیف (SingletonPill)
- تست‌های pytest (۱۵ مورد) + پین‌کردن requirements + حذف package.json سرگردان فرانت
2026-09-07 04:26:18 +03:30
MMD a29deb8bb1 سئو: بررسی سئو در صفحه نوشتن + عنوان و توضیح متای هر صفحه
- پنل «بررسی سئو» در صفحه نوشتن مقاله — سبز/نارنجی/قرمز سازگار با فارسی:
  طول عنوان، کلمه کلیدی هدف (در عنوان/پاراگراف اول/تیتر H2)، طول چکیده،
  تعداد واژه، تیتربندی، متن جایگزین تصاویر، پیوندها و slug.
  کلمه کلیدی در localStorage نگه داشته می‌شود (راهنمای ویرایشگر است، نه محتوا)
- جدول seo_meta: عنوان و توضیح متای هر صفحه (page_key برای هر ۸ صفحه،
  seed خودکار، CRUD در /api/admin/seo-meta، خواندن در GET /api/site)
- تزریق عنوان/توضیح متا در فرانت‌اند: صفحه‌های فهرست از دیتابیس؛ صفحه
  مقاله و پروژه از محتوای خودشان (بدون تداخل با اثر سطح والد)
- دکمه سئو روی هیرو هر صفحه و کنار هیرو صفحه اصلی (فقط حالت ویرایش)
2026-09-07 03:12:12 +03:30