- Data migrations: Knex.js
- Deployment: Every repo contains a "deployment" directory with a dir each for "staging" and "production" with all of the Kubernetes manifests (deployment, service, configmap etc.) necessary. Everything except secrets, which are managed manually. These declarative configs get applied to our cluster by gitlab-ci.
- ORM: You're probably not going to like this as a rails guy, but I've moved away from full, ActiveRecord-style ORMs. They don't work particularly well for my use cases and I enjoy the flexibility and control a thinner library like knex gives me.
- Background tasks: These are implemented as standalone apps running in our cluster, either as deployed workers subscribed to a Google Cloud Pub/Sub queue or scheduled jobs deployed using the Kubernetes cronjob functionality.
APIs: Express for basically everything HTTP. A lot more of our stuff is moving to PubSub for inter-service communication.
- Front-end templates: Everything is server-side rendered React. We run separate front and back end servers, scaled independently. The Kubernetes ingress handles routing to the SSR/React app and API app as necessary.