modulorails 1.4.0.1 → 1.5.0.pre2

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -0
  3. data/Gemfile +3 -0
  4. data/lib/generators/modulorails/bundleraudit/bundleraudit_generator.rb +13 -8
  5. data/lib/generators/modulorails/docker/docker_generator.rb +58 -15
  6. data/lib/generators/modulorails/docker/templates/config/cable.yml.tt +6 -6
  7. data/lib/generators/modulorails/docker/templates/config/database.yml.tt +3 -15
  8. data/lib/generators/modulorails/docker/templates/config/initializers/0_redis.rb +2 -0
  9. data/lib/generators/modulorails/docker/templates/config/puma.rb +41 -0
  10. data/lib/generators/modulorails/docker/templates/docker-compose.yml.tt +14 -7
  11. data/lib/generators/modulorails/docker/templates/{Dockerfile.prod.tt → dockerfiles/modulotech/Dockerfile.prod.tt} +9 -7
  12. data/lib/generators/modulorails/docker/templates/{Dockerfile.tt → dockerfiles/modulotech/Dockerfile.tt} +3 -1
  13. data/lib/generators/modulorails/docker/templates/dockerfiles/rails/Dockerfile.prod.tt +87 -0
  14. data/lib/generators/modulorails/docker/templates/entrypoints/docker-entrypoint.sh.tt +13 -9
  15. data/lib/generators/modulorails/githooks/githooks_generator.rb +57 -0
  16. data/lib/generators/modulorails/githooks/templates/dockeruby.sh +112 -0
  17. data/lib/generators/modulorails/githooks/templates/post-rewrite.sh +5 -0
  18. data/lib/generators/modulorails/githooks/templates/pre-merge-commit.sh +2 -0
  19. data/lib/generators/modulorails/githooks/templates/refresh_generations.sh +25 -0
  20. data/lib/generators/modulorails/gitlabci/gitlabci_generator.rb +5 -19
  21. data/lib/generators/modulorails/gitlabci/templates/.gitlab-ci.yml.tt +15 -3
  22. data/lib/generators/modulorails/gitlabci/templates/config/deploy/production.yaml.tt +15 -0
  23. data/lib/generators/modulorails/gitlabci/templates/config/deploy/review.yaml.tt +15 -0
  24. data/lib/generators/modulorails/gitlabci/templates/config/deploy/staging.yaml.tt +15 -0
  25. data/lib/generators/modulorails/health_check/health_check_generator.rb +29 -0
  26. data/lib/generators/modulorails/{healthcheck → health_check}/templates/.modulorails-health_check +2 -0
  27. data/lib/generators/modulorails/moduloproject/moduloproject_generator.rb +42 -0
  28. data/lib/generators/modulorails/moduloproject/templates/config/environments/production.rb.tt +109 -0
  29. data/lib/generators/modulorails/rubocop/rubocop_generator.rb +1 -0
  30. data/lib/generators/modulorails/self_update/self_update_generator.rb +3 -2
  31. data/lib/generators/modulorails/service/service_generator.rb +2 -2
  32. data/lib/generators/modulorails/service/templates/service.rb.tt +4 -11
  33. data/lib/generators/modulorails/sidekiq/sidekiq_generator.rb +41 -45
  34. data/lib/modulorails/data.rb +10 -6
  35. data/lib/modulorails/generators/base.rb +79 -0
  36. data/lib/modulorails/railtie.rb +6 -0
  37. data/lib/modulorails/services/base_service.rb +22 -12
  38. data/lib/modulorails/services/logs_for_method_service.rb +5 -0
  39. data/lib/modulorails/version.rb +1 -1
  40. data/lib/modulorails.rb +23 -12
  41. data/modulorails.gemspec +9 -10
  42. metadata +37 -54
  43. data/lib/generators/modulorails/docker/templates/docker-compose.prod.yml.tt +0 -49
  44. data/lib/generators/modulorails/healthcheck/health_check_generator.rb +0 -40
  45. /data/lib/generators/modulorails/{healthcheck → health_check}/templates/config/initializers/health_check.rb.tt +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8b498ef768fd2c2f4bafdc603425d8e7125428410d2f74a2632df2fb7787767f
