SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor

Cara Menyiapkan CalDAV di VPS dengan Radicale

Sinkronkan kalender ponsel dan laptop tanpa Google. Pelajari setup Radicale di VPS, TLS, discovery, koleksi per pengguna, backup, dan konfigurasi klien.

Yang Anda bangun

Kalender yang di-host sendiri adalah satu server CalDAV pada VPS yang Anda kendalikan, di balik TLS, dengan satu login untuk setiap orang. Ponsel di saku dan laptop di meja Anda menampilkan acara yang sama. Laptop pasangan Anda juga menampilkannya. Tidak ada akun Google sebagai perantara.

Ini berbeda dari halaman pemesanan yang di-host sendiri. Halaman pemesanan ditujukan untuk orang lain. Halaman tersebut memublikasikan waktu luang Anda dan memungkinkan seseorang memilih salah satunya. Server kalender ditujukan untuk perangkat Anda sendiri. Server tersebut menyimpan acara dan menjaga agar semua klien tetap sinkron. Banyak orang menjalankan keduanya. Alat pemesanan kemudian membaca ketersediaan dari server CalDAV yang Anda bangun di sini.

Instalasinya kecil. Radicale adalah satu paket Python dengan konfigurasi sekitar sepuluh baris. Hal yang menentukan apakah setup ini bertahan selama bulan pertama adalah TLS, discovery, koleksi per pengguna, dan backup. Bagian berikut berfokus terutama pada hal-hal tersebut.

Apa itu CalDAV, dan mengapa penting?

CalDAV adalah sinkronisasi kalender melalui HTTP. CalDAV didefinisikan dalam RFC 4791 sebagai ekstensi untuk WebDAV (web distributed authoring and versioning, sekumpulan metode HTTP tambahan yang didefinisikan dalam RFC 4918). Kalender adalah koleksi yang berperilaku seperti direktori. Satu acara adalah satu file di dalamnya, yang ditulis dalam format teks iCalendar (RFC 5545), format yang sama dengan lampiran .ics dalam email Anda.

Klien menggunakan HTTP biasa dengan beberapa metode tambahan. PROPFIND menanyakan konten yang tersedia dan propertinya. REPORT meminta bagian yang difilter, seperti semua acara dalam rentang tanggal tertentu. PUT menulis satu acara, sedangkan DELETE menghapusnya. Setiap acara memiliki baris UID. Identifier tersebut digunakan agar dua perangkat dapat memastikan bahwa keduanya melihat acara yang sama, bukan salinannya.

Portabilitas adalah manfaat utamanya, dan itulah alasan utama untuk menggunakannya. iOS, macOS, Thunderbird, Evolution, dan Android melalui DAVx⁵ semuanya mendukung CalDAV. Data Anda tidak terikat pada server yang Anda pilih saat ini. Pindahkan file ke server CalDAV lain, arahkan klien ke hostname baru, dan tidak ada hal lain yang berubah.

CardDAV tersedia bersama CalDAV. Konsepnya sama untuk kontak, yang didefinisikan dalam RFC 6352 dan menyimpan file vCard, bukan acara. Setiap server di bawah ini menyediakan kedua protokol dari akun yang sama. Jadi, setelah kalender berfungsi, buku alamat cukup diaktifkan melalui satu opsi.

Server CalDAV mana yang sebaiknya Anda gunakan?

Radicale adalah pilihan paling sederhana yang tetap berfungsi. Aplikasi ini menggunakan Python, tidak memerlukan database, dan menyimpan data dalam folder yang berisi file biasa. Panduan ini menggunakannya karena kalender rumah tangga tidak memerlukan lebih dari itu dan karena sangat sedikit hal yang dapat gagal pada pukul tiga pagi.

Baikal adalah pilihan dengan panel administrasi web. Aplikasi ini berjalan di PHP dan library sabre/dav, menyimpan pengguna serta kalender di SQLite atau MySQL, dan memungkinkan Anda menambahkan seseorang melalui browser, bukan melalui command line. Pilih opsi ini jika akun sering ditambahkan dan dihapus.

Nextcloud tepat jika kalender merupakan salah satu dari beberapa fitur yang Anda perlukan. Anda mendapatkan kalender, kontak, file, dan aplikasi seluler, dengan konsekuensi harus menggunakan PHP-FPM, database, dan runner untuk menjalankan job latar belakang. Jika ini terdengar terlalu berat untuk kebutuhan Anda, alternatif Nextcloud yang lebih ringan membahas komprominya, sedangkan sinkronisasi file yang di-host sendiri membahas kebutuhan lain yang biasanya menjadi alasan orang memasang Nextcloud.

