I started by using a NVR off AliExpress. It worked well until I added a camera from a different vendor, same brand though and it refused to be reliable and had frequent disconnections.
Moved onto ZoneMinder and after hours of setup I felt the UI wasn't good enough for a non-tech person. I want others in my family access the feeds with ease, ZoneMinder does not cut it.
While I was experimenting with cameras, I was also getting into HomeAssistant which had motionEye as a supported service. It was easy to add cameras and almost any camera could be hacked to have RTSP support and motionEye.
Motion-detection could be enabled on the Raspberry Pi's motionEye, offloading compute off the cameras. This was important for me as many of my cheap Chinese cameras lag/hang/shutdown on load.
The Raspberry Pi also has Pi-Hole installed which I configured to block all IPs and domains being used by the IP cameras thereby limiting its access to local network only.
As I kept adding cameras (10+), performance on Raspberry Pi started getting affected, so I added another Raspberry Pi and installed motionEye on it. Setup MQTT on motionEye to send notifications to HomeAssistant on motion/human detection. Added multiple HDDs (4) so cameras can write with less conflicts.
I still haven't got some cameras (Xiaomi) into this setup as I don't want to hack them yet. (The open firmware(s) lack features). But they do backup recordings to the same Raspberry Pi NFS and I plan to find something which can show motionEye and Xiaomi videos in one interface.