- Zero Downtime
- Graceful shutdowns
- Via Github Actions
- Zero infrastructure management overhead
The general idea is to have Github Actions test, build and deploy a Rails app to Google Cloud Compute Engine.
| { | |
| "hello": "world" | |
| } | |
| # trust google cloud load balancer ips | |
| # https://cloud.google.com/load-balancing/docs/https#x-forwarded-for_header | |
| config.action_dispatch.trusted_proxies = %w(130.211.0.0/22 35.191.0.0/16).map { |proxy| IPAddr.new(proxy) } |
| <% | |
| branch = `git rev-parse --abbrev-ref HEAD`.strip rescue ENV.fetch("RAILS_DATABASE_SUFFIX", "master") | |
| branch = branch.underscore.gsub(/[\.\/\-]/, '_') | |
| %> | |
| default: &default | |
| adapter: postgresql | |
| encoding: unicode | |
| pool: <%= ENV.fetch("RAILS_MAX_THREADS", 5) %> | |
| host: <%= ENV.fetch("RAILS_DATABASE_HOST", "127.0.0.1") %> |
| package main | |
| import ( | |
| "fmt" | |
| "log" | |
| "net/http" | |
| "net/http/httputil" | |
| "os" | |
| "golang.org/x/crypto/acme/autocert" |
| sudo setcap CAP_NET_BIND_SERVICE=+eip /path/to/binary |
| # config/initializers/resque.rb | |
| module Resque | |
| class Worker | |
| # Monkey patch linux_worker_pids because the original function tries to shell out. | |
| # Since we run distroless in production, there is no shell. | |
| # https://github.com/resque/resque/blob/7f6b88404dd18698f6f4023e18fdc1ae8318e5e5/lib/resque/worker.rb#L839 | |
| def linux_worker_pids | |
| [Process.pid] | |
| end | |
| end |
| docker system prune -a | |
| docker rm $(docker ps -a -f status=exited -q) | |
| https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes |
| METADATA=http://metadata.google.internal/computeMetadata/v1 | |
| SVC_ACCT=$METADATA/instance/service-accounts/default | |
| ACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' $SVC_ACCT/token | cut -d'"' -f 4) |