DAViCal adalah opsi PostgreSQL yang telah lama tersedia. Opsi ini layak dipertimbangkan hanya jika Anda sudah menjalankan PostgreSQL dan ingin menyimpan data kalender di dalamnya.

Instal Radicale di Ubuntu 24.04

Radicale 3.5.10 adalah rilis terbaru pada Agustus 2026. Instal Radicale dalam virtual environment tersendiri.

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 radicale

Virtual environment bukan sekadar pilihan gaya. sudo pip install radicale ke system Python gagal dengan error: externally-managed-environment, karena Ubuntu menandai Python-nya sebagai milik apt agar pip tidak dapat menimpa file paket.

Tulis /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/collections

hosts sengaja mengikat layanan ke loopback. nginx menghentikan TLS dan meneruskan koneksi ke port tersebut, sehingga Radicale tidak pernah langsung menghadap Internet. Contoh upstream 0.0.0.0:5232 menyediakan layanan tanpa enkripsi yang menerima kata sandi. Kesalahan itulah yang harus dihindari di sini.

Sekarang buat akun. -5 memilih crypt SHA-512, yang dapat dibaca Radicale dengan htpasswd_encryption = autodetect tanpa modul tambahan:

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 membuat file dan mengosongkan isinya. Gunakan perintah ini hanya untuk pengguna pertama. Menjalankan htpasswd -5 -c lagi beberapa bulan kemudian akan menghapus semua akun yang ditambahkan setelah akun pertama. Gejalanya adalah satu orang dapat melakukan sinkronisasi dengan normal, sementara semua pengguna lain terus-menerus diminta memasukkan kata sandi. Bcrypt juga dapat digunakan, tetapi memerlukan instalasi tambahan radicale[bcrypt].

Buat /etc/systemd/system/radicale.service berdasarkan unit dalam dokumentasi Radicale:

[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.target
sudo systemctl daemon-reload
sudo systemctl enable --now radicale
curl -i http://127.0.0.1:5232/

Hasil yang sehat adalah 401 Unauthorized dengan header WWW-Authenticate: service sedang listening dan autentikasi aktif. Connection refused berarti service tidak pernah berhasil start, sedangkan journalctl -u radicale -n 50 menunjukkan opsi yang ditolaknya. ProtectSystem=strict memasang filesystem dalam mode read-only untuk service ini, sehingga ReadWritePaths=/var/lib/radicale/ adalah baris yang memungkinkan service menyimpan event. Jika baris tersebut dihapus, pembacaan tetap berfungsi, tetapi semua operasi penulisan gagal.

TLS bersifat wajib karena klien menolak teks biasa

CalDAV melakukan autentikasi dengan HTTP Basic, yang mengirim user:password dalam format base64 pada setiap permintaan. Base64 adalah encoding, bukan enkripsi. Melalui HTTP biasa, Anda menyerahkan kata sandi kepada setiap jaringan yang berada di antara ponsel dan server, sepanjang hari dan pada setiap sinkronisasi.

Klien menerapkan persyaratan ini secara otomatis. Dokumentasi Radicale mencatat bahwa Calendar.app pada macOS dapat menolak kredensial secara diam-diam melalui HTTP yang tidak aman, dan iOS berperilaku sama. Akun terlihat sudah dikonfigurasi, tetapi tidak pernah melakukan sinkronisasi dan tidak ada error yang dapat dibaca.

Arahkan A record untuk cal.example.com ke VPS terlebih dahulu karena certificate authority akan memeriksanya. Kemudian buat /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/; }
}

Keempat baris header proxy tersebut berasal dari dokumentasi Radicale. Biarkan semuanya apa adanya.

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 menampilkan syntax is ok dan test is successful. Lakukan reload hanya setelah keduanya muncul karena reload dengan file yang rusak membuat konfigurasi lama tetap berjalan dan menyembunyikan kesalahan hingga restart berikutnya. Certbot mengedit file site secara langsung: memasang sertifikat, mengubah block agar menggunakan port 443, dan menambahkan redirect dari port 80. Perintah curl terakhir meminta kata sandi dan seharusnya mengembalikan 200, yaitu antarmuka web milik Radicale. 502 Bad Gateway berarti nginx sedang berjalan, tetapi Radicale tidak listening pada port 5232.

Mengapa penambahan akun gagal di ponsel?

