fly-atc 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|