diff --git a/CHANGELOG.md b/CHANGELOG.md index 668f585da..78e2d5800 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,32 @@ # Change Log +## [v1.0.1](https://github.com/containous/traefik/tree/v1.0.1) (2016-07-19) +[Full Changelog](https://github.com/containous/traefik/compare/v1.0.0...v1.0.1) + +**Implemented enhancements:** + +- Error with -consulcatalog and missing load balance method on 1.0.0 [\#524](https://github.com/containous/traefik/issues/524) +- Kubernetes provider: should allow the master url to be override [\#501](https://github.com/containous/traefik/issues/501) + +**Fixed bugs:** + +- Flag --etcd.endpoint default [\#508](https://github.com/containous/traefik/issues/508) +- Conditional ACME on demand generation [\#505](https://github.com/containous/traefik/issues/505) +- Important delay with streams \(Mozilla EventSource\) [\#503](https://github.com/containous/traefik/issues/503) + +**Closed issues:** + +- Can I use Traefik without a domain name? [\#539](https://github.com/containous/traefik/issues/539) +- Priortities in 1.0.0 not behaving [\#506](https://github.com/containous/traefik/issues/506) +- Route by path [\#500](https://github.com/containous/traefik/issues/500) + +**Merged pull requests:** + +- Update server.go [\#531](https://github.com/containous/traefik/pull/531) ([Jsewill](https://github.com/Jsewill)) +- Add sse support [\#527](https://github.com/containous/traefik/pull/527) ([emilevauge](https://github.com/emilevauge)) +- Fix acme checkOnDemandDomain [\#512](https://github.com/containous/traefik/pull/512) ([emilevauge](https://github.com/emilevauge)) +- Fix default etcd port [\#511](https://github.com/containous/traefik/pull/511) ([errm](https://github.com/errm)) + ## [v1.0.0](https://github.com/containous/traefik/tree/v1.0.0) (2016-07-05) [Full Changelog](https://github.com/containous/traefik/compare/v1.0.0-rc3...v1.0.0) diff --git a/configuration.go b/configuration.go index 5317e1c35..64b5f7da3 100644 --- a/configuration.go +++ b/configuration.go @@ -22,7 +22,7 @@ type TraefikConfiguration struct { // GlobalConfiguration holds global configuration (with providers, etc.). // It's populated from the traefik configuration file passed as an argument to the binary. type GlobalConfiguration struct { - GraceTimeOut int64 `short:"g" description:"Configuration file to use (TOML)."` + GraceTimeOut int64 `short:"g" description:"Duration to give active requests a chance to finish during hot-reload"` Debug bool `short:"d" description:"Enable debug mode"` AccessLogsFile string `description:"Access logs file"` TraefikLogsFile string `description:"Traefik logs file"` @@ -300,7 +300,7 @@ func NewTraefikDefaultPointersConfiguration() *TraefikConfiguration { // default Etcd var defaultEtcd provider.Etcd defaultEtcd.Watch = true - defaultEtcd.Endpoint = "127.0.0.1:400" + defaultEtcd.Endpoint = "127.0.0.1:2379" defaultEtcd.Prefix = "/traefik" defaultEtcd.Constraints = []types.Constraint{} diff --git a/docs/basics.md b/docs/basics.md index 013990465..97aae8aa9 100644 --- a/docs/basics.md +++ b/docs/basics.md @@ -97,24 +97,24 @@ Here is an example of frontends definition: [frontends.frontend1] backend = "backend2" [frontends.frontend1.routes.test_1] - rule = "Host: test.localhost, test2.localhost" + rule = "Host:test.localhost,test2.localhost" [frontends.frontend2] backend = "backend1" passHostHeader = true priority = 10 entrypoints = ["https"] # overrides defaultEntryPoints [frontends.frontend2.routes.test_1] - rule = "Host: localhost, {subdomain:[a-z]+}.localhost" + rule = "Host:localhost,{subdomain:[a-z]+}.localhost" [frontends.frontend3] backend = "backend2" [frontends.frontend3.routes.test_1] - rule = "Host: test3.localhost;Path:/test" + rule = "Host:test3.localhost;Path:/test" ``` - Three frontends are defined: `frontend1`, `frontend2` and `frontend3` -- `frontend1` will forward the traffic to the `backend2` if the rule `Host: test.localhost, test2.localhost` is matched -- `frontend2` will forward the traffic to the `backend1` if the rule `Host: localhost, {subdomain:[a-z]+}.localhost` is matched (forwarding client `Host` header to the backend) -- `frontend3` will forward the traffic to the `backend2` if the rules `Host: test3.localhost` **and** `Path:/test` are matched +- `frontend1` will forward the traffic to the `backend2` if the rule `Host:test.localhost,test2.localhost` is matched +- `frontend2` will forward the traffic to the `backend1` if the rule `Host:localhost,{subdomain:[a-z]+}.localhost` is matched (forwarding client `Host` header to the backend) +- `frontend3` will forward the traffic to the `backend2` if the rules `Host:test3.localhost` **AND** `Path:/test` are matched ### Combining multiple rules @@ -125,19 +125,19 @@ In TOML file, you can use multiple routes: [frontends.frontend3] backend = "backend2" [frontends.frontend3.routes.test_1] - rule = "Host: test3.localhost" + rule = "Host:test3.localhost" [frontends.frontend3.routes.test_2] - rule = "Host: Path:/test" + rule = "Host:Path:/test" ``` -Here `frontend3` will forward the traffic to the `backend2` if the rules `Host: test3.localhost` **and** `Path:/test` are matched. -You can also use the notation using a `;` separator: +Here `frontend3` will forward the traffic to the `backend2` if the rules `Host:test3.localhost` **AND** `Path:/test` are matched. +You can also use the notation using a `;` separator, same result: ```toml [frontends.frontend3] backend = "backend2" [frontends.frontend3.routes.test_1] - rule = "Host: test3.localhost;Path:/test" + rule = "Host:test3.localhost;Path:/test" ``` Finally, you can create a rule to bind multiple domains or Path to a frontend, using the `,` separator: @@ -145,7 +145,7 @@ Finally, you can create a rule to bind multiple domains or Path to a frontend, u ```toml [frontends.frontend2] [frontends.frontend2.routes.test_1] - rule = "Host: test1.localhost,Host: test2.localhost" + rule = "Host:test1.localhost,test2.localhost" [frontends.frontend3] backend = "backend2" [frontends.frontend3.routes.test_1] @@ -154,7 +154,7 @@ Finally, you can create a rule to bind multiple domains or Path to a frontend, u ### Priorities -By default, routes will be sorted using rules length (to avoid path overlap): +By default, routes will be sorted (in descending order) using rules length (to avoid path overlap): `PathPrefix:/12345` will be matched before `PathPrefix:/1234` that will be matched before `PathPrefix:/1`. You can customize priority by frontend: @@ -175,6 +175,8 @@ You can customize priority by frontend: rule = "PathPrefix:/toto" ``` +Here, `frontend1` will be matched before `frontend2` (`10 > 5`). + ## Backends A backend is responsible to load-balance the traffic coming from one or more frontends to a set of http servers. diff --git a/docs/toml.md b/docs/toml.md index 65ba71af2..552365887 100644 --- a/docs/toml.md +++ b/docs/toml.md @@ -842,7 +842,7 @@ Træfɪk can be configured to use Etcd as a backend configuration: # # Required # -endpoint = "127.0.0.1:4001" +endpoint = "127.0.0.1:2379" # Enable watch Etcd changes # diff --git a/examples/compose-etcd.yml b/examples/compose-etcd.yml index 62df465d3..83ba52f72 100644 --- a/examples/compose-etcd.yml +++ b/examples/compose-etcd.yml @@ -1,4 +1,4 @@ etcd: image: gcr.io/google_containers/etcd:2.2.1 net: host - command: ['/usr/local/bin/etcd', '--addr=127.0.0.1:4001', '--bind-addr=0.0.0.0:4001', '--data-dir=/var/etcd/data'] \ No newline at end of file + command: ['/usr/local/bin/etcd', '--addr=127.0.0.1:2379', '--bind-addr=0.0.0.0:2379', '--data-dir=/var/etcd/data'] diff --git a/examples/etcd-config.sh b/examples/etcd-config.sh index 648ad970b..6515f9b76 100755 --- a/examples/etcd-config.sh +++ b/examples/etcd-config.sh @@ -1,25 +1,25 @@ #!/bin/sh # backend 1 -curl -i -H "Accept: application/json" -X PUT -d value="NetworkErrorRatio() > 0.5" http://localhost:4001/v2/keys/traefik/backends/backend1/circuitbreaker/expression -curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.2:80" http://localhost:4001/v2/keys/traefik/backends/backend1/servers/server1/url -curl -i -H "Accept: application/json" -X PUT -d value="10" http://localhost:4001/v2/keys/traefik/backends/backend1/servers/server1/weight -curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.3:80" http://localhost:4001/v2/keys/traefik/backends/backend1/servers/server2/url -curl -i -H "Accept: application/json" -X PUT -d value="1" http://localhost:4001/v2/keys/traefik/backends/backend1/servers/server2/weight +curl -i -H "Accept: application/json" -X PUT -d value="NetworkErrorRatio() > 0.5" http://localhost:2379/v2/keys/traefik/backends/backend1/circuitbreaker/expression +curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.2:80" http://localhost:2379/v2/keys/traefik/backends/backend1/servers/server1/url +curl -i -H "Accept: application/json" -X PUT -d value="10" http://localhost:2379/v2/keys/traefik/backends/backend1/servers/server1/weight +curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.3:80" http://localhost:2379/v2/keys/traefik/backends/backend1/servers/server2/url +curl -i -H "Accept: application/json" -X PUT -d value="1" http://localhost:2379/v2/keys/traefik/backends/backend1/servers/server2/weight # backend 2 -curl -i -H "Accept: application/json" -X PUT -d value="drr" http://localhost:4001/v2/keys/traefik/backends/backend2/loadbalancer/method -curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.4:80" http://localhost:4001/v2/keys/traefik/backends/backend2/servers/server1/url -curl -i -H "Accept: application/json" -X PUT -d value="1" http://localhost:4001/v2/keys/traefik/backends/backend2/servers/server1/weight -curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.5:80" http://localhost:4001/v2/keys/traefik/backends/backend2/servers/server2/url -curl -i -H "Accept: application/json" -X PUT -d value="2" http://localhost:4001/v2/keys/traefik/backends/backend2/servers/server2/weight +curl -i -H "Accept: application/json" -X PUT -d value="drr" http://localhost:2379/v2/keys/traefik/backends/backend2/loadbalancer/method +curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.4:80" http://localhost:2379/v2/keys/traefik/backends/backend2/servers/server1/url +curl -i -H "Accept: application/json" -X PUT -d value="1" http://localhost:2379/v2/keys/traefik/backends/backend2/servers/server1/weight +curl -i -H "Accept: application/json" -X PUT -d value="http://172.17.0.5:80" http://localhost:2379/v2/keys/traefik/backends/backend2/servers/server2/url +curl -i -H "Accept: application/json" -X PUT -d value="2" http://localhost:2379/v2/keys/traefik/backends/backend2/servers/server2/weight # frontend 1 -curl -i -H "Accept: application/json" -X PUT -d value="backend2" http://localhost:4001/v2/keys/traefik/frontends/frontend1/backend -curl -i -H "Accept: application/json" -X PUT -d value="http" http://localhost:4001/v2/keys/traefik/frontends/frontend1/entrypoints -curl -i -H "Accept: application/json" -X PUT -d value="Host:test.localhost" http://localhost:4001/v2/keys/traefik/frontends/frontend1/routes/test_1/rule +curl -i -H "Accept: application/json" -X PUT -d value="backend2" http://localhost:2379/v2/keys/traefik/frontends/frontend1/backend +curl -i -H "Accept: application/json" -X PUT -d value="http" http://localhost:2379/v2/keys/traefik/frontends/frontend1/entrypoints +curl -i -H "Accept: application/json" -X PUT -d value="Host:test.localhost" http://localhost:2379/v2/keys/traefik/frontends/frontend1/routes/test_1/rule # frontend 2 -curl -i -H "Accept: application/json" -X PUT -d value="backend1" http://localhost:4001/v2/keys/traefik/frontends/frontend2/backend -curl -i -H "Accept: application/json" -X PUT -d value="http" http://localhost:4001/v2/keys/traefik/frontends/frontend2/entrypoints -curl -i -H "Accept: application/json" -X PUT -d value="Path:/test" http://localhost:4001/v2/keys/traefik/frontends/frontend2/routes/test_2/rule +curl -i -H "Accept: application/json" -X PUT -d value="backend1" http://localhost:2379/v2/keys/traefik/frontends/frontend2/backend +curl -i -H "Accept: application/json" -X PUT -d value="http" http://localhost:2379/v2/keys/traefik/frontends/frontend2/entrypoints +curl -i -H "Accept: application/json" -X PUT -d value="Path:/test" http://localhost:2379/v2/keys/traefik/frontends/frontend2/routes/test_2/rule diff --git a/glide.lock b/glide.lock index 5a1fc5e4a..f956c44e3 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 5cb432175705882247ac2cbf708c879fad8b287afe9e1e18f06dbce1e956acd2 -updated: 2016-07-28T18:20:42.864416381+02:00 +hash: cc5b40d58d36a83c1bef13c0d269d7126c7d639ed5f7135160b9f3b9c624c7c9 +updated: 2016-07-28T19:30:16.497440179+02:00 imports: - name: github.com/abbot/go-http-auth version: cb4372376e1e00e9f6ab9ec142e029302c9e7140 @@ -267,7 +267,7 @@ imports: - name: github.com/vdemeester/shakers version: 24d7f1d6a71aa5d9cbe7390e4afb66b7eef9e1b3 - name: github.com/vulcand/oxy - version: 8d476862d38b9be356eaa83b5712cad561be08a1 + version: ab7796d7036b425fbc945853cd1b7e7adf43b0d6 repo: https://github.com/containous/oxy.git vcs: git subpackages: diff --git a/glide.yaml b/glide.yaml index 473085722..9cd0c2291 100644 --- a/glide.yaml +++ b/glide.yaml @@ -10,7 +10,7 @@ import: - package: github.com/containous/flaeg version: da9515902135a2c9071c7464a1ae660b8b24d994 - package: github.com/vulcand/oxy - version: 8d476862d38b9be356eaa83b5712cad561be08a1 + version: ab7796d7036b425fbc945853cd1b7e7adf43b0d6 repo: https://github.com/containous/oxy.git vcs: git subpackages: diff --git a/integration/etcd_test.go b/integration/etcd_test.go index 6191b05fb..092619669 100644 --- a/integration/etcd_test.go +++ b/integration/etcd_test.go @@ -31,7 +31,7 @@ func (s *EtcdSuite) SetUpTest(c *check.C) { s.composeProject.Start(c) etcd.Register() - url := s.composeProject.Container(c, "etcd").NetworkSettings.IPAddress + ":4001" + url := s.composeProject.Container(c, "etcd").NetworkSettings.IPAddress + ":2379" kv, err := libkv.NewStore( store.ETCD, []string{url}, diff --git a/integration/fixtures/etcd/simple.toml b/integration/fixtures/etcd/simple.toml index bbc35e3c6..d3180c30a 100644 --- a/integration/fixtures/etcd/simple.toml +++ b/integration/fixtures/etcd/simple.toml @@ -8,9 +8,9 @@ logLevel = "DEBUG" [etcd] - endpoint = "{{.EtcdHost}}:4001" + endpoint = "{{.EtcdHost}}:2379" prefix = "/traefik" watch = true [web] - address = ":8081" \ No newline at end of file + address = ":8081" diff --git a/script/deploy-pr.sh b/script/deploy-pr.sh index 3bd4c1869..cbf1e6c81 100755 --- a/script/deploy-pr.sh +++ b/script/deploy-pr.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -if ([ "$TRAVIS_BRANCH" = "master" ] && [ -z "$TRAVIS_TAG" ]) && [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$DOCKER_VERSION" = "1.10.1" ]; then +if ([ -z "$TRAVIS_TAG" ]) && [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$DOCKER_VERSION" = "1.10.1" ]; then echo "Deploying PR..." else echo "Skipping deploy PR" diff --git a/server.go b/server.go index b224648fc..6e93fa2cf 100644 --- a/server.go +++ b/server.go @@ -8,6 +8,7 @@ import ( "crypto/x509" "encoding/json" "errors" + "golang.org/x/net/context" "io/ioutil" "net/http" "net/url" @@ -99,20 +100,38 @@ func (server *Server) Start() { // Stop stops the server func (server *Server) Stop() { - for _, serverEntryPoint := range server.serverEntryPoints { - serverEntryPoint.httpServer.BlockingClose() + for serverEntryPointName, serverEntryPoint := range server.serverEntryPoints { + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(server.globalConfiguration.GraceTimeOut)*time.Second) + go func() { + log.Debugf("Waiting %d seconds before killing connections on entrypoint %s...", 30, serverEntryPointName) + serverEntryPoint.httpServer.BlockingClose() + cancel() + }() + <-ctx.Done() } server.stopChan <- true } // Close destroys the server func (server *Server) Close() { + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(server.globalConfiguration.GraceTimeOut)*time.Second) + go func(ctx context.Context) { + <-ctx.Done() + if ctx.Err() == context.Canceled { + return + } else if ctx.Err() == context.DeadlineExceeded { + log.Debugf("I love you all :'( ✝") + os.Exit(1) + } + }(ctx) server.routinesPool.Stop() close(server.configurationChan) close(server.configurationValidatedChan) + signal.Stop(server.signals) close(server.signals) close(server.stopChan) server.loggerMiddleware.Close() + cancel() } func (server *Server) startHTTPServers() { @@ -194,7 +213,7 @@ func (server *Server) defaultConfigurationValues(configuration *types.Configurat for backendName, backend := range configuration.Backends { _, err := types.NewLoadBalancerMethod(backend.LoadBalancer) if err != nil { - log.Warnf("Error loading load balancer method '%+v' for backend %s: %v. Using default wrr.", backend.LoadBalancer, backendName, err) + log.Debugf("Error loading load balancer method '%+v' for backend %s: %v. Using default wrr.", backend.LoadBalancer, backendName, err) backend.LoadBalancer = &types.LoadBalancer{Method: "wrr"} } } @@ -323,7 +342,10 @@ func (server *Server) createTLSConfig(entryPointName string, tlsOption *TLS, rou if _, ok := server.serverEntryPoints[server.globalConfiguration.ACME.EntryPoint]; ok { if entryPointName == server.globalConfiguration.ACME.EntryPoint { checkOnDemandDomain := func(domain string) bool { - if router.GetHandler().Match(&http.Request{URL: &url.URL{}, Host: domain}, &mux.RouteMatch{}) { + routeMatch := &mux.RouteMatch{} + router := router.GetHandler() + match := router.Match(&http.Request{URL: &url.URL{}, Host: domain}, routeMatch) + if match && routeMatch.Route != nil { return true } return false diff --git a/traefik.sample.toml b/traefik.sample.toml index 78b3079d7..266e8c0cb 100644 --- a/traefik.sample.toml +++ b/traefik.sample.toml @@ -505,7 +505,7 @@ # # Required # -# endpoint = "127.0.0.1:4001" +# endpoint = "127.0.0.1:2379" # Enable watch Etcd changes #