shared-infrastructure 0.0.13 → 0.0.15

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
  SHA1:
3
- metadata.gz: acbb88aca695caae7288c8b87d27a922f32db19b
4
- data.tar.gz: 4452c8a7ebaaef449cdefae36b70bd3369cef97f
3
+ metadata.gz: da04dfe750e140c1338ffdb29a780aec11cc5d67
4
+ data.tar.gz: f07c6a555130703d979dddec88f58c5eb02b7d51
5
5
  SHA512:
6
- metadata.gz: 934e545b36a97a2e1d1385e2bc49edbf913486abb3f311b14c5328c10d205c4bc3015ad092ee39c3d456a4471825f81858080781401a370b5b624acbd708e7ff
7
- data.tar.gz: de793ba382532a0f9d264416fcd465824b9d2f911071822129cce780ba6a4760667bc799accc1b23a62dcdff0cfa162e2ee65f4d095706265c5c5a4adcedccb0
6
+ metadata.gz: f82b761326514cc4ff6f9b3c65e0906546e2fe8f9adee2aa503e26a9069d45a311ffbe0e24ab2b62511345ad7e6031b61e4bca9a10ee429f2e19a3df177cd27a
7
+ data.tar.gz: 1818e9387a3037ae3ec2a26eeca27a1558fd44cfb0ccbf1d2fc14f276fbfbec51a2b33468cf1a80ab71ff5704288040e6ad8db2ec52f91ddc103673149550ef4
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "shared_infrastructure/output.rb"
4
+ require "shared_infrastructure/domain.rb"
3
5
  require "shared_infrastructure/nginx/nginx.rb"
4
6
  require "shared_infrastructure/nginx/server_block.rb"
5
7
  require "shared_infrastructure/nginx/server.rb"
@@ -7,11 +9,12 @@ require "shared_infrastructure/nginx/lines.rb"
7
9
  require "shared_infrastructure/nginx/listen.rb"
8
10
  require "shared_infrastructure/nginx/location.rb"
9
11
  require "shared_infrastructure/nginx/upstream.rb"
10
- require "shared_infrastructure/nginx/site.rb"
11
12
  require "shared_infrastructure/nginx/builder.rb"
13
+ require "shared_infrastructure/nginx/accel.rb"
12
14
  require "shared_infrastructure/runner/base.rb"
13
15
  require "shared_infrastructure/runner/reverse_proxy.rb"
14
16
  require "shared_infrastructure/runner/static_site.rb"
15
17
  require "shared_infrastructure/runner/rails.rb"
18
+ require "shared_infrastructure/runner/deploy.rb"
16
19
  require "shared_infrastructure/systemd/systemd.rb"
17
20
  require "shared_infrastructure/systemd/rails.rb"
@@ -0,0 +1,33 @@
1
+ module SharedInfrastructure
2
+ class Domain
3
+ def available_site
4
+ "/etc/nginx/sites-available/#{domain_name}"
5
+ end
6
+
7
+ def certbot_domain_names
8
+ "#{domain_name} www.#{domain_name}"
9
+ end
10
+
11
+ def certificate_directory
12
+ "/etc/letsencrypt/live/#{domain_name}"
13
+ end
14
+
15
+ def enabled_site
16
+ "/etc/nginx/sites-enabled/#{domain_name}"
17
+ end
18
+
19
+ def initialize(domain_name)
20
+ @domain_name = domain_name
21
+ end
22
+
23
+ def secrets
24
+ File.join(site_root, "secrets")
25
+ end
26
+
27
+ def site_root
28
+ "/var/www/#{domain_name}/html"
29
+ end
30
+
31
+ attr_reader :domain_name
32
+ end
33
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nginx
4
+ class Accel
5
+ def initialize(location_directory, domain: nil)
6
+ @domain = domain
7
+ @location_directory = location_directory.chomp("/").reverse.chomp("/").reverse
8
+ end
9
+
10
+ attr_reader :domain, :location_directory
11
+
12
+ def alias_string(domain_name)
13
+ File.join(Nginx.configuration.root_directory(domain ? domain.domain_name : domain_name), location_directory).to_s
14
+ end
15
+
16
+ def location
17
+ "/#{location_directory}"
18
+ end
19
+
20
+ def proxy_set_header(domain_name)
21
+ [
22
+ " proxy_set_header X-Sendfile-Type X-Accel-Redirect;",
23
+ " proxy_set_header X-Accel-Mapping #{alias_string(domain_name)}/=#{location}/;"
24
+ ].join("\n")
25
+ end
26
+ end
27
+ end
@@ -7,7 +7,9 @@ module Nginx
7
7
  module Builder
