Skip to content

Commit

Permalink
Feat: web console (#58)
Browse files Browse the repository at this point in the history
* feat: add web console

* feat: add staging env

* fix: user email seed

* fix: move web-console

* fix: rubocop
  • Loading branch information
jacky-le-goldenowl authored Nov 22, 2024
1 parent 8de83f2 commit a831d74
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 2 deletions.
3 changes: 2 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ gem 'stackprof'
gem 'sentry-ruby'
gem 'sentry-rails'

gem 'web-console'

group :development, :test do
gem 'brakeman', require: false
gem 'debug', platforms: %i[mri windows], require: 'debug/prelude'
Expand All @@ -66,7 +68,6 @@ group :development do
gem 'rubocop-rails', '>= 2.22.0', require: false
gem 'ruby-lsp'
gem 'ruby-lsp-rails'
gem 'web-console'
gem 'bullet'
gem 'rails-mermaid_erd'
gem 'i18n-tasks'
Expand Down
37 changes: 37 additions & 0 deletions app/controllers/admin/console_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# This controller help run console commands in the admin app only develop and staging
# rubocop:disable Rails/RenderInline

module Admin
class ConsoleController < BaseController
def index
console
render inline: <<~HTML
<div style="position: fixed; top: 0; left: 0; width: 100%; background-color: #fff; z-index: 1000; border-bottom: 1px solid #ddd; padding: 20px 0;">
<div style="font-family: Arial, sans-serif; text-align: center;">
<h1 style="font-size: 36px; font-weight: bold; margin: 0;">
Web Console
</h1>
<p style="font-size: 16px; color: #FF5722; margin: 10px 0; font-weight: bold;">
Please use this console with caution! It provides direct access to the database.
<br>
Any changes made here will take immediate effect and may be irreversible.
</p>
<a href="/admin" style="font-size: 16px; color: #007BFF; text-decoration: none;">
&larr; Back to Home
</a>
</div>
</div>
<div class="console" style="margin-top: 150px; padding: 15px;">
<!-- The console content goes here -->
</div>
<style>
.console {
height: calc(100% - 180px);
}
</style>
HTML
end
end
end

# rubocop:enable Rails/RenderInline
4 changes: 4 additions & 0 deletions config/application.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,9 @@ class Application < Rails::Application
config.i18n.default_locale = :en
config.i18n.load_path += Rails.root.glob('config/locales/**/*.{rb, yml}')
config.i18n.fallbacks = [I18n.default_locale]

# Enable web console in browser - protected by devise
config.web_console.development_only = false
config.web_console.permissions = '0.0.0.0/0'
end
end
86 changes: 86 additions & 0 deletions config/environments/staging.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# frozen_string_literal: true

require 'active_support/core_ext/integer/time'

Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.

# Code is not reloaded between requests.
config.enable_reloading = false

# Eager load code on boot. This eager loads most of Rails and
# your application in memory, allowing both threaded web servers
# and those relying on copy on write to perform better.
# Rake tasks automatically ignore this option for performance.
config.eager_load = true

# Full error reports are disabled and caching is turned on.
config.consider_all_requests_local = false
config.action_controller.perform_caching = true

# Ensures that a master key has been made available in ENV["RAILS_MASTER_KEY"], config/master.key, or an environment
# key such as config/credentials/production.key. This key is used to decrypt credentials (and other encrypted files).
# config.require_master_key = true

# Disable serving static files from `public/`, relying on NGINX/Apache to do so instead.
# config.public_file_server.enabled = false

# Enable serving of images, stylesheets, and JavaScripts from an asset server.
# config.asset_host = "http://assets.example.com"

# Specifies the header that your server uses for sending files.
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache
# config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX

# Mount Action Cable outside main process or domain.
# config.action_cable.mount_path = nil
# config.action_cable.url = "wss://example.com/cable"
# config.action_cable.allowed_request_origins = [ "http://example.com", /http:\/\/example.*/ ]

# Assume all access to the app is happening through a SSL-terminating reverse proxy.
# Can be used together with config.force_ssl for Strict-Transport-Security and secure cookies.
# config.assume_ssl = true

# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = ENV['RAILS_DISABLE_SSL'].blank?

# Skip http-to-https redirect for the default health check endpoint.
# config.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } }

# Log to STDOUT by default
config.logger = ActiveSupport::Logger.new($stdout)
.tap { |logger| logger.formatter = Logger::Formatter.new }
.then { |logger| ActiveSupport::TaggedLogging.new(logger) }

# Prepend all log lines with the following tags.
config.log_tags = [:request_id]

# "info" includes generic and useful information about system operation, but avoids logging too much
# information to avoid inadvertent exposure of personally identifiable information (PII). If you
# want to log everything, set the level to "debug".
config.log_level = ENV.fetch('RAILS_LOG_LEVEL', 'info')

# Use a different cache store in production.
# config.cache_store = :mem_cache_store

# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation cannot be found).
config.i18n.fallbacks = true

# Don't log any deprecations.
config.active_support.report_deprecations = false

# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false

# Store files locally.
config.active_storage.service = :amazon

# Enable DNS rebinding protection and other `Host` header attacks.
# config.hosts = [
# "example.com", # Allow requests from example.com
# /.*\.example\.com/ # Allow requests from subdomains like `www.example.com`
# ]
# Skip DNS rebinding protection for the default health check endpoint.
# config.host_authorization = { exclude: ->(request) { request.path == "/up" } }
end
3 changes: 3 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@

authenticate :user, lambda { |u| u.has_role?(:super_admin) } do
mount Sidekiq::Web => '/sidekiq'
unless Rails.env.production?
get 'admin/console', to: 'admin/console#index'
end
end

devise_for :users,
Expand Down
2 changes: 1 addition & 1 deletion db/seeds/01_users.seeds.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
puts '===> create users'

puts '---- super admin'
super_admin_email = 'super_admin.gos@rails_boilerplate.com'
super_admin_email = 'super_admin.gos@rails.boilerplate.com'
if User.find_by(email: super_admin_email).blank?
super_admin = User.create!(
email: super_admin_email,
Expand Down

0 comments on commit a831d74

Please sign in to comment.