et_full_system 0.1.23

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,303 @@
1
+ module EtFullSystem
2
+ #!/usr/bin/env ruby
3
+ # frozen_string_literal: true
4
+ require "rubygems"
5
+ require "thor"
6
+ require 'httparty'
7
+ require 'et_full_system/cli/local/file_storage'
8
+ require 'dotenv'
9
+
10
+ class LocalCommand < Thor
11
+ DEFAULT_BASE_URL="http://localhost:3200"
12
+ LOCK_FILE = File.join(Dir.tmpdir, 'et_full_system_traefik_rest_lockfile')
13
+ PROJECT_PATH = Dir.pwd
14
+ GEM_PATH = File.absolute_path('../../..', __dir__)
15
+
16
+ class RestProviderNotConfigured < RuntimeError; end
17
+ class ServiceUrlIncorrect < RuntimeError; end
18
+ desc "boot", "Sets up the server - traefik frontends and backends, along with initial data in local s3 and azure storage"
19
+ method_option :base_url, type: :string, default: DEFAULT_BASE_URL
20
+ def boot
21
+ STDERR.puts "boot - base_url is #{options[:base_url]}"
22
+ json_setup_file = File.absolute_path('../../../foreman/traefik.json', __dir__)
23
+ connect_retry_countdown = 10
24
+ begin
25
+ resp = HTTParty.put "#{options[:base_url]}/api/providers/rest", body: File.read(json_setup_file) , headers: {'Content-Type': 'application/json', 'Accept': 'application/json'}
26
+ raise "Error from traefik when performing initial config says: #{resp.body}" unless (200..299).include? resp.code
27
+ sleep 1
28
+ rescue Errno::EADDRNOTAVAIL, Errno::ECONNREFUSED
29
+ connect_retry_countdown -= 1
30
+ if connect_retry_countdown.zero?
31
+ raise "Could not connect to the traefik API after 10 retries (boot)"
32
+ else
33
+ STDERR.puts "boot - Retrying connection to traefik API in 5 seconds"
34
+ sleep 5
35
+ retry
36
+ end
37
+ end
38
+ end
39
+
40
+ method_option :base_url, type: :string, default: DEFAULT_BASE_URL
41
+ method_option :wait, type: :boolean, default: false, desc: "If set, the command will retry up to 10 times at 5 second intervals to connect to traefik. If not set, will fail immediately"
42
+ desc "update_service_url SERVICE URL", "Configures the reverse proxy to connect to a specific url for a service"
43
+ def update_service_url(service, url)
44
+ within_rest_lock do
45
+ update_rest_backend_url(service, url)
46
+ end
47
+ end
48
+
49
+ method_option :base_url, type: :string, default: DEFAULT_BASE_URL
50
+ desc "wait_for_support", "Waits for the servers support services to be ready - useful to call before starting application services"
51
+ def wait_for_support
52
+ connect_retry_countdown = 10
53
+ setup_retry_countdown = 10
54
+
55
+ begin
56
+ resp = HTTParty.get "#{options[:base_url]}/api/providers/rest", headers: {'Content-Type': 'application/json', 'Accept': 'application/json'}
57
+ raise RestProviderNotConfigured if resp.code == 404
58
+ rescue Errno::EADDRNOTAVAIL, Errno::ECONNREFUSED
59
+ connect_retry_countdown -= 1
60
+ if connect_retry_countdown.zero?
61
+ raise "Could not connect to the traefik API after 10 retries (wait_for_support)"
62
+ else
63
+ STDERR.puts "wait_for_support - Retrying connection to traefik API in 5 seconds"
64
+ sleep 5
65
+ retry
66
+ end
67
+ rescue RestProviderNotConfigured
68
+ setup_retry_countdown -= 1
69
+ if setup_retry_countdown.zero?
70
+ raise "Could not find the REST provider in traefik after 10 retries"
71
+ else
72
+ STDERR.puts "Re checking for the REST provider in traefik in 5 seconds"
73
+ sleep 5
74
+ retry
75
+ end
76
+ end
77
+ STDERR.puts "Support services now ready"
78
+ end
79
+
80
+
81
+ desc "server", "Starts the full system server"
82
+ method_option :without, type: :array, default: [], banner: "service1 service2", desc: "If specified, disables the specified services from running. The services are et1_web, et1_sidekiq, et3_web, mail_web, api_web, api_sidekiq, admin_web, atos_api_web, s3_web, azure_blob_web, fake_acas_web"
83
+ method_option :azurite_storage_path, default: '/tmp/azurite_storage', desc: "Where to store azurite data"
84
+ method_option :minio_storage_path, default: '/tmp/minio_storage', desc: "Where to store minio data"
85
+ def server
86
+ puts "Scheduling traefik config and file storage config"
87
+ pid = fork do
88
+ self.class.start(['boot'])
89
+ EtFullSystem::Cli::Local::FileStorageCommand.start(['setup'])
90
+ end
91
+ Process.detach(pid)
92
+
93
+ puts "Starting Procfile"
94
+ ::Bundler.with_original_env do
95
+ concurrency = " -c #{procfile_concurrency_without(options[:without]).join(',')}"
96
+ cmd = "AZURITE_STORAGE_PATH=\"#{options[:azurite_storage_path]}\" MINIO_STORAGE_PATH=\"#{options[:minio_storage_path]}\" FS_ROOT_PATH=#{PROJECT_PATH} FOREMAN_PATH=#{GEM_PATH}/foreman forego start -f \"#{GEM_PATH}/foreman/Procfile\" -e \"#{GEM_PATH}/foreman/.env\"#{concurrency}"
97
+ STDERR.puts cmd
98
+ exec(cmd)
99
+ end
100
+ end
101
+
102
+ desc "file_storage <commands>", "Tools for the 'local cloud' file storage"
103
+ subcommand "file_storage", ::EtFullSystem::Cli::Local::FileStorageCommand
104
+
105
+ desc "setup", "Sets up everything ready for first run"
106
+ def setup
107
+ setup_depencencies
108
+ setup_services
109
+ end
110
+
111
+ desc "setup_services", "Sets up all services in one command"
112
+ def setup_services
113
+ ::Bundler.with_original_env do
114
+ setup_et1_service
115
+ setup_et3_service
116
+ setup_api_service
117
+ setup_admin_service
118
+ setup_atos_service
119
+ end
120
+ end
121
+
122
+ desc "setup_dependencies", "Sets up all local dependencies"
123
+ def setup_depencencies
124
+ cmd = "bash --login -c \"cd /tmp && git clone https://github.com/ministryofjustice/et_fake_acas_server.git && cd et_fake_acas_server && gem build -o et_fake_acas_server.gem et_fake_acas_server && gem install et_fake_acas_server.gem && cd .. && rm -rf et_fake_acas_server\""
125
+ STDERR.puts cmd
126
+ external_command cmd, 'setup_dependencies'
127
+ end
128
+
129
+ desc "service_env SERVICE", "Returns the environment variables configured for the specified service"
130
+ def service_env(service)
131
+ lookup = {
132
+ 'atos_api' => :et_atos,
133
+ 'admin' => :et_admin,
134
+ 'api' => :et_api,
135
+ 'et1' => :et1,
136
+ 'et3' => :et3
137
+ }
138
+ file = lookup.fetch(service)
139
+ parsed = Dotenv.parse("#{GEM_PATH}/foreman/.env", "#{GEM_PATH}/foreman/#{file}.env")
140
+ parsed.each_pair do |name, value|
141
+ puts "#{name}=#{value}"
142
+ end
143
+
144
+ end
145
+
146
+ private
147
+
148
+ def procfile_services
149
+ File.readlines("#{GEM_PATH}/foreman/Procfile").inject([]) do |acc, line|
150
+ next if line.strip.start_with?('#')
151
+ acc + [line.split(':').first]
152
+ end
153
+ end
154
+
155
+ def procfile_concurrency_without(without)
156
+ procfile_services.map {|service| "#{service}=#{without.include?(service) ? 0 : 1}"}
157
+ end
158
+
159
+ def external_command(cmd, tag)
160
+ IO.popen(cmd) do |io|
161
+ io.each do |line|
162
+ puts "| #{tag} | #{line}"
163
+ end
164
+ end
165
+ end
166
+
167
+ def setup_et1_service
168
+ puts "------------------------------------------------ SETTING UP ET1 SERVICE ---------------------------------------------------"
169
+ cmd = "bash --login -c \"cd #{PROJECT_PATH}/systems/et1 && dotenv -f \"#{GEM_PATH}/foreman/.env\" dotenv -f \"#{GEM_PATH}/foreman/et1.env\" bundle install\""
170
+ puts cmd
171
+ external_command cmd, 'et1 setup'
172
+
173
+ cmd = "bash --login -c \"cd #{PROJECT_PATH}/systems/et1 && npm install\""
174
+ puts cmd
175
+ external_command cmd, 'et1 setup'
176
+
177
+ cmd ="bash --login -c \"cd #{PROJECT_PATH}/systems/et1 && dotenv -f \"#{GEM_PATH}/foreman/.env\" dotenv -f \"#{GEM_PATH}/foreman/et1.env\" bundle exec rake db:create db:migrate assets:precompile\""
178
+ puts cmd
179
+ external_command cmd, 'et1 setup'
180
+ end
181
+
182
+ def setup_et3_service
183
+ puts "------------------------------------------------ SETTING UP ET3 SERVICE ---------------------------------------------------"
184
+ cmd ="bash --login -c \"cd #{PROJECT_PATH}/systems/et3 && dotenv -f \"#{GEM_PATH}/foreman/.env\" dotenv -f \"#{GEM_PATH}/foreman/et3.env\" bundle install --without=development test\""
185
+ puts cmd
186
+ external_command cmd, 'et3 setup'
187
+
188
+ cmd ="bash --login -c \"cd #{PROJECT_PATH}/systems/et3 && dotenv -f \"#{GEM_PATH}/foreman/.env\" dotenv -f \"#{GEM_PATH}/foreman/et3.env\" bundle exec rake db:create db:migrate assets:precompile\""
189
+ puts cmd
190
+ external_command cmd, 'et3 setup'
191
+ end
192
+
193
+ def setup_admin_service
194
+ puts "------------------------------------------------ SETTING UP ADMIN SERVICE ---------------------------------------------------"
195
+ cmd ="bash --login -c \"cd #{PROJECT_PATH}/systems/admin && dotenv -f \"#{GEM_PATH}/foreman/.env\" dotenv -f \"#{GEM_PATH}/foreman/et_admin.env\" bundle install --without=development test\""
196
+ puts cmd
197
+ external_command cmd, 'admin setup'
198
+
199
+ puts "| Admin | Running rake commands"
200
+ cmd ="bash --login -c \"cd #{PROJECT_PATH}/systems/admin && dotenv -f \"#{GEM_PATH}/foreman/.env\" dotenv -f \"#{GEM_PATH}/foreman/et_admin.env\" bundle exec rake db:seed assets:precompile\""
201
+ puts cmd
202
+ external_command cmd, 'admin setup'
203
+ end
204
+
205
+ def setup_api_service
206
+ puts "------------------------------------------------ SETTING UP API SERVICE ---------------------------------------------------"
207
+ cmd ="bash --login -c \"cd #{PROJECT_PATH}/systems/api && dotenv -f \"#{GEM_PATH}/foreman/.env\" dotenv -f \"#{GEM_PATH}/foreman/et_api.env\" bundle install --without=development test\""
208
+ puts cmd
209
+ external_command cmd, 'api setup'
210
+
211
+ puts "| API | Running rake commands"
212
+ cmd ="bash --login -c \"cd #{PROJECT_PATH}/systems/api && dotenv -f \"#{GEM_PATH}/foreman/.env\" dotenv -f \"#{GEM_PATH}/foreman/et_api.env\" bundle exec rake db:create db:migrate db:seed\""
213
+ puts cmd
214
+ external_command cmd, 'api setup'
215
+ end
216
+
217
+ def setup_atos_service
218
+ puts "------------------------------------------------ SETTING UP ATOS SERVICE ---------------------------------------------------"
219
+ cmd ="bash --login -c \"cd #{PROJECT_PATH}/systems/atos && dotenv -f \"#{GEM_PATH}/foreman/.env\" dotenv -f \"#{GEM_PATH}/foreman/et_atos.env\" bundle install --without=development test\""
220
+ puts cmd
221
+ external_command cmd, 'atos setup'
222
+ end
223
+
224
+ def update_rest_backend_url(service, url)
225
+ connect_retry_countdown = 10
226
+ setup_retry_countdown = 10
227
+ begin
228
+ resp = HTTParty.get "#{options[:base_url]}/api/providers/rest", headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }
229
+ raise RestProviderNotConfigured if resp.code == 404
230
+ rescue Errno::EADDRNOTAVAIL, Errno::ECONNREFUSED
231
+ connect_retry_countdown -= 1
232
+ if !options[:wait]
233
+ fail "Could not connect to the traefik API - specify --wait to keep retrying when this happens"
234
+ elsif connect_retry_countdown.zero?
235
+ fail "Could not connect to the traefik API after 10 retries (update_rest_backend_url)"
236
+ else
237
+ STDERR.puts "update_rest_backend_url - Retrying connection to traefik API in 5 seconds"
238
+ sleep 5
239
+ retry
240
+ end
241
+ rescue RestProviderNotConfigured
242
+ setup_retry_countdown -= 1
243
+ if !options[:wait]
244
+ fail "The REST provider in traefik is not yet setup - specify --wait to keep retrying when this happens (i.e to wait for another command to set it up)"
245
+ elsif setup_retry_countdown.zero?
246
+ fail "Could not find the REST provider in traefik after 10 retries"
247
+ else
248
+ STDERR.puts "Re checking for the REST provider in traefik in 5 seconds"
249
+ sleep 5
250
+ retry
251
+ end
252
+ end
253
+
254
+ json = resp.parsed_response.dup
255
+ backend = json['backends'][service]
256
+ raise "Unknown service called #{service} - valid options are #{json['backends'].keys.join(', ')}" if backend.nil?
257
+
258
+ container = backend.dig('servers', 'web')
259
+ raise "The service '#{service}' has no server called 'web' - it must have for this command to work" if container.nil?
260
+
261
+ if container['url'] != url
262
+ container['url'] = url
263
+ put_resp = HTTParty.put "#{options[:base_url]}/api/providers/rest", body: json.to_json, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }
264
+ raise "Error from traefik says: #{put_resp.body}" unless (200..299).include? put_resp.code
265
+
266
+ validate_rest_backend_url(service, url)
267
+ STDERR.puts "The url for service '#{service}' is now '#{url}'"
268
+ else
269
+ STDERR.puts "The url for service '#{service}' was already '#{url}'"
270
+ end
271
+ end
272
+
273
+ def validate_rest_backend_url(service, url)
274
+ retry_countdown = 10
275
+ begin
276
+ resp = HTTParty.get "#{options[:base_url]}/api/providers/rest", headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }
277
+ raise ServiceUrlIncorrect unless (200..299).include?(resp.code) && resp.parsed_response.dig('backends', service, 'servers', 'web', 'url') == url
278
+ return
279
+ rescue ServiceUrlIncorrect
280
+ retry_countdown -= 1
281
+ raise if retry_countdown.zero?
282
+
283
+ STDERR.puts "Retrying request to validate the url of '#{service}' is '#{url}' in 1 second"
284
+ sleep 1
285
+ retry
286
+ end
287
+ end
288
+
289
+ def within_rest_lock(wait: 60 * 60 * 24, timeout: 60)
290
+ File.open(LOCK_FILE, File::RDWR|File::CREAT, 0644) do |file|
291
+ Timeout::timeout(wait) { file.flock(File::LOCK_EX) }
292
+ Timeout::timeout(timeout) { yield file }
293
+ end
294
+ end
295
+
296
+ def summarise_json(json)
297
+ json['backends'].inject({}) do |acc, (service, value)|
298
+ acc[service] = value.dig('servers', 'web', 'url')
299
+ acc
300
+ end
301
+ end
302
+ end
303
+ end
@@ -0,0 +1,2 @@
1
+ require 'et_full_system/cli/local'
2
+ require 'et_full_system/cli/docker'
@@ -0,0 +1,3 @@
1
+ module EtFullSystem
2
+ VERSION = "0.1.23"
3
+ end
@@ -0,0 +1,5 @@
1
+ require "et_full_system/version"
2
+
3
+ module EtFullSystem
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,20 @@
1
+ #!/bin/bash
2
+ mkdir /home/app/public
3
+ sudo chown app:app /home/app/full_system/systems/et1/public/apply/assets
4
+ sudo chown app:app /home/app/full_system/systems/et3/public/assets
5
+ sudo chown app:app /home/app/full_system/systems/admin/public/assets
6
+ sudo chown app:app /home/app/full_system/systems/et1/node_modules
7
+ sudo chown app:app /home/app/full_system/systems/et1/log
8
+ sudo chown app:app /home/app/full_system/systems/et3/log
9
+ sudo chown app:app /home/app/full_system/systems/admin/log
10
+ sudo chown app:app /home/app/full_system/systems/api/log
11
+ sudo chown app:app /home/app/full_system/systems/atos/lib/rails_container/log
12
+ sudo chown app:app /home/app/full_system/systems/et3/node_modules
13
+ sudo chown app:app /home/app/full_system/systems/admin/node_modules
14
+ sudo chown app:app /home/app/full_system/systems/et1/.bundle
15
+ sudo chown app:app /home/app/full_system/systems/et3/.bundle
16
+ sudo chown app:app /home/app/full_system/systems/api/.bundle
17
+ sudo chown app:app /home/app/full_system/systems/admin/.bundle
18
+ sudo chown app:app /home/app/full_system/systems/atos/.bundle
19
+ sudo chown app:app /home/app/minio_data
20
+ sudo chown app:app /home/app/azure_storage_data
@@ -0,0 +1,32 @@
1
+ #!/bin/bash
2
+ env
3
+ mkdir /home/app/public
4
+ sudo chown app:app /home/app/full_system/systems/et1/public/apply/assets
5
+ sudo chown app:app /home/app/full_system/systems/et3/public/assets
6
+ sudo chown app:app /home/app/full_system/systems/admin/public/assets
7
+ sudo chown app:app /home/app/full_system/systems/et1/node_modules
8
+ sudo chown app:app /home/app/full_system/systems/et1/log
9
+ sudo chown app:app /home/app/full_system/systems/et3/log
10
+ sudo chown app:app /home/app/full_system/systems/admin/log
11
+ sudo chown app:app /home/app/full_system/systems/api/log
12
+ sudo chown app:app /home/app/full_system/systems/atos/lib/rails_container/log
13
+ sudo chown app:app /home/app/full_system/systems/et3/node_modules
14
+ sudo chown app:app /home/app/full_system/systems/admin/node_modules
15
+ sudo chown app:app /home/app/full_system/systems/et1/.bundle
16
+ sudo chown app:app /home/app/full_system/systems/et3/.bundle
17
+ sudo chown app:app /home/app/full_system/systems/api/.bundle
18
+ sudo chown app:app /home/app/full_system/systems/admin/.bundle
19
+ sudo chown app:app /home/app/full_system/systems/atos/.bundle
20
+ sudo chown app:app /home/app/minio_data
21
+ sudo chown app:app /home/app/azure_storage_data
22
+
23
+ parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
24
+ et_full_system local setup_services
25
+ echo "------------------------------------------------ SETTING UP FULL SYSTEM ---------------------------------------------------"
26
+ /usr/local/rvm/bin/rvm use
27
+ bundle install --without=development --with=production test
28
+ bundle exec et_full_system local setup &
29
+ bundle exec et_full_system local file_storage setup &
30
+ export FOREMAN_PATH="`bundle show et_full_system | tail -1`/foreman"
31
+ export FS_ROOT_PATH=$PWD;
32
+ forego start -f "${FOREMAN_PATH}/Procfile" -e "${FOREMAN_PATH}/.env"
metadata ADDED
@@ -0,0 +1,188 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: et_full_system
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.23
5
+ platform: ruby
6
+ authors:
7
+ - Gary Taylor
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-04-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.20'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.20'
27
+ - !ruby/object:Gem::Dependency
28
+ name: httparty
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.16'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.16'
41
+ - !ruby/object:Gem::Dependency
42
+ name: aws-sdk-s3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.9'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: azure-storage
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.15.0.preview
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.15.0.preview
69
+ - !ruby/object:Gem::Dependency
70
+ name: dotenv
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.7'
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 2.7.2
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: '2.7'
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 2.7.2
89
+ - !ruby/object:Gem::Dependency
90
+ name: bundler
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.16'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.16'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rake
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '10.0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '10.0'
117
+ description: Runs the employment tribunals system - all services and background jobs
118
+ email:
119
+ - gary.taylor@hmcts.net
120
+ executables:
121
+ - et_full_system
122
+ extensions: []
123
+ extra_rdoc_files: []
124
+ files:
125
+ - ".gitignore"
126
+ - ".rspec"
127
+ - ".ruby-version"
128
+ - ".travis.yml"
129
+ - CODE_OF_CONDUCT.md
130
+ - Gemfile
131
+ - Gemfile.lock
132
+ - LICENSE.txt
133
+ - README.md
134
+ - Rakefile
135
+ - bin/console
136
+ - bin/setup
137
+ - docker/Dockerfile
138
+ - docker/docker-compose.yml
139
+ - et_full_system.gemspec
140
+ - exe/et_full_system
141
+ - foreman/.env
142
+ - foreman/.foreman
143
+ - foreman/Procfile
144
+ - foreman/et1.env
145
+ - foreman/et3.env
146
+ - foreman/et_admin.env
147
+ - foreman/et_api.env
148
+ - foreman/et_atos.env
149
+ - foreman/mailhog.env
150
+ - foreman/minio.env
151
+ - foreman/ports.env
152
+ - foreman/s3/.env
153
+ - foreman/traefik.json
154
+ - foreman/traefik.toml
155
+ - lib/et_full_system.rb
156
+ - lib/et_full_system/cli.rb
157
+ - lib/et_full_system/cli/docker.rb
158
+ - lib/et_full_system/cli/docker/server.rb
159
+ - lib/et_full_system/cli/local.rb
160
+ - lib/et_full_system/cli/local/file_storage.rb
161
+ - lib/et_full_system/version.rb
162
+ - shell_scripts/docker_bootstrap.sh
163
+ - shell_scripts/run_foreman
164
+ homepage: https://github.com/ministryofjustice/et-full-system
165
+ licenses:
166
+ - MIT
167
+ metadata:
168
+ allowed_push_host: http://mygemserver.com
169
+ post_install_message:
170
+ rdoc_options: []
171
+ require_paths:
172
+ - lib
173
+ required_ruby_version: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ required_rubygems_version: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ requirements: []
184
+ rubygems_version: 3.0.3
185
+ signing_key:
186
+ specification_version: 4
187
+ summary: Runs the employment tribunals system - all services and background jobs
188
+ test_files: []