8
8
  module Https
9
9
  def save
10
- `openssl dhparam #{Nginx.dhparam} -out #{Nginx.certificate_directory(certificate_domain)}/dhparam.pem`
10
+ pem_file = "#{Nginx.certificate_directory(certificate_domain)}/dhparam.pem"
11
+ FileUtils.mkdir_p File.dirname(pem_file)
12
+ `openssl dhparam #{Nginx.dhparam} -out #{pem_file}`
11
13
  super
12
14
  end
13
15
  end
@@ -21,7 +23,7 @@ sudo nginx -s reload
21
23
 
22
24
  Then run the following command:
23
25
 
24
- sudo certbot certonly --webroot -w #{Nginx.root_directory(domain_name)} #{Nginx.certbot_domain_names(domain_name)}
26
+ sudo certbot certonly --webroot -w #{Nginx.root_directory(domain.domain_name)} #{Nginx.certbot_domain_names(domain.domain_name)}
25
27
 
26
28
  You can test renewal with:
27
29
 
@@ -31,42 +33,42 @@ Finally, re-run this script to configure nginx for TLS.
31
33
  )
32
34
  end
33
35
 
34
- def initialize(domain_name, *server_blocks)
36
+ def initialize(*server_blocks, domain: nil)
35
37
  # puts "Base#initialize domain_name: #{domain_name}"
36
38
  # puts "Base#initialize server_blocks.inspect: #{server_blocks.inspect}"
37
39
  @server_blocks = server_blocks
38
- @domain_name = domain_name
40
+ @domain = domain
39
41
  end
40
42
 
41
43
  def save
42
- puts "writing server block: #{Nginx.server_block_location(domain_name)}" if Runner.debug
43
- File.open(Nginx.server_block_location(domain_name), "w") do |f|
44
+ puts "writing server block: #{Nginx.server_block_location(domain.domain_name)}" if Runner.debug
45
+ File.open(Nginx.server_block_location(domain.domain_name), "w") do |f|
44
46
  f << to_s
45
47
  end
46
48
  puts "enabling site" if Runner.debug
47
- `ln -fs ../sites-available/#{domain_name} #{Nginx.enabled_server_block_location(domain_name)}`
49
+ `ln -fs ../sites-available/#{domain.domain_name} #{Nginx.enabled_server_block_location(domain.domain_name)}`
48
50
  end
49
51
 
50
52
  def to_s
51
53
  server_blocks.map(&:to_s).join("\n")
52
54
  end
53
55
 
54
- attr_reader :domain_name, :server_blocks
56
+ attr_reader :domain, :server_blocks
55
57
  end
56
58
 
57
59
  class ReverseProxyHttp < Base
