Back in the day, I used ownCloud as a self-hosted calendar provider.
Later, I used radicale: http://radicale.org
For calendar clients, on PC I used Thunderbird with the Lightning calendar add-on (now built-in). On Android, which doesn't natively support CalDAV, I used a for-pay (unfortunately) CalDAV Sync adapter, but it worked well and integrated with any calendar app. It looks like there is a free sync adapter in F-Droid now.
I was never able to get a solution with "push" synchronization, although I tried, and there were various options available, like z-push. They all either required a hefty amount of setup, or a setup process I simply wasn't able to sort out myself. That means the clients had to poll the calendar at regular intervals (e.g. every 15 minutes) to stay in sync with each other.
This was 3+ years ago. The situation may have changed.