This isn’t a beginner setup — this is what it looked like after I pushed past the usual “it kinda works” stage and got something that actually behaves like a normal modern system.
My goal was pretty straightforward:
- Replace Bluehost email
- Stop relying on iCloud/Google for calendars
- Have a shared family calendar that just works
- Get real push sync (no refresh delays)
- Make it usable for my lady, not just “homelab usable”
Environment
- TrueNAS (main box)
- VM running Mailcow
- Nginx handling SSL (internal traffic is HTTP)
- UniFi network + AdGuard DNS
Mailcow stack:
- Postfix / Dovecot
- Rspamd
- SOGo
Outbound mail via Amazon SES.
What didn’t work
CalDAV/CardDAV only
- No real push
- iOS behavior inconsistent
- Feels nothing like iCloud
Internal routing / cert weirdness
- External worked fine
- Internal sometimes hit wrong endpoints
- iOS would throw trust errors depending on DNS path
SOGo GAL across domains
- Multiple domains = separate GALs
- Cross-domain visibility works, but UX isn’t clean
What actually worked
ActiveSync (the big unlock)
Setting up iPhone as an Exchange account:
- Email = push
- Calendar = push
- Contacts = sync
- Reminders = integrated
This is what makes it feel like iCloud/Exchange instead of a lab setup.
Hybrid approach (key detail)
I ended up splitting responsibilities:
ActiveSync
- Personal email
- Personal calendar
- Contacts
- Push sync
SOGo (CalDAV)
- Shared family calendar
Reason:
- ActiveSync in Mailcow doesn’t handle shared calendars well
- SOGo handles shared calendars correctly
Making it behave like iCloud
- Set the shared family calendar as default on both phones
- So any new event automatically goes to the shared calendar
Result:
- Everything stays in sync
- No “wrong calendar” issues
- Works exactly how you expect
Deliverability (critical)
Outbound through Amazon SES:
- Avoids IP reputation issues
- Mail lands reliably
- No constant spam problems
Spam filtering
Rspamd is doing:
- Connection-level blocking
- Greylisting
- Bayesian + neural filtering
Most spam never even gets delivered.
End result
This now behaves like:
- iCloud (shared calendar UX)
- Exchange (push sync everywhere)
- Fully self-hosted
The biggest test: my lady uses it without issues.
What I’d do differently
- Skip trying to make CalDAV-only behave like iCloud
- Use ActiveSync from the start
- Plan for SES early
- Expect DNS/internal routing to be the most annoying part
Why I’m posting this
Most setups stop at:
“it works”
This is the first time I’ve had:
“this actually feels normal to use”
If you’re trying to replace Bluehost/iCloud/Google with something self-hosted that doesn’t suck, this combination got me there.
If anyone wants more detail on config (ActiveSync vs SOGo split, etc.), I’m happy to share.