مطالعه موردی · اودوی هدلس
فروشگاه هدلس و پورتال B2B روی Odoo 19
چگونه بدون جابهجا کردن سیستم مرجع، یک فروشگاه سریع دهزبانه و یک پورتال B2B با احراز هویت را جلوی Odoo 19 قرار دادیم — با ماژول اودویی که برای همین پروژه نوشتیم و یک پراکسی سمت سرور که ERP را از اینترنت عمومی دور نگه میدارد.
- کارفرما
- VARS Su Ürünleri
- حوزه
- واردات و توزیع آبزیان
- نقش ما
- معماری، توسعه ماژول اودو، فرانتاند، سئو، استقرار
- سال
- ۲۰۲۶

مسئله
VARS از Odoo 19 Enterprise بهعنوان سیستم مرجع استفاده میکند: محصولات، قیمتها، موجودی، CRM، سفارشهای فروش و اسناد گمرکی همه آنجا هستند و قرار نبود جابهجا شوند. اما نیاز تجاری یک ویترین صادراتی به ده زبان بود؛ آنقدر سریع و ساختیافته که خریداران بینالمللی پیدایش کنند، بههمراه پورتالی که مشتریان فعلی بتوانند سفارشها و اسناد خودشان را ببینند.
ماژول وبسایت خود اودو از پس این کار برنمیآمد. ارائه یک کاتالوگ دهزبانه از دل ERP یعنی سرعت و در دسترس بودن سایت بازاریابی به سرعت ERP گره بخورد و یک پایگاهداده حیاتی مستقیماً روی اینترنت عمومی قرار بگیرد. راه دیگر — کپی کردن کاتالوگ در یک CMS جدا — دو منبع حقیقت برای قیمت و موجودی میسازد؛ دقیقاً همان چیزی که ERP برای جلوگیری از آن وجود دارد.
تصمیم: هدلس، با ERP پشت پراکسی
اودو را بهعنوان تنها منبع حقیقت نگه داشتیم و یک فرانتاند جدا جلوی آن گذاشتیم. کاتالوگ عمومی بهصورت ایستا تولید میشود و بهشکل HTML سریع سرو میشود؛ صفحات پورتال چون داده اختصاصی یک مشتری را نشان میدهند در هر درخواست روی سرور رندر میشوند. هر دو از یک اپلیکیشن TanStack Start اجرا میشوند و به همین دلیل این تفکیک بدون نگهداری دو کدبیس ممکن شد.
قید مهم این است که مرورگر هرگز با اودو صحبت نمیکند. هر فراخوانی که به ERP میرسد از یک تابع سروری عبور میکند که نقش backend-for-frontend را دارد. همین یک قاعده، پیکربندی CORS را کاملاً حذف میکند، کوکی نشست اودو را از دسترس اسکریپت سمت کلاینت دور نگه میدارد و باعث میشود ERP اصلاً لازم نباشد از بیرون در دسترس باشد.
وضعیت امنیتی
بیشترِ ریسک را سه تصمیم حمل میکند و هرکدام در مخزن تحویلدادهشده بهصورت یک سند تصمیم معماری ثبت شدهاند:
- ثبت سرنخها با توکنی احراز هویت میشود که فقط روی سرور نگهداری میشود. مرورگر به نقطه پایانی خودمان ارسال میکند، آنجا اعتبارسنجی و فیلتر میشود و بعد به اودو میرود. توکن هرگز به کلاینت نمیرسد.
- احراز هویت مشتری، نشست خود اودو را پراکسی میکند: اطلاعات به تابع سروری میرود، اودو آن را تأیید میکند و شناسه نشست بازگشتی بهصورت کوکی HttpOnly و Secure و SameSite تنظیم میشود. جاوااسکریپت صفحه نمیتواند آن را بخواند.
- پرداخت، یک سفارش پیشنویس در اودو میسازد و خریدار را به پورتال پرداخت خود اودو میسپارد. در فرانتاند نه SDK پرداخت هست و نه گیرنده وبهوک؛ بنابراین هرگز به داده کارت دست نمیزند و خارج از دامنه PCI میماند.
لایه یکپارچهسازی که ساختیم
فرانتاند فقط با یک چیز صحبت میکند: `varsco_content_api`، ماژول Odoo 19 که برای این پروژه نوشتیم. بهجای اینکه اجازه دهد فرانتاند مستقیماً به مدلهای اودو دست بزند، یک سطح نسخهدار `/api/v1` ارائه میکند تا قرارداد میان دو سیستم صریح و قابل آزمون باشد.
پوشش آن: کاتالوگ عمومی و محصولات فروشگاه، نوشتن سرنخ با توکن در CRM، نقاط پایانی پورتال با احراز هویت نشست برای سفارشها و پروفایل، نشانیهای تحویل، فهرست علاقهمندی، نظرات محصول، عضویت خبرنامه، رهگیری سفارش و پرداخت — هرکدام با فایل آزمون اختصاصی خود در مجموعه آزمونهای ماژول.
دو ماژول دیگر تصویر را کامل میکنند: `midvex_sale_payment_link` که نشانی پورتال پرداخت را تولید میکند، و `midvex_customs_op` که اسناد گمرکی و لجستیکی را در پورتال مشتری نشان میدهد — نیازی ویژه تجارت واردات و صادرات که هیچ فروشگاه آمادهای پوشش نمیدهد.
ده زبان و سازوکارهایی که آن را صادق نگه میدارد
سایت در ۴۵ فایل مسیر و به ده زبان، از جمله عربی و فارسی راستبهچپ، منتشر شده است. پوشش ترجمه به حسن نیت واگذار نشده: فرایند ساخت پنج بازرسی زبانی اجرا میکند که در صورت نشت خط به زبان اشتباه، ایموجی جامانده، پوشش ناقص ترجمه، ترجمه ناقص مقالهها و واگرایی میان فروشگاه و داده مرجع آن، شکست میخورد.
در کنار آنها آزمونهای واحد، مجموعه آزمون سرتاسری، یک مجموعه اختصاصی دسترسپذیری و یک آزمون قرارداد اجرا میشود که تایپها و اسکیماهای خود فرانتاند را به قرارداد مستندشده API سنجاق میکند — پس واگرایی میان آنچه فرانتاند انتظار دارد و آنچه توافق شده، بهجای محیط عملیاتی در CI گرفته میشود.
انتسابی که تا CRM میرسد
هر ارسال فرم، صفحه و زبان و پارامترهای کمپینِ سازندهاش را ثبت میکند و ماژول API کمپین، منبع، رسانه، کشور و زبان را روی فیلدهای واقعی CRM در رکورد سرنخ اودو مینویسد و صفحه مبدأ را روی خود رکورد ثبت میکند. نتیجه عملی این است که یک معامله در قیف فروش تا صفحه و زبانی که آن را ساخته قابل ردیابی است — همان سنجهای که بیشتر سایتهای B2B ادعایش را دارند و کمتر کسی واقعاً آن را سیمکشی میکند.
فناوری و سطح یکپارچهسازی
- Odoo 19 Enterprise — سیستم مرجع (محصول، قیمت، موجودی، CRM، سفارش، گمرک)
- varsco_content_api — ماژول اختصاصی Odoo 19 با قرارداد نسخهدار /api/v1
- midvex_sale_payment_link · midvex_customs_op — ماژولهای اختصاصی اودو
- TanStack Start (React 19 + Vite) — فروشگاه ایستا، پورتال رندرشده روی سرور، پراکسی BFF
- TanStack Query · TanStack Router · Tailwind CSS · TypeScript سختگیرانه
- Vitest · Playwright · مجموعه دسترسپذیری · آزمون قرارداد API · پنج بازرسی زبانی
- Docker، مستقرشده روی Dokploy
آنچه تحویل شد
- یک فروشگاه عمومی دهزبانه و یک پورتال مشتری B2B با احراز هویت، متصل به Odoo 19، بدون منبع حقیقت دوم برای قیمت و موجودی.
- نصب اودویی که دیگر لازم نیست از بیرون در دسترس باشد، و فرانتاندی که خارج از دامنه PCI میماند.
- جریان سرنخی که در آن هر درخواست در CRM، صفحه و زبان و کمپین سازندهاش را همراه دارد.
- لایه یکپارچهسازیای که عامدانه قابل استفاده مجدد است: سایت مشتری بعدی یعنی یک فرانتاند تازه رو به اودویی که همان ماژول را اجرا میکند، نه بازنویسی از صفر.
آمار ترافیک و نرخ تبدیل عامدانه اینجا نیست. ابزار تحلیل پیش از سپتامبر ۲۰۲۶ در نسخه عملیاتی فعال نبود، پس هر عددی برای آن دوره ساختگی میبود. نتایج اندازهگیریشده وقتی یک دوره گزارشدهی کامل پشتشان باشد، اینجا افزوده میشود.
فاز بعدی
جریان سفارش بازارگاهها، تا سفارشهای رسیده از بازارگاههای ترکیه در همان خط اودویی بنشینند که سفارشهای فروشگاه و پورتال در آن قرار میگیرند.
ERPای دارید که نمیتوانید روی اینترنت عمومی بگذارید؟
معمولترین دلیل منطقی بودن معماری هدلس همین است. بگویید سیستم مرجع شما چیست و جلوی آن به چه نیاز دارید.