To simplify development and deployment, we decided to use Docker to build our application images, Docker Compose to orchestrate our production containers, and Traefik to bind everything together.
Docker is a great tool since it allows us to make our backend app platform-agnostic. This allows us to migrate our infrastructure from one platform to another without much effort.
Docker Compose lets us define our services and how they connect to each other easily. The ability to have an outline of our services and have our containers managed automatically greatly benefits us and removes lots of manual effort on our developers' part.
While we initially used Nginx to route our traffic, we were tired of having to manually set up all of our configuration. So we decided to move to Traefik so that our containers are automatically routed and load-balanced, without any additional configuration. If we do need additional configuration, we are able to easily add the configuration in our Docker Compose files, rather than in some weird config file in /etc/
The best tool to use is the one you already know. This is what drove us to use Rails and PostgreSQL to power our backend. Rails is already optimized for web API development, which is perfect for our mobile apps. Active Record and the suite of other Rails tools lets us prototype and push production-grade code very fast.
Since Rails has existed for quite a long time, its ecosystem has had enough time to mature and provide a lot of support. This gives us a very solid foundation on which apps were battle-tested in production that we can rely on. This is crucial for a small team — we generally do not have the bandwidth to investigate weird issues with new frameworks nobody has ever seen before.