In the beginning, there was monolith architecture. It was easy to deploy and easy to keep it running. We had only one thing (or a few) to keep an eye on. The monolith was not usually deployed very frequently. At the end of a release cycle, the development team would hand the operations team a package. The operations team would deploy and monitor this application to a handful of servers and make sure it was running smoothly. If some of these servers failed, the operations team would manually move the application to the remaining healthy servers.
But it was not perfect.
Monolith architecture
It was hard, if not impossible, to scale individual components. Changes to one tiny part of the application required a whole redeployment that had to be carefully planned, and the lack of clear boundaries could lead to a design that is not so great.