4
- data.tar.gz: 73eb3a056a2407d5ff4140b63377e56019512a388bed98b4aa78853c69d88569
3
+ metadata.gz: 928b92b50a47d10967876fd9fec84d9f1e0da9b9082d642a48cb2ee0eb49be89
4
+ data.tar.gz: 599f3d7b1546dfa9b294e8c09d9f1d429ad9d2b2ce69914c62f53e45cf213776
5
5
  SHA512:
6
- metadata.gz: 4212615e5046474bc07d0f2a8d1393bd44fe8472fc107301cc3fd70437af2b692b4d14bde4ddc290eee6b5cfb7edd4107ce74579cc7b20960887fc463f8b6ed9
7
- data.tar.gz: acd8a6ea0d748f60a8c621219b8a488a8e111158ba6aa0edc83045aab1d81db7a57c608b01c1302c7025e1d1ca61110b835a8ad14f567d035385ea4a8de22a43
6
+ metadata.gz: 3bcc2bc9acd9c84f41dd80c60036adffdcc85eb4c79c549209852d8dd918806e5d488d40df6b222648512e056b4d09f0f94f894a97215472577d222eea1d996e
7
+ data.tar.gz: '09cad76576542012ce824cd16891309d6d6e1b380b808e9839799294d099da9b9f6406a71be92a2d7ac8345044fd11c46bf9b8c28580fbb876b12ff06a8d86d3'
data/CHANGELOG.md CHANGED
@@ -4,6 +4,30 @@ This file is used to list changes made in each version of the gem.
4
4
 
5
5
  # Unreleased
6
6
 
7
+ # 1.5.0
8
+
9
+ - Update templates according to new standards:
10
+ - Optimize layers in Dockerfile.prod.
11
+ - Remove root privileges in Dockerfile.prod.
12
+ - Exec Docker `CMD` in entrypoints.
13
+ - Configure Puma and Redis.
14
+ - Remove docker-compose.prod.
15
+ - Rename docker-compose.yml to compose.yml.
16
+ - Remove version from compose.yml.
17
+ - Auto-stop staging container after 7 days.
18
+ - Use `rails` chart in Gitlab CI templates.
19
+ - Move entrypoints locations to `bin` to be rails-standard.
20
+ - Rewrite Dockerfile.prod for Rails 7.2+ to be more rails-standard.
21
+ - Version Docker generator.
22
+ - Add a generator for project initialization:
23
+ - Add default configuration for production and staging environments.
24
+ - Add default locale configuration to application.rb.
25
+ - Add a generator for Git hooks.
26
+ - Update service template to use keyword arguments and add `attr_reader`s.
27
+ - Add optional `data` argument to `with_transaction`.
28
+ - Deprecate `Modulorails::BaseService#log` and `Modulorails::LogsForMethodService`.
29
+ - Add a common base for all generators.
30
+
7
31
  # 1.4.0.1
8
32
 
9
33
  - Fix auto-update.
data/Gemfile CHANGED
@@ -5,3 +5,6 @@ gemspec
5
5
 
6
6
  gem "rake", "~> 12.0"
7
7
  gem "rspec", "~> 3.0"
8
+
9
+ gem "activerecord", '>= 4.2.0'
10
+ gem "appraisal"
@@ -1,19 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails/generators'
3
+ require 'modulorails/generators/base'
4
4
 
5
- class Modulorails::BundlerauditGenerator < Rails::Generators::Base
5
+ class Modulorails::BundlerauditGenerator < Modulorails::Generators::Base
6
6
 
7
- source_root File.expand_path('templates', __dir__)
8
7
  desc 'This generator creates a configuration for Bundler-Audit'
9
8
 
10
- def create_config_files
11
- gitlab_config_path = Rails.root.join('.gitlab-ci.yml')
9
+ protected
12
10
 
13
- return if File.read(gitlab_config_path).match?(/\s+extends:\s+.bundleraudit\s*$/)
14
-
15
- append_file gitlab_config_path do
11
+ def create_config
12
+ append_file @gitlab_config_path do
16
13
  <<~YAML
14
+
17
15
  # Scan Gemfile.lock for Common Vulnerabilities and Exposures
18
16
  # https://en.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures
