rockstart 0.1.0

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 (97) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +100 -0
  4. data/Rakefile +19 -0
  5. data/lib/generators/rockstart/USAGE +13 -0
  6. data/lib/generators/rockstart/devise/USAGE +9 -0
  7. data/lib/generators/rockstart/devise/devise_generator.rb +258 -0
  8. data/lib/generators/rockstart/devise/templates/controllers/passwords_controller.rb +56 -0
  9. data/lib/generators/rockstart/devise/templates/controllers/registrations_controller.rb +88 -0
  10. data/lib/generators/rockstart/devise/templates/controllers/sessions_controller.rb +32 -0
  11. data/lib/generators/rockstart/devise/templates/create_user_migration.rb.tt +11 -0
  12. data/lib/generators/rockstart/devise/templates/models/user.rb +42 -0
  13. data/lib/generators/rockstart/devise/templates/spec/factories/users.rb +17 -0
  14. data/lib/generators/rockstart/devise/templates/spec/models/user_spec.rb +64 -0
  15. data/lib/generators/rockstart/devise/templates/spec/requests/users/passwords_spec.rb +202 -0
  16. data/lib/generators/rockstart/devise/templates/spec/requests/users/registrations_spec.rb +445 -0
  17. data/lib/generators/rockstart/devise/templates/spec/requests/users/sessions_spec.rb +171 -0
  18. data/lib/generators/rockstart/devise/templates/spec/support/devise_request_spec_helper.rb +29 -0
  19. data/lib/generators/rockstart/devise/templates/translations.en.yml +4 -0
  20. data/lib/generators/rockstart/docker/USAGE +10 -0
  21. data/lib/generators/rockstart/docker/docker_generator.rb +86 -0
  22. data/lib/generators/rockstart/docker/templates/app/Dockerfile-app +47 -0
  23. data/lib/generators/rockstart/docker/templates/docker-compose.test.yml +29 -0
  24. data/lib/generators/rockstart/docker/templates/docker-compose.yml +47 -0
  25. data/lib/generators/rockstart/docker/templates/dockerignore +16 -0
  26. data/lib/generators/rockstart/docker/templates/dotenv.docker.tt +4 -0
  27. data/lib/generators/rockstart/docker/templates/localhost_domains.ext.tt +7 -0
  28. data/lib/generators/rockstart/docker/templates/setup-localhost.tt +27 -0
  29. data/lib/generators/rockstart/docker/templates/web/Dockerfile-web +15 -0
  30. data/lib/generators/rockstart/docker/templates/web/nginx.conf +62 -0
  31. data/lib/generators/rockstart/frontend_helpers/USAGE +8 -0
  32. data/lib/generators/rockstart/frontend_helpers/frontend_helpers_generator.rb +65 -0
  33. data/lib/generators/rockstart/frontend_helpers/templates/application_urls.rb +26 -0
  34. data/lib/generators/rockstart/frontend_helpers/templates/application_urls_helper.rb +20 -0
  35. data/lib/generators/rockstart/frontend_helpers/templates/titles.en.yml.tt +5 -0
  36. data/lib/generators/rockstart/logging/USAGE +8 -0
  37. data/lib/generators/rockstart/logging/logging_generator.rb +12 -0
  38. data/lib/generators/rockstart/logging/templates/rockstart/lograge_initializer.rb +50 -0
  39. data/lib/generators/rockstart/postgres/USAGE +8 -0
  40. data/lib/generators/rockstart/postgres/postgres_generator.rb +32 -0
  41. data/lib/generators/rockstart/postgres/templates/config/database.yml.tt +18 -0
  42. data/lib/generators/rockstart/postgres/templates/migration.rb.tt +7 -0
  43. data/lib/generators/rockstart/pundit/USAGE +8 -0
  44. data/lib/generators/rockstart/pundit/pundit_generator.rb +32 -0
  45. data/lib/generators/rockstart/pundit/templates/app/controllers/concerns/pundit_error_handling.rb +29 -0
  46. data/lib/generators/rockstart/pundit/templates/app/policies/application_policy.rb +71 -0
  47. data/lib/generators/rockstart/pundit/templates/app/policies/user_policy.rb +47 -0
  48. data/lib/generators/rockstart/pundit/templates/config/locales/pundit.en.yml +6 -0
  49. data/lib/generators/rockstart/pundit/templates/lib/templates/pundit/policy/policy.rb +36 -0
  50. data/lib/generators/rockstart/pundit/templates/lib/templates/rspec/policy/policy_spec.rb +58 -0
  51. data/lib/generators/rockstart/pundit/templates/spec/policies/user_policy_spec.rb +95 -0
  52. data/lib/generators/rockstart/pundit/templates/spec/support/pundit_matchers.rb +7 -0
  53. data/lib/generators/rockstart/quality/USAGE +10 -0
  54. data/lib/generators/rockstart/quality/quality_generator.rb +28 -0
  55. data/lib/generators/rockstart/quality/templates/quality.rake +4 -0
  56. data/lib/generators/rockstart/quality/templates/rubocop.rake +4 -0
  57. data/lib/generators/rockstart/quality/templates/rubocop.yml +45 -0
  58. data/lib/generators/rockstart/rockstart_generator.rb +77 -0
  59. data/lib/generators/rockstart/rspec/USAGE +8 -0
  60. data/lib/generators/rockstart/rspec/rspec_generator.rb +70 -0
  61. data/lib/generators/rockstart/rspec/templates/dotenv.development +1 -0
  62. data/lib/generators/rockstart/rspec/templates/dotenv.test +1 -0
  63. data/lib/generators/rockstart/rspec/templates/rspec_templates/model/model_spec.rb +13 -0
  64. data/lib/generators/rockstart/rspec/templates/support/factory_bot.rb +6 -0
  65. data/lib/generators/rockstart/rspec/templates/support/shoulda_matchers.rb +9 -0
  66. data/lib/generators/rockstart/rspec/templates/support/test_helpers.rb +9 -0
  67. data/lib/generators/rockstart/scaffold_templates/USAGE +8 -0
  68. data/lib/generators/rockstart/scaffold_templates/scaffold_templates_generator.rb +39 -0
  69. data/lib/generators/rockstart/scaffold_templates/templates/api_controller.rb.tt +96 -0
  70. data/lib/generators/rockstart/scaffold_templates/templates/controller.rb.tt +126 -0
  71. data/lib/generators/rockstart/scaffold_templates/templates/rspec/scaffold/api_request_spec.rb +139 -0
  72. data/lib/generators/rockstart/scaffold_templates/templates/rspec/scaffold/request_spec.rb +408 -0
  73. data/lib/generators/rockstart/security/USAGE +13 -0
  74. data/lib/generators/rockstart/security/security_generator.rb +108 -0
  75. data/lib/generators/rockstart/security/templates/brakeman.rake +6 -0
  76. data/lib/generators/rockstart/security/templates/bundler_audit.rake +4 -0
  77. data/lib/generators/rockstart/security/templates/cache_support.rb +18 -0
  78. data/lib/generators/rockstart/security/templates/content_security_policy_initializer.rb.tt +56 -0
  79. data/lib/generators/rockstart/security/templates/content_security_spec.rb.tt +83 -0
  80. data/lib/generators/rockstart/security/templates/csp_violations_controller.rb +39 -0
  81. data/lib/generators/rockstart/security/templates/rack_attack.rb +98 -0
  82. data/lib/generators/rockstart/security/templates/security.rake +9 -0
  83. data/lib/generators/rockstart/security/templates/session_store_initializer.rb.tt +7 -0
  84. data/lib/generators/rockstart/smtp_mailer/USAGE +8 -0
  85. data/lib/generators/rockstart/smtp_mailer/smtp_mailer_generator.rb +30 -0
  86. data/lib/generators/rockstart/smtp_mailer/templates/config/initializers/action_mailer.rb +10 -0
  87. data/lib/generators/rockstart/tailwindcss/USAGE +8 -0
  88. data/lib/generators/rockstart/tailwindcss/tailwindcss_generator.rb +30 -0
  89. data/lib/generators/rockstart/tailwindcss/templates/application.css +3 -0
  90. data/lib/generators/rockstart/tailwindcss/templates/postcss.config.js +32 -0
  91. data/lib/rockstart/base_generator.rb +32 -0
  92. data/lib/rockstart/env.rb +16 -0
  93. data/lib/rockstart/railtie.rb +6 -0
  94. data/lib/rockstart/version.rb +5 -0
  95. data/lib/rockstart.rb +9 -0
  96. data/lib/tasks/rockstart_tasks.rake +5 -0
  97. metadata +187 -0
