https://github.com/pimutils/vdirsyncer
Docs: https://vdirsyncer.pimutils.org/en/stable/index.html
Tutorial: https://vdirsyncer.pimutils.org/en/stable/tutorial.html
Vdirsyncer is a command-line tool for synchronizing calendars and addressbooks between a variety of servers and the local filesystem. The most popular use case is to synchronize a server with a local folder and use a set of other programs to change the local events and contacts. Vdirsyncer can then synchronize those changes back to the server.
However, vdirsyncer is not limited to synchronizing between clients and servers. It can also be used to synchronize calendars and/or addressbooks between two servers directly.
It aims to be for calendars and contacts what OfflineIMAP is for emails.
This was done on Linux Mint 21 (Ubuntu) and shows a server to server sync of two addressbooks.
config
file:
collections = [“from a”, “from b”]
in conjunction with:
vdirsyncer
and vdirsyncer discover
mkdir ~/.config/vdirsyncer && cd ~/.config/vdirsyncer vim config
# Configuration for vdirsyncer # # Move it to ~/.vdirsyncer/config or ~/.config/vdirsyncer/config and edit it. # Run `vdirsyncer --help` for CLI usage. # # Optional parameters are commented out. # This file doesn't document all available parameters, see # http://vdirsyncer.pimutils.org/ for the rest of them. [general] # A folder where vdirsyncer can store some metadata about each pair. status_path = "~/.config/vdirsyncer/status/" # Synchronize all collections that can be found. # You need to run `vdirsyncer discover` if new calendars/addressbooks are added # on the server. # CardDAV [pair Zimbra_NC] a = "zimbra_contacts" b = "nextcloud_contacts" collections = [["Contacts", "Contacts", "contacts"], ["Shared Contacts", "Shared Contacts", "shared-contacts"]] # Zimbra contacts take precedence in case of a conflict conflict_resolution = "a wins" [storage zimbra_contacts] type = "carddav" url = "https://zimbra.virtualarchitects.com/dav/" username = "username@virtualarchitects.com" password = "zimbrauserpassword" [storage nextcloud_contacts] type = "carddav" url = "https://cloud.virtualarchitects.com/remote.php/carddav/" username = "nextcloudusername" password = "ncuserpassword" # CALDAV [pair Zimbra_NC_Calendars] a = "zimbra_calendars" b = "nextcloud_calendars" collections = [["Calendar", "Calendar", "personal"], ["Tasks", "Tasks", "tasks"], ["VA Calendar", "VA - Shared Calendar", "va-shared-calendar"]] # Calendars also have a color property metadata = ["displayname", "color"] [storage zimbra_calendars] type = "caldav" url = "https://zimbra.virtualarchitects.com/dav/" username = "username@virtualarchitects.com" password = "zimbrauserpassword" [storage nextcloud_calendars] type = "caldav" url = "https://cloud.virtualarchitects.com/remote.php/caldav/" username = "nextcloudusername" password = "ncuserpassword"
vdirsyncer discover vdirsyncer sync
crontab -e # sync every 15 minutes */15 * * * * vdirsyncer sync