فروشگاه آنلاین

تیتان

بسته: پروژه داخلی — فروشگاه خودمان، نه یک همکاری با مشتریمدت زمان: ۷ تا ۱۰ ژوئیه ۲۰۲۶ · ۱۲ سشن
React Router 7Cloudflare WorkersD1KVR2Claude (Sonnet)پیامک کاوه‌نگار
مسیر پرداخت
هیچکارت‌به‌کارت فعال؛ درگاه زرین‌پال ساخته شده و پشت یک فلگ در انتظار تأیید اینماد است
عامل‌های کرون فعال‌شده
۰۱۰ عامل — بازیابی سبد رهاشده، نگهبان کارت‌به‌کارت، هشدار موجودی، بررسی اولیه سفارش‌های سفارشی، پیش‌نویس پاسخ تیکت، دایجست روزانه، عامل تولید محتوا، نظافت شبانه، جمع‌آوری پرداخت‌های معلق، اطلاع‌رسانی وضعیت سفارش
وضعیت ساخت
کامل تا سشن ۱۲ · هنوز راه‌اندازی نشده (دامنه و اینماد در انتظار)

وضعیت همین الان

تیتان کسب‌وکار خودِ ماست، نه یک مشتری. آن را روی همان زیرساختی می‌سازیم که می‌فروشیم — React Router 7 روی Cloudflare Workers، D1/KV/R2 و یک فهرست عامل بر پایه کرون — چون محکم‌ترین اثباتی که می‌توانیم ارائه بدهیم یک اسلاید نیست، یک فروشگاه است که خودمان اداره‌اش می‌کنیم. در زمان نوشتن این متن، تیتان از نظر قابلیت‌ها تا سشن ۱۲ کامل است اما هنوز زنده نیست: دامنه وصل نشده، تأیید اینماد نیامده، و هیچ سفارش واقعی ارسال نشده. هر چه در ادامه می‌آید، توصیف چیزی است که واقعاً ساخته شده، نه چیزی که انتظار داریم انجام دهد. وقتی تیتان راه‌اندازی شود، این صفحه یک بخش عددی از داده‌های واقعی رصد عامل‌های خودش می‌گیرد — نه زودتر از آن.

دوازده سشن، به ترتیب

تیتان در دوازده سشن متمرکز طی چهار روز ساخته شد: پایه پلتفرم و کاتالوگ (سشن‌های ۱ و ۲)، سبد خرید/پرداخت و کارت‌به‌کارت (سشن ۳)، احراز هویت بر پایه شماره تلفن (سشن ۴)، چرخه سفارش و اطلاع‌رسانی (سشن ۵)، تیکتینگ پشتیبانی و عامل چت هوش مصنوعی (سشن ۶)، مرکز فرمان ادمین (سشن ۷)، موتور اتوماسیون — ده عامل کرون (سشن ۸) — سخت‌سازی امنیتی (سشن ۹)، موتور محتوا و سئو (سشن ۱۰)، آنالیتیکس و کارایی (سشن ۱۱)، و محتوای راه‌اندازی به‌همراه صفحه نمایش عامل‌ها (سشن ۱۲). هر سشن در برابر یک فهرست پذیرش مکتوب تحویل داده شد، نه یک حس کلی از «خوب به‌نظر می‌رسد».

کارت‌به‌کارت، ساخته‌شده برای واقعیت تجارت ایرانی

