Port forwarding is unsafe, but even crossing the road is unsafe. Do you cross the road without watching? In the same way, you just don't let a published server online without doing regular updates. You set up docker, run nextcloud (docker) behind nginx proxy manager, and have watchtower update them regularly. You can also setup 2fa in docker, and pair it with fail2ban.
Every port open widens the attack surface, but those services are made to be published, so there are mitigations against the risks.