VPS-ல் சொந்தமாக CalDAV server அமைப்பது எப்படி?
Google இன்றி உங்கள் சாதனங்களை ஒத்திசைக்க Radicale மூலம் CalDAV server-ஐ VPS-ல் நிறுவுவது எப்படி என்பதை அறியுங்கள். TLS பாதுகாப்பு, தானியங்கி discovery மற்றும் client setup முறைகளை
நீங்கள் உருவாக்குவது என்ன
நீங்கள் நிர்வகிக்கும் VPS-ல், TLS பாதுகாப்பிற்குப் பின்னால் இயங்கும் ஒரு CalDAV server-தான் self-hosted calendar. இதில் ஒவ்வொரு பயனருக்கும் தனித்தனி login இருக்கும். உங்கள் கைபேசி, மடிக்கணினி மற்றும் உங்கள் துணையின் மடிக்கணினி என அனைத்திலும் ஒரே நிகழ்வுகள் (events) ஒத்திசைக்கப்படும். இதில் Google கணக்கின் தலையீடு இருக்காது.
இது self-hosted booking page என்பதிலிருந்து முற்றிலும் மாறுபட்டது. Booking page என்பது அந்நியர்களுக்காக உருவாக்கப்படுவது; அது உங்கள் ஓய்வு நேரங்களை வெளியிட்டு, மற்றவர்கள் அதை முன்பதிவு செய்ய அனுமதிக்கிறது. Calendar server என்பது உங்கள் சொந்த சாதனங்களுக்காக உருவாக்கப்படுவது; இது நிகழ்வுகளைச் சேமித்து, அனைத்து client-களையும் ஒத்திசைவில் வைத்திருக்கிறது. பலர் இவ்விரண்டையும் பயன்படுத்துவார்கள்; அப்போது booking tool, நீங்கள் இங்கே உருவாக்கும் CalDAV server-லிருந்து உங்கள் கிடைக்கும் நேரத்தை (availability) வாசிக்கும்.
இதன் நிறுவல் சிறியது. Radicale என்பது ஒரு Python package மற்றும் சுமார் பத்து வரிகள் கொண்ட configuration மட்டுமே. இந்த அமைப்பு முதல் மாதத்தைத் தாண்டி நீடிக்குமா என்பதை TLS, discovery, பயனர் வாரியான collections மற்றும் backups ஆகியவையே தீர்மானிக்கின்றன. கீழே உள்ள பகுதிகளில் இவை குறித்து விரிவாகக் காண்போம்.
CalDAV என்றால் என்ன, அது ஏன் முக்கியமானது?
CalDAV என்பது HTTP வழியாக காலெண்டரை ஒத்திசைக்கும் (sync) முறையாகும். இது RFC 4791-ல் WebDAV-ன் நீட்டிப்பாக வரையறுக்கப்பட்டுள்ளது (WebDAV என்பது RFC 4918-ல் வரையறுக்கப்பட்ட கூடுதல் HTTP முறைகளைக் கொண்ட, இணையம் சார்ந்த ஆவண உருவாக்கம் மற்றும் பதிப்பு மேலாண்மை முறையாகும்). ஒரு காலெண்டர் என்பது ஒரு கோப்பகம் (directory) போலச் செயல்படும் தொகுப்பாகும். இதில் உள்ள ஒவ்வொரு நிகழ்வும் (event) ஒரு தனி கோப்பாக இருக்கும்; இது iCalendar உரை வடிவத்தில் (RFC 5545) எழுதப்பட்டிருக்கும். இது உங்கள் மின்னஞ்சலில் வரும் .ics இணைப்புகளின் அதே வடிவமாகும்.
Clients சாதாரண HTTP-ஐப் பயன்படுத்தி, அதனுடன் சில கூடுதல் முறைகளைச் சேர்க்கின்றன. PROPFIND என்பது அங்கு என்ன இருக்கிறது மற்றும் அதன் பண்புகள் என்ன என்று கேட்கிறது. REPORT என்பது ஒரு குறிப்பிட்ட கால இடைவெளியில் உள்ள நிகழ்வுகள் போன்ற வடிகட்டப்பட்ட தகவல்களைக் கேட்கிறது. PUT ஒரு நிகழ்வை எழுதுகிறது மற்றும் DELETE அதை நீக்குகிறது. ஒவ்வொரு நிகழ்வும் ஒரு UID வரியைக் கொண்டிருக்கும். அந்த அடையாளங்காட்டி (identifier) மூலமே, இரண்டு சாதனங்களும் ஒரே நிகழ்வைப் பார்க்கின்றனவா அல்லது நகலைப் பார்க்கின்றனவா என்பதை உறுதிப்படுத்திக் கொள்கின்றன.
இதன் முக்கியப் பயன் இடமாற்றத்தன்மை (portability) ஆகும்; இதற்காகவே இது பயன்படுத்தப்படுகிறது. iOS, macOS, Thunderbird, Evolution மற்றும் DAVx⁵ வழியாக Android என அனைத்தும் CalDAV-ஐ ஆதரிக்கின்றன. உங்கள் தரவு நீங்கள் இன்று தேர்ந்தெடுத்த server-டன் மட்டும் பிணைக்கப்படவில்லை. கோப்புகளை வேறொரு CalDAV server-க்கு நகர்த்திவிட்டு, புதிய hostname-ஐ clients-ல் குறிப்பிட்டால் போதும், மற்றவை மாறாது.
CardDAV-ம் இதனுடன் இணைந்து செயல்படுகிறது. இது தொடர்புகளுக்கான (contacts) அதே கருத்தாகும்; இது RFC 6352-ல் வரையறுக்கப்பட்டுள்ளது மற்றும் நிகழ்வுகளுக்குப் பதிலாக vCard கோப்புகளைச் சேமிக்கிறது. கீழே கொடுக்கப்பட்டுள்ள ஒவ்வொரு server-ம் ஒரே கணக்கிலிருந்து இரண்டு நெறிமுறைகளையும் (protocols) வழங்குகிறது. எனவே, காலெண்டர் சரியாகச் செயல்படத் தொடங்கினால், முகவரிப் புத்தகத்தை (address book) ஒரு checkbox மூலம் எளிதாகச் செயல்படுத்தலாம்.
எந்த CalDAV server-ஐ நீங்கள் இயக்க வேண்டும்?
Radicale என்பது மிகச்சிறிய மற்றும் திறம்பட செயல்படும் ஒரு தீர்வாகும். இது Python-ல் இயங்குகிறது, இதற்கு database தேவையில்லை, மேலும் தரவுகள் அனைத்தும் சாதாரண கோப்புகளாக (plain files) ஒரு கோப்புறையில் சேமிக்கப்படும். ஒரு வீட்டு உபயோகக் காலண்டருக்கு இதற்கு மேல் எதுவும் தேவையில்லை என்பதாலும், அதிகாலை மூன்று மணிக்கு இதில் கோளாறுகள் ஏற்படுவதற்கான வாய்ப்புகள் மிகக் குறைவு என்பதாலும் இந்த வழிகாட்டி இதைப் பயன்படுத்துகிறது.
Baikal என்பது இணைய அடிப்படையிலான நிர்வாகக் குழுவைக் (web admin panel) கொண்ட ஒரு விருப்பமாகும். இது PHP மற்றும் sabre/dav library-ல் இயங்குகிறது. இது பயனர்கள் மற்றும் காலண்டர்களை SQLite அல்லது MySQL-ல் சேமிக்கிறது. command line-க்கு பதிலாக browser மூலமாகவே புதிய நபர்களைச் சேர்க்க இது அனுமதிக்கிறது. கணக்குகள் அடிக்கடி உருவாக்கப்படும் அல்லது நீக்கப்படும் சூழலில் இதைத் தேர்ந்தெடுக்கவும்.
Nextcloud என்பது காலண்டர் ஒரு அங்கமாக மட்டுமே தேவைப்படும்போது பொருத்தமானதாகும். இதில் காலண்டர், தொடர்புகள் (contacts), கோப்புகள் மற்றும் mobile app ஆகிய வசதிகள் கிடைக்கும். ஆனால் இதற்கு ஈடாக PHP-FPM, ஒரு database மற்றும் background job runner ஆகியவற்றை நீங்கள் பராமரிக்க வேண்டும். இது உங்கள் தேவைக்கு மிக அதிகப்படியானதாகத் தோன்றினால், இலகுவான Nextcloud மாற்றுகள் குறித்த தகவல்களைப் பார்க்கவும். மேலும், மக்கள் Nextcloud-ஐ நிறுவுவதற்கான மற்றொரு முக்கிய காரணமான self-hosted file sync வசதி குறித்தும் தெரிந்துகொள்ளலாம்.
DAViCal என்பது நீண்டகாலமாகப் பயன்பாட்டில் உள்ள PostgreSQL அடிப்படையிலான விருப்பமாகும். நீங்கள் ஏற்கனவே PostgreSQL-ஐப் பயன்படுத்தி, காலண்டர் தரவுகளையும் அதிலேயே சேமிக்க விரும்பினால் மட்டுமே இதைப் பரிசீலிக்கலாம்.
Ubuntu 24.04-ல் Radicale-ஐ நிறுவுதல்
ஆகஸ்ட் 2026 நிலவரப்படி, Radicale 3.5.10 தற்போதைய release ஆகும். இதை அதன் சொந்த virtual environment-ல் நிறுவவும்.
sudo apt update
sudo apt install -y python3-venv apache2-utils nginx
sudo useradd --system --user-group --home-dir / --shell /usr/sbin/nologin radicale
sudo install -d -o radicale -g radicale -m 750 /var/lib/radicale/collections
sudo install -d -m 750 -o root -g radicale /etc/radicale
sudo python3 -m venv /opt/radicale/venv
sudo /opt/radicale/venv/bin/pip install --upgrade radicaleVirtual environment என்பது ஒரு விருப்பத்தேர்வு அல்ல. system Python-ல் sudo pip install radicale செய்வது error: externally-managed-environment பிழையுடன் நின்றுவிடும், ஏனெனில் Ubuntu அதன் Python-ஐ apt மூலம் நிர்வகிக்கிறது, எனவே pip-ஆல் packaged கோப்புகளை மேலெழுத முடியாது.
/etc/radicale/config-ஐ எழுதவும்:
[server]
hosts = 127.0.0.1:5232
[auth]
type = htpasswd
htpasswd_filename = /etc/radicale/users
htpasswd_encryption = autodetect
[storage]
filesystem_folder = /var/lib/radicale/collectionshosts வேண்டுமென்றே loopback-ல் பிணைக்கப்பட்டுள்ளது (bind). nginx TLS termination-ஐச் செய்து அந்த port-க்கு forwarding செய்கிறது, எனவே Radicale நேரடியாக இணையத்தை எதிர்கொள்வதில்லை. 0.0.0.0:5232-ன் upstream உதாரணம் கடவுச்சொற்களை ஏற்கும் ஒரு unencrypted சேவையை வெளியிடுகிறது, இதுவே இங்கு முக்கியமான தவறு.
இப்போது கணக்குகள். -5 SHA-512 crypt-ஐத் தேர்ந்தெடுக்கிறது, இதை Radicale எந்த கூடுதல் module-ம் இன்றி htpasswd_encryption = autodetect மூலம் படிக்கிறது:
sudo htpasswd -5 -c /etc/radicale/users you
sudo htpasswd -5 /etc/radicale/users partner
sudo chown root:radicale /etc/radicale/users
sudo chmod 640 /etc/radicale/users-c கோப்பை உருவாக்கி, அதில் உள்ளவற்றை நீக்கிவிடும் (truncate). இதை முதல் பயனருக்கு மட்டும் பயன்படுத்தவும். சில மாதங்களுக்குப் பிறகு மீண்டும் htpasswd -5 -c-ஐ இயக்கினால், முதல் பயனருக்குப் பிறகு சேர்க்கப்பட்ட அனைத்து கணக்குகளும் நீக்கப்படும்; இதன் அறிகுறி என்னவென்றால், ஒருவர் மட்டும் சரியாக sync செய்வார், மற்ற அனைவருக்கும் முடிவில்லாத கடவுச்சொல் prompt வரும். Bcrypt-ம் வேலை செய்யும், அதற்கு radicale[bcrypt] என்ற கூடுதல் நிறுவல் தேவை.
Radicale ஆவணத்தில் உள்ள unit-ஐ அடிப்படையாகக் கொண்டு /etc/systemd/system/radicale.service-ஐ உருவாக்கவும்:
[Unit]
Description=CalDAV and CardDAV server
After=network.target
Requires=network.target
[Service]
ExecStart=/opt/radicale/venv/bin/python -m radicale
Restart=on-failure
User=radicale
UMask=0027
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
PrivateDevices=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
NoNewPrivileges=true
ReadWritePaths=/var/lib/radicale/
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now radicale
curl -i http://127.0.0.1:5232/சரியான முடிவு 401 Unauthorized மற்றும் WWW-Authenticate header ஆகும்: சேவை listening நிலையில் உள்ளது மற்றும் authentication இயக்கத்தில் உள்ளது. Connection refused என்பது அது தொடங்கவே இல்லை என்று பொருள், journalctl -u radicale -n 50 அது நிராகரித்த விருப்பத்தை (option) குறிப்பிடுகிறது. ProtectSystem=strict இந்தச் சேவைக்காக filesystem-ஐ read-only நிலையில் mount செய்கிறது, எனவே ReadWritePaths=/var/lib/radicale/ என்பது அது ஒரு நிகழ்வைச் (event) சேமிக்க அனுமதிக்கும் வரியாகும். அந்த வரியை நீக்கினால், வாசிப்பு (reads) தொடர்ந்து வேலை செய்யும், ஆனால் அனைத்து எழுதும் (write) செயல்பாடுகளும் தோல்வியடையும்.
TLS கட்டாயமானது, ஏனெனில் வாடிக்கையாளர்கள் plaintext-ஐ ஏற்க மறுக்கிறார்கள்
CalDAV, HTTP Basic மூலம் அங்கீகாரம் செய்கிறது. இது ஒவ்வொரு கோரிக்கையிலும் user:password base64 குறியீட்டை அனுப்புகிறது. Base64 என்பது ஒரு குறியீட்டு முறை, அது மறைகுறியாக்கம் (encryption) அல்ல. சாதாரண HTTP மூலம் அனுப்பும்போது, உங்கள் கடவுச்சொல் தொலைபேசிக்கும் server-க்கும் இடையில் உள்ள அனைத்து network-களுக்கும் பகிரப்படுகிறது. ஒவ்வொரு முறை ஒத்திசைக்கும்போதும் (sync) இது நிகழ்கிறது.
வாடிக்கையாளர் மென்பொருள்கள் உங்களுக்காக இதை அமல்படுத்துகின்றன. Radicale ஆவணங்களின்படி, macOS Calendar.app பாதுகாப்பற்ற HTTP மூலம் கடவுச்சொற்களை அனுப்ப மறுக்கலாம்; iOS-ம் இதேபோல் செயல்படும். கணக்கு சரியாக உள்ளமைக்கப்பட்டது போலத் தோன்றும், ஆனால் எந்த பிழைச் செய்தியும் இன்றி ஒத்திசைவு நடைபெறாது.
முதலில் cal.example.com-க்கான A record-ஐ VPS-க்குச் சுட்டிக்காட்டவும், ஏனெனில் certificate authority இதைச் சரிபார்க்கும். பிறகு /etc/nginx/sites-available/cal.example.com-ஐ உருவாக்கவும்:
server {
listen 80;
server_name cal.example.com;
location / {
proxy_pass http://localhost:5232/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_pass_header Authorization;
}
location = /.well-known/caldav { return 301 https://$host/; }
location = /.well-known/carddav { return 301 https://$host/; }
}நான்கு proxy header வரிகள் Radicale ஆவணங்களிலிருந்து பெறப்பட்டவை. அவற்றை அப்படியே வைத்திருக்கவும்.
sudo ln -s /etc/nginx/sites-available/cal.example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d cal.example.com
curl -i -u you https://cal.example.com/nginx -t கட்டளை syntax is ok மற்றும் test is successful ஆகியவற்றை அச்சிடும். அது முடிந்த பிறகு மட்டுமே reload செய்யவும். தவறான கோப்புடன் reload செய்தால், பழைய உள்ளமைவே இயங்கும் மற்றும் அடுத்த restart வரை பிழை கண்டறியப்படாது. Certbot தளக் கோப்பை நேரடியாகத் திருத்தும்: அது certificate-ஐ நிறுவி, தொகுதியை port 443-க்கு மாற்றி, port 80-லிருந்து redirect-ஐச் சேர்க்கும். இறுதி curl கட்டளை கடவுச்சொல்லைக் கேட்கும், அது Radicale-ன் சொந்த web interface-ஐ 200 எனத் திருப்பி அனுப்ப வேண்டும். 502 Bad Gateway என்பது nginx இயங்குகிறது, ஆனால் Radicale 5232 port-ல் கேட்கவில்லை என்பதைக் குறிக்கிறது.
தொலைபேசியில் கணக்கைச் சேர்க்கும்போது ஏன் தோல்வியடைகிறது?
இதற்குக் காரணம் discovery ஆகும். ஒரு client எவ்வாறு hostname-ஐ calendar URL-ஆக மாற்றுகிறது என்பதை RFC 6764 விவரிக்கிறது. இது முதலில் ஒரு _caldavs._tcp SRV record-ஐத் தேடுகிறது, பின்னர் https://cal.example.com/.well-known/caldav-ஐக் கோருகிறது, மேலும் DAV root-க்கு ஒரு redirect கிடைக்கும் என்று எதிர்பார்க்கிறது. அங்கிருந்து அது current-user-principal-ஐக் கேட்கிறது, அதன் பிறகு அந்த principal-ன் calendar-home-set-ஐக் கேட்கிறது, அதன் பின்னரே அது உங்கள் calendar-களைக் கண்டறியும். ஒரு தொலைபேசி server-க்காக ஒரே ஒரு field-ஐ மட்டுமே வழங்குகிறது, எனவே ஒவ்வொரு படியும் தானாகவே செயல்பட வேண்டும்.
curl -sI https://cal.example.com/.well-known/caldavசரியான பதில் location: https://cal.example.com/ header உடன் கூடிய HTTP/2 301 ஆகும். அங்குள்ள ஒரு 404 காரணமாகவே, அதே network-ல் Thunderbird வேலை செய்யும்போது, iOS கணக்குத் தகவலைச் சரிபார்க்க முடியவில்லை என்று கூறுகிறது: Thunderbird நீங்கள் உள்ளிட்ட முழு URL-ஐயும் பயன்படுத்துகிறது, எனவே அதற்கு redirect தேவைப்படுவதில்லை.
Redirect இலக்கு server-ஐப் பொறுத்தது. தளத்தின் root-ல் இயங்கும் Radicale, /-க்கு redirect செய்கிறது. Baikal, /dav.php-க்கு 308 status உடன் redirect செய்யும் sample rules-ஐ வழங்குகிறது. Nextcloud, /remote.php/dav/-க்கு redirect செய்கிறது.
Calendar-களை உருவாக்குதல் மற்றும் உங்கள் துணையுடன் ஒன்றைப் பகிர்தல்
பல client-கள் calendar-ஐ உருவாக்க முடியாது, அவை ஏற்கனவே உள்ள ஒன்றிற்கு subscribe மட்டுமே செய்ய முடியும். ஒரு browser-ல் https://cal.example.com/-ஐத் திறந்து, you-ஆக login செய்து, அங்கு calendar-ஐ உருவாக்கவும். வட்டில் (disk) அது /var/lib/radicale/collections/collection-root/you/-ன் கீழ் சேமிக்கப்படும், அங்கு folder பெயருக்காக ஒரு identifier உருவாக்கப்படும்.
Radicale-ன் இயல்புநிலை rights backend owner_only ஆகும்: ஒரு authenticated account தனது சொந்த collection-களை மட்டும் /USERNAME/-ன் கீழ் படிக்கவும் எழுதவும் முடியும், மற்றவற்றை அணுக முடியாது. பெரும்பாலான இல்லங்களுக்கு இதுவே சரியான அமைப்பாகும், மேலும் ஒரு calendar-ஐப் பகிர்வதற்கான எளிமையான வழி மூன்றாவது account-ஐப் பயன்படுத்துவதாகும். household-ஐ htpasswd மூலம் உருவாக்கி, அந்த login-ன் கீழ் பகிரப்பட்ட calendar-ஐ உருவாக்கி, ஒவ்வொரு சாதனத்திலும் இரண்டாவது CalDAV account-ஆக அதைச் சேர்க்கவும். இது iOS உட்பட அனைத்து client-களிலும் வேலை செய்யும், ஏனெனில் அந்த calendar அந்த account-ன் சொந்த home-ல் உள்ளது.
உங்களுக்குக் கூடுதல் கட்டுப்பாடு தேவைப்படும்போது, rule-based rights-க்கு மாறவும். இதை /etc/radicale/config-ல் சேர்க்கவும்:
[rights]
type = from_file
file = /etc/radicale/rightsபின்பு, Radicale ஆவணத்தில் உள்ள உதாரணத்தின் அடிப்படையில் /etc/radicale/rights-ஐ அமைக்கவும்:
[root]
user: .+
collection:
permissions: R
[principal]
user: .+
collection: {user}
permissions: RW
[own-calendars]
user: .+
collection: {user}/[^/]+
permissions: rw
[shared-household]
user: you|partner
collection: you/2f0a9c1e-1f4c-4c2b-9a1b-0d2f7a5c9e11
permissions: rwபெரிய எழுத்துக்களும் சிறிய எழுத்துக்களும் வெவ்வேறு அர்த்தங்களைக் கொண்டுள்ளன. R மற்றும் W என்பவை calendar அல்லது address book அல்லாத collection-களைப் படிக்கவும் எழுதவும் பயன்படுகின்றன, இதுவே principal folder ஆகும். r மற்றும் w என்பவை calendar-களைப் படிக்கவும் எழுதவும் பயன்படுகின்றன. அந்த identifier-க்கு பதிலாக மேலே உள்ள storage path-ல் உள்ள உங்கள் calendar-ன் உண்மையான folder பெயரை இடவும்.
ஒரு முக்கிய வரம்பு: calendar home-ஐ மட்டும் படிக்கும் ஒரு client, மற்றொரு பயனர் பாதையில் உள்ள calendar-ஐக் காட்டாது, ஏனெனில் discovery அந்தப் பாதைக்குச் செல்லாது. Thunderbird மற்றும் DAVx⁵ ஆகியவற்றில் முழு URL-ஐக் கொண்டு அதைச் சேர்க்க முடியும். iOS-ல் இதைச் செய்ய முடியாது, அதனால்தான் பகிரப்பட்ட account முறை எப்போதும் வேலை செய்யும் தீர்வாக உள்ளது.
Clients-ஐ அமைத்தல், ஏனெனில் self-hosted calendar-கள் தோல்வியடைவது இங்குதான்
iPhone மற்றும் iPad. Settings-ஐத் திறந்து, பின் Calendar (சமீபத்திய iOS பதிப்புகளில் Apps-ன் கீழ் இருக்கும்), Calendar Accounts, Add Account, Other, Add CalDAV Account ஆகியவற்றைத் தேர்ந்தெடுக்கவும். Server என்பது cal.example.com, அதைத் தொடர்ந்து பயனர் பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும். Description என்பது ஒரு பெயர்ப்பலகை மட்டுமே. சேமிக்க மறுத்தால், கணக்கை மீண்டும் திறக்கவும்: advanced view-ல் Use SSL, port மற்றும் முழுமையான account URL ஆகியவை இருக்கும்; URL-ஐ நகலெடுத்து ஒட்டுவது discovery செயல்முறையைத் தவிர்க்க உதவும்.
Android. இதில் உள்ளமைக்கப்பட்ட CalDAV client கிடையாது. F-Droid அல்லது Google Play-லிருந்து DAVx⁵-ஐ நிறுவவும். https://cal.example.com/ என்ற base URL மற்றும் உங்கள் பயனர் பெயரைப் பயன்படுத்தி ஒரு கணக்கைச் சேர்க்கவும், பின் உங்களுக்குத் தேவையான calendar-களைத் தேர்ந்தெடுக்கவும். DAVx⁵ தகவல்களை Android calendar provider-ல் எழுதும், எனவே நீங்கள் ஏற்கனவே பயன்படுத்தும் எந்தவொரு calendar app-லும் நிகழ்வுகள் தோன்றும்.
Thunderbird. New Calendar, On the Network என்பதைத் தேர்ந்தெடுத்து, உங்கள் பயனர் பெயர் மற்றும் https://cal.example.com/ என்ற இருப்பிடத்தை உள்ளிடவும். அது கண்டறியப்பட்டவற்றைப் பட்டியலிட்டு, எந்தெந்த calendar-களைச் சேர்க்க வேண்டும் என்று கேட்கும்.
macOS. System Settings, Internet Accounts, Add Other Account, CalDAV என்பதற்குச் செல்லவும். Account Type-ஐ Manual என அமைத்து, அதே பயனர் பெயர், கடவுச்சொல் மற்றும் server முகவரியை உள்ளிடவும்.
CalDAV என்பது ஒரு polling protocol ஆகும். இதன் விவரக்குறிப்பில் (specification) push வசதி இல்லை, எனவே லேப்டாப்பில் நீங்கள் சேர்க்கும் ஒரு நிகழ்வு, அதே நொடியில் போனுக்கு வராது; அடுத்த sync-ன் போதுதான் வரும். ஒவ்வொரு client-லும் உங்களுக்கு ஏற்ற sync இடைவெளியை (interval) அமைக்கவும். போனில் மிகக் குறுகிய இடைவெளியை அமைப்பது battery பயன்பாட்டை அதிகரிக்கும் என்பதை நினைவில் கொள்ளவும்.
கோப்புகளை மட்டும் கொண்ட store-ஐ காப்புப்பிரதி எடுத்தல்
Radicale-ல் உங்கள் காலண்டர் என்பது .ics கோப்புகளின் ஒரு கோப்பகம் (directory) ஆகும். ஒவ்வொரு நிகழ்வும் ஒரு கோப்பாக இருக்கும், மேலும் ஒவ்வொரு தொகுப்பிற்கும் ஒரு சிறிய properties கோப்பு இருக்கும். ஒரு கோப்பகத்தை நகலெடுக்கும் எந்தவொரு முறையும் அதை காப்புப்பிரதி எடுக்கும். காப்புப்பிரதி உண்மையான நிகழ்வுகளைக் கொண்டுள்ளதா என்பதை உறுதிப்படுத்த, அதை நீங்கள் less மூலம் திறந்து பார்க்கலாம். படிக்க முடியாத database dump-ஐ விட இது ஒரு உண்மையான நன்மையாகும்.
sudo systemctl stop radicale
sudo tar czf /root/radicale-$(date +%F).tar.gz -C /var/lib/radicale collections
sudo systemctl start radicaleகாப்பகம் (archive) உருவாக்கப்படும் சில நொடிகள் மட்டும் service-ஐ நிறுத்தவும். அப்போதுதான் கோப்புகள் வாசிக்கப்படும்போது எந்தவொரு client-ம் பாதியில் எழுதும் பணியில் இருக்காது. அதன் பிறகு காப்பகத்தை அந்த server-லிருந்து வெளியே நகலெடுக்கவும். ஏனெனில், அதே VPS-ல் இருக்கும் காப்புப்பிரதி, நீங்கள் எதிர்பார்க்கும் தோல்வியின் போது பாதுகாப்பாக இருக்காது. மீட்டெடுப்பது என்பது இதற்கு நேர்மாறானது: கோப்புகளைப் பிரித்தெடுத்து, sudo chown -R radicale:radicale /var/lib/radicale/collections செய்து, பின் service-ஐத் தொடங்கவும். ஒவ்வொரு client-ம் தனது காலண்டர்களின் உள்ளூர் நகலை வைத்திருக்கும். எனவே, தோல்விக்குப்பின் sync செய்யப்படாத ஒரு மடிக்கணினி உங்கள் தரவின் இரண்டாவது நகலாகச் செயல்படும்.
Baikal அல்லது Nextcloud - எது சிறந்தது
Baikal 0.12.1, 5 August 2026 அன்று வெளியிடப்பட்டது. இதற்கு PHP 8.2 அல்லது அதற்குப் பிந்தைய பதிப்பு தேவை. இதை web root-க்கு வெளியே பிரித்தெடுத்து, அதன் html கோப்பகத்தை மட்டும் வெளிப்படுத்தவும்:
sudo apt install -y php-fpm php-sqlite3 php-xml php-mbstring php-curl unzip
cd /tmp
curl -LO https://github.com/sabre-io/Baikal/releases/download/0.12.1/baikal-0.12.1.zip
sudo unzip -q baikal-0.12.1.zip -d /srv
sudo chown -R www-data:www-data /srv/baikal/Specific /srv/baikal/configஇந்த இரண்டு கோப்பகங்கள் மட்டுமே web server-ஆல் எழுதப்படக்கூடியவை, எனவே மற்ற எதற்கும் எழுதும் அனுமதி (writable) தேவையில்லை. உங்கள் nginx server block-க்குள், Baikal-க்கான குறிப்பிட்ட பகுதிகள் இவை:
root /srv/baikal/html;
index index.php;
location ~ /(\.ht|Core|Specific|config) { deny all; }
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location = /.well-known/caldav { return 308 /dav.php; }
location = /.well-known/carddav { return 308 /dav.php; }nginx-ஐ reload செய்யவும், உலாவியில் (browser) தளத்தைத் திறக்கவும். setup wizard, admin கணக்கையும் SQLite database-ஐயும் உருவாக்கும். client setup, Radicale-ஐப் போலவே இருக்கும். https://cal.example.com/ என்பதை server முகவரியாகப் பயன்படுத்தவும், ஏனெனில் well-known விதி discovery-ஐ /dav.php-க்கு அனுப்புகிறது.
ஒரே login-ல் கோப்புகள் மற்றும் phone app ஆகியவையும் தேவைப்பட்டால் மட்டுமே Nextcloud-ஐப் பயன்படுத்துவது பயனுள்ளது. அதன் DAV root /remote.php/dav/ ஆகும், மேலும் அதே discovery விதிகள் இதற்கும் பொருந்தும். இவற்றில் எதை இயக்கினாலும், service-ஐ container-ல் இயக்குவது உங்கள் host-ல் PHP பதிப்புகள் குழப்பமடையாமல் இருக்க உதவும்: Docker Compose on a VPS என்பது compose கோப்பு மற்றும் அதற்கு முன்னால் உள்ள reverse proxy பற்றிய தகவல்களை வழங்குகிறது. மேலும், what is worth self-hosting in 2026 என்பது நீங்கள் எந்த அளவுக்கு இந்தத் தொழில்நுட்பத்தில் ஈடுபடலாம் என்பதைத் தீர்மானிக்க உதவும் ஒரு சிறந்த இடமாகும்.
தோல்வி முறைகள் மற்றும் நீங்கள் காணும் சரங்கள் (strings)
ஒவ்வொரு sync-ம் 401 பிழையைத் தருகிறது. ஒன்று, password கோப்பில் உள்ள கணக்குகள் இரண்டாவது htpasswd -c-ஆல் நீக்கப்பட்டிருக்கலாம், அல்லது radicale பயனரால் அதை வாசிக்க முடியவில்லை. sudo -u radicale cat /etc/radicale/users மூலம் சரிபார்க்கவும்; அங்கே permission denied என்று வந்தால் அதுவே காரணம். இதற்கு radicale குழுவைச் சேர்த்து, mode 640-க்கு மாற்ற வேண்டும். Radicale இயல்பாகவே ஒவ்வொரு தோல்வியுற்ற login-க்கு பிறகும் ஒரு வினாடி காத்திருக்கும், எனவே பழைய கடவுச்சொல்லைக் கொண்ட client, நிராகரிக்கப்பட்டதை விட மெதுவாகச் செயல்படுவது போலத் தோன்றும்.
PROPFIND-க்கு nginx 405 பிழையைத் தருகிறது. அந்த URL ஒரு static கோப்பாக வழங்கப்படுகிறது, எனவே WebDAV முறை Radicale-ஐச் சென்றடையவில்லை. endpoint-ஐ நேரடியாகச் சோதிக்கவும்:
curl -u you -X PROPFIND -H "Depth: 0" -i https://cal.example.com/you/சரியாகச் செயல்படும் DAV collection 207 Multi-Status என்று பதிலளிக்கும். வேறு ஏதேனும் வந்தால், கோரிக்கை web server-லேயே நின்றுவிட்டது என்று பொருள்.
Browser-ல் சரியாக வேலை செய்கிறது, ஆனால் போனில் கணக்கைச் சரிபார்க்க முடியவில்லை. இதற்கு இரண்டு பொதுவான காரணங்கள் உள்ளன. ஒன்று, well-known redirect விடுபட்டிருக்கலாம், இதை மேலே உள்ள curl மூலம் சோதிக்கலாம். அல்லது certificate chain முழுமையற்றதாக இருக்கலாம்; browsers விடுபட்ட intermediate certificate-ஐத் தாமாகவே பதிவிறக்கிச் சரிசெய்துவிடும், ஆனால் iOS அவ்வாறு செய்யாது. shell மூலம் சரிபார்க்கவும்:
openssl s_client -connect cal.example.com:443 -servername cal.example.com </dev/nullVerify return code: 0 (ok) உள்ளதா என்று பார்க்கவும். அது தோல்வியுற்றால், nginx config cert.pem-ஐச் சுட்டிக்காட்டுகிறது, அது fullchain.pem-ஐச் சுட்டிக்காட்ட வேண்டும்.
Import செய்த பிறகு நிகழ்வுகள் (events) நகல்களாகத் தோன்றுகின்றன. ஒவ்வொரு நிகழ்வும் ஒரு UID-ஐக் கொண்டிருக்கும், அதைத்தான் clients அடையாளமாக எடுத்துக்கொள்ளும். ஒரே கோப்பை, identifiers-ஐ மாற்றும் ஒரு கருவி மூலம் இருமுறை import செய்தால், இரண்டு தனித்தனி நிகழ்வுகள் உருவாகும்; அவற்றை எதனாலும் இணைக்க முடியாது. ஒரு சாதனத்தில் உள்ள கூடுதல் நகல்களை நீக்கிவிட்டு, அந்த நீக்கம் sync ஆகுமாறு செய்யவும்.
Reboot செய்த பிறகு அனைத்தும் வேலை செய்வதை நிறுத்திவிடுகிறது. service கைமுறையாகத் தொடங்கப்பட்டிருக்கலாம். sudo systemctl is-enabled radicale கட்டளை disabled என்று காட்டினால், sudo systemctl enable --now radicale கட்டளை அதை நிரந்தரமாகச் சரிசெய்யும்.
FAQ
சுய-வழங்கி (self-hosted) CalDAV server-க்கு TLS அவசியமா?
ஆம். CalDAV, HTTP Basic மூலம் அங்கீகாரம் (authentication) செய்கிறது. இதனால் கடவுச்சொல் ஒவ்வொரு கோரிக்கையிலும் base64 குறியாக்கத்துடன் அனுப்பப்படுகிறது, மேலும் base64-ஐ எளிதாக மீட்க முடியும். வாடிக்கையாளர் மென்பொருள்களும் (clients) இதை வலியுறுத்துகின்றன: macOS Calendar.app பாதுகாப்பற்ற HTTP வழியாக நற்சான்றிதழ்களை (credentials) அனுப்ப மறுக்கலாம்; iOS-ம் அதேபோல் செயல்படும், இதனால் கணக்கு சேமிக்கப்பட்டது போலத் தெரிந்தாலும், அது ஒருபோதும் ஒத்திசைக்கப்படாது (sync). sudo certbot --nginx -d cal.example.com என்பது முழுமையான தீர்வாகும்.
Thunderbird-ல் வேலை செய்யும் கணக்கு, ஏன் எனது தொலைபேசியில் சேர்ப்பதற்குத் தோல்வியடைகிறது?
Thunderbird நீங்கள் உள்ளிட்ட முழு URL-ஐயும் பயன்படுத்துகிறது. தொலைபேசியில் ஒரு server புலம் மட்டுமே இருப்பதால், அது RFC 6764 கண்டுபிடிப்பு முறையைப் பின்பற்றுகிறது: அது https://cal.example.com/.well-known/caldav-ஐக் கோருகிறது மற்றும் DAV root-க்கு ஒரு redirect-ஐ எதிர்பார்க்கிறது. அந்த redirect இல்லையென்றால், தொலைபேசி 404 பிழையைப் பெற்று, கணக்கைச் சரிபார்க்க முடியவில்லை என்று தெரிவிக்கும். nginx-ல் location = /.well-known/caldav { return 301 https://$host/; }-ஐச் சேர்க்கவும், பின்னர் curl -sI https://cal.example.com/.well-known/caldav மூலம் உங்களுக்கு 301 மற்றும் location header கிடைக்கிறதா என்பதை உறுதிப்படுத்தவும்.
இருவர் ஒரே காலெண்டரைப் பகிர முடியுமா?
ஆம், பகிரப்பட்ட உள்நுழைவு (shared login) முறையே நம்பகமானது. htpasswd மூலம் மூன்றாவது கணக்கை உருவாக்கி, பகிரப்பட்ட காலெண்டரை அதன் கீழ் வைக்கவும், பின்னர் ஒவ்வொரு சாதனத்திலும் அதை இரண்டாவது CalDAV கணக்காகச் சேர்க்கவும். Radicale-ன் உரிமைகள் கோப்பு (rights file), ஒரு பயனர் மற்றொரு பயனரின் பாதையில் உள்ள தொகுப்பை வாசிக்கவும் எழுதவும் அனுமதி வழங்கலாம். ஆனால், தனது சொந்த காலெண்டரை மட்டும் வாசிக்கும் வாடிக்கையாளர் மென்பொருள் அதை ஒருபோதும் காட்டாது, எனவே அந்த முறை iOS-ஐ விட Thunderbird மற்றும் DAVx⁵-க்கு ஏற்றது.
VPS செயலிழந்தால் எனது நிகழ்வுகள் (events) என்னவாகும்?
Radicale-ல் தரவு சாதாரண உரையாக (plain text) இருக்கும்: ஒவ்வொரு நிகழ்வும் /var/lib/radicale/collections/collection-root/-ன் கீழ் ஒரு .ics கோப்பாகச் சேமிக்கப்படும். இதை tar மூலம் காப்புப்பிரதி (backup) எடுக்கலாம் மற்றும் less மூலம் வாசிக்கலாம். மீட்டமைக்க, கோப்புகளைப் பிரித்தெடுத்து, chown -R radicale:radicale செய்து, சேவையைத் தொடங்கவும். ஒத்திசைக்கப்பட்ட ஒவ்வொரு வாடிக்கையாளர் மென்பொருளும் உள்ளூர் நகலை வைத்திருக்கும், எனவே செயலிழப்புக்கு முன்பு வரை புதுப்பித்த நிலையில் இருந்த மடிக்கணினியில் உங்கள் காலெண்டரின் முழுமையான இரண்டாவது நகல் இருக்கும்.
CalDAV server எனது தொடர்புகளையும் (contacts) ஒத்திசைக்குமா?
தொடர்புகள் CardDAV-ஐப் பயன்படுத்துகின்றன. இது RFC 6352-ல் வரையறுக்கப்பட்ட ஒரு சகோதர நெறிமுறை (sibling protocol), இது நிகழ்வுகளுக்குப் பதிலாக vCard கோப்புகளைச் சேமிக்கிறது. Radicale, Baikal மற்றும் Nextcloud ஆகிய அனைத்தும் ஒரே கணக்கு மற்றும் ஒரே hostname-லிருந்து இதை வழங்குகின்றன. Android-ல், DAVx⁵ ஒரே கணக்கிலிருந்து காலெண்டர்கள் மற்றும் தொடர்புகளை ஒத்திசைக்கிறது. iOS-ல், அதே நற்சான்றிதழ்களுடன் CardDAV வகையிலான இரண்டாவது கணக்கைச் சேர்க்க வேண்டும், இதனால்தான் /.well-known/carddav redirect உங்கள் nginx அமைப்பில் CalDAV-க்கு அருகிலேயே இருக்க வேண்டும்.