ADR-0003 پردازش خصوصی تصویر ساختمان
وضعیت تصمیم
انتخاب MinIO فقط برای Development خصوصی در 2026-09-19 بهصورت صریح تأیید شده است. این ADR طراحی اجرایی همان جریان را ثبت میکند؛ تأیید انتشار منوط به Build، Scan و آزمون پذیرش است. استفاده Production یا عمومی از MinIO تحت این تصمیم مجاز نیست.
زمینه و تصمیم
عکس حداکثر ۲ مگابایت از BFF هممبدأ به API میرسد. این مسیر به Bucket عمومی، CORS یا Signed URL در Browser نیاز ندارد. چهار آواتار آماده بدون Object Storage قابل انتخاباند. عکس اصلی در قرنطینه خصوصی است؛ فقط JPEG بازسازیشده از Pixelها نمایش داده میشود.
API فایل را Decode نمیکند. Worker جدا، Job پایدار PostgreSQL را با Lease محدود میگیرد و محتوای Hash-verified را به Container پردازش تصویر میفرستد. این Container فقط به شبکه داخلی Worker متصل است و Credential پایگاه داده یا Storage ندارد. هر Decode در فرایند فرزند با سقف ۱۰ ثانیه، یک عملیات همزمان و محیط بدون Secret اجرا میشود. سقف Container برابر ۲۵۶ مگابایت و نیم CPU است. ورودی بیش از ۲۴ میلیون Pixel یا ضلع ۱۲۰۰۰ رد میشود؛ خروجی حداکثر ضلع ۱۰۲۴ دارد. جهت EXIF به Pixel اعمال و سپس Metadata حذف میشود.
MinIO از Commit رسمی 9e49d5e7a648f00e26f2246f4dc28e6b07f8c84a ساخته میشود. Source آرشیوشده مصون از آسیبپذیری نیست؛ وابستگیهای Build باید نسخه و Checksum ثبتشده داشته باشند و Scan همان Digest پیش از انتشار موفق شود. Threshold امنیتی CI برای این تصمیم کاهش پیدا نمیکند.
Credential اصلی MinIO و Credential محدود Image در دو Volume خصوصی مستقل ساخته میشوند. API و Worker فقط کلید محدود به Prefixهای عکس را میبینند؛ Decoder هیچکدام را نمیبیند. Console خاموش است و Storage پورت Host یا مسیر Proxy عمومی ندارد. Manifest انتشار Digest Storage را در خود نگه میدارد تا Rollback تصویر برنامه و Storage را با همان Manifest قبلی بازیابی کند.
جداسازی داده
جدولهای Upload و Audit دارای RLS هستند. تراکنشهای این جریان با SET LOCAL ROLE tripylon_building_images و Context محلی Tenant اجرا میشوند؛ Role مالک Table، Superuser یا دارای BYPASSRLS نیست. شمارنده محدودیت حساب میتواند Uploadهای همان Actor در ساختمانهای مختلف را بشمارد. Query عملیاتی همچنان Building و Actor را صریح محدود میکند.
Worker از Role مستقل tripylon_image_worker فقط برای جدول Job استفاده میکند و به Roleهای محصول دسترسی تازه نمیدهد. این تغییر، جایگزین اصلاح Role اتصال پایه در سایر ماژولهای قدیمی نیست؛ مرز محدودشده مربوط به تراکنشهای جدید همین جریان است.
گزینهها و پیامدها
- Decode داخل API کنار گذاشته شد چون حافظه و زمان پردازش فایل نامعتبر نباید سرویس درخواستها را درگیر کند.
- صف یا Broker جدید اضافه نمیشود؛ Lease و Retry محدود PostgreSQL برای یک Worker کافی است.
- انتقال مستقیم از Browser به Storage به دلیل نیاز این Development خصوصی به Endpoint عمومی و CORS انتخاب نشد؛ هزینه مسیر فعلی دو انتقال محدود ۲ مگابایتی است.
- MinIO مدیریتشده Production محسوب نمیشود. Arvan همچنان پیش از Production به آزمون سازگاری واقعی نیاز دارد.
- قرنطینه پس از دو روز با Lifecycle حذف میشود؛ تصویر نمایشی انتخابشده با Lifecycle عمومی پاک نمیشود. سیاست حذف خودکار تاریخچه تصاویر نمایشی موضوع این انتشار نیست.
اعتبارسنجی
MinIO واقعی باید Write/Read با Credential محدود، رد Anonymous Read، رد Prefix نامرتبط و Bootstrap تکراری را اثبات کند. PostgreSQL باید خواندن و نوشتن Cross-tenant بدون Predicate برنامه را با RLS رد کند. آزمون انتهابهانتها باید عکس معتبر، فایل جعلی، Timeout، Retry و عدم تغییر Checklist پیش از انتخاب نهایی را پوشش دهد. وجود این ADR به معنی اجرای تمام این آزمونها یا استقرار نیست.