fly-atc 0.0.1 → 0.0.3
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/README.md +14 -6
- data/lib/fly-atc/version.rb +1 -1
- data/lib/fly-atc.rb +7 -0
- data/lib/generators/atc_generator.rb +44 -0
- data/lib/generators/templates/application.html.erb +1 -0
- data/lib/generators/templates/routes.erb +1 -0
- data/lib/helpers/atc-cable.rb +17 -0
- data/lib/tasks/atc.rake +49 -0
- data/lib/tasks/templates/litestream.yml.erb +14 -0
- metadata +37 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84df5f5fc4b0f255472486726d523a894466b53ea70b02eba40bdcd7ec923566
|
4
|
+
data.tar.gz: de42c80a9fdf476eab9d417f591d213b7ad6cfe11187e646542ac0c87c0e41bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 928a5034c7cd7baf41c4f482aa83ba0e855dc615ae1f357b4a899654e48b937876cd489f43bb23641af20943c4fa79ae9f7e691ab08a593cadf6c575c8c345d5
|
7
|
+
data.tar.gz: 281627f56d61c7b099625829bd69509a3cbc06b76237defd6a71eadc9a851aa25e5b965a91b74f720a2d2cce32d30c3276252a25469d95dd49ce591aa3600a84
|
data/README.md
CHANGED
@@ -6,15 +6,23 @@ A SaaS toolkit for converting a personal application into a efficient, siloed, m
|
|
6
6
|
|
7
7
|
## Usage
|
8
8
|
|
9
|
-
|
9
|
+
### Quickstart (single tenant):
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
```
|
12
|
+
bundle add fly-atc
|
13
|
+
bundle binstubs fly-atc
|
14
|
+
```
|
13
15
|
|
14
|
-
|
16
|
+
Replace `thruster` with `fly-atc` in Dockerfile.
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
+
### Quickstart (multi-tenant):
|
19
|
+
|
20
|
+
```
|
21
|
+
bundle add fly-atc
|
22
|
+
bin/rails generate atc
|
23
|
+
```
|
24
|
+
|
25
|
+
Edit `config/atc.yml` as needed.
|
18
26
|
|
19
27
|
Fly.io's dockerfile generators will be able to help with this.
|
20
28
|
|
data/lib/fly-atc/version.rb
CHANGED
data/lib/fly-atc.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
class AtcGenerator < Rails::Generators::Base
|
2
|
+
def generate_app
|
3
|
+
source_paths.push File.expand_path("./templates", __dir__)
|
4
|
+
|
5
|
+
### config/routes.rb
|
6
|
+
|
7
|
+
@routes = IO.read("config/routes.rb")
|
8
|
+
|
9
|
+
unless @routes.include? "fly_atc_scope"
|
10
|
+
_, prolog, routes = routes.split(/(.*Rails.application.routes.draw do\n)/m,2)
|
11
|
+
routes, epilog, _ = @routes.split(/^(end.*)/m,2)
|
12
|
+
routes = routes.split(/\n\s*\n/)
|
13
|
+
scoped = routes.select {|route| route =~ /^\s*\w/ && !route.include?('as:')}
|
14
|
+
|
15
|
+
@routes = <<~EOF
|
16
|
+
#{prolog.rstrip}
|
17
|
+
fly_atc_scope = ENV.fetch("FLY_ATC_SCOPE", "")
|
18
|
+
|
19
|
+
unless fly_atc_scope == ""
|
20
|
+
mount ActionCable.server => "/\#{fly_atc_scope}/cable"
|
21
|
+
end
|
22
|
+
|
23
|
+
scope fly_atc_scope do
|
24
|
+
#{scoped.join("\n\n").gsub(/^ /, " ")}
|
25
|
+
end
|
26
|
+
|
27
|
+
#{(routes-scoped).join("\n\n").rstrip}
|
28
|
+
#{epilog.rstrip}
|
29
|
+
EOF
|
30
|
+
end
|
31
|
+
|
32
|
+
template "routes.erb", "config/routes.rb"
|
33
|
+
|
34
|
+
### app/views/layouts/application.html.erb
|
35
|
+
|
36
|
+
@layout = IO.read("app/views/layouts/application.html.erb")
|
37
|
+
|
38
|
+
unless @layout.include? "action_cable_meta_tag_dynamic"
|
39
|
+
@layout[/<meta.*?\n()\r?\n/m, 1] = " <%= action_cable_meta_tag_dynamic %>\n"
|
40
|
+
end
|
41
|
+
|
42
|
+
template "application.html.erb", "app/views/layouts/application.html.erb"
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= @layout -%>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= @routes -%>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ApplicationHelper
|
2
|
+
def action_cable_meta_tag_dynamic
|
3
|
+
scheme = (request.env['HTTP_X_FORWARDED_PROTO'] || request.env["rack.url_scheme"] || '').split(',').last
|
4
|
+
return '' if scheme.blank?
|
5
|
+
host = request.env['HTTP_X_FORWARDED_HOST'] || request.env["HTTP_HOST"]
|
6
|
+
scope = ENV.fetch('FLY_ATC_SCOPE', "")
|
7
|
+
root = request.env['RAILS_RELATIVE_URL_ROOT']
|
8
|
+
|
9
|
+
if scope != ""
|
10
|
+
websocket = "#{scheme.sub('http', 'ws')}://#{host}#{root}#{scope}/cable"
|
11
|
+
else
|
12
|
+
websocket = "#{scheme.sub('http', 'ws')}://#{host}#{root}/cable"
|
13
|
+
end
|
14
|
+
|
15
|
+
"<meta name=\"action-cable-url\" content=\"#{websocket}\" />".html_safe
|
16
|
+
end
|
17
|
+
end
|
data/lib/tasks/atc.rake
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
actions = Rake::Task["db:prepare"].actions.clone
|
2
|
+
|
3
|
+
namespace :db do
|
4
|
+
task :atc_prepare => "db:load_config" do
|
5
|
+
actions.each {|action| action.call}
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
Rake::Task["db:prepare"].clear
|
10
|
+
|
11
|
+
namespace :litestream do
|
12
|
+
task :atc_config => "db:load_config" do
|
13
|
+
require 'erubi'
|
14
|
+
|
15
|
+
@dbs =
|
16
|
+
ActiveRecord::Base
|
17
|
+
.configurations
|
18
|
+
.configs_for(env_name: "production", include_hidden: true)
|
19
|
+
.select { |config| ["sqlite3", "litedb"].include? config.adapter }
|
20
|
+
.map(&:database)
|
21
|
+
|
22
|
+
@config = ENV["LITESTREAM_CONFIG"] || Rails.root.join("config/litestream.yml")
|
23
|
+
|
24
|
+
template = File.read(File.join(File.dirname(__FILE__), "templates/litestream.yml.erb"))
|
25
|
+
result = eval(Erubi::Engine.new(template).src)
|
26
|
+
|
27
|
+
unless File.exist?(@config) && File.read(@config) == result
|
28
|
+
File.write(@config, result)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
task :atc_restore => "litestream:atc_config" do
|
33
|
+
next unless ENV["BUCKET_NAME"]
|
34
|
+
|
35
|
+
@dbs.each do |database|
|
36
|
+
next if File.exist? database
|
37
|
+
sh "bundle exec litestream restore -config #{@config} -if-replica-exists #{database}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
task :atc_replicate => "litestream:atc_config" do
|
42
|
+
next unless ENV["BUCKET_NAME"]
|
43
|
+
sh "bundle exec litestream replicate -config #{@config}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
namespace :atc do
|
48
|
+
task :prepare => ["litestream:atc_restore", "db:atc_prepare"]
|
49
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# This is the configuration file for litestream.
|
2
|
+
#
|
3
|
+
# For more details, see: https://litestream.io/reference/config/
|
4
|
+
#
|
5
|
+
dbs:
|
6
|
+
<% for db in @dbs -%>
|
7
|
+
- path: <%= db %>
|
8
|
+
replicas:
|
9
|
+
- type: s3
|
10
|
+
bucket: $BUCKET_NAME
|
11
|
+
path: storage/<%= File.basename(db) %>
|
12
|
+
access-key-id: $AWS_ACCESS_KEY_ID
|
13
|
+
secret-access-key: $AWS_SECRET_ACCESS_KEY
|
14
|
+
<% end -%>
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fly-atc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Ruby
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-11-
|
12
|
-
dependencies:
|
11
|
+
date: 2024-11-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 7.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 7.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: litestream
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.10'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.10'
|
13
41
|
description: An HTTP/2 proxy for mutli-tenant production deployments
|
14
42
|
email: rubys@intertwingly.net
|
15
43
|
executables:
|
@@ -22,6 +50,12 @@ files:
|
|
22
50
|
- exe/fly-atc
|
23
51
|
- lib/fly-atc.rb
|
24
52
|
- lib/fly-atc/version.rb
|
53
|
+
- lib/generators/atc_generator.rb
|
54
|
+
- lib/generators/templates/application.html.erb
|
55
|
+
- lib/generators/templates/routes.erb
|
56
|
+
- lib/helpers/atc-cable.rb
|
57
|
+
- lib/tasks/atc.rake
|
58
|
+
- lib/tasks/templates/litestream.yml.erb
|
25
59
|
homepage: https://github.com/rubys/fly-atc
|
26
60
|
licenses:
|
27
61
|
- MIT
|