fly.io-rails 0.1.6-arm64-darwin → 0.1.7-arm64-darwin

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c57c19a783b242ccbae7b34bdb3a69161c48759c079d1867d8f75032cf9a4c3d
4
- data.tar.gz: dc815fea963874bdf8a55f92a2072f7aebc16e1e73ca483361fe5c7103421739
3
+ metadata.gz: 6f4de14d57e56fad6d076f44b1d0c8a440245731b058791515cd6d3e2359c108
4
+ data.tar.gz: 04abcef92d28b11a9a026f67ac35702af66aab8a72014d177ca9ddb52d9d87ba
5
5
  SHA512:
6
- metadata.gz: 5d19e20ecd0e94c0411674fe500c3e174b30804b14aba3f4c56f99b87a83a1c6c6ba2d53e712e4a0ae5c7c962556cf9bf08bbf3a90acd5576702d53bd5fb4d63
7
- data.tar.gz: 2b11fde476cf6c021822b83a65946823030f26c9939a5f61773bfc38bc22b07163f5c744b6ce2257b154fb6333009b3b6c0c7b5748649cfae6c3102d1250657f
6
+ metadata.gz: 37f1c09b5ad7d4413b2ecf6bf60db2ac07d13f1b6ab5f41d9f6360c9c167a8fbb1da654c2ad241582707ee323eed06bf4fcb63f58e618489719e81deaf802db5
7
+ data.tar.gz: c79d2b471049eac643e97f2a99461f839a78331544d3b786208c551cd15e87f50f5f7e72ce991f753e665ef08e87cba62bb9e7218559e11c3b222fa22d8d203b
Binary file
@@ -26,8 +26,10 @@ module Fly
26
26
  regions = options[:region]&.flatten || []
27
27
  @litefs = options[:litefs]
28
28
  @nomad = options[:nomad]
29
+ @passenger = options[:passenger]
30
+ @serverless = options[:serverless]
29
31
 
30
- # prepare template variablesl
32
+ # prepare template variables
31
33
  @ruby_version = RUBY_VERSION
32
34
  @bundler_version = Bundler::VERSION
33
35
  @node = File.exist? 'node_modules'
@@ -56,6 +58,11 @@ module Fly
56
58
 
57
59
  # set additional variables based on application source
58
60
  scan_rails_app
61
+
62
+ # determine processes
63
+ @procs = {web: 'bin/rails server'}
64
+ @procs[:web] = "nginx -g 'daemon off;'" if @passenger
65
+ @procs[:worker] = 'bundle exec sidekiq' if @sidekiq
59
66
  end
60
67
 
61
68
  def app
@@ -91,6 +98,16 @@ module Fly
91
98
  app_template 'dockerignore.erb', '.dockerignore'
92
99
  end
93
100
 
101
+ def generate_nginx_conf
102
+ return unless @passenger
103
+ app_template 'nginx.conf.erb', 'config/nginx.conf'
104
+
105
+ if @serverless
106
+ app_template 'hook_detached_process.erb', 'config/hook_detached_process'
107
+ FileUtils.chmod 'u+x', 'config/hook_detached_process'
108
+ end
109
+ end
110
+
94
111
  def generate_terraform
95
112
  app_template 'main.tf.erb', 'main.tf'
96
113
  end
@@ -100,7 +117,7 @@ module Fly
100
117
  end
101
118
 
102
119
  def generate_procfile
103
- return unless @sidekiq
120
+ return unless @procs.length > 1
104
121
  app_template 'Procfile.fly.erb', 'Procfile.fly'
105
122
  end
106
123
 
@@ -2,26 +2,26 @@ module Fly
2
2
  module DSL
3
3
  class Base
4
4
  def initialize
5
- @value = {}
5
+ @value = {}
6
6
  end
7
7
 
8
8
  def self.option name, default=nil
9
- @options ||= {}
10
- @options[name] = default
11
-
12
- define_method name do |*args|
13
- if args.length == 1
14
- @value[name] = args.first
15
- elsif args.length > 1
16
- raise ArgumentError.new("wrong number of arguments (given #{args.length}, expected 0..1)")
17
- end
18
-
19
- @value.include?(name) ? @value[name] : default
20
- end
9
+ @options ||= {}
10
+ @options[name] = default
11
+
12
+ define_method name do |*args|
13
+ if args.length == 1
14
+ @value[name] = args.first
15
+ elsif args.length > 1
16
+ raise ArgumentError.new("wrong number of arguments (given #{args.length}, expected 0..1)")
17
+ end
18
+
19
+ @value.include?(name) ? @value[name] : default
20
+ end
21
21
  end
22
22
 
23
23
  def self.options
24
- @options ||= {}
24
+ @options ||= {}
25
25
  end
26
26
  end
27
27
 
