Do you need a “cloud”, as in a programmatic API to access and provision a pile of compute and storage? Or do you mean a “cloud” as in a bunch of locally hosted productivity tools?
The first case, creating a pool of resources with API access to deploy VMs, can be accomplished with something like CloudStack or OpenStack. This is what you would want if you are just handing off compute and storage resources for other teams to provision and deploy software on.
If you are managing internal IT resources and software, especially critical infrastructure like DNS, NTP, virtual routers/firewalls, identity management platforms, then you probably want a a hypervisor solution like Proxmox, or Nutanix or VMware if you have need of the extra features and have the budget for it.
My base infrastructure and productivity suite looks like this:
- Proxmox + Ceph for hypervisor and storage
- Red Hat IdM for directory services and PKI
- Chrony for NTP and Bind for internal/external resolvers
- Grafana / Prometheus / Loki for metrics and log ingestion, alerting, and dashboards
- Ansible for configuration management
- Caddy for edge proxies
- OPNsense for virtual routers
- Gitlab for source control and issue tracking, and I abuse scheduled CI/CD a bit as a distributed scheduler
- Keycloak for SSO auth to hosted apps
- Outline for wiki
- Grist for hybrid spreadsheet / database
- OwnCloud Infinite Scale for document management, integrated with OnlyOffice and Draw.io
- JetBrains YouTrack for project management
- Sharry for large file sharing externally
Alternative experience here: I have managed 7 GitLab installs for the past 12 years, two of these having ~300 users and ~1000 repositories, and I update monthly on average. I have only had one update break in all that time, and it was because of starting another upgrade step without waiting for all of the background migrations to complete. GitLab support got us sorted out within a couple of hours. A great experience overall.
There is a complexity floor, however. I use GitLab personally because of its CI/CD implementation. Upgrading it requires some care because it’s a large and complex project. You have to read the errata and use the upgrade planner.
For small installations with a few users, and if there is no CI/CD preference, Forejo is probably the better choice for maintenance simplicity.