Correções para funcionamento do Docker
This commit is contained in:
1
Gemfile
1
Gemfile
@@ -9,6 +9,7 @@ gem "pg", "~> 1.1"
|
|||||||
gem "puma", "~> 6.0"
|
gem "puma", "~> 6.0"
|
||||||
|
|
||||||
# Frontend
|
# Frontend
|
||||||
|
gem "propshaft" # asset pipeline leve
|
||||||
gem "importmap-rails"
|
gem "importmap-rails"
|
||||||
gem "turbo-rails"
|
gem "turbo-rails"
|
||||||
gem "stimulus-rails"
|
gem "stimulus-rails"
|
||||||
|
|||||||
46
README.md
46
README.md
@@ -349,6 +349,52 @@ docker-compose exec app bundle exec whenever --update-crontab
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
## 🩺 Correção (11/06): container caía mostrando ajuda do "rails new"
|
||||||
|
|
||||||
|
**Sintoma:** `docker-compose up` subia e o log mostrava o help do `rails new` em loop.
|
||||||
|
**Causa:** o repositório tinha os arquivos da aplicação (models/controllers/views) mas **não tinha o esqueleto de boot do Rails** — sem `config/application.rb` e `config.ru`, o comando `rails s` não reconhece a pasta como um app Rails e cai no modo "criar app novo".
|
||||||
|
|
||||||
|
**Arquivos adicionados nesta correção:**
|
||||||
|
```
|
||||||
|
config.ru # entrada Rack
|
||||||
|
config/boot.rb, environment.rb # boot do Rails
|
||||||
|
config/application.rb # módulo GadeLogistica + timezone SP + pt-BR
|
||||||
|
config/puma.rb # servidor web
|
||||||
|
config/environments/{development,production,test}.rb
|
||||||
|
config/importmap.rb # pins do Stimulus/Turbo
|
||||||
|
config/initializers/devise.rb # obrigatório para o devise_for das rotas
|
||||||
|
config/locales/pt-BR.yml # formatos de data brasileiros
|
||||||
|
bin/rails, bin/rake # executáveis
|
||||||
|
app/javascript/application.js # bootstrap Turbo + Stimulus
|
||||||
|
app/javascript/controllers/{application,index}.js
|
||||||
|
Gemfile # + gem propshaft (servir o JS via importmap)
|
||||||
|
app/views/layouts/application.html.erb # + javascript_importmap_tags (Stimulus não carregava!)
|
||||||
|
config/routes.rb # devise_for agora aponta para users/sessions (login PIN)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Como subir agora (passo a passo completo)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Criar o .env (você NÃO tem ele ainda — é cópia do exemplo):
|
||||||
|
cp .env.example .env
|
||||||
|
|
||||||
|
# 2. Gerar a SECRET_KEY_BASE e colar no .env:
|
||||||
|
openssl rand -hex 64
|
||||||
|
nano .env # cole em SECRET_KEY_BASE= e preencha DB_HOST/DB_USER/DB_PASSWORD
|
||||||
|
|
||||||
|
# 3. Rebuild (Gemfile mudou — gem propshaft):
|
||||||
|
docker-compose build --no-cache
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# 4. Criar banco do sistema + migrar + popular:
|
||||||
|
docker-compose exec app bundle exec rails db:create db:migrate db:seed
|
||||||
|
|
||||||
|
# 5. Conferir:
|
||||||
|
docker-compose logs -f app # deve mostrar "Listening on http://0.0.0.0:3000"
|
||||||
|
# Acesse http://SEU_IP:3000 → admin@gade.com / Gade@2026!
|
||||||
|
```
|
||||||
|
|
||||||
## 🔐 Segurança
|
## 🔐 Segurança
|
||||||
|
|
||||||
- **NUNCA** versione `.env`, `config/master.key` ou qualquer arquivo com senha
|
- **NUNCA** versione `.env`, `config/master.key` ou qualquer arquivo com senha
|
||||||
|
|||||||
2
app/javascript/application.js
Normal file
2
app/javascript/application.js
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
import "@hotwired/turbo-rails"
|
||||||
|
import "controllers"
|
||||||
5
app/javascript/controllers/application.js
Normal file
5
app/javascript/controllers/application.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import { Application } from "@hotwired/stimulus"
|
||||||
|
const application = Application.start()
|
||||||
|
application.debug = false
|
||||||
|
window.Stimulus = application
|
||||||
|
export { application }
|
||||||
3
app/javascript/controllers/index.js
Normal file
3
app/javascript/controllers/index.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
import { application } from "controllers/application"
|
||||||
|
import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading"
|
||||||
|
eagerLoadControllersFrom("controllers", application)
|
||||||
@@ -48,6 +48,7 @@
|
|||||||
@keyframes spin { to { transform: rotate(360deg); } }
|
@keyframes spin { to { transform: rotate(360deg); } }
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<%= javascript_importmap_tags %>
|
||||||
<%= yield :head %>
|
<%= yield :head %>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|||||||
4
bin/rails
Executable file
4
bin/rails
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
APP_PATH = File.expand_path("../config/application", __dir__)
|
||||||
|
require_relative "../config/boot"
|
||||||
|
require "rails/commands"
|
||||||
4
bin/rake
Executable file
4
bin/rake
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
require_relative "../config/boot"
|
||||||
|
require "rake"
|
||||||
|
Rake.application.run
|
||||||
4
config.ru
Normal file
4
config.ru
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# This file is used by Rack-based servers to start the application.
|
||||||
|
require_relative "config/environment"
|
||||||
|
run Rails.application
|
||||||
|
Rails.application.load_server
|
||||||
27
config/application.rb
Normal file
27
config/application.rb
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
require_relative "boot"
|
||||||
|
require "rails/all"
|
||||||
|
|
||||||
|
Bundler.require(*Rails.groups)
|
||||||
|
require "dotenv/load" if defined?(Dotenv)
|
||||||
|
|
||||||
|
module GadeLogistica
|
||||||
|
class Application < Rails::Application
|
||||||
|
config.load_defaults 7.1
|
||||||
|
|
||||||
|
# Timezone e idioma Brasil
|
||||||
|
config.time_zone = "America/Sao_Paulo"
|
||||||
|
config.i18n.default_locale = :'pt-BR'
|
||||||
|
config.i18n.available_locales = [:'pt-BR', :en]
|
||||||
|
config.i18n.fallbacks = [:en]
|
||||||
|
|
||||||
|
# Autoload de services
|
||||||
|
config.autoload_paths += %W[#{config.root}/app/services]
|
||||||
|
|
||||||
|
# Não gerar specs/helpers desnecessários
|
||||||
|
config.generators do |g|
|
||||||
|
g.test_framework :rspec
|
||||||
|
g.helper false
|
||||||
|
g.stylesheets false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
2
config/boot.rb
Normal file
2
config/boot.rb
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
|
||||||
|
require "bundler/setup"
|
||||||
2
config/environment.rb
Normal file
2
config/environment.rb
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
require_relative "application"
|
||||||
|
Rails.application.initialize!
|
||||||
22
config/environments/development.rb
Normal file
22
config/environments/development.rb
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
require "active_support/core_ext/integer/time"
|
||||||
|
|
||||||
|
Rails.application.configure do
|
||||||
|
config.enable_reloading = true
|
||||||
|
config.eager_load = false
|
||||||
|
config.consider_all_requests_local = true
|
||||||
|
config.server_timing = true
|
||||||
|
|
||||||
|
config.cache_store = :memory_store
|
||||||
|
config.active_storage.service = :local if defined?(ActiveStorage)
|
||||||
|
|
||||||
|
config.action_mailer.raise_delivery_errors = false
|
||||||
|
config.action_mailer.perform_caching = false
|
||||||
|
config.action_mailer.default_url_options = { host: ENV.fetch("APP_HOST", "localhost:3000") }
|
||||||
|
|
||||||
|
config.active_support.deprecation = :log
|
||||||
|
config.active_record.migration_error = :page_load
|
||||||
|
config.active_record.verbose_query_logs = true
|
||||||
|
|
||||||
|
config.assets.quiet = true if config.respond_to?(:assets)
|
||||||
|
config.hosts.clear # aceita qualquer host em dev (Docker/IP local)
|
||||||
|
end
|
||||||
27
config/environments/production.rb
Normal file
27
config/environments/production.rb
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
require "active_support/core_ext/integer/time"
|
||||||
|
|
||||||
|
Rails.application.configure do
|
||||||
|
config.enable_reloading = false
|
||||||
|
config.eager_load = true
|
||||||
|
config.consider_all_requests_local = false
|
||||||
|
|
||||||
|
config.force_ssl = false # mude para true quando tiver HTTPS
|
||||||
|
config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info")
|
||||||
|
config.log_tags = [:request_id]
|
||||||
|
config.logger = ActiveSupport::Logger.new(STDOUT).tap { |l| l.formatter = ::Logger::Formatter.new }
|
||||||
|
.then { |l| ActiveSupport::TaggedLogging.new(l) }
|
||||||
|
|
||||||
|
config.cache_store = :memory_store
|
||||||
|
config.active_storage.service = :local if defined?(ActiveStorage)
|
||||||
|
|
||||||
|
config.action_mailer.perform_caching = false
|
||||||
|
config.action_mailer.default_url_options = { host: ENV.fetch("APP_HOST", "localhost:3000") }
|
||||||
|
|
||||||
|
config.i18n.fallbacks = true
|
||||||
|
config.active_support.report_deprecations = false
|
||||||
|
config.active_record.dump_schema_after_migration = false
|
||||||
|
|
||||||
|
# Aceita o host configurado no .env
|
||||||
|
config.hosts << ENV["APP_HOST"]&.split(":")&.first if ENV["APP_HOST"].present?
|
||||||
|
config.hosts.clear if ENV["RAILS_ALLOW_ALL_HOSTS"] == "true"
|
||||||
|
end
|
||||||
10
config/environments/test.rb
Normal file
10
config/environments/test.rb
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
require "active_support/core_ext/integer/time"
|
||||||
|
|
||||||
|
Rails.application.configure do
|
||||||
|
config.enable_reloading = false
|
||||||
|
config.eager_load = ENV["CI"].present?
|
||||||
|
config.consider_all_requests_local = true
|
||||||
|
config.cache_store = :null_store
|
||||||
|
config.action_mailer.delivery_method = :test
|
||||||
|
config.active_support.deprecation = :stderr
|
||||||
|
end
|
||||||
6
config/importmap.rb
Normal file
6
config/importmap.rb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Pin npm packages by running ./bin/importmap
|
||||||
|
pin "application"
|
||||||
|
pin "@hotwired/turbo-rails", to: "turbo.min.js"
|
||||||
|
pin "@hotwired/stimulus", to: "stimulus.min.js"
|
||||||
|
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js"
|
||||||
|
pin_all_from "app/javascript/controllers", under: "controllers"
|
||||||
16
config/initializers/devise.rb
Normal file
16
config/initializers/devise.rb
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
Devise.setup do |config|
|
||||||
|
config.mailer_sender = ENV.fetch('SMTP_USERNAME', 'noreply@gade.com.br')
|
||||||
|
require 'devise/orm/active_record'
|
||||||
|
config.case_insensitive_keys = [:email]
|
||||||
|
config.strip_whitespace_keys = [:email]
|
||||||
|
config.skip_session_storage = [:http_auth]
|
||||||
|
config.stretches = Rails.env.test? ? 1 : 12
|
||||||
|
config.reconfirmable = true
|
||||||
|
config.expire_all_remember_me_on_sign_out = true
|
||||||
|
config.password_length = 6..128
|
||||||
|
config.email_regexp = /\A[^@\s]+@[^@\s]+\z/
|
||||||
|
config.reset_password_within = 6.hours
|
||||||
|
config.sign_out_via = :delete
|
||||||
|
config.responder.error_status = :unprocessable_entity
|
||||||
|
config.responder.redirect_status = :see_other
|
||||||
|
end
|
||||||
9
config/locales/pt-BR.yml
Normal file
9
config/locales/pt-BR.yml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
pt-BR:
|
||||||
|
date:
|
||||||
|
formats:
|
||||||
|
default: "%d/%m/%Y"
|
||||||
|
short: "%d/%m/%Y"
|
||||||
|
time:
|
||||||
|
formats:
|
||||||
|
default: "%d/%m/%Y %H:%M"
|
||||||
|
short: "%d/%m %H:%M"
|
||||||
9
config/puma.rb
Normal file
9
config/puma.rb
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
|
||||||
|
min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
|
||||||
|
threads min_threads_count, max_threads_count
|
||||||
|
|
||||||
|
worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development"
|
||||||
|
port ENV.fetch("PORT") { 3000 }
|
||||||
|
environment ENV.fetch("RAILS_ENV") { "development" }
|
||||||
|
pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
|
||||||
|
plugin :tmp_restart
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
# config/routes.rb
|
# config/routes.rb
|
||||||
Rails.application.routes.draw do
|
Rails.application.routes.draw do
|
||||||
# Devise — login padrão para admin/gerente/operador
|
# Devise — login padrão para admin/gerente/operador
|
||||||
devise_for :users, path: 'auth', path_names: {
|
devise_for :users, path: 'auth',
|
||||||
|
controllers: { sessions: 'users/sessions' },
|
||||||
|
path_names: {
|
||||||
sign_in: 'login',
|
sign_in: 'login',
|
||||||
sign_out: 'logout',
|
sign_out: 'logout',
|
||||||
password: 'senha'
|
password: 'senha'
|
||||||
|
|||||||
0
public/.keep
Normal file
0
public/.keep
Normal file
0
public/robots.txt
Normal file
0
public/robots.txt
Normal file
0
storage/.keep
Normal file
0
storage/.keep
Normal file
Reference in New Issue
Block a user