Shlink மூலம் சொந்தமாக URL Shortener உருவாக்குவது எப்படி?
VPS-இல் Shlink மற்றும் Docker Compose பயன்படுத்தி சொந்த URL சுருக்கியை நிறுவுங்கள். DNS அமைப்பு, Postgres தரவுத்தளம், API keys மற்றும் கிளிக்குகளை கண்காணிக்கும் முறைகளை அறிக.
நீங்கள் உருவாக்குவது என்ன
சுயமாக ஹோஸ்ட் செய்யப்படும் URL சுருக்கி (URL shortener) என்பது ஒரு சிறிய சர்வர் ஆகும். இது நீண்ட இணைப்புகளை நீங்கள் சொந்தமாக வைத்திருக்கும் சிறிய இணைப்புகளாக மாற்றுகிறது, மேலும் ஒவ்வொரு கிளிக்கையும் கணக்கிடுகிறது. இதற்கு Shlink சிறந்த தேர்வாகும்: இது ஒரு திறந்த மூல மென்பொருள், Docker இமேஜாக கிடைக்கிறது, மேலும் இது ஒரு கண்டெய்னர் மற்றும் ஒரு டேட்டாபேஸ் மூலம் முழு பணியையும் செய்கிறது. இந்த வழிகாட்டி, ஒரு VPS-இல் உண்மையான சிறிய டொமைனுடன், HTTPS, API key, QR குறியீடுகள் மற்றும் கிளிக்குகளின் புள்ளிவிவரங்களுடன் இதை எவ்வாறு நிறுவுவது என்பதை விளக்குகிறது.
இரண்டு பகுதிகள் இதை ஒரு வணிக ரீதியான சுருக்கி போல செயல்பட வைக்கின்றன. API சர்வர் ரீடைரெக்டுகளுக்கு (redirects) பதிலளிக்கிறது மற்றும் தரவுகளை சேமிக்கிறது. வெப் கிளையண்ட் (web client) என்பது ஒரு தனி ஸ்டேடிக் ஆப் (static app) ஆகும், இது உங்கள் பிரவுசரில் இருந்து அந்த API உடன் தொடர்பு கொள்கிறது. நீங்கள் இரண்டையும் இயக்கலாம் அல்லது API-ஐ மட்டும் இயக்கி கமாண்ட் லைன் மூலம் அதைக் கட்டுப்படுத்தலாம்.
இங்கு குறிப்பிடப்பட்டுள்ள பதிப்பு எண்கள் ஜூலை 2026 நிலவரப்படி தற்போதையவை: Shlink 5.1 மற்றும் shlink-web-client 4.8.
உங்கள் சர்வரைச் சுட்டிக்காட்டும் வகையில் ஒரு சிறிய டொமைனைத் தேர்வு செய்யவும்
டொமைன் என்பது தயாரிப்பு ஆகும். s.example.com/abc123 என்பது பயனர்கள் பார்க்கும் இணைப்பாகும், எனவே எதையும் நிறுவுவதற்கு முன்பே சுருக்கமான ஒன்றைத் தேர்வு செய்யவும். Shlink ஒவ்வொரு சுருக்கப்பட்ட URL-உடனும் டொமைனைச் சேமித்து வைக்கிறது. பிற்காலத்தில் இதை மாற்றினால், நீங்கள் ஏற்கனவே பகிர்ந்த அனைத்து இணைப்புகளும் வேலை செய்யாமல் போய்விடும்.
உங்கள் VPS-ன் பொது IPv4 முகவரியைச் சுட்டிக்காட்டும் வகையில், அந்தச் சிறிய டொமைனுக்காக ஒரு DNS A ரெக்கார்டை உருவாக்கவும். சர்வரில் IPv6 இருந்தால், ஒரு AAAA ரெக்கார்டையும் சேர்க்கவும். நீங்கள் தொடர்வதற்கு முன், அது சரியாகச் செயல்படுகிறதா என்பதை உறுதிப்படுத்தவும்.
dig +short s.example.com Aவெளியீடு உங்கள் சர்வரின் முகவரியாக இருக்க வேண்டும். அது காலியாக இருந்தால், ரெக்கார்டு இன்னும் பரவவில்லை என்று அர்த்தம். டொமைன் பெயர் சரியாகச் செயல்படவில்லை என்றால் TLS (transport layer security) சான்றிதழை வழங்க முடியாது என்பதால், அடுத்தடுத்த அனைத்து நிலைகளும் குழப்பமான முறையில் தோல்வியடையும்.
compose கோப்பு
Shlink-க்கு ஒரு தரவுத்தளம் தேவை. சோதனைக்கு 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:வெளியிடப்பட்ட இரண்டு போர்ட்களும் 127.0.0.1-இல் பிணைக்கப்பட்டுள்ளன (bind). எனவே, அடுத்த பகுதியில் உள்ள ரிவர்ஸ் ப்ராக்ஸி (reverse proxy) அமைக்கப்படும் வரை இணையத்திலிருந்து எதையும் அணுக முடியாது. Docker தனது சொந்த பகிர்தல் விதிகளை (forwarding rules) ஹோஸ்ட் ஃபயர்வால் (host firewall) முன்னதாகவே எழுதும். இதன் பொருள், ஒரு சாதாரண 8080:8080 வரியானது, ஃபயர்வால் மூடப்பட்டதாகத் தோன்றும் கணினியிலும் செயலியை வெளிப்படுத்தும். லூப்பேக் முகவரியுடன் (loopback address) பிணைப்பது இதைத் தவிர்க்கிறது. இதே முறை நீங்கள் இந்த வழியில் இயக்கும் எந்தவொரு செயலிக்கும் பொருந்தும், மேலும் இது VPS-இல் Docker Compose குறித்த வழிகாட்டி-இல் விரிவாக விளக்கப்பட்டுள்ளது.
தரவுத்தள கடவுச்சொல் 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) இயக்குகிறது, எனவே இது அடுத்தடுத்த தொடக்கங்களை விட அதிக நேரம் எடுக்கும். அது நிலைபெற்றதும், சேவை உள்ளூர் அளவில் பதிலளிக்கிறதா என்பதைச் சரிபார்க்கவும்.
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/rest/healthஒரு 200 என்பது API இயங்குகிறது மற்றும் தரவுத்தள இணைப்பு வேலை செய்கிறது என்று பொருள். இங்கே ஒரு 500 கிடைத்தால், அது பெரும்பாலும் தரவுத்தளப் பிரச்சனைதான்: .env-இல் உள்ள DB_PASSWORD, Postgres உருவாக்கப்பட்டபோது இருந்ததோடு பொருந்தவில்லை. ஏனெனில், Postgres இமேஜ் ஒரு காலியான தரவு அடைவை (data directory) துவக்கும்போது மட்டுமே POSTGRES_PASSWORD-ஐ வாசிக்கும். நீங்கள் வால்யூமை (volume) நீக்கிவிட்டு மீண்டும் தொடங்கும் வரை, கடவுச்சொல்லைப் பிறகு திருத்துவது எந்த மாற்றத்தையும் ஏற்படுத்தாது.
HTTPS இணைப்பை முன்னால் முடித்தல்
Shlink ஆனது 8080 போர்ட்டில் சாதாரண HTTP சேவையை வழங்குகிறது. TLS என்பது ஒரு ரிவர்ஸ் பிராக்ஸியில் (reverse proxy) இருக்க வேண்டிய ஒன்று. இதில் முக்கியமான அமைப்பு, அசல் ஹோஸ்ட் பெயரை (original host name) அப்படியே கடத்துவதாகும். Shlink ஆனது Host ஹெடரை வாசிப்பதன் மூலம், ஒரு ஷார்ட் கோட் எந்த டொமைனைச் சேர்ந்தது என்பதைத் தீர்மானிக்கிறது. எனவே, அதை மாற்றியமைக்கும் ஒரு பிராக்ஸி, ஏற்கனவே உள்ள இணைப்புகளுக்கு 404 பதில்களை வழங்கும், மேலும் வருகை புள்ளிவிவரங்கள் தவறான டொமைனுடன் இணைக்கப்படும்.
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;
}
}அதன்பிறகு சான்றிதழைப் பெறவும். புதுப்பித்தல் டைமர் (renewal timer) உள்ளிட்ட முழுமையான வழிமுறைகள் Ubuntu 24.04-ல் nginx-க்கான Certbot வழிகாட்டியில் உள்ளன.
sudo certbot --nginx -d s.example.comcompose கோப்பில் உள்ள IS_HTTPS_ENABLED: "true" என்பதுதான் Shlink தனது ஷார்ட் URL-களில் https://-ஐ அச்சிடுவதற்கு காரணமாகிறது. இது தானாகவே TLS-ஐ இயக்காது. இதை ஒரு HTTPS பிராக்ஸிக்கு பின்னால் false என விட்டுவிட்டால், API வழங்கும் ஒவ்வொரு இணைப்பும் ஒரு http:// இணைப்பாக இருக்கும். இது கூடுதல் ரவுண்ட் ட்ரிப் (round trip) நேரத்தை எடுத்துக்கொள்ளும் மற்றும் இணைய கிளையண்டில் தவறாகத் தோன்றும்.
API key-ஐ உருவாக்குதல்
key இல்லாமல் எதனாலும் API-உடன் தொடர்பு கொள்ள முடியாது. container-க்குள் இருக்கும் CLI மூலம் ஒன்றை உருவாக்குங்கள்.
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-ஐ நீக்கலாம்.
ஒவ்வொரு 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 தவறானது, முடக்கப்பட்டது அல்லது அதன் காலாவதி தேதி முடிந்துவிட்டது என்பதைக் குறிக்கிறது.
கட்டளை வரி மூலம் குறுக்கு இணைப்புகளை உருவாக்குதல்
இணைப்புகளை உருவாக்குவதற்கு 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) ஒவ்வொரு டொமைனுக்கும் தனித்துவமானவை. எனவே, ஏற்கனவே பயன்பாட்டில் உள்ள ஒரு ஸ்லக்கைப் பயன்படுத்த முயற்சித்தால், அது முதல் இணைப்பை மேலெழுதாமல் தோல்வியடையும். --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 கீ (key) ஆகும், இதன் மூலம் GeoLite2 தரவுத்தளத்தை பதிவிறக்கம் செய்ய முடியும். இதை அமைக்கவில்லை என்றாலும் வருகைகள் பதிவு செய்யப்படும், ஆனால் அவற்றின் இருப்பிடம் கண்டறியப்படாது.
இணைய கிளையண்ட் மற்றும் QR குறியீடுகள்
இணைய கிளையண்ட் இப்போது 127.0.0.1:8081 இல் உள்ளது. இதற்குத் தனிப்பட்ட பிராக்ஸி (proxy) உள்ளீடு தேவைப்படுகிறது. நீங்கள் அதை பொதுவெளியில் வெளியிட விரும்பவில்லை எனில், SSH டன்னலைப் பயன்படுத்தலாம். முதல்முறை ஏற்றும்போது, இது சர்வர் URL மற்றும் API கீயைக் கேட்கும். https://s.example.com மற்றும் நீங்கள் உருவாக்கிய கீயை உள்ளிடவும். கிளையண்ட் இவை இரண்டையும் பிரவுசர் சேமிப்பகத்தில் வைத்துக்கொண்டு, உங்கள் API-ஐ நேரடியாக அழைக்கும். எனவே, தரவு வேறு எதன் வழியாகவும் செல்லாது.
QR குறியீடுகளுக்கு எந்தவிதமான உள்ளமைவும் தேவையில்லை. ஏதேனும் ஒரு சிறிய URL-இன் இறுதியில் /qr-code என்பதைச் சேர்த்தால், API அந்தப் படத்தைத் திருப்பித் தரும்.
https://s.example.com/docs/qr-code?size=500&format=svg&margin=20size என்பது பிக்சல்களில் அகலத்தைக் குறிக்கிறது. இது 50 முதல் 1000 வரையிலான மதிப்புகளை ஏற்கும், இயல்புநிலை மதிப்பு 300 ஆகும். format என்பது png அல்லது svg ஆகும். margin என்பது குறியீட்டைச் சுற்றியுள்ள காலியான இடைவெளி (பிக்சல்களில்). இறுதிப் படத்தின் அளவு, குறியீட்டின் அளவுடன் இரண்டு மடங்கு மார்ஜினையும் (margin) சேர்த்துக் கணக்கிடப்படும். சிறியதாக அச்சிடப்படும்போது அல்லது ஓரளவு மறைக்கப்பட்டிருக்கும்போதும் ஸ்கேன் செய்யக்கூடிய குறியீட்டிற்கு errorCorrection=Q என்பதைச் சேர்க்கவும்.
சேவையைத் தொடர்ந்து இயக்குதல்
ஒரு சுருக்கமான URL (shortener) அமைதியாகச் செயலிழக்கும். இணைப்புகள் வழிமாற்றம் (redirect) செய்யப்படாது, ஆனால் யாரும் உங்களுக்குத் தெரிவிக்க மாட்டார்கள், ஏனெனில் இணைப்பைக் கிளிக் செய்தவர் அது செயலிழந்துவிட்டதாகக் கருதுவார். முகப்புப் பக்கத்திற்குப் பதிலாக, உண்மையான ஒரு சுருக்கமான URL-ஐக் கண்காணிக்கும்படி uptime சோதனையை அமைக்கவும். வழிமாற்றம் செய்யப்படாத எதற்கும் எச்சரிக்கையை (alert) உருவாக்கவும். சுயமாக ஹோஸ்ட் செய்யப்பட்ட Uptime Kuma instance இதைச் சிறப்பாகச் செய்யும், மேலும் இது ஒரு குறிப்பிட்ட status code-ஐக் கண்காணிக்க முடியும்.
கண்டெய்னரை (container) அல்ல, தரவுத்தளத்தை (database) பேக்கப் எடுக்கவும். ஒரு கட்டளை அதை டம்ப் (dump) செய்யும்.
sudo docker compose exec -T database pg_dump -U shlink shlink | gzip > shlink-$(date +%F).sql.gzஅந்தக் கோப்பு மற்றும் உங்கள் compose கோப்பு ஆகியவை புதிய சர்வரில் முழு சேவையையும் மீண்டும் உருவாக்கும். மேம்படுத்தல்கள் (upgrades) sudo docker compose pull மற்றும் அதைத் தொடர்ந்து sudo docker compose up -d மூலம் செய்யப்படுகின்றன. Shlink தொடங்கும் போது புதிய மைக்ரேஷன்களை (migrations) இயக்கும். நீங்கள் pull செய்வதற்கு முன்பே டம்ப் எடுத்துக்கொள்ளுங்கள், ஏனெனில் மைக்ரேஷனைத் திரும்பப் பெற (roll back) முடியாது.
FAQ
ரிவர்ஸ் பிராக்ஸியை (reverse proxy) சேர்த்த பிறகு எனது குறுக்கு இணைப்புகள் (short links) ஏன் 404 பிழையைக் காட்டுகின்றன?
Shlink ஆனது Host ஹெடரில் உள்ள டொமைனுடன் குறுக்கு குறியீட்டை (short code) ஒப்பிடுகிறது. ஒரு பிராக்ஸி தனது சொந்த பெயரையோ அல்லது உள்முக முகவரியையோ அனுப்பினால், Shlink அந்த டொமைனில் குறியீட்டைத் தேடும். அங்கு இணைப்புகள் இல்லாததால், அது 404 பிழையை அளிக்கிறது. nginx லொகேஷன் பிளாக்கில் proxy_set_header Host $host; என்பதை அமைத்து, பிராக்ஸியை ரீலோட் செய்யவும். கன்டெய்னரை ரீஸ்டார்ட் செய்யாமலேயே இணைப்புகள் உடனடியாகச் செயல்படத் தொடங்கும்.
எனக்கு Postgres தேவையா, அல்லது SQLite போதுமானதா?
Shlink-ஐச் சோதித்துப் பார்க்க SQLite போதுமானது, இதற்கு இரண்டாவது கன்டெய்னர் தேவையில்லை. முக்கியமான இணைப்புகளை வெளியிடுவதற்கு முன்பு Postgres-க்கு மாறவும். ஏனெனில் ஒவ்வொரு கிளிக்கிற்கும் விசிட் வரிசைகள் (visit rows) அதிகரிக்கும் மற்றும் SQLite எழுதும் பணிகளை வரிசைப்படுத்தும் (serialise). பிற்காலத்தில் மாறினால், உங்கள் இணைப்புகளை எக்ஸ்போர்ட் செய்து மீண்டும் இம்போர்ட் செய்ய வேண்டியிருக்கும். எனவே, தொடக்கத்திலேயே Postgres-ஐத் தேர்ந்தெடுப்பது இந்த இடப்பெயர்வைத் தவிர்க்க உதவும்.
நகலெடுக்க மறந்த API கீயை என்னால் மீட்க முடியுமா?
முடியாது. Shlink கீயின் ஹாஷ் (hash) மதிப்பை மட்டுமே சேமிக்கிறது. எனவே, api-key:list கட்டளை பெயர்களையும் நிலையையும் காட்டும், ஆனால் கீயின் மதிப்பை ஒருபோதும் காட்டாது. shlink api-key:generate மூலம் புதிய கீயை உருவாக்கி, அதை வெப் கிளையண்டில் பேஸ்ட் செய்யவும். பிறகு, பழைய கீயை shlink api-key:disable மூலம் முடக்கவும், அப்போதுதான் அது செயல்படுவதை நிறுத்தும்.
எனது விசிட் புள்ளிவிவரங்களில் நாட்டின் பெயர்கள் ஏன் காலியாக உள்ளன?
புவிஇருப்பிடத்தைக் கண்டறிய (geolocation) GeoLite2 டேட்டாபேஸ் தேவை. நீங்கள் GEOLITE_LICENSE_KEY வழங்கினால் மட்டுமே Shlink அதைத் தரவிறக்கம் செய்யும். இந்த கீ MaxMind தளத்தில் இலவசமாகக் கிடைக்கிறது. இதை என்விரான்மென்ட் பகுதியில் சேர்த்து, கன்டெய்னரை மீண்டும் உருவாக்கவும். அதன் பிறகு வரும் விசிட்கள் கண்டறியப்படும். இதற்கு முன்பு பதிவான விசிட்கள், நீங்கள் shlink visit:locate கட்டளையை இயக்கும் வரை காலியாகவே இருக்கும்.
Shlink-ஐ வேறொரு சர்வருக்கு எப்படி மாற்றுவது?
டொமைனை அப்படியே வைத்துக்கொண்டு டேட்டாவை மட்டும் மாற்றவும். pg_dump மூலம் டேட்டாபேஸை டம்ப் (dump) செய்யவும். அந்த டம்ப் கோப்பையும், compose கோப்பையும் புதிய சர்வருக்கு நகலெடுத்து, ஸ்டேக்கை (stack) தொடங்கவும். உண்மையான டிராஃபிக் வருவதற்கு முன்பு, காலியாக உள்ள டேட்டாபேஸில் டம்ப் கோப்பை ரீஸ்டோர் செய்யவும். கடைசியாக DNS ரெக்கார்டை மாற்றவும். டேட்டாபேஸில் அனைத்தும் சேமிக்கப்படுவதால், குறுக்கு குறியீடுகளும் அவற்றின் விசிட் வரலாறும் அப்படியே இருக்கும்.