fly.io-rails 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/fly.io-rails/actions.rb +30 -4
- data/lib/fly.io-rails/deploy.rb +2 -1
- data/lib/fly.io-rails/dsl.rb +4 -0
- data/lib/fly.io-rails/scanner.rb +33 -9
- data/lib/fly.io-rails/version.rb +1 -1
- data/lib/generators/fly/app_generator.rb +16 -7
- data/lib/generators/templates/Dockerfile.erb +19 -35
- data/lib/generators/templates/fly.rake.erb +1 -1
- data/lib/generators/templates/fly.rb.erb +8 -0
- data/lib/generators/templates/fly.toml.erb +2 -0
- data/lib/tasks/fly.rake +9 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf047fddfe38280f888b4c2f8e2215172d89bdaaeb3c9e0d082c00014047e110
|
4
|
+
data.tar.gz: 5428fb05b28780d0640baf068ba1c3d326fef353771c1cbf8fcd0ccba32b100c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: efbdb4918b945916191ba8bb0452788d73c5066411fef2318eb45b1e6d6d2a6f0218b353bbc835856ab6d405dc3e9b5d8b77fdb3b575d7bd2bc00ebc71bf7c93
|
7
|
+
data.tar.gz: 034d4cf87622aa1988c33e33b3b48f5872b5863c7f12f36f3364dcca58ae16f2b347df25cf6f18e1ea19f1e13b1618606e386ec69ed10d4429f5957a147ae1fa
|
data/lib/fly.io-rails/actions.rb
CHANGED
@@ -14,7 +14,7 @@ module Fly
|
|
14
14
|
include Thor::Base
|
15
15
|
include Thor::Shell
|
16
16
|
include Fly::Scanner
|
17
|
-
attr_accessor :options
|
17
|
+
attr_accessor :options, :dockerfile, :ignorefile
|
18
18
|
|
19
19
|
def initialize(app=nil, options={})
|
20
20
|
# placate thor
|
@@ -30,6 +30,7 @@ module Fly
|
|
30
30
|
@nomad = options[:nomad]
|
31
31
|
@passenger = options[:passenger]
|
32
32
|
@serverless = options[:serverless]
|
33
|
+
@eject = options[:eject]
|
33
34
|
|
34
35
|
# prepare template variables
|
35
36
|
@ruby_version = RUBY_VERSION
|
@@ -95,7 +96,7 @@ module Fly
|
|
95
96
|
@procs = {web: 'bin/rails server'}
|
96
97
|
@procs[:web] = "nginx -g 'daemon off;'" if @passenger
|
97
98
|
@procs[:worker] = 'bundle exec sidekiq' if @sidekiq
|
98
|
-
@procs[:redis] = 'redis-server /etc/redis/redis.conf' if @redis
|
99
|
+
@procs[:redis] = 'redis-server /etc/redis/redis.conf' if @redis == :internal
|
99
100
|
@procs.merge! 'anycable-rpc': 'bundle exec anycable --rpc-host=0.0.0.0:50051',
|
100
101
|
'anycable-go': 'env ANYCABLE_RPC_HOST=$ANYCABLE_GO_RPC_HOST /usr/local/bin/anycable-go --port=8082 --host 0.0.0.0' if @anycable
|
101
102
|
end
|
@@ -126,11 +127,35 @@ module Fly
|
|
126
127
|
end
|
127
128
|
|
128
129
|
def generate_dockerfile
|
129
|
-
|
130
|
+
if @eject or File.exist? 'Dockerfile'
|
131
|
+
@dockerfile = 'Dockerfile'
|
132
|
+
else
|
133
|
+
tmpfile = Tempfile.new('Dockerfile')
|
134
|
+
@dockerfile = tmpfile.path
|
135
|
+
tmpfile.unlink
|
136
|
+
at_exit { File.unlink @dockerfile }
|
137
|
+
end
|
138
|
+
|
139
|
+
if @eject or not File.exist? @dockerfile
|
140
|
+
app_template 'Dockerfile.erb', @dockerfile
|
141
|
+
end
|
130
142
|
end
|
131
143
|
|
132
144
|
def generate_dockerignore
|
133
|
-
|
145
|
+
if @eject or File.exist? '.dockerignore'
|
146
|
+
@ignorefile = '.dockerignore'
|
147
|
+
elsif File.exist? '.gitignore'
|
148
|
+
@ignorefile = '.gitignore'
|
149
|
+
else
|
150
|
+
tmpfile = Tempfile.new('Dockerignore')
|
151
|
+
@ignoreile = tmpfile.path
|
152
|
+
tmpfile.unlink
|
153
|
+
at_exit { Filee.unlink @ignorefile }
|
154
|
+
end
|
155
|
+
|
156
|
+
if @eject or not File.exist? @ignorefile
|
157
|
+
app_template 'dockerignore.erb', @ignorefile
|
158
|
+
end
|
134
159
|
end
|
135
160
|
|
136
161
|
def generate_nginx_conf
|
@@ -148,6 +173,7 @@ module Fly
|
|
148
173
|
end
|
149
174
|
|
150
175
|
def generate_raketask
|
176
|
+
return unless @nomad
|
151
177
|
app_template 'fly.rake.erb', 'lib/tasks/fly.rake'
|
152
178
|
end
|
153
179
|
|
data/lib/fly.io-rails/deploy.rb
CHANGED
@@ -18,7 +18,8 @@ def check_git
|
|
18
18
|
|
19
19
|
system `git clone --depth 1 #{spec.git} /srv/fly.io-rails`
|
20
20
|
exit 1 unless Dir.exist? '/srv/fly.io-rails/lib'
|
21
|
-
|
21
|
+
ENV['RUBYLIB'] = '/srv/fly.io-rails/lib'
|
22
|
+
exec "ruby -r fly.io-rails/deploy -e #{caller_locations(1,1)[0].label}"
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
data/lib/fly.io-rails/dsl.rb
CHANGED
data/lib/fly.io-rails/scanner.rb
CHANGED
@@ -3,6 +3,9 @@ module Fly
|
|
3
3
|
# scan for major features - things that if present will likely affect
|
4
4
|
# more than one artifact that is generated.
|
5
5
|
def scan_rails_app
|
6
|
+
|
7
|
+
### database ###
|
8
|
+
|
6
9
|
database = YAML.load_file('config/database.yml').
|
7
10
|
dig('production', 'adapter') rescue nil
|
8
11
|
|
@@ -14,16 +17,37 @@ module Fly
|
|
14
17
|
@mysql = true
|
15
18
|
end
|
16
19
|
|
17
|
-
|
18
|
-
|
19
|
-
@
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
### ruby gems ###
|
21
|
+
|
22
|
+
@gemfile = []
|
23
|
+
|
24
|
+
if File.exist? 'Gemfile.lock'
|
25
|
+
parser = Bundler::LockfileParser.new(Bundler.read_file('Gemfile.lock'))
|
26
|
+
@gemfile += parser.specs.map { |spec, version| spec.name }
|
27
|
+
end
|
28
|
+
|
29
|
+
if File.exist? 'Gemfile'
|
30
|
+
@gemfile += Bundler::Definition.build('Gemfile', nil, []).dependencies.map(&:name)
|
31
|
+
end
|
32
|
+
|
33
|
+
@sidekiq = @gemfile.include? 'sidekiq'
|
34
|
+
@anycable = @gemfile.include? 'anycable'
|
35
|
+
@rmagick = @gemfile.include? 'rmagick'
|
36
|
+
@image_processing = @gemfile.include? 'image_processing'
|
37
|
+
@bootstrap = @gemfile.include? 'bootstrap'
|
38
|
+
@puppeteer = @gemfile.include? 'puppeteer'
|
39
|
+
|
40
|
+
### node modules ###
|
41
|
+
|
42
|
+
@package_json = []
|
43
|
+
|
44
|
+
if File.exist? 'package.json'
|
45
|
+
@package_json += JSON.load_file('package.json')['dependencies'].keys rescue []
|
46
|
+
end
|
47
|
+
|
48
|
+
@puppeteer ||= @package_json.include? 'puppeteer'
|
24
49
|
|
25
|
-
|
26
|
-
@puppeteer ||= package_json.include? 'puppeteer'
|
50
|
+
### cable/redis ###
|
27
51
|
|
28
52
|
@cable = ! Dir['app/channels/*.rb'].empty?
|
29
53
|
|
data/lib/fly.io-rails/version.rb
CHANGED
@@ -20,19 +20,28 @@ class AppGenerator < Rails::Generators::Base
|
|
20
20
|
def generate_app
|
21
21
|
source_paths.push File.expand_path('../templates', __dir__)
|
22
22
|
|
23
|
+
# the plan is to make eject an option, default to false, but until
|
24
|
+
# that is ready, have generate fly:app always eject
|
25
|
+
options = options.to_h.dup
|
26
|
+
options[:eject] = options[:nomad]
|
27
|
+
|
23
28
|
create_app(**options.symbolize_keys)
|
24
29
|
|
25
30
|
action = Fly::Actions.new(@app, options)
|
26
31
|
|
27
32
|
action.generate_toml
|
28
33
|
action.generate_fly_config unless File.exist? 'config/fly.rb'
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
34
|
+
|
35
|
+
if options[:eject]
|
36
|
+
action.generate_dockerfile unless File.exist? 'Dockerfile'
|
37
|
+
action.generate_dockerignore unless File.exist? '.dockerignore'
|
38
|
+
action.generate_nginx_conf unless File.exist? 'config/nginx.conf'
|
39
|
+
action.generate_raketask unless File.exist? 'lib/tasks/fly.rake'
|
40
|
+
action.generate_procfile unless File.exist? 'Procfile.rake'
|
41
|
+
action.generate_litefs if options[:litefs] and not File.exist? 'config/litefs'
|
42
|
+
action.generate_patches
|
43
|
+
end
|
44
|
+
|
36
45
|
action.generate_ipv4
|
37
46
|
action.generate_ipv6
|
38
47
|
|
@@ -1,36 +1,9 @@
|
|
1
|
-
# syntax = docker/dockerfile:
|
2
|
-
|
3
|
-
# Dockerfile used to build a deployable image for a Rails application.
|
4
|
-
# Adjust as required.
|
5
|
-
#
|
6
|
-
# Common adjustments you may need to make over time:
|
7
|
-
# * Modify version numbers for Ruby, Bundler, and other products.
|
8
|
-
# * Add library packages needed at build time for your gems, node modules.
|
9
|
-
# * Add deployment packages needed by your application
|
10
|
-
# * Add (often fake) secrets needed to compile your assets
|
11
|
-
|
12
|
-
#######################################################################
|
13
|
-
|
14
|
-
# Learn more about the chosen Ruby stack, Fullstaq Ruby, here:
|
15
|
-
# https://github.com/evilmartians/fullstaq-ruby-docker.
|
16
|
-
#
|
17
|
-
# We recommend using the highest patch level for better security and
|
18
|
-
# performance.
|
19
|
-
|
20
|
-
ARG RUBY_VERSION=<%= @ruby_version %>
|
21
|
-
ARG VARIANT=jemalloc-slim
|
22
|
-
FROM quay.io/evl.ms/fullstaq-ruby:${RUBY_VERSION}-${VARIANT} as base
|
1
|
+
# syntax = docker/dockerfile:1
|
23
2
|
|
3
|
+
FROM quay.io/evl.ms/fullstaq-ruby:<%= @ruby_version %>-jemalloc-slim as base
|
24
4
|
LABEL fly_launch_runtime="rails"
|
25
5
|
|
26
|
-
|
27
|
-
ARG NODE_VERSION=<%= @node_version %>
|
28
|
-
ARG YARN_VERSION=<%= @yarn_version %>
|
29
|
-
<% end -%>
|
30
|
-
ARG BUNDLER_VERSION=<%= @bundler_version %>
|
31
|
-
|
32
|
-
ARG RAILS_ENV=production
|
33
|
-
ENV RAILS_ENV=${RAILS_ENV}
|
6
|
+
ENV RAILS_ENV=production
|
34
7
|
<% if @anycable or not @passenger -%>
|
35
8
|
ENV RAILS_LOG_TO_STDOUT true
|
36
9
|
<% end -%>
|
@@ -45,19 +18,18 @@ ENV BUNDLE_WITHOUT ${BUNDLE_WITHOUT}
|
|
45
18
|
|
46
19
|
RUN mkdir /app
|
47
20
|
WORKDIR /app
|
48
|
-
RUN mkdir -p tmp/pids
|
49
21
|
|
50
22
|
<% if @node -%>
|
51
23
|
RUN curl https://get.volta.sh | bash
|
52
24
|
ENV VOLTA_HOME /root/.volta
|
53
25
|
ENV PATH $VOLTA_HOME/bin:/usr/local/bin:$PATH
|
54
|
-
RUN volta install node
|
26
|
+
RUN volta install node@<%= @node_version %> yarn@<%= @yarn_version %> && \
|
55
27
|
gem update --system --no-document && \
|
56
|
-
gem install -
|
28
|
+
gem install --no-document bundler --version <%= @bundler_version %>
|
57
29
|
|
58
30
|
<% else -%>
|
59
31
|
RUN gem update --system --no-document && \
|
60
|
-
gem install -
|
32
|
+
gem install --no-document bundler --version <%= @bundler_version %>
|
61
33
|
|
62
34
|
<% end -%>
|
63
35
|
#######################################################################
|
@@ -89,7 +61,16 @@ RUN --mount=type=cache,id=dev-apt-cache,sharing=locked,target=/var/cache/apt \
|
|
89
61
|
FROM build_deps as gems
|
90
62
|
|
91
63
|
COPY Gemfile* ./
|
92
|
-
RUN bundle install &&
|
64
|
+
RUN bundle install && \
|
65
|
+
<% if @redis and not @gemfile.include? 'redis' -%>
|
66
|
+
<% @bundle_add = true -%>
|
67
|
+
bundle add redis && \
|
68
|
+
<% end -%>
|
69
|
+
<% if @postgresql and not @gemfile.include? 'pg' -%>
|
70
|
+
<% @bundle_add = true -%>
|
71
|
+
bundle add pg && \
|
72
|
+
<% end -%>
|
73
|
+
rm -rf vendor/bundle/ruby/*/cache
|
93
74
|
|
94
75
|
<% if @node -%>
|
95
76
|
#######################################################################
|
@@ -246,6 +227,9 @@ COPY config/hook_detached_process /etc/nginx/
|
|
246
227
|
|
247
228
|
# Deploy your application
|
248
229
|
COPY . .
|
230
|
+
<% if @bundle_add -%>
|
231
|
+
COPY --from=gems /app/Gemfile* ./
|
232
|
+
<% end -%>
|
249
233
|
|
250
234
|
# Adjust binstubs to run on Linux and set current working directory
|
251
235
|
RUN chmod +x /app/bin/* && \
|
@@ -45,7 +45,7 @@ namespace :fly do
|
|
45
45
|
deps << 'db:migrate' if @sqlite3
|
46
46
|
deps = deps.first if deps.length == 1
|
47
47
|
|
48
|
-
if @procs.length > 1
|
48
|
+
if @procs.length > 1
|
49
49
|
"task :server, [:formation] => #{deps.inspect} do |task, args|"
|
50
50
|
else
|
51
51
|
"task :server => #{deps.inspect} do"
|
@@ -22,4 +22,12 @@ end
|
|
22
22
|
redis do
|
23
23
|
plan "Free"
|
24
24
|
end
|
25
|
+
<% end -%>
|
26
|
+
|
27
|
+
<% unless @nomad -%>
|
28
|
+
<%=
|
29
|
+
rakefile = File.expand_path('fly.rake.erb', __dir__)
|
30
|
+
template = ERB.new(IO.read(File.expand_path('fly.rake.erb', __dir__)), trim_mode: '-')
|
31
|
+
template.result(binding)
|
32
|
+
%>
|
25
33
|
<% end -%>
|
data/lib/tasks/fly.rake
CHANGED
@@ -4,6 +4,12 @@ require 'fly.io-rails/actions'
|
|
4
4
|
require 'toml'
|
5
5
|
require 'json'
|
6
6
|
|
7
|
+
config = File.expand_path('config/fly.rb', Rails.application.root)
|
8
|
+
if File.exist? config
|
9
|
+
@config = Fly::DSL::Config.new
|
10
|
+
@config.instance_eval IO.read(config), config
|
11
|
+
end
|
12
|
+
|
7
13
|
namespace :fly do
|
8
14
|
desc 'Deploy fly application'
|
9
15
|
task :deploy do
|
@@ -20,13 +26,13 @@ namespace :fly do
|
|
20
26
|
action = Fly::Actions.new(app)
|
21
27
|
action.generate_toml if @app
|
22
28
|
action.generate_fly_config unless File.exist? 'config/fly.rb'
|
23
|
-
action.generate_dockerfile
|
24
|
-
action.generate_dockerignore
|
29
|
+
action.generate_dockerfile
|
30
|
+
action.generate_dockerignore
|
25
31
|
action.generate_raketask unless File.exist? 'lib/tasks/fly.rake'
|
26
32
|
action.generate_procfile unless File.exist? 'Procfile.fly'
|
27
33
|
|
28
34
|
# build and push an image
|
29
|
-
out = FlyIoRails::Utils.tee
|
35
|
+
out = FlyIoRails::Utils.tee "flyctl deploy --build-only --push --dockerfile #{action.dockerfile} --ignorefile #{action.ignorefile}"
|
30
36
|
image = out[/image:\s+(.*)/, 1]&.strip
|
31
37
|
|
32
38
|
exit 1 unless image
|
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.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Ruby
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-11-
|
11
|
+
date: 2022-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fly-ruby
|