@@ -53,21 +53,21 @@ module Fly
53
53
  @@blocks = {}
54
54
 
55
55
  def initialize
56
- @config = {}
56
+ @config = {}
57
57
  end
58
58
 
59
59
  def self.block name, kind
60
- @@blocks[name] = kind
60
+ @@blocks[name] = kind
61
61
 
62
- define_method name do |&block|
63
- @config[name] ||= kind.new
64
- @config[name].instance_eval(&block) if block
65
- @config[name]
66
- end
62
+ define_method name do |&block|
63
+ @config[name] ||= kind.new
64
+ @config[name].instance_eval(&block) if block
65
+ @config[name]
66
+ end
67
67
  end
68
68
 
69
69
  def self.blocks
70
- @@blocks
70
+ @@blocks
71
71
  end
72
72
 
73
73
  block :machine, Machine
@@ -14,8 +14,10 @@ module Fly
14
14
 
15
15
  @sidekiq = IO.read('Gemfile').include? 'sidekiq' rescue false
16
16
 
17
+ @cable = ! Dir['app/channels/*.rb'].empty?
18
+
17
19
  if (YAML.load_file('config/cable.yml').dig('production', 'adapter') rescue false)
18
- @redis_cable = true
20
+ @redis_cable = @cable
19
21
  end
20
22
 
21
23
  if (IO.read('config/environments/production.rb') =~ /redis/i rescue false)
@@ -1,3 +1,3 @@
1
1
  module Fly_io
2
- VERSION = '0.1.6'
2
+ VERSION = '0.1.7'
3
3
  end
@@ -10,6 +10,8 @@ class AppGenerator < Rails::Generators::Base
10
10
  class_option :nomad, type: :boolean, default: false
11
11
 
12
12
  class_option :litefs, type: :boolean, default: false
13
+ class_option :passenger, type: :boolean, default: false
14
+ class_option :serverless, type: :boolean, default: false
13
15
 
14
16
  def generate_app
15
17
  source_paths.push File.expand_path('../templates', __dir__)
@@ -22,6 +24,7 @@ class AppGenerator < Rails::Generators::Base
22
24
  action.generate_fly_config unless File.exist? 'config/fly.rb'
23
25
  action.generate_dockerfile unless File.exist? 'Dockerfile'
24
26
  action.generate_dockerignore unless File.exist? '.dockerignore'
27
+ action.generate_nginx_conf unless File.exist? 'config/nginx.conf'
25
28
  action.generate_raketask unless File.exist? 'lib/tasks/fly.rake'
26
29
  action.generate_procfile unless File.exist? 'Procfile.rake'
27
30
  action.generate_litefs if options[:litefs] and not File.exist? 'config/litefs'
@@ -81,7 +81,7 @@ RUN gem update --system --no-document && \
81
81
 
82
82
  COPY Gemfile* ./
