يعيد Currencyinfo 4.2.0 بناء طبقة مصادر الأسعار حول مزودين لا يتطلبون مفاتيح بعد توقف فئتين مجانيتين من المزودين السابقين، كما يعزز وقت التشغيل والحاوية، ويقدم موقعاً للتوثيق ومجموعة اختبارات فعلية.
تمت مراجعة الأمان من قبل cryptofoundry.
الترقية من الإصدار 4.1.2 أو أقدم
لا يحتاج مستهلكو واجهة برمجة التطبيقات (API) إلى إجراء أي تغييرات: أشكال الاستجابة لـ /get و /getHistory و /status لم تتغير. ومع ذلك، هناك خطوتان إلزاميتان على المشغلين القيام بهما.
ملف config.jsonc الافتراضي من الإصدار 4.1.2 لن يعمل على الإصدار 4.2.0. يتطلب كل من CryptoCompare و CoinGecko الآن مفتاح API، وكلاهما مفعل في قالب 4.1.2، لذا سيفشل التكوين غير المعدل في التحقق قبل فتح منفذ HTTP. يجب عليك تعطيلهما أو توفير بيانات الاعتماد، وإضافة البدائل التي لا تتطلب مفاتيح لاستعادة التغطية، وتحديث priorities.
تمت إعادة بناء فهارس tickers. تحل ثلاثة فهارس مرتبة حسب التاريخ محل ثلاثة فهارس أقدم. يقوم Mongoose بإنشاء الفهارس الجديدة عند الاتصال ولكنه لا يحذف القديمة، لذا فإن الترقية المباشرة ستقوم ببناء الفهارس الثلاثة عند بدء التشغيل مما قد يؤخر الجاهزية. يوصى ببنائها خارج النطاق أولاً.
عند القياس على بيئتي إنتاج تحتوي كل منهما على حوالي 238 مليون وثيقة مؤشر: على أقراص NVMe مع 12 نواة و 64 جيجابايت من ذاكرة الوصول العشوائي، استغرق بناء الفهارس الثلاثة 17 دقيقة مع نمو indexSize من 9.1 إلى 19.3 جيجابايت؛ وعلى أقراص SATA مع 4 أنوية و 16 جيجابايت من ذاكرة الوصول العشوائي، استغرق البناء نفسه 50 دقيقة مع نمو indexSize من 8.7 إلى 18.9 جيجابايت.
يتطلب الإصدار الآن Node.js 22.12 أو أحدث. العودة إلى الإصدار 4.1.2 آمنة: تنسيق الوثائق المخزنة لم يتغير.
مصادر الأسعار
تمت إعادة صياغة مجموعة المزودين بعد أن أوقفت CryptoCompare فئتها المجانية في 21 مايو 2026 وأصبحت خطة CoinGecko التي لا تتطلب مفتاحاً غير قابلة للاستخدام. تمت إضافة أربعة موصلات جديدة، وجميعها لا تتطلب مفاتيح.
يقوم CoinPaprika بإجراء طلب مجمع واحد مصنف لكل دورة بالإضافة إلى عدد محدود من الطلبات لكل عملة للعملات خارج النطاق المجمع. تحدد bulk_limit و max_individual_requests ميزانية الطلبات، ويتم استبعاد العملات خارج النطاق عند بدء التشغيل مع إظهار تحذير بدلاً من استهلاك الحصة في كل دورة.
يعيد CoinLore مجموعة العملات بالكامل في طلب واحد متعدد المعرفات. يتم إعادة تعيين معرفات CoinLore الرقمية عبر القوائم، لذا يتم رفض أي استجابة لا يطابق رمزها المعرف المكون في وقت التشغيل بدلاً من الوثوق بها.
توفر Binance بيانات سوق فورية عامة من بورصة بدلاً من مجمع، مما يوفر استقلالية حقيقية عن المجمعات الأربعة التي تشترك جزئياً في البيانات. لا تملك Binance أزواج USD مباشرة، لذا يتم طلب الأسعار مقابل quote_asset قابل للتكوين (USDT افتراضياً) وتقديمها كـ USD؛ يؤدي فك الارتباط (depeg) إلى تقسيم الأسعار المتأثرة إلى مجموعة تباين خاصة بها بدلاً من إخفائها بواسطة تعيين. يؤدي حظر الموقع الجغرافي HTTP 451 إلى تعطيل الموصل وإرسال تنبيه مرة واحدة بدلاً من الفشل في كل دورة.
توفر ExchangeRate-API أسعار عملات ورقية دون الحاجة لمفاتيح عبر 166 عملة مع تحديثات يومية.
تم إهمال CryptoCompare وتعطيلها افتراضياً، وإزالتها من priorities، مع التخطيط لإزالتها تماماً في الإصدار الرئيسي القادم. مفتاح API إلزامي عند تفعيلها. تم تعطيل CoinGecko افتراضياً وتتطلب الآن مفتاح تجريبي مجاني، لأن الخطة العامة التي لا تتطلب مفتاحاً تحد من الطلبات إلى 5-15 طلباً في الدقيقة بشكل غير متوقع.
أصبحت خمسة مصادر مفعلة افتراضياً دون أي بيانات اعتماد، وهو ما يجعل config.default.jsonc تكويناً جاهزاً للعمل: ثلاثة مصادر تشفير لا تتطلب مفاتيح ومصدران للعملات الورقية يعني أن minSources: 2 قابلة للتحقيق فور التشغيل.
الوصول بدون مفتاح لا يعني الإذن بإعادة النشر. يقيد كل من CoinPaprika و ExchangeRate-API إعادة التوزيع بواسطة مثيل عام أو تجاري. اقرأ شروط المصدر وتوثيق إعادة التوزيع قبل تقديم هذه الأسعار للغير.
حساب الأسعار وصحة واجهة برمجة التطبيقات
فهارس tickers مرتبة حسب التاريخ ({ base: 1, date: -1 }, { quote: 1, date: -1 }, { base: 1, quote: 1, date: -1 })، لذا فإن عمليات الفرز في /getHistory يتم توفيرها بواسطة الفهرس بدلاً من حظر عمليات الفرز في الذاكرة. عند القياس على مجموعة تحتوي على 238 مليون وثيقة، انخفض وقت استعلام الزوج والنطاق من 22.8 ثانية إلى 8 مللي ثانية.
تستخدم فلاتر coin التاريخية الآن ترتيب BASE/QUOTE الموثق. في الإصدار 4.1.x كان فلتر الزوج معكوساً، لذا لم يطابق coin=ADM/USD أي شيء. يجب على عمليات النشر التي تستخدم حلولاً بديلة لعكس الترتيب من جانب العميل إزالتها.
يتم قياس minSources مقابل المصادر المحدثة للفترة المطلوبة، لذا لم يعد بإمكان المزود القديم تلبية بوابة عدد المصادر. الحد الأدنى الفعال هو min(minSources, coverage)، مما يحافظ على تقديم الزوج أحادي المصدر مع الاستمرار في الإبلاغ عنه في تحذير بدء التشغيل.
يرفض التثليث الأسعار المتقاطعة التي يتم تقريبها إلى صفر أو التي تكون غير محدودة. مخططات /get و /getHistory أصبحت .strict()، لذا فإن أي معلمة استعلام غير معروفة ستؤدي إلى 400 بدلاً من تجاهلها بصمت. أخطاء التحقق تعيد الآن 400 بدلاً من 500.
رموز العملات المقبولة من المزودين وفلاتر الاستعلام أصبحت بنمط Unicode أوسع، لذا فإن كل زوج مخزن قابل للوصول - $CWIF مثال حقيقي - بينما لا تزال الأخطاء المطبعية في base_coins و mappings تفشل عند بدء التشغيل.
يبلغ /status عن حالة updating من حالة التحديث الفعلية بدلاً من استنتاجها من مقارنة الطابع الزمني، ويتم تخطي دورات التحديث المتزامنة بدلاً من تداخلها.
الأمان
يتم حجب روابط Webhook ومفاتيح API وعبارات المرور من مخرجات السجل وملفات السجل وإرسال الإشعارات. هذا يغلق ثغرة حقيقية: حيث كانت استجابة خطأ من المزود تضع مفتاح API في السجل عبر رابط خطأ Axios.
يتم إنشاء دليل logs بوضع 0o750 وملفات السجل بوضع 0o600 كأفضل جهد لضمان عدم حظر بدء التشغيل بواسطة وحدة تخزين مملوكة لمستخدم آخر. لم تعد أسماء ملفات السجل تحتوي على نقطتين رأسيتين، مما كان يجعلها غير قابلة للفتح على بعض أنظمة الملفات.
تعمل الحاوية كمستخدم node غير متميز، وتمت إزالة npm/pnpm/yarn من صورة وقت التشغيل، ويطبق apk upgrade تحديثات Alpine المعلقة في وقت البناء، ويفشل البناء إذا تضمنت تبعية الإنتاج أي ارتباط أصلي (native binding). ملف config.jsonc غائب عمداً عن الصورة، لذا لا يمكن لأي طبقة حمل بيانات اعتماد. تم تعطيل x-powered-by، ويرفض التحقق من التكوين المفاتيح غير المعروفة والقيم غير المتطابقة في حالة الأحرف.
يتم تشغيل فحص Trivy في CI، وتم توثيق سياسة الثغرات الأمنية. تم تثبيت multer و js-yaml من خلال overrides، لذا فإن pnpm audit و pnpm audit --prod تعود بنتائج نظيفة.
النظام الأساسي والتبعيات
مطلوب Node.js >= 22.12.0، مع تثبيت pnpm على 12.3.4 عبر packageManager. تمت ترقية NestJS من 10 إلى 12، و Mongoose من 8 إلى 9، و Zod من 3 إلى 4، و adamant-api من 2 إلى 3، و chalk من 4 إلى 6. تمت ترقية ESLint من 8 إلى 10 مع تكوين مسطح، و TypeScript من 5 إلى 6، و Jest من 29 إلى 30، و Prettier إلى 3.9.
يحتوي pnpm-workspace.yaml على قائمة السماح لبرامج التثبيت التي يعتمد عليها pnpm run deps:setup. يتم تسجيل أخطاء اتصال MongoDB بدلاً من تجاهلها، ويخرج مسار فشل التمهيد برمز غير صفري مع رسالة منقحة.
التوزيع
يقوم publish-docker.yml بإجراء نشر متعدد المنصات مدفوع بالإصدار إلى ghcr.io/adamant-im/currencyinfo لـ linux/amd64 و linux/arm64، مع تسميات OCI، و SBOM، وشهادة إثبات البناء. ترفض المهمة المتابعة ما لم يكن وسم الإصدار سلفاً لـ master، ولا يتم تحديث latest إلا لأحدث إصدار غير تجريبي.
يقوم docker-ci.yml ببناء صورة الإنتاج عند طلبات السحب واختبارها مقابل config.default.jsonc المرفق، مما يثبت أن التكوين الافتراضي يبدأ ويعيد الأسعار بدون مفتاح API. يتحقق من تسميات OCI، ويؤكد أن الصورة لا تحمل أي تكوين أو أسرار، ويؤكد أن الحاوية تعمل كمستخدم غير جذري. لا يتم النشر أبداً.
يقوم docker-compose.prod.yaml بسحب الصورة المنشورة بدلاً من البناء، ويقوم بتركيب التكوين للقراءة فقط، ويثبت mongo:8.0. يقوم ملف Compose الخاص بالتطوير بربط MongoDB بـ 127.0.0.1 بدلاً من كل الواجهات.
docker pull ghcr.io/adamant-im/currencyinfo:4.2.0
التوثيق والاختبارات
يتوفر موقع توثيق على https://currencyinfo.docs.adamant.im يغطي البدء السريع، والتثبيت، والهندسة المعمارية، وحساب الأسعار، والتاريخ، والإشعارات، والعمليات، والأمان، واستكشاف الأخطاء وإصلاحها، والترقية، بالإضافة إلى مرجع كامل لـ REST والتكوين وصفحة لكل مصدر سعر توثق الحصة، وشكل المعرف، ونمط الفشل، وشروط إعادة التوزيع.
تمت إضافة LICENSE (GPL-3.0) كملف لأول مرة، جنباً إلى جنب مع CONTRIBUTING.md و AGENTS.md.
نمت مجموعة الاختبارات من 3 ملفات مواصفات إلى 28، تغطي كل موصل مصدر، والمدمج واستراتيجياته، ومدير المصادر، وتحميل التكوين، والترحيل والتحقق من المخطط، والمسجل، والمخطر، وكلا مخططات الطلب، ومرشح الاستثناء، وأنبوب التحقق، والمعترض، ووحدة التحكم، والمرافق المشتركة. يقوم pnpm test بتشغيل 266 اختباراً.
تغييرات جذرية
ملف config.jsonc الافتراضي من الإصدار 4.1.2 لن يعمل على الإصدار 4.2.0 لأن CryptoCompare و CoinGecko يتطلبان الآن مفتاح API وكلاهما مفعل في قالب 4.1.2. يجب على المشغلين تعطيلهما أو توفير بيانات الاعتماد، وإضافة البدائل التي لا تتطلب مفاتيح لاستعادة التغطية، وتحديث priorities. تحل ثلاثة فهارس tickers مرتبة حسب التاريخ محل ثلاثة فهارس أقدم؛ يقوم Mongoose بإنشاء الفهارس الجديدة عند الاتصال ولكنه لا يحذف القديمة، لذا يجب بناؤها خارج النطاق أولاً لتجنب تأخير الجاهزية. Node.js 22.12 أو أحدث مطلوب الآن. تستخدم فلاتر coin التاريخية الآن ترتيب BASE/QUOTE الموثق؛ في الإصدار 4.1.x كان فلتر الزوج معكوساً، لذا يجب على عمليات النشر التي تستخدم حلولاً بديلة لعكس الترتيب من جانب العميل إزالتها. مخططات /get و /getHistory أصبحت .strict()، لذا فإن أي معلمة استعلام غير معروفة تعيد الآن 400 بدلاً من تجاهلها بصمت، وتعود أخطاء التحقق بـ 400 بدلاً من 500.