Off the top of my head we use AWS ECS which provides a rolling upgrade method. Push up the new container into ECR (from github actions after they pass tests) run the upgrade command, and new containers will start booting. Once they pass their health checks the load balancer starts serving traffic to them. Once they're live, the old containers are removed.
We also use a blue/green deployment method so we don't have to worry about breaking the production database with database changes.