vps 0.1.1 → 0.1.2

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: d879c725aca451c863ec504e4fd4f7f9089bb5b0
4
- data.tar.gz: b0ebe2d831c630da62eb6e8c69452aebbcae4dcc
3
+ metadata.gz: 591e2f6174b369e271f23bc60b9d9492045259f3
4
+ data.tar.gz: 5b325e542fbacd8a0cf33df939c58db68c17995b
5
5
  SHA512:
6
- metadata.gz: b750774204e6f237175c568f6528b9196a1bdf272193cc8ca1bfbfc7d77a539da72835f7160a2998532ae670c576312dcad2dc5eff6e8b3870e7801d68bb0992
7
- data.tar.gz: 84ed1b982a9d6e66d70a74845b2a33cbc4ed2c87f2830ae2b3a37b9cb6607ccd30bd870040f2b50a4aa882e0f5c0aeab1f1b194e2c045dce5b1113d393a8f025
6
+ metadata.gz: 07edf2782cd06c64ad79478dfc51c168552822530083f3170dd702fc46aec3f61600390abb8846cfe1ce7de021f48e5f27a39f1530cfd2cca75ef859c42ce67e
7
+ data.tar.gz: 7b59c311ae6fda27227c2128c4dbf26338b6a2e8f4740e49b05cb321b24eb28f2d78d45eaf53e58c28b8d3360abeaf02a5d3cfc2c64572af81ed8bb3cd136f0d
@@ -1,5 +1,11 @@
1
1
  ## VPS CHANGELOG
2
2
 
3
+ ### Version 0.1.2 (September 29, 2019)
4
+
5
+ * Run postload tasks at the end of deployment
6
+ * Fix generating Rails and Rack Dockerfile (installing the correct Bundler version)
7
+ * Include configured :services in the generated docker-compose.yml file
8
+
3
9
  ### Version 0.1.1 (August 12, 2019)
4
10
 
5
11
  * Initial release
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
@@ -16,6 +16,7 @@ require "active_support/number_helper"
16
16
 
17
17
  require "vps"
18
18
  require "vps/core_ext/string"
19
+ require "vps/core_ext/ostruct"
19
20
  require "vps/cli/service"
20
21
  require "vps/cli/upstream"
21
22
  require "vps/cli/domain"
@@ -9,18 +9,15 @@ module VPS
9
9
  path = File.expand_path(path)
10
10
 
11
11
  unless config[:upstreams].any?{|upstream| upstream[:name] == name}
12
- type, tool_version, port = derive_upstream(path)
13
- config[:upstreams].push({
12
+ spec = derive_upstream(path)
13
+ spec[:nginx] ||= nil
14
+ config[:upstreams].push(spec.merge({
14
15
  :name => name || File.basename(path),
15
16
  :path => path,
16
- :type => type,
17
- :tool_version => tool_version,
18
- :port => port,
19
17
  :domains => [],
20
18
  :email => nil,
21
- :compose => nil,
22
- :nginx => nil
23
- })
19
+ :compose => nil
20
+ }))
24
21
  VPS.write_config(host, config)
25
22
  end
26
23
  end
@@ -65,19 +62,28 @@ module VPS
65
62
  |> IO.puts()
66
63
  ELIXIR
67
64
  type = `cd #{path} && mix run -e "#{elixir.strip.gsub(/\n\s+/, " ")}" | tail -n 1`.strip
68
- [
69
- type,
70
- `cd #{path} && mix run -e "System.version() |> IO.puts()" | tail -n 1`.strip,
71
- (type == "phoenix") ? 4000 : `cd #{path} && mix run -e ":ranch.info |> hd() |> elem(0) |> :ranch.get_port() |> IO.puts()" | tail -n 1`.strip.to_i
72
- ]
65
+ {
66
+ type: type,
67
+ elixir_version: `cd #{path} && mix run -e "System.version() |> IO.puts()" | tail -n 1`.strip,
68
+ port: (type == "phoenix") ? 4000 : `cd #{path} && mix run -e ":ranch.info |> hd() |> elem(0) |> :ranch.get_port() |> IO.puts()" | tail -n 1`.strip.to_i
69
+ }
73
70
  elsif Dir["#{path}/Gemfile"].any?
74
71
  lines = `cd #{path} && BUNDLE_GEMFILE=#{path}/Gemfile bundle list`.split("\n")
75
72
  type = %w(rails rack).detect{|gem| lines.any?{|line| line.include?("* #{gem} (")}}
76
- [
77
- type,
78
- `$SHELL -l -c 'cd #{path} && ruby -e "puts RUBY_VERSION"'`.strip,
79
- (type == "rails" ? 3000 : 9292) # :'(
80
- ]
73
+ {
74
+ type: type,
75
+ ruby_version: `$SHELL -l -c 'cd #{path} && ruby -e "puts RUBY_VERSION"'`.strip,
76
+ bundler_version: `$SHELL -l -c 'cd #{path} && bundle -v'`.split.last,
77
+ port: (type == "rails" ? 3000 : 9292) # :'(
78
+ }.tap do |spec|
79
+ if type == "rails"
80
+ spec[:nginx] = {
81
+ root: "/opt/app/public",
82
+ try_files: true,
83
+ proxy_redirect: "off"
84
+ }
85
+ end
86
+ end
81
87
  end
