इस प्रोजेक्ट के बारे में

goatdash [GoatCounter](https://www.goatcounter.com/) एनालिटिक्स के लिए एक हल्का, प्राइवेसी-केंद्रित डैशबोर्ड है। यह पूरी तरह से क्लाइंट-साइड पर वैनिला JavaScript के रूप में चलता है, जिसमें शून्य डिपेंडेंसी, कोई बिल्ड टूलिंग और कोई अपना बैकएंड सर्वर नहीं है। इसे तैनात करना केवल कुछ स्टैटिक फाइलों को किसी भी वेब होस्ट पर कॉपी करने जैसा सरल है। ## यह क्या करता है यह डैशबोर्ड HTTPS के माध्यम से उनके सार्वजनिक v0 API के जरिए एक या अधिक GoatCounter इंस्टेंस से जुड़ता है। यह निम्नलिखित एनालिटिक्स डेटा प्रदर्शित करता है: - **पांच KPI कार्ड**: यूनिक विजिटर्स (ट्रेंड के साथ), पेजव्यूज, टॉप पेज, ट्रैक किए गए पाथ और कुल इवेंट्स। - **रेफरर ब्रेकडाउन**: चैनल (डायरेक्ट, सर्च इंजन, कैंपेन, अन्य साइटें) के अनुसार ग्रुप किया गया ट्रैफिक, जिसमें व्यक्तिगत रेफरर्स और उनके द्वारा लाए गए पेजों का ड्रिल-डाउन शामिल है। - **कोरोप्लैथ वर्ल्ड मैप**: स्क्वायर-रूट स्केल का उपयोग करके विजिट काउंट के आधार पर शेडेड देश, जिसमें होवर टूलटिप्स, ज़ूम, पैन और रीसेट की सुविधा है। - **हर जगह ड्रिल-डाउन**: किसी भी पेज पर क्लिक करके उसके रेफरर्स देखें, किसी रेफरर पर क्लिक करके उसके द्वारा लाए गए पेज देखें, ब्राउज़र/सिस्टम/डिवाइस से उनके वर्जन तक पहुँचें, देशों से क्षेत्रों तक और कैंपेन से उनके सोर्स URL तक पहुँचें। - **लचीली तारीख सीमाएं**: आज, 7 दिन, 30 दिन, 90 दिन, या एक कस्टम स्टार्ट/एंड पीरियड। ## मल्टी-साइट सपोर्ट goatdash को मल्टी-साइट सेटअप के लिए डिज़ाइन किया गया है जहाँ प्रत्येक साइट अपने स्वयं के डोमेन पर होती है लेकिन एक ही GoatCounter अकाउंट साझा करती है। GoatCounter `Host` हेडर से सही साइट का पता लगाता है, इसलिए डैशबोर्ड प्रत्येक साइट को उसके अपने डोमेन पर क्रॉस-ओरिजिन क्वेरी करता है। साइडबार `/api/v0/sites` से सभी साइटों को सूचीबद्ध करता है, जो API की के अनुमतियों तक सीमित होता है। निष्क्रिय साइटों की बैकग्राउंड प्रीकैशिंग के कारण साइट स्विचिंग तेज़ होती है। ## आर्किटेक्चर और स्टैक - **केवल वैनिला JS**: कोई React नहीं, कोई बंडलर नहीं, कोई CDN कॉल नहीं। कुल सात स्टैटिक फाइलें। - **कोई बैकएंड नहीं**: ब्राउज़र सीधे GoatCounter API से बात करता है। पैच करने के लिए कोई सर्वर, बैकअप लेने के लिए कोई डेटाबेस, या चालू रखने के लिए कोई सर्विस नहीं है। - **सर्विस वर्कर**: इंस्टेंट रीलोड के लिए ऐप शेल और वर्जन वाले एसेट्स को कैश करता है; API रिस्पॉन्स को stale-while-revalidate के साथ कैश किया जाता है। - **थीम**: डार्क, लाइट या ऑटो मोड, जिसे टॉपबार बटन के माध्यम से स्विच किया जाता है और एक बाहरी `theme.js` स्क्रिप्ट द्वारा पेंट से पहले लागू किया जाता है, जो सख्त CSP (`default-src 'self'`) के साथ संगत है। - **भाषा**: स्पेनिश, अंग्रेजी या ऑटो-डिटेक्ट, जो `localStorage` में सुरक्षित रहती है। - **डेमो मोड**: अन्वेषण के लिए बिना API की के वास्तविक नमूना डेटा लोड करता है। ## इंस्टॉलेशन कोई इंस्टॉल स्क्रिप्ट नहीं है और संकलित (compile) करने के लिए कुछ भी नहीं है। किसी भी HTTP सर्वर से स्टैटिक फाइलों को सर्व करें: ```sh python3 -m http.server 8000 ``` आवश्यकताएं: एक स्टैटिक वेब सर्वर और एक GoatCounter इंस्टेंस जिसका v0 API ब्राउज़र से HTTPS के माध्यम से पहुंच योग्य हो। Docker, Node या बिल्ड टूल्स की आवश्यकता नहीं है। प्रोडक्शन मल्टी-साइट डिप्लॉयमेंट के लिए, अपने वेब सर्वर को फाइलों को एक समर्पित डोमेन (जैसे, `stats.example.com`) से सर्व करने के लिए कॉन्फ़िगर करें और सुनिश्चित करें कि इंडेक्स HTML पर `Cache-Control: no-store` सेट है। एसेट फाइलें वर्जन क्वेरी स्ट्रिंग्स (जैसे, `app.js?v=3`) का उपयोग करती हैं और पुराने कैश मुद्दों से बचने के लिए प्रत्येक डिप्लॉय पर इन्हें अपडेट किया जाना चाहिए। एक वैकल्पिक systemd-आधारित साप्ताहिक सेल्फ-अपडेटर (`deploy/goatdash-update.sh`) प्रदान किया गया है जो नवीनतम GitHub रिलीज़ डाउनलोड करता है, इसके SHA256 चेकसम को सत्यापित करता है, वर्तमान इंस्टॉलेशन का बैकअप लेता है और नए वर्जन को बदल देता है। ## कॉन्फ़िगरेशन पहली बार लोड होने पर कनेक्ट स्क्रीन निम्नलिखित मांगती है: - आपकी साइट(स) का **GoatCounter URL** (जैसे, `https://stats.cloudless.club`)। - GoatCounter में Settings > API के तहत बनाया गया एक **API key**, जिसमें कम से कम Count और Read statistics अनुमतियां हों। दोनों मान ब्राउज़र के `localStorage` में संग्रहीत किए जाते हैं और केवल HTTPS के माध्यम से आपके GoatCounter इंस्टेंस को भेजे जाते हैं। थीम, भाषा, चयनित साइट और तारीख सीमा भी स्थानीय रूप से सुरक्षित रहती है। मल्टी-साइट सेटअप के लिए, प्रत्येक साइट का अपना डोमेन होना चाहिए जो एक ही GoatCounter इंस्टॉलेशन की ओर इशारा करता हो। GoatCounter `Access-Control-Allow-Origin: *` भेजता है, जिससे बिना प्रॉक्सी के क्रॉस-ओरिजिन अनुरोध सक्षम होते हैं। ध्यान दें कि प्रत्येक प्रमाणित अनुरोध एक `OPTIONS` प्रीफ्लाइट को ट्रिगर करता है, जिसके परिणामस्वरूप प्रति API कॉल दो राउंड ट्रिप होते हैं। ## उपयोग पेज खोलें और अपना GoatCounter URL और API की दर्ज करें, या नमूना डेटा के साथ एक्सप्लोर करने के लिए **Try Demo** पर क्लिक करें। तारीख सीमाएं बदलने के लिए सेगमेंटेड कंट्रोल का उपयोग करें, थीम/भाषा बदलने या डिस्कनेक्ट करने के लिए गियर मेनू का उपयोग करें, और संबंधित डेटा में ड्रिल-डाउन करने के लिए किसी भी मेट्रिक कार्ड पर क्लिक करें। रिफ्रेश मेनू कैश को साफ़ करता है और सब कुछ फिर से फेच करता है। ## डेवलपमेंट प्रोजेक्ट `index.html`, `styles.css`, `theme.js`, `app.js`, `fixtures.js`, और `sw.js` में प्लेन HTML, CSS और JavaScript से बना है। कोई `package.json`, बंडलर या टेस्ट हार्नेस नहीं है। लोकल डेवलपमेंट: ```sh python3 -m http.server 8000 ``` `fixtures.js` में डेमो फिक्स्चर डेटा वास्तविक API रिस्पॉन्स शेप को दर्शाता है। ## लाइसेंस AGPL-3.0। वर्ल्ड मैप एसेट (`assets/world-map.js`) Abhishekh Singh के MIT-लाइसेंस प्राप्त goatcounter-dashboard से यथावत लिया गया है और MIT ही रहता है।