nulogy_message_bus_consumer 1.0.0.alpha → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +0 -6
- data/lib/nulogy_message_bus_consumer/config.rb +9 -1
- data/lib/nulogy_message_bus_consumer/message.rb +11 -13
- data/lib/nulogy_message_bus_consumer/steps/timed_task.rb +42 -0
- data/lib/nulogy_message_bus_consumer/tasks/log_consumer_lag.rb +51 -0
- data/lib/nulogy_message_bus_consumer/tasks/prune_processed_messages.rb +37 -0
- data/lib/nulogy_message_bus_consumer/{steps → tasks}/supervise_consumer_lag.rb +15 -26
- data/lib/nulogy_message_bus_consumer/version.rb +1 -1
- data/lib/nulogy_message_bus_consumer.rb +16 -7
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/config/manifest.js +3 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
- data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +2 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/javascript/packs/application.js +15 -0
- data/spec/dummy/app/jobs/application_job.rb +7 -0
- data/spec/dummy/app/mailers/application_mailer.rb +4 -0
- data/spec/dummy/app/models/application_record.rb +3 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +33 -0
- data/spec/dummy/config/application.rb +29 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/cable.yml +10 -0
- data/spec/dummy/config/credentials/message-bus-us-east-1.yml.enc +1 -0
- data/spec/dummy/config/database.yml +27 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +62 -0
- data/spec/dummy/config/environments/production.rb +112 -0
- data/spec/dummy/config/environments/test.rb +49 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
- data/spec/dummy/config/initializers/assets.rb +12 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/content_security_policy.rb +28 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/message_bus_consumer.rb +5 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +33 -0
- data/spec/dummy/config/puma.rb +36 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config/spring.rb +6 -0
- data/spec/dummy/config/storage.yml +34 -0
- data/spec/dummy/config.ru +5 -0
- data/spec/dummy/db/schema.rb +21 -0
- data/spec/dummy/log/development.log +83 -0
- data/spec/dummy/log/test.log +2124 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/dummy/public/apple-touch-icon.png +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/tmp/development_secret.txt +1 -0
- data/spec/integration/nulogy_message_bus_consumer/auditor_spec.rb +59 -0
- data/spec/integration/nulogy_message_bus_consumer/kafka_utils_spec.rb +41 -0
- data/spec/integration/nulogy_message_bus_consumer/steps/commit_on_success_spec.rb +131 -0
- data/spec/integration/nulogy_message_bus_consumer/steps/connect_to_message_bus_spec.rb +53 -0
- data/spec/integration/nulogy_message_bus_consumer/tasks/prune_processed_messages_spec.rb +32 -0
- data/spec/integration/nulogy_message_bus_consumer/tasks/supervise_consumer_lag_spec.rb +33 -0
- data/spec/integration/test_topic_spec.rb +39 -0
- data/spec/spec_helper.rb +50 -0
- data/spec/support/kafka.rb +74 -0
- data/spec/support/middleware_tap.rb +12 -0
- data/spec/support/skip.rb +9 -0
- data/spec/support/test_topic.rb +48 -0
- data/spec/unit/nulogy_message_bus_consumer/config_spec.rb +20 -0
- data/spec/unit/nulogy_message_bus_consumer/lag_tracker.rb +35 -0
- data/spec/unit/nulogy_message_bus_consumer/message_spec.rb +84 -0
- data/spec/unit/nulogy_message_bus_consumer/pipeline_spec.rb +49 -0
- data/spec/unit/nulogy_message_bus_consumer/steps/commit_on_success_spec.rb +58 -0
- data/spec/unit/nulogy_message_bus_consumer/steps/deduplicate_messages_spec.rb +56 -0
- data/spec/unit/nulogy_message_bus_consumer/steps/log_messages_spec.rb +70 -0
- data/spec/unit/nulogy_message_bus_consumer/steps/stream_messages_spec.rb +35 -0
- data/spec/unit/nulogy_message_bus_consumer/tasks/calculator_spec.rb +67 -0
- data/spec/unit/nulogy_message_bus_consumer_spec.rb +30 -0
- metadata +165 -30
- data/config/credentials/message-bus-us-east-1.key +0 -1
- data/lib/nulogy_message_bus_consumer/steps/log_consumer_lag.rb +0 -51
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc67ef0e9ad8a12ee285d6bf7898e262d5af7140ddfc50ce1265086f313dab5d
|
4
|
+
data.tar.gz: 968ef8091b7ba117dad2a90f265a9e89844f1604404449d703868f343f41c35d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7def0d572755c4b66d8f3ca603fadc64dd3aa159a3a6e868ec38efa589d08d50bdd9ba187cb89ef8773fbe02a5616dea705b6366b4c7371bec3e3979788fca39
|
7
|
+
data.tar.gz: 89b43ff862329c5710f5441a765e20924d0411a0f012905d2e697fb6029b3f9df716b9704d290e37e357bbd4f196d30dd86774ae25bcc017cb6087ad1a2e7845
|
data/Rakefile
CHANGED
@@ -23,9 +23,3 @@ require "rspec/core/rake_task"
|
|
23
23
|
RSpec::Core::RakeTask.new(:spec)
|
24
24
|
require "standard/rake"
|
25
25
|
task default: %i[spec standard]
|
26
|
-
|
27
|
-
require "rake/release"
|
28
|
-
|
29
|
-
Rake::Release::Task.load_all do |spec|
|
30
|
-
spec.version_tag = "nulogy_message_bus_consumer-v#{spec.version}"
|
31
|
-
end
|
@@ -5,12 +5,20 @@ module NulogyMessageBusConsumer
|
|
5
5
|
:consumer_group_id,
|
6
6
|
:lag_check_interval_seconds,
|
7
7
|
:lag_checks,
|
8
|
+
:lag_timeout_milliseconds,
|
9
|
+
:log_lag_interval_seconds,
|
10
|
+
:prune_interval_seconds,
|
11
|
+
:prune_max_age,
|
8
12
|
:topic_name
|
9
13
|
|
10
14
|
def initialize(options = {})
|
11
15
|
defaults = {
|
12
16
|
lag_check_interval_seconds: 20,
|
13
|
-
lag_checks: 6
|
17
|
+
lag_checks: 6,
|
18
|
+
lag_timeout_milliseconds: 200,
|
19
|
+
log_lag_interval_seconds: 1.minute.to_i,
|
20
|
+
prune_interval_seconds: 1.hour.to_i,
|
21
|
+
prune_max_age: 8.days
|
14
22
|
}
|
15
23
|
|
16
24
|
update(defaults.merge(options))
|
@@ -1,17 +1,16 @@
|
|
1
1
|
module NulogyMessageBusConsumer
|
2
2
|
class Message
|
3
|
-
attr_reader :
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
:type
|
3
|
+
attr_reader :event_data
|
4
|
+
attr_reader :event_data_unparsed
|
5
|
+
attr_reader :id
|
6
|
+
attr_reader :key
|
7
|
+
attr_reader :offset
|
8
|
+
attr_reader :partition
|
9
|
+
attr_reader :subscription_id
|
10
|
+
attr_reader :company_uuid
|
11
|
+
attr_reader :timestamp
|
12
|
+
attr_reader :topic
|
13
|
+
attr_reader :created_at
|
15
14
|
|
16
15
|
def initialize(attrs = {})
|
17
16
|
attrs.each { |key, value| instance_variable_set("@#{key}", value) }
|
@@ -37,7 +36,6 @@ module NulogyMessageBusConsumer
|
|
37
36
|
company_uuid: envelope_data[:company_uuid] || envelope_data[:tenant_id],
|
38
37
|
timestamp: kafka_message.timestamp,
|
39
38
|
topic: kafka_message.topic,
|
40
|
-
type: envelope_data[:type],
|
41
39
|
created_at: envelope_data[:created_at]
|
42
40
|
)
|
43
41
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module NulogyMessageBusConsumer
|
2
|
+
module Steps
|
3
|
+
# A generic class to run a "task" on a timer (in a separate thread!)
|
4
|
+
# This class runs the code, the Task does the work
|
5
|
+
#
|
6
|
+
# A Task must implement the methods called in this class:
|
7
|
+
# - #extract_args(kwargs)
|
8
|
+
# Called with the keyword arguments (kwargs) that is passed to this step.
|
9
|
+
# This is a chance to pull out references to pipeline variables (e.g. kafka_consumer)
|
10
|
+
# - #call
|
11
|
+
# The work the Task should perform
|
12
|
+
# - #interval
|
13
|
+
# The time, in seconds, between invocations of #call
|
14
|
+
class TimedTask
|
15
|
+
def initialize(task)
|
16
|
+
@task = task
|
17
|
+
end
|
18
|
+
|
19
|
+
def call(**kwargs)
|
20
|
+
@task.extract_args(**kwargs)
|
21
|
+
|
22
|
+
# Ensure that the process is terminated if there is a problem getting the consumption lag.
|
23
|
+
# This also ensures that the process will terminate on-boot if it cannot connect to Kafka,
|
24
|
+
# allowing the container to be terminated by ECS.
|
25
|
+
Thread.abort_on_exception = true
|
26
|
+
Thread.new { run }
|
27
|
+
|
28
|
+
yield
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def run
|
34
|
+
loop do
|
35
|
+
@task.call
|
36
|
+
|
37
|
+
sleep @task.interval
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module NulogyMessageBusConsumer
|
2
|
+
module Tasks
|
3
|
+
class LogConsumerLag
|
4
|
+
attr_reader :interval
|
5
|
+
|
6
|
+
def initialize(logger, interval_seconds, lag_timeout)
|
7
|
+
@logger = logger
|
8
|
+
@interval = interval_seconds
|
9
|
+
@lag_timeout = lag_timeout
|
10
|
+
end
|
11
|
+
|
12
|
+
def extract_args(kafka_consumer:, **_)
|
13
|
+
@kafka_consumer = kafka_consumer
|
14
|
+
end
|
15
|
+
|
16
|
+
def call
|
17
|
+
# Delayed start. If we attempt to read consumer#committed immediately, it may fail.
|
18
|
+
# We suspect this is because the consumer#committed is called before the consumer
|
19
|
+
# has finished connecting. There appears to be a race condition.
|
20
|
+
KafkaUtils.wait_for_assignment(@kafka_consumer)
|
21
|
+
|
22
|
+
# Note: consumer#committed has a timeout of 1200ms. To respect our lag_timeout, use the largest.
|
23
|
+
committed_timeout = [1200, @lag_timeout].max
|
24
|
+
# The first parameter is a TopicPartitionList. When nil, it uses all the assigned ones.
|
25
|
+
committed_offsets = @kafka_consumer.committed(nil, committed_timeout)
|
26
|
+
|
27
|
+
lag_per_topic = @kafka_consumer.lag(committed_offsets, @lag_timeout)
|
28
|
+
|
29
|
+
@logger.info(JSON.dump({
|
30
|
+
event: "consumer_lag",
|
31
|
+
topics: Calculator.add_max_lag(lag_per_topic)
|
32
|
+
}))
|
33
|
+
$stdout.flush
|
34
|
+
end
|
35
|
+
|
36
|
+
module Calculator
|
37
|
+
def self.add_max_lag(lag_by_topic)
|
38
|
+
lag_by_topic.each_value do |lag_by_partition|
|
39
|
+
lag_by_partition[:_max] = lag_by_partition.values.max || 0
|
40
|
+
end
|
41
|
+
|
42
|
+
lag_by_topic[:_max] = lag_by_topic
|
43
|
+
.map { |_topic, lag_by_partition| lag_by_partition[:_max] }
|
44
|
+
.max || 0
|
45
|
+
|
46
|
+
lag_by_topic
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module NulogyMessageBusConsumer
|
2
|
+
module Tasks
|
3
|
+
# Deletes any ProcessedMessage rows that are older than max_age
|
4
|
+
#
|
5
|
+
# interval_seconds: how many seconds between invocations
|
6
|
+
# max_age: ActiveSupport::Duration of how old ProcessedMessage are
|
7
|
+
# removed. This calls `#ago` on it.
|
8
|
+
# For example, setting this to `1.week` will delete records more than
|
9
|
+
# `1.week.ago` on each invocation.
|
10
|
+
class PruneProcessedMessages
|
11
|
+
attr_reader :interval
|
12
|
+
|
13
|
+
def initialize(logger, interval_seconds, max_age)
|
14
|
+
@logger = logger
|
15
|
+
@interval = interval_seconds
|
16
|
+
@max_age = max_age
|
17
|
+
end
|
18
|
+
|
19
|
+
def extract_args(**_)
|
20
|
+
end
|
21
|
+
|
22
|
+
def call
|
23
|
+
deleted = prune_stale
|
24
|
+
|
25
|
+
@logger.info("Pruned #{deleted} processed messages")
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def prune_stale
|
31
|
+
ProcessedMessage
|
32
|
+
.where(ProcessedMessage.arel_table[:created_at].lt(@max_age.ago))
|
33
|
+
.delete_all
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module NulogyMessageBusConsumer
|
2
|
-
module
|
2
|
+
module Tasks
|
3
3
|
# Supervises the consumer's lag.
|
4
4
|
#
|
5
5
|
# If a partition's lag is non-zero and does not change for an extended period
|
@@ -19,47 +19,36 @@ module NulogyMessageBusConsumer
|
|
19
19
|
#
|
20
20
|
# Killing the main thread causes ECS to restart the task.
|
21
21
|
class SuperviseConsumerLag
|
22
|
+
attr_reader :interval
|
23
|
+
|
22
24
|
def initialize(logger, tracker: NulogyMessageBusConsumer::LagTracker.new(failing_checks: 6), killable: nil, check_interval_seconds: 20)
|
23
25
|
@logger = logger
|
24
26
|
@tracker = tracker
|
25
27
|
@killable = killable
|
26
|
-
@
|
28
|
+
@interval = check_interval_seconds
|
27
29
|
end
|
28
30
|
|
29
|
-
def
|
31
|
+
def extract_args(kafka_consumer:, **_)
|
30
32
|
@consumer = kafka_consumer
|
31
33
|
@killable ||= Thread.current
|
32
|
-
|
33
|
-
run
|
34
|
-
|
35
|
-
yield
|
36
34
|
end
|
37
35
|
|
38
|
-
|
39
|
-
|
40
|
-
def run
|
41
|
-
Thread.abort_on_exception = true
|
36
|
+
def call
|
37
|
+
NulogyMessageBusConsumer::KafkaUtils.wait_for_assignment(@consumer)
|
42
38
|
|
43
|
-
|
44
|
-
|
39
|
+
@tracker.update(@consumer.lag(@consumer.committed))
|
40
|
+
if @tracker.failing?
|
41
|
+
log_failed_partitions
|
45
42
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
if @tracker.failing?
|
50
|
-
log_failed_partitions
|
51
|
-
|
52
|
-
@killable.kill
|
53
|
-
Thread.current.exit
|
54
|
-
end
|
55
|
-
|
56
|
-
sleep @check_interval_seconds
|
57
|
-
end
|
43
|
+
@killable.kill
|
44
|
+
Thread.current.exit
|
58
45
|
end
|
59
46
|
end
|
60
47
|
|
48
|
+
private
|
49
|
+
|
61
50
|
def log_failed_partitions
|
62
|
-
seconds = @
|
51
|
+
seconds = @interval * @tracker.failing_checks
|
63
52
|
failed = @tracker
|
64
53
|
.failed
|
65
54
|
.map { |topic, partitions| "#{topic}: #{partitions.join(",")}" }
|
@@ -16,12 +16,14 @@ require "nulogy_message_bus_consumer/processed_message"
|
|
16
16
|
require "nulogy_message_bus_consumer/steps/commit_on_success"
|
17
17
|
require "nulogy_message_bus_consumer/steps/connect_to_message_bus"
|
18
18
|
require "nulogy_message_bus_consumer/steps/deduplicate_messages"
|
19
|
-
require "nulogy_message_bus_consumer/steps/log_consumer_lag"
|
20
19
|
require "nulogy_message_bus_consumer/steps/log_messages"
|
21
20
|
require "nulogy_message_bus_consumer/steps/seek_beginning_of_topic"
|
22
21
|
require "nulogy_message_bus_consumer/steps/stream_messages"
|
23
22
|
require "nulogy_message_bus_consumer/steps/stream_messages_until_none_are_left"
|
24
|
-
require "nulogy_message_bus_consumer/steps/
|
23
|
+
require "nulogy_message_bus_consumer/steps/timed_task"
|
24
|
+
require "nulogy_message_bus_consumer/tasks/log_consumer_lag"
|
25
|
+
require "nulogy_message_bus_consumer/tasks/prune_processed_messages"
|
26
|
+
require "nulogy_message_bus_consumer/tasks/supervise_consumer_lag"
|
25
27
|
|
26
28
|
module NulogyMessageBusConsumer
|
27
29
|
module_function
|
@@ -49,11 +51,18 @@ module NulogyMessageBusConsumer
|
|
49
51
|
# Note: that since they are before `StreamMessages`, they will only
|
50
52
|
# be called once, without any messages.
|
51
53
|
Steps::ConnectToMessageBus.new(config, logger),
|
52
|
-
Steps::
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
Steps::TimedTask.new(
|
55
|
+
Tasks::LogConsumerLag.new(logger, config.log_lag_interval_seconds, config.lag_timeout_milliseconds)
|
56
|
+
),
|
57
|
+
Steps::TimedTask.new(
|
58
|
+
Tasks::PruneProcessedMessages.new(logger, config.prune_interval_seconds, config.prune_max_age)
|
59
|
+
),
|
60
|
+
Steps::TimedTask.new(
|
61
|
+
Tasks::SuperviseConsumerLag.new(
|
62
|
+
logger,
|
63
|
+
check_interval_seconds: config.lag_check_interval_seconds,
|
64
|
+
tracker: LagTracker.new(failing_checks: config.lag_checks)
|
65
|
+
)
|
57
66
|
),
|
58
67
|
Steps::StreamMessages.new(logger),
|
59
68
|
# Message processing steps start here.
|
data/spec/dummy/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
10
|
+
* files in this directory. Styles in this file should be added after the last require_* statement.
|
11
|
+
* It is generally better to create a new file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,15 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file. JavaScript code in this file should be added after the last require_* statement.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require rails-ujs
|
14
|
+
//= require activestorage
|
15
|
+
//= require_tree .
|
@@ -0,0 +1,7 @@
|
|
1
|
+
class ApplicationJob < ActiveJob::Base
|
2
|
+
# Automatically retry jobs that encountered a deadlock
|
3
|
+
# retry_on ActiveRecord::Deadlocked
|
4
|
+
|
5
|
+
# Most jobs are safe to ignore if the underlying records are no longer available
|
6
|
+
# discard_on ActiveJob::DeserializationError
|
7
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= yield %>
|
data/spec/dummy/bin/rake
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "fileutils"
|
3
|
+
|
4
|
+
# path to your application root.
|
5
|
+
APP_ROOT = File.expand_path("..", __dir__)
|
6
|
+
|
7
|
+
def system!(*args)
|
8
|
+
system(*args) || abort("\n== Command #{args} failed ==")
|
9
|
+
end
|
10
|
+
|
11
|
+
FileUtils.chdir APP_ROOT do
|
12
|
+
# This script is a way to setup or update your development environment automatically.
|
13
|
+
# This script is idempotent, so that you can run it at anytime and get an expectable outcome.
|
14
|
+
# Add necessary setup steps to this file.
|
15
|
+
|
16
|
+
puts "== Installing dependencies =="
|
17
|
+
system! "gem install bundler --conservative"
|
18
|
+
system("bundle check") || system!("bundle install")
|
19
|
+
|
20
|
+
# puts "\n== Copying sample files =="
|
21
|
+
# unless File.exist?('config/database.yml')
|
22
|
+
# FileUtils.cp 'config/database.yml.sample', 'config/database.yml'
|
23
|
+
# end
|
24
|
+
|
25
|
+
puts "\n== Preparing database =="
|
26
|
+
system! "bin/rails db:prepare"
|
27
|
+
|
28
|
+
puts "\n== Removing old logs and tempfiles =="
|
29
|
+
system! "bin/rails log:clear tmp:clear"
|
30
|
+
|
31
|
+
puts "\n== Restarting application server =="
|
32
|
+
system! "bin/rails restart"
|
33
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative "boot"
|
2
|
+
|
3
|
+
require "rails"
|
4
|
+
# Pick the frameworks you want:
|
5
|
+
require "active_model/railtie"
|
6
|
+
require "active_job/railtie"
|
7
|
+
require "active_record/railtie"
|
8
|
+
require "active_storage/engine"
|
9
|
+
require "action_controller/railtie"
|
10
|
+
require "action_mailer/railtie"
|
11
|
+
require "action_view/railtie"
|
12
|
+
require "action_cable/engine"
|
13
|
+
require "sprockets/railtie"
|
14
|
+
# require "rails/test_unit/railtie"
|
15
|
+
|
16
|
+
Bundler.require(*Rails.groups)
|
17
|
+
require "nulogy_message_bus_consumer"
|
18
|
+
|
19
|
+
module Dummy
|
20
|
+
class Application < Rails::Application
|
21
|
+
# Initialize configuration defaults for originally generated Rails version.
|
22
|
+
config.load_defaults 6.0
|
23
|
+
|
24
|
+
# Settings in config/environments/* take precedence over those specified here.
|
25
|
+
# Application configuration can go into files in config/initializers
|
26
|
+
# -- all .rb files in that directory are automatically loaded after loading
|
27
|
+
# the framework and any gems in your application.
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
../../../../config/credentials/message-bus-us-east-1.yml.enc
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Copy this file to 'database.yml' and modify the copy as needed.
|
2
|
+
|
3
|
+
defaults: &defaults
|
4
|
+
adapter: postgresql
|
5
|
+
username: nulogy
|
6
|
+
password: <%= ENV['DATABASE_PASS'] || "Nulogy4Ever" %>
|
7
|
+
host: <%= ENV['DATABASE_HOST'] || "localhost" %>
|
8
|
+
port: 5437
|
9
|
+
min_messages: warning
|
10
|
+
schema_search_path: "\"$user\", public, extensions"
|
11
|
+
|
12
|
+
development: &development
|
13
|
+
<<: *defaults
|
14
|
+
database: <%= ENV['DEVELOPMENT_DATABASE'] || "message_bus_consumer_development" %>
|
15
|
+
|
16
|
+
development_slave:
|
17
|
+
<<: *development
|
18
|
+
|
19
|
+
# Warning: The database defined as 'test' will be erased and
|
20
|
+
# re-generated from your development database when you run 'rake'.
|
21
|
+
# Do not set this db to the same as development or production.
|
22
|
+
test: &test
|
23
|
+
<<: *defaults
|
24
|
+
database: <%= ENV['TEST_DATABASE'] || "message_bus_consumer_test" %>
|
25
|
+
|
26
|
+
test_slave:
|
27
|
+
<<: *test
|
@@ -0,0 +1,62 @@
|
|
1
|
+
Rails.application.configure do
|
2
|
+
# Settings specified here will take precedence over those in config/application.rb.
|
3
|
+
|
4
|
+
# In the development environment your application's code is reloaded on
|
5
|
+
# every request. This slows down response time but is perfect for development
|
6
|
+
# since you don't have to restart the web server when you make code changes.
|
7
|
+
config.cache_classes = false
|
8
|
+
|
9
|
+
# Do not eager load code on boot.
|
10
|
+
config.eager_load = false
|
11
|
+
|
12
|
+
# Show full error reports.
|
13
|
+
config.consider_all_requests_local = true
|
14
|
+
|
15
|
+
# Enable/disable caching. By default caching is disabled.
|
16
|
+
# Run rails dev:cache to toggle caching.
|
17
|
+
if Rails.root.join("tmp/caching-dev.txt").exist?
|
18
|
+
config.action_controller.perform_caching = true
|
19
|
+
config.action_controller.enable_fragment_cache_logging = true
|
20
|
+
|
21
|
+
config.cache_store = :memory_store
|
22
|
+
config.public_file_server.headers = {
|
23
|
+
"Cache-Control" => "public, max-age=#{2.days.to_i}"
|
24
|
+
}
|
25
|
+
else
|
26
|
+
config.action_controller.perform_caching = false
|
27
|
+
|
28
|
+
config.cache_store = :null_store
|
29
|
+
end
|
30
|
+
|
31
|
+
# Store uploaded files on the local file system (see config/storage.yml for options).
|
32
|
+
config.active_storage.service = :local
|
33
|
+
|
34
|
+
# Don't care if the mailer can't send.
|
35
|
+
config.action_mailer.raise_delivery_errors = false
|
36
|
+
|
37
|
+
config.action_mailer.perform_caching = false
|
38
|
+
|
39
|
+
# Print deprecation notices to the Rails logger.
|
40
|
+
config.active_support.deprecation = :log
|
41
|
+
|
42
|
+
# Raise an error on page load if there are pending migrations.
|
43
|
+
config.active_record.migration_error = :page_load
|
44
|
+
|
45
|
+
# Highlight code that triggered database queries in logs.
|
46
|
+
config.active_record.verbose_query_logs = true
|
47
|
+
|
48
|
+
# Debug mode disables concatenation and preprocessing of assets.
|
49
|
+
# This option may cause significant delays in view rendering with a large
|
50
|
+
# number of complex assets.
|
51
|
+
config.assets.debug = true
|
52
|
+
|
53
|
+
# Suppress logger output for asset requests.
|
54
|
+
config.assets.quiet = true
|
55
|
+
|
56
|
+
# Raises error for missing translations.
|
57
|
+
# config.action_view.raise_on_missing_translations = true
|
58
|
+
|
59
|
+
# Use an evented file watcher to asynchronously detect changes in source code,
|
60
|
+
# routes, locales, etc. This feature depends on the listen gem.
|
61
|
+
# config.file_watcher = ActiveSupport::EventedFileUpdateChecker
|
62
|
+
end
|