82
88
  end
83
89
 
@@ -0,0 +1,17 @@
1
+ class OpenStruct
2
+ def self.to_hash(object, hash = {})
3
+ case object
4
+ when OpenStruct then
5
+ object.each_pair do |key, value|
6
+ hash[key.to_s] = to_hash(value)
7
+ end
8
+ hash
9
+ when Array then
10
+ object.collect do |value|
11
+ to_hash(value)
12
+ end
13
+ else
14
+ object
15
+ end
16
+ end
17
+ end
@@ -1,7 +1,7 @@
1
1
  module VPS
2
2
  MAJOR = 0
3
3
  MINOR = 1
4
- TINY = 1
4
+ TINY = 2
5
5
 
6
6
  VERSION = [MAJOR, MINOR, TINY].join(".")
7
7
  end
@@ -86,11 +86,11 @@ tasks:
86
86
  command:
87
87
  - chmod +x {{ release_path }}/init-letsencrypt/{{ upstream.name }}.sh
88
88
  - cd {{ release_path }} && if [ ! -d "data/certbot/conf/live/{{ domain:upstream }}" ]; then yes Y | sudo ./init-letsencrypt/{{ upstream.name }}.sh; fi
89
- - task: run_tasks
90
- tasks: << postload >>
91
89
  - description: Starting containers
92
90
  task: remote_execute
93
91
  command: cd {{ release_path }} && docker-compose up {{ up }} -d
94
92
  - description: Checking running docker images
95
93
  task: remote_execute
96
94
  command: docker ps