ایران به درگاه‌های کارت بین‌المللی دسترسی ندارد، پس انتقال بانکی «کارت‌به‌کارت» اینجا یک روش پرداخت درجه‌یک است، نه یک جایگزین اضطراری. در لحظه ثبت سفارش، تیتان یک افست تصادفی ۱ تا ۹۹ تومانی به مبلغ انتقال اضافه می‌کند — یک جزئیات کوچک و عمدی که مبلغ دقیق هر انتقال معلق را یکتا می‌کند، تا ادمین بتواند یک انتقال بانکی ورودی را فقط با مبلغ، با سفارش تطبیق دهد، بدون دنبال کردن دستی شماره پیگیری. مشتری رسید را آپلود می‌کند یا کد پیگیری و چهار رقم آخر کارت را وارد می‌کند؛ تصاویر رسید پیش از ذخیره‌سازی از داده‌های EXIF/GPS پاک می‌شوند. سفارش تا ۲۴ ساعت در وضعیت «در انتظار تأیید» می‌ماند، درحالی‌که یک عامل کرون («نگهبان کارت‌به‌کارت») صف را زیر نظر دارد و وقتی سفارشی از یک آستانه ساعات کاری عبور کند، به مالک فروشگاه اطلاع می‌دهد. تأیید و رد هر دو از یک پنجره بازگشت ۱۰ ثانیه‌ای عبور می‌کنند، نه یک پنجره تأیید کلیکی — نوشتن واقعی در پایگاه‌داده فقط زمانی اجرا می‌شود که این پنجره بدون دست‌زدن سپری شود.

یکپارچه‌سازی درگاه زرین‌پال هم به‌طور کامل ساخته شده — فقط پشت یک فلگ نگه داشته شده تا تأیید نماد اعتماد اینماد بیاید، پس کارت‌به‌کارت عمداً تنها مسیر پرداخت فعال است، نه یک شکاف موقتی که فراموش کرده باشیم ببندیم.

ورود با کد پیامکی: تأیید شماره در لحظه پرداخت، همان ورود است

تصمیم بنیادین احراز هویت تیتان، در سشن ۴ گرفته شد: تأیید شماره تلفن در لحظه پرداخت، همان عمل ورود به حساب است. فرم ثبت‌نام جداگانه‌ای وجود ندارد. مهمانی که شماره‌اش را برای ثبت سفارش تأیید می‌کند، همزمان حسابش هم ساخته می‌شود — چون این تنها تأیید شماره‌ای است که بیشتر خریداران ایرانی داوطلبانه از آن عبور می‌کنند.

پشت صحنه، درخواست‌های کد پیامکی از سه محدودیت نرخ مستقل عبور می‌کنند، از ارزان‌ترین به گران‌ترین — یک سقف ساعتی بر اساس IP، سپس یک سقف روزانه بر اساس شماره، سپس یک بازه ۱۰ دقیقه‌ای تنگ بر اساس شماره — تا یک درخواست سوءاستفاده‌آمیز پیش از آنکه تیتان هزینه یک جست‌وجوی محدودیت نرخ غیرضروری را بپردازد، رد شود. کد ۵ رقمی با یک زمان انقضای مطلق ذخیره می‌شود که عمداً از TTL خودِ لایه ذخیره‌سازی جدا نگه داشته شده، چون یک TTL نسبی ساده‌لوح هر بار که شمارنده حدس اشتباه دوباره ذخیره شود، بی‌صدا جلو می‌رود. پس از ۵ حدس اشتباه، قفل سخت فعال می‌شود — و حتی اگر حدس بعدی درست هم باشد، همچنان قفل باقی می‌ماند. ارسال پیامک از طریق سرویس الگو-محور کاوه‌نگار انجام می‌شود که از بلک‌اوت شبانه پیامک‌های تبلیغاتی ایران معاف است — جزئیاتی که اهمیت دارد چون مشتری‌ای که ساعت ۱۱ شب می‌خواهد پرداخت کند، نباید تا صبح منتظر کدش بماند.

موتور عامل‌های کرون