Penyebabnya adalah discovery. RFC 6764 menjelaskan cara client mengubah hostname menjadi URL kalender. Client mencari record SRV _caldavs._tcp, lalu meminta https://cal.example.com/.well-known/caldav dan mengharapkan redirect ke root DAV. Setelah itu, client meminta current-user-principal, lalu calendar-home-set milik principal tersebut. Hanya setelah semua langkah itu client dapat melihat kalender Anda. Ponsel hanya menyediakan satu kolom untuk server, sehingga setiap langkah harus berjalan tanpa interaksi pengguna.

curl -sI https://cal.example.com/.well-known/caldav

Respons yang benar adalah HTTP/2 301 dengan header location: https://cal.example.com/. Jika terdapat 404 di sana, iOS akan menyatakan bahwa informasi akun tidak dapat diverifikasi, sementara Thunderbird pada jaringan yang sama tetap berfungsi. Thunderbird menggunakan URL lengkap yang Anda masukkan, sehingga tidak memerlukan redirect.

Target redirect bergantung pada server. Radicale yang disajikan dari root situs melakukan redirect ke /. Baikal menyediakan aturan contoh yang melakukan redirect ke /dav.php dengan status 308. Nextcloud melakukan redirect ke /remote.php/dav/.

Buat kalender dan bagikan salah satunya dengan pasangan Anda

Banyak klien tidak dapat membuat kalender dan hanya dapat berlangganan kalender. Buka https://cal.example.com/ di browser, lalu masuk sebagai you dan buat kalender di sana. Di disk, kalender tersebut disimpan di bawah /var/lib/radicale/collections/collection-root/you/, dengan identifier yang dibuat otomatis sebagai nama folder.

Backend hak akses default Radicale adalah owner_only: akun terautentikasi dapat membaca dan menulis koleksinya sendiri di bawah /USERNAME/, dan tidak dapat mengakses yang lain. Untuk sebagian besar rumah tangga, pengaturan ini sudah tepat. Cara paling sederhana untuk membagikan kalender adalah menggunakan akun ketiga. Buat household dengan htpasswd, buat kalender bersama menggunakan login tersebut, lalu tambahkan kalender itu di setiap perangkat sebagai akun CalDAV kedua. Cara ini berfungsi pada semua klien, termasuk iOS, karena kalender berada di home akun tersebut.

Jika Anda memerlukan kontrol yang lebih terperinci, gunakan hak akses berbasis aturan. Tambahkan konfigurasi berikut ke /etc/radicale/config:

[rights]
type = from_file
file = /etc/radicale/rights

Kemudian /etc/radicale/rights, berdasarkan contoh dalam dokumentasi Radicale:

