8.9 KiB
8.9 KiB
کارهای سمت سرور (Backend / DevOps)
این فایل لیست کارهایی است که برای کامل شدن ریفکتور اپلیکیشن فلاتر، باید سمت بکاند یا زیرساخت (DevOps) انجام شوند. این موارد مستقل از کد فلاترند و کد اپ منتظر آنهاست.
آخرین بهروزرسانی: ۱۴۰۵/۰۲/۳۱ (2026-05-21)
✅ حلشده (۱۴۰۵/۰۲/۳۱) — blockerهای قبلی
1. باگ Keycloak Authorization (permission ↔ scope) — ✅ حل شد
- علتِ واقعی باگ: در
populateKeycloakPermissions(درapps/api-microservice/src/app.service.ts)، فیلدscopespermission با نامِ scope (مثل'get-market') پر میشد، ولی Keycloak آنجا ID میخواهد. در نتیجه permission بدون scope ذخیره میشد (Scopes: -) و همیشه Deny میداد. - رفع (کد): متد
getScopeIds()اضافه شد که نام scope را به ID نگاشت میکند؛ حالا permission با scope ID ساخته/آپدیت میشود. (commit رویgit.irfartak.com) - رفع (تنظیم Keycloak): در didvan-api → Authorization → Settings، Decision Strategy از
UnanimousبهAffirmativeتغییر کرد. (چون scopeget-marketرا هم permission user و هم permission admin پوشش میدادند؛ با Unanimous چون admin رد میکرد کل Deny میشد.) - نتیجه: Evaluate حالا
market-user-role → PermitوGET /market → 200. endpointها کار میکنند.
2. Deploy کد جدید api-microservice — ✅ انجام شد
- روش (دور زدن مشکل npm/شبکهی سرور): یک
Dockerfile.fastساخته شد کهnode_modulesرا از image قدیمی0.0.59برمیدارد و فقطnpm run buildمیزند (بدونnpm install). سریع و آفلاین. - image جدید
registry.didvan.com/api-microservice:0.0.61ساخته شد؛ تگ در~/microservices/didvan-iac/.env(متغیرAPI_MICROSERVICE_IMAGE_TAG) بهروز شد؛ باdocker compose -f compose.yml -f compose.prod.yml up -d --force-recreate api_gatewayبالا آمد. - نکته برای دیپلویِ بعدی: خط mirror (
registry.npmmirror.com) را به Dockerfile اصلی اضافه نکن — cache داکر را خراب میکند و npm install را از صفر اجرا میکند. از همان روشDockerfile.fastاستفاده کن.
وضعیت enforcement (یادداشت)
- حالا که permissionها درستاند، میتوان به
ENFORCINGبرگشت. فعلا هنوز روی PERMISSIVE است (همpolicyEnforcementدرapp.module.ts، هم Policy Enforcement Mode در didvan-api). برگشت به ENFORCING ریسک کم دارد ولی باید همهی resourceها یکبار تست شوند.
🔴 باقیماندهی زیرساخت
3. DNS ناپایدار کانتینرها (با workaround کار میکند)
- مشکل: سرور port 53 خروجی به DNSهای عمومی بسته دارد؛ DNS داخلی (
5.200.200.200) کند/ناپایدار است → خطایgetaddrinfo EAI_AGAIN auth.didvan.com. - راهحل موقت اعمالشده (فعال): در
compose.prod.ymlبرای سرویسapi_gatewayافزوده شد:extra_hosts: ["auth.didvan.com:185.143.233.235"]. الان gateway بدون خطای DNS بالا میآید. - راهحل دائمی: یک DNS resolver محلی پایدار روی سرور راهاندازی شود، یا
extra_hostsبرای همهی سرویسهایی که به دامنههای خارجی نیاز دارند اضافه شود (مثلاmarket_serviceبرایcall4.tgju.org,tsetmc).
🟡 endpointهای ناقص بکاند (برای کامل شدن feature های فلاتر لازماند)
4. تنظیمات اعلان کاربر (User Notification Preferences)
notification-serviceفقط CRUD روی notification و template دارد؛ مفهوم ترجیحات کاربر ندارد.- نیاز به endpointهای:
- دستهبندیهای موردعلاقه برای اعلان (
favorites) - وضعیت روشن/خاموش اعلانها (
notification status) - بازهی زمانی سکوت / دریافت اعلان (
silence interval/notification time)
- دستهبندیهای موردعلاقه برای اعلان (
- پیشنهاد: یا یک سرویس/endpoint جدید (مثل
GET/PUT /user/preferences)، یا ذخیره بهصورت Keycloak user attributes. - در فلاتر: صفحهی تنظیمات اعلان فعلا ایمنسازی شده (با
AuthConfig.useLegacyApi=falseپیام «بهزودی» نشان میدهد).
5. Aggregator صفحهی اصلی (Home)
content-serviceendpoint یکپارچه برای صفحهی اصلی ندارد (مثل/homeقدیمی که banners + lists میداد).- بخشهای زیر در فلاتر فعلا منبع ندارند:
topBanner,didvanPlus,didvanVoice, و ساختارlistsصفحهی اصلی. - پیشنهاد: یک endpoint مرکب (مثلا
GET /homeیا/main-page) که این دادهها را برگرداند.
5.1 اسلایدر «تازهترین کاوشها»
- «کاوش» = ترکیب چند نوع: swot + خبر + رادار + ماهنامه + دلفی + پویشافق. endpoint واحدی برای گرفتن آخرین کاوشها وجود ندارد.
- در فلاتر فعلا: اسلایدر فقط
swotرا نشان میدهد (تنها منبعی که قطعا کاوش است و در دسترس داریم).lib/views/home/main/main_page.dart→ شاخهی_ExploreLatestSliderNewباitems: []. - برای کامل شدن لازم است یکی از اینها:
- یک endpoint مرکب «latest کاوش» که آخرین آیتم هر نوع را برگرداند، یا
- مشخص شدن شناسه/نام
categoryخبر/رادار/ماهنامه درcontent-service(تا بتوان با filter گرفت)، بهعلاوهی اتصالdelphi-serviceو منبعِ «پویش افق».
6. دستهبندی در market-service (نبض صنعت)
GET /marketفقط لیست تخت symbolها را میدهد (بدون دستهبندی).- صفحهی آمار فلاتر برای ۶ دسته (ارز/طلا، کریپتو، فلزات، کامودیتی، فولاد، سرمایه) طراحی شده.
- نیاز: افزودن فیلد
categoryبه market data یا یک endpoint گروهبندیشده.
7. عضویت خودکار کاربران در گروههای دسترسی
- کاربران جدید باید خودکار در گروههای
content-users-group,market-users-group(و سایر گروههای لازم) قرار بگیرند. - اقدام: این گروهها در Keycloak → Realm Settings → User registration → Default Groups اضافه شوند (برای کاربران جدید). کاربران موجود باید دستی اضافه شوند.
8. آپلود عکس پروفایل (S3)
- مسیر جدید دومرحلهای است: آپلود فایل به
s3-serviceو گرفتنkey، سپسPATCH /auth/users/:id/profile-pictureبا آن key. - در فلاتر:
UserProvider.setProfilePhotoفعلا فقطfalseبرمیگرداند (TODO). نیاز به مشخص شدن endpoint آپلود s3 (presigned URL یا multipart).
🟢 سرویسهایی که آمادهاند و فلاتر باید بهشان migrate شود
اینها سمت بکاند موجودند؛ فقط کد فلاتر باید بهشان وصل شود (مورد ۱ حل شد، پس حالا قابل تستاند):
ai-service— هوشان / دستیار هوش مصنوعیcomments-service— کامنتهاswot-service— بایدها و نبایدها (از طریقopportunity-threat.didvan.comکه الان هم کار میکند)delphi-service— سها / نظرسنجیticketing-service— احتمالا معادل دایرکت/پیامactivity-service— فعالیتهاcontent-service— اخبار، رادار، اینفوگرافی، ماهنامه، پادکست (همه بهصورتContentبا category/tag)
ℹ️ نکات
- دامنهی قدیمی
https://api.didvan.appکاملا down / SSL fail است؛ هیچ endpoint قدیمیای از آن جواب نمیدهد. - دامنهی
https://opportunity-threat.didvan.com(swot + stories) فعال و در دسترس است. - دامنهی جدید API gateway:
https://api2.didvan.com(درlib/config/auth_config.dart). - Keycloak:
https://auth.didvan.com، realmdidvan، client اپdidvan-app(public)، client بکاندdidvan-api(confidential, authorization).