v6.2.0 — Custom Domains + Shared Gallery + Schema Drift Repair
Headline
Custom domains (Shopify-style, end-to-end)
- Tenants add their own domain at
/t/:slug/domains - Wizard shows TXT (ownership) + CNAME (routing) records with copy buttons
- "연결 확인" verifies TXT, then auto-calls Railway GraphQL
customDomainCreateto register on the web service — Let's Encrypt SSL issued without any super admin step - Status flow:
pending→verified→pending_ssl→active - Apex domain ANAME/ALIAS guidance shown inline
Shared image library
- Super admin curated R2 gallery (
shared/gallery/...) - Drag-and-drop multi-upload with Gemini vision auto-classification
- AI image generation with multi-aspect-ratio fan-out (16:9 / 4:3 / 3:2 / 1:1 / 3:4 / 9:16)
- Tenants pick from the library in PageEditor instead of generating per-tenant
Per-tenant support accounts
- Auto-created
support-{slug}@truelight.appon tenant creation - Super admin issues 24h temp password from tenant detail modal
- Per-tab session isolation (sessionStorage) — super admin + multiple support sessions coexist
URL routing refactor
/t/:slug/*Shopify-style admin URLs throughout the admin appRequireTenantAccessguard, serverauth.tsrejectssupportrole on tenant mismatch (403)
Schema + data
- Schema-drift audit pass: created missing
categories,themes,custom_domainstables across every tenant schema (idempotent runtime CREATE/ALTER) - Added columns:
preachers.title,users.password_expires_at,custom_domains.{verification_token, railway_domain_id}
Block editor
- Field/renderer alignment fixes: dedicated
PastorMessageBlock,QuoteBlock;church_intro/mission_visionfield renames - AI text gen with church-tone system prompt + 문장/문단 length toggle
- YouTube thumbnail auto-picks highest available quality
- Sermon form: inline
+ 설교자 등록button + auto-select apiClient.uploadFileunwraps R2 url correctly- Block palette tints: amber (data) / purple (layout) / plain (static)
Other
- Web header logo falls back to church name; settings endpoint fills
church_namefromtenants.namewhen missing - Super admin
+ 교회 추가→ instant list refresh + tab switch - Slug live availability check (super admin create + public register)
- Admin proxy server for same-origin
/api/*(eliminates CORS for admin) - Tenant create/register forms enforce required on all fields
Setup notes
New env vars on api-server (enable full custom-domain automation):
RAILWAY_API_TOKENRAILWAY_WEB_SERVICE_IDRAILWAY_ENVIRONMENT_IDWEB_CNAME_TARGET(defaults toweb-production-1f18f.up.railway.app)
Without RAILWAY_* vars, custom domain verification still works but stops at status verified — falls back to manual Railway dashboard registration.