[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

Huruf kapital dan huruf kecil memiliki arti yang berbeda. R dan W membaca dan menulis koleksi yang bukan kalender atau buku alamat, yaitu folder principal. r dan w membaca dan menulis kalender itu sendiri. Ganti identifier tersebut dengan nama folder kalender yang sebenarnya dari path penyimpanan di atas.

Ada satu batasan yang perlu diperhatikan: klien yang hanya membaca home set kalender tidak akan menampilkan kalender yang berada di bawah path pengguna lain karena proses discovery tidak menelusuri path tersebut. Thunderbird dan DAVx⁵ dapat menambahkannya menggunakan URL lengkap. iOS tidak dapat melakukannya. Karena itu, pola akun bersama adalah satu-satunya cara yang selalu berfungsi.

Siapkan klien karena pada tahap inilah kalender self-hosted sering gagal

iPhone dan iPad. Buka Settings, lalu Calendar (pada versi iOS terbaru, berada di bawah Apps), kemudian Calendar Accounts, Add Account, Other, Add CalDAV Account. Server adalah cal.example.com, diikuti nama pengguna dan kata sandi. Description hanya berfungsi sebagai label. Jika akun tidak dapat disimpan, buka kembali akun tersebut: tampilan lanjutan menampilkan Use SSL, port, dan URL akun lengkap. Menempelkan URL akan melewati proses discovery sepenuhnya.

Android. Tidak ada klien CalDAV bawaan. Instal DAVx⁵ dari F-Droid atau Google Play, tambahkan akun menggunakan base URL https://cal.example.com/ dan nama pengguna Anda, lalu centang kalender yang diinginkan. DAVx⁵ menulis data ke Android calendar provider, sehingga acara muncul di aplikasi kalender yang sudah Anda gunakan.

Thunderbird. Pilih New Calendar, On the Network, lalu masukkan nama pengguna dan lokasi https://cal.example.com/. Thunderbird menampilkan hasil yang ditemukan dan menanyakan kalender mana yang ingin ditambahkan.

macOS. Buka System Settings, Internet Accounts, Add Other Account, CalDAV, lalu ubah Account Type menjadi Manual. Setelah itu, masukkan nama pengguna, kata sandi, dan alamat server yang sama.

CalDAV adalah protokol polling. Spesifikasinya tidak menyediakan push, sehingga acara yang ditambahkan di laptop akan tiba di ponsel pada sinkronisasi berikutnya, bukan pada detik yang sama. Atur interval pada setiap klien sesuai kebutuhan Anda. Ingat bahwa interval yang lebih pendek pada ponsel menghabiskan lebih banyak baterai.

Cadangkan penyimpanan yang hanya berupa file

Di Radicale, kalender Anda berupa direktori berisi file .ics, satu file untuk setiap acara, serta satu file properti kecil untuk setiap koleksi. Apa pun yang menyalin direktori tersebut sudah mencadangkannya. Anda dapat membuka cadangan dengan less untuk memastikan bahwa cadangan tersebut berisi acara yang sebenarnya. Ini merupakan keunggulan nyata dibandingkan dump database yang tidak dapat Anda baca.

sudo systemctl stop radicale
sudo tar czf /root/radicale-$(date +%F).tar.gz -C /var/lib/radicale collections
sudo systemctl start radicale

Hentikan service selama beberapa detik yang diperlukan untuk membuat arsip. Dengan demikian, tidak ada client yang sedang berada di tengah proses penulisan saat file dibaca. Setelah itu, salin arsip ke luar server, karena cadangan pada VPS yang sama tidak akan bertahan dari kegagalan yang sedang Anda antisipasi. Pemulihan dilakukan secara terbalik: ekstrak, sudo chown -R radicale:radicale /var/lib/radicale/collections, lalu jalankan service. Setiap client juga menyimpan salinan lokal kalendernya. Karena itu, laptop yang belum melakukan sinkronisasi sejak kegagalan tersebut merupakan salinan kedua data Anda.

Kapan Baikal atau Nextcloud lebih sesuai

Baikal 0.12.1 dirilis pada 5 August 2026 dan memerlukan PHP 8.2 atau yang lebih baru. Ekstrak Baikal di luar web root dan expose hanya direktori 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

Kedua direktori tersebut adalah satu-satunya direktori yang dapat ditulisi oleh web server. Jadi, direktori lain tidak perlu diberi izin tulis. Di dalam server block nginx, bagian khusus untuk Baikal adalah sebagai berikut:

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; }

Reload nginx, buka situs di browser, lalu setup wizard akan membuat akun admin dan database SQLite. Konfigurasi client sama seperti Radicale, dengan https://cal.example.com/ sebagai alamat server karena aturan well-known mengarahkan proses discovery ke /dav.php.

Nextcloud baru sepadan jika Anda juga ingin menggunakan file dan aplikasi ponsel dengan login yang sama. DAV root-nya adalah /remote.php/dav/, dan aturan discovery yang sama berlaku. Untuk semua opsi ini, menjalankan service di dalam container mencegah versi PHP masuk ke host: Docker Compose pada VPS membahas compose file dan reverse proxy di depannya, sedangkan hal yang layak di-self-host pada 2026 dapat membantu menentukan sejauh mana Anda ingin menggunakan pendekatan ini.

Mode kegagalan dan string yang akan Anda lihat

Setiap sinkronisasi mengembalikan 401. File kata sandi mungkin kehilangan akunnya setelah htpasswd -c kedua, atau pengguna radicale tidak dapat membacanya. Periksa dengan sudo -u radicale cat /etc/radicale/users; pesan permission denied menunjukkan penyebabnya, dan perbaikannya adalah menambahkan grup radicale lalu menetapkan mode 640. Secara default, Radicale juga menunggu satu detik setelah setiap login yang gagal. Karena itu, klien dengan kata sandi lama tampak lambat, bukan ditolak.

nginx mengembalikan 405 pada PROPFIND. URL tersebut disajikan sebagai file statis, sehingga metode WebDAV tidak pernah mencapai Radicale. Uji endpoint secara langsung:

curl -u you -X PROPFIND -H "Depth: 0" -i https://cal.example.com/you/

Koleksi DAV yang berfungsi mengembalikan 207 Multi-Status. Hasil lainnya berarti permintaan berhenti di web server.