58
- def initialize(domain_name, proxy_url, certificate_domain = nil)
59
- super(domain_name,
60
- Nginx::ServerBlock.new(
61
- server: Nginx::Server.new(domain_name),
62
- listen: Nginx::ListenHttp.new,
63
- location: [
64
- # TODO: the following should really only happen when the domains
65
- # are different.
66
- Nginx::AcmeLocation.new(certificate_domain || domain_name),
67
- Nginx::ReverseProxyLocation.new(proxy_url)
68
- ]
69
- )
60
+ def initialize(proxy_url, certificate_domain = nil, domain: nil)
61
+ super(Nginx::ServerBlock.new(
62
+ server: Nginx::Server.new(domain: domain),
63
+ listen: Nginx::ListenHttp.new,
64
+ location: [
65
+ # TODO: the following should really only happen when the domains
66
+ # are different.
67
+ Nginx::AcmeLocation.new(certificate_domain || domain.domain_name),
68
+ Nginx::ReverseProxyLocation.new(proxy_url)
69
+ ]
70
+ ),
71
+ domain: domain
70
72
  )
71
73
  end
72
74
 
@@ -80,16 +82,16 @@ Finally, re-run this script to configure nginx for TLS.
80
82
  class ReverseProxyHttps < Base
81
83
  include Https
82
84
 
83
- def initialize(domain_name, proxy_url, certificate_domain = nil)
84
- @certificate_domain = certificate_domain || domain_name
85
+ def initialize(proxy_url, certificate_domain = nil, domain: nil)
86
+ @certificate_domain = certificate_domain || domain.domain_name
85
87
 
86
- super(domain_name,
87
- Nginx::ServerBlock.new(
88
- server: Nginx::Server.new(domain_name),
89
- listen: Nginx::ListenHttps.new(domain_name, certificate_domain),
90
- location: Nginx::ReverseProxyLocation.new(proxy_url)
91
- ),
92
- Nginx::TlsRedirectServerBlock.new(domain_name)
88
+ super(Nginx::ServerBlock.new(
89
+ server: Nginx::Server.new(domain: domain),
90
+ listen: Nginx::ListenHttps.new(domain.domain_name, certificate_domain),
91
+ location: Nginx::ReverseProxyLocation.new(proxy_url)
92
+ ),
93
+ Nginx::TlsRedirectServerBlock.new(domain.domain_name),
94
+ domain: domain
93
95
  )
94
96
  end
95
97
 
@@ -97,17 +99,17 @@ Finally, re-run this script to configure nginx for TLS.
97
99
  end
98
100
 
99
101
  class Site < Base
100
- def initialize(domain_name, user, *server_blocks)
101
- super(domain_name, *server_blocks)
102
+ def initialize(user, *server_blocks, domain: nil)
103
+ super(*server_blocks, domain: domain)
102
104
  @user = user
103
105
  end
104
106
 
105
107
  def save
106
- FileUtils.mkdir_p(Nginx.root_directory(domain_name))
108
+ FileUtils.mkdir_p(Nginx.root_directory(domain.domain_name))
107
109
  if Process.uid.zero?
108
110
  FileUtils.chown(user,
109
111
  "www-data",
110
- Nginx.root_directory(domain_name))
112
+ Nginx.root_directory(domain.domain_name))
111
113
  end
112
114
  super
113
115
  end
@@ -116,14 +118,14 @@ Finally, re-run this script to configure nginx for TLS.
116
118
  end
117
119
 
118
120
  class SiteHttp < Site
119
- def initialize(domain_name, user, _certificate_domain = nil)
120
- super(domain_name,
121
- user,
121
+ def initialize(user, _certificate_domain = nil, domain: nil)
122
+ super(user,
122
123
  Nginx::StaticServerBlock.new(
123
- server: Nginx::Site.new(domain_name, user),
124
+ server: Nginx::StaticServer.new(domain: domain),
124
125
  listen: Nginx::ListenHttp.new,
125
126
  location: Nginx::Location.new
126
- )
127
+ ),
128
+ domain: domain
127
129
  )
128
130
  end
129
131
 
@@ -137,71 +139,90 @@ Finally, re-run this script to configure nginx for TLS.
137
139
  class SiteHttps < Site
138
140
  include Https
139
141
 
140
- def initialize(domain_name, user, certificate_domain = nil)
141
- @certificate_domain = certificate_domain || domain_name
142
+ def initialize(user, certificate_domain = nil, domain: nil)
143
+ @certificate_domain = certificate_domain || domain.domain_name
142
144
 
143
- super(domain_name,
144
- user,
145
+ super(user,
145
146
  Nginx::StaticServerBlock.new(
146
- server: Nginx::Site.new(domain_name, user),
147
- listen: Nginx::ListenHttps.new(domain_name, certificate_domain),
147
+ server: Nginx::StaticServer.new(domain: domain),
148
+ listen: Nginx::ListenHttps.new(domain.domain_name, certificate_domain),
148
149
  location: Nginx::Location.new
149
150
  ),
150
- Nginx::TlsRedirectServerBlock.new(domain_name)
151
+ Nginx::TlsRedirectServerBlock.new(domain.domain_name),
152
+ domain: domain
151
153
  )
152
154
  end
153
155
 
154
156
  attr_reader :certificate_domain
155
157
  end
156
158
 
157
- class RailsHttp < Site
158
- def initialize(domain_name, user, _certificate_domain = nil, accel_location: nil)
159
- super(domain_name,
160
- user,
159
+ class Rails < Site
160
+ def save
161
+ env = {}
162
+ %w[SECRET_KEY_BASE
163
+ DATABASE_USERNAME
164
+ DATABASE_PASSWORD
165
+ EMAIL_PASSWORD].each do |var|
166
+ env[var.to_sym] = if ENV[var].nil?
167
+ puts "Enter #{var}: "
168
+ $stdin.gets.strip
169
+ else
170
+ ENV[var]
171
+ end
172
+ end
173
+ File.open(SharedInfrastructure::Output.file_name(File.join(domain.site_root, "secrets")), "w", 0o600) do |io|
174
+ io << env.map { |pair| "#{pair[0]}=#{pair[1]}\n" }.join
175
+ end &&
176
+ Systemd::Rails.write_unit_file(domain.domain_name, domain) &&
177
+ super
178
+ end
179
+ end
180
+
181
+ class RailsHttp < Rails
182
+ def initialize(user, _certificate_domain = nil, accel_location: nil, domain: nil)
183
+ accel_location = Accel.new(accel_location, domain: domain) if accel_location
184
+ super(user,
161
185
  Nginx::RailsServerBlock.new(
162
- upstream: Nginx::Upstream.new(domain_name),
163
- server: Nginx::RailsServer.new(domain_name),
186
+ upstream: Nginx::Upstream.new(domain.domain_name),
187
+ server: Nginx::RailsServer.new(domain: domain),
164
188
  listen: Nginx::ListenHttp.new,
165
189
  location: [
166
- Nginx::RailsLocation.new(domain_name),
167
- accel_location ? Nginx::AccelLocation.new(accel_location) : nil,
168
- Nginx::ActionCableLocation.new(domain_name)
169
- ].compact
170
- )
190
+ Nginx::RailsLocation.new(domain.domain_name),
191
+ accel_location ? Nginx::AccelLocation.new(domain.domain_name, accel_location) : nil,
192
+ Nginx::ActionCableLocation.new(domain.domain_name)
193
+ ].compact,
194
+ accel_location: accel_location,
195
+ domain: domain
196
+ ),
197
+ domain: domain
171
198
  )
172
199
  end
173
-
174
- def save
175
- Systemd::Rails.write_unit_file(domain_name) && super
176
- end
177
200
  end
178
201
 
179
- class RailsHttps < Site
202
+ class RailsHttps < Rails
180
203
  include Https
181
204
 
182
- def initialize(domain_name, user, certificate_domain = nil, accel_location: nil)
183
- @certificate_domain = certificate_domain || domain_name
184
- super(domain_name,
185
- user,
205
+ def initialize(user, certificate_domain = nil, accel_location: nil, domain: nil)
206
+ @certificate_domain = certificate_domain || domain.domain_name
207
+ accel_location = Accel.new(accel_location, domain) if accel_location
208
+ super(user,
186
209
  Nginx::RailsServerBlock.new(
187
- upstream: Nginx::Upstream.new(domain_name),
188
- server: Nginx::RailsServer.new(domain_name),
189
- listen: Nginx::ListenHttps.new(domain_name, certificate_domain),
210
+ upstream: Nginx::Upstream.new(domain.domain_name),
211
+ server: Nginx::RailsServer.new(domain: domain),
212
+ listen: Nginx::ListenHttps.new(domain.domain_name, certificate_domain),
190
213
  location: [
191
- Nginx::RailsLocation.new(domain_name),
192
- accel_location ? Nginx::AccelLocation.new(accel_location) : nil,
193
- Nginx::ActionCableLocation.new(domain_name)
194
- ].compact
214
+ Nginx::RailsLocation.new(domain.domain_name),
215
+ accel_location ? Nginx::AccelLocation.new(domain.domain_name, accel_location) : nil,
216
+ Nginx::ActionCableLocation.new(domain.domain_name)
217
+ ].compact,
218
+ accel_location: accel_location,
219
+ domain: domain
195
220
  ),
196
- Nginx::TlsRedirectServerBlock.new(domain_name)
221
+ Nginx::TlsRedirectServerBlock.new(domain.domain_name),
222
+ domain: domain
197
223
  )
198
224
  end
199
225
 
200
- # FIXME: DRY this up with the HTTP class.
201
- def save
202
- Systemd::Rails.write_unit_file(domain_name) && super
203
- end
204
-
205
226
  attr_reader :certificate_domain
206
227
  end
207
228
  end
@@ -18,19 +18,21 @@ module Nginx
18
18
  end
19
19
 
20
20
  class AccelLocation < Location
21
- def initialize(location, root = "/")
21
+ def initialize(domain_name, accel, domain: nil)
22
22
  super(location)
23
- @root = root
23
+ @domain = domain
24
+ @domain_name = domain_name
25
+ @accel = accel
24
26
  end
25
27
 
26
28
  def to_s(level = 0)
27
- Lines.new("location /#{location.chomp("/").reverse.chomp("/").reverse}/ {",
29
+ Lines.new("location #{accel.location} {",
28
30
  " internal;",
29
- " root #{root};",
31
+ " alias #{accel.alias_string(domain ? domain.name : domain_name)};",
30
32
  "}").format(level)
31
33
  end
32
34
 
33
- attr_reader :location, :root
35
+ attr_reader :accel, :domain, :domain_name
34
36
  end
35
37
 
36
38
  class AcmeLocation < Location
@@ -4,20 +4,21 @@ module Nginx
4
4
  ##
5
5
  # The server_name line of a server block.
6
6
  class Server
7
- attr_reader :domain_name
7
+ def initialize(domain: nil)
8
+ @domain = domain
9
+ end
10
+
11
+ attr_reader :domain
8
12
 
9
- def initialize(domain_name)
10
- @domain_name = domain_name
13
+ def root_directory
14
+ domain.site_root
11
15
  end
12
16
 
13
17
  def to_s(level = 0)
14
- Lines.new("server_name #{Nginx.certbot_domain_names(domain_name)};").format(level)
18
+ Lines.new("server_name #{domain.certbot_domain_names};").format(level)
15
19
  end
16
20
  end
17
21
 
18
- ##
19
- # Server name and site location for a static site.
20
- # TODO: I don't like the way this gets twisted when subclassing.
21
22
  class StaticServer < Server
22
23
  def to_s(level = 0)
23
24
  [
@@ -32,7 +33,7 @@ module Nginx
32
33
 
33
34
  class RailsServer < Server
34
35
  def root_directory
35
- File.join(Nginx.root_directory(domain_name), "public")
36
+ File.join(domain.site_root, "public")
36
37
  end
37
38
 
38
39
  def to_s(level = 0)
@@ -42,7 +43,7 @@ module Nginx
42
43
  "# http://stackoverflow.com/a/11313241/3109926 said the following",
43
44
  "# is what serves from public directly without hitting Puma",
44
45
  "root #{root_directory};",
45
- "try_files $uri/index.html $uri @#{domain_name};",
46
+ "try_files $uri/index.html $uri @#{domain.domain_name};",
46
47
  "error_page 500 502 503 504 /500.html;",
47
48
  "client_max_body_size 4G;",
48
49
  "keepalive_timeout 10;"
@@ -4,7 +4,9 @@
4
4
  # Write nginx configuration files.
5
5
  module Nginx
6
6
  class ServerBlock
7
- def initialize(upstream: nil, server: nil, listen: nil, location: nil)
7
+ def initialize(upstream: nil, server: nil, listen: nil, location: nil, accel_location: nil, domain: nil)
8
+ @accel_location = accel_location
9
+ @domain = domain
8
10
  @listen = listen
9
11
  @location = Array(location)
10
12
  @server = server
@@ -26,6 +28,7 @@ module Nginx
26
28
  #{[
27
29
  @server&.to_s(1),
28
30
  @listen&.to_s(1),
31
+ @accel_location&.proxy_set_header(server.domain.domain_name),
29
32
  @location&.map { |l| l.to_s(1) }
30
33
  ].compact.join("\n\n")}
31
34
  }
