kratos 1.0.3 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 61045f764eef6fc5ffdcfc250d496b31695a5437
4
- data.tar.gz: b32ec368b9ea11ad6e59f595d987d834ed5c460a
3
+ metadata.gz: f7b3bdd730f01861415f2ffdf2981945f07fbcb5
4
+ data.tar.gz: 2523567b4804055c1ee62fe55a5a657113837f1e
5
5
  SHA512:
6
- metadata.gz: a32eb2325a7f1f870030355a70810e0b046a556fa8b7b266d162b401cc722ef1be6b041e31ef4521259487d33328c66c61f7abe66977a4db2f3a2c7e05c22a7c
7
- data.tar.gz: 8769fc3162ba927a705b862ddda36a6260cdb2c26b8c955b644fff8daf970a86ef8c6c8792a1b6a416671961016ed0f213e31e160ae29edfa83bed37b6ab95ef
6
+ metadata.gz: 4ecb0629c7eaf9c02e8744e107457c6b5126973b7eeb0fb24d84c42aee6691ade30f165f3c820cbd9392e0f2849bfcc2ca7b0714c0b29ec425edb04cd76e1488
7
+ data.tar.gz: 687a4251bcb6ebdc2ced44836b491b4503ff0b0ae54bf45798535c9f25e38ec000a1efc15598c505ef87b108dead9adf4ed34a1e80cda1c864dd6bd8d0b859fd
data/README.md CHANGED
@@ -15,9 +15,19 @@ Then run:
15
15
 
16
16
  This will create a Rails app in `projectname` using the latest version of Rails.
17
17
 
