convox_installer 1.0.9 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +23 -1
- data/.vscode/settings.json +2 -2
- data/Gemfile +2 -2
- data/README.md +6 -3
- data/convox_installer.gemspec +18 -17
- data/examples/full_installation.rb +75 -75
- data/lib/convox/client.rb +130 -91
- data/lib/convox.rb +1 -1
- data/lib/convox_installer/config.rb +35 -34
- data/lib/convox_installer/requirements.rb +27 -18
- data/lib/convox_installer/version.rb +1 -1
- data/lib/convox_installer.rb +7 -7
- data/spec/lib/convox/client_spec.rb +92 -56
- data/spec/lib/convox_installer/config_spec.rb +140 -140
- data/spec/lib/convox_installer/requirements_spec.rb +63 -34
- data/spec/spec_helper.rb +1 -1
- metadata +20 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9b7140386f111c59db16b8db7429b2fb3a5c1a48372a2559e2e2c5499d59dd2
|
4
|
+
data.tar.gz: 6e94e2c459c01426f8b6d2adc7d232f630e9711722947d2899b20ea509089c47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64741ea4bd8a4e03d30172d366976e7d18c99cd2dff1f27ceaf5106d86de56c46fc0302fed774669f5a513d3b5cd8212b3b94e54687a539b235e545b3a9c90cb
|
7
|
+
data.tar.gz: 67966065258259f0b64c7572895ee884f4e34c55e4f9c1ddbff90cf431e8da78984706955b406655d8f0128f4edd21842559129aa5b7dde73a745a121ad44ce1
|
data/.rubocop.yml
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
require: rubocop-rspec
|
2
|
-
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
NewCops: enable
|
5
|
+
TargetRubyVersion: 2.5
|
6
|
+
|
7
|
+
Style/MixinUsage:
|
8
|
+
Exclude:
|
9
|
+
- examples/**/*
|
3
10
|
|
4
11
|
Metrics/LineLength:
|
5
12
|
Max: 100
|
@@ -39,3 +46,18 @@ Metrics/BlockLength:
|
|
39
46
|
|
40
47
|
Metrics/BlockNesting:
|
41
48
|
Max: 7
|
49
|
+
|
50
|
+
RSpec/MessageSpies:
|
51
|
+
Enabled: false
|
52
|
+
|
53
|
+
RSpec/StubbedMock:
|
54
|
+
Enabled: false
|
55
|
+
|
56
|
+
RSpec/MultipleExpectations:
|
57
|
+
Enabled: false
|
58
|
+
|
59
|
+
RSpec/ExampleLength:
|
60
|
+
Enabled: false
|
61
|
+
|
62
|
+
RSpec/AnyInstance:
|
63
|
+
Enabled: false
|
data/.vscode/settings.json
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,9 +2,12 @@
|
|
2
2
|
|
3
3
|
A Ruby gem that makes it easier to build a Convox installation script. This is like Chef/Ansible/Terraform for your initial Convox setup.
|
4
4
|
|
5
|
-
|
5
|
+
# Requirements: Convox v2
|
6
6
|
|
7
|
-
|
7
|
+
This version of `convox_installer` is only designed to work with Convox v2. Please install the v2 CLI by following the instructions at their old documentation site: https://docsv2.convox.com/introduction/installation
|
8
|
+
## USE AT YOUR OWN RISK! THIS CODE IS PROVIDED WITHOUT ANY WARRANTIES OR GUARANTEES
|
9
|
+
|
10
|
+
We have successfully set up a number of test and production deployments using this gem. Everything seems to work very well. The library also facilitates idempotency and crash-resistance, so you can easily re-run your installation script if something goes wrong. However, if anything goes wrong, then you can end up with a large AWS bill if you're not careful. If anything crashes then make sure you double-check everything in your AWS account and shut down any leftover resources. **USE THIS SOFTWARE AT YOUR OWN RISK.**
|
8
11
|
|
9
12
|
## Features
|
10
13
|
|
@@ -149,7 +152,7 @@ If there are any existing files at `~/.convox/host` or `~/.convox/rack`, this me
|
|
149
152
|
|
150
153
|
Runs `convox rack install ...`. Has some validations to ensure that all required settings are present.
|
151
154
|
|
152
|
-
#### `
|
155
|
+
#### `validate_convox_auth_and_write_host!`
|
153
156
|
|
154
157
|
After running `install_convox`, call this method to ensure that the the `~/.convox/auth` file has been updated with the correct details (checks the rack name and AWS region.) Then it sets the rack host in `~/.convox/host` (if not already set.)
|
155
158
|
|
data/convox_installer.gemspec
CHANGED
@@ -1,28 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
$LOAD_PATH.push File.expand_path(
|
4
|
-
require
|
3
|
+
$LOAD_PATH.push File.expand_path('lib', __dir__)
|
4
|
+
require 'convox_installer/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
7
|
+
s.name = 'convox_installer'
|
8
8
|
s.version = ConvoxInstaller::VERSION
|
9
9
|
s.platform = Gem::Platform::RUBY
|
10
|
-
s.authors = [
|
11
|
-
s.email = [
|
12
|
-
s.homepage =
|
13
|
-
s.summary =
|
14
|
-
s.description =
|
15
|
-
s.license =
|
16
|
-
s.required_ruby_version =
|
10
|
+
s.authors = ['Form Applications Inc.']
|
11
|
+
s.email = ['support@formapi.io']
|
12
|
+
s.homepage = 'https://github.com/FormAPI/convox_installer'
|
13
|
+
s.summary = 'Build a Convox installation workflow'
|
14
|
+
s.description = 'Build a Convox installation workflow'
|
15
|
+
s.license = 'MIT'
|
16
|
+
s.required_ruby_version = '>= 2.5'
|
17
17
|
|
18
|
-
s.add_runtime_dependency
|
19
|
-
s.add_runtime_dependency
|
20
|
-
s.add_runtime_dependency
|
21
|
-
s.add_runtime_dependency
|
22
|
-
s.add_runtime_dependency
|
18
|
+
s.add_runtime_dependency 'activesupport', '>= 5.2.3'
|
19
|
+
s.add_runtime_dependency 'highline', '>= 1.7.10'
|
20
|
+
s.add_runtime_dependency 'httparty', '>= 0.17.0'
|
21
|
+
s.add_runtime_dependency 'json', '>= 2.2.0'
|
22
|
+
s.add_runtime_dependency 'os', '>= 1.0.1'
|
23
23
|
|
24
|
-
s.files = `git ls-files`.split("\n").uniq.sort.reject(&:empty?) - [
|
24
|
+
s.files = `git ls-files`.split("\n").uniq.sort.reject(&:empty?) - ['Gemfile.lock']
|
25
25
|
s.test_files = `git ls-files spec test`.split("\n")
|
26
26
|
s.executables = []
|
27
|
-
s.require_paths = [
|
27
|
+
s.require_paths = ['lib']
|
28
|
+
s.metadata['rubygems_mfa_required'] = 'true'
|
28
29
|
end
|
@@ -9,82 +9,82 @@
|
|
9
9
|
# gem "convox_installer"
|
10
10
|
# end
|
11
11
|
|
12
|
-
$LOAD_PATH << File.expand_path(
|
13
|
-
require
|
12
|
+
$LOAD_PATH << File.expand_path('../lib', __dir__)
|
13
|
+
require 'pry-byebug'
|
14
14
|
|
15
|
-
require
|
15
|
+
require 'convox_installer'
|
16
16
|
include ConvoxInstaller
|
17
17
|
|
18
18
|
@log_level = Logger::DEBUG
|
19
19
|
|
20
|
-
MINIMAL_HEALTH_CHECK_PATH =
|
21
|
-
COMPLETE_HEALTH_CHECK_PATH =
|
22
|
-
|
23
|
-
S3_BUCKET_CORS_POLICY =
|
24
|
-
{
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
}
|
20
|
+
MINIMAL_HEALTH_CHECK_PATH = '/health/site'
|
21
|
+
COMPLETE_HEALTH_CHECK_PATH = '/health'
|
22
|
+
|
23
|
+
S3_BUCKET_CORS_POLICY = <<~JSON
|
24
|
+
{
|
25
|
+
"CORSRules": [
|
26
|
+
{
|
27
|
+
"AllowedOrigins": ["*"],
|
28
|
+
"AllowedHeaders": ["Authorization", "cache-control", "x-requested-with"],
|
29
|
+
"AllowedMethods": ["PUT", "POST", "GET"],
|
30
|
+
"MaxAgeSeconds": 3000
|
31
|
+
}
|
32
|
+
]
|
33
|
+
}
|
34
34
|
JSON
|
35
35
|
|
36
36
|
@prompts = ConvoxInstaller::Config::DEFAULT_PROMPTS + [
|
37
37
|
{
|
38
|
-
section:
|
38
|
+
section: 'Docker Registry Authentication',
|
39
39
|
info: "You should have received authentication details for the Docker Registry\n" \
|
40
|
-
|
40
|
+
'via email. If not, please contact support@example.com'
|
41
41
|
},
|
42
42
|
{
|
43
43
|
key: :docker_registry_url,
|
44
|
-
title:
|
45
|
-
value:
|
44
|
+
title: 'Docker Registry URL',
|
45
|
+
value: '691950705664.dkr.ecr.us-east-1.amazonaws.com'
|
46
46
|
},
|
47
47
|
{
|
48
48
|
key: :docker_registry_username,
|
49
|
-
title:
|
49
|
+
title: 'Docker Registry Username'
|
50
50
|
},
|
51
51
|
{
|
52
52
|
key: :docker_registry_password,
|
53
|
-
title:
|
53
|
+
title: 'Docker Registry Password'
|
54
54
|
},
|
55
55
|
{
|
56
56
|
key: :convox_app_name,
|
57
|
-
title:
|
58
|
-
value:
|
57
|
+
title: 'Convox App Name',
|
58
|
+
value: 'convox-app'
|
59
59
|
},
|
60
60
|
{
|
61
61
|
key: :default_service,
|
62
|
-
title:
|
63
|
-
value:
|
64
|
-
hidden: true
|
62
|
+
title: 'Default Convox Service (for domain)',
|
63
|
+
value: 'web',
|
64
|
+
hidden: true
|
65
65
|
},
|
66
66
|
{
|
67
67
|
key: :admin_email,
|
68
|
-
title:
|
69
|
-
prompt:
|
70
|
-
|
71
|
-
default:
|
68
|
+
title: 'Admin User Email',
|
69
|
+
prompt: 'Please enter the email address you would like to use ' \
|
70
|
+
'for the default admin user',
|
71
|
+
default: 'admin@example.com'
|
72
72
|
},
|
73
73
|
{
|
74
74
|
key: :admin_password,
|
75
|
-
title:
|
76
|
-
value: ->
|
75
|
+
title: 'Admin User Password',
|
76
|
+
value: -> { SecureRandom.hex(8) }
|
77
77
|
},
|
78
78
|
{
|
79
79
|
key: :s3_bucket_name,
|
80
|
-
title:
|
81
|
-
value: ->
|
80
|
+
title: 'S3 Bucket for Uploads',
|
81
|
+
value: -> { "app-uploads-#{SecureRandom.hex(4)}" }
|
82
82
|
},
|
83
83
|
{
|
84
84
|
key: :s3_bucket_cors_policy,
|
85
85
|
value: S3_BUCKET_CORS_POLICY,
|
86
|
-
hidden: true
|
87
|
-
}
|
86
|
+
hidden: true
|
87
|
+
}
|
88
88
|
]
|
89
89
|
|
90
90
|
ensure_requirements!
|
@@ -93,7 +93,7 @@ config = prompt_for_config
|
|
93
93
|
backup_convox_host_and_rack
|
94
94
|
install_convox
|
95
95
|
|
96
|
-
|
96
|
+
validate_convox_auth_and_write_host!
|
97
97
|
validate_convox_rack!
|
98
98
|
|
99
99
|
create_convox_app!
|
@@ -101,70 +101,70 @@ set_default_app_for_directory!
|
|
101
101
|
add_docker_registry!
|
102
102
|
create_s3_bucket!
|
103
103
|
|
104
|
-
puts
|
104
|
+
puts '=> Generating secret keys for authentication sessions and encryption...'
|
105
105
|
secret_key_base = SecureRandom.hex(64)
|
106
106
|
data_encryption_key = SecureRandom.hex(32)
|
107
107
|
|
108
108
|
puts "======> Default domain: #{default_service_domain_name}"
|
109
|
-
puts
|
110
|
-
puts
|
109
|
+
puts ' You can use this as a CNAME record after configuring a domain in convox.yml'
|
110
|
+
puts ' (Note: SSL will be configured automatically.)'
|
111
111
|
|
112
|
-
puts
|
112
|
+
puts '=> Setting environment variables to configure the application...'
|
113
113
|
|
114
114
|
env = {
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
115
|
+
'HEALTH_CHECK_PATH' => MINIMAL_HEALTH_CHECK_PATH,
|
116
|
+
'DOMAIN_NAME' => default_service_domain_name,
|
117
|
+
'AWS_ACCESS_KEY_ID' => s3_bucket_details.fetch(:access_key_id),
|
118
|
+
'AWS_ACCESS_KEY_SECRET' => s3_bucket_details.fetch(:secret_access_key),
|
119
|
+
'AWS_UPLOADS_S3_BUCKET' => s3_bucket_details.fetch(:name),
|
120
|
+
'AWS_UPLOADS_S3_REGION' => config.fetch(:aws_region),
|
121
|
+
'SECRET_KEY_BASE' => secret_key_base,
|
122
|
+
'DATA_ENCRYPTION_KEY' => data_encryption_key,
|
123
|
+
'ADMIN_NAME' => 'Admin',
|
124
|
+
'ADMIN_EMAIL' => config.fetch(:admin_email),
|
125
|
+
'ADMIN_PASSWORD' => config.fetch(:admin_password)
|
126
126
|
}
|
127
127
|
|
128
|
-
env_command_params = env.map { |k, v| "#{k}=\"#{v}\"" }.join(
|
128
|
+
env_command_params = env.map { |k, v| "#{k}=\"#{v}\"" }.join(' ')
|
129
129
|
run_convox_command! "env set #{env_command_params}"
|
130
130
|
|
131
|
-
puts
|
132
|
-
puts
|
133
|
-
run_convox_command!
|
131
|
+
puts '=> Initial deploy...'
|
132
|
+
puts '-----> Documentation: https://docs.convox.com/deployment/builds'
|
133
|
+
run_convox_command! 'deploy --wait'
|
134
134
|
|
135
|
-
puts
|
136
|
-
run_convox_command!
|
135
|
+
puts '=> Setting up the database...'
|
136
|
+
run_convox_command! 'run web rake db:create db:migrate db:seed'
|
137
137
|
|
138
|
-
puts
|
138
|
+
puts '=> Updating the health check path to include database tests...'
|
139
139
|
run_convox_command! "env set --promote --wait HEALTH_CHECK_PATH=#{COMPLETE_HEALTH_CHECK_PATH}"
|
140
140
|
|
141
141
|
puts
|
142
|
-
puts
|
142
|
+
puts 'All done!'
|
143
143
|
puts
|
144
144
|
puts "You can now visit #{default_service_domain_name} and sign in with:"
|
145
145
|
puts
|
146
146
|
puts " Email: #{config.fetch(:admin_email)}"
|
147
147
|
puts " Password: #{config.fetch(:admin_password)}"
|
148
148
|
puts
|
149
|
-
puts
|
150
|
-
puts
|
149
|
+
puts 'You can configure a custom domain name, auto-scaling, and other options in convox.yml.'
|
150
|
+
puts 'To deploy your changes, run: convox deploy --wait'
|
151
151
|
puts
|
152
152
|
puts "IMPORTANT: You should be very careful with the 'resources' section in convox.yml."
|
153
|
-
puts
|
154
|
-
puts
|
155
|
-
puts
|
156
|
-
puts
|
157
|
-
puts
|
153
|
+
puts 'If you remove, rename, or change these resources, then Convox will delete'
|
154
|
+
puts 'your database. This will result in downtime and a loss of data.'
|
155
|
+
puts 'To prevent this from happening, you can sign into your AWS account,'
|
156
|
+
puts 'visit the RDS and ElastiCache services, and enable "Termination Protection"'
|
157
|
+
puts 'for your database resources.'
|
158
158
|
puts
|
159
|
-
puts
|
159
|
+
puts 'To learn more about the convox CLI, run: convox --help'
|
160
160
|
puts
|
161
|
-
puts
|
161
|
+
puts ' * View the Convox documentation: https://docs.convox.com/'
|
162
162
|
puts
|
163
163
|
puts
|
164
|
-
puts
|
165
|
-
puts
|
164
|
+
puts 'To completely uninstall Convox from your AWS account,'
|
165
|
+
puts 'run the following steps (in this order):'
|
166
166
|
puts
|
167
|
-
puts
|
167
|
+
puts ' 1) Disable "Termination Protection" for any resource where it was enabled.'
|
168
168
|
puts
|
169
169
|
puts " 2) Delete all files from the #{config.fetch(:s3_bucket_name)} S3 bucket:"
|
170
170
|
puts
|
@@ -176,7 +176,7 @@ puts " 3) Delete the #{config.fetch(:s3_bucket_name)} S3 bucket:"
|
|
176
176
|
puts
|
177
177
|
puts " convox rack resources delete #{config.fetch(:s3_bucket_name)} --wait"
|
178
178
|
puts
|
179
|
-
puts
|
179
|
+
puts ' 4) Uninstall Convox (deletes all CloudFormation stacks and AWS resources):'
|
180
180
|
puts
|
181
181
|
puts " convox rack uninstall aws #{config.fetch(:stack_name)}"
|
182
182
|
puts
|