dry-stack 0.0.12 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b042eab1b6fa003ac8c4f3f92bded92fba4949bd664eb33c3632fe9b21cff3d
4
- data.tar.gz: 9fcf393c3e78ae50995276375e4d827c00576aa5d5f0f5aff3f31694d32f81a9
3
+ metadata.gz: 74db3949077357c4b9e22706547e9075a0d49e58fa677c95e763d19835819834
4
+ data.tar.gz: 3dc0469e7a7620c44d53f92246626ea21db39c9608a53519983d194bfed6e3c0
5
5
  SHA512:
6
- metadata.gz: c3df1ae9f302a552c5e681f0b8ffd0efe1edfad71433e63c7552984381ad11dffb72ccd6dae3f7d9f6bbcfdbdb211ada225278d364d2d365ee8d1df024065e43
7
- data.tar.gz: 9b6a4964c7345421e135e75f33969bcac512452d2ef9ae271e1850111d0ce30ea1f43d9f8aa05d277797285a852162f6f8f21bb34938c1858e70f38e3b1435f0
6
+ metadata.gz: 33f32d96133400cca1c21dc58cc22f3cbf05504605f297c8809c15064a59ed79b761a10c67fe68b1c7621c5bd33809d2252c83a7594b9060a556238bb247f165
7
+ data.tar.gz: 16dcc21007ff1a3ed8cafa14b53d21e3a1edefa7086a07d1dc79658a920645199722e3273c7a8b6c8b1e032ec73840188b65d432ec5bb1eb44aa78f9616a312f
data/bin/stack2.drs CHANGED
@@ -1,5 +1,6 @@
1
1
  PublishPorts reports: 7000
2
2
  Ingress reports: {host: 'reports.*', protocol: :http, port: 7000}
3
+ Deploy admin: { replica: 2, 'resources.limits': { cpus: 4, memory: '500M' } }
3
4
 
4
5
  Service :admin, image: '$REGISTRY_HOST/frontend', env: { APP: 'admin' }, ports: 5000
5
6
  Service :reports, image: '$REGISTRY_HOST/reports', env: { DB_URL: '$DB_URL' }
@@ -2,10 +2,11 @@ require_relative 'command_line'
2
2
 
3
3
  Dry::CommandLine::COMMANDS[:to_compose] = Class.new do
4
4
  def run(stack, params)
5
- yaml = stack.to_compose(params).lines[1..].join
5
+ _params = stack.options.merge params
6
+ yaml = stack.to_compose(_params).lines[1..].join
6
7
 
7
8
  # substitute ENV variables
8
- params[:'no-env'] ? $stdout.puts(yaml) : system("echo \"#{yaml.gsub("`", '\\\`')}\"")
9
+ _params[:'no-env'] ? $stdout.puts(yaml) : system("echo \"#{yaml.gsub("`", '\\\`')}\"")
9
10
  end
10
11
 
11
12
  def help = 'Print stack in docker compose format'
@@ -41,6 +41,7 @@ module Dry
41
41
  o.on('', '--name STACK_NAME', 'Define stack name')
42
42
  o.on('', '--ingress', 'Generate ingress labels') { true }
43
43
  o.on('', '--traefik', 'Generate traefik labels') { true }
44
+ o.on('', '--traefik_tls', 'Generate traefik tls labels') { true }
44
45
  o.on('-n', '--no-env', 'Do not process env variables') { true }
45
46
  o.on('-h', '--help') { puts o; exit }
46
47
  o.parse! args, into: params
@@ -20,7 +20,7 @@ module Dry
20
20
  class << self
21
21
  attr_accessor :last_stack
22
22
  end
23
- attr_accessor :name
23
+ attr_accessor :name, :options
24
24
 
25
25
  def Stack(name = nil, &)
26
26
  Stack.last_stack = Stack.new name
@@ -29,19 +29,33 @@ module Dry
29
29
 
30
30
  def initialize(name)
31
31
  @name = name || 'stack'
32
+ @options = {}
32
33
  @services = {}
33
34
  @networks = {}
34
35
  @publish_ports = {}
35
36
  @ingress = {}
37
+ @deploy = {}
36
38
  end
37
39
 
38
40
  def stringify(hash) = hash.to_h { |k, v| [k.to_s, v.is_a?(Hash) ? stringify(v) : v] }
41
+ def expand_hash(hash)
42
+ hash.select { _1.to_s =~ /\./ }.each do |k, v|
43
+ name = k.to_s.scan(/([^\.]*)\.(.*)/).flatten
44
+ hash.delete k
45
+ hash[name[0]] ||= {}
46
+ hash[name[0]][name[1]] ||= {}
47
+ hash[name[0]][name[1]].merge! v if v.is_a?(Hash)
48
+ hash[name[0]][name[1]] = v unless v.is_a?(Hash)
49
+ end
50
+ hash.each { expand_hash(_2) if _2.is_a?(Hash) }
51
+ hash
52
+ end
39
53
 
40
54
  def nginx_host2regexp(str)
41
55
  str.to_s.gsub('.', '\.').gsub('*', '.*')
42
56
  end
43
57
 
44
- def to_compose(opts = {})
58
+ def to_compose(opts = @options )
45
59
  compose = {
46
60
  # name: @name.to_s, # https://docs.docker.com/compose/compose-file/#name-top-level-element
47
61
  # Not allowed by docker stack deploy
@@ -78,6 +92,24 @@ module Dry
78
92
  ]
79
93
  end
80
94
 
95
+ if @ingress[name] && opts[:traefik_tls]
96
+ service_name = "#{@name}_#{name}"
97
+ service[:deploy][:labels] += [
98
+ 'traefik.enable=true',
99
+ "traefik.http.routers.#{service_name}.service=#{service_name}",
100
+ "traefik.http.services.#{service_name}.loadbalancer.server.port=#{@ingress[name][:port]}",
101
+ "traefik.http.routers.#{service_name}.rule=HostRegexp(`{name:#{nginx_host2regexp @ingress[name][:host]}}`)",
102
+ "traefik.http.routers.#{service_name}.entrypoints=http",
103
+ "traefik.http.routers.#{service_name}.middlewares=service_stack-https-redirect",
104
+ "traefik.http.routers.#{service_name}.rule=Host(`${REGISTRY_HOSTNAME}`)",
105
+ "traefik.http.routers.#{service_name}.entrypoints=https",
106
+ "traefik.http.routers.#{service_name}.tls=true",
107
+ "traefik.http.routers.#{service_name}.tls.certresolver=le"
108
+ ]
109
+ end
110
+
111
+ service[:deploy].merge! @deploy[name] if @deploy[name]
112
+
81
113
  service[:ports] = @publish_ports[name]&.zip(service[:ports] || @publish_ports[name])&.map { _1.join ':' }
82
114
  end
83
115
 
@@ -106,10 +138,18 @@ module Dry
106
138
  ServiceFunction.new(@services[name], &) if block_given?
107
139
  end
108
140
 
141
+ def Options(opts)
142
+ @options.merge! opts
143
+ end
144
+
109
145
  def Ingress(services)
110
146
  @ingress.merge! services
111
147
  end
112
148
 
149
+ def Deploy(services)
150
+ @deploy.merge! expand_hash(services)
151
+ end
152
+
113
153
  def Network(name, opts = {})
114
154
  @networks[name] ||= {}
115
155
  @networks[name].merge! opts
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  class Stack
3
- VERSION = '0.0.12'
3
+ VERSION = '0.0.14'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-stack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artyom B
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-10 00:00:00.000000000 Z
11
+ date: 2022-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake