अपने डेटा का स्वामित्व, भाग 1: सेल्फ-होस्टेड कैलेंडर समाधान का एकीकरण
(emilygorcenski.com)- बार-बार बिज़नेस ट्रिप/यात्रा और कई time zones में रिश्तों को मैनेज करने की जरूरत साथ आने पर, Big Tech पर निर्भरता घटाने और शेड्यूल डेटा को सीधे नियंत्रित करने वाला अपना कैलेंडर सिस्टम चाहिए था
- नया ढांचा Baïkal CalDAV server को केंद्र में रखता है; Airtrail, IMAP email और language school ICS को इकट्ठा कर CalDAV में डालता है, फिर shared
.icsfile के रूप में दोबारा प्रकाशित करता है - YAML में शेड्यूल लिखकर CI/CD में ICS में बदलने का तरीका prototype के लिए काफी था, लेकिन manual errors और maintenance burden बढ़ने से static file approach को बदलना पड़ा
- Python script हर 15 मिनट में events collect और classify करती है, family और work के लिए अलग-अलग ICS बनाती है, और work calendar में कुछ events को PRIVATE के रूप में mark करती है
- Google Calendar और Google Script केवल work calendar synchronization के लिए इस्तेमाल होते हैं; Airtrail API integration के बाद flight एक बार enter करने पर 15 मिनट के भीतर personal calendar में और 1 घंटे के भीतर work calendar में दिख जाती है
कैलेंडर मैनेजमेंट जटिल क्यों हुआ
- लगातार travel के कारण family, friends और colleagues के लिए मौजूदा time zone या flight में boarded होने की स्थिति जानना मुश्किल था, और कई time zones में appointments मिलाने के लिए लगातार time calculation करनी पड़ती थी
- flights, trains, boarding से पहले block time, और airport transfer time को कई जगह duplicate enter करना पड़ता था, जिससे schedule management का burden बढ़ गया
- मौजूदा calendar ecosystem की असुविधाएं standards, frontend apps और overall user experience तक फैली हुई थीं
- email provider flight calendar items बना भी दे, तो connecting flights छूट सकती हैं या time zone गलत हो सकता है
- बने हुए item का organizer user न होने पर sharing या editing मुश्किल हो सकती है
- जरूरतें सिर्फ simple schedule storage से आगे जाकर sharing और control तक जाती थीं
- event work calendar में blocker के रूप में दिखना चाहिए
- spouse calendar subscribe कर सके
- event input अधिकतम एक बार ही करना पड़े
- कई devices से edit किया जा सके
- data पर direct control होना चाहिए
- work calendar को spouse के साथ share करने का तरीका इस्तेमाल नहीं किया जा सकता
- अतिरिक्त requirements में
.icsemail attachments import करना, language school calendar का HTTP ICS import करना, self-hosted flight tracker Airtrail integration, color distinction, work calendar के लिए private flag, frequent refresh, और arbitrary frontend का use शामिल था
YAML·ICS तरीका जहां सीमा से टकराया
- existing sharing methods अक्सर full functionality देने के लिए common platform या same account environment मांगते थे
- Gmail या Outlook.com ecosystem
- Exchange जैसे same environment में account sharing
- आम workaround दो तरह के थे
- iCal data को HTTP से serve कर read-only calendar publish करना
- iCal
.icsfile को email से भेजना
- शुरुआती version में website के public लेकिन guess करना मुश्किल URL पर
.icsfile upload की जाती थी, और purpose के हिसाब से कई URLs बनाए जाते थे - event data YAML में लिखा जाता था और CI/CD pipeline में छोटे script से ICS file में फिर serialize किया जाता था
- prototype के लिए यह काफी था, लेकिन scale बढ़ने पर YAML को हाथ से लिखने में mistakes बढ़ीं, और जो काम कम effort में खत्म होना चाहिए था वह बोझिल हो गया
CalDAV और Baïkal में बदला हुआ ढांचा
- नए structure ने static files छोड़कर hosted CalDAV based system पर switch किया
- CalDAV, WebDAV distributed authoring specification का extension है, जो calendar applications के लिए जरूरी capabilities देता है
- CalDAV server होने पर चुने हुए frontend app से laptop, phone आदि कई devices पर events देखे और manage किए जा सकते हैं
- authentication के बिना आसानी से subscribe किए जा सकने वाले CalDAV servers बहुत कम थे, इसलिए server को periodically poll करने, events extract करने और website के iCal file के रूप में publish करने वाला script चाहिए था
- पूरा flow इस तरह है
- data sources से events poll करना
- events को programmatically CalDAV में publish करना
- CalDAV से सभी events लाकर
.icsfile के रूप में लिखना .icsfile को HTTP से serve करना
Baïkal installation और client connection
- चुना गया tool Baïkal है, जो calendars और contacts manage करने वाला lightweight self-hosted CalDAV/CardDAV server है
- Docker Compose से
ckulka/baikal:0.9.5image चलाया, ports और local volumes specify किए, औरdocker compose up -dसे start किया - Baïkal MySQL भी use कर सकता है, लेकिन SQLite पर भी चलता है, और SQLite manage करना ज्यादा simple है
- web public access के लिए nginx reverse proxy use किया गया
proxy_passसे local Baïkal port से connect/.well-known/caldavकोdav.phpपर 301 redirect- यह redirect iPhone या Mac Calendar app में add करते समय जरूरी होता है
- TLS Let’s Encrypt और
certbotसे configure किया गया, औरcertbotnginx config files को automatically renew करता है - browser में domain खोलकर admin account बनाया, फिर users और calendars create किए
- macOS और iOS के default Calendar apps से connect किया गया; macOS/iOS settings में automatic या advanced नहीं, बल्कि manual settings इस्तेमाल की गईं
Event classification और work calendar visibility
- iCalendar specification में
EVENTcomponent की optionalCATEGORIESproperty है, लेकिन इस्तेमाल किए गए tools—macOS Calendar, iOS Calendar, Google Calendar—इस field को implement नहीं करते - free-text classification में consistency बनाए रखना मुश्किल है, इसलिए Python enum से event types model किए गए
- उदाहरण:
TerminType,CultureType,SocialType,AwayType,TransportType - इसमें
MEETUP,CONFERENCE,CLASS,APPOINTMENT,MEETING,EXAMजैसी values शामिल हैं
- उदाहरण:
- enum को कई groups में बांटने की वजह conceptually event types को व्यवस्थित करना था
- classification system में work calendar visibility तय करने वाला logic भी शामिल है
- दो-character enum values work calendar में default रूप से private treat होती हैं
- doctor appointment जैसे events अलग work calendar file में private के रूप में serialize होते हैं
- यह classification event searchability और visual पहचान को बेहतर करने, और color distinction support करने वाले frontends में एक नजर में समझने लायक बनाने के लिए इस्तेमाल होती है
Python synchronization script और ICS publishing
- automation के लिए Python script को cron job से जोड़ा गया
- script कई inputs इकट्ठा कर Baïkal में डालता है और फिर shareable ICS के रूप में export करता है
- IMAP से email में events import करना
- Airtrail API से flight events extract करना
- language school hosted ICS files लाना
- collected events को Baïkal में push करना
- Baïkal से सभी events लाकर एक या अधिक shareable ICS files में फिर serialize करना
- IMAP integration email से मिले calendar invites को automatically import कर calendar में add करता है, इसलिए Google Calendar जैसी functionality देता है
- cron entrypoint script family और work के लिए अलग-अलग
Calendarबनाता है, और Baïkal से events लाकर branch processing करता है- family ICS में events add करता है
- work email address event serialization result में न होने पर ही work ICS में add करता है
is_work_publicresult के आधार पर classification कोPUBLICयाPRIVATEset करता है
- Baïkal integration script remote events लाने के लिए
PROPFINDrequests और HTTP Digest authentication use करता है - event description में
CATEGORIES:pattern होने पर description field से category extract करevent.categoriesमें डालता है, और description से वह string remove करता है - sharing के लिए ICS files nginx से ऐसे URLs पर serve की जाती हैं जिन्हें guess करना मुश्किल है; URL random और salted hash string से generate होता है
- यह cron job हर 15 मिनट में चलता है
Work Google Calendar synchronization
- personal calendar में events देखने के अलावा, work calendar में travel/flight schedule block time के रूप में दिखना चाहिए था और colleagues को status पता होना चाहिए था
- work calendar copy के लिए Google Script Engine इस्तेमाल किया गया
- base script GAS-ICS-Sync का modified version है
- modified version calendar
CATEGORIESproperty पढ़ता है और work calendar में color coding apply करता है - Google Script 30 मिनट के interval पर चलता है
- Google Calendar का use Big Tech dependency घटाने के goal से contradiction है, लेकिन इसे work environment की choice माना गया और personal use dependency नहीं माना गया
Operation results और cost
- यह system लगभग 6 महीनों तक छोटे fixes और additions के साथ इस्तेमाल हुआ
- latest change Airtrail API integration है
- flight book करने पर data flight tracker में enter किया जाता है
- 15 मिनट के भीतर personal calendar में add हो जाता है
- 1 घंटे के भीतर work calendar में automatically copy हो जाता है
- complex travel requirements में schedule management time काफी घटा, जिससे quality of life improvement हुआ
- कुल cost minimum रखी जा सकती है, और इसे home NAS पर भी आसानी से चलाया जा सकता है
- फिलहाल website और integrations चलाने के लिए Switzerland में data रखते हुए लगभग 100 dollars प्रति month server time subscribe किया गया है
- यह cost कुछ ज्यादा configured setup है, और समय के साथ optimize करने की योजना है
- VM instance के Docker host पर जल्दी setup कर पाना extra cost के लायक था, और schedule management आसान होने से प्रति month 100 dollars के बराबर समय बच रहा है
1 टिप्पणियां
Hacker News की रायें
विरोध हो सकता है, लेकिन मेरे हिसाब से CalDAV खास अच्छा नहीं है
अगर यह सच में आसान और शानदार होता, तो self-hosted CalDAV solutions कहीं ज़्यादा होते और उनकी usability भी बेहतर होती; Radicale भी मुझे प्रभावशाली नहीं लगा
असल में मुझे सिर्फ अपने लिए एक calendar file उपलब्ध करानी थी, इसलिए मैंने खुद CalDAV server implement करने की कोशिश की, लेकिन एक single file expose करना भी इतना unintuitive और जटिल लगा कि मैंने छोड़ दिया
अगर आपको किसी और के साथ CalDAV-supporting app के जरिए calendar share करना है, तो इसकी ज़रूरत समझ आती है, लेकिन अकेले इस्तेमाल के calendar को host करने के लिए यह लगभग समय की बर्बादी जैसा लगा
इसके बजाय शुरुआत में मैंने dynamically updated iCal file को S3 bucket में डाला और Android पर ICSx5 से sync किया। CalDAV के बिना सिर्फ HTTPS ही काफी था
हालांकि Android के लिए free open-source calendar apps अभी भी कम हैं, और GrapheneOS पर ICSx5 ठीक से नहीं चलता, इसलिए अब मैं लगभग उसी तरीके से Proton Calendar इस्तेमाल कर रहा हूँ, जो iCal file direct link support करता है
iCalendar format इस्तेमाल करने वाला approach अच्छा है, लेकिन अलग-अलग calendar software में iCalendar features support की range बहुत अलग होती है, इसलिए अंत में ज़्यादातर metadata को dedicated properties के बजाय description field में डालना पड़ता है
मेरा use case ऐसा software है जो Eventbrite, Meetup, pub quiz companies, public event calendars आदि कई sites से data लाता है, सिर्फ वे social events filter करता है जिनमें मेरी रुचि है, और उन्हें एक single calendar में merge करता है जिसे मैं अपनी रोज़ इस्तेमाल वाली calendar app में देख सकूँ
ऊपर से Exchange और Google के non-compliant CalDAV servers handle करने में बहुत मेहनत करनी पड़ी, और users उन सभी समस्याओं का दोष हम पर डालते थे
अब Google में काम करके देख रहा हूँ कि gCal apps पूरी तरह अलग protocol इस्तेमाल करती हैं
यह कोई हल्का format नहीं है; इसने एक साथ बहुत सारे काम करने की कोशिश में over-engineering कर दी, और नतीजा अलग-अलग ideas से उलझे हुए बालों के गुच्छे जैसा protocol बना
इसलिए कई services को जो असल में चाहिए, उससे यह बाहर चला जाता है, और वे पूरी specification को पूरी तरह comply करने की कोशिश नहीं करतीं
W3 data format specifications हमेशा कुछ ऐसे ही खत्म होती लगती हैं, जबकि lower-level protocol specifications में यह अपेक्षाकृत कम दिखता है
इसे पढ़े 15 साल तो हो चुके हैं, लेकिन मुझे याद है कि इसमें यह भी कुछ हद तक बताया गया था कि ऐसे protocols design process के दौरान committees में कैसे रास्ता भटक जाते हैं
सिर्फ यह तथ्य कि यह project करीब 2001 में शुरू हुआ था, दिखाता है कि calendar problem कितनी पुरानी सिरदर्द है
अगर आप जानना चाहते हैं कि यह अच्छा क्यों नहीं है, तो recommend करूंगा; और startup व open source की टकराहट, product building, और software development पर भी यह अच्छी कहानी है
http://www.dreamingincode.com/ ; https://en.m.wikipedia.org/wiki/Dreaming_in_Code
Android sync के लिए मैं DAVX5 नाम की open-source non-root app इस्तेमाल करता हूँ, जो background sync service चलाती है, लेकिन setup में बहुत दिक्कतें थीं और यह CalDAV implementations के फर्क की वजह से भी हो सकता है। DAVX5 से ZOHO calendar में sync करने में भी काफी समय लगता है
Ubuntu का Evolution CalDAV support काफी अच्छा देता है, लेकिन mail view और calendar view के बीच switch करते ही पूरा calendar refresh कर देता है। ZOHO calendar refresh में समय लगता है और ZOHO की rate limits भी कड़ी हैं, इसलिए असल में soft block जैसा हो जाता है
नए Thunderbird में एक CalDAV incompatibility है, जहाँ वह अलग HTTP success code expect करता है। ZOHO 200 देता है, लेकिन Thunderbird कोई और code expect करता है। संदर्भ के लिए, Thunderbird CalDAV code JS में लिखा गया है
यह समस्या सिर्फ दूसरे calendar पर होती है, और जैसे ही दूसरा calendar add करते हैं, failure शुरू हो जाता है। कम-से-कम ZOHO पर यह काफी painful है
recommend करने लायक एक और CalDAV server Radicale है
यह Python में लिखा गया है और काफी modular तरीके से design किया गया है, ताकि authentication, authorization आदि के plugins लगाए जा सकें
Data plain text files में store होता है, और मैं उसे git से track व backup करता हूँ
समय के साथ मैंने इसमें कुछ दिलचस्प modifications जोड़े हैं। Authentication host system के pam से handle होता है, और calendar sharing के लिए एक periodic script चलती है जो authorized सभी users के लिए calendar को symbolic link करती है। हालांकि इसमें combinatorial explosion की समस्या है
custom CalDAV properties इस्तेमाल करने वाले authorization plugin और modified web plugin के साथ access control list भी जोड़ी है
Public calendars को ACL के जरिए
publicuser को read permission दी जाती है, और nginx hack से read operations के लिए व्यापक access allow किया जाता हैयह public calendar web calendar में देखा जा सकता है: https://gitlab.nomagic.uk/popi/js_calendar_from_ics
लगता है मुझे इस setup पर एक blog post लिखनी चाहिए
यह वही लेख है जिसकी मुझे ज़रूरत थी
personal server पर मैं Mailcow का SoGO calendar इस्तेमाल करता हूँ, और work calendar के लिए Fastmail, लेकिन दोनों आपस में अच्छी तरह fit नहीं होते
Mailcow calendar को दूसरे tools के साथ ठीक से जोड़ने का तरीका नहीं मिला, इसलिए semi-manual sync करने में समय लगाता हूँ
कुछ समय से calendar को अलग करना चाहता था, लेकिन मुझे जो alternatives पता थे उनमें सिर्फ Nextcloud था, और वह मुझे थोड़ा heavy लगता है
Baïkal अच्छा दिखता है और मैं इसे जल्द आज़माना चाहता हूँ। इससे Mailcow को किसी दूसरी self-hosted mail service से replace करने की संभावना भी explore कर सकूँगा
हाल में मैं काफ़ी आक्रामक तरीके से cloud से बाहर निकल रहा हूँ। सैकड़ों GB डेटा था, लेकिन migration रुक-रुक कर करने पर भी 2 हफ्ते से कम समय लगा, और यह उम्मीद से कहीं बेहतर काम कर रहा है
बाहर outsource की गई सेवा सिर्फ़ email है, क्योंकि मुझे MX records और IMAP/SMTP संभालना पसंद नहीं है
बाकी चीज़ों में dual-core Celeron CPU वाला Asus PN40 बहुत काम आया। इसकी accessibility अच्छी है और इसमें M.2 NVME व SATA drive slots हैं, जिससे एक ही जगह सुरक्षित backup setup बनाना संभव होता है
मैं मानता हूँ कि CalDAV थोड़ा संदिग्ध लगता है, लेकिन Nextcloud ने मेरी ज़्यादातर ज़रूरतें पूरी कर दीं। Redis जोड़ने पर भी कुछ operations धीमे हो सकते हैं, लेकिन calendar, Dropbox/Google Drive के विकल्प, documents, photos, backups और automatic sync तक यह अच्छी तरह संभालता है
इसके साथ कई open source solutions जोड़ दें तो music/video streaming, monitoring, notifications, VPN, reader, admin tools और तमाम utilities तक सब हल हो जाता है
यह mini PC performance में कमज़ोर है, फिर भी ISP शानदार होने से काफ़ी headroom बचाते हुए सब कुछ संभाल लेता है, और मेरे जैसे 5-6 लोग और जोड़ दिए जाएँ तो भी मुश्किल नहीं होगी
लगता है पुरानी चीज़ फिर से नई हो रही है
2000s की शुरुआत में मैंने Mozilla Sunbird से अपने निजी Win2k server के IIS WebDAV module के ज़रिए calendar host किया था
CardDAV शायद तब नहीं था, लेकिन मैं गलत भी हो सकता हूँ
आखिरकार वह सारा डेटा Google Calendar में import कर लिया, और बहुत पीछे तक जाएँ तो university assignments जैसी चीज़ें भी बची हैं, जो काफ़ी मज़ेदार है
कुछ appointments server पर upload नहीं हुईं और खो गईं; मैंने इसे DAViCal server के साथ CalDAV के रूप में इस्तेमाल किया था
Sunbird बंद हो गया, और Windows पर चलने लायक कोई ठीक alternative है या नहीं, मैंने हाल में नहीं देखा
Baikal दिलचस्प लग रहा है
पहले Apple iOS devices के बीच calendar share करने के लिए DAViCal इस्तेमाल किया था। जब चलता था तो अच्छा चलता था, लेकिन iOS version बदलने के साथ यह unstable होने लगा लगता था, इसलिए आखिरकार छोड़ दिया
कभी फिर से देखना हुआ तो DAViCal और Radicale के साथ अब Baikal को भी देखूँगा
https://www.davical.org/
https://radicale.org/v3.html
हाल में Nextcloud पर shift किया, क्योंकि shared hosting में deployment वे संभालते हैं और integrated web UI होने से setup का बोझ बहुत कम हो गया
मैं Baikal कई सालों से इस्तेमाल कर रहा हूँ और यह काफ़ी solid है। हालांकि मैं अकेला इस्तेमाल करता हूँ और मूल पोस्ट की सारी requirements मेरे पास नहीं हैं
desktop पर Thunderbird के built-in calendar से connect करता हूँ, और phone पर F-Droid के DAVx5 और Fossify Calendar का इस्तेमाल करता हूँ
Fossify Calendar, Simple Mobile Tools के Calendar app से fork हुआ है, लेकिन नाम के उलट अब तक देखे calendar apps में सबसे feature-rich है
मुझे इसकी यह simplicity पसंद है कि कई menus और dialogs में घुसवाने के बजाय सारे options सीधे दिखा देता है
ऑफिस में Outlook और घर पर Google Calendar इस्तेमाल करता हूँ, लेकिन HTTP से sync करने पर यह पूरी तरह unreliable है
लगता है time zones को लगातार खराब कर देता है; कभी UTC में publish करता है और कभी नहीं, इसलिए meeting times हमेशा गलत हो जाते हैं
समझ नहीं आता कि ये दो बड़े providers इतनी basic functionality क्यों ठीक नहीं कर पाते
अगर अपना system इस्तेमाल करने से यह हल हो जाए तो मैं तुरंत करूँगा, लेकिन डर है कि Outlook में बनाई meeting import होने पर वही 2 घंटे का अंतर न आ जाए
साथ ही कई कंपनियाँ data leak issues की वजह से personal calendar और work calendar के बीच sync को वास्तव में प्रतिबंधित करती हैं
मैं ऐसा photos के लिए भी करना चाहता हूँ। Dropbox और Google से कुछ समय से बाहर निकलना चाहता हूँ, और priorities दो हैं
पहला, अपनी photos से memories जैसी सुविधा बनाकर phone पर भेजना चाहता हूँ। जैसे anniversaries, मिलती-जुलती activities,
मैं और X(X यानी spouse, family, friends आदि), समय के साथ बदलाव जैसे criteria के आधार पर groupingदूसरा, device से ली गई photos मेरे server पर store हो सकनी चाहिए
अलग-अलग जगहों पर 2TB space वाली 3 TrueNAS machines तैयार कर रखी हैं, और यह feature धीरे-धीरे बनाना चाहता हूँ
https://www.synology.com/en-global/dsm/feature/photos
https://www.synology.com/en-global/dsm/feature/moments
एक और तरीका यह है कि server के बिना DecSync इस्तेमाल किया जाए
Thunderbird या Evolution, Android app के साथ sync करते हैं, और calendar, contacts, tasks, RSS तक दूसरे peers पर replicate हो जाते हैं। F-Droid से भी मिल जाता है
https://github.com/39aldo39/DecSync