LinkBreezeను సొంతంగా హోస్ట్ చేయడం ఎలా?
Docker Compose మరియు Caddy ఉపయోగించి LinkBreezeను మీ VPSలో సెటప్ చేయండి. కుకీలు లేని ట్రాకింగ్, ఒకే SQLite వాల్యూమ్ మరియు ఇమేజ్ ట్యాగ్ పిన్నింగ్ వంటి కీలక అంశాల గురించి తెలుసుకోండి.
LinkBreeze అంటే ఏమిటి
LinkBreeze అనేది self-hosted Linktree ప్రత్యామ్నాయం: ఇది ఒకే Docker container ద్వారా పబ్లిక్ link-in-bio పేజీని మరియు అడ్మిన్ డాష్బోర్డ్ను అందిస్తుంది. దీనికి సంబంధించిన మొత్తం సమాచారం ఒకే SQLite ఫైల్లో నిక్షిప్తమై ఉంటుంది. ఇది MIT లైసెన్స్తో, TypeScript మరియు Next.js ఉపయోగించి రూపొందించబడింది మరియు ghcr.io/manak-hash/linkbreeze గా ప్రచురించబడింది. దీన్ని రన్ చేయడానికి మీకు ఒక VPS, ఆ VPSకి పాయింట్ చేసే A record కలిగిన డొమైన్, 80 మరియు 443 పోర్ట్లు ఓపెన్ అయి ఉండటం, మరియు Docker Engine తో పాటు Compose ప్లగ్ఇన్ అవసరం.
ఈ గైడ్ రిపోజిటరీ అధికారికంగా మద్దతు ఇచ్చే డిప్లాయ్మెంట్ విధానాన్ని వివరిస్తుంది: అంటే సొంతంగా certificates పొందే reverse proxy వెనుక Docker Compose ను ఉపయోగించడం. ఇది దేనివల్ల సమస్యలు రావచ్చు అనే అంశాలను కూడా చర్చిస్తుంది, ఎందుకంటే link-in-bio అనేది ఇతరులు క్లిక్ చేసే పబ్లిక్ URL, అది పనిచేయకపోతే మీ క్లిక్ వృథా అవుతుంది.
వీటన్నింటికంటే ముందు, ఈ ప్రాజెక్ట్ ఎంత కొత్తదో గమనించండి.
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 ఫైల్ ఉండటం వల్ల, ఒకవేళ డెవలప్మెంట్ ఆగిపోయినా, మీ వద్ద ఉన్నది పని చేస్తూనే ఉంటుంది. అయితే, సెక్యూరిటీ అప్డేట్లు అందడం ఆగిపోయిన పబ్లిక్-ఫేసింగ్ వెబ్ యాప్ కాలక్రమేణా ఒక బాధ్యతగా (liability) మారుతుంది, దీని నుండి లైసెన్స్ మిమ్మల్ని రక్షించదు. మీరు ఎప్పటికప్పుడు అప్డేట్ చేస్తూ ఉండే ప్రాజెక్ట్గా దీనిని పరిగణించండి మరియు మొదటి రోజు నుండే కింద పేర్కొన్న బ్యాకప్ విధానాన్ని అమలులో ఉంచండి.
ఇమేజ్ ట్యాగ్ను పిన్ చేయండి, 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ని ఆటోమేటిక్ TLSతో డిప్లాయ్ చేయడం
Caddy స్వయంగా Let's Encrypt నుండి సర్టిఫికేట్లను అభ్యర్థించి, రెన్యూ చేస్తుంది. కాబట్టి TLS (transport layer security) కోసం ప్రత్యేకంగా సర్టిఫికేట్ సెటప్ చేయాల్సిన అవసరం లేదు. ఈ మొత్తం డిప్లాయ్మెంట్ ఒకే డైరెక్టరీలోని మూడు ఫైళ్లతో పూర్తవుతుంది.
ముందుగా సీక్రెట్ను జనరేట్ చేయండి:
mkdir -p ~/linkbreeze && cd ~/linkbreeze
printf 'SECRET_KEY=%s\n' "$(openssl rand -hex 32)" > .env
chmod 600 .envSECRET_KEY అనేది అడ్మిన్ సెషన్ కుకీని సైన్ చేస్తుంది మరియు అనలిటిక్స్ విజిటర్ హ్యాష్కు సాల్ట్ను జోడిస్తుంది. రిపోజిటరీలో ఉన్న compose ఫైల్ డిఫాల్ట్గా ${SECRET_KEY:-changeme-in-production}ని ఉపయోగిస్తుంది. కాబట్టి, ఈ దశను దాటవేస్తే, 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 వద్ద ఉంటాయి. ఆ అకౌంట్ ఈ ఇన్స్టాన్స్కు మాత్రమే పరిమితం మరియు అప్లికేషన్లో సింగిల్ సైన్-ఆన్ హుక్ లేదు. కాబట్టి, మీరు హోస్ట్ చేసే ఇతర సేవలతో పాటు దీనికి కూడా ఒకే లాగిన్ ఉండాలంటే, self-hosted Authentik వంటి ఫార్వర్డ్ ఆథ్ ప్రాక్సీని ముందుగా అమర్చాలి.
Compose ఫైల్ ఏమి చేయదో గమనించండి: ఇది ఎప్పుడూ 3000 పోర్ట్ను పబ్లిక్ చేయదు. కేవలం Caddy మాత్రమే పబ్లిక్ ఇంటర్ఫేస్పై వింటుంది (listen). Compose ఫైల్ సింటాక్స్ మీకు కొత్త అయితే, Docker Compose basics for a VPS ఈ ఫైల్ ఆశించే అంశాలను వివరిస్తుంది. ఒకవేళ మీరు ఇప్పటికే వేరే దేన్నైనా ముందు రన్ చేస్తుంటే, Nginx, Caddy and Traefik compared ఏ మార్పులు చేయాలో వివరిస్తుంది. ఈ రిపోజిటరీ Nginx with Certbot, Traefik మరియు Cloudflare tunnel కోసం పని చేసే ఉదాహరణలను అందిస్తుంది.
మీ డేటా ఎక్కడ ఉంటుంది మరియు బ్యాకప్లో ఏముండాలి
DATABASE_PATH అనేది /app/data/linkbreeze.db ని సూచిస్తుంది. అప్లోడ్ చేసిన అవతార్లు మరియు లింక్ థంబ్నెయిల్లు దాని పక్కనే /app/data/uploads లో వ్రాయబడతాయి. ఈ రెండూ linkbreeze-data అనే named volume లో ఉంటాయి, కాబట్టి బ్యాకప్ యూనిట్ అనేది కేవలం డేటాబేస్ ఫైల్ మాత్రమే కాదు, మొత్తం వాల్యూమ్. అప్లోడ్స్ డైరెక్టరీ లేకుండా కేవలం ఫైల్ను మాత్రమే రీస్టోర్ చేస్తే, పేజీలోని ప్రతి చిత్రం 404 ఎర్రర్ను చూపుతుంది.
మిగిలినవన్నీ ఆ ఒక్క డేటాబేస్లోనే ఉంటాయి: పేజీలు, లింకులు, సెట్టింగ్లు, థీమ్, ఇమెయిల్ సబ్స్క్రైబర్లు మరియు అనలిటిక్స్ వరుసలు.
కంటైనర్ను ఆపివేసిన తర్వాత కాపీని తీసుకోండి:
docker compose stop linkbreeze
docker compose cp linkbreeze:/app/data ./backup-$(date +%F)
docker compose start linkbreezeSQLite డేటాబేస్లో ప్రాసెస్ ఏదైనా వ్రాస్తున్నప్పుడు కాపీ చేస్తే, అది అసంపూర్ణమైన ట్రాన్సాక్షన్ను క్యాప్చర్ చేయవచ్చు, తద్వారా కాపీ చేయబడిన ఫైల్ పాడవుతుంది (corrupt). కాపీ జరుగుతున్నప్పుడు పేజీ ఆఫ్లైన్లో ఉంటుంది. రీస్టోర్ చేయడం కూడా దీనికి వ్యతిరేక పద్ధతిలో జరుగుతుంది:
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 లాకింగ్ నమ్మదగినది కాదు, అలా చేస్తే డేటాబేస్ పాడయ్యే అవకాశం ఉంది. ఒకవేళ మీరు named volume కు బదులుగా host bind mount ఉపయోగిస్తుంటే, ముందుగా హోస్ట్ డైరెక్టరీకి chown చేయండి: కంటైనర్ node అనే non-root యూజర్గా (node:22-alpine లో uid 1000) రన్ అవుతుంది. root ద్వారా సృష్టించబడిన డైరెక్టరీకి ఈ యూజర్కు వ్రాయడానికి అనుమతి ఉండదు, కాబట్టి యాప్ డేటాబేస్ను తెరవలేదు మరియు కంటైనర్ స్టార్టప్ సమయంలోనే ఆగిపోతుంది. Composeలో named volumes కు వ్యతిరేకంగా bind mounts ఈ అంశాన్ని పూర్తిగా వివరిస్తుంది.
అనలిటిక్స్ మరియు కన్సెంట్ బ్యానర్ మీకు అవసరం లేదు
వేరే చోట ఉచితంగా లభించే పేజీని మీరు సొంతంగా హోస్ట్ (self-hosting) చేసుకోవడానికి ఈ ఫీచర్ ఒక ప్రధాన కారణం.
ఈ అనలిటిక్స్ కుక్కీలను ఉపయోగించవు. సందర్శకుల కోసం ఎటువంటి కుక్కీ సెట్ చేయబడదు మరియు పబ్లిక్ పేజీలో ఎటువంటి థర్డ్-పార్టీ స్క్రిప్ట్ లోడ్ అవ్వదు. సందర్శకుడిని వారి IP అడ్రస్, యూజర్ ఏజెంట్ స్ట్రింగ్ మరియు ఒక సాల్ట్ (salt) ల SHA-256 హ్యాష్ ద్వారా గుర్తిస్తారు, దీనిని 16 హెక్సాడెసిమల్ క్యారెక్టర్లకు కుదించడం జరుగుతుంది. ఈ సాల్ట్ అనేది ప్రస్తుత UTC తేదీ మరియు మీ SECRET_KEY ల హ్యాష్, కాబట్టి ఇది ప్రతిరోజూ అర్ధరాత్రి UTCకి మారుతుంది. దీనివల్ల నిన్నటి హ్యాష్లను నేటి హ్యాష్లతో సరిపోల్చడం సాధ్యం కాదు. అసలైన IP అడ్రస్ డేటాబేస్లో ఎప్పటికీ నమోదు చేయబడదు.
క్లిక్లను సర్వర్ స్థాయిలో లెక్కిస్తారు. పబ్లిక్ పేజీలోని ప్రతి http లింక్ మీ సొంత డొమైన్లోని /go/<id> కి పాయింట్ అవుతుంది. ఇది క్లిక్ను రికార్డ్ చేసి, ఆపై అసలు గమ్యస్థానానికి 302 రీడైరెక్ట్ను పంపుతుంది. అందువల్ల, JavaScript నిలిపివేసిన పాఠకులకు మరియు బ్యాక్గ్రౌండ్ అభ్యర్థనలను బ్లాక్ చేసే ఇన్-యాప్ బ్రౌజర్లలో కూడా ఈ లెక్కింపు పనిచేస్తుంది. పేజీ వీక్షణలు /api/track ద్వారా రికార్డ్ చేయబడతాయి.
రెండు మినహాయింపులను గమనించాలి. చెల్లుబాటు అయ్యే అడ్మిన్ సెషన్ ఉన్న అభ్యర్థనలను విస్మరిస్తారు, కాబట్టి మీరు మీ పేజీని ఎడిట్ చేస్తున్నప్పుడు ఆ సంఖ్యలు పెరగవు. తెలిసిన క్రాలర్ యూజర్ ఏజెంట్లను కూడా విస్మరిస్తారు.
కన్సెంట్ విషయానికి వస్తే: పాఠకుడి పరికరంలో ఏదీ నిల్వ చేయబడదు. కుక్కీ బ్యానర్ అనేది పాఠకుడి పరికరంలో నిల్వ చేయబడే కుక్కీ కోసం అనుమతిని కోరుతుంది. మీ పాఠకులు ఎక్కడ నివసిస్తున్నారనే దానిపై మీ బాధ్యతలు ఆధారపడి ఉంటాయి, కాబట్టి వాటిని తనిఖీ చేయండి. అయితే, ఇక్కడ బహిర్గతం చేయడానికి ఎటువంటి ట్రాకింగ్ కుక్కీ లేదు మరియు డేటాను స్వీకరించే థర్డ్-పార్టీ ఎవరూ లేరు.
ప్రజలను ఆశ్చర్యపరిచే ఒక విషయం: మీరు SECRET_KEY ని మార్చినప్పుడు, దానితో పాటు రోజువారీ సాల్ట్ కూడా మారుతుంది. కాబట్టి, ఆ క్షణం నుండి తిరిగి వచ్చే ప్రతి సందర్శకుడిని కొత్త వ్యక్తిగా లెక్కిస్తారు.
అనలిటిక్స్ కంట్రీ కాలమ్ ఎందుకు ఖాళీగా ఉంది?
మీ స్టాక్లో ఏదీ కంట్రీ హెడర్ను సెట్ చేయకపోవడం వల్ల ఇలా జరుగుతుంది. LinkBreeze అనేది cf-ipcountry మరియు x-vercel-ip-country వంటి ప్రాక్సీ హెడర్ల నుండి దేశాన్ని గుర్తిస్తుంది. మీ స్వంత Caddy లేదా Nginx వెనుక ఉన్న VPSలో, అటువంటి హెడర్లు ఏవీ ఉండవు, కాబట్టి దేశం 'null'గా రికార్డ్ చేయబడుతుంది మరియు బ్రేక్డౌన్ ఖాళీగా ఉంటుంది. కంటైనర్ లోపల ఎటువంటి GeoIP డేటాబేస్ ఉండదు.
దీనిని పూరించడానికి రెండు మార్గాలు ఉన్నాయి. డొమైన్ ముందు Cloudflare ను ఉంచండి, ఇది ప్రాక్సీ చేసే ప్రతి అభ్యర్థనకు cf-ipcountry ను జోడిస్తుంది. లేదా లోకల్ GeoIP లుకప్ ద్వారా మీ స్వంత రివర్స్ ప్రాక్సీలో ఆ హెడర్లలో ఒకదానిని సెట్ చేయండి.
దీనికి సంబంధించిన మరొక సమస్య మరింత తీవ్రమైనది, కాబట్టి దానిని తనిఖీ చేయండి. క్లిక్ మరియు వ్యూ హ్యాండ్లర్లు క్లయింట్ అడ్రస్ను మొదట X-Forwarded-For నుండి, తర్వాత X-Real-IP నుండి చదువుతాయి, మరియు ఆ రెండు హెడర్లు లేనప్పుడు 0.0.0.0 కి మళ్లుతాయి. ప్రాక్సీ లేకుండా పోర్ట్ 3000 ను నేరుగా ఇంటర్నెట్కు పబ్లిష్ చేస్తే, ప్రతి సందర్శకుడి అడ్రస్ ఒకే విలువగా మారుతుంది. దీని అర్థం యూనిక్ విజిటర్స్ సంఖ్య ఎల్లప్పుడూ 1 గానే ఉంటుంది, మరియు నిమిషానికి 60 ఈవెంట్ల చొప్పున ఉండే పర్-IP రేట్ లిమిట్ మీ ప్రేక్షకులందరికీ ఒకేసారి వర్తిస్తుంది. పైన పేర్కొన్న reverse_proxy డైరెక్టివ్ వెనుక ఉంటే, Caddy మీ కోసం హెడర్ను సెట్ చేస్తుంది మరియు ఈ రెండు సమస్యలు తొలగిపోతాయి.
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ని చదువుతుంది. స్టాటిక్ పేజీ కోసం, ఇది యాంకర్ ట్యాగ్లను చదువుతుంది.
ప్రతి లింక్ యొక్క శీర్షిక (title), URL, వివరణ (description) మరియు చిత్రం, ఆ లింక్ సోషల్ ప్రొఫైలా కాదా అనే విషయం, మరియు మీ ప్రదర్శన పేరు (display name), బయో (bio) మరియు అవతార్ బదిలీ అవుతాయి. డేటాబేస్లో ఏదీ రాయకముందే, కనుగొనబడిన లింక్లలో వేటిని ఉంచుకోవాలో మీరు ఎంచుకోవచ్చు.
అనలిటిక్స్ హిస్టరీ, థీమ్ మరియు లేఅవుట్, ఈమెయిల్ సబ్స్క్రైబర్లు, షెడ్యూల్ చేసిన ప్రచురణ తేదీలు, మరియు పాత ప్లాట్ఫారమ్ తన లాగిన్ వెనుక దాచుకునే ఏ సమాచారం కూడా బదిలీ కాదు. రూపాన్ని (look) మాన్యువల్గా మళ్లీ నిర్మించుకోవాలని ప్లాన్ చేసుకోండి, మరియు పాత క్లిక్ హిస్టరీ పాత సర్వీసులోనే ఉండిపోతుందని గుర్తించండి.
ఇంపోర్టర్ మీ బ్రౌజర్ నుండి కాకుండా మీ సర్వర్ నుండి URLని తీసుకుంటుంది, కాబట్టి ఇది పబ్లిక్గా లేని అడ్రస్లను తిరస్కరిస్తుంది. Private/local URLs are not allowed అంటే మీరు మీ సొంత నెట్వర్క్లోని అడ్రస్ను ఇచ్చారని అర్థం, ఈ తిరస్కరణ ఉద్దేశపూర్వకంగానే జరుగుతుంది: ఇది లేకపోతే, డ్యాష్బోర్డ్ యాక్సెస్ ఉన్న ఎవరైనా మీ సర్వర్ ద్వారా కేవలం మీ సర్వర్కు మాత్రమే అందుబాటులో ఉండే మెషీన్లను పరిశీలించే అవకాశం ఉంటుంది. మీరు చూడగలిగే ఇతర సందేశాలు Only http and https URLs are allowed, Request timed out మరియు Response too large.
స్క్రాపింగ్ అనేది వేరొకరి మార్కప్ (markup) పై ఆధారపడి ఉంటుంది. స్పష్టంగా లింక్లు ఉన్న పేజీలో విజార్డ్ ఏమీ కనుగొనలేకపోతే, పార్సర్ రాసినప్పటి నుండి ఆ ప్లాట్ఫారమ్ తన 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 స్వయంచాలకంగా జరుగుతాయి. వీటిని వెనక్కి (backwards) రన్ చేయడానికి ఎటువంటి డాక్యుమెంట్ చేయబడిన మార్గం లేదు, కాబట్టి ముందుగా volume కాపీని తీసుకోండి. మీరు వెనక్కి తీసుకోలేని అప్గ్రేడ్, దానికి ముందు ఉన్న స్థితిని పునరుద్ధరించగలిగినప్పుడు మాత్రమే సురక్షితం.
కొత్త release అందుబాటులో ఉన్నప్పుడు dashboard ఒక banner ను చూపుతుంది. ఇది ప్రతి 24 గంటలకు ఒకసారి ప్రాజెక్ట్ యొక్క GitHub repository నుండి ఒక చిన్న version ఫైల్ను పొందడం ద్వారా తనిఖీ చేస్తుంది, మరియు ఇది మీ instance గురించి ఎటువంటి సమాచారాన్ని పంపదు. మీరు tag ను మార్చే ముందు release notes చదవండి, ఎందుకంటే ప్రాజెక్ట్ యొక్క ఈ దశలో minor version మీరు ఆధారపడే defaults ను మార్చవచ్చు.
వైఫల్య రీతులు మరియు మీకు కనిపించే స్ట్రింగ్స్
manifest unknown పుల్ చేస్తున్నప్పుడు. ట్యాగ్ను :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 మూసివేయబడి ఉండటం దీనికి కారణాలు. ఇది Caddy డొమైన్ను నియంత్రిస్తుందని నిరూపించుకోవడానికి ఉపయోగించే ACME (automatic certificate management environment) HTTP ఛాలెంజ్ను అడ్డుకుంటుంది.
Unique visitors సంఖ్య 1 వద్దే ఆగిపోయింది. ఏ ప్రాక్సీ కూడా X-Forwarded-Forని సెట్ చేయడం లేదు, కాబట్టి ప్రతి విజిటర్ ఒకేలా హ్యాష్ అవుతున్నారు.
నిన్న పనిచేసిన కంటైనర్, స్టార్టప్ అయిన వెంటనే ఆగిపోతోంది. మీరు named volume నుండి host bind mountకి మారినట్లయితే, డేటా డైరెక్టరీ root యాజమాన్యంలో ఉంటుంది మరియు యాప్ uid 1000గా రన్ అవుతుంది, కాబట్టి అది డేటాబేస్ ఫైల్ను తెరవలేదు. హోస్ట్ డైరెక్టరీని sudo chown -R 1000:1000 చేయండి.
ట్రాకింగ్ అభ్యర్థనలకు HTTP 429తో సమాధానం వస్తోంది. /api/track మరియు /go/<id>పై ఉన్న పర్-IP త్రోటిల్ పరిమితిని చేరుకుంది. విజిటర్లు ఇప్పటికీ వారి గమ్యస్థానానికి మళ్ళించబడతారు, కేవలం క్లిక్ మాత్రమే లెక్కించబడదు.
FAQ
LinkBreeze పబ్లిక్ 'link in bio' కోసం సిద్ధంగా ఉందా?
ఇది ఒక కొత్త ప్రాజెక్ట్. ఆగస్టు 2026 నాటికి, ఈ రిపోజిటరీకి 178 స్టార్లు, 17 ఫోర్కులు ఉన్నాయి మరియు ఒక మెయింటైనర్ మాత్రమే ఉన్నారు. దీని మొదటి release జూలై 1, 2026న జరిగింది. సగటున వారానికి రెండుసార్లు కంటే ఎక్కువ releases వస్తున్నాయి, కాబట్టి బగ్లు త్వరగా పరిష్కరించబడతాయి మరియు సాఫ్ట్వేర్ ప్రవర్తన కూడా వేగంగా మారుతుంటుంది. MIT license మరియు లోకల్ SQLite ఫైల్ ఉండటం వల్ల, ఒకవేళ డెవలప్మెంట్ ఆగిపోయినా మీరు మీ పేజీని వాడుకోగలరు. అయితే, security patches లేని పబ్లిక్ వెబ్ యాప్ ప్రమాదకరంగా మారవచ్చు, కాబట్టి దీన్ని ఒకసారి ఇన్స్టాల్ చేసి వదిలేసే సాఫ్ట్వేర్గా కాకుండా, నిరంతరం అప్డేట్ చేస్తూ ఉండాల్సిన సాఫ్ట్వేర్గా పరిగణించండి.
నేను ఏ LinkBreeze image tag ని రన్ చేయాలి?
ghcr.io/manak-hash/linkbreeze:1.2.7 వంటి version tag ని రన్ చేయండి మరియు దాన్ని కావాలనే మార్చండి. release workflow కేవలం latest మరియు ఖచ్చితమైన version నంబర్ను మాత్రమే పుష్ చేస్తుంది. కాబట్టి v తో ఉన్న :v1.2.7 ఉండదు, అప్పుడు Docker manifest unknown అని సమాధానం ఇస్తుంది. ఈ image కేవలం linux/amd64 కోసం మాత్రమే నిర్మించబడింది, కాబట్టి arm64 VPS లో మీరు tag ని క్లోన్ చేసి లోకల్గా build చేయాలి.
LinkBreeze analytics లో దేశాల వారీగా వివరాలు ఎందుకు ఖాళీగా ఉన్నాయి?
LinkBreeze సందర్శకుల దేశాన్ని cf-ipcountry లేదా x-vercel-ip-country వంటి proxy headers ద్వారా గుర్తిస్తుంది, దీనికి సొంతంగా GeoIP డేటాబేస్ లేదు. మీ Caddy లేదా Nginx వెనుక ఉన్న VPS అటువంటి headers ఏవీ సెట్ చేయదు, కాబట్టి దేశం వివరాలు null గా నిల్వ చేయబడతాయి. మీ డొమైన్ ముందు Cloudflare ని ఉంచండి లేదా మీ reverse proxy ద్వారా లోకల్ GeoIP lookup ఉపయోగించి ఆ headers లో ఒకదాన్ని సెట్ చేయండి.
నేను ఖచ్చితంగా దేనిని బ్యాకప్ చేయాలి మరియు దాన్ని ఎలా పునరుద్ధరించాలి?
కేవలం డేటాబేస్ ఫైల్ను మాత్రమే కాకుండా, మొత్తం linkbreeze-data వాల్యూమ్ను బ్యాకప్ చేయండి. /app/data/linkbreeze.db లో ప్రతి లింక్, పేజీ, సెట్టింగ్, సబ్స్క్రైబర్ మరియు అనలిటిక్స్ డేటా ఉంటాయి, మరియు /app/data/uploads లో పేజీకి సంబంధించిన అవతార్ మరియు థంబ్నెయిల్ చిత్రాలు ఉంటాయి. కంటైనర్ను ఆపి, docker compose cp linkbreeze:/app/data ./backup-$(date +%F) రన్ చేసి, ఆపై మళ్ళీ ప్రారంభించండి. పునరుద్ధరించడానికి, ఆ డైరెక్టరీని ఆపి ఉంచిన కంటైనర్లోకి కాపీ చేసి, ఆపై కంటైనర్ను ప్రారంభించండి. డాష్బోర్డ్ నుండి వచ్చే JSON ఎగుమతి అనేది ప్రొఫైల్, లింకులు, సెట్టింగ్లు మరియు థీమ్ల యొక్క కాన్ఫిగరేషన్ స్నాప్షాట్ మాత్రమే; ఇందులో అనలిటిక్స్ లేదా చిత్రాలు ఉండవు.
Linktree నుండి ఇంపోర్ట్ చేస్తే నా అనలిటిక్స్ మరియు థీమ్ కూడా వస్తాయా?
రావు. మైగ్రేషన్ విజార్డ్ మీ పాత పబ్లిక్ ప్రొఫైల్ నుండి లింక్ టైటిల్స్, URLలు, వివరణలు, చిత్రాలు, మీ డిస్ప్లే పేరు, బయో మరియు అవతార్ను మాత్రమే చదువుతుంది. అనలిటిక్స్ హిస్టరీ, థీమ్, ఈమెయిల్ సబ్స్క్రైబర్లు మరియు షెడ్యూల్ చేసిన ప్రచురణ తేదీలు పాత ప్లాట్ఫారమ్లోనే ఉండిపోతాయి. ఇంపోర్ట్ చేసిన తర్వాత థీమ్ ఎడిటర్లో రూపాన్ని మళ్ళీ నిర్మించుకోండి, మరియు మీ క్లిక్ హిస్టరీ పాత ప్లాట్ఫారమ్లోనే ఉంటుందని గమనించండి.