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. config.assume_ssl = true config.force_ssl = true 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: ". # # ⚠️ 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