fly.io-rails 0.1.12-x86_64-darwin → 0.1.14-x86_64-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 +4 -4
- data/exe/x86_64-darwin/flyctl +0 -0
- data/lib/fly.io-rails/actions.rb +11 -1
- data/lib/fly.io-rails/scanner.rb +2 -0
- data/lib/fly.io-rails/version.rb +1 -1
- data/lib/generators/fly/app_generator.rb +1 -0
- data/lib/generators/templates/Dockerfile.erb +16 -1
- data/lib/generators/templates/fly.rake.erb +16 -5
- data/lib/generators/templates/fly.toml.erb +3 -3
- data/lib/generators/templates/nginx.conf.erb +8 -0
- data/lib/tasks/fly.rake +90 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9f2574745e0ea8f2edbac0856d08111f2bcd5832883ef5bedb8cfc0fafcfcb1
|
4
|
+
data.tar.gz: 41071616ae60e7e10973ff8eb4ca80dc8c959783160da33259cfc1c14055fd7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ccfe3797a1be8049d57c606a0d0b4274c08143fc5b68af6e188797df83f5b8fd9f565b032b0ad36dbbfe8247e9f59e811a732fcf633195d3f693199d83ce662b
|
7
|
+
data.tar.gz: a923ba90ff095ab64dd0500452aebfad5c1c902f7ba064c2c2085fb51e5c880f8e009c3d6ab40680d3edd187c8f0cd7c741ee7634bf976c27ff3cf59726f5d83
|
data/exe/x86_64-darwin/flyctl
CHANGED
Binary file
|
data/lib/fly.io-rails/actions.rb
CHANGED
@@ -26,6 +26,7 @@ module Fly
|
|
26
26
|
regions = options[:region]&.flatten || []
|
27
27
|
@avahi = options[:avahi]
|
28
28
|
@litefs = options[:litefs]
|
29
|
+
@nats = options[:nats]
|
29
30
|
@nomad = options[:nomad]
|
30
31
|
@passenger = options[:passenger]
|
31
32
|
@serverless = options[:serverless]
|
@@ -36,6 +37,7 @@ module Fly
|
|
36
37
|
@node = File.exist? 'node_modules'
|
37
38
|
@yarn = File.exist? 'yarn.lock'
|
38
39
|
@node_version = @node ? `node --version`.chomp.sub(/^v/, '') : '16.17.0'
|
40
|
+
@yarn_version = @yarn ? `yarn --version`.chomp : 'latest'
|
39
41
|
@org = Fly::Machines.org
|
40
42
|
|
41
43
|
@set_stage = @nomad ? 'set' : 'set --stage'
|
@@ -402,15 +404,23 @@ module Fly
|
|
402
404
|
# start app
|
403
405
|
machines = {}
|
404
406
|
say_status :fly, "start #{app}"
|
405
|
-
if not toml['processes']
|
407
|
+
if not toml['processes'] or toml['processes'].empty?
|
406
408
|
start = Fly::Machines.create_and_start_machine(app, config: config)
|
407
409
|
machines['app'] = start[:id]
|
408
410
|
else
|
409
411
|
config[:env] ||= {}
|
412
|
+
config[:env]['NATS_SERVER'] = 'localhost'
|
410
413
|
toml['processes'].each do |name, entrypoint|
|
411
414
|
config[:env]['SERVER_COMMAND'] = entrypoint
|
412
415
|
start = Fly::Machines.create_and_start_machine(app, config: config)
|
413
416
|
machines[name] = start[:id]
|
417
|
+
|
418
|
+
config.delete :mounts
|
419
|
+
config.delete :services
|
420
|
+
|
421
|
+
if config[:env]['NATS_SERVER'] = 'localhost'
|
422
|
+
config[:env]['NATS_SERVER'] = start[:private_ip]
|
423
|
+
end
|
414
424
|
end
|
415
425
|
end
|
416
426
|
|
data/lib/fly.io-rails/scanner.rb
CHANGED
@@ -17,6 +17,8 @@ module Fly
|
|
17
17
|
gemfile = IO.read('Gemfile') rescue ''
|
18
18
|
@sidekiq = gemfile.include? 'sidekiq'
|
19
19
|
@anycable = gemfile.include? 'anycable'
|
20
|
+
@rmagick = gemfile.include? 'rmagick'
|
21
|
+
@bootstrap = gemfile.include? 'bootstrap'
|
20
22
|
|
21
23
|
@cable = ! Dir['app/channels/*.rb'].empty?
|
22
24
|
|
data/lib/fly.io-rails/version.rb
CHANGED
@@ -12,6 +12,7 @@ class AppGenerator < Rails::Generators::Base
|
|
12
12
|
class_option :anycable, type: :boolean, default: false
|
13
13
|
class_option :avahi, type: :boolean, default: false
|
14
14
|
class_option :litefs, type: :boolean, default: false
|
15
|
+
class_option :nats, type: :boolean, default: false
|
15
16
|
class_option :redis, type: :boolean, default: false
|
16
17
|
class_option :passenger, type: :boolean, default: false
|
17
18
|
class_option :serverless, type: :boolean, default: false
|
@@ -25,6 +25,7 @@ LABEL fly_launch_runtime="rails"
|
|
25
25
|
|
26
26
|
<% if @node -%>
|
27
27
|
ARG NODE_VERSION=<%= @node_version %>
|
28
|
+
ARG YARN_VERSION=<%= @yarn_version %>
|
28
29
|
<% end -%>
|
29
30
|
ARG BUNDLER_VERSION=<%= @bundler_version %>
|
30
31
|
|
@@ -50,7 +51,7 @@ RUN mkdir -p tmp/pids
|
|
50
51
|
RUN curl https://get.volta.sh | bash
|
51
52
|
ENV VOLTA_HOME /root/.volta
|
52
53
|
ENV PATH $VOLTA_HOME/bin:/usr/local/bin:$PATH
|
53
|
-
RUN volta install node@${NODE_VERSION} yarn
|
54
|
+
RUN volta install node@${NODE_VERSION} yarn@${YARN_VERSION}
|
54
55
|
|
55
56
|
<% end -%>
|
56
57
|
#######################################################################
|
@@ -64,6 +65,7 @@ FROM base as build_deps
|
|
64
65
|
@build_packages << 'libpq-dev' if @postgresql
|
65
66
|
@build_packages << 'libsqlite3-dev' if @sqlite3
|
66
67
|
@build_packages << 'default-libmysqlclient-dev' if @mysql
|
68
|
+
@build_packages += %w[pkg-config libmagickwand-dev] if @rmagick
|
67
69
|
-%>
|
68
70
|
ARG BUILD_PACKAGES=<%= @build_packages.join(' ').inspect %>
|
69
71
|
ENV BUILD_PACKAGES ${BUILD_PACKAGES}
|
@@ -137,9 +139,12 @@ RUN apt-get install -y dirmngr gnupg apt-transport-https ca-certificates curl &&
|
|
137
139
|
@deploy_packages << 'postgresql-client' if @postgresql
|
138
140
|
@deploy_packages << 'libsqlite3-0' if @sqlite3
|
139
141
|
@deploy_packages << 'default-mysql-client' if @mysql
|
142
|
+
@deploy_packages << 'imagemagick' if @rmagick
|
143
|
+
@deploy_packages << 'nodejs' if not @node and @bootstrap
|
140
144
|
@deploy_packages << 'fuse' if @litefs
|
141
145
|
@deploy_packages << 'ruby-foreman' if @procs.length > 1
|
142
146
|
@deploy_packages << 'redis-server' if @redis == :internal
|
147
|
+
@deploy_packages << 'gettext-base' if @nats
|
143
148
|
@deploy_packages += %w(avahi-daemon avahi-utils libnss-mdns) if @avahi
|
144
149
|
-%>
|
145
150
|
ARG DEPLOY_PACKAGES=<%= @deploy_packages.join(' ').inspect %>
|
@@ -184,6 +189,14 @@ ADD config/litefs.yml /etc/litefs.yml
|
|
184
189
|
|
185
190
|
# Create mount point
|
186
191
|
RUN mkdir /data
|
192
|
+
|
193
|
+
<% end -%>
|
194
|
+
<% if @nats -%>
|
195
|
+
# install nats
|
196
|
+
RUN mkdir /etc/nats
|
197
|
+
COPY --from=nats:latest /nats-server /usr/local/bin/nats-server
|
198
|
+
COPY --from=nats:latest /nats-server.conf /etc/nats/nats-server.conf
|
199
|
+
|
187
200
|
<% end -%>
|
188
201
|
#######################################################################
|
189
202
|
<% if @avahi -%>
|
@@ -194,7 +207,9 @@ RUN sed -i 's/mdns4_minimal/mdns_minimal/' /etc/nsswitch.conf
|
|
194
207
|
<% if @passenger -%>
|
195
208
|
|
196
209
|
# configure nginx/passenger
|
210
|
+
<% unless @avahi or @nats -%>
|
197
211
|
COPY config/nginx.conf /etc/nginx/sites-available/rails.conf
|
212
|
+
<% end -%>
|
198
213
|
RUN rm /etc/nginx/sites-enabled/default && \
|
199
214
|
ln -s /etc/nginx/sites-available/rails.conf /etc/nginx/sites-enabled/ && \
|
200
215
|
sed -i 's/user .*;/user root;/' /etc/nginx/nginx.conf && \
|
@@ -18,10 +18,16 @@ namespace :fly do
|
|
18
18
|
<%- end -%>
|
19
19
|
|
20
20
|
<% end -%>
|
21
|
-
<% if @avahi -%>
|
21
|
+
<% if @avahi or @nats -%>
|
22
22
|
task :env do
|
23
23
|
<% if @redis -%>
|
24
|
-
|
24
|
+
if ENV['NATS_SERVER']
|
25
|
+
redis_host = "#{ENV['FLY_REGION']}-redis.local"
|
26
|
+
else
|
27
|
+
redis_host = 'localhost'
|
28
|
+
end
|
29
|
+
|
30
|
+
ENV['REDIS_URL'] = "redis://#{redis_host}:6379/1"
|
25
31
|
<% end -%>
|
26
32
|
<% if @anycable -%>
|
27
33
|
ENV['ANYCABLE_GO_RPC_HOST'] = "#{ENV['FLY_REGION']}-anycable-rpc.local:50051"
|
@@ -46,13 +52,18 @@ namespace :fly do
|
|
46
52
|
end
|
47
53
|
end %>
|
48
54
|
<%- if @procs.length > 1 -%>
|
49
|
-
|
50
|
-
|
55
|
+
<%- if @passenger and (@avahi or @nats) -%>
|
56
|
+
sh 'envsubst < config/nginx.conf > /etc/nginx/sites-available/rails.conf'
|
57
|
+
<%- end -%>
|
58
|
+
formation = args[:formation].gsub!(';', ',')
|
51
59
|
<%- if @avahi -%>
|
52
60
|
Rake::Task['fly:avahi_publish'].invoke(formation)
|
53
61
|
<%- end -%>
|
62
|
+
<%- if @nats -%>
|
63
|
+
Rake::Task['fly:nats_publish'].invoke(formation) if ENV['NATS_SERVER']
|
64
|
+
<%- end -%>
|
54
65
|
Bundler.with_original_env do
|
55
|
-
<%- if @avahi -%>
|
66
|
+
<%- if @avahi or @nats -%>
|
56
67
|
Rake::Task['fly:env'].invoke
|
57
68
|
<%- end -%>
|
58
69
|
sh "foreman start --procfile=Procfile.fly --formation=#{formation}"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
app = "<%= @app %>"
|
2
2
|
kill_signal = "SIGINT"
|
3
3
|
kill_timeout = 5
|
4
|
-
<% unless @avahi -%>
|
4
|
+
<% unless @avahi or @nats -%>
|
5
5
|
processes = []
|
6
6
|
<% end -%>
|
7
7
|
|
@@ -25,10 +25,10 @@ processes = []
|
|
25
25
|
<% else -%>
|
26
26
|
DATABASE_URL = "sqlite3:///mnt/volume/production.sqlite3"
|
27
27
|
<% end -%>
|
28
|
-
<% if @avahi -%>
|
28
|
+
<% if @avahi or @nats -%>
|
29
29
|
|
30
30
|
[processes]
|
31
|
-
app = "bin/rails fly:server[<%= @procs.keys.map {|key| "#{key}=1"}.join(';') %>]"
|
31
|
+
app = "bin/rails fly:server[<%= @procs.keys.map {|key| "#{key}=1"}.join(';') %>]"
|
32
32
|
<% end -%>
|
33
33
|
|
34
34
|
[mounts]
|
@@ -21,11 +21,19 @@ server {
|
|
21
21
|
|
22
22
|
<% if @anycable -%>
|
23
23
|
location /cable {
|
24
|
+
<%- if @passenger and (@avahi or @nats) -%>
|
25
|
+
proxy_pass http://${FLY_REGION}-anycable-go.local:8082/cable;
|
26
|
+
proxy_http_version 1.1;
|
27
|
+
proxy_set_header Upgrade $${_0_}http_upgrade;
|
28
|
+
proxy_set_header Connection "Upgrade";
|
29
|
+
proxy_set_header Host $${_0_}host;
|
30
|
+
<%- else -%>
|
24
31
|
proxy_pass http://localhost:8082/cable;
|
25
32
|
proxy_http_version 1.1;
|
26
33
|
proxy_set_header Upgrade $http_upgrade;
|
27
34
|
proxy_set_header Connection "Upgrade";
|
28
35
|
proxy_set_header Host $host;
|
36
|
+
<%- end -%>
|
29
37
|
}
|
30
38
|
|
31
39
|
<% elsif @cable -%>
|
data/lib/tasks/fly.rake
CHANGED
@@ -2,6 +2,7 @@ require 'fly.io-rails/machines'
|
|
2
2
|
require 'fly.io-rails/hcl'
|
3
3
|
require 'fly.io-rails/actions'
|
4
4
|
require 'toml'
|
5
|
+
require 'json'
|
5
6
|
|
6
7
|
namespace :fly do
|
7
8
|
desc 'Deploy fly application'
|
@@ -58,6 +59,72 @@ namespace :fly do
|
|
58
59
|
sh 'dbus-daemon --config-file=/usr/share/dbus-1/system.conf --print-address'
|
59
60
|
end
|
60
61
|
|
62
|
+
desc 'nats based service discovery'
|
63
|
+
task :nats_publish, [:formation] do |task, args|
|
64
|
+
nats_server = ENV['NATS_SERVER']
|
65
|
+
|
66
|
+
# start nats server
|
67
|
+
if nats_server == 'localhost'
|
68
|
+
pid = spawn('nats-server')
|
69
|
+
at_exit { Process.kill 7, pid }
|
70
|
+
else
|
71
|
+
open('/etc/hosts', 'a') do |file|
|
72
|
+
host = "#{ENV['FLY_REGION']}-nats-server.local"
|
73
|
+
file.puts "#{nats_server}\t#{host}"
|
74
|
+
nats_server = host
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# determine our local 6pn network address
|
79
|
+
address = IPSocket.getaddress('fly-local-6pn')
|
80
|
+
|
81
|
+
# Determine which applications we need addresses for and
|
82
|
+
# which applications we can provide addresses for.
|
83
|
+
hosts = {}
|
84
|
+
needs = []
|
85
|
+
args[:formation].scan(/([-\w]+)=(\d+)/).each do |name, count|
|
86
|
+
dnsname = "#{ENV['FLY_REGION']}-#{name}.local"
|
87
|
+
needs << dnsname
|
88
|
+
hosts[dnsname] = address unless count.to_i == 0
|
89
|
+
end
|
90
|
+
|
91
|
+
# share and collect hosts
|
92
|
+
require 'nats/client'
|
93
|
+
nats = NATS.connect(nats_server)
|
94
|
+
|
95
|
+
nats.subscribe('query_hosts') do |msg|
|
96
|
+
msg.respond hosts.to_json
|
97
|
+
end
|
98
|
+
|
99
|
+
update_hosts = Proc.new do |msg|
|
100
|
+
addresses = JSON.parse(msg.data)
|
101
|
+
|
102
|
+
open('/etc/hosts', 'r+') do |file|
|
103
|
+
file.flock(File::LOCK_EX)
|
104
|
+
contents = file.read
|
105
|
+
|
106
|
+
addresses.each do |dnsname, address|
|
107
|
+
file.puts "#{address}\t#{dnsname}" unless contents.include? dnsname
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
needs -= hosts.keys
|
112
|
+
end
|
113
|
+
|
114
|
+
nats.request('query_hosts', &update_hosts)
|
115
|
+
nats.subscribe('advertise_hosts', &update_hosts)
|
116
|
+
|
117
|
+
nats.publish('advertise_hosts', hosts.to_json)
|
118
|
+
|
119
|
+
at_exit { nats.close }
|
120
|
+
|
121
|
+
# wait for dependencies to be available
|
122
|
+
600.times do
|
123
|
+
break if needs.empty?
|
124
|
+
sleep 0.1
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
61
128
|
desc 'Zeroconf/avahi/bonjour discovery'
|
62
129
|
task :avahi_publish, [:formation] => :dbus_deamon do |task, args|
|
63
130
|
pids = []
|
@@ -70,6 +137,29 @@ namespace :fly do
|
|
70
137
|
pids << spawn("avahi-publish -a -R #{ENV['FLY_REGION']}-#{name}.local #{ip}")
|
71
138
|
end
|
72
139
|
|
140
|
+
require 'resolv'
|
141
|
+
100.times do
|
142
|
+
begin
|
143
|
+
map = {}
|
144
|
+
args[:formation].scan(/([-\w]+)=(\d+)/).each do |name, count|
|
145
|
+
dnsname = "#{ENV['FLY_REGION']}-#{name}.local"
|
146
|
+
resolve = `avahi-resolve-host-name #{dnsname}`
|
147
|
+
raise Resolv::ResolvError.new if $?.exitstatus > 0 or resolve.empty?
|
148
|
+
map[dnsname] = resolve.split.last
|
149
|
+
end
|
150
|
+
|
151
|
+
open('/etc/hosts', 'a') do |hosts|
|
152
|
+
map.each do |dnsname, address|
|
153
|
+
hosts.puts "#{address} #{dnsname}"
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
break
|
158
|
+
rescue Resolv::ResolvError
|
159
|
+
sleep 0.1
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
73
163
|
at_exit do
|
74
164
|
pids.each {|pid| Process.kill 7, pid}
|
75
165
|
end
|
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.
|
4
|
+
version: 0.1.14
|
5
5
|
platform: x86_64-darwin
|
6
6
|
authors:
|
7
7
|
- Sam Ruby
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-10-
|
11
|
+
date: 2022-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fly-ruby
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: nats-pure
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
description:
|
42
56
|
email: rubys@intertwingly.net
|
43
57
|
executables:
|