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: ". # # ⚠️ 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