18
- After run, configure sidekiq panel password in the
19
- `config/initializers/sidekiq.rb` file. The panel is accessible by the URL
20
- `/sidekiq`.
18
+ After run, you must configure:
19
+
20
+ - Change the sidekiq panel password in the `config/initializers/sidekiq.rb`
21
+ file. The panel is accessible by the URL `/sidekiq`.
22
+ - Setup your development environment variables: `NEW_RELIC_LICENSE_KEY`,
23
+ `ROLLBAR_TOKEN`, `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`
24
+ - Setup your production and staging environment variables using dotgpg. You must
25
+ create two files on the root of your project: `env_production.gpg` and
26
+ `env_staging.gpg`. To initialize dotgpg on your project run `dotgpg init`.
27
+ It'll create a `.gpg` folder and add your public key to it. To edit the files,
28
+ use the `dotgpg edit env_<environment>.gpg` command. For more information look
29
+ at the [DotGPG](https://github.com/ConradIrwin/dotgpg).
30
+ - Run `bin/setup` to initialize your database and files.
21
31
 
22
32
  ## License
23
33
 
@@ -152,6 +152,18 @@ class AppBuilder < Rails::AppBuilder
152
152
  copy_file 'i18n-tasks.yml', 'config/i18n-tasks.yml'
153
153
  end
154
154
 
155
+ def configure_newrelic
156
+ template 'newrelic.yml.erb', 'config/newrelic.yml'
157
+ end
158
+
159
+ def configure_rollbar
160
+ template 'rollbar.rb.erb', 'config/initializers/rollbar.rb'
161
+ end
162
+
163
+ def configure_nginx
164
+ copy_file 'nginx.conf.erb', 'config/deploy/nginx.conf.erb'
165
+ end
166
+
155
167
  def configure_smtp
156
168
  copy_file 'smtp.rb', 'config/smtp.rb'
157
169
 
@@ -413,6 +425,11 @@ end
413
425
  force: true
414
426
  end
415
427
 
428
+ def use_mysql_config_template
429
+ template 'mysql_database.yml.erb', 'config/database.yml',
430
+ force: true
431
+ end
432
+
416
433
  def create_database
417
434
  bundle_command 'exec rake db:create db:migrate'
418
435
  end
@@ -428,9 +445,6 @@ end
428
445
 
429
446
  def create_capistrano_config
430
447
  template 'deploy_config.rb.erb', 'config/deploy.rb'
431
- end
432
-
433
- def create_capistrano_config
434
448
  copy_file 'cap_environment.rb', 'config/deploy/production.rb'
435
449
  copy_file 'cap_environment.rb', 'config/deploy/staging.rb'
436
450
  end
@@ -3,7 +3,7 @@ require 'rails/generators/rails/app/app_generator'
3
3
 
4
4
  module Kratos
5
5
  class AppGenerator < Rails::Generators::AppGenerator
6
- class_option :database, type: :string, aliases: '-d', default: 'postgresql',
6
+ class_option :database, type: :string, aliases: '-d', default: 'mysql',
7
7
  desc: "Configure for selected database (options: #{DATABASES.join('/')})"
8
8
 
9
9
  class_option :skip_test_unit, type: :boolean, aliases: '-T', default: true,
@@ -77,6 +77,9 @@ module Kratos
77
77
 
78
78
  def setup_production_environment
79
79
  say 'Setting up the production environment'
80
+ build :configure_newrelic
81
+ build :configure_rollbar
82
+ build :configure_nginx
80
83
  build :configure_smtp
81
84
  build :enable_rack_deflater
82
85
  build :setup_asset_host
@@ -142,6 +145,7 @@ module Kratos
142
145
  say 'Setting up database'
143
146
 
144
147
  build :use_postgres_config_template if 'postgresql' == options[:database]
148
+ build :use_mysql_config_template if 'mysql' == options[:database]
145
149
 
146
150
  build :create_database
147
151
  end
@@ -2,5 +2,5 @@
2
2
  module Kratos
3
3
  RAILS_VERSION = '~> 4.2.0'.freeze
4
4
  RUBY_VERSION = IO.read("#{File.dirname(__FILE__)}/../../.ruby-version").strip
5
- VERSION = '1.0.3'.freeze
5
+ VERSION = '1.1.0'.freeze
6
6
  end
@@ -1,3 +1,7 @@
1
+ require 'dotenv'
2
+
3
+ Dotenv.load
4
+
1
5
  # Load DSL and set up stages
2
6
  require 'capistrano/setup'
3
7
 
@@ -7,6 +11,10 @@ require 'capistrano/rbenv'
7
11
  require 'capistrano/bundler'
8
12
  require 'capistrano/rails/migrations'
9
13
  require 'capistrano/rails/assets'
14
+ require 'capistrano/rails/console'
15
+ require 'capistrano/nginx'
16
+ require 'new_relic/recipes'
17
+ require 'rollbar/capistrano3'
10
18
 
11
19
  # Setup Whenever tasks
12
20
  require 'whenever/capistrano'
@@ -2,6 +2,7 @@ source "https://rubygems.org"
2
2
 
3
3
  ruby "<%= Kratos::RUBY_VERSION %>"
4
4
 
5
+ gem 'rollbar'
5
6
  gem "email_validator"
6
7
  gem "i18n-tasks"
7
8
  gem "autoprefixer-rails"
@@ -9,7 +10,12 @@ gem "bourbon", "~> 4.2.0"
9
10
  gem "flutie"
10
11
  gem "jquery-rails"
11
12
  gem "normalize-rails", "~> 3.0.0"
13
+ <% if options.database == 'postgresql' %>
12
14
  gem "pg"
15
+ <% end %>
16
+ <% if options.database == 'mysql' %>
17
+ gem 'mysql2', '~> 0.3.20'
18
+ <% end %>
13
19
  gem "puma"
14
20
  gem "rails", "<%= Kratos::RAILS_VERSION %>"
15
21
  gem "recipient_interceptor"
@@ -23,12 +29,11 @@ gem "sinatra", require: nil
23
29
  gem "redis-rails"
24
30
  gem "dalli"
25
31
  gem "lograge"
32
+ gem 'newrelic_rpm', '>= 3.9.8'
26
33
  gem "whenever", require: false
27
- gem "premailer-rails"
28
34
  gem "nokogiri", ">= 1.6.7.2"
29
35
  gem "geocoder"
30
36
  gem "aws-sdk"
31
- gem "figaro"
32
37
  gem "httparty"
33
38
 
34
39
  group :development do
@@ -37,12 +42,16 @@ group :development do
37
42
  gem "capistrano", "~> 3.1"
38
43
  gem "capistrano-rails", "~> 1.1"
39
44
  gem "capistrano-rbenv", "~> 2.0"
45
+ gem 'capistrano3-nginx', '~> 2.0'
46
+ gem 'capistrano-rails-console'
40
47
  end
41
48
 
42
49
  group :development, :test do
43
50
  gem "pry-meta"
44
51
  gem "bullet"
45
52
  gem "bundler-audit", require: false
53
+ gem 'dotgpg'
54
+ gem 'dotenv-rails'
46
55
  gem "factory_girl_rails"
47
56
  gem "ffaker"
48
57
  gem "rspec-rails", "~> 3.4.0"
@@ -10,10 +10,6 @@ set -e
10
10
  gem install bundler --conservative
11
11
  bundle check || bundle install
12
12
 
13
- if [ ! -f config/application.yml ]; then
14
- cp .sample.application.yml config/application.yml
15
- fi
16
-
17
13
  # Set up database and add any development seed data
18
14
  bin/rake dev:prime
19
15
 
@@ -1,28 +1,40 @@
1
1
  namespace :deploy do
2
- task :setup_env do
3
- on roles(:web) do
4
- within release_path do
5
- execute(:cp, "~/.#{fetch(:application)}.yml config/application.yml")
6
- execute(:cp, "~/.#{fetch(:application)}.env .env")
7
- execute(:cp, "~/.#{fetch(:application)}.foreman .foreman")
8
- end
9
- end
10
- end
11
- before :updated, :setup_env
12
-
13
2
  task :restart do
14
3
  invoke 'foreman:export'
15
4
  invoke 'foreman:restart'
5
+ invoke 'deploy:setup_nginx'
16
6
  end
17
7
 
18
- desc 'reload the database with seed data'
19
- task :seed do
20
- on primary :db do
21
- within current_path do
22
- with rails_env: fetch(:stage) do
23
- execute(:rake, 'db:seed')
24
- end
25
- end
8
+ task :setup_nginx do
9
+ invoke 'nginx:site:add'
10
+ invoke 'nginx:site:enable'
11
+ invoke 'nginx:reload'
12
+ end
13
+
14
+ task :setup_env do
15
+ env_file = "env_#{fetch(:stage)}.gpg"
16
+
17
+ dotenv_contents = ''
18
+ run_locally do
19
+ fail "You must have a #{env_file} file on your project root " \
20
+ 'to be able to deploy it' unless File.exist?(env_file)
21
+
22
+ dotenv_contents = `bundle exec dotgpg cat #{env_file}`
23
+ end
24
+
25
+ on roles(:app) do
26
+ dotenv = StringIO.new
27
+ dotenv << dotenv_contents
28
+ dotenv.rewind
29
+
30
+ upload! dotenv, File.join(shared_path, '.env')
26
31
  end
27
32
  end
33
+ after :started, :setup_env
34
+
35
+ namespace :check do
36
+ task linked_files: '.env'
37
+ end
28
38
  end
39
+
40
+ remote_file '.env' => 'deploy:setup_env', roles: :app
@@ -8,6 +8,15 @@ set :user, 'deploy'
8
8
  set :rbenv_ruby, File.read('.ruby-version').strip
9
9
  set :rbenv_type, :user
10
10
  set :rbenv_bin_path, '/home/deploy/.rbenv/shims'
11
+ set :rbenv_prefix, -> { "#{fetch(:rbenv_path)}/bin/rbenv exec dotenv" }
12
+
13
+ set :nginx_domains, '<%= app_name.dasherize %>.com.br'
14
+ set :nginx_template, "#{stage_config_path}/nginx.conf.erb"
15
+ set :app_server_port, 3000
16
+
17
+ set :rollbar_token, ENV['ROLLBAR_TOKEN']
18
+ set :rollbar_env, proc { fetch :stage }
19
+ set :rollbar_role, proc { :db }
11
20
 
12
21
  # Always deploy the current branch.
13
22
  set :branch, `git rev-parse --abbrev-ref HEAD`.chomp
@@ -19,15 +28,8 @@ set :linked_dirs, fetch(:linked_dirs, []).push('log',
19
28
  'tmp/pids',
20
29
  'tmp/cache')
21
30
 
31
+ set :linked_files, %w(.env)
32
+
22
33
  set :default_env, path: '/home/deploy/.rbenv/shims:$PATH'
23
34
 
24
- namespace :deploy do
25
- after :restart, :clear_cache do
26
- on roles(:web), in: :groups, limit: 3, wait: 10 do
27
- # Here we can do anything such as:
28
- # within release_path do
29
- # execute :rake, 'cache:clear'
30
- # end
31
- end
32
- end
33
- end
35
+ after 'deploy:updated', 'newrelic:notice_deployment'
@@ -1,3 +1,16 @@
1
1
  WEB_CONCURRENCY=1
2
2
  MAX_THREADS=3
3
3
  PORT=3000
4
+ ASSET_HOST=localhost:3000
5
+ APPLICATION_HOST=localhost:3000
6
+ REDIS_URL=redis://127.0.0.1:6379
7
+ SECRET_TOKEN=development_token
8
+ SECRET_KEY_BASE=development_secret
9
+ EXECJS_RUNTIME=Node
10
+ SMTP_ADDRESS=smtp.example.com
11
+ SMTP_DOMAIN=example.com
12
+ SMTP_PASSWORD=password
13
+ SMTP_USERNAME=username
14
+ AWS_REGION=us-east-1
15
+ AWS_ACCESS_KEY_ID=<put-your-key-here>
16
+ AWS_SECRET_ACCESS_KEY=<put-your-secret-here>
@@ -3,9 +3,6 @@ namespace :foreman do
3
3
  task :export do
4
4
  on roles(:app) do
5
5
  within current_path do
6
- # Add path to .env.
7
- # Needed for rbenv to work properly.
8
- execute(:echo, "\"PATH=#{fetch(:rbenv_bin_path)}:$PATH\" >> .env")
9
6
  # Create the upstart script
10
7
  execute(:sudo, "#{fetch(:rbenv_prefix)} " \
11
8
  'foreman export upstart /etc/init ' \
@@ -1,7 +1,8 @@
1
1
  Rails.application.configure do
2
2
  if Rails.env.production?
3
3
  config.lograge.enabled = true
4
- config.log_tags = [:uuid]
4
+ config.log_tags = [:uuid, :remote_ip]
5
+ config.lograge.formatter = Lograge::Formatters::Json.new
5
6
 
6
7
  config.lograge.custom_options = lambda do |event|
7
8
  params = event.payload[:params].reject do |k|
@@ -0,0 +1,26 @@
1
+ development: &default
2
+ adapter: mysql2
3
+ database: <%= app_name %>_development
4
+ encoding: utf8mb4
5
+ charset: utf8mb4
6
+ collation: utf8mb4_unicode_ci
7
+ host: localhost
8
+ min_messages: warning
9
+ pool: <%%= Integer(ENV.fetch("DB_POOL", 5)) %>
10
+ reaping_frequency: <%%= Integer(ENV.fetch("DB_REAPING_FREQUENCY", 10)) %>
11
+ timeout: 5000
12
+
13
+ test:
14
+ <<: *default
15
+ database: <%= app_name %>_test
16
+
17
+ production: &deploy
18
+ encoding: utf8mb4
19
+ charset: utf8mb4
20
+ collation: utf8mb4_unicode_ci
21
+ min_messages: warning
22
+ pool: <%%= [Integer(ENV.fetch("MAX_THREADS", 5)), Integer(ENV.fetch("DB_POOL", 5))].max %>
23
+ timeout: 5000
24
+ url: <%%= ENV.fetch("DATABASE_URL", "") %>
25
+
26
+ staging: *deploy
@@ -0,0 +1,34 @@
1
+ common: &default_settings
2
+ app_name: "<%= app_name %>"
3
+ audit_log:
4
+ enabled: false
5
+ browser_monitoring:
6
+ auto_instrument: true
7
+ capture_params: false
8
+ developer_mode: false
9
+ error_collector:
10
+ capture_source: true
11
+ enabled: true
12
+ ignore_errors: "ActionController::RoutingError,Sinatra::NotFound"
13
+ license_key: "<%%= ENV["NEW_RELIC_LICENSE_KEY"] %>"
14
+ log_level: info
15
+ monitor_mode: true
16
+ transaction_tracer:
17
+ enabled: true
18
+ record_sql: obfuscated
19
+ stack_trace_threshold: 0.500
20
+ transaction_threshold: apdex_f
21
+ development:
22
+ <<: *default_settings
23
+ monitor_mode: false
24
+ developer_mode: true
25
+ test:
26
+ <<: *default_settings
27
+ monitor_mode: false
28
+ production:
29
+ <<: *default_settings
30
+ monitor_mode: true
31
+ staging:
32
+ <<: *default_settings
33
+ app_name: "<%= app_name %> (Staging)"
34
+ monitor_mode: true
@@ -0,0 +1,86 @@
1
+ <% if fetch(:app_server) && (fetch(:app_server_socket) || fetch(:app_server_port))%>
2
+ # Define App Server Upstream
3
+ upstream <%= fetch(:application) %>-app-server {
4
+ <% if fetch(:app_server_socket) %>
5
+ server unix:<%= fetch(:app_server_socket) %> fail_timeout=0;
6
+ <% elsif fetch(:app_server_port) %>
7
+ server <%= fetch(:app_server_host, '127.0.0.1') %>:<%= fetch(:app_server_port) %> fail_timeout=0;
8
+ <% end %>
9
+ }
10
+ <% end %>
11
+
12
+ # HTTP Server
13
+
14
+ <% if fetch(:nginx_redirected_domains) %>
15
+ server {
16
+ listen 80;
17
+ server_name <%= fetch(:nginx_redirected_domains) %>;
18
+ rewrite ^(.*) http://<%= fetch(:nginx_domains).gsub(/\s.*/,'') %> permanent;
19
+ }
20
+ <% end %>
21
+
22
+ <% if fetch(:nginx_use_ssl) %>
23
+ server {
24
+ listen 80;
25
+ server_name <%= fetch(:nginx_domains) %>;
26
+ rewrite ^(.*) https://$host$1 permanent;
27
+ }
28
+ <% end %>
29
+
30
+ server {
31
+
32
+ <% if fetch(:nginx_use_ssl) %>
33
+ listen 443;
34
+ ssl on;
35
+ ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
36
+ ssl_certificate <%= fetch(:nginx_ssl_certificate_path) %>/<%= fetch(:nginx_ssl_certificate) %>;
37
+ ssl_certificate_key <%= fetch(:nginx_ssl_certificate_key_path) %>/<%= fetch(:nginx_ssl_certificate_key) %>;
38
+ <% else %>
39
+ listen 80;
40
+ <% end %>
41
+
42
+ server_name <%= fetch(:nginx_domains) %>;
43
+ root <%= fetch(:deploy_to) %>/current/<%= fetch(:nginx_static_dir) %>;
44
+
45
+ access_log <%= fetch(:nginx_log_path) %>/nginx-access.log timed_combined;
46
+ error_log <%= fetch(:nginx_log_path) %>/nginx-error.log;
47
+
48
+ error_page 404 /404.html;
49
+ location /404.html { root <%= fetch(:deploy_to) %>/current/<%= fetch(:nginx_static_dir) %>; }
50
+
51
+ error_page 500 /500.html;
52
+ location /500.html { root <%= fetch (:deploy_to) %>/current/<%= fetch(:nginx_static_dir) %>; }
53
+
54
+ client_max_body_size 4G;
55
+ keepalive_timeout 10;
56
+
57
+ <% if fetch(:app_server) && (fetch(:app_server_socket) || fetch(:app_server_port))%>
58
+ location ^~ /assets/ {
59
+ gzip_static on;
60
+ expires max;
61
+ add_header Cache-Control public;
62
+ }
63
+
64
+ try_files $uri/index.html $uri @<%= fetch(:application) %>-app-server;
65
+
66
+ location @<%= fetch(:application) %>-app-server {
67
+ proxy_set_header X-Real-IP $remote_addr;
68
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
69
+ proxy_set_header X-FORWARDED_PROTO http;
70
+ proxy_set_header Host $http_host;
71
+ <% if fetch(:nginx_use_ssl) %>
72
+ proxy_set_header X-Forwarded-Proto https;
73
+ <% end %>
74
+ <% if fetch(:nginx_read_timeout) %>
75
+ proxy_read_timeout <%= fetch(:nginx_read_timeout) %>;
76
+ <% end %>
77
+ proxy_redirect off;
78
+ proxy_pass http://<%= fetch(:application) %>-app-server;
79
+
80
+ proxy_cache default;
81
+ proxy_cache_lock on;
82
+ proxy_cache_use_stale updating;
83
+ add_header X-Cache-Status $upstream_cache_status;
84
+ }
85
+ <% end %>
86
+ }
@@ -0,0 +1,12 @@
1
+ Rollbar.configure do |config|
2
+ if Rails.env.test? || Rails.env.development?
3
+ config.enabled = false
4
+ end
5
+
6
+ config.access_token = ENV['ROLLBAR_TOKEN']
7
+
8
+ config.use_sidekiq
9
+ config.use_sidekiq 'queue' => 'default'
10
+
11
+ config.environment = Rails.env
12
+ end
@@ -2,6 +2,11 @@
2
2
  #
3
3
  # It's helpful, but not entirely necessary to understand cron before proceeding.
4
4
  # http://en.wikipedia.org/wiki/Cron
5
+ #
6
+ job_type :command, 'dotenv :task :output'
7
+ job_type :rake, 'cd :path && dotenv bundle exec rake :task --silent :output'
8
+ job_type :runner, "cd :path && dotenv bin/rails runner -e :environment ':task' :output"
9
+ job_type :script, 'cd :path && dotenv bin/:task :output'
5
10
 
6
11
  # every 1.day, at: '1:00 am' do
7
12
  # rake ...
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kratos
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - jaisonerick
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-24 00:00:00.000000000 Z
11
+ date: 2016-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -88,7 +88,6 @@ files:
88
88
  - templates/dotfiles/.ctags
89
89
  - templates/dotfiles/.env
90
90
  - templates/dotfiles/.gitignore
91
- - templates/dotfiles/.sample.application.yml
92
91
  - templates/errors.rb
93
92
  - templates/factory_girl_rspec.rb
94
93
  - templates/foreman.rake
@@ -98,10 +97,14 @@ files:
98
97
  - templates/json_encoding.rb
99
98
  - templates/kratos_layout.html.erb.erb
100
99
  - templates/lograge.rb
100
+ - templates/mysql_database.yml.erb
101
+ - templates/newrelic.yml.erb
102
+ - templates/nginx.conf.erb
101
103
  - templates/postgresql_database.yml.erb
102
104
  - templates/puma.rb
103
105
  - templates/rails_helper.rb
104
106
  - templates/redis.rb
107
+ - templates/rollbar.rb.erb
105
108
  - templates/routes.rb
106
109
  - templates/rspec_api_documentation_rspec.rb.erb
107
110
  - templates/rubocop.rake
@@ -139,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
142
  version: '0'
140
143
  requirements: []
141
144
  rubyforge_project:
142
- rubygems_version: 2.5.1
145
+ rubygems_version: 2.5.2
143
146
  signing_key:
144
147
  specification_version: 4
145
148
  summary: A rails project generator based on thoughtbot's suspenders.
@@ -1,13 +0,0 @@
1
- ASSET_HOST: localhost:3000
2
- APPLICATION_HOST: localhost:3000
3
- REDIS_URL: redis://127.0.0.1:6379
4
- SECRET_TOKEN: development_token
5
- SECRET_KEY_BASE: development_secret
6
- EXECJS_RUNTIME: Node
7
- SMTP_ADDRESS: smtp.example.com
8
- SMTP_DOMAIN: example.com
9
- SMTP_PASSWORD: password
10
- SMTP_USERNAME: username
11
- AWS_REGION: us-east-1
12
- AWS_ACCESS_KEY_ID: <put-your-key-here>
13
- AWS_SECRET_ACCESS_KEY: <put-your-secret-here>