هر ۱۵ دقیقه، یک Cron Trigger کلادفلر به ده وظیفه مستقل شاخه می‌زند، هرکدام در try/catch جداگانه خودش پیچیده شده تا خرابی یک عامل بقیه را با خودش پایین نکشد: یادآورهای بازیابی سبد خرید، نگهبان کارت‌به‌کارت، هشدارهای موجودی و لیست‌آرزو، یادداشت امکان‌سنجی نوشته‌شده توسط Claude برای درخواست‌های سفارشی جدید (قیمت همیشه از یک فرمول قطعی می‌آید — مدل هرگز قیمت تعیین نمی‌کند)، پیش‌نویس پاسخ برای تیکت‌های پشتیبانی دست‌نخورده، دایجست روزانه تلگرامی ساعت ۷:۳۰ به‌وقت تهران، عامل هفتگی پیش‌نویس بلاگ و شبکه‌اجتماعی که می‌نویسد اما هرگز خودش منتشر نمی‌کند، و نظافت شبانه — خروجی D1 به R2 و پاک‌سازی تصاویر رسید کارت‌به‌کارت پس از ۹۰ روز. یک عامل جمع‌آوری هم در کنارشان اجرا می‌شود که سفارش‌های پرداخت‌نشده منقضی‌شده را می‌بندد و موجودی و کد تخفیفی را که نگه داشته بودند، آزاد می‌کند.

چیزهایی که واقعاً خراب شد (و گیر افتاد)

چند باگ واقعی، بدون رنگ‌وروغن: مسیر داشبورد ادمین در ابتدا با یک هلپر مسیریابی ثبت شده بود که روی یک لایه بدون بخش مسیر والد، مسیر خودش را ندارد — بی‌صدا به‌جای /admin روی / تطبیق پیدا می‌کرد، و فقط یک ناوبری واقعی در مرورگر آن را گرفت، نه typecheck، build یا lint که همگی از قبل موفق شده بودند. جدا از آن، تولیدکننده PDF فاکتور در ابتدا با فایل‌های فونت وب تغذیه می‌شد که در مرورگر معتبرند اما به‌عنوان برنامه فونت جاسازی‌شده در PDF معتبر نیستند — ساخت درست به‌نظر می‌رسید تا وقتی که صفحه واقعی PDF خروجی خالی درآمد، چیزی که فقط یک رندرکننده واقعی PDF (نه بازبینی بصری کد) آن را آشکار کرد. هر دو از آن دسته باگ‌هایی هستند که فقط وقتی چیزی را واقعاً اجرا کنی نمایان می‌شوند.

اعداد زنده اینجا در لحظه راه‌اندازی می‌آیند

سیستم رصد عامل‌های خودِ تیتان همین حالا اعدادی را که این بخش روزی نشان خواهد داد، دنبال می‌کند — سبدهای بازیابی‌شده، میانگین زمان تأیید کارت‌به‌کارت، حجم پیامک، زمان تا ارسال — چون این طرح داده از سشن ۳ به بعد دقیقاً برای همین ساخته شده. امروز این شمارنده‌ها به‌درستی صفر هستند: هنوز هیچ سفارش واقعی ثبت نشده. ما اعداد پیش‌بینی‌شده را به‌جای نتیجه منتشر نمی‌کنیم. این بخش پس از راه‌اندازی تیتان و گذشت یک ماه کامل با داده واقعی پر می‌شود، نه زودتر.

چه چیزی هنوز باقی مانده

دامنه هنوز خریداری یا متصل نشده، تأیید اینماد نیامده، و Worker هرگز روی محیط عملیاتی دیپلوی نشده — هر تلاش برای دیپلوی تا امروز عمداً به‌عنوان یک push عملیاتی بدون درخواست نگه داشته شده. چند محصول هم هنوز عکاسی واقعی ندارند. هیچ‌کدام از این‌ها اینجا پنهان نشده؛ این وضعیت واقعی ساخت است.

همین نتیجه را برای کسب‌وکارتان می‌خواهید؟

اگر فروشگاهی می‌خواهید که به همین شکل خودش را اداره کند — عامل‌های واقعی که کار واقعی انجام می‌دهند، نه یک بازار افزونه چسبیده به یک قالب — درباره توسعه فروشگاه آنلاین با ما صحبت کنید یا با ما تماس بگیرید.

همین نتیجه را می‌خواهید؟

بگویید چه چیزی می‌سازید، ظرف ۴۸ ساعت با یک طرح اولیه معماری پاسخ می‌دهیم.