LinkBreeze को VPS पर Docker Compose से कैसे होस्ट करें
LinkBreeze को VPS पर Docker Compose और Caddy के साथ सेटअप करें। इस गाइड में पिन किए गए इमेज टैग्स, कुकी-रहित क्लिक ट्रैकिंग और SQLite डेटा वॉल्यूम को मैनेज करने का तरीका जानें।
LinkBreeze क्या है
LinkBreeze एक self-hosted Linktree विकल्प है: यह एक Docker container है जो एक public link-in-bio पेज और एक admin dashboard प्रदान करता है, जिसमें सारा डेटा एक ही SQLite फाइल में रहता है। यह MIT licensed है, TypeScript में Next.js का उपयोग करके लिखा गया है, और ghcr.io/manak-hash/linkbreeze के रूप में प्रकाशित है। इसे चलाने के लिए आपको एक VPS, एक domain जिसमें VPS की ओर इशारा करता हुआ A record हो, 80 और 443 ports खुले होने चाहिए, और Compose plugin के साथ Docker Engine की आवश्यकता है।
यह गाइड उस deployment को कवर करती है जिसका repository वास्तव में समर्थन करती है: एक reverse proxy के पीछे Docker Compose, जो अपने स्वयं के certificates प्राप्त करता है। यह उन समस्याओं को भी कवर करती है जो आ सकती हैं, क्योंकि link-in-bio एक public URL है जिस पर अन्य लोग क्लिक करते हैं, और एक broken link का मतलब है कि आप क्लिक खो देंगे।
इन सबसे पहले, यह स्पष्ट रहें कि यह project कितना नया है।
क्या LinkBreeze सार्वजनिक प्रोफाइल लिंक के लिए पर्याप्त रूप से परिपक्व है?
अगस्त 2026 तक, रिपॉजिटरी में 178 स्टार, 17 फोर्क और केवल एक मेंटेनर है। पहला टैग किया गया रिलीज, v1.0.0, 1 जुलाई 2026 का है। यह प्रोजेक्ट कुछ हफ्ते पुराना है, न कि कुछ साल।
The data behind this chart
[
{
"week": "2026-06-29",
"releases": 3,
"cumulative": 3
},
{
"week": "2026-07-06",
"releases": 3,
"cumulative": 6
},
{
"week": "2026-07-13",
"releases": 1,
"cumulative": 7
},
{
"week": "2026-07-20",
"releases": 2,
"cumulative": 9
},
{
"week": "2026-07-27",
"releases": 3,
"cumulative": 12
},
{
"week": "2026-08-03",
"releases": 2,
"cumulative": 14
},
{
"week": "2026-08-10",
"releases": 3,
"cumulative": 17
}
]v1.0.0 के बाद से, प्रोजेक्ट ने 17 टैग किए गए रिलीज को 7 कैलेंडर सप्ताहों में जारी किया है। उस चार्ट का अंतिम सप्ताह तब भी चल रहा था जब यह गाइड लिखी गई थी और उसमें पहले से ही 3 रिलीज हो चुके थे।
इसे दो अलग-अलग तथ्यों के रूप में देखें। मेंटेनर सक्रिय है और बग्स को कुछ दिनों के भीतर ठीक कर दिया जाता है। स्कीमा और डिफॉल्ट सेटिंग्स अभी भी बदल रही हैं, इसलिए यदि आप कोई इंस्टेंस डिप्लॉय करके उसे भूल जाते हैं, तो वह लिखे जा रहे कोड से काफी अलग हो जाएगा।
लाइसेंस आपको सबसे खराब स्थिति से बचाता है। MIT लाइसेंस के साथ-साथ एक कंटेनर इमेज और आपकी अपनी डिस्क पर एक SQLite फाइल का मतलब है कि यदि डेवलपमेंट रुक भी जाता है, तो जो आपके पास है वह चलता रहेगा। यह आपको उस सार्वजनिक वेब ऐप से नहीं बचाता है जिसे सुरक्षा अपडेट मिलना बंद हो जाते हैं, जो समय के साथ एक जोखिम बन जाता है। इसे ऐसी चीज के रूप में डिप्लॉय करें जिसे आप अपडेट करते रहेंगे, और नीचे दी गई बैकअप प्रक्रिया को पहले दिन से ही चालू रखें।
इमेज टैग को पिन करें, और latest का उपयोग न करें
रिलीज़ वर्कफ़्लो प्रति वर्ज़न सटीक रूप से दो टैग पुश करता है: latest, और v को हटाकर वर्ज़न नंबर। इसलिए v1.2.7 रिलीज़ के लिए पिन किया गया टैग ghcr.io/manak-hash/linkbreeze:1.2.7 है। :v1.2.7 लिखने पर कुछ भी पुल नहीं होता है और Docker manifest unknown रिपोर्ट करता है, क्योंकि वह टैग कभी पुश ही नहीं किया गया था।
इसे पिन करें क्योंकि latest बदलता रहता है। ऊपर दिए गए चार्ट की गति के अनुसार, latest के विरुद्ध docker compose pull आपके दर्शकों द्वारा उपयोग किए जा रहे पेज का एक अनरिव्यूड अपग्रेड है। पिन किए गए टैग के साथ, अपग्रेड तब होता है जब आप फ़ाइल को एडिट करते हैं।
इमेज के बारे में एक और बात। रिलीज़ वर्कफ़्लो बिना किसी platforms: सेटिंग के बिल्ड होता है, इसलिए पब्लिश की गई इमेज केवल linux/amd64 है। arm64 होस्ट पर पुल no matching manifest for linux/arm64/v8 in the manifest list entries के साथ विफल हो जाता है। यदि आप x86 के बजाय ARM VPS पर रन कर रहे हैं, तो इमेज को बॉक्स पर ही बिल्ड करें:
git clone --branch v1.2.7 --depth 1 https://github.com/Manak-hash/LinkBreeze.git
cd LinkBreeze
docker build -t linkbreeze:1.2.7 .फिर नीचे दी गई compose फ़ाइल में इमेज नाम के रूप में linkbreeze:1.2.7 का उपयोग करें।
Caddy के पीछे LinkBreeze को automatic TLS के साथ तैनात करना
Caddy स्वयं Let's Encrypt से certificates का अनुरोध और नवीनीकरण (renew) करता है, इसलिए TLS (transport layer security) के लिए किसी अलग certificate चरण की आवश्यकता नहीं है। पूरी तैनाती एक ही निर्देशिका (directory) में तीन फाइलों द्वारा पूरी हो जाती है।
सबसे पहले secret जनरेट करें:
mkdir -p ~/linkbreeze && cd ~/linkbreeze
printf 'SECRET_KEY=%s\n' "$(openssl rand -hex 32)" > .env
chmod 600 .envSECRET_KEY एडमिन सेशन कुकी को साइन करता है और एनालिटिक्स विज़िटर हैश को साल्ट (salt) करता है। रिपॉजिटरी में प्रकाशित compose फाइल में यह डिफ़ॉल्ट रूप से ${SECRET_KEY:-changeme-in-production} पर सेट होता है, इसलिए यदि आप इस चरण को छोड़ देते हैं, तो आपका इंस्टेंस एक ऐसे सेशन साइनिंग की (key) के साथ चलेगा जो GitHub पर सार्वजनिक रूप से उपलब्ध है। इसे पहली बार स्टार्ट करने से पहले सेट करें, क्योंकि बाद में इसे बदलने पर आप लॉग आउट हो जाएंगे और एनालिटिक्स साल्ट रीसेट हो जाएगा।
docker-compose.yml लिखें:
services:
linkbreeze:
image: ghcr.io/manak-hash/linkbreeze:1.2.7
restart: unless-stopped
volumes:
- linkbreeze-data:/app/data
environment:
- DATABASE_PATH=/app/data/linkbreeze.db
- SECRET_KEY=${SECRET_KEY}
- BASE_URL=https://links.example.com
networks:
- linkbreeze-net
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
- caddy-config:/config
networks:
- linkbreeze-net
networks:
linkbreeze-net:
volumes:
linkbreeze-data:
caddy-data:
caddy-config:BASE_URL वैकल्पिक है लेकिन इसे सेट करना उचित है: यह ऐप को उसका वास्तविक सार्वजनिक पता बताता है, ताकि यदि कोई अनुरोध जाली Host हेडर के साथ आता है, तो ऐप किसी और के डोमेन के लिंक जनरेट न कर सके।
इसके बगल में अपना डोमेन डालकर Caddyfile लिखें:
links.example.com {
encode zstd gzip
reverse_proxy linkbreeze:3000
}Caddy डिफ़ॉल्ट रूप से प्रॉक्सी किए गए अनुरोधों पर X-Forwarded-For और X-Forwarded-Proto सेट करता है, जिस पर एनालिटिक्स निर्भर करता है। इसे अप करें:
docker compose up -d
docker compose ps
docker compose logs -f caddydocker compose ps में LinkBreeze कंटेनर healthy के रूप में दिखना चाहिए। इमेज अपना स्वयं का हेल्थचेक, wget --spider -q http://127.0.0.1:3000/api/health, साथ लेकर आती है, इसलिए आपको अलग से कुछ जोड़ने की आवश्यकता नहीं है। रिपॉजिटरी के Caddy उदाहरण से हेल्थचेक को कॉपी न करें: वह curl को कॉल करता है, और इमेज node:22-alpine पर बनी है, जिसमें busybox wget है और curl नहीं है। वह कंटेनर unhealthy रिपोर्ट करेगा जबकि पेज पूरी तरह से सही तरीके से सर्व हो रहे होंगे।
ब्राउज़र में https://links.example.com खोलें। पहली विजिट /setup पर सेटअप विज़ार्ड पर ले जाएगी, जो सिंगल एडमिन अकाउंट बनाता है। उसके बाद डैशबोर्ड /dashboard पर और लॉगिन फॉर्म /login पर उपलब्ध होगा। वह अकाउंट इस इंस्टेंस के लिए स्थानीय है और ऐप में कोई single sign-on हुक नहीं है, इसलिए यदि आप चाहते हैं कि डैशबोर्ड उसी लॉगिन से काम करे जिससे आप अन्य सेवाएं होस्ट करते हैं, तो इसके लिए आपको इसके सामने self-hosted Authentik जैसे forward auth प्रॉक्सी का उपयोग करना होगा।
ध्यान दें कि compose फाइल क्या नहीं करती है: यह कभी भी port 3000 को पब्लिश नहीं करती है। केवल Caddy सार्वजनिक इंटरफ़ेस पर लिसन करता है। यदि Compose फाइल सिंटैक्स आपके लिए नया है, तो Docker Compose basics for a VPS उन हिस्सों को कवर करता है जो यह फाइल मानकर चलती है, और यदि आप पहले से ही सामने कुछ और चला रहे हैं, तो Nginx, Caddy and Traefik compared बताता है कि क्या बदलाव करने होंगे। रिपॉजिटरी में Certbot के साथ Nginx, Traefik और Cloudflare टनल के लिए कार्यशील उदाहरण दिए गए हैं।
आपका डेटा कहाँ रहता है और बैकअप में क्या होना चाहिए
DATABASE_PATH, /app/data/linkbreeze.db की ओर इशारा करता है। अपलोड किए गए अवतार और लिंक थंबनेल इसके बगल में /app/data/uploads में लिखे जाते हैं। दोनों linkbreeze-data नामक वॉल्यूम में रहते हैं, इसलिए बैकअप की इकाई वॉल्यूम है, न कि केवल डेटाबेस फ़ाइल। यदि आप अपलोड निर्देशिका के बिना फ़ाइल को रिस्टोर करते हैं, तो पेज पर मौजूद हर इमेज 404 एरर दिखाएगी।
बाकी सब कुछ वास्तव में उसी एक डेटाबेस में होता है: पेज, लिंक, सेटिंग्स, थीम, ईमेल सब्सक्राइबर और एनालिटिक्स पंक्तियाँ।
कंटेनर को रोककर कॉपी लें:
docker compose stop linkbreeze
docker compose cp linkbreeze:/app/data ./backup-$(date +%F)
docker compose start linkbreezeपहले स्टॉप करें क्योंकि SQLite डेटाबेस को तब कॉपी करने से जब कोई प्रोसेस उसमें लिख रही हो, एक अधूरा ट्रांजेक्शन कैप्चर हो सकता है, और कॉपी एक करप्ट फ़ाइल के रूप में खुलती है। कॉपी चलने के दौरान पेज ऑफलाइन रहता है। रिस्टोर करना इसी प्रक्रिया का उल्टा रूप है:
docker compose stop linkbreeze
docker compose cp ./backup-2026-08-14/. linkbreeze:/app/data
docker compose start linkbreeze
docker compose logs -f linkbreezeडैशबोर्ड एक JSON एक्सपोर्ट भी प्रदान करता है, जो /api/backup से linkbreeze-backup-YYYY-MM-DD.json के रूप में सर्व किया जाता है। इसमें प्रोफाइल, लिंक, सेटिंग्स और सेव की गई थीम होती हैं। इसमें एनालिटिक्स हिस्ट्री, ईमेल सब्सक्राइबर या अपलोड की गई इमेज नहीं होती हैं, और इसे रिस्टोर करने से उन चार टेबल में मौजूद वर्तमान पंक्तियाँ डिलीट हो जाती हैं और फ़ाइल का डेटा इंसर्ट हो जाता है। इसे होस्ट बदलने या एडिटिंग की गलती को सुधारने के लिए एक कॉन्फ़िगरेशन स्नैपशॉट के रूप में उपयोग करें। वॉल्यूम कॉपी ही वास्तविक बैकअप है।
यहाँ स्टोरेज के दो नियम वैसे ही लागू होते हैं जैसे कहीं और VPS पर प्रोडक्शन में SQLite चलाने के मामले में होते हैं। डेटाबेस को लोकल डिस्क पर रखें, क्योंकि नेटवर्क फाइलसिस्टम पर SQLite की लॉकिंग अविश्वसनीय है और इसका पता आपको एक करप्ट पेज के रूप में चलता है। और यदि आप नेम्ड वॉल्यूम को होस्ट बाइंड माउंट से बदलते हैं, तो पहले होस्ट डायरेक्टरी को chown करें: कंटेनर नॉन-रूट node यूजर के रूप में चलता है, जिसका uid node:22-alpine में 1000 है, और रूट द्वारा बनाई गई डायरेक्टरी में यह लिख नहीं सकता, इसलिए ऐप डेटाबेस को ओपन नहीं कर पाता और कंटेनर स्टार्टअप पर ही बंद हो जाता है। Compose में नेम्ड वॉल्यूम बनाम बाइंड माउंट इस अंतर को विस्तार से कवर करता है।
एनालिटिक्स, और जिस consent banner की आपको आवश्यकता नहीं है
यह वह फीचर है जो उस पेज को self-host करने को उचित ठहराता है जिसे आप कहीं और मुफ्त में प्राप्त कर सकते थे।
ये एनालिटिक्स cookieless हैं। आगंतुक के लिए कोई cookie set नहीं की जाती है और public page पर कोई third-party script load नहीं होती है। आगंतुक की पहचान IP address, user agent string और एक salt के SHA-256 hash द्वारा की जाती है, जिसे 16 hexadecimal characters तक truncate किया जाता है। salt स्वयं वर्तमान UTC date और आपके SECRET_KEY का एक hash है, इसलिए यह midnight UTC पर बदल जाता है और कल के hashes का मिलान आज के hashes से नहीं किया जा सकता है। raw IP address को कभी भी database में नहीं लिखा जाता है।
Clicks की गणना server पर की जाती है। public page पर प्रत्येक http link आपके अपने domain पर /go/<id> की ओर इशारा करता है, जो click को record करता है और फिर वास्तविक destination पर 302 redirect के साथ उत्तर देता है। इसलिए, counting उन पाठकों के लिए भी काम करती है जिन्होंने JavaScript disable कर रखा है, और उन in-app browsers के अंदर भी जो background requests को block करते हैं। Page views को /api/track के माध्यम से record किया जाता है।
दो अपवाद जानने योग्य हैं। एक valid admin session वाली request को छोड़ दिया जाता है, इसलिए अपने स्वयं के पेज को edit करने से संख्या नहीं बढ़ती है। ज्ञात crawler user agents को भी छोड़ दिया जाता है।
Consent के बारे में: पाठक के device पर कुछ भी store नहीं किया जाता है, और पाठक के device पर store की गई cookie ही वह विशिष्ट चीज़ है जिसके लिए cookie banner अनुमति मांगता है। आपके दायित्व अभी भी इस बात पर निर्भर करते हैं कि आपके पाठक कहाँ रहते हैं, इसलिए उनकी जाँच करें, लेकिन यहाँ disclose करने के लिए कोई tracking cookie नहीं है और कोई third party data प्राप्त नहीं कर रही है।
एक चेतावनी जो लोगों को आश्चर्यचकित करती है: SECRET_KEY को rotate करें और daily salt इसके साथ बदल जाता है, इसलिए उस क्षण से प्रत्येक returning visitor को नया गिना जाता है।
Analytics में country column खाली क्यों है?
इसका कारण यह है कि आपके stack में कोई भी चीज़ country header सेट नहीं करती है। LinkBreeze देश की पहचान cf-ipcountry और x-vercel-ip-country जैसे proxy headers से करता है। आपके अपने Caddy या Nginx के पीछे स्थित VPS पर, इनमें से कोई भी header मौजूद नहीं होता है, इसलिए देश को null के रूप में रिकॉर्ड किया जाता है और breakdown खाली रहता है। container के अंदर कोई GeoIP database नहीं है।
इसे भरने के दो तरीके हैं। domain के सामने Cloudflare लगाएँ, जो हर proxy की गई request में cf-ipcountry जोड़ देता है। या फिर अपने reverse proxy में local GeoIP lookup का उपयोग करके इनमें से कोई एक header सेट करें।
इससे संबंधित एक और बड़ी समस्या है, इसलिए उसे जाँच लें। click और view handlers सबसे पहले client address को X-Forwarded-For से पढ़ते हैं, फिर X-Real-IP से, और यदि कोई भी header मौजूद न हो तो 0.0.0.0 पर वापस आ जाते हैं। यदि आप बिना किसी proxy के port 3000 को सीधे internet पर expose करते हैं, तो हर visitor एक ही value पर hash होगा। इसका मतलब है कि unique visitors हमेशा 1 ही दिखाएगा, और 60 events प्रति मिनट की per-IP rate limit आपके पूरे audience पर एक साथ लागू हो जाएगी। ऊपर दिए गए reverse_proxy directive के पीछे, Caddy आपके लिए header सेट कर देता है और दोनों समस्याएँ हल हो जाती हैं।
Linktree से इम्पोर्ट करना, और क्या ट्रांसफर नहीं होता है
डैशबोर्ड में मौजूद माइग्रेशन विज़ार्ड एक पब्लिक प्रोफाइल URL या एक्सपोर्ट की गई फ़ाइल को स्वीकार करता है। यह linktr.ee, bento.me, lnk.bio, tap.link, hopp.bio, beacons.ai, solo.to, linkfly, mssg.me और LittleLink पेजों के साथ-साथ सामान्य HTML और JSON एक्सपोर्ट को भी पहचानता है। Linktree या Bento URL के लिए, यह उन पेजों में एम्बेड किए गए __NEXT_DATA__ JSON को पढ़ता है। एक स्टेटिक पेज के लिए, यह एंकर टैग्स को पढ़ता है।
जो डेटा ट्रांसफर होता है, उसमें प्रत्येक लिंक का टाइटल, URL, विवरण और इमेज, लिंक सोशल प्रोफाइल है या नहीं, और आपका डिस्प्ले नेम, बायो और अवतार शामिल हैं। डेटाबेस में कुछ भी लिखने से पहले आप चुन सकते हैं कि पाए गए लिंक्स में से किसे रखना है।
जो डेटा ट्रांसफर नहीं होता है, उसमें एनालिटिक्स हिस्ट्री, थीम और लेआउट, ईमेल सब्सक्राइबर्स, शेड्यूल्ड पब्लिश डेट्स, और ऐसी कोई भी चीज़ शामिल है जिसे पुराना प्लेटफ़ॉर्म अपने लॉगिन के पीछे रखता है। लुक को मैन्युअल रूप से फिर से बनाने की योजना बनाएं, और यह स्वीकार करें कि पुरानी क्लिक हिस्ट्री पुरानी सर्विस पर ही रहेगी।
इम्पोर्टर आपके ब्राउज़र के बजाय आपके सर्वर से URL को फ़ेच करता है, इसलिए यह उन एड्रेस को अस्वीकार कर देता है जो पब्लिक नहीं हैं। Private/local URLs are not allowed का मतलब है कि आपने इसे अपने नेटवर्क के अंदर का कोई एड्रेस दिया है, और यह इनकार जानबूझकर किया गया है: इसके बिना, डैशबोर्ड एक्सेस वाला कोई भी व्यक्ति आपके सर्वर का उपयोग उन मशीनों को जांचने के लिए कर सकता है जिन तक केवल आपका सर्वर पहुंच सकता है। अन्य मैसेज जो आप देख सकते हैं, वे Only http and https URLs are allowed, Request timed out और Response too large हैं।
स्क्रैपिंग किसी और के मार्कअप पर निर्भर करती है। यदि विज़ार्ड को किसी ऐसे पेज पर कुछ नहीं मिलता है जिसमें स्पष्ट रूप से लिंक्स हैं, तो इसका मतलब है कि पार्सर लिखे जाने के बाद से उस प्लेटफ़ॉर्म ने अपना HTML बदल दिया है। किसी सुधार की प्रतीक्षा करने के बजाय लिंक्स को मैन्युअल रूप से जोड़ें। यदि आप वास्तव में एक प्रोफाइल पेज के बजाय मापने योग्य शॉर्ट लिंक्स चाहते हैं, तो Shlink जैसा एक self-hosted URL shortener यह काम करता है और उसी बॉक्स पर आसानी से चलता है।
Pinned deployment को अपडेट करना
# edit the image tag in docker-compose.yml, then
docker compose pull
docker compose up -d
docker compose logs -f linkbreezeकंटेनर स्टार्ट होने पर schema migrations अपने आप चल जाते हैं। इन्हें वापस पुरानी स्थिति में लाने (reverse) का कोई दस्तावेजी तरीका नहीं है, इसलिए पहले volume की एक कॉपी ले लें। जिस अपग्रेड को आप वापस नहीं बदल सकते, वह तभी सुरक्षित है जब आप उससे पहले की स्थिति को restore कर सकें।
जब कोई नया release उपलब्ध होता है, तो डैशबोर्ड पर एक बैनर दिखाई देता है। यह हर 24 घंटे में एक बार प्रोजेक्ट की GitHub रिपॉजिटरी से एक छोटी version फाइल को fetch करके जाँच करता है, और यह आपके इंस्टेंस के बारे में कोई जानकारी नहीं भेजता है। टैग बदलने से पहले release notes जरूर पढ़ें, क्योंकि प्रोजेक्ट के इस चरण में एक minor version उन defaults को बदल सकता है जिन पर आप निर्भर हैं।
विफलता के प्रकार और वे संदेश जो आपको दिखाई देंगे
manifest unknown पुल (pull) करते समय। टैग को :v1.2.7 के रूप में लिखा गया था। रजिस्ट्री टैग में कोई v नहीं होता है, इसलिए :1.2.7 का उपयोग करें।
no matching manifest for linux/arm64/v8 in the manifest list entries। प्रकाशित इमेज केवल amd64 के लिए है। इसे टैग किए गए सोर्स से ARM होस्ट पर बिल्ड करें।
कंटेनर unhealthy रिपोर्ट करता है जबकि पेज ठीक से लोड हो रहा है। आपकी compose फाइल में एक हेल्थचेक curl को कॉल कर रहा है, जो इमेज में मौजूद नहीं है। इसे हटा दें और इमेज के अपने wget हेल्थचेक को चलने दें।
Caddy सर्टिफिकेट एरर दिखाता है, या कुछ भी नहीं दिखाता। docker compose logs caddy की जाँच करें। इसके सामान्य कारण यह हैं कि A रिकॉर्ड अभी तक इस VPS पर पॉइंट नहीं कर रहा है, या फायरवॉल पर पोर्ट 80 बंद है, जो ACME (ऑटोमैटिक सर्टिफिकेट मैनेजमेंट एनवायरनमेंट) HTTP चैलेंज को ब्लॉक करता है जिसका उपयोग Caddy यह साबित करने के लिए करता है कि उसका डोमेन पर नियंत्रण है।
यूनिक विजिटर्स की संख्या 1 पर अटकी हुई है। कोई भी प्रॉक्सी X-Forwarded-For सेट नहीं कर रहा है, इसलिए हर विजिटर का हैश एक जैसा बन रहा है।
कंटेनर स्टार्टअप के तुरंत बाद बंद हो जाता है, जबकि कल यह काम कर रहा था। यदि आप नेम्ड वॉल्यूम से होस्ट बाइंड माउंट पर शिफ्ट हुए हैं, तो डेटा डायरेक्टरी का मालिक root है और ऐप uid 1000 के रूप में चलता है, इसलिए यह डेटाबेस फाइल को नहीं खोल सकता। होस्ट डायरेक्टरी को sudo chown -R 1000:1000 करें।
ट्रैकिंग रिक्वेस्ट का उत्तर HTTP 429 के साथ दिया जा रहा है। /api/track और /go/<id> पर प्रति-IP थ्रॉटल सीमा पार हो गई है। विजिटर्स को अभी भी उनके गंतव्य पर रीडायरेक्ट किया जा रहा है, बस क्लिक की गिनती नहीं हो रही है।
FAQ
क्या LinkBreeze सार्वजनिक link in bio के लिए तैयार है?
यह एक नया प्रोजेक्ट है। अगस्त 2026 तक, रिपॉजिटरी में 178 stars, 17 forks और एक maintainer हैं, और पहला release 1 जुलाई 2026 को आया था। Releases औसतन सप्ताह में दो बार से अधिक आते हैं, इसलिए bugs जल्दी ठीक हो जाते हैं और व्यवहार भी तेजी से बदलता है। MIT license और local SQLite file का मतलब है कि यदि development रुक भी जाए, तो भी आपका page काम करता रहेगा, लेकिन security fixes के बिना कोई भी सार्वजनिक web app एक जोखिम बन जाता है। इसलिए इसे ऐसे software के रूप में देखें जिसे आपको लगातार update करते रहना होगा, न कि एक बार install करके छोड़ देना होगा।
मुझे कौन सा LinkBreeze image tag चलाना चाहिए?
version tag चलाएं, उदाहरण के लिए ghcr.io/manak-hash/linkbreeze:1.2.7, और इसे सोच-समझकर बदलें। release workflow केवल latest और bare version number को ही push करता है, इसलिए :v1.2.7 के साथ v मौजूद नहीं है और Docker manifest unknown का उत्तर देता है। यह image केवल linux/amd64 के लिए बनी है, इसलिए arm64 VPS पर आपको tag को clone करके स्थानीय रूप से build करना होगा।
LinkBreeze analytics में देश का विवरण (country breakdown) खाली क्यों रहता है?
LinkBreeze आगंतुक के देश को cf-ipcountry या x-vercel-ip-country जैसे proxy headers से पढ़ता है, और इसमें अपना कोई GeoIP database नहीं है। आपके अपने Caddy या Nginx के पीछे स्थित VPS इनमें से कोई भी header set नहीं करता है, इसलिए देश को null के रूप में store किया जाता है। domain के सामने Cloudflare लगाएँ, या अपने reverse proxy को local GeoIP lookup से उन headers में से एक set करने के लिए कहें।
मुझे वास्तव में किसका बैकअप लेना चाहिए, और इसे कैसे restore करें?
केवल database file का नहीं, बल्कि पूरे linkbreeze-data volume का backup लें। /app/data/linkbreeze.db में प्रत्येक link, page, setting, subscriber और analytics row होती है, और /app/data/uploads में वे avatar और thumbnail images होती हैं जिन्हें page reference करता है। container को stop करें, docker compose cp linkbreeze:/app/data ./backup-$(date +%F) चलाएं, और फिर इसे दोबारा start करें। restore करने के लिए directory को वापस stopped container में copy करें और उसे start करें। dashboard से JSON export केवल profile, links, settings और themes का एक config snapshot है, और इसमें कोई analytics या images नहीं होती हैं।
क्या Linktree से import करने पर मेरा analytics और theme साथ आता है?
नहीं। migration wizard आपके पुराने सार्वजनिक profile से link titles, URLs, descriptions और images को पढ़ता है, साथ ही आपका display name, bio और avatar भी। analytics history, theme, email subscribers और scheduled publish dates वहीं रह जाते हैं। import के बाद theme editor में look को दोबारा बनाएं, और यह उम्मीद रखें कि click history पुराने platform पर ही रहेगी।