Shlink பயன்படுத்தி சொந்தமாக URL Shortener உருவாக்குவது
Docker Compose மூலம் உங்கள் VPS-ல் Shlink-ஐ நிறுவுவது எப்படி என்பதை அறியுங்கள். சொந்த domain, Postgres database, API keys மற்றும் click stats அமைப்பதற்கான முழுமையான வழிகாட்டி.
நீங்கள் கட்டமைப்பது
Self-hosted URL shortener என்பது நீண்ட இணைய முகவரிகளை நீங்கள் சொந்தமாக வைத்திருக்கும் சிறிய முகவரிகளாக மாற்றும் ஒரு சிறிய server ஆகும். இது ஒவ்வொரு கிளிக்கையும் கணக்கிடும். Shlink-ஐத் தேர்ந்தெடுப்பது சிறந்தது: இது open source, Docker image-ஆகக் கிடைக்கிறது, மேலும் இது ஒரு container மற்றும் ஒரு database மூலம் முழு வேலையையும் செய்கிறது. இந்த வழிகாட்டி, ஒரு VPS-ல் HTTPS, API key, QR codes மற்றும் click stats ஆகியவற்றுடன் கூடிய ஒரு உண்மையான short domain-ஐப் பயன்படுத்தி இதை நிறுவுவதை விளக்குகிறது.
இரண்டு பகுதிகள் இதை ஒரு வணிக ரீதியான shortener போலச் செயல்பட வைக்கின்றன. API server, redirects-க்கு பதிலளிக்கிறது மற்றும் தரவுகளைச் சேமிக்கிறது. Web client என்பது ஒரு தனித்த static app ஆகும், இது உங்கள் browser-லிருந்து அந்த API-உடன் தொடர்பு கொள்கிறது. நீங்கள் இரண்டையும் இயக்கலாம் அல்லது API-ஐ மட்டும் இயக்கி command line மூலம் அதைக் கட்டுப்படுத்தலாம்.
இங்கே குறிப்பிடப்பட்டுள்ள version எண்கள் ஜூலை 2026 நிலவரப்படி தற்போதையவை: Shlink 5.1 மற்றும் shlink-web-client 4.8.
முதலில் ஒரு சிறிய domain-ஐ server-க்கு சுட்டிக்காட்டவும்
Domain என்பதுதான் இந்த product. s.example.com/abc123 என்பது மக்கள் பார்க்கும் இணைப்பாகும், எனவே எதையும் நிறுவுவதற்கு முன்பே ஒரு சிறிய பெயரைத் தேர்வு செய்யவும். Shlink ஒவ்வொரு short URL-உடனும் domain-ஐச் சேமித்து வைக்கும்; எனவே, பிறகு மாற்றினால் நீங்கள் ஏற்கனவே பகிர்ந்த அனைத்து இணைப்புகளும் வேலை செய்யாமல் போய்விடும்.
உங்கள் VPS-ன் public IPv4 முகவரியைச் சுட்டிக்காட்டும் வகையில், அந்த short domain-க்கு ஒரு DNS A record-ஐ உருவாக்கவும். server-ல் IPv6 இருந்தால், ஒரு AAAA record-ஐயும் சேர்க்கவும். பிறகு, நீங்கள் தொடர்வதற்கு முன் அது சரியாக resolve ஆகிறதா என்பதை உறுதிப்படுத்தவும்.
dig +short s.example.com Aஇதன் output உங்கள் server-ன் முகவரியாக இருக்க வேண்டும். அது காலியாக இருந்தால், அந்த record இன்னும் பரவவில்லை (propagate) என்று அர்த்தம். அவ்வாறு இருந்தால், அடுத்தடுத்த அனைத்து நிலைகளும் குழப்பமான முறையில் தோல்வியடையும்; ஏனெனில், resolve ஆகாத ஒரு பெயருக்கு TLS (transport layer security) certificate-ஐ வழங்க முடியாது.
Compose கோப்பு
Shlink-க்கு ஒரு database தேவை. சோதனைக்கு SQLite பயன்படுத்தலாம், ஆனால் நீங்கள் தொடர்ந்து பயன்படுத்த விரும்பும் எதற்கும் Postgres-ஐத் தேர்ந்தெடுப்பதே சிறந்தது. ஏனெனில், visit rows அதிகரித்துக்கொண்டே இருக்கும், மேலும் Postgres indexes மற்றும் concurrent writes-ஐ சிறப்பாகக் கையாளும். இதை /opt/shlink/compose.yaml-ல் உள்ளிடவும்.
services:
shlink:
image: shlinkio/shlink:stable
restart: unless-stopped
ports:
- "127.0.0.1:8080:8080"
environment:
DEFAULT_DOMAIN: s.example.com
IS_HTTPS_ENABLED: "true"
DB_DRIVER: postgres
DB_HOST: database
DB_NAME: shlink
DB_USER: shlink
DB_PASSWORD: ${DB_PASSWORD}
depends_on:
- database
database:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_DB: shlink
POSTGRES_USER: shlink
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- shlink_db:/var/lib/postgresql/data
web-client:
image: shlinkio/shlink-web-client:stable
restart: unless-stopped
ports:
- "127.0.0.1:8081:8080"
volumes:
shlink_db:வெளியிடப்பட்ட இரண்டு ports-ம் 127.0.0.1-ல் பிணைக்கப்பட்டுள்ளன (bind), எனவே அடுத்த பகுதியில் உள்ள reverse proxy அமைக்கப்படும் வரை இணையத்திலிருந்து எதையும் அணுக முடியாது. Docker அதன் சொந்த forwarding விதிகளை host firewall-க்கு முன்னதாகவே எழுதிவிடும். இதன் பொருள், ஒரு சாதாரண 8080:8080 வரி, firewall மூடப்பட்டது போல் தோன்றும் கணினியிலும் கூட app-ஐ வெளிப்படுத்திவிடும். Loopback address-ல் பிணைப்பதன் மூலம் இதைத் தவிர்க்கலாம். இந்த முறை நீங்கள் இயக்கும் எந்தவொரு app-க்கும் பொருந்தும், மேலும் இது VPS-ல் Docker Compose குறித்த வழிகாட்டி-ல் விரிவாக விளக்கப்பட்டுள்ளது.
Database கடவுச்சொல் compose கோப்பிற்கு அருகில் உள்ள ஒரு .env கோப்பிலிருந்து பெறப்படுகிறது, எனவே அது ஒருபோதும் YAML-க்குள் வராது.
sudo mkdir -p /opt/shlink
printf 'DB_PASSWORD=%s\n' "$(openssl rand -base64 24)" | sudo tee /opt/shlink/.env
sudo chmod 600 /opt/shlink/.envஇதைத் தொடங்கி, API செயல்படுவதைக் கவனிக்கவும்.
cd /opt/shlink
sudo docker compose up -d
sudo docker compose logs -f shlinkமுதல் தொடக்கம் database migrations-ஐ இயக்குவதால், அடுத்தடுத்த தொடக்கங்களை விட இதற்கு அதிக நேரம் எடுக்கும். அது நிலைபெற்றதும், service உள்ளூர் அளவில் பதிலளிக்கிறதா என்று சரிபார்க்கவும்.
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/rest/healthஒரு 200 என்பது API உயிர்ப்புடன் இருப்பதையும், database இணைப்பு வேலை செய்வதையும் குறிக்கிறது. இங்கே ஒரு 500 கிடைத்தால், அது பெரும்பாலும் database தொடர்பான சிக்கலாகவே இருக்கும்: .env-ல் உள்ள DB_PASSWORD, Postgres உருவாக்கப்பட்டபோது இருந்ததோடு பொருந்தவில்லை. ஏனெனில், Postgres image ஒரு காலியான data directory-ஐத் தொடங்கும் போது மட்டுமே POSTGRES_PASSWORD-ஐ வாசிக்கும். கடவுச்சொல்லைப் பிறகு திருத்துவது, நீங்கள் volume-ஐ நீக்கிவிட்டு மீண்டும் தொடங்கும் வரை எந்த மாற்றத்தையும் ஏற்படுத்தாது.
அதற்கு முன்னால் HTTPS-ஐ முடிவுக்குக் கொண்டுவருதல் (Terminate)
Shlink, port 8080-ல் plain HTTP-ஐ வழங்குகிறது. TLS என்பது ஒரு reverse proxy-ன் பொறுப்பாகும். இதில் கவனிக்க வேண்டிய மிக முக்கியமான அமைப்பு, அசல் host name-ஐ அப்படியே கடத்துவதாகும். ஒரு short code எந்த domain-க்கு உரியது என்பதை Shlink, Host header-ஐ வாசிப்பதன் மூலம் தீர்மானிக்கிறது. எனவே, அந்த header-ஐ மாற்றியமைக்கும் (rewrite) ஒரு proxy, ஏற்கனவே உள்ள இணைப்புகளுக்கு 404 பிழைகளை உருவாக்கும்; மேலும், வருகை புள்ளிவிவரங்கள் தவறான domain-ல் சேமிக்கப்படும்.
server {
server_name s.example.com;
listen 80;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}அதன்பிறகு certificate-ஐப் பெறவும். renewal timer உட்பட முழுமையான வழிமுறைகள் Ubuntu 24.04-ல் nginx-க்கான Certbot வழிகாட்டியில் உள்ளன.
sudo certbot --nginx -d s.example.comcompose கோப்பில் உள்ள IS_HTTPS_ENABLED: "true" என்பதுதான், Shlink வழங்கும் short URL-களில் https://-ஐ அச்சிடச் செய்கிறது. இது தானாகவே TLS-ஐ இயக்காது. இதை ஒரு HTTPS proxy-க்கு பின்னால் false என்று விட்டுவிட்டால், API வழங்கும் ஒவ்வொரு இணைப்பும் ஒரு http:// இணைப்பாக இருக்கும். இது மீண்டும் ஒருமுறை redirect செய்யப்படுவதால், கூடுதல் நேரம் எடுக்கும் மற்றும் web client-ல் தவறாகத் தோன்றும்.
API key-ஐ உருவாக்குதல்
API key இல்லாமல் எந்தவொரு சேவையும் API-உடன் தொடர்பு கொள்ள முடியாது. Container-க்குள் இருக்கும் CLI மூலம் ஒரு key-ஐ உருவாக்கவும்.
sudo docker compose exec shlink shlink api-key:generate --name "web client"இந்தக் கட்டளை key-ஐ ஒருமுறை மட்டுமே திரையில் காட்டும். அதை இப்போதே நகலெடுத்துக் கொள்ளவும், ஏனெனில் இது hashed வடிவில் சேமிக்கப்படுவதால் மீண்டும் பார்க்க முடியாது. shlink api-key:list ஒவ்வொரு key-ன் பெயரையும், அது செயல்பாட்டில் உள்ளதா என்பதையும் காட்டும், ஆனால் key-ஐ ஒருபோதும் காட்டாது. shlink api-key:disable மற்றும் key-ன் பெயரைப் பயன்படுத்தி ஒரு key-ஐ ரத்து செய்யலாம்.
ஒவ்வொரு REST அழைப்பிலும் X-Api-Key header-ல் இந்த key-ஐ இணைக்க வேண்டும்.
curl -H "X-Api-Key: YOUR_KEY" https://s.example.com/rest/v3/short-urlsshortUrls key-ஐக் கொண்ட ஒரு JSON object, அந்த key சரியாக வேலை செய்கிறது என்பதைக் குறிக்கிறது. INVALID_API_KEY-ஐக் கொண்ட ஒரு 401, அந்த key தவறானது, முடக்கப்பட்டது அல்லது அதன் காலாவதி தேதி முடிந்துவிட்டது என்பதைக் குறிக்கிறது.
கட்டளை வரியிலிருந்து (command line) குறுக்கு இணைப்புகளை (short links) உருவாக்குதல்
இணைப்புகளை உருவாக்க CLI மிக வேகமான வழியாகும், மேலும் இது ஸ்கிரிப்டிங் செய்வதற்கு ஏற்றது.
sudo docker compose exec shlink shlink short-url:create https://example.com/a/very/long/path
sudo docker compose exec shlink shlink short-url:create https://example.com/docs --custom-slug docs --tag reference--custom-slug, உருவாக்கப்பட்ட குறியீட்டிற்குப் பதிலாக வாசிக்கக்கூடிய இணைப்பை வழங்குகிறது. ஒரு டொமைனில் ஸ்லக்குகள் (slugs) தனித்துவமானவை. எனவே, ஏற்கனவே பயன்பாட்டில் உள்ள ஒரு ஸ்லக்கைப் பயன்படுத்த முயற்சித்தால், அது முதல் இணைப்பை மேலெழுதாமல் (overwrite), தோல்வியடையும். --tag-ஐ மீண்டும் பயன்படுத்தலாம், மேலும் பிற்காலத்தில் ஒருங்கிணைந்த புள்ளிவிவரங்களைப் பார்க்க விரும்பும் இணைப்புகளை வகைப்படுத்த டேக்-களை (tags) பயன்படுத்தலாம்.
ஏற்கனவே உள்ளவற்றை பட்டியலிட்டு, ஒரு இணைப்பின் டிராஃபிக்கைப் பார்க்கவும்.
sudo docker compose exec shlink shlink short-url:list
sudo docker compose exec shlink shlink short-url:visits docsshort-url:visits, ஒவ்வொரு கிளிக்கிற்கும் தேதி, ரெஃபரர் (referrer) மற்றும் பயனர் ஏஜென்ட் (user agent) ஆகியவற்றுடன் ஒரு வரிசையை அச்சிடுகிறது. GEOLITE_LICENSE_KEY சூழல் மாறியை (environment variable) அமைக்காவிட்டால், நாடு மற்றும் நகரம் ஆகிய நெடுவரிசைகள் காலியாகவே இருக்கும். இது Shlink பயன்படுத்தும் இலவச MaxMind கீ ஆகும், இதன் மூலம் GeoLite2 தரவுத்தளத்தைப் பதிவிறக்கம் செய்யலாம். இதை அமைக்கவில்லை என்றாலும் வருகைகள் பதிவு செய்யப்படும், ஆனால் அவை எந்த இடத்தைச் சேர்ந்தவை என்பது மட்டும் தெரியாது.
Web client மற்றும் QR குறியீடுகள்
Web client தற்போது 127.0.0.1:8081-ல் உள்ளது. இதற்குத் தனி proxy entry தேவைப்படும்; அல்லது நீங்கள் இதை public-ஆக வெளியிட விரும்பவில்லை எனில் SSH tunnel-ஐப் பயன்படுத்தலாம். முதல்முறை இயக்கும்போது, இது server URL மற்றும் API key-ஐக் கேட்கும். https://s.example.com மற்றும் நீங்கள் உருவாக்கிய key-ஐ உள்ளிடவும். Client இவை இரண்டையும் browser storage-ல் வைத்துக்கொண்டு, உங்கள் API-ஐ நேரடியாக அழைக்கும். எனவே, தரவுகள் பிறர் வழியாகச் செல்லாது. Interface-ஐ API-லிருந்து பிரிப்பது கவனிக்கத்தக்க ஒரு முறையாகும். இதே முறையைப் பயன்படுத்திதான் Halcyon, Jellyfin library-ஐ 1990-களின் rental store போல மாற்றுகிறது; இதற்குப் பின்னால் உள்ள media server-ல் எந்த மாற்றமும் செய்யத் தேவையில்லை.
QR குறியீடுகளுக்கு எந்த configuration-ம் தேவையில்லை. ஏதேனும் ஒரு short URL-உடன் /qr-code-ஐச் சேர்த்தால், API அந்தப் படத்தைத் தரும்.
https://s.example.com/docs/qr-code?size=500&format=svg&margin=20size என்பது pixels-ல் அகலத்தைக் குறிக்கும்; இது 50 முதல் 1000 வரை இருக்கலாம், default மதிப்பு 300 ஆகும். format என்பது png அல்லது svg ஆகும். margin என்பது குறியீட்டைச் சுற்றியுள்ள காலியான இடமாகும் (pixels-ல்); இறுதிப் படத்தின் அளவு, குறியீட்டின் அளவுடன் இரண்டு மடங்கு margin-ஐக் கூட்டியதாகும். சிறியதாக அச்சிடும்போதோ அல்லது ஓரளவு மறைக்கப்பட்டிருக்கும்போதோ ஸ்கேன் செய்யக்கூடிய குறியீட்டிற்கு errorCorrection=Q-ஐச் சேர்க்கவும்.
தொடர்ச்சியான இயக்கம்
ஒரு shortener அமைதியாகச் செயலிழக்கக்கூடும். இணைப்புகள் (links) வழிமாற்றம் செய்யப்படாது, ஆனால் பயனர் அந்த இணைப்பு பழுதடைந்ததாகக் கருதிவிடுவார். எனவே, முகப்புப் பக்கத்திற்குப் பதிலாக, உண்மையான ஒரு short URL-ஐ uptime check மூலம் கண்காணிக்கவும். 301 அல்லது 302 போன்ற வழிமாற்றுக் குறியீடுகள் (redirect codes) கிடைக்கவில்லை எனில் எச்சரிக்கை பெறவும். சுயமாக இயங்கும் Uptime Kuma instance இதற்குச் சிறந்த தீர்வாகும்; இது குறிப்பிட்ட status code-ஐக் கண்காணிக்க உதவும்.
Container-ஐ அல்ல, database-ஐ backup செய்யவும். ஒரு கட்டளை மூலம் இதைச் செய்ய முடியும்.
sudo docker compose exec -T database pg_dump -U shlink shlink | gzip > shlink-$(date +%F).sql.gzஅந்தக் கோப்பு மற்றும் உங்கள் compose கோப்பு ஆகியவற்றைக் கொண்டு, புதிய server-ல் முழு சேவையையும் மீண்டும் உருவாக்கலாம். இந்த ஜோடி கோப்புகள் ஒவ்வொரு application-க்கும் அவசியம். புகைப்பட நூலகங்கள் (photo libraries) இதில் சற்று சிக்கலானவை; ஏனெனில் PhotoPrism மற்றும் Immich ஆகிய இரண்டுமே புகைப்படங்களை வட்டில் (disk) சேமிப்பதோடு, database-லும் தகவல்களை வைத்திருக்கின்றன. எனவே, database dump மட்டும் முழுமையான மீட்டெடுப்பைத் தராது. மேம்படுத்தல்கள் (upgrades) sudo docker compose pull மற்றும் அதைத் தொடர்ந்து sudo docker compose up -d மூலம் செய்யப்படுகின்றன. Shlink தொடங்கும்போதே புதிய migrations-ஐச் செயல்படுத்திவிடும். எனவே, புதிய பதிப்பைப் பதிவிறக்கும் (pull) முன்பே dump எடுத்துக்கொள்ளவும்; ஏனெனில் ஒருமுறை migration நடந்தால் அதைத் திரும்பப் பெற (rollback) முடியாது.
FAQ
reverse proxy-ஐச் சேர்த்த பிறகு எனது short links ஏன் 404 பிழையைக் காட்டுகின்றன?
Shlink ஆனது Host header-ல் உள்ள domain-ஐ வைத்து short code-ஐ ஒப்பிடுகிறது. ஒரு proxy தனது சொந்தப் பெயரையோ அல்லது internal address-ஐயோ அனுப்பினால், Shlink அந்த domain-ல் எந்த link-ம் இல்லை என்று கருதி 404 பதிலை அளிக்கும். nginx location block-ல் proxy_set_header Host $host;-ஐ அமைத்து, proxy-ஐ reload செய்யவும். container-ஐ restart செய்யாமலேயே links உடனடியாகச் செயல்படத் தொடங்கும்.
எனக்கு Postgres தேவையா அல்லது SQLite போதுமானதா?
Shlink-ஐச் சோதித்துப் பார்க்க SQLite போதுமானது, இதற்கு இரண்டாவது container தேவையில்லை. முக்கியமான links-ஐ வெளியிடுவதற்கு முன்பு Postgres-க்கு மாறிவிடுவது நல்லது, ஏனெனில் ஒவ்வொரு கிளிக்கிற்கும் visit rows அதிகரித்துக்கொண்டே இருக்கும், மேலும் SQLite எழுதும் பணிகளை வரிசைப்படுத்தும் (serialise). பிற்காலத்தில் மாறுவது என்பது links-ஐ export செய்து மீண்டும் import செய்வதைக் குறிக்கும், எனவே தொடக்கத்திலேயே Postgres-ஐத் தேர்ந்தெடுப்பது அந்த இடப்பெயர்ச்சி வேலையைத் தவிர்க்கும்.
நான் நகலெடுக்க மறந்த API key-ஐ மீட்டெடுக்க முடியுமா?
முடியாது. Shlink அந்த key-ன் hash-ஐ மட்டுமே சேமிக்கிறது, எனவே api-key:list அதன் பெயர்களையும் நிலையையும் மட்டுமே காட்டும், அதன் மதிப்பை ஒருபோதும் காட்டாது. shlink api-key:generate மூலம் புதிய key-ஐ உருவாக்கி, அதை web client-ல் பதிவிடவும், பின்னர் பழைய key-ஐ shlink api-key:disable மூலம் முடக்கவும், அப்போதுதான் அது செயல்படாது.
எனது visit stats-ல் உள்ள country columns ஏன் காலியாக உள்ளன?
Geolocation-க்கு GeoLite2 database தேவை, இதை நீங்கள் GEOLITE_LICENSE_KEY வழங்கினால் மட்டுமே Shlink பதிவிறக்கம் செய்யும். இந்த key MaxMind-ல் இலவசமாகக் கிடைக்கிறது. இதை environment பகுதியில் சேர்த்து, container-ஐ மீண்டும் உருவாக்கி (recreate) இயக்கினால், புதிய வருகைகள் கண்டறியப்படும். அதற்கு முன்பு பதிவான வருகைகள், நீங்கள் shlink visit:locate-ஐ இயக்கும் வரை காலியாகவே இருக்கும்.
Shlink-ஐ வேறொரு server-க்கு எப்படி மாற்றுவது?
Domain-ஐ அப்படியே வைத்துக்கொண்டு தரவுகளை (data) மட்டும் மாற்றவும். pg_dump மூலம் database-ஐ dump செய்யவும், அந்த dump கோப்பையும் compose கோப்பையும் புதிய server-க்கு நகலெடுத்து, stack-ஐத் தொடங்கவும். உண்மையான traffic வருவதற்கு முன்பு, காலியாக உள்ள database-ல் dump-ஐ restore செய்யவும். DNS பதிவை கடைசியாக மாற்றவும். Short codes மற்றும் அவற்றின் visit history அப்படியே இருக்கும், ஏனெனில் அனைத்தும் database-லேயே உள்ளன.