@@ -0,0 +1,171 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.describe "Users::Passwords", type: :request do
6
+ describe "GET /users/sign_in" do
7
+ context "as a guest" do
8
+ it "renders a successful response" do
9
+ get new_user_session_path
10
+ expect(response).to be_successful
11
+ end
12
+ end
13
+
14
+ context "as an authenticated user" do
15
+ let(:authenticated_user) { create(:user) }
16
+
17
+ before do
18
+ sign_in authenticated_user
19
+ end
20
+
21
+ it "redirects back to the user dashboard" do
22
+ get new_user_session_path
23
+ expect(response).to redirect_to(url_for_user_dashboard)
24
+ end
25
+ end
26
+
27
+ context "with a soft deleted user" do
28
+ let(:soft_deleted_user) { create(:user, :soft_deleted) }
29
+
30
+ before do
31
+ sign_in soft_deleted_user
32
+ end
33
+
34
+ it "redirects back to the landing page" do
35
+ get new_user_session_path
36
+ expect(response).to redirect_to(url_for_authentication)
37
+
38
+ follow_redirect!
39
+ expect(response.body).to have_selector(".alert-alert", text: t("devise.failure.deleted_account"))
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "POST /users/sign_in", :cache_testing do
45
+ context "with known user credentials" do
46
+ let(:valid_password) { Faker::Internet.password }
47
+ let(:known_user) { create(:user, password: valid_password) }
48
+
49
+ let(:valid_sign_in_params) do
50
+ {
51
+ user: {
52
+ email: known_user.email,
53
+ password: valid_password
54
+ }
55
+ }
56
+ end
57
+
58
+ it "redirects to the dashboard" do
59
+ post new_user_session_path, params: valid_sign_in_params
60
+ expect(response).to redirect_to(url_for_user_dashboard)
61
+
62
+ follow_redirect!
63
+ expect(controller.current_user).to eq known_user.reload
64
+ expect(response.body).to have_selector(".alert-notice", text: t("devise.sessions.signed_in"))
65
+ end
66
+ end
67
+
68
+ context "with known user credentials" do
69
+ let(:known_user) { create(:user) }
70
+
71
+ let(:invalid_sign_in_params) do
72
+ {
73
+ user: {
74
+ email: known_user.email,
75
+ password: Faker::Internet.password
76
+ }
77
+ }
78
+ end
79
+
80
+ it "renders the sign in form with an error" do
81
+ post new_user_session_path, params: invalid_sign_in_params
82
+ expect(response).to be_successful
83
+
84
+ expect(response.body).to have_selector(".alert-alert", text: t("devise.failure.invalid", authentication_keys: "Email"))
85
+ end
86
+ end
87
+
88
+ context "with unknown user credentials" do
89
+ let(:unknown_sign_in_params) do
90
+ {
91
+ user: {
92
+ email: Faker::Internet.email,
93
+ password: Faker::Internet.password
94
+ }
95
+ }
96
+ end
97
+
98
+ it "renders the sign in form with an error" do
99
+ post new_user_session_path, params: unknown_sign_in_params
100
+ expect(response).to be_successful
101
+
102
+ expect(response.body).to have_selector(".alert-alert", text: t("devise.failure.invalid", authentication_keys: "Email"))
103
+ end
104
+ end
105
+
106
+ it "rate limits requests based off ip address" do
107
+ 5.times do
108
+ post new_user_session_path, params: {
109
+ user: {
110
+ email: Faker::Internet.email,
111
+ password: Faker::Internet.password
112
+ }
113
+ }
114
+ end
115
+
116
+ post new_user_session_path, params: {
117
+ user: {
118
+ email: Faker::Internet.email,
119
+ password: Faker::Internet.password
120
+ }
121
+ }
122
+ expect(response).to have_http_status(:too_many_requests)
123
+ end
124
+
125
+ it "rate limits requests based off email address" do
126
+ valid_email_parameters = {
127
+ user: {
128
+ email: Faker::Internet.email,
129
+ password: Faker::Internet.password
130
+ }
131
+ }
132
+
133
+ 5.times do |n|
134
+ post new_user_session_path, params: valid_email_parameters, headers: {
135
+ "REMOTE_ADDR" => format("120.0.1.%<n>d", n: n)
136
+ }
137
+ end
138
+
139
+ post new_user_session_path, params: valid_email_parameters
140
+ expect(response).to have_http_status(:too_many_requests)
141
+ end
142
+ end
143
+
144
+ describe "DELETE /users/sign_outs" do
145
+ context "with an authenticated user" do
146
+ let(:authenticated_user) { create(:user) }
147
+
148
+ before do
149
+ sign_in(authenticated_user)
150
+ end
151
+
152
+ it "redirects to the login page with a notice" do
153
+ delete destroy_user_session_path
154
+ expect(response).to redirect_to(url_for_authentication)
155
+
156
+ follow_redirect!
157
+ expect(response.body).to have_selector(".alert-notice", text: t("devise.sessions.signed_out"))
158
+ end
159
+ end
160
+
161
+ context "with a guest" do
162
+ it "redirects to the login page with a notice" do
163
+ delete destroy_user_session_path
164
+ expect(response).to redirect_to(url_for_authentication)
165
+
166
+ follow_redirect!
167
+ expect(response.body).to have_selector(".alert-notice", text: t("devise.sessions.signed_out"))
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Helpers for Devise Authentication with request specs
4
+ module DeviseRequestSpecHelper
5
+ include Warden::Test::Helpers
6
+
7
+ def self.included(base)
8
+ base.before(:each) { Warden.test_mode! }
9
+ base.after(:each) { Warden.test_reset! }
10
+ end
11
+
12
+ def sign_in(resource)
13
+ login_as(resource, scope: warden_scope(resource))
14
+ end
15
+
16
+ def sign_out(resource)
17
+ logout(warden_scope(resource))
18
+ end
19
+
20
+ private
21
+
22
+ def warden_scope(resource)
23
+ resource.class.name.underscore.to_sym
24
+ end
25
+ end
26
+
27
+ RSpec.configure do |config|
28
+ config.include DeviseRequestSpecHelper, type: :request
29
+ end
@@ -0,0 +1,4 @@
1
+ en:
2
+ devise:
3
+ failure:
4
+ deleted_account: "You've deleted your account. Please contact support if you want to recover it!"
@@ -0,0 +1,10 @@
1
+ Description:
2
+ Configures a Rails app to run in Docker
3
+
4
+ Example:
5
+ rails generate rockstart:docker
6
+
7
+ This will create:
8
+ A Dockerfile containing the app and test suite
9
+ A docker-compose.yml with all required resources
10
+ A docker-compose.test.yml which will run the full test suite
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Rockstart::DockerGenerator < Rails::Generators::Base
4
+ include Rails::Generators::AppName
5
+
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ desc "This generator configures a Rails Application to work with Docker"
9
+
10
+ class_option :root_image, type: :string,
11
+ desc: "Docker image to build the container from",
12
+ default: "ruby:#{RUBY_VERSION}"
13
+
14
+ class_option :app_home, type: :string,
15
+ desc: "Mount directory used within Docker image",
16
+ default: Rails.application.engine_name
17
+
18
+ class_option :assets, type: :boolean,
19
+ desc: "Include frontend assets support (node|yarn)",
20
+ default: true
21
+
22
+ class_option :devise, type: :boolean,
23
+ desc: "Include Devise support",
24
+ default: true
25
+
26
+ class_option :postgres, type: :boolean,
27
+ desc: "Include Postgres support",
28
+ default: Rockstart::Env.postgres_db?
29
+
30
+ def create_dockerignore
31
+ copy_file "dockerignore", ".dockerignore"
32
+ end
33
+
34
+ def create_dockerfile
35
+ @root_image = options[:root_image]
36
+ @app_home = options[:app_home]
37
+ @postgres = options[:postgres]
38
+ @assets = options[:assets]
39
+ template "app/Dockerfile-app", "Dockerfile"
40
+ end
41
+
42
+ def create_nginx_image
43
+ @root_image = options[:root_image]
44
+ @app_home = options[:app_home]
45
+ template "web/Dockerfile-web", "docker/web/Dockerfile"
46
+ template "web/nginx.conf", "docker/web/nginx.conf"
47
+ end
48
+
49
+ def add_docker_compose
50
+ @app_home = options[:app_home]
51
+ template "docker-compose.yml", "docker-compose.yml"
52
+ template "docker-compose.test.yml", "docker-compose.test.yml"
53
+ end
54
+
55
+ def create_certs_directory
56
+ FileUtils.mkdir_p(Rails.root.join("docker", "certs", "web"))
57
+ append_file ".gitignore", "\n# Docker Configuration\ndocker/certs\n"
58
+ end
59
+
60
+ def create_dotenv
61
+ template "dotenv.docker.tt", ".env.docker"
62
+ end
63
+
64
+ def create_localhost_certificates
65
+ template "localhost_domains.ext.tt", "docker/certs/web/#{app_name}_localhost.ext"
66
+ template "setup-localhost.tt", "bin/setup-localhost"
67
+ File.chmod(0o755, Rails.root.join("bin", "setup-localhost"))
68
+ append_file ".gitignore", "\n# localhost certificate authority\nlocalhostCA.*\n"
69
+ end
70
+
71
+ private
72
+
73
+ def devise?
74
+ options[:devise]
75
+ end
76
+
77
+ def postgres?
78
+ options[:postgres]
79
+ end
80
+
81
+ # Generates an example password
82
+ def example_db_password
83
+ require "base64"
84
+ Base64.urlsafe_encode64(Rails.application.engine_name)
85
+ end
86
+ end
@@ -0,0 +1,47 @@
1
+ FROM <%= @root_image %>
2
+
3
+ # Install dependencies
4
+ RUN apt-get update -qq \
5
+ && apt-get install -y build-essential \
6
+ && apt-get install -y libxml2-dev libxslt1-dev \
7
+ <%- if @postgres -%>
8
+ && apt-get install -y libpq-dev \
9
+ <%- end -%>
10
+ <%- if @assets -%>
11
+ && curl -sL https://deb.nodesource.com/setup_10.x | bash - \
12
+ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
13
+ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
14
+ && apt-get update && apt-get install -y nodejs yarn \
15
+ <%- end -%>
16
+ && apt-get clean
17
+
18
+ ENV RACK_ENV=production \
19
+ <%- if @assets -%>
20
+ NODE_ENV=production \
21
+ <%- end -%>
22
+ RAILS_LOG_TO_STDOUT=true \
23
+ RAILS_ENV=production
24
+
25
+ RUN mkdir /<%= @app_home %>
26
+ WORKDIR /<%= @app_home %>
27
+
28
+ # Install gems
29
+ ADD Gemfile* /<%= @app_home %>/
30
+ RUN gem install bundler:2.1.4 \
31
+ && bundle config set deployment 'true' \
32
+ && bundle config set without 'development' \
33
+ && bundle install
34
+
35
+ # Install application
36
+ ADD . /<%= @app_home %>
37
+
38
+ # Perform post-installation tasks
39
+ RUN bundle exec rake tmp:create \
40
+ <%- if @assets -%>
41
+ && bundle exec rake assets:precompile \
42
+ <%- end -%>
43
+ && bundle exec rake tmp:clear
44
+
45
+ # Start the application server
46
+ EXPOSE 3000
47
+ CMD ["bundle", "exec", "rails", "server", "-p", "3000", "-b", "0.0.0.0"]
@@ -0,0 +1,29 @@
1
+ version: '2.0'
2
+ services:
3
+ sut:
4
+ build: .
5
+ command: bash -c "bundle exec rake db:migrate && bundle exec rake"
6
+ depends_on:
7
+ <%- if postgres? -%>
8
+ - db
9
+ <%- end -%>
10
+ - mailcatcher
11
+ environment:
12
+ - RAILS_ENV=test
13
+ <%- if postgres? -%>
14
+ - TEST_DATABASE_URL=postgres://<%= app_name %>:<%= app_name %>_test@db/<%= app_name %>_test
15
+ <%- end -%>
16
+ - SMTP_SERVER=mailcatcher
17
+ - SMTP_PORT=1025
18
+ env_file:
19
+ - ./.env.test
20
+ <%- if postgres? -%>
21
+ db:
22
+ image: postgres
23
+ environment:
24
+ - POSTGRES_DB=<%= app_name %>_test
25
+ - POSTGRES_USER=<%= app_name %>
26
+ - POSTGRES_PASSWORD=<%= app_name %>_test
27
+ <%- end -%>
28
+ mailcatcher:
29
+ image: sj26/mailcatcher
@@ -0,0 +1,47 @@
1
+ version: '2.0'
2
+ services:
3
+ app:
4
+ build: .
5
+ environment:
6
+ <%- if postgres? -%>
7
+ - DATABASE_URL=postgres://<%= app_name %>:<%= example_db_password %>@db/<%= app_name %>_production
8
+ <%- end -%>
9
+ - SMTP_SERVER=mailcatcher
10
+ - SMTP_PORT=1025
11
+ env_file:
12
+ - ./.env.docker
13
+ <%- if postgres? -%>
14
+ depends_on:
15
+ - db
16
+ <%- end -%>
17
+ volumes:
18
+ - static-assets:/<%= @app_home %>/public
19
+ <%- if postgres? -%>
20
+ db:
21
+ image: postgres
22
+ environment:
23
+ - POSTGRES_DB=<%= app_name %>_production
24
+ - POSTGRES_USER=<%= app_name %>
25
+ - POSTGRES_PASSWORD=<%= example_db_password %>
26
+ volumes:
27
+ - ./tmp/db:/var/lib/postgresql/data
28
+ <%- end -%>
29
+ mailcatcher:
30
+ image: sj26/mailcatcher
31
+ ports:
32
+ - 1080:1080
33
+ web:
34
+ build:
35
+ context: ./docker/web/
36
+ depends_on:
37
+ - app
38
+ ports:
39
+ - 80:80
40
+ - 443:443
41
+ volumes:
42
+ - ./docker/certs/web:/<%= @app_home %>/certs
43
+ - static-assets:/<%= @app_home %>/public
44
+ - web-logs:/<%= @app_home %>/log
45
+ volumes:
46
+ static-assets: {}
47
+ web-logs: {}
@@ -0,0 +1,16 @@
1
+ /.bundle
2
+ /.git
3
+ /.env
4
+ /.env.*
5
+ /docker
6
+ /docker-compose.yml
7
+ /docker-compose.test.yml
8
+ /log
9
+ /node_modules
10
+ /public/assets
11
+ /tmp
12
+ /vendor/bundle
13
+
14
+ # Development Scripts
15
+ bin/setup-localhost
16
+ localhostCA.*
@@ -0,0 +1,4 @@
1
+ APP_HOST=localhost
2
+ <%- if devise? -%>
3
+ DEVISE_MAILER_SENDER=devise-mailer@<%= app_name %>
4
+ <%- end -%>
@@ -0,0 +1,7 @@
1
+ authorityKeyIdentifier=keyid,issuer
2
+ basicConstraints=CA:FALSE
3
+ keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
4
+ subjectAltName = @alt_names
5
+ [alt_names]
6
+ DNS.1 = localhost
7
+ DNS.1 = <%= app_name %>.local
@@ -0,0 +1,27 @@
1
+ #!/bin/bash
2
+
3
+ set -o errexit
4
+ set -o pipefail
5
+ set -o nounset
6
+
7
+ echo "=== Creating Certification Authority for localhost ==="
8
+
9
+ openssl req -x509 -nodes -new -sha256 -days 1024 -newkey rsa:2048 \
10
+ -keyout localhostCA.key \
11
+ -out localhostCA.pem \
12
+ -subj "/C=US/CN=Example-Root-CA"
13
+
14
+ openssl x509 -outform pem -in localhostCA.pem -out localhostCA.crt
15
+
16
+ echo "=== Generating Domain Name Certificate ==="
17
+
18
+ openssl req -new -nodes -newkey rsa:2048 \
19
+ -keyout docker/certs/web/<%= app_name %>.key \
20
+ -out docker/certs/web/<%= app_name %>.csr \
21
+ -subj "/C=US/ST=YourState/L=YourCity/O=Example-Certificates/CN=<%= app_name %>.local"
22
+
23
+ openssl x509 -req -sha256 -days 1024 \
24
+ -in docker/certs/web/<%= app_name %>.csr \
25
+ -CA localhostCA.pem -CAkey localhostCA.key \
26
+ -CAcreateserial -extfile docker/certs/<%= app_name %>_localhost.ext \
27
+ -out docker/certs/web/<%= app_name %>.crt
@@ -0,0 +1,15 @@
1
+ FROM nginx
2
+
3
+ RUN apt-get update -qq && apt-get -y install apache2-utils
4
+
5
+ ENV RAILS_ROOT /<%= @app_home %>
6
+
7
+ WORKDIR /<%= @app_home %>
8
+
9
+ COPY nginx.conf /etc/nginx/conf.d/default.conf
10
+
11
+ EXPOSE 80
12
+ EXPOSE 443
13
+
14
+ # Use the "exec" form of CMD so Nginx shuts down gracefully on SIGTERM (i.e. `docker stop`)
15
+ CMD [ "nginx", "-g", "daemon off;" ]
@@ -0,0 +1,62 @@
1
+ upstream rails_app {
2
+ server app:3000;
3
+ }
4
+
5
+ server {
6
+ listen 80;
7
+ listen 443 ssl;
8
+
9
+ # define your domain
10
+ # server_name www.example.com;
11
+
12
+ ssl_certificate /<%= @app_home %>/certs/<%= app_name %>.crt;
13
+ ssl_certificate_key /<%= @app_home %>/certs/<%= app_name %>.key;
14
+ ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
15
+ ssl_ciphers HIGH:!aNULL:!MD5;
16
+
17
+ # define the public application root
18
+ root /<%= @app_home %>/public;
19
+ index index.html;
20
+
21
+ # define where Nginx should write its logs
22
+ access_log /<%= @app_home %>/log/nginx.access.log;
23
+ error_log /<%= @app_home %>/log/nginx.error.log;
24
+
25
+ # serve static (compiled) assets directly if they exist
26
+ location ~ ^/(assets|packs)/ {
27
+ try_files $uri =404;
28
+
29
+ access_log off; # don't save asset requests to access logs
30
+ gzip_static on; # to serve pre-gzipped version
31
+
32
+ # Cache assets for as long as possible
33
+ expires max;
34
+ add_header Cache-Control public;
35
+
36
+ # Some browsers still send conditional-GET requests if there's a
37
+ # Last-Modified header or an ETag header even if they haven't
38
+ # reached the expiry date sent in the Expires header.
39
+ add_header Last-Modified "";
40
+ add_header ETag "";
41
+ break;
42
+ }
43
+
44
+ # send non-static file requests to the app server
45
+ location / {
46
+ try_files $uri @rails;
47
+ }
48
+
49
+ location @rails {
50
+ proxy_set_header X-Real-IP $remote_addr;
51
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
52
+ proxy_set_header X-Forwarded-Proto $scheme;
53
+ proxy_set_header Host $http_host;
54
+ proxy_redirect off;
55
+ proxy_pass http://rails_app;
56
+ }
57
+
58
+ error_page 404 /404.html;
59
+ error_page 500 502 503 504 /500.html;
60
+ # client_max_body_size 1m;
61
+ # keepalive_timeout 10;
62
+ }
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Installs common helpers for Frontend UIs
3
+
4
+ Example:
5
+ rails generate rockstart:frontend_helpers
6
+
7
+ This will create:
8
+ Install the titles gem
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Rockstart::FrontendHelpersGenerator < Rails::Generators::Base
4
+ source_root File.expand_path("templates", __dir__)
5
+
6
+ class_option :force_url_helpers, type: :boolean,
7
+ desc: "Force creation of blank Application URL Helpers",
8
+ default: false
9
+
10
+ def install_simple_form
11
+ gem "simple_form"
12
+
13
+ Bundler.with_clean_env do
14
+ run "bundle install --quiet"
15
+
16
+ generate "simple_form:install"
17
+ end
18
+ end
19
+
20
+ def install_titles
21
+ gem "title", github: "calebthompson/title"
22
+
23
+ template "titles.en.yml.tt", "config/locales/titles.en.yml"
24
+
25
+ gsub_file "app/views/layouts/application.html.erb", %r{\<title(.+)\</title},
26
+ "<title><%= title %></title"
27
+ end
28
+
29
+ def add_application_urls_concern
30
+ if force_url_helpers? || !File.exist?(Rails.root.join(application_urls_concern_path))
31
+ copy_file "application_urls.rb", application_urls_concern_path
32
+ else
33
+ say "Skipping #{application_urls_concern_path}"
34
+ end
35
+ inject_into_file "app/controllers/application_controller.rb",
36
+ " include ApplicationUrls\n",
37
+ before: /^end$/
38
+ end
39
+
40
+ def add_application_urls_helper
41
+ if force_url_helpers? || !File.exist?(Rails.root.join(application_urls_helper_path))
42
+ copy_file "application_urls_helper.rb", application_urls_helper_path
43
+ else
44
+ say "Skipping #{application_urls_helper_path}"
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def default_title
51
+ Rails.application.class.to_s.split("::").first
52
+ end
53
+
54
+ def force_url_helpers?
55
+ options.fetch(:force_url_helpers)
56
+ end
57
+
58
+ def application_urls_concern_path
59
+ File.join("app", "controllers", "concerns", "application_urls.rb")
60
+ end
61
+
62
+ def application_urls_helper_path
63
+ File.join("spec", "support", "application_urls_helper.rb")
64
+ end
65
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ApplicationUrls generated by rockstart:frontend_helpers
4
+ module ApplicationUrls
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ helper_method :url_for_authentication
9
+ helper_method :url_for_landing_page
10
+ helper_method :url_for_user_dashboard
11
+ end
12
+
13
+ protected
14
+
15
+ def url_for_authentication
16
+ root_url # TODO: Provide url for authentication page
17
+ end
18
+
19
+ def url_for_landing_page
20
+ root_url # TODO: Provide url for landing page
21
+ end
22
+
23
+ def url_for_user_dashboard
24
+ root_url # TODO: Provide url for user dashboard link
25
+ end
26
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ApplicationUrlsHelper generated by rockstart:frontend_helpers
4
+ module ApplicationUrlsHelper
5
+ def url_for_authentication
6
+ root_url # TODO: Provide url for authentication page
7
+ end
8
+
9
+ def url_for_landing_page
10
+ root_url # TODO: Provide url for landing page
11
+ end
12
+
13
+ def url_for_user_dashboard
14
+ root_url # TODO: Provide url for user dashboard link
15
+ end
16
+ end
17
+
18
+ RSpec.configure do |config|
19
+ config.include ApplicationUrlsHelper
20
+ end