dry-stack 0.0.12 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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