Files
Reem-Notas/config/environments/production.rb

79 lines
4.2 KiB
Ruby

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
# HTTPS obrigatório: redireciona HTTP→HTTPS e marca cookies como "Secure".
# assume_ssl faz o Rails confiar no TLS terminado no Cloudflare (que envia
# X-Forwarded-Proto=https), evitando loop de redirecionamento.
#
# ⚠️ EFEITO COLATERAL, e não é bug: com assume_ssl o Rails calcula
# `request.base_url` como https:// SEMPRE. Quem abre o sistema direto pelo
# IP em HTTP (http://100.75.222.23:3001) manda `Origin: http://...`, a
# verificação de CSRF compara os dois, não bate, e TODO POST volta 422
# ("A ação foi recusada por uma verificação de segurança") — enquanto os GETs
# passam e a tela parece normal. Aconteceu em 27/08/2026 ao importar o plano
# do romaneio. O uso normal é pelo domínio, onde Origin e base_url são https.
#
# O gate abaixo existe para DIAGNÓSTICO pelo IP: `FORCE_SSL=false` no .env
# devolve o acesso por HTTP puro. Sem a variável (ou com qualquer outro
# valor) o HTTPS continua obrigatório — o padrão seguro. Antes isto estava
# fixo aqui e o FORCE_SSL do .env, respeitado no application.rb, não tinha
# efeito nenhum em produção: as duas configurações se contradiziam.
unless ENV["FORCE_SSL"] == "false"
config.assume_ssl = true
config.force_ssl = true
end
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") }
# `= true` significa "caia no default_locale" — e o default AQUI é o próprio
# pt-BR, então o fallback apontava para si mesmo e qualquer chave ausente
# virava "Translation missing" NA TELA DO USUÁRIO (aconteceu em 27/08/2026 na
# tela de login, com devise.failure.unauthenticated). Em development o
# config/application.rb já usa [:en] e por isso o problema não aparecia lá.
# Mantido igual ao application.rb: chave faltando mostra o texto em inglês,
# que é feio mas legível — nunca a mensagem de erro do i18n.
config.i18n.fallbacks = [:en]
config.active_support.report_deprecations = false
config.active_record.dump_schema_after_migration = false
# ── Hosts aceitos (proteção contra DNS rebinding) ─────────────────────────
# Regra do Rails: lista VAZIA = aceita qualquer Host; lista com QUALQUER item
# = só o que estiver nela entra. Por isso a linha abaixo, que parece só
# "liberar o APP_HOST", na verdade LIGA a verificação e bloqueia todo o resto
# com "ActionDispatch::HostAuthorization ... Blocked hosts: <host>".
#
# ⚠️ APP_HOST tem que vir SEM "https://": com o esquema, este split libera um
# host chamado "https" e nada funciona.
config.hosts << ENV["APP_HOST"]&.split(":")&.first if ENV["APP_HOST"].present?
# O próprio servidor. Sem isto, um `curl http://127.0.0.1:3001/` de dentro do
# NAS — que é o teste que separa "app caiu" de "proxy errado" — volta
# bloqueado e faz parecer que a aplicação está quebrada.
config.hosts += ["localhost", "127.0.0.1", "[::1]"]
# Endereços extras, separados por vírgula. Caso real (27/08/2026): o acesso
# pela rede interna chega com `Host: 100.75.222.23:3001` (o IP do NAS), que
# não bate com o domínio público e caía em "Blocked hosts". A porta é
# ignorada pelo Rails na comparação — basta o IP/nome.
# HOSTS_PERMITIDOS=100.75.222.23,10.0.0.20
ENV.fetch("HOSTS_PERMITIDOS", "").split(",").map(&:strip).reject(&:empty?).each do |permitido|
config.hosts << permitido
end
# Escotilha de emergência: desliga a verificação por completo. Último recurso —
# com ela ligada, qualquer domínio apontado para este servidor é aceito.
config.hosts.clear if ENV["RAILS_ALLOW_ALL_HOSTS"] == "true"
end