diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f66b736f..437aa5b2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,38 @@ +## [v2.11.0](https://github.com/traefik/traefik/tree/v2.11.0) (2024-02-12) +[All Commits](https://github.com/traefik/traefik/compare/v2.11.0-rc1...v2.11.0) + +**Enhancements:** +- **[middleware]** Deprecate IPWhiteList middleware in favor of IPAllowList ([#10249](https://github.com/traefik/traefik/pull/10249) by [lbenguigui](https://github.com/lbenguigui)) +- **[redis]** Add Redis Sentinel support ([#10245](https://github.com/traefik/traefik/pull/10245) by [youkoulayley](https://github.com/youkoulayley)) +- **[server]** Add KeepAliveMaxTime and KeepAliveMaxRequests features to entrypoints ([#10247](https://github.com/traefik/traefik/pull/10247) by [juliens](https://github.com/juliens)) +- **[sticky-session]** Hash WRR sticky cookies ([#10243](https://github.com/traefik/traefik/pull/10243) by [youkoulayley](https://github.com/youkoulayley)) + +**Bug fixes:** +- **[acme]** Update go-acme/lego to v4.15.0 ([#10392](https://github.com/traefik/traefik/pull/10392) by [ldez](https://github.com/ldez)) +- **[authentication]** Fix NTLM and Kerberos ([#10405](https://github.com/traefik/traefik/pull/10405) by [juliens](https://github.com/juliens)) +- **[file]** Fix file watcher ([#10420](https://github.com/traefik/traefik/pull/10420) by [juliens](https://github.com/juliens)) +- **[file]** Update github.com/fsnotify/fsnotify to v1.7.0 ([#10313](https://github.com/traefik/traefik/pull/10313) by [ldez](https://github.com/ldez)) +- **[http3]** Update quic-go to v0.40.1 ([#10296](https://github.com/traefik/traefik/pull/10296) by [ldez](https://github.com/ldez)) +- **[middleware,tcp]** Add missing TCP IPAllowList middleware constructor ([#10331](https://github.com/traefik/traefik/pull/10331) by [youkoulayley](https://github.com/youkoulayley)) +- **[nomad]** Update the Nomad API dependency to v1.7.2 ([#10327](https://github.com/traefik/traefik/pull/10327) by [jrasell](https://github.com/jrasell)) +- **[server]** Fix ReadHeaderTimeout for PROXY protocol ([#10320](https://github.com/traefik/traefik/pull/10320) by [juliens](https://github.com/juliens)) +- **[webui]** Fixes the Header Button ([#10395](https://github.com/traefik/traefik/pull/10395) by [mdeliatf](https://github.com/mdeliatf)) +- **[webui]** Fix URL encode resource's id before calling API endpoints ([#10292](https://github.com/traefik/traefik/pull/10292) by [andsarr](https://github.com/andsarr)) + + **Documentation:** +- **[acme]** Fix TLS challenge explanation ([#10293](https://github.com/traefik/traefik/pull/10293) by [cavokz](https://github.com/cavokz)) +- **[docker]** Update wording of compose example ([#10276](https://github.com/traefik/traefik/pull/10276) by [svx](https://github.com/svx)) +- **[docker,acme]** Fix typo ([#10294](https://github.com/traefik/traefik/pull/10294) by [youpsla](https://github.com/youpsla)) +- **[ecs]** Mention ECS as supported backend ([#10393](https://github.com/traefik/traefik/pull/10393) by [aleyrizvi](https://github.com/aleyrizvi)) +- **[k8s/crd]** Adjust deprecation notice for Kubernetes CRD provider ([#10317](https://github.com/traefik/traefik/pull/10317) by [rtribotte](https://github.com/rtribotte)) +- **[middleware]** Update the documentation for RateLimit to provide a better example ([#10298](https://github.com/traefik/traefik/pull/10298) by [rmburton](https://github.com/rmburton)) +- **[server]** Fix the keepAlive options for the CLI examples ([#10398](https://github.com/traefik/traefik/pull/10398) by [immanuelfodor](https://github.com/immanuelfodor)) +- Prepare release v2.11.0-rc2 ([#10384](https://github.com/traefik/traefik/pull/10384) by [rtribotte](https://github.com/rtribotte)) +- Improve Concepts documentation page ([#10315](https://github.com/traefik/traefik/pull/10315) by [oliver-dvorski](https://github.com/oliver-dvorski)) +- Prepare release v2.11.0-rc1 ([#10326](https://github.com/traefik/traefik/pull/10326) by [mmatur](https://github.com/mmatur)) +- Fix description for anonymous usage statistics references ([#10287](https://github.com/traefik/traefik/pull/10287) by [ariyonaty](https://github.com/ariyonaty)) +- Documentation enhancements ([#10261](https://github.com/traefik/traefik/pull/10261) by [svx](https://github.com/svx)) + ## [v2.11.0-rc2](https://github.com/traefik/traefik/tree/v2.11.0-rc2) (2024-01-24) [All Commits](https://github.com/traefik/traefik/compare/v2.11.0-rc1...v2.11.0-rc2) diff --git a/docs/content/middlewares/http/ratelimit.md b/docs/content/middlewares/http/ratelimit.md index 2359b1796..98de1fc52 100644 --- a/docs/content/middlewares/http/ratelimit.md +++ b/docs/content/middlewares/http/ratelimit.md @@ -16,15 +16,15 @@ It is based on a [token bucket](https://en.wikipedia.org/wiki/Token_bucket) impl ```yaml tab="Docker & Swarm" # Here, an average of 100 requests per second is allowed. -# In addition, a burst of 50 requests is allowed. +# In addition, a burst of 200 requests is allowed. labels: - "traefik.http.middlewares.test-ratelimit.ratelimit.average=100" - - "traefik.http.middlewares.test-ratelimit.ratelimit.burst=50" + - "traefik.http.middlewares.test-ratelimit.ratelimit.burst=200" ``` ```yaml tab="Kubernetes" # Here, an average of 100 requests per second is allowed. -# In addition, a burst of 50 requests is allowed. +# In addition, a burst of 200 requests is allowed. apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: @@ -32,34 +32,34 @@ metadata: spec: rateLimit: average: 100 - burst: 50 + burst: 200 ``` ```yaml tab="Consul Catalog" # Here, an average of 100 requests per second is allowed. -# In addition, a burst of 50 requests is allowed. +# In addition, a burst of 200 requests is allowed. - "traefik.http.middlewares.test-ratelimit.ratelimit.average=100" - "traefik.http.middlewares.test-ratelimit.ratelimit.burst=50" ``` ```yaml tab="File (YAML)" # Here, an average of 100 requests per second is allowed. -# In addition, a burst of 50 requests is allowed. +# In addition, a burst of 200 requests is allowed. http: middlewares: test-ratelimit: rateLimit: average: 100 - burst: 50 + burst: 200 ``` ```toml tab="File (TOML)" # Here, an average of 100 requests per second is allowed. -# In addition, a burst of 50 requests is allowed. +# In addition, a burst of 200 requests is allowed. [http.middlewares] [http.middlewares.test-ratelimit.rateLimit] average = 100 - burst = 50 + burst = 200 ``` ## Configuration Options diff --git a/pkg/provider/file/file.go b/pkg/provider/file/file.go index 6ddc31084..7b1b79e99 100644 --- a/pkg/provider/file/file.go +++ b/pkg/provider/file/file.go @@ -7,6 +7,7 @@ import ( "fmt" "os" "os/signal" + "path" "path/filepath" "strings" "syscall" @@ -53,18 +54,31 @@ func (p *Provider) Provide(configurationChan chan<- dynamic.Message, pool *safe. logger := log.With().Str(logs.ProviderName, providerName).Logger() if p.Watch { - var watchItem string + var watchItems []string switch { case len(p.Directory) > 0: - watchItem = p.Directory + watchItems = append(watchItems, p.Directory) + + fileList, err := os.ReadDir(p.Directory) + if err != nil { + return fmt.Errorf("unable to read directory %s: %w", p.Directory, err) + } + + for _, entry := range fileList { + if entry.IsDir() { + // ignore sub-dir + continue + } + watchItems = append(watchItems, path.Join(p.Directory, entry.Name())) + } case len(p.Filename) > 0: - watchItem = filepath.Dir(p.Filename) + watchItems = append(watchItems, filepath.Dir(p.Filename), p.Filename) default: return errors.New("error using file configuration provider, neither filename nor directory is defined") } - if err := p.addWatcher(pool, watchItem, configurationChan, p.applyConfiguration); err != nil { + if err := p.addWatcher(pool, watchItems, configurationChan, p.applyConfiguration); err != nil { return err } } @@ -98,15 +112,18 @@ func (p *Provider) Provide(configurationChan chan<- dynamic.Message, pool *safe. return nil } -func (p *Provider) addWatcher(pool *safe.Pool, directory string, configurationChan chan<- dynamic.Message, callback func(chan<- dynamic.Message) error) error { +func (p *Provider) addWatcher(pool *safe.Pool, items []string, configurationChan chan<- dynamic.Message, callback func(chan<- dynamic.Message) error) error { watcher, err := fsnotify.NewWatcher() if err != nil { return fmt.Errorf("error creating file watcher: %w", err) } - err = watcher.Add(directory) - if err != nil { - return fmt.Errorf("error adding file watcher: %w", err) + for _, item := range items { + log.Debug().Msgf("add watcher on: %s", item) + err = watcher.Add(item) + if err != nil { + return fmt.Errorf("error adding file watcher: %w", err) + } } // Process events