Merge 'v2.3' into master.
This commit is contained in:
commit
afcec56be4
27 changed files with 499 additions and 34 deletions
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -3,11 +3,11 @@ PLEASE READ THIS MESSAGE.
|
||||||
|
|
||||||
Documentation fixes or enhancements:
|
Documentation fixes or enhancements:
|
||||||
- for Traefik v1: use branch v1.7
|
- for Traefik v1: use branch v1.7
|
||||||
- for Traefik v2: use branch v2.2
|
- for Traefik v2: use branch v2.3
|
||||||
|
|
||||||
Bug fixes:
|
Bug fixes:
|
||||||
- for Traefik v1: use branch v1.7
|
- for Traefik v1: use branch v1.7
|
||||||
- for Traefik v2: use branch v2.2
|
- for Traefik v2: use branch v2.3
|
||||||
|
|
||||||
Enhancements:
|
Enhancements:
|
||||||
- for Traefik v1: we only accept bug fixes
|
- for Traefik v1: we only accept bug fixes
|
||||||
|
|
11
CHANGELOG.md
11
CHANGELOG.md
|
@ -1,3 +1,14 @@
|
||||||
|
## [v2.3.1](https://github.com/traefik/traefik/tree/v2.3.1) (2020-09-28)
|
||||||
|
[All Commits](https://github.com/traefik/traefik/compare/v2.3.0...v2.3.1)
|
||||||
|
|
||||||
|
**Bug fixes:**
|
||||||
|
- **[webui]** Fix blank webui on some browsers ([#7364](https://github.com/traefik/traefik/pull/7364) by [matthieuh](https://github.com/matthieuh))
|
||||||
|
|
||||||
|
**Documentation:**
|
||||||
|
- **[k8s/helm]** Update of the helm repo localisation ([#7352](https://github.com/traefik/traefik/pull/7352) by [dgoujard](https://github.com/dgoujard))
|
||||||
|
- restore traefik logo ([#7344](https://github.com/traefik/traefik/pull/7344) by [notsureifkevin](https://github.com/notsureifkevin))
|
||||||
|
- Removes invalid items in the changelog. ([#7339](https://github.com/traefik/traefik/pull/7339) by [ldez](https://github.com/ldez))
|
||||||
|
|
||||||
## [v2.3.0](https://github.com/traefik/traefik/tree/v2.3.0) (2020-09-23)
|
## [v2.3.0](https://github.com/traefik/traefik/tree/v2.3.0) (2020-09-23)
|
||||||
[All Commits](https://github.com/traefik/traefik/compare/v2.2.0-rc1...v2.3.0)
|
[All Commits](https://github.com/traefik/traefik/compare/v2.2.0-rc1...v2.3.0)
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ Representation of a project may be further defined and clarified by project main
|
||||||
|
|
||||||
## Enforcement
|
## Enforcement
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at contact@containo.us
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at contact@traefik.io
|
||||||
All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances.
|
All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances.
|
||||||
The project team is obligated to maintain confidentiality with regard to the reporter of an incident.
|
The project team is obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
Further details of specific enforcement policies may be posted separately.
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
14
README.md
14
README.md
|
@ -8,7 +8,7 @@
|
||||||
[![Go Report Card](https://goreportcard.com/badge/traefik/traefik)](https://goreportcard.com/report/traefik/traefik)
|
[![Go Report Card](https://goreportcard.com/badge/traefik/traefik)](https://goreportcard.com/report/traefik/traefik)
|
||||||
[![](https://images.microbadger.com/badges/image/traefik.svg)](https://microbadger.com/images/traefik)
|
[![](https://images.microbadger.com/badges/image/traefik.svg)](https://microbadger.com/images/traefik)
|
||||||
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/traefik/traefik/blob/master/LICENSE.md)
|
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/traefik/traefik/blob/master/LICENSE.md)
|
||||||
[![Join the community support forum at https://community.containo.us/](https://img.shields.io/badge/style-register-green.svg?style=social&label=Discourse)](https://community.containo.us/)
|
[![Join the community support forum at https://community.traefik.io/](https://img.shields.io/badge/style-register-green.svg?style=social&label=Discourse)](https://community.traefik.io/)
|
||||||
[![Twitter](https://img.shields.io/twitter/follow/traefik.svg?style=social)](https://twitter.com/intent/follow?screen_name=traefik)
|
[![Twitter](https://img.shields.io/twitter/follow/traefik.svg?style=social)](https://twitter.com/intent/follow?screen_name=traefik)
|
||||||
|
|
||||||
|
|
||||||
|
@ -96,9 +96,9 @@ A collection of contributions around Traefik can be found at [https://awesome.tr
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
To get community support, you can:
|
To get community support, you can:
|
||||||
- join the Traefik community forum: [![Join the chat at https://community.containo.us/](https://img.shields.io/badge/style-register-green.svg?style=social&label=Discourse)](https://community.containo.us/)
|
- join the Traefik community forum: [![Join the chat at https://community.traefik.io/](https://img.shields.io/badge/style-register-green.svg?style=social&label=Discourse)](https://community.traefik.io/)
|
||||||
|
|
||||||
If you need commercial support, please contact [Containo.us](https://containo.us) by mail: <mailto:support@containo.us>.
|
If you need commercial support, please contact [Traefik.io](https://traefik.io) by mail: <mailto:support@traefik.io>.
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ git clone https://github.com/traefik/traefik
|
||||||
|
|
||||||
## Introductory Videos
|
## Introductory Videos
|
||||||
|
|
||||||
You can find high level and deep dive videos on [videos.containo.us](https://videos.containo.us).
|
You can find high level and deep dive videos on [videos.traefik.io](https://videos.traefik.io).
|
||||||
|
|
||||||
## Maintainers
|
## Maintainers
|
||||||
|
|
||||||
|
@ -152,9 +152,9 @@ We use [Semantic Versioning](https://semver.org/).
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
Kudos to [Peka](http://peka.byethost11.com/photoblog/) for his awesome work on the logo ![logo](docs/content/assets/img/traefik.icon.png).
|
Kudos to [Peka](http://peka.byethost11.com/photoblog/) for his awesome work on the gopher's logo!.
|
||||||
|
|
||||||
Traefik's logo is licensed under the Creative Commons 3.0 Attributions license.
|
The gopher's logo of Traefik is licensed under the Creative Commons 3.0 Attributions license.
|
||||||
|
|
||||||
Traefik's logo was inspired by the gopher stickers made by [Takuya Ueda](https://twitter.com/tenntenn).
|
The gopher's logo of Traefik was inspired by the gopher stickers made by [Takuya Ueda](https://twitter.com/tenntenn).
|
||||||
The original Go gopher was designed by [Renee French](https://reneefrench.blogspot.com/).
|
The original Go gopher was designed by [Renee French](https://reneefrench.blogspot.com/).
|
||||||
|
|
|
@ -9,7 +9,10 @@ You can install Traefik with the following flavors:
|
||||||
|
|
||||||
## Use the Official Docker Image
|
## Use the Official Docker Image
|
||||||
|
|
||||||
Choose one of the [official Docker images](https://hub.docker.com/_/traefik) and run it with the [sample configuration file](https://raw.githubusercontent.com/traefik/traefik/v2.3/traefik.sample.toml):
|
Choose one of the [official Docker images](https://hub.docker.com/_/traefik) and run it with one sample configuration file:
|
||||||
|
|
||||||
|
* [TOML](https://raw.githubusercontent.com/traefik/traefik/v2.3/traefik.sample.toml)
|
||||||
|
* [YAML](https://raw.githubusercontent.com/traefik/traefik/v2.3/traefik.sample.yml)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -d -p 8080:8080 -p 80:80 \
|
docker run -d -p 8080:8080 -p 80:80 \
|
||||||
|
@ -42,7 +45,7 @@ Ensure that the following requirements are met:
|
||||||
Add Traefik's chart repository to Helm:
|
Add Traefik's chart repository to Helm:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
helm repo add traefik https://traefik.github.io/traefik-helm-chart
|
helm repo add traefik https://helm.traefik.io/traefik
|
||||||
```
|
```
|
||||||
|
|
||||||
You can update the chart repository by running:
|
You can update the chart repository by running:
|
||||||
|
|
|
@ -516,6 +516,34 @@ certificatesResolvers:
|
||||||
# ...
|
# ...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### `keyType`
|
||||||
|
|
||||||
|
_Optional, Default="RSA4096"_
|
||||||
|
|
||||||
|
KeyType used for generating certificate private key. Allow value 'EC256', 'EC384', 'RSA2048', 'RSA4096', 'RSA8192'.
|
||||||
|
|
||||||
|
```toml tab="File (TOML)"
|
||||||
|
[certificatesResolvers.myresolver.acme]
|
||||||
|
# ...
|
||||||
|
keyType = "RSA4096"
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml tab="File (YAML)"
|
||||||
|
certificatesResolvers:
|
||||||
|
myresolver:
|
||||||
|
acme:
|
||||||
|
# ...
|
||||||
|
keyType: 'RSA4096'
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash tab="CLI"
|
||||||
|
# ...
|
||||||
|
--certificatesresolvers.myresolver.acme.keyType="RSA4096"
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
## Fallback
|
## Fallback
|
||||||
|
|
||||||
If Let's Encrypt is not reachable, the following certificates will apply:
|
If Let's Encrypt is not reachable, the following certificates will apply:
|
||||||
|
|
|
@ -251,6 +251,9 @@
|
||||||
addEntryPointsLabels = true
|
addEntryPointsLabels = true
|
||||||
addServicesLabels = true
|
addServicesLabels = true
|
||||||
|
|
||||||
|
[pilot]
|
||||||
|
token = "foobar"
|
||||||
|
|
||||||
[ping]
|
[ping]
|
||||||
entryPoint = "foobar"
|
entryPoint = "foobar"
|
||||||
manualRouting = true
|
manualRouting = true
|
||||||
|
@ -365,8 +368,6 @@
|
||||||
[certificatesResolvers.CertificateResolver1.acme.tlsChallenge]
|
[certificatesResolvers.CertificateResolver1.acme.tlsChallenge]
|
||||||
|
|
||||||
[experimental]
|
[experimental]
|
||||||
[experimental.pilot]
|
|
||||||
token = "foobar"
|
|
||||||
[experimental.plugins]
|
[experimental.plugins]
|
||||||
[experimental.plugins.Descriptor0]
|
[experimental.plugins.Descriptor0]
|
||||||
moduleName = "foobar"
|
moduleName = "foobar"
|
||||||
|
|
|
@ -270,6 +270,8 @@ metrics:
|
||||||
password: foobar
|
password: foobar
|
||||||
addEntryPointsLabels: true
|
addEntryPointsLabels: true
|
||||||
addServicesLabels: true
|
addServicesLabels: true
|
||||||
|
pilot:
|
||||||
|
token: foobar
|
||||||
ping:
|
ping:
|
||||||
entryPoint: foobar
|
entryPoint: foobar
|
||||||
manualRouting: true
|
manualRouting: true
|
||||||
|
@ -384,8 +386,6 @@ certificatesResolvers:
|
||||||
entryPoint: foobar
|
entryPoint: foobar
|
||||||
tlsChallenge: {}
|
tlsChallenge: {}
|
||||||
experimental:
|
experimental:
|
||||||
pilot:
|
|
||||||
token: foobar
|
|
||||||
plugins:
|
plugins:
|
||||||
Descriptor0:
|
Descriptor0:
|
||||||
moduleName: foobar
|
moduleName: foobar
|
||||||
|
|
|
@ -23,7 +23,7 @@ type Configuration struct {
|
||||||
TCPRouters map[string]*TCPRouterInfo `json:"tcpRouters,omitempty"`
|
TCPRouters map[string]*TCPRouterInfo `json:"tcpRouters,omitempty"`
|
||||||
TCPServices map[string]*TCPServiceInfo `json:"tcpServices,omitempty"`
|
TCPServices map[string]*TCPServiceInfo `json:"tcpServices,omitempty"`
|
||||||
UDPRouters map[string]*UDPRouterInfo `json:"udpRouters,omitempty"`
|
UDPRouters map[string]*UDPRouterInfo `json:"udpRouters,omitempty"`
|
||||||
UDPServices map[string]*UDPServiceInfo `json:"updServices,omitempty"`
|
UDPServices map[string]*UDPServiceInfo `json:"udpServices,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewConfig returns a Configuration initialized with the given conf. It never returns nil.
|
// NewConfig returns a Configuration initialized with the given conf. It never returns nil.
|
||||||
|
|
|
@ -34,7 +34,10 @@ func (s *LocalStore) save(resolverName string, storedData *StoredData) {
|
||||||
defer s.lock.Unlock()
|
defer s.lock.Unlock()
|
||||||
|
|
||||||
s.storedData[resolverName] = storedData
|
s.storedData[resolverName] = storedData
|
||||||
s.saveDataChan <- s.storedData
|
|
||||||
|
// we cannot pass s.storedData directly, map is reference type and as result
|
||||||
|
// we can face with race condition, so we need to work with objects copy
|
||||||
|
s.saveDataChan <- s.unSafeCopyOfStoredData()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *LocalStore) get(resolverName string) (*StoredData, error) {
|
func (s *LocalStore) get(resolverName string) (*StoredData, error) {
|
||||||
|
@ -81,7 +84,10 @@ func (s *LocalStore) get(resolverName string) (*StoredData, error) {
|
||||||
}
|
}
|
||||||
if len(certificates) < len(storedData.Certificates) {
|
if len(certificates) < len(storedData.Certificates) {
|
||||||
storedData.Certificates = certificates
|
storedData.Certificates = certificates
|
||||||
s.saveDataChan <- s.storedData
|
|
||||||
|
// we cannot pass s.storedData directly, map is reference type and as result
|
||||||
|
// we can face with race condition, so we need to work with objects copy
|
||||||
|
s.saveDataChan <- s.unSafeCopyOfStoredData()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,6 +117,15 @@ func (s *LocalStore) listenSaveAction() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// unSafeCopyOfStoredData creates maps copy of storedData. Is not thread safe, you should use `s.lock`.
|
||||||
|
func (s *LocalStore) unSafeCopyOfStoredData() map[string]*StoredData {
|
||||||
|
result := map[string]*StoredData{}
|
||||||
|
for k, v := range s.storedData {
|
||||||
|
result[k] = v
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
// GetAccount returns ACME Account.
|
// GetAccount returns ACME Account.
|
||||||
func (s *LocalStore) GetAccount(resolverName string) (*Account, error) {
|
func (s *LocalStore) GetAccount(resolverName string) (*Account, error) {
|
||||||
storedData, err := s.get(resolverName)
|
storedData, err := s.get(resolverName)
|
||||||
|
|
87
pkg/provider/acme/local_store_test.go
Normal file
87
pkg/provider/acme/local_store_test.go
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
package acme
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestLocalStore_GetAccount(t *testing.T) {
|
||||||
|
acmeFile := filepath.Join(t.TempDir(), "acme.json")
|
||||||
|
|
||||||
|
email := "some42@email.com"
|
||||||
|
filePayload := fmt.Sprintf(`{
|
||||||
|
"test": {
|
||||||
|
"Account": {
|
||||||
|
"Email": "%s"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`, email)
|
||||||
|
|
||||||
|
err := ioutil.WriteFile(acmeFile, []byte(filePayload), 0o600)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
desc string
|
||||||
|
filename string
|
||||||
|
expected *Account
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
desc: "empty file",
|
||||||
|
filename: filepath.Join(t.TempDir(), "acme-empty.json"),
|
||||||
|
expected: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "file with data",
|
||||||
|
filename: acmeFile,
|
||||||
|
expected: &Account{Email: "some42@email.com"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range testCases {
|
||||||
|
test := test
|
||||||
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
|
s := NewLocalStore(test.filename)
|
||||||
|
|
||||||
|
account, err := s.GetAccount("test")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, test.expected, account)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLocalStore_SaveAccount(t *testing.T) {
|
||||||
|
acmeFile := filepath.Join(t.TempDir(), "acme.json")
|
||||||
|
|
||||||
|
s := NewLocalStore(acmeFile)
|
||||||
|
|
||||||
|
email := "some@email.com"
|
||||||
|
|
||||||
|
err := s.SaveAccount("test", &Account{Email: email})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
|
||||||
|
file, err := ioutil.ReadFile(acmeFile)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
expected := `{
|
||||||
|
"test": {
|
||||||
|
"Account": {
|
||||||
|
"Email": "some@email.com",
|
||||||
|
"Registration": null,
|
||||||
|
"PrivateKey": null,
|
||||||
|
"KeyType": ""
|
||||||
|
},
|
||||||
|
"Certificates": null
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
assert.Equal(t, expected, string(file))
|
||||||
|
}
|
|
@ -220,7 +220,7 @@ func (p *Provider) getClient() (*lego.Client, error) {
|
||||||
|
|
||||||
config := lego.NewConfig(account)
|
config := lego.NewConfig(account)
|
||||||
config.CADirURL = caServer
|
config.CADirURL = caServer
|
||||||
config.Certificate.KeyType = account.KeyType
|
config.Certificate.KeyType = GetKeyType(ctx, p.KeyType)
|
||||||
config.UserAgent = fmt.Sprintf("containous-traefik/%s", version.Version)
|
config.UserAgent = fmt.Sprintf("containous-traefik/%s", version.Version)
|
||||||
|
|
||||||
client, err := lego.NewClient(config)
|
client, err := lego.NewClient(config)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2016-2020 Containous SAS
|
Copyright (c) 2016-2020 Containous SAS; 2020-2020 Traefik Labs
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2016-2020 Containous SAS
|
Copyright (c) 2016-2020 Containous SAS; 2020-2020 Traefik Labs
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2016-2020 Containous SAS
|
Copyright (c) 2016-2020 Containous SAS; 2020-2020 Traefik Labs
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2016-2020 Containous SAS
|
Copyright (c) 2016-2020 Containous SAS; 2020-2020 Traefik Labs
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -106,7 +106,7 @@ func (m *Manager) Get(storeName, configName string) (*tls.Config, error) {
|
||||||
tlsConfig.GetCertificate = func(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) {
|
tlsConfig.GetCertificate = func(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) {
|
||||||
domainToCheck := types.CanonicalDomain(clientHello.ServerName)
|
domainToCheck := types.CanonicalDomain(clientHello.ServerName)
|
||||||
|
|
||||||
if m.TLSAlpnGetter != nil {
|
if m.TLSAlpnGetter != nil && isACMETLS(clientHello) {
|
||||||
cert, err := m.TLSAlpnGetter(domainToCheck)
|
cert, err := m.TLSAlpnGetter(domainToCheck)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -282,3 +282,13 @@ func buildDefaultCertificate(defaultCertificate *Certificate) (*tls.Certificate,
|
||||||
}
|
}
|
||||||
return &cert, nil
|
return &cert, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isACMETLS(clientHello *tls.ClientHelloInfo) bool {
|
||||||
|
for _, proto := range clientHello.SupportedProtos {
|
||||||
|
if proto == tlsalpn01.ACMETLS1Protocol {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
31
script/gcg/readme.md
Normal file
31
script/gcg/readme.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# GCG - GitHub Changelog Generator
|
||||||
|
|
||||||
|
Installation: https://github.com/ldez/gcg#how-to-install
|
||||||
|
|
||||||
|
## Generates Changelog for a Bug Fix Release
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gcg --config-file=./script/gcg/traefik-bugfix.toml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Generates Changelog for a Final Release
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gcg --config-file=./script/gcg/traefik-final-release-part1.toml
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gcg --config-file=./script/gcg/traefik-final-release-part2.toml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Generates Changelog for the first RC of a Version
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gcg --config-file=./script/gcg/traefik-rc-first.toml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Generates Changelog for a RC of a Version
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gcg --config-file=./script/gcg/traefik-rc-new.toml
|
||||||
|
```
|
27
script/gcg/traefik-bugfix.toml
Normal file
27
script/gcg/traefik-bugfix.toml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
Owner = "traefik"
|
||||||
|
RepositoryName = "traefik"
|
||||||
|
|
||||||
|
OutputType = "file"
|
||||||
|
FileName = "traefik_changelog.md"
|
||||||
|
|
||||||
|
# example new bugfix v2.3.1
|
||||||
|
CurrentRef = "v2.3"
|
||||||
|
PreviousRef = "v2.3.0"
|
||||||
|
BaseBranch = "v2.3"
|
||||||
|
FutureCurrentRefName = "v2.3.1"
|
||||||
|
|
||||||
|
ThresholdPreviousRef = 10
|
||||||
|
ThresholdCurrentRef = 10
|
||||||
|
|
||||||
|
Debug = true
|
||||||
|
DisplayLabel = true
|
||||||
|
|
||||||
|
LabelExcludes = ["area/infrastructure"]
|
||||||
|
LabelEnhancement = "kind/enhancement"
|
||||||
|
LabelDocumentation = "area/documentation"
|
||||||
|
LabelBug = "kind/bug/fix"
|
||||||
|
|
||||||
|
[DisplayLabelOptions]
|
||||||
|
FilteredPrefixes = ["area/", "platform/"]
|
||||||
|
ExcludedSuffixes = ["documentation"]
|
||||||
|
TrimmedPrefixes = ["area/provider/", "area/middleware/", "area/", "platform/"]
|
27
script/gcg/traefik-final-release-part1.toml
Normal file
27
script/gcg/traefik-final-release-part1.toml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
Owner = "traefik"
|
||||||
|
RepositoryName = "traefik"
|
||||||
|
|
||||||
|
OutputType = "file"
|
||||||
|
FileName = "traefik_changelog.md"
|
||||||
|
|
||||||
|
# example final release of v2.3.0
|
||||||
|
CurrentRef = "v2.3"
|
||||||
|
PreviousRef = "v2.3.0-rc7"
|
||||||
|
BaseBranch = "v2.3"
|
||||||
|
FutureCurrentRefName = "v2.3.0"
|
||||||
|
|
||||||
|
ThresholdPreviousRef = 10
|
||||||
|
ThresholdCurrentRef = 10
|
||||||
|
|
||||||
|
Debug = true
|
||||||
|
DisplayLabel = true
|
||||||
|
|
||||||
|
LabelExcludes = ["area/infrastructure"]
|
||||||
|
LabelEnhancement = "kind/enhancement"
|
||||||
|
LabelDocumentation = "area/documentation"
|
||||||
|
LabelBug = "kind/bug/fix"
|
||||||
|
|
||||||
|
[DisplayLabelOptions]
|
||||||
|
FilteredPrefixes = ["area/", "platform/"]
|
||||||
|
ExcludedSuffixes = ["documentation"]
|
||||||
|
TrimmedPrefixes = ["area/provider/", "area/middleware/", "area/", "platform/"]
|
27
script/gcg/traefik-final-release-part2.toml
Normal file
27
script/gcg/traefik-final-release-part2.toml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
Owner = "traefik"
|
||||||
|
RepositoryName = "traefik"
|
||||||
|
|
||||||
|
OutputType = "file"
|
||||||
|
FileName = "traefik_changelog.md"
|
||||||
|
|
||||||
|
# example final release of v2.3.0
|
||||||
|
CurrentRef = "v2.3.0-rc1"
|
||||||
|
PreviousRef = "v2.2.0-rc1"
|
||||||
|
BaseBranch = "master"
|
||||||
|
FutureCurrentRefName = "v2.3.0-rc1"
|
||||||
|
|
||||||
|
ThresholdPreviousRef = 10
|
||||||
|
ThresholdCurrentRef = 10
|
||||||
|
|
||||||
|
Debug = true
|
||||||
|
DisplayLabel = true
|
||||||
|
|
||||||
|
LabelExcludes = ["area/infrastructure"]
|
||||||
|
LabelEnhancement = "kind/enhancement"
|
||||||
|
LabelDocumentation = "area/documentation"
|
||||||
|
LabelBug = "kind/bug/fix"
|
||||||
|
|
||||||
|
[DisplayLabelOptions]
|
||||||
|
FilteredPrefixes = ["area/", "platform/"]
|
||||||
|
ExcludedSuffixes = ["documentation"]
|
||||||
|
TrimmedPrefixes = ["area/provider/", "area/middleware/", "area/", "platform/"]
|
27
script/gcg/traefik-rc-first.toml
Normal file
27
script/gcg/traefik-rc-first.toml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
Owner = "traefik"
|
||||||
|
RepositoryName = "traefik"
|
||||||
|
|
||||||
|
OutputType = "file"
|
||||||
|
FileName = "traefik_changelog.md"
|
||||||
|
|
||||||
|
# example RC1 of v2.3.0
|
||||||
|
CurrentRef = "master"
|
||||||
|
PreviousRef = "v2.2.0-rc1"
|
||||||
|
BaseBranch = "master"
|
||||||
|
FutureCurrentRefName = "v2.3.0-rc1"
|
||||||
|
|
||||||
|
ThresholdPreviousRef = 10
|
||||||
|
ThresholdCurrentRef = 10
|
||||||
|
|
||||||
|
Debug = true
|
||||||
|
DisplayLabel = true
|
||||||
|
|
||||||
|
LabelExcludes = ["area/infrastructure"]
|
||||||
|
LabelEnhancement = "kind/enhancement"
|
||||||
|
LabelDocumentation = "area/documentation"
|
||||||
|
LabelBug = "kind/bug/fix"
|
||||||
|
|
||||||
|
[DisplayLabelOptions]
|
||||||
|
FilteredPrefixes = ["area/", "platform/"]
|
||||||
|
ExcludedSuffixes = ["documentation"]
|
||||||
|
TrimmedPrefixes = ["area/provider/", "area/middleware/", "area/", "platform/"]
|
27
script/gcg/traefik-rc-new.toml
Normal file
27
script/gcg/traefik-rc-new.toml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
Owner = "traefik"
|
||||||
|
RepositoryName = "traefik"
|
||||||
|
|
||||||
|
OutputType = "file"
|
||||||
|
FileName = "traefik_changelog.md"
|
||||||
|
|
||||||
|
# example RC2 of v2.3.0
|
||||||
|
CurrentRef = "v2.3"
|
||||||
|
PreviousRef = "v2.3.0-rc1"
|
||||||
|
BaseBranch = "v2.3"
|
||||||
|
FutureCurrentRefName = "v2.3.0-rc2"
|
||||||
|
|
||||||
|
ThresholdPreviousRef = 10
|
||||||
|
ThresholdCurrentRef = 10
|
||||||
|
|
||||||
|
Debug = true
|
||||||
|
DisplayLabel = true
|
||||||
|
|
||||||
|
LabelExcludes = ["area/infrastructure"]
|
||||||
|
LabelEnhancement = "kind/enhancement"
|
||||||
|
LabelDocumentation = "area/documentation"
|
||||||
|
LabelBug = "kind/bug/fix"
|
||||||
|
|
||||||
|
[DisplayLabelOptions]
|
||||||
|
FilteredPrefixes = ["area/", "platform/"]
|
||||||
|
ExcludedSuffixes = ["documentation"]
|
||||||
|
TrimmedPrefixes = ["area/provider/", "area/middleware/", "area/", "platform/"]
|
151
traefik.sample.yml
Normal file
151
traefik.sample.yml
Normal file
|
@ -0,0 +1,151 @@
|
||||||
|
################################################################
|
||||||
|
#
|
||||||
|
# Configuration sample for Traefik v2.
|
||||||
|
#
|
||||||
|
# For Traefik v1: https://github.com/traefik/traefik/blob/v1.7/traefik.sample.toml
|
||||||
|
#
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Global configuration
|
||||||
|
################################################################
|
||||||
|
global:
|
||||||
|
checkNewVersion: true
|
||||||
|
sendAnonymousUsage: true
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# EntryPoints configuration
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
# EntryPoints definition
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
#
|
||||||
|
entryPoints:
|
||||||
|
web:
|
||||||
|
address: :80
|
||||||
|
|
||||||
|
websecure:
|
||||||
|
address: :443
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Traefik logs configuration
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
# Traefik logs
|
||||||
|
# Enabled by default and log to stdout
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
#
|
||||||
|
#log:
|
||||||
|
# Log level
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: "ERROR"
|
||||||
|
#
|
||||||
|
# level: DEBUG
|
||||||
|
|
||||||
|
# Sets the filepath for the traefik log. If not specified, stdout will be used.
|
||||||
|
# Intermediate directories are created if necessary.
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: os.Stdout
|
||||||
|
#
|
||||||
|
# filePath: log/traefik.log
|
||||||
|
|
||||||
|
# Format is either "json" or "common".
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: "common"
|
||||||
|
#
|
||||||
|
# format: json
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Access logs configuration
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
# Enable access logs
|
||||||
|
# By default it will write to stdout and produce logs in the textual
|
||||||
|
# Common Log Format (CLF), extended with additional fields.
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
#
|
||||||
|
#accessLog:
|
||||||
|
# Sets the file path for the access log. If not specified, stdout will be used.
|
||||||
|
# Intermediate directories are created if necessary.
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: os.Stdout
|
||||||
|
#
|
||||||
|
# filePath: /path/to/log/log.txt
|
||||||
|
|
||||||
|
# Format is either "json" or "common".
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: "common"
|
||||||
|
#
|
||||||
|
# format: json
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# API and dashboard configuration
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
# Enable API and dashboard
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
#
|
||||||
|
#api:
|
||||||
|
# Enable the API in insecure mode
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: false
|
||||||
|
#
|
||||||
|
# insecure: true
|
||||||
|
|
||||||
|
# Enabled Dashboard
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: true
|
||||||
|
#
|
||||||
|
# dashboard: false
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Ping configuration
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
# Enable ping
|
||||||
|
#ping:
|
||||||
|
# Name of the related entry point
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: "traefik"
|
||||||
|
#
|
||||||
|
# entryPoint: traefik
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Docker configuration backend
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
#providers:
|
||||||
|
# Enable Docker configuration backend
|
||||||
|
# docker:
|
||||||
|
# Docker server endpoint. Can be a tcp or a unix socket endpoint.
|
||||||
|
#
|
||||||
|
# Required
|
||||||
|
# Default: "unix:///var/run/docker.sock"
|
||||||
|
#
|
||||||
|
# endpoint: tcp://10.10.10.10:2375
|
||||||
|
|
||||||
|
# Default host rule.
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: "Host(`{{ normalize .Name }}`)"
|
||||||
|
#
|
||||||
|
# defaultRule: Host(`{{ normalize .Name }}.docker.localhost`)
|
||||||
|
|
||||||
|
# Expose containers by default in traefik
|
||||||
|
#
|
||||||
|
# Optional
|
||||||
|
# Default: true
|
||||||
|
#
|
||||||
|
# exposedByDefault: false
|
5
webui/package-lock.json
generated
5
webui/package-lock.json
generated
|
@ -12488,11 +12488,6 @@
|
||||||
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
|
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"semver-regex": {
|
|
||||||
"version": "3.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.1.tgz",
|
|
||||||
"integrity": "sha512-3dPcmFqxblWB/cppQ2qXWqlp9b6GLgAS032+Ec5E0waDVHTkwYIL+7BFI9UqEe0tkoHle2f3pBgvT/Xl95+Dig=="
|
|
||||||
},
|
|
||||||
"send": {
|
"send": {
|
||||||
"version": "0.17.1",
|
"version": "0.17.1",
|
||||||
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
|
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
"moment": "^2.24.0",
|
"moment": "^2.24.0",
|
||||||
"quasar": "^1.4.4",
|
"quasar": "^1.4.4",
|
||||||
"query-string": "^6.13.1",
|
"query-string": "^6.13.1",
|
||||||
"semver-regex": "^3.1.1",
|
|
||||||
"vh-check": "^2.0.5",
|
"vh-check": "^2.0.5",
|
||||||
"vue-chartjs": "^3.4.2",
|
"vue-chartjs": "^3.4.2",
|
||||||
"vuex-map-fields": "^1.3.4"
|
"vuex-map-fields": "^1.3.4"
|
||||||
|
|
|
@ -46,7 +46,6 @@
|
||||||
import config from '../../../package'
|
import config from '../../../package'
|
||||||
import PlatformAuthState from '../platform/PlatformAuthState'
|
import PlatformAuthState from '../platform/PlatformAuthState'
|
||||||
import { mapActions, mapGetters } from 'vuex'
|
import { mapActions, mapGetters } from 'vuex'
|
||||||
import semverRegex from 'semver-regex'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'NavBar',
|
name: 'NavBar',
|
||||||
|
@ -55,7 +54,7 @@ export default {
|
||||||
...mapGetters('core', { coreVersion: 'version' }),
|
...mapGetters('core', { coreVersion: 'version' }),
|
||||||
version () {
|
version () {
|
||||||
if (!this.coreVersion.Version) return null
|
if (!this.coreVersion.Version) return null
|
||||||
return semverRegex().test(this.coreVersion.Version)
|
return /^(v?\d+\.\d+)/.test(this.coreVersion.Version)
|
||||||
? this.coreVersion.Version
|
? this.coreVersion.Version
|
||||||
: this.coreVersion.Version.substring(0, 7)
|
: this.coreVersion.Version.substring(0, 7)
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue