basecamp / kamal

Deploy web apps anywhere.
https://kamal-deploy.org
MIT License
10.51k stars 398 forks source link

Incorrect validation for traefik configuration. #863

Closed arthurwozniak closed 3 months ago

arthurwozniak commented 3 months ago

Traefik may contain arguments entryPoints.name.forwardedHeaders.trustedIPs and entryPoints.name.proxyProtocol.trustedIPs, which is array of IPs according to documentation.

After upgrading to 1.7.2 from 1.5.2, we encounter Kamal::ConfigurationError) caused configuration validation introduced in https://github.com/basecamp/kamal/releases/tag/v1.7.0

Before kamal upgrade, following configuration worked.

traefik:
  args:
    entrypoints.web.forwardedheaders.trustedips:
      - "172.0.0.1"
...

Error callstack:

  ERROR (Kamal::ConfigurationError): traefik/args/entrypoints.web.forwardedheaders.trustedips: should be a string
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:118:in `error'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:122:in `type_error'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:114:in `validate_type!'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:88:in `block (2 levels) in validate_hash_of!'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:136:in `with_context'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:87:in `block in validate_hash_of!'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:86:in `each'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:86:in `validate_hash_of!'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:37:in `block (2 levels) in validate_against_example!'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:136:in `with_context'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:23:in `block in validate_against_example!'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:22:in `each'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:22:in `validate_against_example!'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validator.rb:11:in `validate!'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/validation.rb:21:in `validate!'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration/traefik.rb:23:in `initialize'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration.rb:63:in `new'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration.rb:63:in `initialize'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration.rb:22:in `new'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/configuration.rb:22:in `create_from'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/commander.rb:16:in `config'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/commander.rb:158:in `specifics'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/commander.rb:6:in `hosts'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/lib/kamal/cli/server.rb:5:in `exec'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/thor-1.3.1/lib/thor/command.rb:28:in `run'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/thor-1.3.1/lib/thor/invocation.rb:127:in `invoke_command'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/thor-1.3.1/lib/thor.rb:527:in `dispatch'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/thor-1.3.1/lib/thor/invocation.rb:116:in `invoke'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/thor-1.3.1/lib/thor.rb:338:in `block in subcommand'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/thor-1.3.1/lib/thor/command.rb:28:in `run'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/thor-1.3.1/lib/thor/invocation.rb:127:in `invoke_command'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/thor-1.3.1/lib/thor.rb:527:in `dispatch'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/thor-1.3.1/lib/thor/base.rb:584:in `start'
/Users/kamilhanus/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/gems/kamal-1.7.2/bin/kamal:9:in `<top (required)>'
/Users/kamilhanus/.rbenv/versions/3.3.1/bin/kamal:25:in `load'
/Users/kamilhanus/.rbenv/versions/3.3.1/bin/kamal:25:in `<main>'

I believe this is a bug as, according to documentation, trustedips value can be passed as array.

djmb commented 3 months ago

Thanks for the report @arthurwozniak! Fixed in #864

djmb commented 3 months ago

I've released v1.7.3 which should fix this 👍