95
+ - task: run_tasks
96
+ tasks: << postload >>
@@ -8,14 +8,17 @@ upstream <%= upstream[:name] %> {
8
8
  https = domains.first.include?("https://")
9
9
  domains = domains.collect{|domain| domain.gsub(/https?:\/\//, "")}.join(" ")
10
10
  domain = domains.split(" ")[0]
11
+ nginx = upstream[:nginx] || {}
11
12
  proxy_pass = "http://#{ upstream[:name] }"
12
13
  %>
13
14
 
14
15
  server {
16
+ <%- unless domains.empty? %>
15
17
  listen 80;
16
18
  server_name <%= domains %>;
17
19
  server_tokens off;
18
20
 
21
+ <%- end %>
19
22
  <%- if https %>
20
23
  location /.well-known/acme-challenge/ {
21
24
  root /var/www/certbot;
@@ -37,15 +40,25 @@ server {
37
40
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
38
41
 
39
42
  <%- end %>
40
- <%- if upstream[:nginx] %>
41
- <%= upstream[:nginx].gsub("PROXY_PASS", proxy_pass).indent(2) %>
43
+ <%- if nginx[:root] %>
44
+ root <%= nginx[:root] %>;
45
+ <%- end %>
46
+ <%- if nginx[:try_files] %>
47
+ try_files $uri @app;
42
48
 
43
49
  <%- end %>
44
- location / {
50
+ <%- if nginx[:config] %>
51
+ <%= nginx[:config].gsub("PROXY_PASS", proxy_pass).indent(2) %>
52
+
53
+ <%- end %>
54
+ location <%= nginx[:try_files] ? "@app" : "/" %> {
45
55
  proxy_pass <%= proxy_pass %>;
46
56
  proxy_set_header Host $http_host;
47
57
  proxy_set_header X-Real-IP $remote_addr;
48
58
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
59
+ <%- if nginx[:proxy_redirect] %>
60
+ proxy_redirect <%= nginx[:proxy_redirect] %>;
61
+ <%- end %>
49
62
  }
50
63
  }
51
64
  <%- end %>
@@ -1,10 +1,5 @@
1
1
  version: "3"
2
- <%
3
- https = upstreams.any?{|upstream| upstream[:domains].any?{|domain| domain.include?("https://")}}
4
- to_yaml = proc do |struct|
5
- struct.to_h.inject({}){|h, (k, v)| h[k.to_s] = v; h}.to_yaml
6
- end
7
- %>
2
+ <% https = upstreams.any?{|upstream| upstream[:domains].any?{|domain| domain.include?("https://")}} %>
8
3
  services:
9
4
 
10
5
  nginx:
@@ -28,7 +23,7 @@ services:
28
23
  command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
29
24
 
30
25
  certbot:
31
- image: certbot/certbot
26
+ image: certbot/certbot:v0.27.1
32
27
  container_name: certbot
33
28
  restart: unless-stopped
34
29
  volumes:
@@ -36,6 +31,11 @@ services:
36
31
  - ./data/certbot/www:/var/www/certbot
37
32
  entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
38
33
  <%- end %>
34
+ <%- services.to_h.each do |name, spec| %>
35
+
36
+ <%= name %>:
37
+ <%= OpenStruct.to_hash(spec).to_yaml.sub(/^.*?\n/, "").indent(4) %>
38
+ <%- end %>
39
39
  <%- upstreams.each do |upstream| %>
40
40
 
41
41
  <%= upstream.name %>:
@@ -46,11 +46,13 @@ services:
46
46
  - <%= upstream.port %>
47
47
  <%- end %>
48
48
  <%- if upstream[:compose] %>
49
- <%= to_yaml.(upstream[:compose]).sub(/^.*?\n/, "").indent(4) %>
49
+ <%= OpenStruct.to_hash(upstream[:compose]).to_yaml.sub(/^.*?\n/, "").indent(4) %>
50
50
  <%- end %>
51
51
  <%- end %>
52
- <%- services.each do |service, config| %>
52
+ <%- unless (volumes || []).empty? %>
53
53
 
54
- <%= service %>:
55
- <%= to_yaml.(config).sub(/^.*?\n/, "").indent(4) %>
56
- <%- end %>
54
+ volumes:
55
+ <%- volumes.each do |volume| %>
56
+ <%= volume %>:
57
+ <%- end %>
58
+ <%- end %>
@@ -1,4 +1,4 @@
1
- FROM elixir:<%= upstream.tool_version %>-alpine
1
+ FROM elixir:<%= upstream.elixir_version %>-alpine
2
2
 
3
3
  RUN apk update \
4
4
  && apk --no-cache --update add alpine-sdk \
@@ -1,4 +1,4 @@
1
- FROM elixir:<%= upstream.tool_version %>-alpine
1
+ FROM elixir:<%= upstream.elixir_version %>-alpine
2
2
 
3
3
  RUN apk update \
4
4
  && apk --no-cache --update add alpine-sdk \
@@ -1,4 +1,4 @@
1
- FROM ruby:<%= upstream.tool_version %>-alpine
1
+ FROM ruby:<%= upstream.ruby_version %>-alpine
2
2
 
3
3
  RUN apk update \
4
4
  && apk --no-cache --update add \
@@ -11,5 +11,6 @@ WORKDIR /opt/app
11
11
  COPY . .
12
12
 
13
13
  ENV RACK_ENV=production
14
+ RUN gem install bundler -v <%= upstream.bundler_version %>
14
15
  RUN bundle install --without development test
15
- CMD ["rackup", "config.ru", "-o", "0.0.0.0"]
16
+ CMD ["bundle", "exec", "rackup", "config.ru", "-o", "0.0.0.0"]
@@ -1,4 +1,4 @@
1
- FROM ruby:<%= upstream.tool_version %>-alpine
1
+ FROM ruby:<%= upstream.ruby_version %>-alpine
2
2
 
3
3
  RUN apk update \
4
4
  && apk --no-cache --update add \
@@ -11,5 +11,8 @@ WORKDIR /opt/app
11
11
  COPY . .
12
12
 
13
13
  ENV RAILS_ENV=production
14
+ EXPOSE <%= upstream.port %>
15
+ RUN gem install bundler -v <%= upstream.bundler_version %>
14
16
  RUN bundle install --without development test
17
+ CMD ["rm", "-f", "tmp/pids/server.pid"]
15
18
  CMD ["rails", "server", "-b", "0.0.0.0"]
@@ -17,8 +17,8 @@ fi
17
17
  if [ ! -e "$data_path/conf/options-ssl-nginx.conf" ] || [ ! -e "$data_path/conf/ssl-dhparams.pem" ]; then
18
18
  echo "### Downloading recommended TLS parameters ..."
19
19
  mkdir -p "$data_path/conf"
20
- curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/tls_configs/options-ssl-nginx.conf > "$data_path/conf/options-ssl-nginx.conf"
21
- curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/ssl-dhparams.pem > "$data_path/conf/ssl-dhparams.pem"
20
+ curl -s https://raw.githubusercontent.com/certbot/certbot/v0.40.1/certbot-nginx/certbot_nginx/tls_configs/options-ssl-nginx.conf > "$data_path/conf/options-ssl-nginx.conf"
21
+ curl -s https://raw.githubusercontent.com/certbot/certbot/v0.40.1/certbot/ssl-dhparams.pem > "$data_path/conf/ssl-dhparams.pem"
22
22
  echo
23
23
  fi
24
24
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vps
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Engel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-12 00:00:00.000000000 Z
11
+ date: 2019-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -162,6 +162,7 @@ files:
162
162
  - lib/vps/cli/playbook/tasks.rb
163
163
  - lib/vps/cli/service.rb
164
164
  - lib/vps/cli/upstream.rb
165
+ - lib/vps/core_ext/ostruct.rb
165
166
  - lib/vps/core_ext/string.rb
166
167
  - lib/vps/version.rb
167
168
  - playbooks/deploy.yml