Wire production domain, CORS for tenant subdomains, celery volume mounts, and nginx reverse proxy configs for apex, API, identity, auth, and wildcard tenants. Co-authored-by: Cursor <cursoragent@cursor.com>
8.7 KiB
8.7 KiB
پیشرفت پروژه (Progress)
فاز ۱ — Core Platform ✅
زیرساخت و ساختار
- ساختار کامل پروژه با جداسازی اجباری
backend/وfrontend/ - کتابخانه مشترک
backend/shared-lib - بخش ۲.۱ معماری: Frontend & Backend Separation
سرویس هسته (core-service)
- پیکربندی، دیتابیس، cache، logging، security پایه
- مدلها، APIها، Entitlement، Celery، Outbox
- تستها و مستندات
Frontend
- Next.js مستقل، API Client، White-label theme
فاز ۲ — Identity & Access + SSO ✅
shared-lib
shared/auth/jwt.py— JWTValidator مشترکshared/auth/roles.py— نقشهای استاندارد پلتفرم- رویدادهای Identity در
shared/events.py
Identity & Access Service
- سرویس مستقل در
backend/services/identity-access/ - دیتابیس
identity_access_db(database-per-service) - مدلها: UserProfile, TenantMembership
- Keycloak Admin Client + token exchange (BFF)
- APIها:
/auth/config,/auth/token,/auth/me,/users,/tenants/{id}/members - Alembic migration + Dockerfile
- تستهای پایه
Keycloak
- Realm import:
infrastructure/keycloak/realm/superapp-realm.json - Clients: superapp-frontend, core-service, identity-access-service
- نقشها و کاربر admin نمونه
- docker-compose با
--import-realm
محافظت APIهای Core
AUTH_REQUIREDقابل تنظیم از envrequire_platform_admin,require_tenant_admin,require_authenticated- اعمال روی همه endpointهای مدیریتی
Frontend SSO
lib/auth.ts— OIDC flow- صفحات
/login,/auth/callback,/dashboard AuthGuardوuseAuthhook- API Client با Bearer token
زیرساخت
identity-access-serviceدر docker-compose (پورت 8001)frontendدر docker-compose (پورت 3000، dev + hot-reload)- ارتقای Next.js به
15.5.18(پچ امنیتی — نسخه 14 دیگر پشتیبانی امنیتی ندارد) infrastructure/postgres/init-dbs.sqlبرای ساخت identity_access_db- بهروزرسانی
.env.example
مستندات
- architecture.md (بخش SSO فاز ۲)
- database_schema.md (identity_access_db)
- services_contracts.md (APIهای Identity)
- progress.md, last_step.md
فاز ۳ — OTP Login + Tenant Management ✅
Backend (core-service)
- مدل
usersو migration Alembic (0002_users) - OTP request/verify:
/api/v1/auth/otp/request,/api/v1/auth/otp/verify - ثبتنام خودکار کاربر + audit log
- یکپارچگی Payamak-Panel SendOtp
- JWT محلی (HS256) برای کاربران OTP
- Admin Tenant CRUD:
/api/v1/admin/tenantsبا owner mapping - فیلتر لیست tenant بر اساس مالک (Platform Admin: همه / Tenant Admin: فقط مالک)
Frontend
lib/api.ts— API Client یکپارچه با Bearer token/admin/login— جریان OTP دو مرحلهای با countdown/admin/tenants— داشبورد لیست tenant/admin/tenants/new— فرم ایجاد tenant
تستها
test_otp_auth.py— OTP flow و tenant با JWT
مستندات
- architecture.md (بخش OTP)
- progress.md, last_step.md
.env.example(Payamak + NEXT_PUBLIC_BACKEND_URL)
فاز ۴ — Tenant Onboarding و Workspace Activation ✅
در بریف پروژه این فاز با عنوان «Phase 3: operationalizing tenant onboarding and workspace activation» معرفی شده است. چون در شمارهگذاری داخلی این سند «فاز ۳» قبلاً به OTP Login + Tenant Management اختصاص یافته بود، این تحویل بهعنوان فاز ۴ ثبت میشود (محتوا دقیقاً همان «Phase 3» بریف است).
Backend (core-service)
- مدل
TenantMembership+ جدولtenant_memberships(نقش/وضعیت/owner) - چرخهٔ عمر tenant:
draft/pending_activation/active/suspended/archived - پروفایل/برندینگ روی
tenants:business_type,default_locale,timezone,primary_color,secondary_color,logo_url,favicon_url,onboarding_completed domains.is_primaryوdomains.verification_statususers.current_tenant_id(tenant انتخابشده جاری)- Seed پلنهای پیشفرض
FREE/STARTER(migration +ensure_default_plan) UserService.resolve_current— یکپارچهسازی resolve کاربر Core از JWT محلی (OTP) یا JWT کیکلوک (SSO، بر اساسkeycloak_sub)MembershipService— عضویت owner، لیست عضویتها،ensure_role(authorization سبک با bypass برایplatform_admin)OnboardingService— ایجاد tenant، برندینگ، دامنه، تکمیل/فعالسازیTenantContextService— ساختTenantContextReadکامل برای frontend- APIهای جدید:
GET /me,GET /me/tenants,POST /onboarding/tenant,PATCH /onboarding/tenant/{id}/branding,PATCH /onboarding/tenant/{id}/domain,POST /onboarding/tenant/{id}/complete,GET /tenant/current,POST /tenant/switch - Migration
0005_tenant_onboarding(ستونها، جدول جدید، seed پلنها) PLATFORM_BASE_DOMAINدر config برای تخصیص خودکار زیردامنه
تستها
app/tests/test_onboarding.py— جریان کامل onboarding (ساخت tenant، برندینگ، دامنه، تکمیل،/me,/tenant/current,/tenant/switch) + حالات forbidden/duplicate/owner-required- کل test suite موجود (
test_otp_auth,test_tenants,test_domains, ...) بدون رگرسیون اجرا شد
Frontend
lib/api.ts— انواع و متدهایapi.me,api.onboarding,api.tenantContext(بدون تغییر ساختار قبلیapi.tenants/api.auth)hooks/useMe.ts— بارگذاری/api/v1/meapp/onboarding/page.tsx— ویزارد تکصفحهای ۴ مرحلهای (کسبوکار → برندینگ → دامنه → بازبینی) با قابلیت ازسرگیری onboarding ناتمامapp/dashboard/page.tsx— داشبورد واقعی workspace (نام، وضعیت، پلن، دامنه، وضعیت onboarding، نقش کاربر) + redirect خودکار به/onboardingدر صورت نیازcomponents/TenantSwitcher.tsx— سوییچر ساده (فقط با بیش از یک عضویت نمایش داده میشود)- Type-check تمیز (
tsc --noEmit)
زیرساخت
PLATFORM_BASE_DOMAINدر.envو.env.example
مستندات
- architecture.md (بخش ۱۱ — فاز ۴)
- database_schema.md (
tenant_membershipsجدید Core، ستونهای جدیدtenants/domains/users، توضیح تمایز با جدول همنام Identity) - services_contracts.md (بخش ۷ — Onboarding و Tenant Context)
- progress.md, last_step.md
محدودیتهای شناختهشده (عمداً خارج از این فاز)
- درگاه پرداخت واقعی برای اشتراک (فقط ساختار provisioning پیاده شده)
- تأیید واقعی دامنهٔ اختصاصی (DNS/TXT) — فعلاً فقط
pending - tenantهای ساختهشده از مسیر قدیمی
POST /admin/tenantsعضویت/پلن خودکار نمیگیرند (آن مسیر به فاز ۱/۲ تعلق دارد و در این فاز بازنویسی نشده) - JIT provisioning کامل کاربر Core از JWT کیکلوک (کاربر SSO بدون رکورد
Core فعلاً خطای
forbiddenمیگیرد)
فازهای بعدی (Backlog)
- پیادهسازی اولین ماژول بیزینسی واقعی (نگاه کنید به
last_step.md) - White-label runtime rendering (تشخیص tenant از دامنه + اعمال برند در frontend)
- JIT provisioning کامل کاربر Core از SSO کیکلوک
- Permission management پیشرفته (نقشهای سفارشی، دعوت اعضا)
- تأیید واقعی دامنهٔ اختصاصی (DNS/TXT) و درگاه پرداخت
- Subscription & Entitlement بهعنوان سرویس مستقل
- Message bus واقعی برای انتشار رویدادها
- Reverse proxy (Nginx/Traefik) و TLS