- Manage your own DBs for production. I used to manage my own but now I use IaaS for it. It's worth the extra cost even if your budget is low since it lowers your risk and lets you move faster. AWS Aurora is awesome but expensive. There's a SaaS/IaaS out there for most DBs. And they handle the backups!
- Use Kubernetes. k8s is awesome, I love it, but it is a beast and probably overkill for your solo ops team that is also multitasking.
- Manually SSH / rsync / scp directly onto prod.
Do:
- Version control (Git) everything
- Use containers where it makes sense (I use Docker when I'm not using Serverless). It keeps your dev and prod in sync and helps with immutable deployments (see later points)
- Use Infrastructure as Code
- Use Github actions to do your deploys
- Use immutable deployments. More time to setup but makes rollbacks easier and if you never hot patch production you can't create a unique state that can't be restored.
Finally, (and possibly controversially): use serverless where you can (I personally use AWS Lambda, S3, and Cloudfront).
My personal flow:
- All my infrastructure is in a parameterized CloudFormation template.
- The template is checked into Git with the service code.
- After CI runs the tests, CD builds my serverless functions and uploads the zip.
- Then it runs the cloudformation template.
The same flow also works for Docker except "uploads the zip" becomes "pushes the container"
Using this setup I can tear down and build up my setup in minutes, making it easy (and cheaper) to separate dev and production.