<पी> इस पोस्ट में, मैं इस बारे में बात करता हूं कि कैसे itsmy.fyi (LinkTree का एक ओपन-सोर्स विकल्प) को अपस्टैश, एस्ट्रो, GitHuband Edgio के साथ बनाया गया है। अपस्टैश ने मुझे सभी उपयोगकर्ताओं के (सीआरयूडी) डेटा को प्रबंधित करने में मदद की, सीआरयूडी संचालन के लिए गिटहब एपीआई की तुलना में उदार दर सीमित करने की पेशकश की, और ग्रैन्युलर दर सीमित करने को लागू किया।पी> <पी>
हम क्या उपयोग करेंगे
- एस्ट्रो (फ्रंट-एंड और बैक-एंड)
- अपस्टैश (दर सीमित और सीआरयूडी संचालन)
- GitHub समस्या और वेबहुक (उपयोगकर्ता प्रोफ़ाइल प्रबंधित करने के लिए सार्वजनिक सीएमएस)
- टेलविंड सीएसएस (स्टाइलिंग)
- एजियो (तैनाती)
आपको क्या चाहिए
- एक GitHub खाता
- डेटाबेस बनाने के लिए एक अपस्टैश खाता
अपस्टैश रेडिस की स्थापना
<पी> एक बार जब आप एक अपस्टैश खाता बना लेते हैं और लॉग इन हो जाते हैं तो आप रेडिस टैब पर जाएंगे और एक डेटाबेस बनाएंगे। <पी>
<पी>
<पी> अपना डेटाबेस बनाने के बाद, आप विवरण टैब पर जा रहे हैं। जब तक आपको Connect your database नहीं मिल जाता, तब तक नीचे स्क्रॉल करें। अनुभाग. सामग्री को कॉपी करें और इसे किसी सुरक्षित स्थान पर सहेजें। <पी>
<पी> इसके अलावा, तब तक नीचे स्क्रॉल करें जब तक आपको REST API अनुभाग न मिल जाए और .env बटन का चयन करें। सामग्री को कॉपी करें और इसे किसी सुरक्षित स्थान पर सहेजें। <पी>
प्रोजेक्ट की स्थापना
<पी> सेट अप करने के लिए, बस ऐप रेपो को क्लोन करें और इसमें जो कुछ भी है उसे जानने के लिए इस ट्यूटोरियल का पालन करें। प्रोजेक्ट को फोर्क करने के लिए, चलाएँ: git clone https://github.com/rishi-raj-jain/itsmy.fyi
cd itsmy.fyi
yarn install
<पी> एक बार जब आप रेपो क्लोन कर लेते हैं, तो आप एक .env फ़ाइल बनाने जा रहे हैं। आप उपरोक्त अनुभागों से हमारे द्वारा सहेजे गए आइटम जोड़ने जा रहे हैं। <पी> इसे कुछ इस तरह दिखना चाहिए: .env# Obtained from your GitHub repo
GITHUB_API_TOKEN="to_create_and_update_github_comments"
GITHUB_WEBHOOK_SECRET="if_you_are_matching_github_webhooks_sha256"
# Obtained from the steps as above
UPSTASH_DB="your_upstash_redis_from_above"
UPSTASH_REDIS_REST_URL="your_upstash_redis_rest__url_from_above"
UPSTASH_REDIS_REST_TOKEN="your_upstash_redis_rest__token_from_above"
<पी> इन चरणों के बाद, आपको निम्न आदेश का उपयोग करके स्थानीय वातावरण प्रारंभ करने में सक्षम होना चाहिए: yarn run edgio:dev
भंडार संरचना
<पी> यह प्रोजेक्ट के लिए मुख्य फ़ोल्डर संरचना है. मैंने उन फ़ाइलों पर लाल घेरा बना दिया है जिनकी इस पोस्ट में आगे चर्चा की जाएगी जो सीआरयूडी संचालन, दर सीमा और उन फ़ाइलों से संबंधित हैं जिनमें उनका संदर्भ दिया गया है। <पी>
उच्च-स्तरीय डेटा प्रवाह
<पी> यह एक उच्च-स्तरीय आरेख है कि डेटा कैसे प्रवाहित हो रहा है। - यदि कोई उपयोगकर्ता अपने my.fyi/me/slug पर जाता है और इस पृष्ठ पर प्रतिक्रिया कैश नहीं की जाती है (या पुनः सत्यापित की जा रही है), तो यह getUserInfo फ़ंक्शन को कॉल करता है जो बदले में अपस्टैश DB से उपयोगकर्ता json को पुनः प्राप्त करता है
- यदि कोई उपयोगकर्ता GitHub समस्या बनाता है, अपडेट करता है या हटाता है, तो GitHub एक वेबहुक ट्रिगर करता है जो एंडपॉइंट पर पोस्ट करता है। उस समापन बिंदु में, पहले अपस्टैश रेट लिमिटिंग का उपयोग यह मूल्यांकन करने के लिए किया जाता है कि क्या अनुरोधित परिवर्तन किया जा सकता है, और फिर अपस्टैश का उपयोग करके, उपयोगकर्ता json(ओं) को बनाया, अद्यतन या हटाया जाता है।
<पी>
अपस्टैश रेडिस के माध्यम से उपयोगकर्ता प्रोफ़ाइल सीआरयूडी संचालन
<पी> इस अनुभाग में, हम इस बात पर गहराई से विचार करेंगे कि उपयोगकर्ता प्रोफ़ाइल के लिए डेटा कैसे प्राप्त किया जाता है, अद्यतन किया जाता है और हटाया जाता है। हम अपस्टैश का निरंतर उपयोग करते हैं (ioredis के माध्यम से)। ) डेटा लाने और प्रदर्शित करने के लिए। मैं CRUD संचालन के लिए GitHub से Upstash पर क्यों स्थानांतरित हुआ?
<पी> जबकि मैंने डेटा प्रबंधन के स्रोत के रूप में GitHub के साथ शुरुआत की:Github इश्यूज़ डेटा फॉर्म से GitHub Webhooks से रिपॉजिटरी के भीतर CRUD उपयोगकर्ता jsons तक, GitHub REST API पर सीमाएँ:1,000 requests per hour per repository ऐसा प्रतीत होता है कि यह प्लेटफ़ॉर्म के इच्छित उपयोग को प्रतिबंधित और पीछे ले जा रहा है। <पी> अपस्टैश कहीं बेहतर साबित हुआ क्योंकि इसने मुझे शुरुआत में अपने फ्रीप्लान में प्रतिदिन 10K कमांड की पेशकश की, और उसके बाद जैसे-जैसे मेरा उपयोग बढ़ा, यह बहुत ही न्यूनतम दर पर पहुंच गया। इस तरह के दृष्टिकोण ने मुझे बिना किसी लागत के अधिक से अधिक उपयोगकर्ता अधिग्रहण करने और डेटाबेस की स्केलिंग और प्रबंधन लागतों के बारे में चिंता किए बिना तेजी से पुनरावृत्त करने की अनुमति दी। getUserInfo:उपयोगकर्ता प्रोफ़ाइल फ़ंक्शन लाया जा रहा है
<पी> getUserInfo फ़ंक्शन आयोरेडिस के hget का उपयोग करता है प्रासंगिक उपयोगकर्ता प्रोफ़ाइल पृष्ठ के लिए अपस्टैश के लिए एपीआई अनुरोध करने की कुंजी के रूप में स्लग के माध्यम से, एक अद्वितीय slug द्वारा पहचाना जाता है .यदि वह उपयोगकर्ता प्रोफ़ाइल मौजूद नहीं है (या कोई त्रुटि है), तो फ़ंक्शन को { code: 0 } के साथ एक ऑब्जेक्ट लौटाने के लिए सेट किया गया है। ताकि तब उपयोगकर्ता को एस्ट्रो के डायनामिक रूट में स्वचालित रूप से 404 पर रीडायरेक्ट किया जा सके। // File: lib/Upstash/users/get.js
// Read User Profile Code
import redis from "../setup";
export async function getUserInfo(slug) {
try {
const userData = await redis.hget("profiles", slug);
const parsedData = JSON.parse(userData);
if (parsedData.slug === slug) {
return { ...parsedData, code: 1 };
}
return {
code: 0,
error: `slug doesn't match for the user.`,
};
} catch (e) {
const error = e.message || e.toString();
console.log(error);
return {
code: 0,
error,
};
}
}
<पी> इसी प्रकार, शेष CRUD ऑपरेशन इस प्रकार हैं: import redis from "../setup";
// File: @/lib/Upstash/users/delete.js
// Delete User Profile Code
export async function deleteUserInfo(slug) {
try {
await redis.hdel("profiles", slug);
return { code: 1 };
} catch (e) {
console.log(e.message || e.toString());
return {
code: 0,
};
}
}
// File: @/lib/Upstash/users/post.js
// Create/Update User Profile Code
export async function postUserInfo(data) {
try {
await redis.hset("profiles", data.slug, JSON.stringify(data));
return { code: 1 };
} catch (e) {
const error = e.message || e.toString();
console.log(error);
return {
code: 0,
error,
};
}
}
दर सीमित
<पी> एजियो के साथ सर्वर रहित वातावरण में रेट-लिमिटिंग लागू करने के लिए, हम अपस्टैश रेडिस डेटाबेस क्लाइंट और @upstash/ratelimit नामक रेट लिमिटर लाइब्रेरी का उपयोग करते हैं। . @/lib/Upstash/ratelimit.js// Reference Function to ratelimiting
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
import { getENV } from "@/lib/env";
const url = getENV("UPSTASH_REDIS_REST_URL");
const token = getENV("UPSTASH_REDIS_REST_TOKEN");
export const ratelimit = (number, time) => {
if (url && token) {
return new Ratelimit({
redis: new Redis({
url,
token,
}),
limiter: Ratelimit.fixedWindow(number, time),
});
}
return;
};
<पी> रेट लिमिटिंग का उपयोग करके, मैं निम्नलिखित हासिल करने में सक्षम था: ए. सेवा का उपयोग करें - पूर्णतः निःशुल्क एवं असीमित
<पी> रेट लिमिटिंग का उपयोग करते हुए, मैं प्रोफ़ाइल निर्माण एपीआई को सार्वजनिक रूप से उजागर करने में सक्षम हूं! इससे मुझे सिस्टम के लाभों को प्रदर्शित करने की अनुमति मिली, यानी GUI के माध्यम से प्रोफ़ाइल की स्थापना में आसानी। वस्तुतः कोई भी वेबसाइट (itsmy.fyi) के माध्यम से एक सप्ताह में 3 प्रोफ़ाइल बना सकता है, और प्रोफ़ाइल संपादित करने, असीमित प्रोफ़ाइल बनाने जैसी सुविधाओं तक असीमित पहुंच के लिए, उपयोगकर्ताओं को प्रोफ़ाइल बनाने के GitHub तरीके पर स्विच करना होगा। हम एक सप्ताह में 3 प्रोफ़ाइल की दर सीमा को लागू करने में सक्षम हैं कुंजी के रूप में आईपी पता. // Rate limit 3 profiles in a week via the web for a user
const ratelimitUser = ratelimit(3, 7 * 24 * 60 * 60 + " s");
if (rateLimiter) {
// Look at the x-0-client-ip set by Edgio in serverless
const result = await rateLimiter.limit("x-0-client-ip");
limit = result.limit;
remaining = result.remaining;
if (!result.success) {
// Return a message
}
}
बी. किसी उपयोगकर्ता द्वारा किए गए संपादनों की संख्या के लिए विस्तृत मॉडरेशन लागू करें
<पी> इसके अलावा, रेट लिमिटिंग के माध्यम से हम किसी उपयोगकर्ता द्वारा उनके GitHub उपयोगकर्ता नाम के आधार पर एक मिनट में किए गए संपादनों की संख्या को मॉडरेट करने में सक्षम हैं। फिलहाल, हम उन्हें एक मिनट के भीतर 3 बदलाव करने की अनुमति देते हैं। इससे किसी भी अनदेखे स्पैम को कम करने में मदद मिलेगी। @/pages/github/hook/issue.jsconst rateLimiter = ratelimit(3, "60 s");
if (rateLimiter) {
const result = await rateLimiter.limit(context.sender.login);
limit = result.limit;
remaining = result.remaining;
if (!result.success) {
return {
headers: {
"X-RateLimit-Limit": limit,
"X-RateLimit-Remaining": remaining,
},
body: JSON.stringify({
message:
"Too many updates in 1 minute. Please try again in a few minutes.",
}),
};
}
}
सभी उपयोगकर्ता प्रोफ़ाइलों के लिए किनारे पर बासी-समय-पुनर्वैधीकरण लागू करना
<पी> निम्नलिखित कोड बताता है कि कैश हिट दरों को बेहतर बनाने के लिए स्टेल व्हाइल रिवैलिडेट की अवधारणा का उपयोग कैसे करें। कोड में (routes.js में) ), router.match फ़ंक्शन का उपयोग सभी उपयोगकर्ता प्रोफ़ाइल (जो /me/ से शुरू होती हैं) से मिलान करने के लिए किया जाता है .कैश विधि के अंदर, हम ब्राउज़र में पेज को कैशिंग से रोकते हैं और केवल एज कैशिंग को सक्षम करते हैं ताकि उपयोगकर्ताओं को हमेशा तेजी से और नवीनतम सामग्री के साथ सेवा प्रदान की जा सके। एज विकल्प maxAgeSeconds: 1 पर सेट है यह सुनिश्चित करने के लिए कि डेटा केवल एक सेकंड के लिए कैश किया गया है। staleWhileRevalidateSeconds कैश को ताज़ा करते समय डेटा को सीधे कैश से परोसने की अनुमति देने के लिए विकल्प को एक वर्ष के लिए सेट किया गया है। रूट.जेएस// User path(s)
router.match("/me/:path", ({ cache, removeUpstreamResponseHeader }) => {
// Remove the cache-control header from Astro's standalone server
removeUpstreamResponseHeader("cache-control");
// Disable in browser caching, and use Edgio's edge to use SWR
cache({
edge: {
maxAgeSeconds: 1,
staleWhileRevalidateSeconds: 60 * 60 * 24 * 365,
},
browser: false,
});
});
<पी> स्टेल व्हाइल रिवैलिडेट का उपयोग करने से सर्वर पर लोड कम करके और उपयोगकर्ता को तेज़ प्रतिक्रियाएँ प्रदान करके ऐप के प्रदर्शन को बेहतर बनाने में मदद मिल सकती है। तुरंत गतिशील उपयोगकर्ता प्रोफ़ाइल बनाना
<पी> एस्ट्रो डायनामिक रूट सेट करना बहुत आसान बनाता है। ऐप में, आपको src/pages/me/[slug].astro मिलेगा , जो /me/ से शुरू होने वाले पेजों को मैप करता है उदाहरणों में /me/rishi-raj-jain शामिल हैं और /me/some-other-user . उपयोगकर्ता प्रोफ़ाइल प्राप्त की जा रही है
<पी> हम slug का उपयोग करके वर्तमान उपयोगकर्ता के लिए डेटा प्राप्त करते हैं क्वेरी पैरामीटर एस्ट्रो पैराम्स से निकाला गया है, और सभी संबंधित उपयोगकर्ता डेटा प्राप्त करने के लिए getUserInfo फ़ंक्शन (जैसा कि ऊपर वर्णित है) को कॉल करें। नहीं मिलने या कोई त्रुटि होने की स्थिति में, हम विज़िटर को 404 पर रीडायरेक्ट करते हैं। src/pages/me/[slug].astroimport { getUserInfo } from "@/lib/Upstash/users";
// Extract slug query
const { slug } = Astro.params;
// Get data from Upstash using the getUserInfo function
const {
name: userName,
image: userImage,
links = [],
socials = [],
about = "",
og = {},
background = {},
code = 1,
} = await getUserInfo(userSlug);
// In case the code: 0 is recevied, redirect to a 404
if (code === 0) {
return Astro.redirect("/404");
}
सीएलआई से परिनियोजन
<पी> आप अपने ऐप का प्रोडक्शन बिल्ड कर सकते हैं और इसका उपयोग करके स्थानीय स्तर पर परीक्षण कर सकते हैं: yarn run edgio:build && yarn run edgio:production
<पी> तैनाती के लिए एजियो पर एक खाते की आवश्यकता है। यहां मुफ़्त में साइन अप करें। एक बार जब आपके पास एक खाता हो, तो आप अपने प्रोजेक्ट के रूट फ़ोल्डर में निम्नलिखित कमांड चलाकर एडजियो पर तैनात कर सकते हैं: yarn run edgio:deploy
<पी> अब हमारी तैनाती पूरी हो गई है! हाँ, बस इतना ही था. निष्कर्ष
<पी> अंत में, इस परियोजना ने ग्रैन्युलर रेट लिमिटिंग को लागू करने, सर्वर रहित में सीआरयूडी डेटा संचालन, सीएमएस के रूप में गिटहब मुद्दों का उपयोग करने और आपकी ज़रूरत के अनुरूप सेवा, यानी अपस्टैश का उपयोग करके एमवीपी शिप करने का बेहतर निर्णय लेने में मूल्यवान अनुभव प्रदान किया है।