@@ -36,7 +39,7 @@ SERVER_BLOCK
36
39
  upstream&.to_s
37
40
  end
38
41
 
39
- attr_reader :listen, :location, :server, :upstream
42
+ attr_reader :accel_location, :domain, :listen, :location, :server, :upstream
40
43
  end
41
44
 
42
45
  class SiteServerBlock < ServerBlock
@@ -57,7 +60,7 @@ SERVER_BLOCK
57
60
 
58
61
  class RailsServerBlock < SiteServerBlock
59
62
  def root_directory
60
- File.join(server.root_directory, "/public")
63
+ File.join(domain.site_root, "/public")
61
64
  end
62
65
  end
63
66
 
@@ -67,7 +70,7 @@ SERVER_BLOCK
67
70
  class TlsRedirectServerBlock < ServerBlock
68
71
  def initialize(domain_name)
69
72
  super(
70
- server: Server.new(domain_name),
73
+ server: Server.new(domain: SharedInfrastructure::Domain.new(domain_name)),
71
74
  listen: ListenHttp.new,
72
75
  location: RedirectLocation.new
73
76
  )
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SharedInfrastructure
4
+ module OutputHelpers
5
+ # @param indent_string The string to use for indenting. Defaults to the
6
+ # first character of `s`.
7
+ # @param amount The number of `indent_string` to put at the start of each
8
+ # line. Default: 2.
9
+ # @param indent_empty_lines Don't indent empty lines unless this is true.
10
+ def indent(s, amount = 2, indent_string = nil, indent_empty_lines = false)
11
+ indent_string = indent_string || s[/^[ \t]/] || " "
12
+ re = indent_empty_lines ? /^/ : /^(?!$)/
13
+ s.gsub(re, indent_string * amount)
14
+ end
15
+ end
16
+
17
+ class Output < File
18
+ def initialize(file_name, *args)
19
+ super Output.file_name(file_name), *args
20
+ end
21
+
22
+ class << self
23
+ ##
24
+ # Fake root. If block is given, change the root only for the duration
25
+ # of the block. If no block is given, is the same as configure.
26
+ def fake_root(root = nil)
27
+ if block_given?
28
+ begin
29
+ save_root = Output.root
30
+ fake_root(root)
31
+ result = yield
32
+ ensure
33
+ fake_root(save_root)
34
+ result
35
+ end
36
+ else
37
+ self.root = root
38
+ end
39
+ end
40
+
41
+ def file_name(file_name)
42
+ return file_name unless Output.root
43
+ file_name = File.join(Output.root, file_name)
44
+ FileUtils.mkdir_p(File.dirname(file_name))
45
+ file_name
46
+ end
47
+
48
+ attr_accessor :root
49
+ end
50
+ end
51
+ end
@@ -43,7 +43,6 @@ module Runner
43
43
  "--accel LOCATION",
