I host forgejo internally and use that to sync changes. .env and data directories are in .gitignore (they get backed up via a separate process)
All the files are part of my docker group so anyone in it can read everything. Restarting services is handled by systemd unit files (so sudo systemctl stop/start/restart) any user that needs to manipulate containers would have the appropriate sudo access.
It's only me they does all this though, I set it up this way for funsies.
It took a little bit of work but I rolled my own docker compose and it's been pretty solid. I pin the specific nextcloud version in my compose file (I don't like using :latest for things) and updating is as simple as incrementing the version, pulling the new image, and restarting the container. I've been running this way for a couple years now and I couldn't be happier with it.