plutonium 0.10.2 → 0.10.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 +1 -0
- data/app/views/application/_flash_alerts.html.erb +3 -0
- data/app/views/application/_flash_toasts.html.erb +2 -0
- data/app/views/components/base.rb +1 -1
- data/app/views/layouts/resource.html copy.erb +2 -2
- data/app/views/layouts/resource.html.erb +3 -3
- data/app/views/layouts/rodauth.html.erb +9 -4
- data/app/views/rodauth/add_recovery_codes.html.erb +8 -7
- data/app/views/rodauth/otp_auth.html.erb +1 -1
- data/app/views/rodauth/otp_setup.html.erb +10 -8
- data/css.manifest +1 -1
- data/lib/generators/pu/core/ruby/ruby_generator.rb +30 -0
- data/lib/generators/pu/core/ruby/templates/.keep +0 -0
- data/lib/generators/pu/docker/install/install_generator.rb +35 -0
- data/lib/generators/pu/docker/install/templates/.keep +0 -0
- data/lib/generators/pu/docker/install/templates/Dockerfile.dev.tt +30 -0
- data/lib/generators/pu/docker/install/templates/Dockerfile.tt +75 -0
- data/lib/generators/pu/docker/install/templates/bin/console +3 -0
- data/lib/generators/pu/docker/install/templates/bin/restart +3 -0
- data/lib/generators/pu/docker/install/templates/bin/shell +3 -0
- data/lib/generators/pu/docker/install/templates/docker-compose.yml +29 -0
- data/lib/generators/pu/gem/dotenv/dotenv_generator.rb +32 -0
- data/lib/generators/pu/gem/dotenv/templates/.env +6 -0
- data/lib/generators/pu/gem/dotenv/templates/.env.local +5 -0
- data/lib/generators/pu/gem/dotenv/templates/.env.local.template +5 -0
- data/lib/generators/pu/gem/dotenv/templates/.env.template +6 -0
- data/lib/generators/pu/gem/dotenv/templates/.keep +0 -0
- data/lib/generators/pu/gem/dotenv/templates/config/initializers/001_ensure_required_env.rb +15 -0
- data/lib/generators/pu/gem/redis/redis_generator.rb +22 -0
- data/lib/generators/pu/gem/redis/templates/.keep +0 -0
- data/lib/generators/pu/lib/plutonium_generators/concerns/actions.rb +154 -32
- data/lib/generators/pu/lib/plutonium_generators/generator.rb +6 -6
- data/lib/generators/pu/lib/plutonium_generators/installer.rb +1 -1
- data/lib/generators/pu/rodauth/account_generator.rb +10 -10
- data/lib/generators/pu/rodauth/install_generator.rb +9 -2
- data/lib/generators/pu/rodauth/migration/sequel/audit_logging.erb +2 -2
- data/lib/generators/pu/rodauth/migration_generator.rb +1 -1
- data/lib/generators/pu/rodauth/templates/app/{misc → rodauth}/account_rodauth_plugin.rb.tt +2 -2
- data/lib/generators/pu/rodauth/templates/app/{misc → rodauth}/rodauth_plugin.rb.tt +0 -3
- data/lib/generators/pu/rodauth/templates/db/migrate/install_rodauth.rb.tt +5 -0
- data/lib/generators/pu/service/postgres/postgres_generator.rb +61 -0
- data/lib/generators/pu/service/postgres/templates/.keep +0 -0
- data/lib/generators/pu/service/postgres/templates/bin/initdb.d/create-multiple-postgresql-databases.sh +22 -0
- data/lib/generators/pu/service/postgres/templates/database.yml.tt +93 -0
- data/lib/generators/pu/service/sidekiq/sidekiq_generator.rb +62 -0
- data/lib/generators/pu/service/sidekiq/templates/.keep +0 -0
- data/lib/generators/pu/service/sidekiq/templates/app/sidekiq/sidekiq_job.rb +5 -0
- data/lib/generators/pu/service/sidekiq/templates/config/initializers/sidekiq.rb +53 -0
- data/lib/generators/pu/service/sidekiq/templates/config/sidekiq.yml +6 -0
- data/lib/plutonium/config.rb +7 -2
- data/lib/plutonium/core/controllers/base.rb +1 -1
- data/lib/plutonium/core/controllers/entity_scoping.rb +3 -3
- data/lib/plutonium/icons.rb +1 -1
- data/lib/plutonium/railtie.rb +4 -0
- data/lib/plutonium/resource/controller.rb +1 -0
- data/lib/plutonium/rodauth/controller_methods.rb +1 -1
- data/lib/plutonium/version.rb +1 -1
- data/lib/plutonium.rb +4 -0
- data/lib/tasks/create_rodauth_admin.rake +16 -0
- data/public/plutonium-assets/plutonium.8bee7a8482988b0360e3.css +3420 -0
- metadata +36 -5
- /data/lib/generators/pu/rodauth/templates/app/{misc → rodauth}/rodauth_app.rb.tt +0 -0
@@ -22,7 +22,10 @@ module PlutoniumGenerators
|
|
22
22
|
|
23
23
|
in_root do
|
24
24
|
create_file ".ruby-version", version, force: true, verbose: false
|
25
|
-
gsub_file
|
25
|
+
gsub_file("Gemfile", /^ruby .*/, "ruby File.read(\".ruby-version\").strip", verbose: false)
|
26
|
+
%w[Dockerfile Dockerfile.prod Dockerfile.dev].each do |file|
|
27
|
+
gsub_file(file, /^ARG RUBY_VERSION=.*/, "ARG RUBY_VERSION=#{version}", verbose: false) if File.exist?(file)
|
28
|
+
end
|
26
29
|
end
|
27
30
|
end
|
28
31
|
|
@@ -95,29 +98,84 @@ module PlutoniumGenerators
|
|
95
98
|
# gsub_file "Gemfile", /(:?^.*#.*\n)*.*gem ['"]#{gem}['"].*\n/, "", verbose: false
|
96
99
|
# end
|
97
100
|
|
98
|
-
#
|
99
|
-
# Evaluates the given template and merges it with the project's docker-compose.yml
|
100
|
-
#
|
101
|
-
# @param [String] source the template filename
|
102
|
-
#
|
103
|
-
# @return [void]
|
104
|
-
#
|
105
|
-
def docker_compose(source)
|
106
|
-
|
101
|
+
# #
|
102
|
+
# # Evaluates the given template and merges it with the project's docker-compose.yml
|
103
|
+
# #
|
104
|
+
# # @param [String] source the template filename
|
105
|
+
# #
|
106
|
+
# # @return [void]
|
107
|
+
# #
|
108
|
+
# def docker_compose(source)
|
109
|
+
# log :docker_compose, source
|
110
|
+
|
111
|
+
# in_root do
|
112
|
+
# compose_file = "docker-compose.yml"
|
113
|
+
# compose_definition = YAML.load_file(compose_file) if File.exist?(compose_file)
|
114
|
+
# compose_definition ||= {
|
115
|
+
# version: "3.7",
|
116
|
+
# services: {}
|
117
|
+
# }
|
118
|
+
# compose_definition.deep_stringify_keys!
|
119
|
+
|
120
|
+
# new_definition = YAML.load template_eval("docker-compose/#{source}.yml.tt")
|
121
|
+
# compose_definition.deep_merge! new_definition.deep_stringify_keys
|
122
|
+
|
123
|
+
# create_file compose_file, YAML.dump(compose_definition), force: true
|
124
|
+
# end
|
125
|
+
# end
|
126
|
+
|
127
|
+
def managed_compose(file = "docker-compose.yml")
|
128
|
+
@managed_compose ||= {}
|
129
|
+
|
130
|
+
@managed_compose[file] ||= in_root do
|
131
|
+
next unless File.exist?(file)
|
132
|
+
|
133
|
+
parsed_yaml = YAML.load_file(file, aliases: true)
|
134
|
+
parsed_yaml if parsed_yaml["x-managed-by"] == "plutonium"
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def add_compose_service(service, config, file = "docker-compose.yml")
|
139
|
+
docker_compose = managed_compose(file)
|
140
|
+
error "Docker compose is not managed by plutonium" unless docker_compose
|
141
|
+
error "#{service} is already added to compose" if docker_compose["services"].key?(service.to_s)
|
107
142
|
|
108
143
|
in_root do
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
144
|
+
insert_into_file file, indent(config, 2), after: /.*# additional services go here.*\n/
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def add_compose_env(key, value, service = "x-app", file = "docker-compose.yml")
|
149
|
+
raise NotImplementedError, "only service: x-app is currently supported" unless service == "x-app"
|
150
|
+
|
151
|
+
docker_compose = managed_compose(file)
|
152
|
+
error "Docker compose is not managed by plutonium" unless docker_compose
|
153
|
+
|
154
|
+
in_root do
|
155
|
+
gsub_file file, "environment: {} # x-app", "environment: # #{service}"
|
156
|
+
gsub_file file, /.*#{key}:.*# #{service}.*\n/, ""
|
157
|
+
config = "#{key}: #{value} # #{service}\n"
|
158
|
+
insert_into_file file, indent(config, 4), after: /.*environment: # #{service}.*\n/
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def add_compose_dependency(value, service = "x-app", file = "docker-compose.yml")
|
163
|
+
raise NotImplementedError, "only service: x-app is currently supported" unless service == "x-app"
|
164
|
+
|
165
|
+
docker_compose = managed_compose(file)
|
166
|
+
error "Docker compose is not managed by plutonium" unless docker_compose
|
167
|
+
|
168
|
+
in_root do
|
169
|
+
gsub_file file, "depends_on: [] # x-app", "depends_on: # #{service}"
|
170
|
+
gsub_file file, /.*- #{value}.*# #{service}.*\n/, ""
|
171
|
+
config = "- #{value} # #{service}\n"
|
172
|
+
insert_into_file file, indent(config, 4), after: /.*depends_on: # #{service}.*\n/
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def add_docker_dependency(config, file = "Dockerfile.dev")
|
177
|
+
in_root do
|
178
|
+
insert_into_file file, "#{config}\n", after: /.*# Additional dependencies go here*\n\n/
|
121
179
|
end
|
122
180
|
end
|
123
181
|
|
@@ -283,6 +341,23 @@ module PlutoniumGenerators
|
|
283
341
|
end
|
284
342
|
end
|
285
343
|
|
344
|
+
#
|
345
|
+
# Insert the given directives into .dockerignore
|
346
|
+
#
|
347
|
+
# @param [String] *directives directives to ignore
|
348
|
+
#
|
349
|
+
# @return [void]
|
350
|
+
#
|
351
|
+
def dockerignore(*directives)
|
352
|
+
in_root do
|
353
|
+
# Doing this one by one so that duplication detection during insertion will work
|
354
|
+
directives.each do |directive|
|
355
|
+
log :dockerignore, directive
|
356
|
+
insert_into_file ".dockerignore", "#{directive}\n", verbose: false
|
357
|
+
end
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
286
361
|
#
|
287
362
|
# Similar to #run, this executes a command but returns both success and output
|
288
363
|
#
|
@@ -313,6 +388,58 @@ module PlutoniumGenerators
|
|
313
388
|
[success, output]
|
314
389
|
end
|
315
390
|
|
391
|
+
def bin_directory
|
392
|
+
# Copy the directory and store the list of copied files
|
393
|
+
@copied_files = directory "bin"
|
394
|
+
# Change permissions of the copied files to make them executable
|
395
|
+
in_root do
|
396
|
+
@copied_files.each do |file|
|
397
|
+
file = file.split("/bin/")[1]
|
398
|
+
file = "bin/#{file}"
|
399
|
+
puts file
|
400
|
+
chmod file, "+x" if File.file?(file)
|
401
|
+
end
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
def bundle!
|
406
|
+
log :bundle, "install"
|
407
|
+
|
408
|
+
Bundler.with_unbundled_env do
|
409
|
+
run "bundle install", verbose: false
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
def bundle(*gems, **options)
|
414
|
+
gems = Array(gems).join " "
|
415
|
+
options = hash_to_cli_options options
|
416
|
+
cmd_args = "add #{gems} #{options}"
|
417
|
+
|
418
|
+
log :bundle, cmd_args
|
419
|
+
Bundler.with_unbundled_env do
|
420
|
+
run "bundle #{cmd_args}", verbose: false
|
421
|
+
end
|
422
|
+
end
|
423
|
+
|
424
|
+
def unbundle(*gems)
|
425
|
+
gems = Array(gems).join " "
|
426
|
+
cmd_args = "remove #{gems}"
|
427
|
+
|
428
|
+
log :bundle, cmd_args
|
429
|
+
Bundler.with_unbundled_env do
|
430
|
+
run "bundle remove #{Array(gems).join " "}", verbose: false
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
def add_required_env_vars(*vars)
|
435
|
+
vars = Array(vars).join " "
|
436
|
+
log :equired_env_vars, vars
|
437
|
+
in_root do
|
438
|
+
cmd = "required_env_vars += %w[#{vars}]\n"
|
439
|
+
insert_into_file "config/initializers/001_ensure_required_env.rb", cmd, after: /# Add additional env vars here.*\n/
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
316
443
|
private
|
317
444
|
|
318
445
|
#
|
@@ -351,16 +478,11 @@ module PlutoniumGenerators
|
|
351
478
|
end
|
352
479
|
end
|
353
480
|
|
354
|
-
def
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
def unbundle(*gems)
|
361
|
-
Bundler.with_unbundled_env do
|
362
|
-
run "bundle remove #{Array(gems).join " "}"
|
363
|
-
end
|
481
|
+
def hash_to_cli_options(hash)
|
482
|
+
hash.map do |key, value|
|
483
|
+
formatted_value = value.is_a?(Array) ? value.join(",") : value
|
484
|
+
"--#{key.to_s.tr("_", "-")}=#{formatted_value}"
|
485
|
+
end.join(" ")
|
364
486
|
end
|
365
487
|
end
|
366
488
|
end
|
@@ -64,13 +64,13 @@ module PlutoniumGenerators
|
|
64
64
|
@prompt ||= TTY::Prompt.new
|
65
65
|
end
|
66
66
|
|
67
|
-
def appname
|
68
|
-
|
69
|
-
end
|
67
|
+
# def appname
|
68
|
+
# defined?(Rails.application) ? Rails.application.class.module_parent.name : "PlutoniumGenerators"
|
69
|
+
# end
|
70
70
|
|
71
|
-
def app_name
|
72
|
-
|
73
|
-
end
|
71
|
+
# def app_name
|
72
|
+
# appname.underscore
|
73
|
+
# end
|
74
74
|
|
75
75
|
def pug_installed?(feature, version: nil)
|
76
76
|
installed_version = read_config(:installed, feature)
|
@@ -28,7 +28,7 @@ module Pu
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def create_rodauth_app
|
31
|
-
template "app/
|
31
|
+
template "app/rodauth/account_rodauth_plugin.rb", "app/rodauth/#{account_path}_rodauth_plugin.rb"
|
32
32
|
end
|
33
33
|
|
34
34
|
def configure_rodauth_plugin
|
@@ -36,16 +36,16 @@ module Pu
|
|
36
36
|
plugin_name = indent(
|
37
37
|
"configure ::#{account_path.classify}RodauthPlugin#{", :#{table_prefix}" unless primary?}\n", 2
|
38
38
|
)
|
39
|
-
gsub_file "app/
|
40
|
-
insert_into_file "app/
|
39
|
+
gsub_file "app/rodauth/rodauth_app.rb", /.*# configure RodauthMain\n/, ""
|
40
|
+
insert_into_file "app/rodauth/rodauth_app.rb", plugin_name, after: "# auth configuration\n"
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
def configure_rodauth_plugin_load_route
|
45
45
|
in_root do
|
46
46
|
route_config = indent("r.rodauth#{"(:#{table_prefix})" unless primary?}\n", 4)
|
47
|
-
gsub_file "app/
|
48
|
-
insert_into_file "app/
|
47
|
+
gsub_file "app/rodauth/rodauth_app.rb", /.*# r\.rodauth\n/, ""
|
48
|
+
insert_into_file "app/rodauth/rodauth_app.rb", route_config, after: "# auth route configuration\n"
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -54,15 +54,15 @@ module Pu
|
|
54
54
|
plugin_config = indent(
|
55
55
|
"rodauth#{"(:#{table_prefix})" unless primary?}.load_memory # autologin remembered #{table}\n", 4
|
56
56
|
)
|
57
|
-
gsub_file "app/
|
57
|
+
gsub_file "app/rodauth/rodauth_app.rb", /.*# rodauth\.load_memory.*\n/, ""
|
58
58
|
|
59
59
|
if remember?
|
60
|
-
insert_into_file "app/
|
60
|
+
insert_into_file "app/rodauth/rodauth_app.rb", plugin_config, after: "# plugin route configuration\n"
|
61
61
|
else
|
62
|
-
gsub_file "app/
|
62
|
+
gsub_file "app/rodauth/rodauth_app.rb", plugin_config, ""
|
63
63
|
in_root do
|
64
|
-
unless File.read("app/
|
65
|
-
insert_into_file "app/
|
64
|
+
unless File.read("app/rodauth/rodauth_app.rb").match?(/.*\.load_memory # autologin/)
|
65
|
+
insert_into_file "app/rodauth/rodauth_app.rb", indent("# rodauth.load_memory # autologin remembered users\n", 4),
|
66
66
|
after: "# plugin route configuration\n"
|
67
67
|
end
|
68
68
|
end
|
@@ -1,9 +1,12 @@
|
|
1
1
|
require "rails/generators/base"
|
2
|
+
require "rails/generators/active_record/migration"
|
2
3
|
require "securerandom"
|
3
4
|
|
4
5
|
module Pu
|
5
6
|
module Rodauth
|
6
7
|
class InstallGenerator < ::Rails::Generators::Base
|
8
|
+
include ::ActiveRecord::Generators::Migration
|
9
|
+
|
7
10
|
SEQUEL_ADAPTERS = {
|
8
11
|
"postgresql" => (RUBY_ENGINE == "jruby") ? "postgresql" : "postgres",
|
9
12
|
"mysql2" => (RUBY_ENGINE == "jruby") ? "mysql" : "mysql2",
|
@@ -31,8 +34,8 @@ module Pu
|
|
31
34
|
end
|
32
35
|
|
33
36
|
def create_rodauth_app
|
34
|
-
template "app/
|
35
|
-
template "app/
|
37
|
+
template "app/rodauth/rodauth_app.rb"
|
38
|
+
template "app/rodauth/rodauth_plugin.rb"
|
36
39
|
end
|
37
40
|
|
38
41
|
def add_dev_config
|
@@ -41,6 +44,10 @@ module Pu
|
|
41
44
|
before: /^end/
|
42
45
|
end
|
43
46
|
|
47
|
+
def create_install_migration
|
48
|
+
migration_template "db/migrate/install_rodauth.rb", "db/migrate/install_rodauth.rb" # , File.join(db_migrate_path, "#{migration_name}.rb")
|
49
|
+
end
|
50
|
+
|
44
51
|
def show_instructions
|
45
52
|
readme "INSTRUCTIONS" if behavior == :invoke
|
46
53
|
end
|
@@ -12,6 +12,6 @@ create_table :<%= table_prefix %>_authentication_audit_logs do
|
|
12
12
|
<% else -%>
|
13
13
|
String :metadata
|
14
14
|
<% end -%>
|
15
|
-
index [:<%= table_prefix %>_id, :at], name:
|
16
|
-
index :at, name:
|
15
|
+
index [:<%= table_prefix %>_id, :at], name: :<%= table_prefix %>_audit_<%= table_prefix %>_at_idx
|
16
|
+
index :at, name: :<%= table_prefix %>_audit_at_idx
|
17
17
|
end
|
@@ -38,8 +38,8 @@ class <%= account_path.classify %>RodauthPlugin < RodauthPlugin
|
|
38
38
|
rails_account_model { <%= account_path.classify %> }
|
39
39
|
<% if verify_account? -%>
|
40
40
|
|
41
|
-
# Set password
|
42
|
-
verify_account_set_password? false
|
41
|
+
# Set password password during create account.
|
42
|
+
# verify_account_set_password? false
|
43
43
|
<% end -%>
|
44
44
|
|
45
45
|
# Change some default param keys.
|
@@ -50,9 +50,6 @@ class RodauthPlugin < Rodauth::Rails::Auth
|
|
50
50
|
# Store account status in an integer column without foreign key constraint.
|
51
51
|
account_status_column :status
|
52
52
|
|
53
|
-
# Set password when verifying account.
|
54
|
-
# verify_account_set_password? false
|
55
|
-
|
56
53
|
# Change some default param keys/labels.
|
57
54
|
login_label "Email"
|
58
55
|
login_param "email"
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../lib/plutonium_generators"
|
4
|
+
|
5
|
+
module Pu
|
6
|
+
module Service
|
7
|
+
class PostgresGenerator < Rails::Generators::Base
|
8
|
+
include PlutoniumGenerators::Generator
|
9
|
+
|
10
|
+
source_root File.expand_path("templates", __dir__)
|
11
|
+
|
12
|
+
desc "Set up postgres for project"
|
13
|
+
|
14
|
+
def start
|
15
|
+
bundle "goldiloader"
|
16
|
+
template "database.yml", "config/database.yml", force: true
|
17
|
+
bin_directory
|
18
|
+
add_compose_env :POSTGRES_HOST, service
|
19
|
+
add_compose_dependency service
|
20
|
+
add_compose_service service, compose_config
|
21
|
+
add_docker_dependency docker_deps
|
22
|
+
rescue => e
|
23
|
+
exception "#{self.class} failed:", e
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def service
|
29
|
+
:postgres
|
30
|
+
end
|
31
|
+
|
32
|
+
def compose_config
|
33
|
+
<<~COMPOSE
|
34
|
+
postgres:
|
35
|
+
image: postgres:15 # postgres
|
36
|
+
# postgres properties
|
37
|
+
environment: # postgres
|
38
|
+
POSTGRES_MULTIPLE_DATABASES: #{db_prefix}_development,#{db_prefix}_test # postgres
|
39
|
+
POSTGRES_USER: postgres # postgres
|
40
|
+
POSTGRES_PASSWORD: postgres # postgres
|
41
|
+
volumes: # postgres
|
42
|
+
- "./.volumes/postgres/data:/var/lib/postgresql/data" # postgres
|
43
|
+
- "./bin/initdb.d:/docker-entrypoint-initdb.d" # postgres
|
44
|
+
COMPOSE
|
45
|
+
end
|
46
|
+
|
47
|
+
def docker_deps
|
48
|
+
<<~DEPS
|
49
|
+
# Install packages needed for postgres
|
50
|
+
RUN apt-get update -qq && \\
|
51
|
+
apt-get install --no-install-recommends -y curl postgresql-client && \\
|
52
|
+
rm -rf /var/lib/apt/lists /var/cache/apt/archives
|
53
|
+
DEPS
|
54
|
+
end
|
55
|
+
|
56
|
+
def db_prefix
|
57
|
+
Plutonium.application_name.underscore
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
File without changes
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
set -u
|
5
|
+
|
6
|
+
function create_user_and_database() {
|
7
|
+
local database=$1
|
8
|
+
echo " Creating user and database '$database'"
|
9
|
+
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
|
10
|
+
CREATE USER $database;
|
11
|
+
CREATE DATABASE $database;
|
12
|
+
GRANT ALL PRIVILEGES ON DATABASE $database TO $database;
|
13
|
+
EOSQL
|
14
|
+
}
|
15
|
+
|
16
|
+
if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then
|
17
|
+
echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES"
|
18
|
+
for db in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ',' ' '); do
|
19
|
+
create_user_and_database $db
|
20
|
+
done
|
21
|
+
echo "Multiple databases created"
|
22
|
+
fi
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# PostgreSQL. Versions 9.3 and up are supported.
|
2
|
+
#
|
3
|
+
# Install the pg driver:
|
4
|
+
# gem install pg
|
5
|
+
# On macOS with Homebrew:
|
6
|
+
# gem install pg -- --with-pg-config=/usr/local/bin/pg_config
|
7
|
+
# On Windows:
|
8
|
+
# gem install pg
|
9
|
+
# Choose the win32 build.
|
10
|
+
# Install PostgreSQL and put its /bin directory on your path.
|
11
|
+
#
|
12
|
+
# Configure Using Gemfile
|
13
|
+
# gem "pg"
|
14
|
+
#
|
15
|
+
default: &default
|
16
|
+
adapter: postgresql
|
17
|
+
encoding: unicode
|
18
|
+
# For details on connection pooling, see Rails configuration guide
|
19
|
+
# https://guides.rubyonrails.org/configuring.html#database-pooling
|
20
|
+
pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
|
21
|
+
# Timeouts
|
22
|
+
connect_timeout: 1
|
23
|
+
checkout_timeout: 1
|
24
|
+
variables:
|
25
|
+
statement_timeout: <%%= ENV["STATEMENT_TIMEOUT"] || "15s" %> # or ms, min, etc
|
26
|
+
|
27
|
+
local: &local
|
28
|
+
host: <%%= ENV["POSTGRES_HOST"] %>
|
29
|
+
port: 5432
|
30
|
+
username: postgres
|
31
|
+
password: postgres
|
32
|
+
|
33
|
+
development:
|
34
|
+
<<: [*default, *local]
|
35
|
+
database: <%= db_prefix %>_development
|
36
|
+
|
37
|
+
# The specified database role being used to connect to PostgreSQL.
|
38
|
+
# To create additional roles in PostgreSQL see `$ createuser --help`.
|
39
|
+
# When left blank, PostgreSQL will use the default role. This is
|
40
|
+
# the same name as the operating system user running Rails.
|
41
|
+
#username: <%= db_prefix %>
|
42
|
+
|
43
|
+
# The password associated with the PostgreSQL role (username).
|
44
|
+
#password:
|
45
|
+
|
46
|
+
# Connect on a TCP socket. Omitted by default since the client uses a
|
47
|
+
# domain socket that doesn't need configuration. Windows does not have
|
48
|
+
# domain sockets, so uncomment these lines.
|
49
|
+
#host: localhost
|
50
|
+
|
51
|
+
# The TCP port the server listens on. Defaults to 5432.
|
52
|
+
# If your server runs on a different port number, change accordingly.
|
53
|
+
#port: 5432
|
54
|
+
|
55
|
+
# Schema search path. The server defaults to $user,public
|
56
|
+
#schema_search_path: myapp,sharedapp,public
|
57
|
+
|
58
|
+
# Minimum log levels, in increasing order:
|
59
|
+
# debug5, debug4, debug3, debug2, debug1,
|
60
|
+
# log, notice, warning, error, fatal, and panic
|
61
|
+
# Defaults to warning.
|
62
|
+
#min_messages: notice
|
63
|
+
|
64
|
+
# Warning: The database defined as "test" will be erased and
|
65
|
+
# re-generated from your development database when you run "rake".
|
66
|
+
# Do not set this db to the same as development or production.
|
67
|
+
test:
|
68
|
+
<<: [*default, *local]
|
69
|
+
database: <%= db_prefix %>_test
|
70
|
+
|
71
|
+
# As with config/credentials.yml, you never want to store sensitive information,
|
72
|
+
# like your database password, in your source code. If your source code is
|
73
|
+
# ever seen by anyone, they now have access to your database.
|
74
|
+
#
|
75
|
+
# Instead, provide the password or a full connection URL as an environment
|
76
|
+
# variable when you boot the app. For example:
|
77
|
+
#
|
78
|
+
# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
|
79
|
+
#
|
80
|
+
# If the connection URL is provided in the special DATABASE_URL environment
|
81
|
+
# variable, Rails will automatically merge its configuration values on top of
|
82
|
+
# the values provided in this file. Alternatively, you can specify a connection
|
83
|
+
# URL environment variable explicitly:
|
84
|
+
#
|
85
|
+
# production:
|
86
|
+
# url: <%%= ENV["MY_APP_DATABASE_URL"] %>
|
87
|
+
#
|
88
|
+
# Read https://guides.rubyonrails.org/configuring.html#configuring-a-database
|
89
|
+
# for a full overview on how database connection configuration can be specified.
|
90
|
+
#
|
91
|
+
production:
|
92
|
+
<<: *default
|
93
|
+
database: <%= db_prefix %>_production
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../lib/plutonium_generators"
|
4
|
+
|
5
|
+
module Pu
|
6
|
+
module Service
|
7
|
+
class SidekiqGenerator < Rails::Generators::Base
|
8
|
+
include PlutoniumGenerators::Generator
|
9
|
+
|
10
|
+
source_root File.expand_path("templates", __dir__)
|
11
|
+
|
12
|
+
desc "Set up sidekiq for project"
|
13
|
+
|
14
|
+
def start
|
15
|
+
bundle "sidekiq"
|
16
|
+
bundle "sidekiq-failures"
|
17
|
+
directory "app"
|
18
|
+
directory "config"
|
19
|
+
|
20
|
+
in_root do
|
21
|
+
insert_into_file "app/jobs/application_job.rb", "\n sidekiq_options failures: :exhausted\n", before: /^end/
|
22
|
+
end
|
23
|
+
|
24
|
+
add_compose_env :REDIS_QUEUE_URL, "redis://redis-queue/0"
|
25
|
+
add_required_env_vars :REDIS_QUEUE_URL
|
26
|
+
add_compose_dependency redis_service
|
27
|
+
add_compose_service service, sidekiq_compose_config
|
28
|
+
add_compose_service redis_service, redis_compose_config
|
29
|
+
rescue => e
|
30
|
+
exception "#{self.class} failed:", e
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def service
|
36
|
+
:sidekiq
|
37
|
+
end
|
38
|
+
|
39
|
+
def redis_service
|
40
|
+
:"redis-queue"
|
41
|
+
end
|
42
|
+
|
43
|
+
def sidekiq_compose_config
|
44
|
+
<<~COMPOSE
|
45
|
+
sidekiq:
|
46
|
+
<<: *app # sidekiq
|
47
|
+
command: /bin/sh -c "bundle && sidekiq" # sidekiq
|
48
|
+
# sidekiq properties
|
49
|
+
COMPOSE
|
50
|
+
end
|
51
|
+
|
52
|
+
def redis_compose_config
|
53
|
+
<<~COMPOSE
|
54
|
+
redis-queue:
|
55
|
+
image: redis # redis-queue
|
56
|
+
command: bash -c "redis-server --maxmemory-policy noeviction" # redis-queue
|
57
|
+
# redis-queue properties
|
58
|
+
COMPOSE
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
File without changes
|