Ponsel tidak dapat memverifikasi akun, tetapi browser tidak bermasalah. Ada dua penyebab umum. Redirect well-known tidak ada, yang dapat diuji dengan curl di atas. Atau rantai sertifikat tidak lengkap. Browser biasanya mengatasi hal ini dengan mengambil intermediate yang hilang, sedangkan iOS tidak. Periksa dari shell:

openssl s_client -connect cal.example.com:443 -servername cal.example.com </dev/null

Cari Verify return code: 0 (ok). Jika gagal, konfigurasi nginx mengarah ke cert.pem, padahal seharusnya mengarah ke fullchain.pem.

Event duplikat setelah impor. Setiap event memiliki UID, dan klien menggunakannya sebagai identitas. Jika file yang sama diimpor dua kali melalui tool yang membuat ulang identifier, Anda akan mendapatkan dua event yang tidak akan pernah digabungkan. Hapus salinan tambahan pada salah satu perangkat, lalu biarkan penghapusan tersebut tersinkronisasi.

Semuanya berhenti berfungsi setelah reboot. Service dijalankan secara manual. sudo systemctl is-enabled radicale menampilkan disabled, dan sudo systemctl enable --now radicale memperbaikinya secara permanen.

FAQ

Apakah saya benar-benar memerlukan TLS untuk server CalDAV yang di-host sendiri?

Ya. CalDAV menggunakan autentikasi HTTP Basic, sehingga kata sandi dikirim dalam bentuk base64 pada setiap permintaan, dan base64 dapat dibalik dengan mudah. Klien juga memberlakukannya: macOS Calendar.app dapat menolak secara diam-diam pengiriman kredensial melalui HTTP yang tidak aman, dan iOS berperilaku sama. Akibatnya, akun tampak berhasil disimpan, tetapi tidak pernah disinkronkan. sudo certbot --nginx -d cal.example.com adalah seluruh tugasnya.

Mengapa ponsel saya gagal menambahkan akun ketika Thunderbird berhasil?

Thunderbird menggunakan URL lengkap yang Anda masukkan. Ponsel hanya menyediakan satu bidang server, sehingga mengikuti mekanisme penemuan RFC 6764: ponsel meminta https://cal.example.com/.well-known/caldav dan mengharapkan pengalihan ke root DAV. Tanpa pengalihan tersebut, ponsel menerima 404 dan melaporkan bahwa akun tidak dapat diverifikasi. Tambahkan location = /.well-known/caldav { return 301 https://$host/; } ke nginx, lalu konfirmasikan dengan curl -sI https://cal.example.com/.well-known/caldav bahwa hasilnya adalah 301 dan terdapat header location.

Dapatkah dua orang menggunakan satu kalender bersama?

Ya, dan cara yang andal adalah menggunakan login bersama. Buat akun ketiga dengan htpasswd, letakkan kalender bersama di bawah akun tersebut, lalu tambahkan akun itu sebagai akun CalDAV kedua pada setiap perangkat. File hak akses Radicale juga dapat memberikan izin baca dan tulis kepada pengguna tertentu pada satu koleksi di bawah path pengguna lain. Namun, klien yang hanya membaca calendar home set miliknya sendiri tidak akan pernah menampilkannya. Karena itu, cara tersebut lebih sesuai untuk Thunderbird dan DAVx⁵ daripada iOS.

Apa yang terjadi pada acara saya jika VPS mati?

Pada Radicale, penyimpanan berupa teks biasa: satu file .ics untuk setiap acara di bawah /var/lib/radicale/collections/collection-root/. File tersebut dapat dicadangkan dengan tar dan dibaca dengan less. Untuk memulihkan, ekstrak, jalankan chown -R radicale:radicale, lalu start service. Setiap klien yang disinkronkan juga menyimpan salinan lokal. Jadi, laptop yang sudah diperbarui sebelum kegagalan menyimpan salinan kedua kalender secara lengkap.

Apakah server CalDAV juga menyinkronkan kontak saya?

Kontak menggunakan CardDAV, yaitu protokol terkait yang ditetapkan dalam RFC 6352 dan menyimpan file vCard, bukan acara. Radicale, Baikal, dan Nextcloud semuanya menyediakannya dari akun dan hostname yang sama. Di Android, DAVx⁵ menyinkronkan kalender dan kontak dari satu akun. Di iOS, Anda menambahkan akun kedua dengan tipe CardDAV menggunakan kredensial yang sama. Karena itu, pengalihan /.well-known/carddav perlu dimasukkan ke konfigurasi nginx di samping pengalihan CalDAV.

#caldav#calendar#radicale#self-hosting#sync