83
83
  RUN bundle install && rm -rf vendor/bundle/ruby/*/cache
84
- <% if @sidekiq -%>
84
+ <% if @procs.length > 1 -%>
85
85
  RUN gem install foreman
86
86
  <% end -%>
87
87
 
@@ -115,6 +115,7 @@ FROM base
115
115
 
116
116
  <%
117
117
  @deploy_packages = %w(file vim curl gzip)
118
+ @deploy_packages += %w(nginx passenger libnginx-mod-http-passenger) if @passenger
118
119
  @deploy_packages << 'postgresql-client' if @postgresql
119
120
  @deploy_packages << 'libsqlite3-0' if @sqlite3
120
121
  @deploy_packages << 'fuse' if @litefs
@@ -122,6 +123,13 @@ FROM base
122
123
  ARG DEPLOY_PACKAGES=<%= @deploy_packages.join(' ').inspect %>
123
124
  ENV DEPLOY_PACKAGES=${DEPLOY_PACKAGES}
124
125
 
126
+ <% if @passenger -%>
127
+ RUN apt-get install -y dirmngr gnupg apt-transport-https ca-certificates curl && \
128
+ curl https://oss-binaries.phusionpassenger.com/auto-software-signing-gpg-key.txt | \
129
+ gpg --dearmor > /etc/apt/trusted.gpg.d/phusion.gpg && \
130
+ sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bullseye main > /etc/apt/sources.list.d/passenger.list'
131
+
132
+ <% end -%>
125
133
  RUN --mount=type=cache,id=prod-apt-cache,sharing=locked,target=/var/cache/apt \
126
134
  --mount=type=cache,id=prod-apt-lib,sharing=locked,target=/var/lib/apt \
127
135
  apt-get update -qq && \
@@ -150,6 +158,16 @@ ADD config/litefs.yml /etc/litefs.yml
150
158
  RUN mkdir /data
151
159
  <% end -%>
152
160
  #######################################################################
161
+ <% if @passenger -%>
162
+
163
+ # configure nginx/passenger
164
+ COPY config/nginx.conf /etc/nginx/sites-available/rails.conf
165
+ RUN rm /etc/nginx/sites-enabled/default && \
166
+ ln -s /etc/nginx/sites-available/rails.conf /etc/nginx/sites-enabled/
167
+ <% if @serverless -%>
168
+ COPY config/hook_detached_process /etc/nginx/
169
+ <% end -%>
170
+ <% end -%>
153
171
 
154
172
  # Deploy your application
155
173
  COPY . .
@@ -1,4 +1,3 @@
1
- web: bin/rails server
2
- <% if @sidekiq -%>
3
- worker: bundle exec sidekiq
1
+ <% @procs.each do |type, command| -%>
2
+ <%= type %>: <%= command %>
4
3
  <% end -%>
@@ -28,12 +28,12 @@ namespace :fly do
28
28
  <%- else -%>
29
29
  task :server => :swapfile do
30
30
  <%- end -%>
31
- <%- if @sidekiq -%>
31
+ <%- if @procs.length > 1 -%>
32
32
  Bundler.with_original_env do
33
33
  sh 'foreman start --procfile=Procfile.fly'
34
34
  end
35
35
  <%- else -%>
36
- sh 'bin/rails server'
36
+ sh <%= @procs.values.first.inspect %>
37
37
  <%- end -%>
38
38
  end
39
39
 
@@ -25,8 +25,8 @@ processes = []
25
25
  <% end -%>
26
26
 
27
27
  [mounts]
28
- source = <%= "#{app.gsub('-', '_')}_volume".inspect %>
29
- destination = "/mnt/volume"
28
+ source = <%= "#{app.gsub('-', '_')}_volume".inspect %>
29
+ destination = "/mnt/volume"
30
30
  <% end -%>
31
31
 
32
32
  [experimental]
@@ -43,8 +43,13 @@ destination = "/mnt/volume"
43
43
  protocol = "tcp"
44
44
  script_checks = []
45
45
  [services.concurrency]
46
+ <% if @cable -%>
47
+ hard_limit = 2500
48
+ soft_limit = 2000
49
+ <% else -%>
46
50
  hard_limit = 25
47
51
  soft_limit = 20
52
+ <% end -%>
48
53
  type = "connections"
49
54
 
50
55
  [[services.ports]]
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ status = `passenger-status`
4
+
5
+ processes = status[/^Processes\s*:\s*(\d*)/, 1].to_i
6
+ <% if @cable -%>
7
+ cable = status[/^<%= @app %>-cable.*?\n\n/m]
8
+ processes -= 1 if cable and cable =~ /Sessions:\s*[1-9]/
9
+ <% end -%>
10
+
11
+ system 'nginx -s stop' if processes == 0
@@ -0,0 +1,29 @@
1
+ <% if @serverless -%>
2
+ passenger_ctl hook_detached_process /etc/nginx/hook_detached_process;
3
+ passenger_min_instances 0;
4
+ passenger_pool_idle_time 300;
5
+
6
+ <% end -%>
7
+ server {
8
+ listen 8080;
9
+ server_name <%= @app %>.fly.dev;
10
+ root /app/public;
11
+
12
+ passenger_enabled on;
13
+ passenger_ruby /usr/lib/fullstaq-ruby/versions/<%= @ruby_version %>-jemalloc/bin/ruby;
14
+
15
+ <% if @cable -%>
16
+ location / {
17
+ passenger_app_group_name <%= @app%>;
18
+ }
19
+
20
+ location /cable {
21
+ passenger_app_group_name <%= @app%>-cable;
22
+ passenger_force_max_concurrent_requests_per_process 0;
23
+ }
24
+
25
+ <% end -%>
26
+ # Nginx has a default limit of 1 MB for request bodies, which also applies
27
+ # to file uploads. The following line enables uploads of up to 50 MB:
28
+ client_max_body_size 50M;
29
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fly.io-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: arm64-darwin
6
6
  authors:
7
7
  - Sam Ruby
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-03 00:00:00.000000000 Z
11
+ date: 2022-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fly-ruby
@@ -68,8 +68,10 @@ files:
68
68
  - lib/generators/templates/fly.rake.erb
69
69
  - lib/generators/templates/fly.rb.erb
70
70
  - lib/generators/templates/fly.toml.erb
71
+ - lib/generators/templates/hook_detached_process.erb
71
72
  - lib/generators/templates/litefs.yml.erb
72
73
  - lib/generators/templates/main.tf.erb
74
+ - lib/generators/templates/nginx.conf.erb
73
75
  - lib/generators/templates/patches/action_cable.rb
74
76
  - lib/tasks/fly.rake
75
77
  homepage: https://github.com/rubys/fly-io.rails