19
17
  # https://www.cve.org/
@@ -23,4 +21,11 @@ class Modulorails::BundlerauditGenerator < Rails::Generators::Base
23
21
  end
24
22
  end
25
23
 
24
+ def keep_file_present?
25
+ @gitlab_config_path = Rails.root.join('.gitlab-ci.yml')
26
+
27
+ !@gitlab_config_path.exist? ||
28
+ @gitlab_config_path.read.match?(/\s+extends:\s+.bundleraudit\s*$/)
29
+ end
30
+
26
31
  end
@@ -1,35 +1,78 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails/generators'
3
+ require 'modulorails/generators/base'
4
4
 
5
- class Modulorails::DockerGenerator < Rails::Generators::Base
5
+ class Modulorails::DockerGenerator < Modulorails::Generators::Base
6
6
 
7
- source_root File.expand_path('templates', __dir__)
8
- desc 'This generator creates Dockerfiles for an app'
7
+ VERSION = 2
9
8
 
10
- def create_config_file
9
+ desc 'This generator creates Docker configuration for an app'
10
+
11
+ protected
12
+
13
+ def create_config
11
14
  @data = Modulorails.data
12
15
  @adapter = @data.adapter
13
16
  @webpack_container_needed = @data.webpacker_version.present?
14
17
  @image_name = @data.name.parameterize
15
18
  @environment_name = @data.environment_name
16
19
 
17
- template 'Dockerfile'
18
- template 'Dockerfile.prod'
19
- template 'docker-compose.yml'
20
- template 'docker-compose.prod.yml'
21
- template 'entrypoints/docker-entrypoint.sh'
22
- chmod 'entrypoints/docker-entrypoint.sh', 0755
20
+ create_dockerfile
21
+ create_dockerfile_prod
22
+ create_compose_yml
23
+ create_docker_entrypoint
23
24
  template 'config/database.yml'
24
25
  template 'config/cable.yml'
26
+ template 'config/initializers/0_redis.rb'
27
+ template 'config/puma.rb'
25
28
 
26
29
  # Useless unless project is using Webpacker
27
- if @webpack_container_needed
28
- template 'entrypoints/webpack-entrypoint.sh'
29
- chmod 'entrypoints/webpack-entrypoint.sh', 0755
30
- end
30
+ return unless @webpack_container_needed
31
+
32
+ create_webpack_entrypoint
31
33
  rescue StandardError => e
32
34
  warn("[Modulorails] Error: cannot generate Docker configuration: #{e.message}")
33
35
  end
34
36
 
37
+ private
38
+
39
+ def create_dockerfile
40
+ say('WARNING: The entrypoint was moved. Check that your Dockerfile still works.') if File.exist?('Dockerfile')
41
+ template 'dockerfiles/modulotech/Dockerfile', 'Dockerfile'
42
+ end
43
+
44
+ def create_webpack_entrypoint
45
+ create_new_file('entrypoints/webpack-entrypoint.sh', 'bin/webpack-entrypoint')
46
+ end
47
+
48
+ def create_docker_entrypoint
49
+ create_new_file 'entrypoints/docker-entrypoint.sh', 'bin/docker-entrypoint'
50
+ end
51
+
52
+ def create_compose_yml
53
+ create_new_file 'docker-compose.yml', 'compose.yml', executable: false
54
+ end
55
+
56
+ def create_dockerfile_prod
57
+ if File.exist?('Dockerfile.prod')
58
+ say('WARNING: The entrypoint was moved. Check that your Dockerfile.prod still works.')
59
+ end
60
+
61
+ if Gem::Version.new(@data.rails_version) >= Gem::Version.new('7.2')
62
+ template 'dockerfiles/rails/Dockerfile.prod', 'Dockerfile.prod'
63
+ else
64
+ template 'dockerfiles/modulotech/Dockerfile.prod', 'Dockerfile.prod'
65
+ end
66
+ end
67
+
68
+ def create_new_file(old_file, new_file, executable: true)
69
+ if File.exist?(old_file)
70
+ copy_file old_file, new_file
71
+ remove_file old_file
72
+ else
73
+ template old_file, new_file
74
+ end
75
+ chmod new_file, 0o755 if executable
76
+ end
77
+
35
78
  end