44
44
  "Location to serve when app responds with 'X-Accel'") do |accel_location|
45
45
  options[:accel_location] = accel_location
46
- puts "FOUND X-ACCEL"
47
46
  end
48
47
 
49
48
  opts.on("-c DOMAIN",
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "optparse"
4
+ require "production"
5
+
6
+ module Runner
7
+ class << self
8
+ attr_accessor :debug
9
+ end
10
+ self.debug = false
11
+
12
+ ##
13
+ # Runner for deployment
14
+ class Deploy
15
+ def main
16
+ process_options
17
+ raise MissingArgument, "repository required" unless ARGV.size == 1
18
+ Production.repository = ARGV[0]
19
+ end
20
+
21
+ def process_options
22
+ options = OptionParser.new do |opts|
23
+ opts.banner = "Usage: [options] REPOSITORY"
24
+
25
+ opts.on("-b BRANCH", "--branch BRANCH", "Branch in repository to deploy.") do |branch|
26
+ Production.branch = branch
27
+ end
28
+
29
+ opts.on("-d", "--debug", "Print debugging information.") do
30
+ Runner.debug = true
31
+ end
32
+
33
+ opts.on("-r DIRECTORY",
34
+ "--root DIRECTORY",
35
+ "DIRECTORY. Set a root for files. This options is for debugging.") do |directory|
36
+ Output.fake_root(directory)
37
+ end
38
+
39
+ opts.on("-u REPOSITORY_USER",
40
+ "--user REPOSITORY_USER",
41
+ "REPOSITORY_USER. User name for the respository.") do |user|
42
+ Production.user = user
43
+ end
44
+ end
45
+ options.parse!
46
+ end
47
+ end
48
+
49
+ class MissingArgument < RuntimeError
50
+ def initialize(msg)
51
+ super msg
52
+ end
53
+ attr_reader :msg
54
+ end
55
+ end
@@ -25,7 +25,8 @@ module Runner
25
25
  user = options.delete(:user) || "ubuntu"
26
26
  certificate_domain = options.delete(:certificate_domain)
27
27
  accel_location = options.delete(:accel_location)
28
- protocol_class.new(domain_name, user, certificate_domain, accel_location: accel_location)
28
+ domain = SharedInfrastructure::Domain.new(domain_name)
29
+ protocol_class.new(user, certificate_domain, accel_location: accel_location, domain: domain)
29
30
  end
30
31
  end
31
32
  end
@@ -30,7 +30,8 @@ module Runner
30
30
  domain_name = options.delete(:domain_name)
31
31
  proxy_url = options.delete(:proxy_url)
32
32
  certificate_domain = options.delete(:certificate_domain)
33
- protocol_class.new(domain_name, proxy_url, certificate_domain)
33
+ domain = SharedInfrastructure::Domain.new(domain_name)
34
+ protocol_class.new(proxy_url, certificate_domain, domain: domain)
34
35
  end
35
36
  end
36
37
  end
@@ -14,7 +14,8 @@ module Runner
14
14
  domain_name = options.delete(:domain_name)
15
15
  user = options.delete(:user) || "ubuntu"
16
16
  certificate_domain = options.delete(:certificate_domain)
17
- protocol_class.new(domain_name, user, certificate_domain)
17
+ domain = SharedInfrastructure::Domain.new(domain_name)
18
+ protocol_class.new(user, certificate_domain, domain: domain)
18
19
  end
19
20
  end
20
21
  end
@@ -11,14 +11,14 @@ module Systemd
11
11
  "redis." + domain_name
12
12
  end
13
13
 
14
- def write_unit_file(domain_name)
15
- if ENV["SECRET_KEY_BASE"].nil? ||
16
- ENV["DATABASE_USERNAME"].nil? ||
17
- ENV["DATABASE_PASSWORD"].nil? ||
18
- ENV["EMAIL_PASSWORD"].nil?
19
- raise "Missing environment variable"
20
- end
21
-
14
+ def write_unit_file(domain_name, domain)
15
+ # if ENV["SECRET_KEY_BASE"].nil? ||
16
+ # ENV["DATABASE_USERNAME"].nil? ||
17
+ # ENV["DATABASE_PASSWORD"].nil? ||
18
+ # ENV["EMAIL_PASSWORD"].nil?
19
+ # raise "Missing environment variable"
20
+ # end
21
+ #
22
22
  puts "writing unit file (domain_name): #{Systemd.unit_file(domain_name)} (#{domain_name})" if Runner.debug
23
23
 
24
24
  result = File.open(Systemd.unit_file(domain_name), "w") do |f|
@@ -44,6 +44,7 @@ module Systemd
44
44
  # Environment=PUMA_DEBUG=1
45
45
  Environment=RACK_ENV=production
46
46
  Environment=RAILS_ENV=production
47
+ EnvironmentFile=#{domain.secrets}
47
48
  Environment=SECRET_KEY_BASE=#{ENV['SECRET_KEY_BASE']}
48
49
  Environment=DATABASE_USERNAME=#{ENV['DATABASE_USERNAME']}
49
50
  Environment=DATABASE_PASSWORD=#{ENV['DATABASE_PASSWORD']}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shared-infrastructure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Larry Reid
@@ -25,6 +25,8 @@ files:
25
25
  - bin/create-reverse-proxy
26
26
  - bin/create-server-block
27
27
  - lib/shared_infrastructure.rb
28
+ - lib/shared_infrastructure/domain.rb
29
+ - lib/shared_infrastructure/nginx/accel.rb
28
30
  - lib/shared_infrastructure/nginx/builder.rb
29
31
  - lib/shared_infrastructure/nginx/lines.rb
30
32
  - lib/shared_infrastructure/nginx/listen.rb
@@ -32,9 +34,10 @@ files:
32
34
  - lib/shared_infrastructure/nginx/nginx.rb
33
35
  - lib/shared_infrastructure/nginx/server.rb
34
36
  - lib/shared_infrastructure/nginx/server_block.rb
35
- - lib/shared_infrastructure/nginx/site.rb
36
37
  - lib/shared_infrastructure/nginx/upstream.rb
38
+ - lib/shared_infrastructure/output.rb
37
39
  - lib/shared_infrastructure/runner/base.rb
40
+ - lib/shared_infrastructure/runner/deploy.rb
38
41
  - lib/shared_infrastructure/runner/rails.rb
39
42
  - lib/shared_infrastructure/runner/reverse_proxy.rb
40
43
  - lib/shared_infrastructure/runner/static_site.rb
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nginx
4
- ##
5
- # Server name and site location for a static site.
6
- # TODO: I don't like the way this gets twisted when subclassing.
7
- class Site < Server
8
- attr_reader :user
9
-
10
- def initialize(domain_name, user = "ubuntu")
11
- super domain_name
12
- @user = user
13
- end
14
-
15
- def root_directory
16
- Nginx.root_directory(domain_name)
17
- end
18
-
19
- def to_s(level = 0)
20
- [
21
- super(level),
22
- Lines.new(
23
- "root #{Nginx.root_directory(domain_name)};",
24
- "index index.html index.htm;"
25
- ).format(level)
26
- ].join("\n\n")
27
- end
28
- end
29
- end