This commit is contained in:
David Heinemeier Hansson
2023-01-07 15:32:25 +01:00
commit f7f61f697f
20 changed files with 522 additions and 0 deletions

6
lib/mrsk/commands.rb Normal file
View File

@@ -0,0 +1,6 @@
module Mrsk::Commands
end
require "mrsk/commands/app"
require "mrsk/commands/traefik"
require "mrsk/commands/registry"

28
lib/mrsk/commands/app.rb Normal file
View File

@@ -0,0 +1,28 @@
class Mrsk::Commands::App
attr_accessor :config
def initialize(config)
@config = config
end
def push
# TODO: Run 'docker buildx create --use' when needed
"docker buildx build --push --platform=linux/amd64,linux/arm64 -t #{config.image_with_version} ."
end
def pull
"docker pull #{config.image_with_version}"
end
def start
"docker run -d --rm --name #{config.service_with_version} #{config.envs} #{config.labels} #{config.image_with_version}"
end
def stop
"docker ps -q --filter label=service=#{config.service} | xargs docker stop"
end
def info
"docker ps --filter label=service=#{config.service}"
end
end

View File

@@ -0,0 +1,10 @@
class Mrsk::Commands::Registry
def login
if (user = ENV["DOCKER_USER"]).present? && (password = ENV["DOCKER_PASSWORD"]).present?
# FIXME: Find a way to hide PW so it's not shown on terminal
"docker login -u #{user} -p #{password}"
else
raise ArgumentError, "Missing DOCKER_USER or DOCKER_PASSWORD in ENV"
end
end
end

View File

@@ -0,0 +1,17 @@
class Mrsk::Commands::Traefik
def start
"docker run --name traefik " +
"--rm -d " +
"-p 80:80 " +
"-v /var/run/docker.sock:/var/run/docker.sock " +
"traefik --providers.docker"
end
def stop
"docker container stop traefik"
end
def info
"docker ps --filter name=traefik"
end
end

55
lib/mrsk/configuration.rb Normal file
View File

@@ -0,0 +1,55 @@
class Mrsk::Configuration
attr_accessor :service, :image, :servers, :env, :ssh_user
def self.load_file(file)
if file.exist?
new **YAML.load_file(file).symbolize_keys!
else
raise "Configuration file not found in #{file}"
end
end
def initialize(service:, image:, servers:, env: {}, ssh_user: "root")
@service, @image, @servers, @env, @ssh_user = service, image, servers, env, ssh_user
end
def servers
ENV["SERVERS"] || @servers
end
def version
@version ||= ENV["VERSION"] || `git rev-parse HEAD`.strip
end
def image_with_version
"#{image}:#{version}"
end
def service_with_version
"#{service}-#{version}"
end
def envs
parameterize "-e", \
{ "RAILS_MASTER_KEY" => master_key }.merge(env)
end
def labels
parameterize "--label", \
"service" => service,
"traefik.http.routers.#{service}.rule" => "'PathPrefix(`/`)'",
"traefik.http.services.#{service}.loadbalancer.healthcheck.path" => "/up",
"traefik.http.services.#{service}.loadbalancer.healthcheck.interval" => "1s",
"traefik.http.middlewares.#{service}.retry.attempts" => "3",
"traefik.http.middlewares.#{service}.retry.initialinterval" => "500ms"
end
private
def parameterize(param, hash)
hash.collect { |k, v| "#{param} #{k}=#{v}" }.join(" ")
end
def master_key
ENV["RAILS_MASTER_KEY"] || File.read(Rails.root.join("config/master.key"))
end
end

4
lib/mrsk/engine.rb Executable file
View File

@@ -0,0 +1,4 @@
module Mrsk
class Engine < ::Rails::Engine
end
end

3
lib/mrsk/version.rb Normal file
View File

@@ -0,0 +1,3 @@
module Mrsk
VERSION = "0.0.1"
end