@@ -1,15 +1,15 @@
1
- redis_local: &redis_local
1
+ redis_remote: &redis_remote
2
2
  adapter: redis
3
- url: <%= ENV.fetch('REDIS_URL', 'redis://redis:6379') %>
3
+ url: <%%= defined?(REDIS_URL) ? REDIS_URL : ENV.fetch('REDIS_URL', 'redis://redis:6379') %>
4
4
 
5
5
  development:
6
- <<: *redis_local
6
+ <<: *redis_remote
7
7
 
8
8
  test:
9
- <<: *redis_local
9
+ <<: *redis_remote
10
10
 
11
11
  staging:
12
- <<: *redis_local
12
+ <<: *redis_remote
13
13
 
14
14
  production:
15
- <<: *redis_local
15
+ <<: *redis_remote
@@ -1,26 +1,14 @@
1
- <%- if @adapter =~ /mysql/ -%>
2
1
  development: &default
2
+ <%- if @adapter =~ /mysql/ -%>
3
3
  adapter: mysql2
4
- encoding: utf8mb4
5
- collation: utf8mb4_unicode_ci
6
- database: <%%= ENV.fetch('<%= @environment_name %>_DATABASE_NAME', '<%= @image_name %>') %>
7
- username: <%%= ENV.fetch('<%= @environment_name %>_DATABASE_USERNAME', 'root') %>
8
- password: <%%= ENV.fetch('<%= @environment_name %>_DATABASE_PASSWORD', '') %>
9
- host: <%%= ENV.fetch('<%= @environment_name %>_DATABASE_HOST', 'database') %>
10
- port: <%%= ENV.fetch('<%= @environment_name %>_DATABASE_PORT', 3306) %>
11
4
  <%- else -%>
12
- development: &default
13
5
  adapter: postgresql
14
- database: <%%= ENV.fetch('<%= @environment_name %>_DATABASE_NAME', '<%= @image_name %>') %>
15
- username: <%%= ENV.fetch('<%= @environment_name %>_DATABASE_USERNAME', 'postgres') %>
16
- password: <%%= ENV.fetch('<%= @environment_name %>_DATABASE_PASSWORD', 'postgres') %>
17
- host: <%%= ENV.fetch('<%= @environment_name %>_DATABASE_HOST', 'database') %>
18
- port: <%%= ENV.fetch('<%= @environment_name %>_DATABASE_PORT', 5432) %>
19
6
  <%- end -%>
7
+ url: <%%= ENV['DATABASE_URL'] %>
20
8
 
21
9
  test:
22
10
  <<: *default
23
- database: <%%= ENV.fetch('<%= @environment_name %>_TEST_DATABASE_NAME', '<%= @image_name %>_test') %>
11
+ database: <%%= ENV['DTABASE_TEST_URL'] %>
24
12
 
25
13
  staging:
26
14
  <<: *default
@@ -0,0 +1,2 @@
1
+ REDIS_URL = ENV.fetch('REDIS_URL', 'redis://redis:6379')
2
+ REDIS_CLI = Redis.new(url: REDIS_URL)
@@ -0,0 +1,41 @@
1
+ # This configuration file will be evaluated by Puma. The top-level methods that
2
+ # are invoked here are part of Puma's configuration DSL. For more information
3
+ # about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html.
4
+
5
+ # Puma starts a configurable number of processes (workers) and each process
6
+ # serves each request in a thread from an internal thread pool.
7
+ #
8
+ # The ideal number of threads per worker depends both on how much time the
9
+ # application spends waiting for IO operations and on how much you wish to
10
+ # to prioritize throughput over latency.
11
+ #
12
+ # As a rule of thumb, increasing the number of threads will increase how much
13
+ # traffic a given process can handle (throughput), but due to CRuby's
14
+ # Global VM Lock (GVL) it has diminishing returns and will degrade the
15
+ # response time (latency) of the application.
16
+ #
17
+ # The default is set to 3 threads as it's deemed a decent compromise between
18
+ # throughput and latency for the average Rails application.
19
+ #
20
+ # Any libraries that use a connection pool or another resource pool should
21
+ # be configured to provide at least as many connections as the number of
22
+ # threads. This includes Active Record's `pool` parameter in `database.yml`.
23
+ threads_count = ENV.fetch('RAILS_MAX_THREADS', 3)
24
+ threads threads_count, threads_count
25
+
26
+ # Specifies the worker count.
27
+ if ENV['RAILS_ENV'] == 'production'
28
+ require 'concurrent-ruby'
29
+ worker_count = Integer(ENV.fetch('WEB_CONCURRENCY', 4))
30
+ workers worker_count if worker_count > 1
31
+ end
32
+
33
+ # Specifies the `port` that Puma will listen on to receive requests; default is 3000.
34
+ bind "tcp://0.0.0.0:#{ENV.fetch('PORT', 3000)}"
35
+
36
+ # Allow puma to be restarted by `bin/rails restart` command.
37
+ plugin :tmp_restart
38
+
39
+ # Specify the PID file. Defaults to tmp/pids/server.pid in development.
40
+ # In other environments, only set the PID file if requested.
41
+ pidfile ENV['PIDFILE'] if ENV['PIDFILE']
@@ -1,5 +1,3 @@
1
- version: '3.7'
2
-
3
1
  services:
4
2
  app:
5
3
  image: modulotechgroup/<%= @image_name %>:dev
@@ -16,10 +14,14 @@ services:
16
14
  environment:
17
15
  RAILS_ENV: development
18
16
  URL: http://localhost:3000
19
- <%= @environment_name %>_DATABASE_HOST: database
20
- <%= @environment_name %>_DATABASE_NAME: <%= @image_name %>
17
+ <%- if @adapter =~ /mysql/ -%>
18
+ DATABASE_URL: mysql2://root@database/<%= @image_name %>
19
+ DATABASE_TEST_URL: mysql2://root@database/<%= @image_name %>-test
20
+ <%- else -%>
21
+ DATABASE_URL: postgresql://postgres:postgres@database/<%= @image_name %>
22
+ DATABASE_TEST_URL: postgresql://postgres:postgres@database/<%= @image_name %>-test
23
+ <%- end -%>
21
24
  REDIS_URL: redis://redis:6379/1
22
- entrypoint: ./entrypoints/docker-entrypoint.sh
23
25
  stdin_open: true
24
26
  tty: true
25
27
 
@@ -28,6 +30,8 @@ services:
28
30
  image: mysql/mysql-server:8.0
29
31
  volumes:
30
32
  - db_data:/var/lib/mysql
33
+ ports:
34
+ - '3306:3306'
31
35
  environment:
32
36
  MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
33
37
  MYSQL_DATABASE: <%= @image_name %>
@@ -37,6 +41,8 @@ services:
37
41
  image: postgres:16-alpine
38
42
  volumes:
39
43
  - db_data:/var/lib/postgresql/data
44
+ ports:
45
+ - '5432:5432'
40
46
  environment:
41
47
  POSTGRES_USER: postgres
42
48
  POSTGRES_PASSWORD: postgres
@@ -51,7 +57,8 @@ services:
51
57
  mailcatcher:
52
58
  image: dockage/mailcatcher
53
59
  ports:
54
- - 1080:1080
60
+ - '1080:1080'
61
+ - '1025:1025'
55
62
 
56
63
  <%- if @webpack_container_needed -%>
57
64
  webpack:
@@ -59,7 +66,7 @@ services:
59
66
  build:
60
67
  context: .
61
68
  dockerfile: Dockerfile
62
- entrypoint: ./entrypoints/webpack-entrypoint.sh
69
+ entrypoint: ./bin/webpack-entrypoint
63
70
  volumes:
64
71
  - .:/app
65
72
  ports:
@@ -20,8 +20,8 @@ RUN apk add --update --no-cache \
20
20
  RUN gem install bundler -v <%= @data.bundler_version %>
21
21
 
22
22
  COPY Gemfile Gemfile.lock ./
