--- title: "Traefik V3 Migration Documentation" description: "Migrate from Traefik Proxy v2 to v3 and update all the necessary configurations to take advantage of all the improvements. Read the technical documentation." --- # Migration Guide: From v2 to v3 How to Migrate from Traefik v2 to Traefik v3. {: .subtitle } The version 3 of Traefik introduces a number of breaking changes, which require one to update their configuration when they migrate from v2 to v3. The goal of this page is to recapitulate all of these changes, and in particular to give examples, feature by feature, of how the configuration looked like in v2, and how it now looks like in v3. ## Static configuration ### Docker & Docker Swarm In v3, the provider Docker has been split into 2 providers: - Docker provider (without Swarm support) - Swarm provider (Swarm support only) ??? example "An example usage of v2 Docker provider with Swarm" ```yaml tab="File (YAML)" providers: docker: swarmMode: true ``` ```toml tab="File (TOML)" [providers.docker] swarmMode=true ``` ```bash tab="CLI" --providers.docker.swarmMode=true ``` This configuration is now unsupported and would prevent Traefik to start. #### Remediation In v3, the `swarmMode` should not be used with the Docker provider, and, to use Swarm, the Swarm provider should be used instead. ??? example "An example usage of the Swarm provider" ```yaml tab="File (YAML)" providers: swarm: endpoint: "tcp://127.0.0.1:2377" ``` ```toml tab="File (TOML)" [providers.swarm] endpoint="tcp://127.0.0.1:2377" ``` ```bash tab="CLI" --providers.swarm.endpoint=tcp://127.0.0.1:2377 ``` ### HTTP3 Experimental Configuration In v3, HTTP/3 is no longer an experimental feature. It can be enabled on entry points without the associated `experimental.http3` option, which is now removed. It is now unsupported and would prevent Traefik to start. ??? example "An example usage of v2 Experimental `http3` option" ```yaml tab="File (YAML)" experimental: http3: true ``` ```toml tab="File (TOML)" [experimental] http3=true ``` ```bash tab="CLI" --experimental.http3=true ``` #### Remediation The `http3` option should be removed from the static configuration experimental section. ### Consul provider The Consul provider `namespace` option was deprecated in v2 and is now removed in v3. It is now unsupported and would prevent Traefik to start. ??? example "An example usage of v2 Consul `namespace` option" ```yaml tab="File (YAML)" consul: namespace: foobar ``` ```toml tab="File (TOML)" [consul] namespace=foobar ``` ```bash tab="CLI" --consul.namespace=foobar ``` #### Remediation In v3, the `namespaces` option should be used instead of the `namespace` option. ??? example "An example usage of Consul `namespaces` option" ```yaml tab="File (YAML)" consul: namespaces: - foobar ``` ```toml tab="File (TOML)" [consul] namespaces=["foobar"] ``` ```bash tab="CLI" --consul.namespaces=foobar ``` ### ConsulCatalog provider The ConsulCatalog provider `namespace` option was deprecated in v2 and is now removed in v3. It is now unsupported and would prevent Traefik to start. ??? example "An example usage of v2 ConsulCatalog `namespace` option" ```yaml tab="File (YAML)" consulCatalog: namespace: foobar ``` ```toml tab="File (TOML)" [consulCatalog] namespace=foobar ``` ```bash tab="CLI" --consulCatalog.namespace=foobar ``` #### Remediation In v3, the `namespaces` option should be used instead of the `namespace` option. ??? example "An example usage of ConsulCatalog `namespaces` option" ```yaml tab="File (YAML)" consulCatalog: namespaces: - foobar ``` ```toml tab="File (TOML)" [consulCatalog] namespaces=["foobar"] ``` ```bash tab="CLI" --consulCatalog.namespaces=foobar ``` ### Nomad provider The Nomad provider `namespace` option was deprecated in v2 and is now removed in v3. It is now unsupported and would prevent Traefik to start. ??? example "An example usage of v2 Nomad `namespace` option" ```yaml tab="File (YAML)" nomad: namespace: foobar ``` ```toml tab="File (TOML)" [nomad] namespace=foobar ``` ```bash tab="CLI" --nomad.namespace=foobar ``` #### Remediation In v3, the `namespaces` option should be used instead of the `namespace` option. ??? example "An example usage of Nomad `namespaces` option" ```yaml tab="File (YAML)" nomad: namespaces: - foobar ``` ```toml tab="File (TOML)" [nomad] namespaces=["foobar"] ``` ```bash tab="CLI" --nomad.namespaces=foobar ``` ### Rancher v1 Provider In v3, the Rancher v1 provider has been removed because Rancher v1 is [no longer actively maintaned](https://rancher.com/docs/os/v1.x/en/support/), and Rancher v2 is supported as a standard Kubernetes provider. ??? example "An example of Traefik v2 Rancher v1 configuration" ```yaml tab="File (YAML)" providers: rancher: {} ``` ```toml tab="File (TOML)" [providers.rancher] ``` ```bash tab="CLI" --providers.rancher=true ``` This configuration is now unsupported and would prevent Traefik to start. #### Remediation Rancher 2.x requires Kubernetes and does not have a metadata endpoint of its own for Traefik to query. As such, Rancher 2.x users should utilize the [Kubernetes CRD provider](../providers/kubernetes-crd.md) directly. Also, all Rancher provider related configuration should be removed from the static configuration. ### Marathon provider Marathon maintenance [ended on October 31, 2021](https://github.com/mesosphere/marathon/blob/master/README.md). In v3, the Marathon provider has been removed. ??? example "An example of v2 Marathon provider configuration" ```yaml tab="File (YAML)" providers: marathon: {} ``` ```toml tab="File (TOML)" [providers.marathon] ``` ```bash tab="CLI" --providers.marathon=true ``` This configuration is now unsupported and would prevent Traefik to start. #### Remediation All Marathon provider related configuration should be removed from the static configuration. ### InfluxDB v1 InfluxDB v1.x maintenance [ended in 2021](https://www.influxdata.com/blog/influxdb-oss-and-enterprise-roadmap-update-from-influxdays-emea/). In v3, the InfluxDB v1 metrics provider has been removed. ??? example "An example of Traefik v2 InfluxDB v1 metrics configuration" ```yaml tab="File (YAML)" metrics: influxDB: {} ``` ```toml tab="File (TOML)" [metrics.influxDB] ``` ```bash tab="CLI" --metrics.influxDB=true ``` This configuration is now unsupported and would prevent Traefik to start. #### Remediation All InfluxDB v1 metrics provider related configuration should be removed from the static configuration. ### Pilot Traefik Pilot is no longer available since October 4th, 2022. ??? example "An example of v2 Pilot configuration" ```yaml tab="File (YAML)" pilot: token: foobar ``` ```toml tab="File (TOML)" [pilot] token=foobar ``` ```bash tab="CLI" --pilot.token=foobar ``` In v2, Pilot configuration was deprecated and ineffective, it is now unsupported and would prevent Traefik to start. #### Remediation All Pilot related configuration should be removed from the static configuration. ## Dynamic configuration ### IPWhiteList In v3, we renamed the `IPWhiteList` middleware to `IPAllowList` without changing anything to the configuration. ### Deprecated Options Removal - The `tracing.datadog.globaltag` option has been removed. - The `tls.caOptional` option has been removed from the ForwardAuth middleware, as well as from the HTTP, Consul, Etcd, Redis, ZooKeeper, Consul Catalog, and Docker providers. - `sslRedirect`, `sslTemporaryRedirect`, `sslHost`, `sslForceHost` and `featurePolicy` options of the Headers middleware have been removed. - The `forceSlash` option of the StripPrefix middleware has been removed. - The `preferServerCipherSuites` option has been removed. ### Matchers In v3, the `Headers` and `HeadersRegexp` matchers have been renamed to `Header` and `HeaderRegexp` respectively. `PathPrefix` no longer uses regular expressions to match path prefixes. `QueryRegexp` has been introduced to match query values using a regular expression. `HeaderRegexp`, `HostRegexp`, `PathRegexp`, `QueryRegexp`, and `HostSNIRegexp` matchers now uses the [Go regexp syntax](https://golang.org/pkg/regexp/syntax/). All matchers now take a single value (except `Header`, `HeaderRegexp`, `Query`, and `QueryRegexp` which take two) and should be explicitly combined using logical operators to mimic previous behavior. `Query` can take a single value to match is the query value that has no value (e.g. `/search?mobile`). `HostHeader` has been removed, use `Host` instead. ### TCP LoadBalancer `terminationDelay` option The TCP LoadBalancer `terminationDelay` option has been removed. This option can now be configured directly on the `TCPServersTransport` level, please take a look at this [documentation](../routing/services/index.md#terminationdelay) ### Kubernetes CRDs API Group `traefik.containo.us` In v3, the Kubernetes CRDs API Group `traefik.containo.us` has been removed. Please use the API Group `traefik.io` instead. ### Kubernetes Ingress API Group `networking.k8s.io/v1beta1` In v3, the Kubernetes Ingress API Group `networking.k8s.io/v1beta1` ([removed since Kubernetes v1.22](https://kubernetes.io/docs/reference/using-api/deprecation-guide/#ingress-v122)) support has been removed. Please use the API Group `networking.k8s.io/v1` instead. ### Traefik CRD API Version `apiextensions.k8s.io/v1beta1` In v3, the Traefik CRD API Version `apiextensions.k8s.io/v1beta1` ([removed since Kubernetes v1.22](https://kubernetes.io/docs/reference/using-api/deprecation-guide/#customresourcedefinition-v122)) support has been removed. Please use the CRD definition with the API Version `apiextensions.k8s.io/v1` instead. ## Operations ### Traefik RBAC Update In v3, the support of `TCPServersTransport` has been introduced. When using the KubernetesCRD provider, it is therefore necessary to update [RBAC](../reference/dynamic-configuration/kubernetes-crd.md#rbac) and [CRD](../reference/dynamic-configuration/kubernetes-crd.md) manifests. ### Content-Type Auto-Detection In v3, the `Content-Type` header is not auto-detected anymore when it is not set by the backend. One should use the `ContentType` middleware to enable the `Content-Type` header value auto-detection. ### Observability #### gRPC Metrics In v3, the reported status code for gRPC requests is now the value of the `Grpc-Status` header.