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 +4 -4
- data/bin/stack2.drs +1 -0
- data/lib/dry-stack/command_compose.rb +3 -2
- data/lib/dry-stack/command_line.rb +1 -0
- data/lib/dry-stack/stack.rb +42 -2
- data/lib/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74db3949077357c4b9e22706547e9075a0d49e58fa677c95e763d19835819834
|
4
|
+
data.tar.gz: 3dc0469e7a7620c44d53f92246626ea21db39c9608a53519983d194bfed6e3c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
5
|
+
_params = stack.options.merge params
|
6
|
+
yaml = stack.to_compose(_params).lines[1..].join
|
6
7
|
|
7
8
|
# substitute ENV variables
|
8
|
-
|
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
|
data/lib/dry-stack/stack.rb
CHANGED
@@ -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
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.
|
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-
|
11
|
+
date: 2022-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|