23
- RUN bundle config set --local deployment 'true'
24
- RUN bundle check || bundle install --jobs=2 \
23
+ RUN bundle config set --local deployment 'true' \
24
+ && bundle check || bundle install --jobs=2 \
25
25
  && rm -rf vendor/bundle/ruby/*/cache/*
26
26
 
27
27
  <%- if @webpack_container_needed -%>
@@ -35,12 +35,12 @@ RUN bundle exec rake assets:precompile
35
35
  # FINAL IMAGE
36
36
  FROM ruby:<%= @data.ruby_version %>-alpine
37
37
 
38
- ENV RAILS_ENV=development
39
- ENV EDITOR=vim
38
+ ENV RAILS_ENV=development \
39
+ EDITOR=vim
40
40
  WORKDIR /app
41
+ RUN adduser -D user
41
42
 
42
43
  RUN apk add --update --no-cache \
43
- curl \
44
44
  git \
45
45
  nodejs \
46
46
  tzdata \
@@ -54,11 +54,13 @@ RUN apk add --update --no-cache \
54
54
  && rm -rf .git/
55
55
  RUN gem install bundler -v <%= @data.bundler_version %>
56
56
 
57
- COPY --from=builder /app .
57
+ COPY --chown=user:user --from=builder /app .
58
58
 
59
59
  RUN bundle config --local path vendor/bundle \
60
60
  && bundle config --local without development:test:assets
61
61
 
62
62
  EXPOSE 3000
63
63
 
64
- ENTRYPOINT ["./entrypoints/docker-entrypoint.sh"]
64
+ ENTRYPOINT ["./bin/docker-entrypoint"]
65
+
66
+ CMD ["./bin/rails", "server"]
@@ -25,4 +25,6 @@ COPY . .
25
25
 
26
26
  EXPOSE 3000
27
27
 
28
- ENTRYPOINT ["./entrypoints/docker-entrypoint.sh"]
28
+ ENTRYPOINT ["./bin/docker-entrypoint"]
29
+
30
+ CMD ["./bin/rails", "server"]
@@ -0,0 +1,87 @@
1
+ # syntax = docker/dockerfile:1
2
+
3
+ # This Dockerfile is designed for production, not development.
4
+ # It is adapted from Rails 7.2 default Dockerfile with Modulotech's twist to fit the use of Alpine.
5
+
6
+ # Make sure RUBY_VERSION matches the Ruby version in .ruby-version
7
+ ARG RUBY_VERSION=<%= @data.ruby_version %>
8
+ FROM docker.io/library/ruby:$RUBY_VERSION-alpine AS base
9
+
10
+ # Rails app lives here
11
+ WORKDIR /rails
12
+
13
+ # Install base packages
14
+ RUN apk add --update --no-cache \
15
+ tzdata \
16
+ shared-mime-info \
17
+ vim \
18
+ jemalloc \
19
+ vips \
20
+ <%- if @adapter =~ /mysql/ -%>
21
+ mysql-client
22
+ <%- else -%>
23
+ postgresql-client
24
+ <%- end -%>
25
+
26
+ # Set production environment
27
+ ENV RAILS_ENV="production" \
28
+ BUNDLE_DEPLOYMENT="1" \
29
+ BUNDLE_PATH="/usr/local/bundle" \
30
+ BUNDLE_WITHOUT="development"
31
+
32
+ # Throw-away build stage to reduce size of final image
33
+ FROM base AS build
34
+
35
+ # Install packages needed to build gems
36
+ RUN apk add --update --no-cache \
37
+ alpine-sdk \
38
+ nodejs \
39
+ tzdata \
40
+ yarn \
41
+ shared-mime-info \
42
+ gcompat \
43
+ <%- if @adapter =~ /mysql/ -%>
44
+ mysql-dev
45
+ <%- else -%>
46
+ postgresql-dev
47
+ <%- end -%>
48
+
49
+ # Install application gems
50
+ RUN gem install bundler -v <%= @data.bundler_version %>
51
+
52
+ COPY Gemfile Gemfile.lock ./
53
+ RUN bundle install && \
54
+ rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \
55
+ bundle exec bootsnap precompile --gemfile
56
+
57
+ # Copy application code
58
+ COPY . .
59
+
60
+ # Precompile bootsnap code for faster boot times
61
+ RUN bundle exec bootsnap precompile app/ lib/
62
+
63
+ # Precompiling assets for production without requiring secret RAILS_MASTER_KEY
64
+ RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile
65
+
66
+
67
+
68
+
69
+ # Final stage for app image
70
+ FROM base
71
+
72
+ # Copy built artifacts: gems, application
73
+ COPY --from=build "${BUNDLE_PATH}" "${BUNDLE_PATH}"
74
+ COPY --from=build /rails /rails
75
+
76
+ # Run and own only the runtime files as a non-root user for security
77
+ RUN addgroup -S -g 1000 rails && \
78
+ adduser rails -u 1000 -G rails -h /home/rails -s /bin/sh -D && \
79
+ chown -R rails:rails db log storage tmp
80
+ USER 1000:1000
81
+
82
+ # Entrypoint prepares the database.
83
+ ENTRYPOINT ["/rails/bin/docker-entrypoint"]
84
+
85
+ # Start the server by default, this can be overwritten at runtime
86
+ EXPOSE 3000
87
+ CMD ["./bin/rails", "server"]
@@ -1,7 +1,12 @@
1
- #!/bin/sh
1
+ #!/bin/sh -e
2
2
 
3
- # Exit immediately if a command exits with a non-zero status
4
- set -e
3
+ # Enable jemalloc for reduced memory usage and latency.
4
+ jemalloc_lib=$(find /usr/lib/ -name "libjemalloc.so.2" 2>/dev/null | head -n 1)
5
+
6
+ if [ -z "${LD_PRELOAD+x}" ] && [ -n "$jemalloc_lib" ]; then
7
+ LD_PRELOAD="$jemalloc_lib"
8
+ export LD_PRELOAD
9
+ fi
5
10
 
6
11
  # No `node_modules` directory means `yarn install` was never launched.
7
12
  # It is mandatory to install yarn dependencies IF there is a `package.json` file.
@@ -10,11 +15,10 @@ then
10
15
  yarn install
11
16
  fi
12
17
 
13
- # Remove pidfile if it exists else the server will not launch
14
- if [ -f tmp/pids/server.pid ]
15
- then
16
- rm tmp/pids/server.pid
18
+ # If running the rails server then create or migrate existing database
19
+ if [ "$1" = "./bin/rails" ] && [ "$2" = "server" ]; then
20
+ ./bin/rails db:prepare
17
21
  fi
18
22
 
19
- # Launch the application listening from all origins on port 3000
20
- exec ./bin/bundle exec rails s -b 0.0.0.0 -p 3000
23
+ # Execute the CMD
24
+ exec "$@"
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'modulorails/generators/base'
4
+
5
+ module Modulorails
6
+
7
+ class GithooksGenerator < Modulorails::Generators::Base
8
+
9
+ protected
10
+
11
+ def create_config
12
+ create_hook_executor
13
+ create_refresh_generations_script
14
+ create_git_hooks
15
+ update_gitattributes
16
+ end
17
+
18
+ private
19
+
20
+ def create_hook_executor
21
+ template 'dockeruby.sh', 'bin/dockeruby'
22
+ chmod 'bin/dockeruby', 0o755
23
+ end
24
+
25
+ def create_refresh_generations_script
26
+ template 'refresh_generations.sh', 'bin/refresh_generations'
27
+ chmod 'bin/refresh_generations', 0o755
28
+ end
29
+
30
+ def create_git_hooks
31
+ %w[post-rewrite pre-merge-commit].each do |hook|
32
+ template "#{hook}.sh", ".git/hooks/#{hook}"
33
+ chmod ".git/hooks/#{hook}", 0o755
34
+ end
35
+ end
36
+
37
+ def update_gitattributes
38
+ content = <<~CONTENT
39
+ # See https://git-scm.com/docs/gitattributes for more about git attribute files.
40
+
41
+ # Mark any vendored files as having been vendored.
42
+ vendor/* linguist-vendored
43
+
44
+ config/credentials/*.yml.enc diff=rails_credentials
45
+ config/credentials.yml.enc diff=rails_credentials
46
+
47
+ Gemfile.lock merge=ours
48
+ app/assets/javascripts/i18n/translations.js merge=ours
49
+ db/schema.rb merge=ours
50
+ CONTENT
51
+
52
+ create_file '.gitattributes', content, force: true
53
+ end
54
+
55
+ end
56
+
57
+ end