Verilerime Sahip Çıkmak, Bölüm 1: Kendi Barındırdığım Takvim Çözümünü Entegre Etmek
(emilygorcenski.com)- Sık iş seyahatleri ve yolculuklar ile farklı zaman dilimlerindeki ilişkileri yönetme ihtiyacı birleşince, Big Tech’e bağımlılığı azaltan ve takvim verilerini doğrudan kontrol etmeyi sağlayan kendi takvim sistemi gerekli hale geldi
- Yeni yapı, merkezine Baïkal CalDAV sunucusunu alıyor; Airtrail, IMAP e-posta ve dil okulunun ICS verilerini toplayıp CalDAV’a koyuyor, ardından paylaşım için
.icsdosyaları olarak yeniden yayımlıyor - Takvimleri YAML ile yazıp CI/CD’de ICS’ye dönüştürme yöntemi prototip için yeterliydi; ancak elle yapılan hatalar ve bakım yükü artınca statik dosya yaklaşımının yerini aldı
- Python betiği her 15 dakikada bir etkinlikleri topluyor ve sınıflandırıyor, aile ve iş için ayrı ICS dosyaları oluşturuyor; iş takviminde bazı etkinlikleri PRIVATE olarak işaretliyor
- Google Calendar ve Google Script yalnızca iş takvimi senkronizasyonu için kullanılıyor; Airtrail API entegrasyonundan sonra bir uçuş bir kez girildiğinde 15 dakika içinde kişisel takvime, 1 saat içinde iş takvimine yansıyor
Takvim yönetimi neden karmaşıklaştı
- Sık hareket halinde olmak nedeniyle aile, arkadaşlar ve iş arkadaşları mevcut zaman dilimini ya da uçağa binilip binilmediğini anlamakta zorlanıyordu; farklı zaman dilimlerindeki randevuları ayarlamak için sürekli saat hesabı yapmak gerekiyordu
- Uçuş, tren, biniş öncesi bloke edilen zaman ve havalimanına ulaşım süresi gibi bilgileri birden fazla yere tekrar tekrar girmek gerektiğinden takvim yönetimi yükü arttı
- Mevcut takvim ekosistemindeki rahatsızlıklar standartlar, ön uç uygulamaları ve kullanıcı deneyiminin geneline yayılmıştı
- E-posta sağlayıcısı uçuş için takvim öğesi oluştursa bile aktarmalı uçuşları atlayabildiği ya da zaman dilimlerini yanlış işlediği durumlar olabiliyor
- Oluşturulan öğenin organizer alanı kullanıcı olmadığı için paylaşım veya düzenleme zorlaşabiliyor
- Gereken koşullar basit takvim kaydının ötesine geçip paylaşım ve kontrolü de kapsıyordu
- Etkinlikler iş takviminde blocker olarak görünmeliydi
- Eşin takvime abone olabilmesi gerekiyordu
- Etkinlik girişi en fazla bir kez yapılmalıydı
- Birden çok cihazdan düzenleme yapılabilmeliydi
- Veriler doğrudan kontrol altında olmalıydı
- İş takvimini eşle paylaşma yöntemi kullanılamazdı
- Ek gereksinimler arasında
.icse-posta eklerini içe aktarma, dil okulunun takvimi için HTTP ICS içe aktarma, kendi barındırılan uçuş takipçisi Airtrail entegrasyonu, renk ayrımı, iş takvimi için gizli bayrağı, sık yenileme ve istenen ön uç uygulamasını kullanabilme vardı
YAML·ICS yaklaşımının sınıra dayandığı noktalar
- Mevcut paylaşım yöntemleri çoğu zaman tüm işlevleri sunmak için ortak bir platform veya aynı hesap ortamı gerektiriyordu
- Gmail veya Outlook.com ekosistemi
- Exchange gibi aynı ortamda hesap paylaşımı
- Yaygın geçici çözümler iki taneydi
- iCal verisini HTTP üzerinden sunarak salt okunur takvim yayımlamak
- iCal
.icsdosyasını e-postayla göndermek
- İlk sürüm, web sitesinde herkese açık ama tahmin edilmesi zor bir URL’ye
.icsdosyası koyup amaca göre birden fazla URL oluşturma yöntemiydi - Etkinlik verileri YAML ile yazılıyor, CI/CD hattında küçük bir betikle ICS dosyalarına yeniden serileştiriliyordu
- Prototip için yeterliydi; ancak ölçek büyüdükçe YAML’ı elle yazarken sık hata yapılmaya başlandı ve aslında düşük eforla bitmesi gereken iş zahmetli hale geldi
CalDAV ve Baïkal ile değiştirilen yapı
- Yeni yapı, statik dosyalardan ayrılarak barındırılan CalDAV tabanlı bir sisteme geçti
- CalDAV, WebDAV dağıtık yazarlık belirtiminin bir uzantısıdır ve takvim uygulamalarının ihtiyaç duyduğu işlevleri sağlar
- Bir CalDAV sunucusu kullanıldığında, seçilen ön uç uygulamayla dizüstü bilgisayar, telefon gibi birden fazla cihazda etkinlikleri görmek ve yönetmek mümkün olur
- Kimlik doğrulama olmadan kolayca abone olunabilen CalDAV sunucusu çok olmadığı için, sunucuyu düzenli aralıklarla yoklayan, etkinlikleri çıkaran ve web sitesindeki iCal dosyası olarak yayımlayan bir betiğe ihtiyaç vardı
- Genel akış şöyleydi
- Veri kaynaklarından etkinlikleri yokla
- Etkinlikleri programatik olarak CalDAV’a yayımla
- CalDAV’dan tüm etkinlikleri alıp
.icsdosyası olarak yaz .icsdosyasını HTTP üzerinden sun
Baïkal kurulumu ve istemci bağlantısı
- Seçilen araç Baïkal; takvimleri ve kişileri yöneten hafif, kendi barındırılan bir CalDAV/CardDAV sunucusu
- Docker Compose ile
ckulka/baikal:0.9.5imajı çalıştırıldı; portlar ve yerel volume’ler belirtilerekdocker compose up -dile başlatıldı - Baïkal MySQL de kullanabilir, ancak SQLite ile de çalışır; SQLite’ın yönetimi daha basittir
- Web’e açmak için nginx reverse proxy kullanıldı
proxy_passile yerel Baïkal portuna bağlanma/.well-known/caldavadresinidav.phpye 301 ile yönlendirme- Bu yönlendirme iPhone veya Mac Takvim uygulamasına eklerken gereklidir
- TLS, Let’s Encrypt ve
certbotile yapılandırıldı;certbotnginx yapılandırma dosyasını otomatik güncelliyor - Tarayıcıdan domaine girilerek yönetici hesabı oluşturuldu, ardından kullanıcı ve takvimler yaratıldı
- macOS ve iOS’un varsayılan Takvim uygulamalarına bağlandı; macOS/iOS ayarlarında otomatik veya advanced yerine manual settings kullanıldı
Etkinlik sınıflandırması ve iş takviminin görünürlüğü
- iCalendar belirtiminde
EVENTbileşeninin isteğe bağlıCATEGORIESözelliği vardır; ancak kullanılan macOS Calendar, iOS Calendar, Google Calendar gibi araçlar bu alanı uygulamıyor - Serbest metinle sınıflandırmada tutarlılığı korumak zor olduğundan, etkinlik türleri Python enum ile modellendi
- Örnek:
TerminType,CultureType,SocialType,AwayType,TransportType MEETUP,CONFERENCE,CLASS,APPOINTMENT,MEETING,EXAMgibi değerler içeriyor
- Örnek:
- enum’ların birden fazla gruba ayrılmasının nedeni, etkinlik türlerini kavramsal olarak düzenlemekti
- Sınıflandırma sistemi, iş takviminde görünürlüğü belirleyen mantığı da içeriyor
- İki haneli enum değerleri iş takviminde varsayılan olarak private işleniyor
- Doktor randevusu gibi etkinlikler ayrı iş takvimi dosyasına gizli olarak serileştiriliyor
- Bu sınıflandırma, etkinliklerin aranabilirliğini ve görsel ayırt edilebilirliğini artırmak; renk ayrımını destekleyen ön uçlarda tek bakışta anlaşılır hale getirmek için kullanılıyor
Python senkronizasyon betiği ve ICS yayını
- Otomasyon için Python betiği bir cron job’a bağlandı
- Betik, birden fazla girdiyi toplayıp Baïkal’a koyuyor ve tekrar paylaşılabilir ICS olarak dışa aktarıyor
- IMAP ile e-postadan etkinlikleri alma
- Airtrail API’den uçuş etkinliklerini çıkarma
- Dil okulunun barındırdığı ICS dosyasını alma
- Toplanan etkinlikleri Baïkal’a push etme
- Baïkal’dan tüm etkinlikleri alıp bir veya daha fazla paylaşılabilir ICS dosyası olarak yeniden serileştirme
- IMAP entegrasyonu, e-postayla alınan takvim davetlerini otomatik olarak alıp takvime eklediği için Google Calendar’a benzer bir işlev sunuyor
- cron giriş noktası betiği aile ve iş için ayrı ayrı
Calendaroluşturuyor; Baïkal’dan etkinlikleri alıp dallandırarak işliyor- Aile ICS’sine etkinliği ekliyor
- İş e-posta adresi etkinliğin serileştirilmiş çıktısında yoksa iş ICS’sine ekliyor
is_work_publicsonucuna göre classification değeriniPUBLICveyaPRIVATEolarak ayarlıyor
- Baïkal entegrasyon betiği, uzak etkinlikleri almak için
PROPFINDistekleri ve HTTP Digest kimlik doğrulaması kullanıyor - Etkinlik açıklamasında
CATEGORIES:deseni varsa kategori açıklama alanından çıkarılıpevent.categoriesiçine konuyor; ilgili metin açıklamadan kaldırılıyor - Paylaşım amaçlı ICS dosyaları nginx üzerinden tahmin edilmesi zor URL’lerle sunuluyor; URL, rastgele ve salt uygulanmış hash dizgesinden üretiliyor
- Bu cron job 15 dakikada bir çalışıyor
İş Google Calendar senkronizasyonu
- Kişisel takvimde etkinlikleri görmenin yanı sıra, iş takviminde yolculuk ve uçuş planlarının bloke zaman olarak görünmesi ve iş arkadaşlarının durumu anlayabilmesi gerekiyordu
- İş takvimine kopyalama için Google Script Engine kullanıldı
- Temel betik, GAS-ICS-Sync’in değiştirilmiş bir sürümü
- Değiştirilmiş sürüm, takvim
CATEGORIESözelliğini okuyup iş takvimine renk kodlaması uyguluyor - Google Script 30 dakika aralıklarla çalışıyor
- Google Calendar kullanımı Big Tech’e bağımlılığı azaltma hedefiyle çelişiyor; ancak bunun iş ortamının tercihi olduğu ve kişisel kullanım bağımlılığı olmadığı ayrımı yapılıyor
İşletim sonuçları ve maliyet
- Bu sistem yaklaşık 6 ay boyunca küçük düzeltmeler ve eklemelerle kullanıldı
- En yeni değişiklik Airtrail API entegrasyonu
- Uçuş rezervasyonu yapıldığında veriler uçuş takipçisine giriliyor
- 15 dakika içinde kişisel takvime ekleniyor
- 1 saat içinde iş takvimine otomatik kopyalanıyor
- Karmaşık seyahat gereksinimlerinde takvim yönetimi süresini önemli ölçüde azaltarak yaşam kalitesinde iyileşme sağladı
- Toplam maliyet en aza indirilebilir; ev tipi NAS üzerinde de kolayca çalıştırılabilir
- Şu anda web sitesini ve entegrasyonu çalıştırmak için verileri İsviçre’de tutan, ayda yaklaşık 100 dolar sunucu zamanı aboneliği kullanılıyor
- Bu maliyet biraz abartılı bir kurulum ve zamanla optimize edilmesi planlanıyor
- VM instance’ının Docker host’u üzerinde hızlıca yapılandırılabilmiş olması ek maliyeti göze almaya değer kıldı; takvim yönetimi kolaylaştığı için ayda 100 dolara karşılık gelen zamanı tasarruf ettiriyor
1 yorum
Hacker News yorumları
Tepki çekecek gibi ama bence CalDAV pek iyi değil
Gerçekten kolay ve harika olsaydı, çok daha fazla self-hosted CalDAV çözümü olurdu ve kullanılabilirlikleri de daha iyi olurdu; Radicale de beni etkilemedi
Aslında bana sunulacak tek şey bir takvim dosyası olduğundan kendi CalDAV sunucumu yazmayı denedim, ama tek bir dosyayı dışa açmak bile hiç sezgisel değildi ve karmaşıktı, bu yüzden vazgeçtim
Başkalarıyla CalDAV destekli uygulamalar üzerinden takvim paylaşmanız gerekiyorsa gerekliliğini anlarım, ama tek başına kullanılan bir takvimi barındırmak için bana neredeyse zaman kaybı gibi geliyor
Bunun yerine başlangıçta dinamik olarak güncellenen bir iCal dosyasını S3 bucket'ına koyup Android'de ICSx5 ile senkronize ettim. CalDAV olmadan yalnızca HTTPS yeterliydi
Ancak Android için özgür ve açık kaynaklı takvim uygulamaları hâlâ yetersiz; ayrıca GrapheneOS'te ICSx5 düzgün çalışmadığından şimdi iCal dosyasına doğrudan bağlantı destekleyen Proton Calendar'ı neredeyse aynı şekilde kullanıyorum
iCalendar biçimini kullanan yaklaşım iyi, ama takvim yazılımlarının iCalendar özellik desteği çok farklı olduğundan sonunda meta verilerin çoğunu özel özellikler yerine açıklama alanına tıkıştırmak zorunda kalıyorum
Benim kullanımım, Eventbrite, Meetup, pub quiz şirketleri, herkese açık etkinlik takvimleri gibi çeşitli sitelerden veri çekip yalnızca ilgimi çeken sosyal etkinlikleri filtreleyen ve bunları normalde kullandığım takvim uygulamasında görebileceğim tek bir takvimde birleştiren bir yazılım
Üstelik Exchange ve Google'ın standarda uymayan CalDAV sunucularını idare etmek için çok uğraştık; kullanıcılar da tüm suçu bize attı
Şimdi Google'da çalışınca görüyorum ki gCal uygulamaları tamamen farklı bir protokol kullanıyor
Hafif bir biçim olmak yerine tek seferde çok fazla işi yapmaya çalışarak aşırı tasarlanmış; sonuçta birbirine dolanmış farklı fikirlerden oluşan bir yumak gibi bir protokole dönüşmüş
Bu yüzden birçok servis, gerçekte istedikleri kapsamın dışına çıktığı için tüm spesifikasyona eksiksiz uymaya çalışmıyor
W3 veri biçimi spesifikasyonları sanki hep böyle bitiyor; daha düşük seviyeli protokol spesifikasyonlarında bu nispeten daha az böyle görünüyor
Okuyalı 15 yıl oldu, ama bu tür protokollerin tasarım sürecinde komiteler içinde nasıl yolunu kaybettiğine de kısmen değindiğini hatırlıyorum
Projenin 2001 civarında başladığı gerçeği bile takvim meselesinin ne kadar eski bir baş ağrısı olduğunu gösteriyor
Neden kötü olduğunu öğrenmek istiyorsanız öneririm; ayrıca startup'lar ile açık kaynağın çatışması, ürün geliştirme ve genel olarak yazılım geliştirme üzerine de iyi bir hikâye
http://www.dreamingincode.com/ ; https://en.m.wikipedia.org/wiki/Dreaming_in_Code
Android senkronizasyonu için arka planda senkronizasyon servisi çalıştıran, root gerektirmeyen açık kaynak uygulama DAVX5'i kullanıyorum; kurulumda çok sorun vardı ve bu CalDAV uygulama farklarından kaynaklanıyor olabilir. DAVX5'ten ZOHO takvimine senkronizasyon da uzun sürüyor
Ubuntu'daki Evolution'ın CalDAV desteği oldukça iyi, ama posta görünümü ile takvim görünümü arasında her geçişte tüm takvimi yeniliyor. ZOHO takviminin yenilenmesi uzun sürüyor ve ZOHO'nun hız sınırları da sıkı olduğundan fiilen soft block yemiş oluyorsunuz
Güncel Thunderbird'de farklı bir HTTP başarı kodu bekleyen bir CalDAV uyumsuzluğu var. ZOHO 200 döndürüyor, ama Thunderbird başka bir kod bekliyor. Bu arada Thunderbird CalDAV kodu JS ile yazılmış
Bu sorun yalnızca ikinci takvimde ortaya çıkıyor; ikinciyi eklediğiniz anda hata vermeye başlıyor. En azından ZOHO'da epey acı verici
Önerebileceğim başka bir CalDAV sunucusu da Radicale
Python ile yazılmış ve oldukça modüler tasarlanmış; kimlik doğrulama, yetkilendirme gibi eklentiler takılabiliyor
Veriler düz metin dosyaları olarak saklanıyor; git ile izleyip yedekliyorum
Zaman içinde birkaç ilginç değişiklik biriktirdim. Kimlik doğrulamayı host sistemin pam'iyle yapıyorum; takvim paylaşımı için de izinli tüm kullanıcılara takvimi sembolik linkleyen periyodik bir betik çalıştırıyorum. Ancak kombinasyon patlaması sorunu var
Özel CalDAV özellikleri kullanan bir yetkilendirme eklentisi ve değiştirilmiş bir web eklentisiyle erişim denetim listeleri de ekledim
Herkese açık takvimler için ACL ile
publickullanıcısına okuma izni veriyorum ve nginx hack'iyle okuma işlemlerine kapsayıcı erişim tanıyorumBu herkese açık takvim web takviminde görülebiliyor: https://gitlab.nomagic.uk/popi/js_calendar_from_ics
Sanırım bu kurulum hakkında bir blog yazısı yazmalıyım
Tam ihtiyacım olan yazıydı
Kişisel sunucumda Mailcow'un SoGO takvimini, iş takvimim için Fastmail'i kullanıyorum; birbirleriyle pek iyi anlaşmıyorlar
Mailcow takvimini başka araçlarla düzgün bağlamanın yolunu bulamadığım için yarı manuel senkronizasyona zaman harcıyorum
Bir süredir takvimleri ayırmak istiyordum ama bildiğim tek alternatif Nextcloud'du; o da biraz ağır geliyor
Baïkal iyi görünüyor ve bir an önce denemek istiyorum. Böylece Mailcow'u başka bir self-hosted e-posta servisiyle değiştirmeyi de araştırabilirim
Son dönemde buluttan oldukça agresif biçimde uzaklaşıyorum. Yüzlerce GB verim vardı ama taşıma işlemini aralıklı yapsam da 2 haftadan kısa sürdü ve beklediğimden çok daha iyi çalışıyor
Dışarıya bıraktığım tek hizmet e-posta; çünkü MX kayıtları ve IMAP/SMTP ile uğraşmak istemiyorum
Geri kalanlarda çift çekirdekli Celeron CPU’lu Asus PN40 çok yardımcı oldu. Erişilebilirliğinin iyi olması, M.2 NVME ve SATA sürücü yuvaları sayesinde tek yerde güvenli bir yedekleme düzeni kurabilmesi büyük avantaj
CalDAV’ın biraz şüpheli olduğuna katılıyorum ama Nextcloud ihtiyaçlarımın çoğunu karşıladı. Redis ekleseniz bile bazı işler yavaş olabiliyor; yine de takvim, Dropbox/Google Drive alternatifi, belgeler, fotoğraflar, yedekleme ve otomatik senkronizasyonu iyi hallediyor
Buna çeşitli açık kaynak çözümler ekleyince müzik·video akışı, izleme, bildirimler, VPN, okuyucu, yönetim araçları ve her türlü yardımcı araç da tamamen çözülüyor
Bu mini PC performans olarak düşük sayılır ama ISP’m çok iyi olduğu için hepsini bolca kapasite bırakarak kaldırıyor; benim gibi 5-6 kişiyi daha alsa da zorlanmayacak düzeyde
Eski olanın yeniden yeni hâle gelmesi gibi bir his
2000’lerin başında Mozilla Sunbird ile kişisel Win2k sunucumdaki IIS WebDAV modülü üzerinden takvim barındırıyordum
CardDAV sanırım henüz yoktu; yanlış hatırlıyor da olabilirim
Sonunda tüm o verileri Google Calendar’a aktardım; çok geriye gidince üniversite ödevleri gibi şeyler bile duruyor, bu yüzden epey eğlenceli
Bazı randevular sunucuya çıkmadığı için kaybettiğim olmuştu; DAViCal sunucusuyla birlikte CalDAV olarak kullanıyordum
Sunbird durduruldu ve Windows’ta çalışacak düzgün bir alternatif var mı diye son zamanlarda bakmadım
Baikal ilginç görünüyor
Geçmişte birkaç Apple iOS cihaz arasında takvim paylaşmak için DAViCal kullanmıştım. Çalıştığında iyi çalışıyordu ama iOS sürümü değiştikçe kararsızlaşıyor gibi geldi ve sonunda bıraktım
Bir gün yeniden bakarsam DAViCal ve Radicale ile birlikte artık Baikal’e de bakmayı düşünüyorum
https://www.davical.org/
https://radicale.org/v3.html
Son dönemde Nextcloud’a geçtim; çünkü paylaşımlı hosting tarafında dağıtımı onlar üstleniyor ve entegre web arayüzü sayesinde kurulum yükü çok daha azdı
Baikal’i birkaç yıldır kullanıyorum, oldukça sağlam. Ancak tek başıma kullanıyorum ve asıl yazıdaki tüm gereksinimlere sahip değilim
Masaüstünde Thunderbird’ün yerleşik takvimine bağlıyorum; telefonda F-Droid’den DAVx5 ve Fossify Calendar kullanıyorum
Fossify Calendar, Simple Mobile Tools’un Calendar uygulamasından çatallandı; ama adının aksine şimdiye kadar gördüğüm en özellikli takvim uygulaması
Bir sürü menü ve iletişim kutusunun içine sokmadan tüm seçenekleri doğrudan göstermesindeki sadelik hoşuma gidiyor
İşte Outlook, evde Google Calendar kullanıyorum; HTTP ile senkronize edince tamamen kararsız oluyor
Saat dilimlerini sürekli bozuyor gibi; bazen UTC olarak yayımlıyor bazen yayımlamıyor, bu yüzden toplantı saatleri hep şaşıyor
Bu iki büyük sağlayıcının bu kadar temel bir özelliği neden düzeltemediğini anlamıyorum
Kendi sistemimi kullanınca çözülecekse hemen yaparım ama Outlook’ta oluşturulan toplantının 2 saat farkla içeri alınması gibi aynı şey yaşanır diye endişeliyim
Ayrıca birçok şirket veri sızıntısı sorunları nedeniyle kişisel takvim ile iş takvimi arasında senkronizasyonu fiilen yasaklıyor
Böyle bir şeyi fotoğraflar için de yapmak istiyorum. Bir süredir Dropbox ve Google’dan uzaklaşmak istiyorum; önceliklerim iki tane
Birincisi, fotoğraflarımdan anılar özelliği gibi şeyler oluşturup telefona göndermek istiyorum. Yıl dönümleri, benzer aktiviteler,
ben ve X (X eş, aile, arkadaş vb.), zaman içindeki değişimler gibi ölçütlerle gruplama şeklindeİkincisi, cihazda çekilen fotoğrafları kendi sunucuma kaydedebilmem gerekiyor
Farklı yerlerde 2 TB alana sahip 3 TrueNAS makinesi hazırladım ve bu özelliği yavaş yavaş yapmak istiyorum
https://www.synology.com/en-global/dsm/feature/photos
https://www.synology.com/en-global/dsm/feature/moments
Başka bir yol olarak sunucusuz DecSync kullanmak da var
Thunderbird veya Evolution Android uygulamasıyla senkronize oluyor; takvimler, kişiler, görevler ve RSS de diğer eşlere kopyalanıyor. F-Droid’den de alınabiliyor
https://github.com/39aldo39/DecSync