عن المشروع

goatdash هو لوحة تحكم خفيفة تركز على الخصوصية لتحليلات [GoatCounter](https://www.goatcounter.com/). يعمل بالكامل على جانب العميل كـ JavaScript خام بدون تبعيات، أدوات بناء، أو خادم خاص به. النشر يكون ببساطة بنسخ بضع ملفات ثابتة إلى أي مضيف ويب. ## ما يفعله تتصل اللوحة بأحد أو أكثر من مثيلات GoatCounter عبر API v0 العام باستخدام HTTPS. تعرض بيانات التحليلات بما في ذلك: - **خمسة بطاقات KPI**: زوار فريدين (مع الاتجاه)، صفحات مشاهدة، أعلى صفحة، المسارات المتبوعة، وإجمالي الأحداث. - **تقسيم المرجع**: حركة المرور مجمعة حسب القناة (مباشر، محركات البحث، الحملات، مواقع أخرى) مع تفصيل نحو المرجعيات الفردية والصفحات التي جلبوها. - **خريطة العالم الملونة**: تُلوّن الدول حسب عدد الزيارات باستخدام مقياس الجذر التربيعي، مع نوافذ تلميح عند التحويم، تكبير، تحريك، وإعادة ضبط. - **تفاعلات التدرج في كل مكان**: انقر على أي صفحة لرؤية مراجعها، أي مرجع لرؤية الصفحات التي قادها، المتصفحات/الأنظمة/الأجهزة لإصداراتها، الدول للمناطق، والحملات لروابط مصادرها. - **مدى زمني مرن**: اليوم، 7 أيام، 30 يومًا، 90 يومًا، أو فترة بداية ونهاية مخصصة. ## دعم متعدد المواقع تم تصميم goatdash حول إعدادات متعددة المواقع حيث يعيش كل موقع على نطاقه الخاص لكنه يشارك حساب GoatCounter واحد. يحل GoatCounter الموقع الصحيح من رأس `Host`، لذا تستفسر اللوحة عن كل موقع عبر النطاق الخاص به. يحتوي الشريط الجانبي على جميع المواقع من `/api/v0/sites`، ضمن صلاحيات مفتاح API. تبديل المواقع سريع بفضل التخزين المؤقت الخلفي للمواقع غير النشطة. ## البنية والمكدس - **JavaScript عادي فقط**: لا React، لا bundler، لا مكالمات CDN. سبعة ملفات ثابتة إجمالاً. - **بدون خادم خلفي**: المتصفح يتكلم مباشرة مع API GoatCounter. لا يوجد خادم يحتاج لتحديث، قاعدة بيانات للbackup، أو خدمة للحفاظ على تشغيلها. - **Service worker**: يخزن مؤقتًا هيكل التطبيق والملفات الثابتة ذات الإصدار لإعادة التحميل الفوري؛ يتم تخزين استجابات API مع stale-while-revalidate. - **المظهر**: الوضع الداكن، الفاتح، أو التلقائي، يتم التبديل عبر أزرار الشريط العلوي ويُطبق قبل الرسم من خلال script خارجي `theme.js` متوافق مع سياسة CSP الصارمة (`default-src 'self'`). - **اللغة**: الإسبانية، الإنجليزية، أو الكشف التلقائي، محفوظة في `localStorage`. - **الوضع التجريبي**: يحمل بيانات نموذجية واقعية بدون مفتاح API للاستكشاف. ## التثبيت لا يوجد برنامج تثبيت ولا شيء لتجميعه. قم بخدمة الملفات الثابتة من أي خادم HTTP: ```sh python3 -m http.server 8000 ``` المتطلبات: خادم ويب ثابت ومثيل GoatCounter whose API v0 can be reached over HTTPS from the browser. No Docker, Node, or build tools needed. للنشرات متعددة المواقع الإنتاجية، قم بإعداد خادم الويب الخاص بك لتقديم الملفات من نطاق مخصص (على سبيل المثال `stats.example.com`) وتأكد من تعيين `Cache-Control: no-store` على ملف HTML الرئيسي. تستخدم ملفات الأصول سلاسل استعلام الإصدار (مثل `app.js?v=3`) ويجب رفعها في كل نشر لتجنب مشاكل التخزين المؤقت القديم. يتم توفير مُحدث ذاتي أسبوعي اختياري قائم على systemd (`deploy/goatdash-update.sh`) يقوم بتنزيل أحدث إصدار من GitHub والتحقق من مجموع SHA256 الخاص به والنسخ الاحتياطي للتثبيت الحالي واستبدال النسخة الجديدة. ## التكوين عند التحميل الأول، يطلب شاشة الاتصال ما يلي: - **رابط GoatCounter** لموقعك (أو مواقعك) (على سبيل المثال `https://stats.cloudless.club`). - **مفتاح API** تم إنشاؤه في GoatCounter تحت الإعدادات > API، مع صلاحيات عداد وقراءة إحصائيات على الأقل. تخزن القيمتان في `localStorage` للمتصفح ويتم إرسالهما فقط عبر HTTPS إلى مثيل GoatCounter الخاص بك. يُحفظ المظهر واللغة والموقع المحدد ومدى التاريخ أيضًا محليًا. لإعدادات متعددة المواقع، يجب أن يكون لكل موقع نطاقه الخاص الذي يشير إلى نفس تثبيت GoatCounter. يرسل GoatCounter `Access-Control-Allow-Origin: *`، مما يتيح طلبات عبر النطاق بدون proxy. لاحظ أن كل طلب مصحوب بإعدادات `OPTIONS` مسبقًا، مما يؤدي إلى رحلتين لكل استدعاء API. ## الاستخدام افتح الصفحة وأدخل رابط GoatCounter ومفتاح API، أو انقر على **Try Demo** لاستكشاف البيانات النموذجية. استخدم التحكم المقطعي للتبديل بين مدى التاريخ، وقائمة الإعدادات لتغيير المظهر/اللغة أو الفاصل الزمني، وانقر على أي بطاقة مقياس للتفاصيل حول البيانات ذات الصلة. يقوض قائمة تحديث الذاكرة المؤقتة ويعيد تحميل كل شيء. ## التطوير يتكون المشروع من HTML وCSS وJavaScript خام عبر `index.html`, `styles.css`, `theme.js`, `app.js`, `fixtures.js`, و`sw.js`. لا يوجد `package.json`، bundler، أو مجموعة اختبار. التطوير المحلي: ```sh python3 -m http.server 8000 ``` بيانات النموذج الافتراضي في `fixtures.js` تعكس شكل استجابة API الحقيقية. ## الترخيص AGPL-3.0. يتم الاحتفاظ بعنصر خريطة العالم (`assets/world-map.js`) كما هو من لوحة تحكم goatcounter-MIT مرخصة بواسطة Abhishekh Singh وبقيت MIT.