1
0
mirror of https://github.com/containous/traefik.git synced 2025-09-02 17:49:31 +03:00

Compare commits

...

1804 Commits

Author SHA1 Message Date
ecd51a1428 Prepare release v2.0.6 2019-12-02 18:14:05 +01:00
78097b96c9 Fix extraction for zipkin tracing 2019-12-02 14:18:07 +01:00
mpl
2af8589afd Do not give responsewriter or its headers to asynchronous logging goroutine
Co-authored-by: Julien Salleyron <julien.salleyron@gmail.com>
2019-12-02 03:14:04 +01:00
efcc9d51d4 Healthcheck managed for all related services
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
2019-11-29 12:40:05 +01:00
a87c104172 Remove Request Headers CORS Preflight Requirement 2019-11-28 15:24:06 +01:00
b2c59be8de Update router entrypoint example 2019-11-27 20:08:03 +01:00
2685e06528 Add Swarm section to the Docker Provider Documentation 2019-11-27 17:12:04 +01:00
ba49012447 Mention the experimental Helm Chart in the installation section of documentation 2019-11-27 16:02:05 +01:00
407eda0ba0 Web UI: Avoid unnecessary duplicated api calls 2019-11-27 12:04:05 +01:00
5b1dc0bfbd Change service name in rancher provider to make webui service details view work 2019-11-27 11:12:07 +01:00
00db3a0922 Web UI: Avoid some router properties to overflow their container 2019-11-23 23:18:04 +01:00
abdb3b9475 Uses, if it exists, the ping entry point provided in the static configuration
Co-authored-by: Ludovic Fernandez <ldez@users.noreply.github.com>
2019-11-20 18:34:05 +01:00
9761161163 Web UI: Fix displayed tcp service details 2019-11-20 18:26:10 +01:00
e5104021b1 doc: remove double quotes on CLI flags. 2019-11-19 10:18:05 +01:00
42a8d84a1f X-Forwarded-Proto must not skip the redirection. 2019-11-15 12:36:04 +01:00
3fd330c2fb Update go-acme/lego to 3.2.0 2019-11-15 12:06:05 +01:00
8f340afca1 Add back the security section from v1 2019-11-15 10:48:05 +01:00
e28d9426b9 doc: fix wrong acme information 2019-11-15 10:08:05 +01:00
b3078b75cd fix: location header rewrite.
Co-authored-by: Daniel Tomcej <daniel.tomcej@gmail.com>
2019-11-15 07:50:04 +01:00
424b97994e Fixed spelling error 2019-11-15 00:42:04 +01:00
1db22f4a1b Prepare release v2.0.5 2019-11-14 18:22:04 +01:00
7afd2dbd20 fix: stripPrefix middleware with empty resulting path. 2019-11-14 10:32:05 +01:00
cdb2446e32 Update ACME storage docs to remove reference to KV store in CE 2019-11-14 08:22:04 +01:00
ac8c9215cd Update tooling used for documentation 2019-11-14 00:22:03 +01:00
dfca01e469 fix typo in v1 to v2 migration guide 2019-11-13 00:34:04 +01:00
587d3f9012 Wrong endpoint on the TLS secret example 2019-11-12 17:02:05 +01:00
e30ab07439 Dashboard example with swarm 2019-11-12 15:40:05 +01:00
e6e026f420 Fix rate limiting and SSE 2019-11-12 11:06:05 +01:00
2036518813 Use alpine for v2 experimental images. 2019-11-12 10:44:05 +01:00
7536f5e83c fix: metric with services LB. 2019-11-12 10:24:05 +01:00
229402594f docs: remove field api.entryPoint 2019-11-08 15:00:06 +01:00
97873ddb5d slashes ended up in bad place. 2019-11-08 14:28:05 +01:00
dbf303d5d6 Fix quickstart link in README 2019-11-08 09:44:04 +01:00
7346b3e326 Adds missed quotes in api.md 2019-11-06 12:22:05 +01:00
93cf947e2a Improve building documentation 2019-11-05 18:10:03 +01:00
c37ad5c8bf Double dollar on docker-compose config 2019-11-05 13:22:04 +01:00
80a68de91b Upgrades zipkin library to avoid errors when using textMap. 2019-10-30 12:46:04 +01:00
6d3bad1ae0 Fix error in link description for priority 2019-10-28 23:20:03 +01:00
8b8b1427f6 Prepare release v2.0.4 2019-10-28 21:10:50 +01:00
e2d971f20e fix: release timeout. 2019-10-28 20:58:05 +01:00
9d17e8826b Prepare release v2.0.3 2019-10-28 17:50:05 +01:00
531c581cd5 Fix a typo in routing documentation for Docker 2019-10-28 17:42:05 +01:00
f790b9aa54 Add example for changing the port used by traefik to connect to a service 2019-10-28 15:50:06 +01:00
8f000423ed fix: default tracing backend. 2019-10-28 12:26:05 +01:00
4990f6c22d Allow Default Certificate to work on macOS 10.15 2019-10-28 11:52:04 +01:00
mpl
d447a50b73 Prepare release v1.7.18 2019-10-28 11:52:04 +01:00
cbecfad4df Prepare release v1.7.17 2019-10-28 11:52:04 +01:00
770a7f11a7 Avoid closing stdout when the accesslog handler is closed
Co-authored-by: Ludovic Fernandez <ldez@users.noreply.github.com>
Co-authored-by: jlevesy <julien.levesy@containo.us>
2019-10-28 11:52:04 +01:00
27a65f8745 Add note clarifying client certificate header 2019-10-28 11:52:04 +01:00
5cd06c03f0 Prepare release v1.7.16 2019-10-28 11:52:04 +01:00
43e5092c46 Prepare release v1.7.15 2019-10-28 11:52:04 +01:00
mpl
a239e3fba6 error pages: do not buffer response when it's not an error 2019-10-28 11:52:04 +01:00
743d772a80 doc: @ is not authorized in names definition. 2019-10-28 11:04:05 +01:00
1f734630b9 Improve documentation of the router rules for API and dashboard 2019-10-25 17:32:04 +02:00
355fe6195e Add documentation about backtick for rule definition. 2019-10-25 17:16:05 +02:00
d22bd5b42d Fix ldflags using incorrect pkg url 2019-10-25 16:48:06 +02:00
5327ce543b Remove unnecessary reload of the configuration. 2019-10-25 15:46:05 +02:00
3747eb59ea fix: deep copy of passHostHeader on ServersLoadBalancer. 2019-10-25 14:40:05 +02:00
2b00ab3432 fix: skip akamai url verify. 2019-10-25 14:02:09 +02:00
a6cdd701e2 Set proxy protocol logger to DEBUG level 2019-10-24 10:02:06 +02:00
c8984e6a6a Use debug for log about skipping addition of cert 2019-10-24 01:10:04 +02:00
9179aa52cf Fix Security Headers Doc 2019-10-23 11:48:05 +02:00
2042fdf3bd fix typo for stripPrefix in tab File (YAML) 2019-10-20 23:40:03 +02:00
d1c3372dc4 fix ForwardAuth tls.skipverify examples 2019-10-18 11:50:05 +02:00
3884a68889 fix: add stacktrace when recover. 2019-10-18 11:30:05 +02:00
0ec84ec597 Adding support for HTTPs backends with Kubernetes ExternalName services 2019-10-18 11:12:05 +02:00
6a9d21e9aa Fix spelling mistake: "founded" -> "found" 2019-10-18 10:54:05 +02:00
a829d44b51 Let instana/go-sensor handle default agent host 2019-10-16 22:30:05 +02:00
554e3e9e6e fix incorrect DNS reference 2019-10-16 16:40:04 +02:00
904b3b5b0b Remove obsolete v2 remark from README 2019-10-16 16:26:05 +02:00
02bdc1dcb9 Clarify unit of duration field in access log 2019-10-16 10:34:04 +02:00
b586ae2f25 Remove deadcode. 2019-10-15 16:36:05 +02:00
8492a702b2 Migration guide: pathprefixstrip migration 2019-10-14 17:26:05 +02:00
0048156379 chore(node/webui): update node to 12.11 version 2019-10-14 17:18:04 +02:00
cb3328dca3 Normalize service and router names for ingress. 2019-10-14 11:18:04 +02:00
e7b7ae94b0 fix: add filename in the file provider logs. 2019-10-11 17:20:05 +02:00
17ce295c30 Fix acme storage file docker mounting example 2019-10-11 14:34:06 +02:00
d5e3bb1b6d Prepare release v2.0.2 2019-10-09 19:12:05 +02:00
7e4e5ec6e4 Add a service sticky details vue component 2019-10-09 17:34:05 +02:00
f2656e62dc fix: default router name for k8s ingress. 2019-10-09 17:16:07 +02:00
83de97e547 fix misspelling on documentation landing page 2019-10-09 16:56:05 +02:00
b552efe770 Update apiVersion in documentation descriptor 2019-10-09 14:56:04 +02:00
1663c7c8e7 fix: ovh client int overflow. 2019-10-09 14:48:04 +02:00
1a6bef1a7e doc: update issues and PRs templates. 2019-10-09 14:28:04 +02:00
ff31e75ccc ci: reduce memory consumption of the linter 2019-10-09 11:48:04 +02:00
c87a37f804 Improve ciphersuite examples 2019-10-08 14:38:04 +02:00
76ead096aa Update 04-ingressroutes.yml 2019-10-07 15:20:06 +02:00
668ff71470 Replace ambiguous cli help message wording 2019-10-07 15:12:05 +02:00
538d5e8be4 TLS_RSA_WITH_AES_256_GCM_SHA384 is considered weak 2019-10-07 15:02:06 +02:00
b2b142a037 State clearly, that they are mutual exclusive 2019-10-07 14:48:05 +02:00
3ebed4ff40 Clarifies how to configure and access the dashboard in the api & dashboard documentations 2019-10-07 14:38:06 +02:00
a2cd69b654 Fix typo in log 2019-10-07 13:12:05 +02:00
cfc14671ed Remove deprecated videos 2019-10-07 12:52:22 +02:00
ed4b2f74ff Update scope of services and middlewares 2019-10-07 12:50:04 +02:00
dd53be7a1b typo in cli command 2019-10-07 12:32:07 +02:00
c83d7916c9 fix: typo in healthCheck examples 2019-10-07 10:14:04 +02:00
0865962f8d fix: remove extra backtick from routers docs 2019-10-07 09:58:03 +02:00
9691085bc2 Fix yaml domains example 2019-10-07 09:48:04 +02:00
b243d1c599 Add overview to API documentation 2019-10-07 09:38:04 +02:00
db6e404bda Typo in documentation 2019-10-02 16:32:05 +02:00
6f63e24dbb Add a response forwarding section to the service documentation 2019-10-01 13:26:04 +02:00
0082fe8173 $ needs escaping in docker-compose.yml 2019-09-30 18:32:04 +02:00
mpl
06d37b2a94 document providersThrottleDuration 2019-09-30 18:24:04 +02:00
48f11900d3 fix: default passHostHeader for file provider. 2019-09-30 18:12:04 +02:00
230cd28ac9 fix: return an error instead of panic. 2019-09-30 17:52:04 +02:00
mpl
86261f2b0a document serversTransport 2019-09-30 17:16:05 +02:00
30ad00fa65 doc: fix influxDB and statsD case in configuration page. 2019-09-30 14:56:05 +02:00
33a1499bdd fix: panic with metrics recorder. 2019-09-30 14:42:04 +02:00
211fa18ac2 Add the pass host header section to the services documentation 2019-09-30 11:26:06 +02:00
4c5250e850 Fix misleading text 2019-09-30 09:12:04 +02:00
788024685f Fixed typo in routing/providers/docker documentation 2019-09-27 13:08:03 +02:00
b5f07d2995 Change instances of "dymanic" to "dynamic" 2019-09-26 18:20:04 +02:00
mpl
8d7af21ff3 Prepare release v2.0.1 2019-09-26 18:02:05 +02:00
dce9278193 Add the router priority documentation 2019-09-26 15:16:05 +02:00
mpl
c6e783e7c3 clarify automatic service creation/assignment with labels 2019-09-26 12:48:05 +02:00
c8fa059064 fix: docker service name. 2019-09-26 12:26:05 +02:00
29efac3e5e fix: update linter. 2019-09-26 11:00:06 +02:00
027d313df5 fix: improve log for invalid middleware. 2019-09-26 10:04:04 +02:00
ea78808e74 fix doc about file.filename 2019-09-26 09:24:04 +02:00
mpl
6f6f999129 Do not initialize list of middlewares if not needed
Co-authored-by: Ludovic Fernandez <ldez@users.noreply.github.com>
2019-09-25 18:20:04 +02:00
b16ebd529b Update Casing on STS Header Directive 2019-09-25 16:50:16 +02:00
mpl
25deecd405 add indent to fix notes 2019-09-23 18:58:03 +02:00
17480abe85 YAML I love you 2019-09-23 17:00:06 +02:00
bfde17b4d7 Improve routing documentation 2019-09-23 14:32:04 +02:00
76263a9610 Improve TLS documentation. 2019-09-23 11:22:05 +02:00
855468e776 fix: typo in TOML for HTTP to HTTPS redirection 2019-09-23 10:30:04 +02:00
beceea9421 Wrong acme example. 2019-09-20 18:44:03 +02:00
dabc139fab doc: Flags and labels are case insensitive. 2019-09-20 17:16:05 +02:00
mpl
41aea2e336 document that /dashboard should be preferred over / 2019-09-20 17:08:04 +02:00
f929346c18 Improve documentation for the TLS section of the provider connection. 2019-09-20 17:00:05 +02:00
e699662b1e Improve the migration guide 2019-09-20 16:44:04 +02:00
90057318c8 Flag names don't need a consistent case. 2019-09-20 16:36:04 +02:00
mpl
6f2eaf3009 fixed doc typoes 2019-09-19 16:20:05 +02:00
e8fc16dc09 fix indentation for tab on migration guide 2019-09-19 11:10:04 +02:00
0f1911ba68 Return an actual server status updater 2019-09-18 17:56:05 +02:00
94699fbe00 Update links in readme. 2019-09-18 15:08:05 +02:00
mpl
a380317e2c fix typo for kubectl version 2019-09-18 12:16:04 +02:00
64bcdd4398 Improve the Migration Guide 2019-09-18 08:38:05 +02:00
7f0c9c239e fix: CNAME of the docs. 2019-09-17 17:12:04 +02:00
e0a1592e6e Fix case-sensitive header in websocket 2019-09-17 16:12:04 +02:00
3d784a14f9 Prepare release v2.0.0 2019-09-16 18:28:04 +02:00
47a9b086ea Disable collect data by default. 2019-09-16 17:26:06 +02:00
e70c8a7b46 Fix error in the documentation for CLI configuration example 2019-09-16 16:36:03 +02:00
673351d821 Fix typo in documentation 2019-09-16 15:34:05 +02:00
4b966f1f82 Web UI graph names. 2019-09-16 15:18:06 +02:00
93626de01c fix: invalid hash for github.com/labbsr0x/goh 2019-09-16 10:44:03 +02:00
7847b7685d Prepare release v2.0.0-rc4 2019-09-13 20:52:04 +02:00
255e88fbf6 Fix kubernetes id name 2019-09-13 20:44:04 +02:00
685c6dc00c Add weighted round robin load balancer on TCP
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
2019-09-13 20:00:06 +02:00
8e18d37b3d fix: logger and context. 2019-09-13 19:28:04 +02:00
b4c7b90c9e fix: boolean flag parsing with map. 2019-09-13 19:10:04 +02:00
b55be9fdea On client CloseWrite, do CloseWrite instead of Close for backend
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
2019-09-13 17:46:04 +02:00
401b3afa3b Add passHostHeader and responseForwarding in IngressRoute
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
2019-09-13 16:46:04 +02:00
7fa3537015 fix a service with one server .yaml example 2019-09-13 11:30:05 +02:00
149ed91afb fix: passHostHeader in the webUI. 2019-09-13 08:24:04 +02:00
887826ee68 Improve documentation about API and Dashboard. 2019-09-12 16:22:03 +02:00
7357d5eae2 fix: services configuration documentation. 2019-09-12 10:18:04 +02:00
e40e3af760 Prepare release v2.0.0-rc3 2019-09-10 18:58:03 +02:00
24a2788081 Prepare release v1.7.14 2019-09-10 18:30:05 +02:00
mpl
1388266102 Finish kubernetes throttling refactoring 2019-09-10 18:30:05 +02:00
43af0b051f Throttle Kubernetes config refresh 2019-09-10 18:30:05 +02:00
6e8138e19b Update golangci-lint 2019-09-10 17:52:04 +02:00
fb8edd86d5 k8s ErrorPage middleware now uses k8s service 2019-09-10 17:24:03 +02:00
34be181706 Add provider in middleware chain 2019-09-10 16:12:05 +02:00
fcc1109e76 Add more pages in the WebUI 2019-09-10 14:40:05 +02:00
mpl
2b828765e3 Improve rate limiter tests
Co-authored-by: Julien Salleyron <julien.salleyron@gmail.com>
2019-09-09 20:02:04 +02:00
25f4c23ab2 Write HTTP server logs into the global logger. 2019-09-09 14:52:04 +02:00
be90b20a5d fix: TLS domains with IngressRoute. 2019-09-09 13:52:04 +02:00
232c113dae Misc documentation fixes 2019-09-09 10:36:08 +02:00
mpl
605a9b2817 Default to CLF when accesslog format is unsupported 2019-09-09 09:24:03 +02:00
d044c0f4cc New API security 2019-09-06 15:08:04 +02:00
1959e1fd44 Auth middlewares in kubernetes CRD uses secrets 2019-09-05 13:42:04 +02:00
mpl
6712423dd1 misc documentation fixes 2019-09-05 10:48:04 +02:00
3689990bd5 Enhance the Retry Middleware Documentation
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
2019-09-04 17:28:03 +02:00
81a1f618f9 Update to go 1.13 2019-09-04 11:16:03 +02:00
b77bb690de Prepare release v2.0.0-rc2 2019-09-03 21:18:03 +02:00
f843f260ee fix: stripPrefix and stripPrefixRegex. 2019-09-03 20:32:03 +02:00
770b3739e0 The chain middleware in k8s use middlewareRef 2019-09-03 19:20:04 +02:00
261e7c1744 Fix some documentation issues 2019-09-03 18:02:05 +02:00
10acbb8d92 Don't panic with undefined middleware 2019-09-03 15:22:05 +02:00
a917115a85 fix buffering middleware 2019-09-03 15:02:05 +02:00
b8ed6f1588 Re enable ratelimit integration tests 2019-09-03 14:34:04 +02:00
3ed57e01a6 Update go version to go 1.13rc2 2019-09-03 12:18:03 +02:00
cb7c5a8ca1 Update Zipkin OpenTracing driver to latest 0.4.3 release 2019-09-03 11:52:04 +02:00
07eb9c5970 Update restrictions in the documentation. 2019-09-02 03:26:04 -07:00
306e5081d9 fix: Datadog case. 2019-09-02 03:18:04 -07:00
259c7adc81 deep-copy for MirrorService 2019-09-02 02:54:04 -07:00
af9762cf32 Improve API for the web UI 2019-09-02 02:38:04 -07:00
17554202f6 fix: stripPrefixRegex documentation. 2019-09-02 01:52:04 -07:00
0d9cf697fa Base of the migration guide
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
2019-08-31 00:28:04 -07:00
df0dd2f5e6 Add errors about unknown entryPoint in runtime api 2019-08-29 03:38:04 -07:00
38508f9a9c Fix recovered panic when websocket is mirrored 2019-08-29 01:28:05 -07:00
b113972bcf Fix trailing slash with check new version 2019-08-29 00:56:04 -07:00
72e67bf4e9 Rest provider icon in the webui 2019-08-28 05:52:05 -07:00
da8aa2d8e4 Prepare release v2.0.0-rc1 2019-08-26 10:36:03 -07:00
602a2ea541 Adds mirroring service 2019-08-26 10:00:04 -07:00
fd24b1898e Add a new dashboard page. 2019-08-26 18:15:41 +02:00
89150e1164 Update to go1.13rc1 2019-08-26 06:06:05 -07:00
e1831c4c60 Add support proxyprotocol v2 2019-08-26 05:40:04 -07:00
mpl
4ec90c5c0d Add rate limiter, rename maxConn into inFlightReq
Co-authored-by: Julien Salleyron <julien.salleyron@gmail.com>
Co-authored-by: Jean-Baptiste Doumenjou <jb.doumenjou@gmail.com>
2019-08-26 03:20:06 -07:00
a8c73f7baf Ensure WaitGroup.Done() is always called 2019-08-26 01:54:05 -07:00
6fed76a687 WeightedRoundRobin load balancer
Co-authored-by: Ludovic Fernandez <ldez@users.noreply.github.com>
2019-08-26 01:30:05 -07:00
84de444325 Bump x/sys to support Risc-V architecture 2019-08-23 07:36:04 -07:00
0fbd87ca87 Fix: CRD user guide 2019-08-23 07:20:05 -07:00
99797502eb docker-compose labels require $'s to be escaped 2019-08-20 08:08:05 -07:00
16bd0b9ca8 Removed extra colon before the 8080 docker port 2019-08-15 07:44:04 -07:00
5fdfa963f4 fix: lego version. 2019-08-15 06:52:03 -07:00
1d86e71331 fix: invalid pseudo version. 2019-08-14 14:54:03 -07:00
9e3f549341 Add TLS-enabled Router 2019-08-14 10:16:06 -07:00
2895ad21f3 Correct Kubernetes Ingress and IngressRoute port heuristic for choosing HTTPS 2019-08-14 09:58:04 -07:00
5731ae7f47 Fix url.Parse due to go1.12.8 changes. 2019-08-14 09:16:04 -07:00
51f7d9a07f Split runtime.go 2019-08-14 08:28:04 -07:00
6be390c795 feat(webui): add doc and version in navbar 2019-08-12 08:48:04 -07:00
0f32de4aa2 tests: improve timeout.
- upgrade k3s to v0.8.0
2019-08-12 05:06:04 -07:00
5d01452648 doc: contributing guide. 2019-08-12 05:06:04 -07:00
51b0508512 scripts: makefile, dockerfile, travis, ... 2019-08-12 05:06:04 -07:00
4c5e7a238d chore: go module 2019-08-12 05:06:04 -07:00
f327b7b499 chore: ignore vendor. 2019-08-12 05:06:04 -07:00
306e86c9c6 kill: the vendor. 2019-08-12 05:06:04 -07:00
9024f1b444 doc: update lego. 2019-08-12 00:36:04 -07:00
fc26e8c194 Prepare release v1.7.13 2019-08-12 00:36:04 -07:00
ffd8e5667c Wrr loadbalancer honors old weight on recovered servers 2019-08-12 00:36:04 -07:00
9299c3abc7 Add missing KeyUsages for default generated certificate 2019-08-12 00:36:04 -07:00
63a07fe6cf Add a docker-compose & let's encrypt user-guide 2019-08-06 08:46:04 -07:00
c2d440a914 chore: update docker and k8s 2019-08-05 09:24:03 -07:00
2b5c7f9e91 [Docs] YAML indent for domains under TLS section 2019-08-05 08:22:04 -07:00
91e63dea47 Apply the case of the CLI flags for the configuration 2019-08-05 06:22:03 -07:00
cd164de776 Add Feature-Policy header support 2019-07-29 07:12:05 -07:00
c0ef5ce512 Fix prometheus metrics 2019-07-24 12:38:03 +02:00
7c852fbf33 refactor(webui): use components to split Home concerns 2019-07-22 11:06:04 +02:00
28500989bc Improve acme logs. 2019-07-22 10:16:04 +02:00
75c99a0491 doc: improve examples. 2019-07-22 09:58:04 +02:00
8b4ba3cb67 Fix malformed rule 2019-07-22 09:24:04 +02:00
Jan
3ef2971c3f Fix acme example 2019-07-19 18:06:03 +02:00
a5aa8c6006 Prepare release v2.0.0-beta1 2019-07-19 17:18:03 +02:00
Jan
022d14abe1 Fixed a typo in label. 2019-07-19 17:00:05 +02:00
1800b0b69c Improve error on router without service.
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
2019-07-19 16:42:04 +02:00
c39a550b00 Lets encrypt documentation typo 2019-07-19 15:52:03 +02:00
mpl
092aa8fa6d API: remove configuration of Entrypoint and Middlewares
Co-authored-by: Julien Salleyron <julien.salleyron@gmail.com>
2019-07-19 12:28:07 +02:00
f75f73f3d2 Certificate resolvers.
Co-authored-by: Julien Salleyron <julien.salleyron@gmail.com>
Co-authored-by: Jean-Baptiste Doumenjou <jb.doumenjou@gmail.com>
2019-07-19 11:52:04 +02:00
e3627e9cba Disable RateLimit temporarily 2019-07-19 10:50:05 +02:00
mpl
d5f4934acf Add documentation about Kubernetes Ingress provider 2019-07-19 09:50:04 +02:00
693bd7e110 Add a basic Traefik install guide 2019-07-19 09:24:04 +02:00
4d8dcdc623 feat(webui/dashboard): init new dashboard 2019-07-18 22:36:04 +02:00
8e97af8dc3 Add Metrics 2019-07-18 21:36:05 +02:00
4dc448056c fix: TLS configuration from directory. 2019-07-18 16:26:05 +02:00
68c349bbfa Manage status for TCP element in the endpoint overview. 2019-07-18 15:56:04 +02:00
75aedc8e94 Fixed doc link for AlibabaCloud 2019-07-17 20:12:04 +02:00
8b08f89d2c Allows logs to use local time zone instead of UTC
Co-authored-by: Ludovic Fernandez <ldez@users.noreply.github.com>
2019-07-17 20:12:04 +02:00
889b38f75a Improve tracing documentation 2019-07-16 09:54:04 +02:00
a17ac23457 Update Dynamic Configuration Reference for both Docker and Marathon 2019-07-16 06:48:03 +02:00
mpl
6fdd48509e config: deal with multiple errors and their criticality
Co-authored-by: Julien Salleyron <julien.salleyron@gmail.com>
2019-07-15 17:04:04 +02:00
62800116d3 Add Jaeger collector endpoint 2019-07-15 14:52:04 +02:00
1bccbf061b refactor(webui): use @vue/cli to bootstrap new ui 2019-07-15 10:58:03 +02:00
093658836e Restrict traefik.toml to static configuration. 2019-07-15 10:22:03 +02:00
f49800e56a user guide: fix a mistake in the deployment definition 2019-07-15 10:00:06 +02:00
e478dbeb85 Docker URL 2019-07-15 07:06:03 +02:00
51486b18fa Enhance REST provider 2019-07-13 01:24:03 +02:00
48d98dcf45 Update docker version for build 2019-07-12 21:14:03 +02:00
2c7cfd1c68 Expand Client Auth Type configuration 2019-07-12 17:50:04 +02:00
7a4b4c941c Update dep version 2019-07-12 15:36:04 +02:00
608ccb0ca1 Update golangci-lint 2019-07-12 15:04:03 +02:00
3f6ea04048 Properly add response headers for CORS 2019-07-12 11:46:04 +02:00
74c5ec70a9 Improve API endpoints 2019-07-12 11:10:03 +02:00
c8bf8e896a Move dynamic config into a dedicated package. 2019-07-10 09:26:04 +02:00
09cc1161c9 Generate deepcopy for configuration struct 2019-07-09 15:18:04 +02:00
8ab33db51a Renamed kubernetes provider in kubernetesIngress provider 2019-07-08 21:36:03 +02:00
cc4258bf9d Remove X-Forwarded-(Uri, Method, Tls-Client-Cert and Tls-Client-Cert-Info) from untrusted IP 2019-07-08 17:56:04 +02:00
0ee5d3d83f Automatic generation of the doc for the CLI flags and env vars. 2019-07-08 11:00:04 +02:00
c39aa5e857 Add scheme to IngressRoute. 2019-07-05 17:24:04 +02:00
mpl
39aae4167e TLSOptions: handle conflict: same host name, different TLS options
Co-authored-by: Julien Salleyron <julien.salleyron@gmail.com>
2019-07-03 19:22:05 +02:00
9db9143366 Improve providers documentation. 2019-07-02 17:36:04 +02:00
49814b92fe Prepare release v2.0.0-alpha8 2019-07-01 19:36:04 +02:00
260b5d6b0d Add gRPC user guide 2019-07-01 15:28:04 +02:00
4360ca14c1 Use h2c from x/net to handle h2c requests
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
2019-07-01 15:08:04 +02:00
c7d336f958 Use the same case everywhere 2019-07-01 11:30:05 +02:00
f6436663eb Make HTTP Keep-Alive timeout configurable for backend connections 2019-06-28 00:36:04 +02:00
84d7c65039 Improve tracing 2019-06-28 00:16:04 +02:00
4245096be4 Define a TLS section to group TLS, TLSOptions, and TLSStores.
Co-authored-by: Jean-Baptiste Doumenjou <jb.doumenjou@gmail.com>
2019-06-27 23:58:03 +02:00
c9b2a07bc7 Drop headers by default in access logs. 2019-06-27 16:04:03 +02:00
e69d4cba88 Support YAML for the dynamic configuration. 2019-06-26 18:18:04 +02:00
mpl
96962dd21f Handle cross-provider middleware in kubernetes CRD
Co-authored-by: Julien Salleyron <julien.salleyron@gmail.com>
2019-06-26 14:14:05 +02:00
36d48224b5 fix: error log message. 2019-06-26 09:10:03 +02:00
53779d6ceb Adding content-header to api endpoints 2019-06-25 17:44:03 +02:00
mpl
e7e268b3bd doc/crd-acme: specify required kubectl version 2019-06-25 14:50:04 +02:00
ca2f76fe1f Update Slack support channel references to Discourse community forum 2019-06-25 10:08:04 +02:00
4d44ab9628 Change the loading resource order 2019-06-24 16:40:06 +02:00
dd62051e6c Improve middleware documentation. 2019-06-24 06:04:03 +02:00
fdb1701d1b Prepare release v2.0.0-alpha7 2019-06-21 17:46:02 +02:00
80b35575df Define TLS options on the Router configuration for Kubernetes
Co-authored-by: juliens <julien@containo.us>
2019-06-21 17:18:05 +02:00
69cf05df9a Fix panic in tls manager 2019-06-21 16:32:04 +02:00
69a1817c3f Improve some parts of the documentation. 2019-06-21 10:54:04 +02:00
a918dcd5a4 Filter env vars configuration 2019-06-21 10:08:04 +02:00
adc9a65ae3 Use name@provider instead of provider@name. 2019-06-21 09:54:04 +02:00
1e779f7135 Fix some CLI bugs 2019-06-21 09:40:04 +02:00
fe68e9e243 New constraints management.
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
2019-06-21 09:24:04 +02:00
e9792b446f Change the provider separator from . to @ 2019-06-20 00:40:05 +02:00
mpl
4012599264 docs: rewrite of the HTTPS and TLS section
Co-authored-by: Ludovic Fernandez <ldez@users.noreply.github.com>
2019-06-19 19:00:06 +02:00
mpl
429b1d8574 API: new contract
Co-authored-by: Ludovic Fernandez <ldez@users.noreply.github.com>
2019-06-19 18:34:04 +02:00
a34876d700 Display an error when help is called on a non existing command. 2019-06-19 14:08:05 +02:00
68ecf78f0e Upgrade k3s version 2019-06-18 22:32:05 +02:00
38344b342d Prepare release v2.0.0-alpha6. 2019-06-18 18:10:06 +02:00
346ff96de2 Kubernetes CRD documentation fixes 2019-06-18 12:20:04 +02:00
31614bebc4 Don't allow non flag arguments by default. 2019-06-18 12:10:06 +02:00
be888b59a6 doc: fix middleware names for CRD. 2019-06-18 09:50:05 +02:00
6069df6cbd fix: revert deploy script. 2019-06-17 23:40:05 +02:00
5e7b6e4860 fix: deploy script. 2019-06-17 22:14:05 +02:00
ea6fa6e889 Prepare release v2.0.0-alpha5 2019-06-17 19:38:04 +02:00
3e914256ce Update headers middleware docs for kubernetes crd 2019-06-17 18:30:05 +02:00
85ce16b34f Define TLS options on the Router configuration
Co-authored-by: juliens <julien@containo.us>
2019-06-17 18:14:08 +02:00
d306c8fd50 change doc references to scheme[Rr]edirect -> redirect[Ss]cheme 2019-06-17 18:00:07 +02:00
8d7eccad5d New static configuration loading system.
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
2019-06-17 11:48:05 +02:00
d18edd6f77 HttpOnly and Secure flags on the affinity cookie 2019-06-13 00:42:06 +02:00
cad3704efd Add Mathieu Lonjaret to maintainers 2019-06-12 23:04:03 +02:00
9a4b455c3f Correct typo in documentation on rate limiting 2019-06-12 17:22:07 +02:00
01c8798e4e Update docker api version 2019-06-12 02:54:03 +02:00
61744fba11 Prepare release v1.7.12 2019-06-12 02:54:03 +02:00
0034bef6b9 Update lego. 2019-06-12 02:54:03 +02:00
63c3ed3931 Add missing callback on close of hijacked connections 2019-06-12 02:54:03 +02:00
8a5db8a3ee Adds a log fields documentation. 2019-06-12 02:54:03 +02:00
adc2b62c22 Upgraded DataDog tracing library to 1.14.0 2019-06-12 02:54:03 +02:00
1f2fe08c33 Allow SANs for wildcards domain. 2019-06-12 02:54:03 +02:00
77b1933833 Fix Kubernetes Docs for Middlewares 2019-06-11 20:42:04 +02:00
mpl
c4df78b4b9 Add support for TCP (in kubernetes CRD)
Co-authored-by: Jean-Baptiste Doumenjou <jb.doumenjou@gmail.com>
2019-06-11 15:12:04 +02:00
c1dc783512 Remove first byte wait when tcp catches all 2019-06-07 19:30:07 +02:00
518a37e776 rework loadbalancer support 2019-06-05 22:18:06 +02:00
b143101f82 Specify that Rancher provider is for 1.x only 2019-06-04 00:46:05 +02:00
2be6f4d153 Docs: improve the "reading path" for new contributers 2019-05-27 18:22:04 +02:00
ac612734c8 fix the documentation about middleware labels. 2019-05-27 18:10:04 +02:00
ffe69c67fc Entry points CLI description. 2019-05-27 18:02:06 +02:00
b3057a0ec3 Fix typo in the CRD documentation 2019-05-27 10:24:04 +02:00
mpl
563f059e73 Fix typos in data collection message 2019-05-21 17:12:09 +02:00
6bbe7262ef documentation remove traefik.port. 2019-05-20 11:14:04 +02:00
55a1a81010 Fixed readme misspelling 2019-05-17 13:40:04 +02:00
97ec764db7 Fix typos in documentation 2019-05-17 13:32:05 +02:00
mpl
f6df556eb0 API: expose runtime representation
Co-authored-by: Julien Salleyron <julien.salleyron@gmail.com>
Co-authored-by: Jean-Baptiste Doumenjou <jb.doumenjou@gmail.com>
2019-05-16 10:58:06 +02:00
5cd9396dae Fix regression on plumbing scripts for developer usages 2019-05-14 19:58:04 +02:00
886a6bdbe0 Add shell script linting with shellcheck for better portability 2019-05-10 17:24:06 +02:00
ab60e702d2 Remove old docs folder. 2019-05-10 10:16:05 +02:00
17141b3589 Remove timeout/interval from the ACME Provider 2019-05-10 09:58:05 +02:00
8f23243cb8 Add note about ACME renewal 2019-05-09 15:22:05 +02:00
c2345c6e9a Don't add TCP proxy when error occurs during creation. 2019-05-09 14:30:06 +02:00
2617de2cdd Clarify docs with labels in Swarm Mode 2019-05-09 08:32:04 +02:00
9cf6827ccc Added support for Haystack tracing 2019-05-09 00:14:04 +02:00
681892148e fix: typo in routing example. 2019-05-06 18:28:04 +02:00
558452a143 Fixed spelling typo 2019-05-06 17:44:04 +02:00
5a173fa968 Allow matching with FQDN hosts with trailing periods 2019-05-06 17:16:03 +02:00
72397ef90c Fix make validate on MacOS outside container 2019-05-06 09:40:03 +02:00
79ad4b4544 Clarification of the correct pronunciation of the word "Traefik" 2019-05-03 12:14:04 +02:00
49f3713c4f docker-compose basic auth needs dubble dollar signs 2019-05-03 10:16:06 +02:00
4b5c3ccf58 Adds a reference to the middleware overview. 2019-04-29 19:36:07 +02:00
21dec70971 Fix strip prefix documentation 2019-04-29 19:00:05 +02:00
0f2b774ea1 fix: Rancher documentation. 2019-04-26 11:48:04 +02:00
e929caf15a Prepare release v1.7.11 2019-04-26 11:26:04 +02:00
8d848c3d60 fix: update lego. 2019-04-26 11:26:04 +02:00
b8b0c8f3e5 compress link fixed 2019-04-25 17:54:05 +02:00
15e78da7eb Minor fix in documentation 2019-04-24 18:04:08 +02:00
d80700810f Review documentation 2019-04-24 17:44:04 +02:00
c1de6abf23 Fix a typo in documentation 2019-04-23 17:40:04 +02:00
01b916eaa0 Prepare release v2.0.0-alpha4. 2019-04-17 12:10:04 +02:00
62c03b3318 k8s static configuration explanation 2019-04-17 11:48:05 +02:00
65679af61d Remove dumpcerts.sh 2019-04-17 11:36:04 +02:00
821ad31cf6 Enhance Marathon documentation 2019-04-17 10:58:04 +02:00
mpl
ea750ad813 Improve log message about redundant TLS certificate 2019-04-17 10:38:04 +02:00
3d7633f4a6 Forward all header values from forward auth response 2019-04-17 10:38:04 +02:00
d356ef1c5b Documentation Update: Hosting.de wildcard support tested 2019-04-17 10:38:04 +02:00
fce762febf Update Wildcard Domain documentation 2019-04-17 10:38:04 +02:00
535280c162 doc: middleware -> middlewares. 2019-04-17 09:34:04 +02:00
bb8a193244 log.loglevel becomes log.level in configuration 2019-04-16 15:30:09 +02:00
e6bdfa1d29 Checksum file name. 2019-04-16 14:50:05 +02:00
d1d2611665 Handle TCP in the marathon provider
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
2019-04-15 18:22:07 +02:00
8389b46b5c Use the same case every where for entryPoints. 2019-04-15 11:14:05 +02:00
b9f826554c Adds a note in traefik.sample.toml 2019-04-12 19:42:03 +02:00
0750235712 fix: configuration for integration tests. 2019-04-09 17:24:05 +02:00
ee0e014617 Insensitive case for allow-empty value. 2019-04-09 16:50:06 +02:00
2e20394af4 Update the middleware documentation 2019-04-08 17:14:08 +02:00
6ab991ebf4 Fix typo in tracing docs 2019-04-08 17:00:08 +02:00
ef8894ef26 Fix EOF error 2019-04-08 12:24:05 +02:00
8b4efa1760 Get Structor version from CI env var. 2019-04-08 08:46:04 +02:00
mpl
b0b8b75258 Fix doc about removing headers 2019-04-05 15:18:04 +02:00
2e19e45aa4 Remove github.com/satori/go.uuid. 2019-04-05 12:44:03 +02:00
e1d097ea20 Add Rancher provider again 2019-04-05 12:22:04 +02:00
ed12366d52 Update tracing dependencies 2019-04-05 11:58:06 +02:00
4919b638f9 Improve the Documentation with a Reference Section 2019-04-05 11:32:04 +02:00
mpl
49563e638b Fix response modifier initial building
Co-authored-by: Ludovic Fernandez <ldez@users.noreply.github.com>
2019-04-04 11:50:04 +02:00
07d0eb9ae6 Adds middlewares examples for k8s. 2019-04-03 14:32:04 +02:00
mpl
336135c392 Set X-Forwarded-* headers
Co-authored-by: Julien Salleyron <julien.salleyron@gmail.com>
2019-04-02 16:56:04 +02:00
d2b38e6ac4 Enable CORS configuration 2019-04-02 10:40:04 +02:00
883f90dded fix: remove invalid commas. 2019-04-01 17:56:04 +02:00
58e82743f8 Update to v2.0 readme links 2019-04-01 17:14:03 +02:00
51a0994d2d Update certificates for some Docker images 2019-04-01 16:48:08 +02:00
da20db862d fix: validation system 2019-04-01 15:30:07 +02:00
d6c9f51082 Prepare release v1.7.10 2019-03-29 18:46:04 +01:00
08d7bb0d08 Remove thoas/stats fork 2019-03-29 18:46:04 +01:00
1bcb3d8cc2 Added support for configuring trace headers for DataDog tracing 2019-03-29 18:46:04 +01:00
c17de070fb fix: update lego. 2019-03-29 18:46:04 +01:00
b893374dc1 Add _FILE Environment Variable Documentation 2019-03-29 18:46:04 +01:00
fe532ed4f2 Fix two minor nits in Traefik 2.0 docs 2019-03-29 16:38:04 +01:00
6377a19b12 Prepare release v2.0.0-alpha3. 2019-03-29 15:34:04 +01:00
ca7ea68a6a Adds notes about incompatibility between 1.X and 2.X configurations. 2019-03-29 13:12:05 +01:00
a45f285a5c Enhance middleware examples. 2019-03-29 12:34:05 +01:00
fa2c57f7cb Review Makefile 2019-03-28 11:42:06 +01:00
mpl
0779c6a139 Full ACME+CRD example
Co-authored-by: Jean-Baptiste Doumenjou <jb.doumenjou@gmail.com>
2019-03-27 15:16:04 +01:00
2916f540c1 Remove BaseProvider 2019-03-27 15:02:06 +01:00
7932e317c8 Clarify that manual dnsChallenge provider works only when run as docker run -it 2019-03-27 12:08:04 +01:00
fd26cf265d Fix some minors errors on the documentation 2019-03-26 16:32:06 +01:00
mpl
3e76c25887 Document the TLS with ACME case
Co-authored-by: Julien Salleyron <julien.salleyron@gmail.com>
2019-03-26 11:12:04 +01:00
a0e2f47679 Update traefik.sample.toml 2019-03-25 17:20:04 +01:00
d70add10ab Fix typos in docs 2019-03-25 16:54:03 +01:00
119d0134e0 Documentation Updates: docker-compose examples 2019-03-22 15:22:08 +01:00
2e085fa253 Remove old links in readme 2019-03-22 15:16:06 +01:00
f8f7edd124 Fix panic while server shutdown 2019-03-21 15:54:07 +01:00
79ecff7b42 Fix Getting started 2019-03-21 15:34:04 +01:00
0f2c4fb5f4 Add support for tcp labels in docker provider 2019-03-21 15:22:06 +01:00
ec1952157b Fix typo in forwardauth middleware documentation 2019-03-20 16:36:10 +01:00
cd38359458 Fix dead maintainers link on the README.md 2019-03-20 16:30:07 +01:00
8a86777db8 Prepare release v2.0.0-alpha2 2019-03-19 19:24:07 +01:00
e7033071b9 change docs and adjust dashboard for v2 alpha
Co-authored-by: Jean-Baptiste Doumenjou <jb.doumenjou@gmail.com>
2019-03-19 17:54:10 +01:00
mpl
f99a473436 Fix log msgs about label selector 2019-03-19 17:30:04 +01:00
mpl
c4b7e8f288 doc: kubernetes CRD provider
Co-authored-by: Jean-Baptiste Doumenjou <jb.doumenjou@gmail.com>
2019-03-19 16:44:06 +01:00
f346251719 Fix new build system for experimental Docker image. 2019-03-19 12:24:04 +01:00
4c3cf87f62 New build system for experimental Docker image. 2019-03-19 11:50:03 +01:00
cb417b8077 Fix problem in aggregator provider 2019-03-19 10:04:04 +01:00
076d6abfe4 Change deploy script. 2019-03-19 09:04:04 +01:00
82308c9a53 chore: release draft mode. 2019-03-18 17:20:42 +01:00
5d35079809 Prepare release v2.0.0-alpha1 2019-03-18 15:18:04 +01:00
50e24f461c Remove IngressEndpoint in CRD provider 2019-03-18 14:38:04 +01:00
37886892c8 Adds a maintainer's page into the documentation. 2019-03-18 12:04:04 +01:00
72ffa91fe0 Clean old 2019-03-18 11:30:07 +01:00
9908137638 Enhance acme page. 2019-03-18 10:50:05 +01:00
f3ecc040c8 (re)Add update ingress status 2019-03-18 10:10:04 +01:00
e271378a97 Clean files during tests. 2019-03-18 09:34:03 +01:00
5d050ae3ac Allow user to configure traefik log 2019-03-15 15:46:06 +01:00
615ceab597 Fix lock problem in server 2019-03-15 10:04:05 +01:00
f1b085fa36 Move code to pkg 2019-03-15 09:42:03 +01:00
bd4c822670 Update anonymize/collect 2019-03-14 19:32:03 +01:00
mpl
03d5a95bde Remove everything templates related 2019-03-14 17:32:11 +01:00
e2ec64947a Update the file provider documentation 2019-03-14 16:46:05 +01:00
dabd9e2208 New packaging system. 2019-03-14 16:22:04 +01:00
4c060a78cc Custom resource definition
Co-authored-by: Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
2019-03-14 15:56:06 +01:00
cfaf47c8a2 Use rule HostSNI in documentation 2019-03-14 12:16:03 +01:00
87da7520de Migrate to go-acme/lego. 2019-03-14 11:04:04 +01:00
4a68d29ce2 Add a new protocol
Co-authored-by: Gérald Croës <gerald@containo.us>
2019-03-14 09:30:04 +01:00
0ca2149408 Synchronize documentation 2019-03-13 16:40:05 +01:00
0cfaab02c0 k8s integration tests 2019-03-11 14:54:05 +01:00
2d54065082 feat(webui): migrate to a work in progress webui 2019-03-08 14:08:03 +01:00
3cfbe7cf6d Travis: switch fallback dockerfile for structor 2019-03-06 16:22:06 +01:00
e2d8a95c91 Update the kubernetes provider 2019-03-06 16:22:06 +01:00
3419f9aeb9 Remove the bug command 2019-03-05 18:14:03 +01:00
ebded2cbc0 feat: new linting system. 2019-03-04 16:40:05 +01:00
fb617044e0 Update to Go1.12
Co-authored-by: juliens <julien@containo.us>
2019-03-01 11:48:04 +01:00
5a0b5470e7 Fixed dead link in README.md 2019-02-28 16:44:03 +01:00
6b4144ad10 fix: image links. 2019-02-27 14:58:04 +01:00
8f16ff9c49 chore(webui): dropping rxjs-compat in favor of pipe 2019-02-26 16:48:07 +01:00
ac6b11037d Documentation Revamp
Co-authored-by: jbdoumenjou <jb.doumenjou@gmail.com>
2019-02-26 14:50:07 +01:00
848e45c22c Adds Kubernetes provider support
Co-authored-by: Julien Salleyron <julien@containo.us>
2019-02-21 23:08:05 +01:00
2c0bf335ba Update Structor to v1.4.0 2019-02-21 10:38:03 +01:00
aef24dd74b Instana tracer implementation 2019-02-18 16:52:03 +01:00
c2c6aee18a Applies new goimports recommendations. 2019-02-18 07:52:03 +01:00
6451b47621 Prepare release v1.7.9 2019-02-13 17:26:04 +01:00
2b2cfdfb32 Updates of Lego. 2019-02-13 17:26:04 +01:00
5f4d440493 Fixes the display of the associativity rules. 2019-02-13 17:26:04 +01:00
5f0451affe Fixed curl example 2019-02-13 17:26:04 +01:00
156f6b8d3c Add Tracing Header Context Name option for Jaeger 2019-02-13 17:26:04 +01:00
f0ee2890b2 app-root on non-explicit path include "/" in the redirect 2019-02-13 17:26:04 +01:00
16c283c91a Update default value in docs of buckets for Prometheus 2019-02-13 17:26:04 +01:00
db13dbdf46 fix missing trailers with retry 2019-02-13 17:26:04 +01:00
06905cb14a handle errors when working with rancher 2019-02-13 17:26:04 +01:00
6ea9c4dd3f doc: update change log. 2019-02-13 17:26:04 +01:00
c5c8382742 chore(webui): format code with prettier 2019-02-05 18:18:04 +01:00
115ddc6a4a refactor: applies linting. 2019-02-05 17:10:03 +01:00
54ca0ce34f chore(lint): include lint in build process 2019-02-05 16:50:05 +01:00
f19c497621 Updates Backoff 2019-02-04 16:38:08 +01:00
0561a20c06 chore(webui): upgrade angular cli version 2019-02-01 16:30:06 +01:00
162490dadf chore(webui): ignore target/dependencies in docker copy 2019-02-01 00:20:04 +01:00
30087794ba chore(webui): update docker node version 2019-02-01 00:04:04 +01:00
9ebe3c38b2 New rule syntax
Co-authored-by: jbdoumenjou <jb.doumenjou@gmail.com>
2019-01-30 16:24:07 +01:00
7155f0d50d Prepare release v1.7.8 2019-01-30 14:00:05 +01:00
75e05ca142 Check for dynamic tls updates on configuration preload 2019-01-30 14:00:05 +01:00
5d4423910d Fixes docker swarm mode refresh second for KV. 2019-01-30 14:00:05 +01:00
0de1ff8634 Support Datadog tracer priority sampling 2019-01-30 14:00:05 +01:00
e5fb1ffeb7 Updates lego. 2019-01-30 14:00:05 +01:00
8c53318dac Generic awsvpc support, not just Fargate 2019-01-30 14:00:05 +01:00
0d6f259adc Cache exising task definitions to avoid rate limiting 2019-01-30 14:00:05 +01:00
85ab0e6e70 Minor formatting fixes 2019-01-30 14:00:05 +01:00
a18294d417 Route priorities: document minimum priority value 2019-01-30 14:00:05 +01:00
fecd0ca391 Note about quotes for entrypoint definition with docker-compose 2019-01-30 14:00:05 +01:00
97bd92c76f Assert that test timeout service is ready. 2019-01-30 14:00:05 +01:00
rbq
49b89c30d8 Allow Træfik to update Ingress status 2019-01-30 14:00:05 +01:00
8228a8e3f7 doc: more detailed info about Google Cloud DNS. 2019-01-30 14:00:05 +01:00
78be3df99a Tested wildcard ACME challenge with DNSimple 2019-01-30 14:00:05 +01:00
2f0db9a974 doc missing information about statistics parameter 2019-01-30 14:00:05 +01:00
227fab3867 fix: update lego. 2019-01-30 14:00:05 +01:00
9537449b07 Happy 2019 2019-01-30 14:00:05 +01:00
246b245959 Adds Marathon support.
Co-authored-by: Julien Salleyron <julien@containo.us>
2019-01-29 17:54:05 +01:00
a433e469cc SchemeRedirect Middleware
Co-authored-by: jbdoumenjou <jb.doumenjou@gmail.com>
2019-01-22 08:30:04 +01:00
04958c6951 Adds default rule system on Docker provider.
Co-authored-by: Julien Salleyron <julien@containo.us>
2019-01-21 19:06:02 +01:00
b54c956c5e Adds Docker provider support
Co-authored-by: Julien Salleyron <julien@containo.us>
2019-01-18 15:18:04 +01:00
8735263930 Enables the use of elements declared in other providers 2019-01-15 14:28:04 +01:00
a79d6aa669 Add forwarded headers on entry point configuration 2019-01-15 09:44:03 +01:00
7efafa5a2c Migrates the pass client tls cert middleware 2019-01-09 11:28:04 +01:00
0b436563bd refactor: remove old acme provider. 2019-01-08 14:32:04 +01:00
5d379dc3e3 Prepare release v1.7.7 2019-01-08 14:32:04 +01:00
8c60774c6a Add Pass TLS Cert Issuer and Domain Component 2019-01-08 14:32:04 +01:00
9b2423aaba Update Lego 2019-01-08 14:32:04 +01:00
fc8c24e987 Retry middleware : store headers per attempts and propagate them when responding. 2019-01-08 14:32:04 +01:00
d7bd69714d Redirection status codes for methods different than GET 2019-01-08 14:32:04 +01:00
099bbb8be7 Skip TLS section with no secret in Kubernetes ingress 2019-01-08 14:32:04 +01:00
c29a69a60d Harden Traefik systemd service 2019-01-08 14:32:04 +01:00
69e4f35d9a Test and exit for jq error before domain loop 2019-01-08 14:32:04 +01:00
ff40467207 Fix html-proofer and nokogiri version 2019-01-08 14:32:04 +01:00
190c6c661f Letsencrypt - Add info on httpreq format 2019-01-08 14:32:04 +01:00
e633799c14 Proposing a small update to documentation 2019-01-08 14:32:04 +01:00
f7c6c562a5 Allow empty path with App-root annotation 2019-01-08 14:32:04 +01:00
bc6e9d5042 Check for watched namespace before getting kubernetes objects 2019-01-08 14:32:04 +01:00
a0b1d54012 kubernetes: sort and uniq TLS secrets 2019-01-08 14:32:04 +01:00
60b5286f8c Check for anchors (hashes) for external links on the documentation 2019-01-08 14:32:04 +01:00
aa3ea17a8f Rephrase the traefik.backend definition in documentation 2019-01-08 14:32:04 +01:00
698621f127 Update broken link for Docker service constraints 2019-01-08 14:32:04 +01:00
906f4fe8f7 dep: fix constraint with dep >= 0.5.0 2019-01-07 16:48:03 +01:00
ddf199566c Prepare release v1.7.6 2018-12-17 15:18:03 +01:00
a47d770e71 Fix label segmentation when using custom prefix 2018-12-17 15:18:03 +01:00
057498ed01 Support canary weight for external name service 2018-12-05 14:32:03 +01:00
fa562dc916 Query params in health check 2018-12-05 14:32:03 +01:00
0be895febb frame-deny should be set to true to enable the header 2018-12-05 14:32:03 +01:00
11a0078966 Labels parser. 2018-12-04 14:24:04 +01:00
92f8e5cd3f Prepare release v1.7.5 2018-12-04 11:42:03 +01:00
5b3762be08 Implement Case-insensitive SNI matching 2018-12-04 11:42:03 +01:00
3b01488c8d [docker backend] - Add config flag to set refreshSeconds for swarmmode ticker 2018-12-04 11:42:03 +01:00
2f65572247 Filter ECS tasks by LastStatus before adding to list of service tasks 2018-12-04 11:42:03 +01:00
e42ddfc3d6 Log configuration errors from providers and keeps listening 2018-12-04 11:42:03 +01:00
d63636243c Fix upgrade flaeg 2018-12-04 11:42:03 +01:00
a0b9c0d007 Fix unannonced trailers problem when body is empty 2018-12-04 11:42:03 +01:00
1f7a4174ba Matcher associativity rule. 2018-12-04 11:42:03 +01:00
761c58e040 Add a "Security Consideration" section in the Docker's backend section of the documentation 2018-12-04 11:42:03 +01:00
01c3d3905c Remove Deprecated StorageFile 2018-12-03 11:54:04 +01:00
c815a732ef Migrate rest provider 2018-12-03 11:32:05 +01:00
5d91c7e15c Remove old global config and use new static config 2018-11-27 17:42:04 +01:00
c39d21c178 Update swarm mode endpoint 2018-11-26 11:02:05 +01:00
b6498cdcbc Cherry pick v1.7 into master 2018-11-19 16:40:03 +01:00
a09dfa3ce1 Dynamic Configuration Refactoring 2018-11-14 10:18:03 +01:00
d3ae88f108 Merge tag 'v1.7.4' into master 2018-10-30 12:34:00 +01:00
1fad7e5a1c Prepare release v1.7.4 2018-10-30 11:32:04 +01:00
19546ab518 Fix mistake in the documentation of several backends (#4133) 2018-10-30 10:49:41 +01:00
e6e9a86919 Add flush interval option on backend 2018-10-29 18:42:03 +01:00
c6dd1dccc3 add static redirect 2018-10-29 16:48:06 +01:00
993caf5058 Fix access log field parsing 2018-10-29 16:24:04 +01:00
450471d30a Add the missing pass-client-tls annotation to the kubernetes provider 2018-10-29 16:02:06 +01:00
7eeecd23ac Provider docker shutdown problem 2018-10-29 15:30:04 +01:00
21c94141ba Update docs/configuration/acme.md 2018-10-29 14:58:03 +01:00
bc2cba5aa4 Removed unused imports 2018-10-29 14:44:03 +01:00
5e49354bf2 acme: exoscale move from .ch to .com 2018-10-29 14:20:03 +01:00
55334b2062 Fix display of client username field 2018-10-25 18:00:05 +02:00
74dc5b1c58 Support custom DNS resolvers for Let's Encrypt. 2018-10-25 17:38:04 +02:00
ac11323fdd Replaces emilevauge/whoami by containous/whoami in the documentation 2018-10-25 17:04:03 +02:00
8c2e99432d Add a note about TLS-ALPN challenge. 2018-10-25 16:50:05 +02:00
aa26927d61 Case insensitive host rule 2018-10-25 10:18:03 +02:00
22ee8700ca add default path if nothing present 2018-10-25 09:50:03 +02:00
df55c24cb5 Add missing tmp directory to scratch image 2018-10-24 11:00:05 +02:00
99ddd7f9cb domain is also optional for "normal" mode 2018-10-23 18:12:03 +02:00
82b2a102ed Add double wildcard test 2018-10-23 18:04:05 +02:00
c7df82e695 Remove the trailing dot if the domain is not defined. 2018-10-23 17:36:05 +02:00
638960284e Typo in the UI. 2018-10-23 13:14:03 +02:00
8e9b8a0953 fix: netcup and DuckDNS. 2018-10-23 11:18:02 +02:00
3f044c48fa Nil request body with retry 2018-10-23 10:10:04 +02:00
37d8e32e0b clarify DuckDNS does not support multiple TXT records 2018-10-18 16:42:03 +02:00
46ce807624 Adds the note: acme.domains is a startup configuration 2018-10-17 16:30:04 +02:00
e6a88f3531 Uses ASCII characters to spell Traefik 2018-10-17 16:24:04 +02:00
95d86d84b4 Add keepTrailingSlash option 2018-10-17 14:22:03 +02:00
70fa42aee0 Improve maintainer documentation 2018-10-16 18:12:03 +02:00
ba99fbe390 Fix certificate insertion loop to keep valid certificate and ignore the bad one 2018-10-16 11:00:04 +02:00
6a55772cda Rename Docker_Acme.md to Readme.md 2018-10-16 10:54:03 +02:00
6dcb51a4bd Merge 'v1.7.3' into master 2018-10-15 13:13:48 +02:00
c875819a2e Prepare release v1.7.3 2018-10-15 12:02:03 +02:00
6d4cf0d892 usebindportip can fall back on the container ip / port 2018-10-15 11:46:03 +02:00
78a9d20691 Add the AuthResponseHeaders to the labels 2018-10-15 10:54:03 +02:00
7c2409b5a7 DNS challenge Cloudflare auth zone 2018-10-15 09:40:02 +02:00
0335f6fba9 Log stack when panic 2018-10-12 15:40:03 +02:00
2c7b7cd6ca Fix recover from panic handler 2018-10-12 13:04:02 +02:00
5632952665 fix: golint. 2018-10-12 09:28:03 +02:00
7eeac63139 Fix: acme DNS providers 2018-10-11 16:50:04 +02:00
1b54f4d32a acme: prevent some malformed errors. 2018-10-11 10:50:03 +02:00
e8e9dd9400 Improve the CLI help (Update of the Flaeg dependency) 2018-10-10 19:10:04 +02:00
b722748ec3 Fix update oxy 2018-10-10 18:20:05 +02:00
609b2630d7 Add tags label to Docker provider documentation 2018-10-10 17:46:03 +02:00
5bdf8a5ea3 ACME DNS challenges 2018-10-10 16:28:04 +02:00
7a2592b2fa Added two example / Using labels in docker-compose.yml 2018-10-10 10:12:03 +02:00
546bebc860 Move buffering annotation documentation to service 2018-10-09 18:44:03 +02:00
ad51f4f2a5 Fix a typo 2018-10-09 18:36:03 +02:00
94a6f8426b Merge branch 'v1.7' into master 2018-10-09 11:19:55 +02:00
32f7fb8bff Make Zipkin trace rate configurable 2018-10-09 10:18:02 +02:00
a777c3553c Not allow ACME provider initialization if storage is empty 2018-10-08 19:24:03 +02:00
51650c1412 Add Gerald, Jean-Baptiste and Damien to maintainers 2018-10-08 16:46:03 +02:00
157580c232 Avoid flapping of multiple Ingress definitions 2018-10-05 18:36:03 +02:00
05f052b092 Merge branch 'v1.7.2' into master 2018-10-05 13:51:23 +02:00
1431ac5751 Basic Auth custom realm 2018-10-04 16:46:03 +02:00
a9deeb321b Prepare release v1.7.2 2018-10-04 15:34:02 +02:00
ec86149b1e Rule parsing error. 2018-10-04 10:20:03 +02:00
31f92001e2 Add Template-ability check to Kubernetes API Fields 2018-10-04 09:58:03 +02:00
d69977c229 Do not Errorf during file watcher verification test loop. 2018-10-04 09:26:03 +02:00
44e06a1a1e Trimming whitespace in XFF for IP whitelisting 2018-10-03 22:52:02 +02:00
f9689d1562 fix broken links in readme.md 2018-10-03 08:56:03 +02:00
4cb1ae4626 Colored logs on windows. 2018-10-02 16:28:04 +02:00
f04813fa02 Whitelist log for deprecated configuration. 2018-10-01 19:44:03 +02:00
742029d8a4 Global configuration log at start 2018-10-01 19:18:03 +02:00
f74526a36e Document the default accessLog format 2018-10-01 18:54:04 +02:00
61e1836472 Return an error if kv store CA cert is invalid 2018-10-01 17:24:03 +02:00
8d8e509fe6 Correctly initialize kv store if storage key missing 2018-10-01 17:02:02 +02:00
147e79ea07 TLS, ACME, cluster and several entrypoints. 2018-10-01 16:56:03 +02:00
5eae95ee46 Add master overhaul notice 2018-10-01 16:06:04 +02:00
9e26f0b058 Prepare release v1.7.1 2018-09-29 00:16:03 +02:00
8cc3c4a6b7 Use the first static certificate as a fallback when no default is given 2018-09-29 00:04:02 +02:00
1d8bdd4384 Don't remove static certs from config when cluster mode 2018-09-28 17:54:04 +02:00
5acd43efaf Add health check timeout parameter 2018-09-27 20:16:03 +02:00
7033b996c6 Don't challenge ACME when host rule on another entry point 2018-09-27 18:04:03 +02:00
0c76a8ac89 Fix TLS ALPN cluster mode. 2018-09-27 16:54:05 +02:00
f10516deb7 Merge v1.7.0 into master 2018-09-25 15:06:03 +02:00
d4311f9cf5 Prepare release v1.7.0 2018-09-24 11:44:03 +02:00
6a50a6fd5a Added Dashboard table item for Rate Limits 2018-09-24 11:20:03 +02:00
29473ef356 Do not copy hop-by-hop headers to forward auth request 2018-09-24 10:42:03 +02:00
1f1ecb15f6 Fix logger in Oxy 2018-09-24 10:04:03 +02:00
38d655636d Fix some DNS providers issues 2018-09-21 18:38:02 +02:00
9ab5cbf235 Removed non-applicable default tests and fixed custom tests 2018-09-21 16:44:02 +02:00
fdf14cd101 Merge 'v1.7' into master 2018-09-18 15:48:28 +02:00
f63873cc73 Prepare release 1.7.0-rc5 2018-09-18 15:36:03 +02:00
c2938ff138 Remove hop-by-hop headers from forward auth response 2018-09-18 14:22:03 +02:00
ab2c98d931 Ensure only certificates from ACME enabled entrypoint are used 2018-09-18 08:22:03 +02:00
0ae8cd9a9d Fix error pages 2018-09-17 20:40:04 +02:00
f3aefe282c Avoid panic during stop 2018-09-17 16:26:03 +02:00
a80cca95a2 Update lego 2018-09-17 15:16:03 +02:00
c52f4b043d Add interface to Træfik logger 2018-09-14 13:34:03 +02:00
253060b4f3 Update Lego 2018-09-14 10:06:03 +02:00
36966da701 Add missing quotes around backendName in kv template 2018-09-14 09:00:03 +02:00
bb7c4aaf7e Fix tracing duplicated headers 2018-09-12 16:32:04 +02:00
bd4846aa9c Merge branch 'v1.7' into master 2018-09-07 19:33:01 +02:00
c68ebaa2ca Prepare release v1.7.0-rc4 2018-09-07 11:34:03 +02:00
538424b01c Merge branch 'v1.6' into v1.7 2018-09-07 10:11:30 +02:00
48e7a87741 Update go version 2018-09-07 09:40:03 +02:00
74ace58ae1 Avoid goroutine leak in server 2018-09-06 14:24:03 +02:00
913d8737cc Allow Træfik to know if a Host rule is malformed 2018-09-04 17:14:04 +02:00
b98f5ed8b1 Remove a dead link. 2018-09-04 15:54:06 +02:00
e4bb506ace StoreConfig always initializes the account if it is missing 2018-09-03 10:12:03 +02:00
0f0ba099c9 Make the "base domain" on all providers 2018-08-30 02:24:03 +02:00
f400292be7 Enable retry on websocket 2018-08-29 11:58:03 +02:00
efc6560d83 Pass the TLS Cert infos in headers 2018-08-29 11:36:03 +02:00
4055654e9b Merge branch 'v1.7' into master 2018-08-28 17:04:39 +02:00
56488d435f Handle Te header when http2 2018-08-27 18:10:03 +02:00
f586950528 multiple frontends for consulcatalog 2018-08-27 17:00:05 +02:00
a302731cd1 Add segment support for ECS 2018-08-27 16:32:05 +02:00
00728e711c IPStrategy for selecting IP in whitelist 2018-08-24 16:20:03 +02:00
ef753838e7 Fix documentation for route53 acme provider 2018-08-24 07:14:03 +02:00
acb79d6f73 Merge branch 'v1.6' into v1.7 2018-08-23 10:49:03 +02:00
157c796294 Rename traefikproxy twitter account into traefik 2018-08-23 10:44:02 +02:00
0861c59bec Remove unnecessary loop 2018-08-23 09:40:03 +02:00
e4a7375d34 Update kubernetes docs to reflect https options 2018-08-23 08:52:02 +02:00
6bbac65f7e Include missing key in error message for KV store 2018-08-22 16:08:02 +02:00
845f1a7377 Add security mailinglist 2018-08-22 10:18:03 +02:00
9c8e518423 Auth Forward with certificates in templates. 2018-08-21 17:12:03 +02:00
bd3b787fd5 Merge 'v1.6.6' into v1.7 2018-08-21 11:43:34 +02:00
27e4a8a227 Fixes bad palette in doc 2018-08-20 17:50:04 +02:00
cf2d7497e4 Mention docker-compose as a requirement in the let's encrypt guide 2018-08-20 17:34:05 +02:00
df41cd925e Add vulnerability form 2018-08-20 17:08:03 +02:00
e46de74328 Improve the wording in the documentation for Docker and fix title for Docker User Guide 2018-08-20 16:46:04 +02:00
feeb7f81a6 Prepare Release v1.6.6 2018-08-20 14:46:02 +02:00
2beb5236d0 A tiny rewording on the documentation API's page 2018-08-20 13:34:03 +02:00
f062ee80c8 Docs: Adding warnings and solution about the configuration exposure 2018-08-20 12:02:03 +02:00
a7bb768e98 Remove TLS in API 2018-08-20 11:16:02 +02:00
07be89d6e9 Update oxy dependency 2018-08-20 10:38:03 +02:00
d81c4e6d1a Avoid duplicated ACME resolution 2018-08-20 09:40:03 +02:00
870755e90d Extend https redirection tests, and fix incorrect behavior 2018-08-14 18:38:04 +02:00
bd3c8c3cde Don't merge kubernetes ingresses when priority is set 2018-08-14 17:40:04 +02:00
278b3180c3 Prevent unparsable strings from being rendered in the Kubernetes template 2018-08-14 16:48:04 +02:00
bb2686a08f Update ACME documentation about TLS-ALPN challenge 2018-08-13 08:46:02 +02:00
202783ca7d Add ppc64le platform support 2018-08-10 16:56:04 +02:00
308904110a Merge branch 'v1.6' into 'v1.7' 2018-08-08 19:16:00 +02:00
60b4095c75 Set keepalive on TCP socket so idleTimeout works 2018-08-08 19:12:03 +02:00
d04b4fa2cc Set a keyType to ACME if the account is stored with no KeyType 2018-08-08 07:58:03 +02:00
2d449f63e0 Typo in auth labels. 2018-08-08 02:52:03 +02:00
1ec4e03738 Remove etcd v2 2018-08-07 19:12:03 +02:00
9cd47dd2aa Small code enhancements 2018-08-06 20:00:03 +02:00
015cd7a3d0 Remove deprecated elements 2018-08-06 17:20:03 +02:00
7ff6e6b66f Freeze mkdocs version 2018-08-06 15:50:03 +02:00
e92b01c528 Merge current v1.7 into master 2018-08-06 14:58:03 +02:00
bb33128552 Change syntax in quick start guide 2018-08-06 14:08:03 +02:00
86add29838 Freeze mkdocs version. 2018-08-06 13:50:02 +02:00
70712a0f62 Typo in docker-and-lets-encrypt.md 2018-08-03 17:52:03 +02:00
4db937b571 Avoid a panic during Prometheus registering 2018-08-03 14:02:02 +02:00
ad6f41c77a Simple documentation grammar update in tracing 2018-08-03 10:36:03 +02:00
e6040e55f5 Update kubernetes.md 2018-08-03 10:00:03 +02:00
dad0e75121 Merge branch 'v1.7' into master 2018-08-02 17:28:44 +02:00
c159e316be Migrate Compress from bool to struct 2018-08-02 17:14:03 +02:00
b4ac3d4470 Improve Connection Limit Kubernetes Documentation 2018-08-02 08:14:02 +02:00
43d22d7a2f Small code enhancements on providers 2018-08-01 16:58:03 +02:00
d62f7e2082 Use official Pebble Image. 2018-08-01 16:56:04 +02:00
cfe2f1a1e6 Prepare release 1.7.0-rc3 2018-08-01 15:28:03 +02:00
6f6ebb8025 Updates for jaeger tracing client. 2018-08-01 13:52:03 +02:00
7732e2307e Fix missing tracing backend in documentation 2018-08-01 13:36:03 +02:00
8c733abef3 Fix style in examples/quickstart 2018-08-01 11:22:03 +02:00
4809476c19 Move prometheusState.reset() to test file. 2018-08-01 11:20:03 +02:00
d727761e5d No need for npm progress=false 2018-08-01 10:56:03 +02:00
4d79c2a6d2 Added support for Trace name truncation for traces 2018-08-01 00:16:03 +02:00
8627256e74 Remove Deprecated Step 1 2018-07-31 19:28:03 +02:00
ed0c7d9c49 H2C: Remove buggy line in init to make verbose switch working 2018-07-31 18:56:03 +02:00
fb4717d5f3 Add traefik prefix to k8s annotations 2018-07-31 17:58:04 +02:00
09b489a614 Add possibility to set a protocol 2018-07-31 17:12:03 +02:00
402f7011d4 Fix ACME certificate for wildcard and root domains 2018-07-31 12:32:04 +02:00
838dd8c19f Fix acme account deletion without provider change 2018-07-31 11:50:03 +02:00
91cafd1752 Correct Entrypoint Redirect with Stripped or Added Path 2018-07-31 11:28:03 +02:00
eea60b6baa Replace unrendered emoji 2018-07-31 10:58:03 +02:00
baf8d63cb4 Improve TLS integration tests 2018-07-31 10:48:03 +02:00
967e4208da Updating oxy dependency 2018-07-31 10:28:02 +02:00
ba3a579d07 Fix Rewrite-target regex 2018-07-31 09:08:03 +02:00
1d53077fc7 Complete maintainers processes 2018-07-31 08:50:03 +02:00
4b480ece13 Complete maintainers processes 2018-07-27 16:28:03 +02:00
7d2b7cd7f1 Added default configuration for DataDog APM Tracer 2018-07-26 17:44:03 +02:00
73b4df4e18 Remove TLS in API 2018-07-26 12:42:03 +02:00
a23a9228da Merge branch 'v1.7' into master 2018-07-25 17:58:56 +02:00
37aa902cef Docs verify failed only on 4XX 2018-07-25 17:58:02 +02:00
bafb583666 Update Namecheap status 2018-07-24 01:02:03 +02:00
aabebb2185 Update lego 2018-07-23 17:30:03 +02:00
f611ef0edd Removes templates 2018-07-23 11:56:02 +02:00
d8f69700e6 Merge branch 'v1.7' into master 2018-07-19 17:33:28 +02:00
c8ae97fd38 Handle shutdown of Hijacked connections 2018-07-19 17:30:06 +02:00
d50b6a34bc Uses both binded HostIP and HostPort when useBindPortIP=true 2018-07-19 16:40:03 +02:00
853be929bc fix: some DNS provider link 2018-07-18 14:24:03 +02:00
3bb04142f3 fix: some DNS provider link. 2018-07-18 13:30:03 +02:00
d53fbb9d7f Merge branch 'v1.7' into master 2018-07-17 19:12:09 +02:00
a1911a9608 Prepare release 1.7.0 rc2 2018-07-17 14:30:03 +02:00
ff2e2d5026 Fix 400 bad request on AWS ECS API 2018-07-17 12:26:03 +02:00
a953d3ad89 Auth section in web UI. 2018-07-17 12:02:03 +02:00
9ce444b91a Don't pass the Authorization header to the backends 2018-07-16 13:52:03 +02:00
ae8be89767 Merge branch 'v1.6' into 'v1.7' 2018-07-13 18:06:07 +02:00
5774d100c1 Update service fabric 2018-07-13 18:04:03 +02:00
dbe720f0f1 Remove unusable --cluster flag 2018-07-13 17:32:03 +02:00
5afc8f2b12 KV and authentication 2018-07-13 17:24:03 +02:00
c7e008f57a Merge branch 'v1.6' into 'v1.7' 2018-07-12 19:24:11 +02:00
14b7152bf0 Serve TLS-Challenge certificate in first 2018-07-12 19:10:03 +02:00
3ef6bf2118 Documentation: Introduces a check stage to validate HTML and links 2018-07-12 18:26:03 +02:00
f0ab2721a5 Fix path to the debug pprof API 2018-07-12 17:58:02 +02:00
2721c2017c Correct Modifier in Kubernetes Documentation 2018-07-12 17:42:05 +02:00
a7c158f0e1 Fix bad condition in ECS provider 2018-07-12 17:40:04 +02:00
7ff9193cf5 Correct App-Root kubernetes behavior 2018-07-12 15:20:04 +02:00
5ce4a2d05c Add HTTP authentification to influxdb metric backend 2018-07-11 17:50:03 +02:00
031451abab Merge branch 'v1.6.5' into 'v1.7' 2018-07-11 11:07:42 +02:00
8d75aba7eb Send 'Retry-After' to comply with RFC6585. 2018-07-11 10:08:03 +02:00
027093a5a5 Create init method on provider interface 2018-07-11 09:08:03 +02:00
bdc0e3bfcf Prepare release v1.6.5 2018-07-10 17:46:04 +02:00
b2a57ca1f3 Add more K8s Unit Tests 2018-07-10 11:22:03 +02:00
6ef0e6791b Merge branch 'v1.6' into 'v1.7' 2018-07-10 01:24:14 +02:00
9374d6b3b9 Fix rewrite-target Annotation behavior 2018-07-10 00:26:03 +02:00
f173ff02e3 Add a mutex on local store for HTTPChallenges 2018-07-09 23:28:02 +02:00
ba2046491a Prepare release 1.7.0-rc1 2018-07-09 16:54:04 +02:00
083b471bcf Merge branch 'v1.6' into master 2018-07-09 15:34:47 +02:00
bf73127e0b Performance enhancements for the rules matchers. 2018-07-09 15:08:04 +02:00
333b785061 Add logs when error is generated in error handler 2018-07-07 10:14:03 +02:00
79bf19c897 Auth support in frontends 2018-07-06 16:52:04 +02:00
0c0ecc1cdc Call functions to enable block/mutex pprof profiles. 2018-07-06 10:58:04 +02:00
bacd58ed7b Add logs when error is generated in error handler 2018-07-06 10:32:03 +02:00
689f120410 Improve TLS Handshake 2018-07-06 10:30:03 +02:00
2303301d38 Add annotation to allow modifiers to be used properly in kubernetes 2018-07-06 10:06:04 +02:00
f323df466d Split the error handling from Consul Catalog (deadlock) 2018-07-05 15:12:03 +02:00
b1f1a5b757 Substitude hardcoded "<namespace>/<name>" with k8s ListerGetter 2018-07-04 17:08:03 +02:00
0d262561d1 Allow binding ECS container port 2018-07-04 15:08:03 +02:00
12c713b187 Support traefik.backend for ECS 2018-07-04 14:22:03 +02:00
b1836587f2 Update keyFile first/last line comment in kv-config.md 2018-07-04 14:20:03 +02:00
04d8b5d483 Adding compatibility for marathon 1.5 2018-07-03 23:42:03 +02:00
461ebf6d88 Create Global Backend Ingress 2018-07-03 18:58:03 +02:00
41eb4f1c70 Add a k8s guide section on traffic splitting via service weights. 2018-07-03 16:50:06 +02:00
31a8e3e39a CNAME flattening 2018-07-03 16:44:05 +02:00
139f280f35 ACME TLS ALPN 2018-07-03 12:44:04 +02:00
17ad5153b8 Minor changes 2018-07-03 10:02:03 +02:00
bb14ec70bd Auth support in frontends for k8s and file 2018-07-02 11:52:04 +02:00
e8e36bd9d5 Specify backend servers' weight via annotation for kubernetes 2018-07-01 11:26:03 +02:00
f9b1106df2 Forward auth headers 2018-06-30 07:54:03 +02:00
df600d6f3c Merge branch 'v1.6' into master 2018-06-30 00:43:32 +02:00
157e76e829 Add support for ECS constraints 2018-06-30 00:14:03 +02:00
dbc3b85cd0 Minor formatting issue in user-guide 2018-06-29 17:02:03 +02:00
11691019a0 Change code block of traefik-web-ui to match file 2018-06-28 23:10:03 +02:00
3192307d59 Added integration support for DataDog APM Tracing 2018-06-28 18:40:04 +02:00
ba8c9295ac Update golang.org/x/net dependency 2018-06-28 17:58:04 +02:00
d5436fb28b Create a custom logger for jaeger 2018-06-28 17:36:03 +02:00
886cc83ad9 Add support for stale reads from Consul catalog 2018-06-28 16:40:04 +02:00
9e012a6b54 Simplify acme e2e tests. 2018-06-27 15:08:05 +02:00
5eda08e9b8 Better support on same prefix at the same level in the KV 2018-06-26 16:18:05 +02:00
ec6e46e2cb segment labels: multiple frontends for one backend. 2018-06-22 19:44:03 +02:00
56fe023a12 Allow any kubernetes ingressClass value 2018-06-22 16:54:03 +02:00
aa705dd691 Create middleware to be able to handle HTTP pipelining correctly 2018-06-20 09:12:03 +02:00
aa6fea7f21 Add more k8s tests 2018-06-19 22:10:03 +02:00
e31c85aace avoid retries when any data was written to the backend 2018-06-19 13:56:04 +02:00
1c3e4124f8 The gandiv5 provider works with wildcard 2018-06-18 09:26:02 +02:00
586ba31120 Merge v1.6.4 into master 2018-06-15 17:58:20 +02:00
c1757372d3 Prepare release v1.6.4 2018-06-15 17:04:03 +02:00
7451449dd6 Simplify get acme client 2018-06-15 16:42:03 +02:00
5b2b29043c Use logrus writer instead of os.Stderr 2018-06-15 16:08:03 +02:00
2758664226 Fix panic setting ingress status 2018-06-14 09:22:03 +02:00
bb3f28ffa7 Backend name with docker-compose and segments. 2018-06-14 09:20:04 +02:00
6ceb2af4a7 Clean metrics documentation. 2018-06-13 17:44:04 +02:00
d5b649bf1c Add xforwarded method 2018-06-13 15:14:03 +02:00
81f23cc732 Add a default value for the docker.network configuration 2018-06-13 14:50:04 +02:00
b59276ff1c Use net.JoinHostPort for servers URL 2018-06-13 10:08:03 +02:00
2e95832812 Enclose IPv6 addresses in "[]" 2018-06-13 08:06:03 +02:00
01f2b3cd20 Update Slack URL. 2018-06-12 17:04:04 +02:00
2240bf9430 The exoscale provider works with wildcard 2018-06-12 16:16:03 +02:00
db036edccd Fix typo in kv user guide 2018-06-12 08:20:03 +02:00
1fbf5b84a2 Added duration filter for logs 2018-06-11 18:40:08 +02:00
08e1f626c1 edit wording 2018-06-11 16:26:03 +02:00
c0d08f5e3e Temporary benchmarks removal during performance optimization process 2018-06-11 11:46:03 +02:00
eac20d61df Extreme Makeover: server refactoring 2018-06-11 11:36:03 +02:00
dec3f0798a Add missing annotation documentation. 2018-06-08 12:54:02 +02:00
bddb4cc33c Merge branch 'v1.6' into master 2018-06-07 10:58:59 +02:00
62ded580ce Handle buffer pool for oxy 2018-06-07 09:46:03 +02:00
51227241b7 Fix backend reuse 2018-06-06 17:56:03 +02:00
9cf4e730e7 Fix typo which breaks k8s example manifest 2018-06-06 17:16:04 +02:00
e9c63f3988 Custom frontend name for test helper 2018-06-06 15:20:03 +02:00
2c47691cf1 Adding grafana dashboards based on prometheus metrics 2018-06-06 14:54:03 +02:00
599b699ac9 Segments Labels: Mesos 2018-06-06 00:26:03 +02:00
a5beeb4f04 Merge tag 'v1.6.3' into master 2018-06-05 23:07:53 +02:00
446d73fcf5 Prepare release v1.6.3 2018-06-05 17:20:04 +02:00
e299775d67 Detect change when service or node are in maintenance mode 2018-06-05 16:42:03 +02:00
2c18750537 Improve Prometheus metrics removal 2018-06-05 12:32:03 +02:00
f317e50136 Docs: ACME Overhaul 2018-06-05 10:36:03 +02:00
1d84bda7ca Update Kubernetes provider to support IPv6 Backends 2018-06-05 10:28:03 +02:00
ae7c947ba5 Add user agent for ACME 2018-06-05 09:54:03 +02:00
6d07729c55 Add URL and Host for some access logs. 2018-06-05 09:02:03 +02:00
1d7bf200a8 Reflect changes in catalog healthy nodes in healthCheck watch 2018-06-05 08:42:03 +02:00
6bc59f8b33 Includes the headers in the HTTP response of a websocket request 2018-06-04 14:14:03 +02:00
b2cf03fa5c Use to the stable version of Lego 2018-05-31 09:30:04 +02:00
36e273714d helm installation using values 2018-05-30 17:38:04 +02:00
6be77b7fb9 Webui Whitelist overflow. 2018-05-30 09:44:02 +02:00
6bcf45f136 fix: whitelist and XFF. 2018-05-30 09:26:03 +02:00
8bca8236db Update acme.md 2018-05-30 04:16:03 +02:00
67a0b4b4b1 Metrics: Add support for InfluxDB Database / RetentionPolicy and HTTP client 2018-05-29 22:58:03 +02:00
a7200a292b AWS ECS Fargate 2018-05-28 18:52:03 +02:00
fb5aa4c9c1 Error pages and header merge 2018-05-28 15:00:04 +02:00
3f5772c62a Improve ACME account registration URI management 2018-05-28 14:40:03 +02:00
e76836b948 h2c server 2018-05-28 11:46:03 +02:00
2d946d7ee7 Remove ACME empty certificates from KV store 2018-05-25 19:36:04 +02:00
10ca35dccd Update Kubernetes Port Documentation 2018-05-25 17:26:05 +02:00
bfdd1997f6 Generated assets file are only mandatory in main 2018-05-25 15:10:04 +02:00
9420308667 Implement h2c with backend 2018-05-24 10:52:04 +02:00
83e09acc9f Upgrade dependencies 2018-05-23 17:48:04 +02:00
d6d795e286 Support 3xx HTTP status codes for health check 2018-05-23 17:06:04 +02:00
c09febfffc Make accesslogs.logTheRoundTrip async to get lost performance 2018-05-23 16:46:04 +02:00
5b3bba8f6e Add missing quotes. 2018-05-23 16:12:05 +02:00
085593b9e5 sane default and configurable Marathon request timeouts 2018-05-22 22:38:03 +02:00
e2a5d4f83e Merge 'v1.6.2' into master 2018-05-22 19:14:34 +02:00
e3671cbb04 Prepare release 1.6.2 2018-05-22 17:06:04 +02:00
a525d02cc5 Force to use ACME v02 endpoint. 2018-05-22 16:08:03 +02:00
3c8c5ebb96 Use index-based syntax in KV tests. 2018-05-22 12:30:03 +02:00
1cc1a4e6e2 WebUI typo into the buffering section. 2018-05-22 12:28:03 +02:00
3f0af3fe09 No template parsing on traefik configuration file 2018-05-22 12:02:03 +02:00
e2bac47a0a Support all 2xx HTTP status code for health check. 2018-05-22 09:22:03 +02:00
bc26d9f0de Enhance Load-balancing method validation log. 2018-05-22 09:20:03 +02:00
5c4692a0df Modify tests to only run if non-static files have been modified 2018-05-19 00:30:03 +02:00
0ba28bbc8b Update caServer to letsencrypt one in examples 2018-05-18 18:16:03 +02:00
550184275a Add basicAuth example for KV 2018-05-18 17:54:03 +02:00
c376083ecb Add command for basic auth with Docker Compose 2018-05-18 17:34:04 +02:00
1db5fcf200 Removes ambiguity with the word 'default' 2018-05-18 17:12:03 +02:00
16b2555ab3 Fix error pages content. 2018-05-18 16:38:03 +02:00
9227d32d57 Enable Ingress Status updates 2018-05-18 14:12:03 +02:00
c37b040217 Mapping ExternalNames to custom ports 2018-05-17 18:46:03 +02:00
5a1d2aa4b6 Fix contributing guide link in PR template 2018-05-17 12:52:03 +02:00
4a3b1f3847 Enable to override certificates in key-value store when using storeconfig 2018-05-17 12:32:03 +02:00
d9a5258f40 Update docs to match SF provider labels 2018-05-17 11:04:03 +02:00
190ebbed27 Update docs to reflect Provider wording 2018-05-16 19:48:03 +02:00
a0872c9e31 Route rules overlaps in UI 2018-05-16 13:44:03 +02:00
68cc826519 Add option to select algorithm to generate ACME certificates 2018-05-16 11:44:03 +02:00
f5b306e7ff Add redirect-permanent to kubernetes template 2018-05-16 10:46:03 +02:00
7a1feb3c51 fix: acme errors management. 2018-05-15 17:28:02 +02:00
e691168cdc Add some missing elements in the WebUI 2018-05-15 17:26:04 +02:00
4eda1e1bd4 Merge branch 'v1.6' into master 2018-05-15 10:43:27 +02:00
1e8df9f245 Prepare release v1.6.1 2018-05-14 21:08:03 +02:00
b72937e8fb Fix webui 2018-05-14 19:46:03 +02:00
df11e67bb4 Override health check scheme 2018-05-14 12:08:03 +02:00
b7d20496f3 Add SSLForceHost support. 2018-05-14 11:44:03 +02:00
67847c3117 Error when accesslog and error pages 2018-05-14 10:38:03 +02:00
a2a0c80acb Fix segment backend name 2018-05-14 10:18:03 +02:00
b3fd06fb45 Add missing deprecation info in CLI help. 2018-05-14 09:52:03 +02:00
c5db8d903c Enhance entry point TLS CLI reference. 2018-05-13 17:12:03 +02:00
8fcd242494 Add Documentation update for Kubernetes Ingress 2018-05-11 12:52:03 +02:00
ebd9af900e Changed "is could" to should 2018-05-09 17:48:03 +02:00
b02381c2d5 Fix wrong tag in forward span in tracing middleware 2018-05-08 12:00:03 +02:00
dce65ab9c2 Restore default issue template. 2018-05-07 14:16:02 +02:00
97295f270b Update issue templates 2018-05-07 12:14:02 +02:00
8e64bc8785 Merge branch 'v1.6' into master 2018-05-04 17:57:06 +02:00
9b199ea756 fix: 1.6 change log. 2018-05-04 16:08:03 +02:00
ec3b913ee4 fix: change log v1.6.0 2018-05-01 00:46:03 +02:00
c210ab31d9 Prepare release v1.6.0 2018-04-30 23:20:05 +02:00
6c1fa91c70 Document custom k8s ingress class usage in guide. 2018-04-30 20:28:03 +02:00
04bab185f6 Add redirect section. 2018-04-30 12:28:03 +02:00
2213b4cf37 Cleaning labels/annotations documentation. 2018-04-30 12:08:03 +02:00
1d770e5636 Fix typo and tweak formatting in quickstart 2018-04-30 09:24:04 +02:00
b7e15e0a2c doc: update Traefik images. 2018-04-27 14:54:03 +02:00
9c651ae913 New web ui 2018-04-27 13:12:04 +02:00
a1bbaec71f Does not generate ACME certificate if domain is checked by dynamic certificate 2018-04-27 10:36:04 +02:00
3b3ca89483 Merge branch 'v1.6' into master 2018-04-25 08:22:17 +02:00
b4e3bca6fa Remove acme provider dependency in server 2018-04-24 22:40:04 +02:00
e09d5cb4ec Fix documentation for tracing with Jaeger 2018-04-24 19:22:03 +02:00
cae353b9f6 Add documentation about Templating in backend file 2018-04-24 18:58:03 +02:00
edb5b3d711 Fix whitelist and XFF. 2018-04-23 16:20:05 +02:00
667a0c41ed Minor improvements to documentation 2018-04-23 15:56:03 +02:00
9daae9c705 Extract internal router creation from server 2018-04-23 15:30:03 +02:00
2975acdc82 Forward auth: copy response headers when auth failed. 2018-04-23 15:28:04 +02:00
76dcbe3429 Fix error pages redirect and headers. 2018-04-23 11:28:04 +02:00
d8e2d464ad Remove dead code. 2018-04-23 10:54:03 +02:00
5f8bcb0c26 Fix typo in documentation 2018-04-23 10:28:04 +02:00
7ef8d6fa10 Ignore server for container with empty IP address. 2018-04-22 09:10:03 +02:00
5924a40222 Fix Service Fabric docs to use v1.6 labels. 2018-04-19 20:15:20 +02:00
05968eb232 Fix Service Fabric docs to use v1.6 labels
Fix docs to use v1.6 labels rather than v1.5.
2018-04-19 16:30:10 +02:00
36dcfbfe2d Add HTTP headers to healthcheck. 2018-04-18 18:16:03 +02:00
95ce4f5c1e refactor: minor fixes. 2018-04-18 10:48:03 +02:00
f258f20b04 doc: add 'traefik.domain'. 2018-04-18 10:48:03 +02:00
7e2ad827aa fix: used 'traefik.domain' in frontend rule. 2018-04-18 10:48:03 +02:00
e6ce61fdf0 Merge tag 'v1.6.0-rc6' into master 2018-04-18 10:13:22 +02:00
3df588047d Prepare release v1.6.0-rc6 2018-04-17 13:42:03 +02:00
ac0e5cbb29 Use shared label system 2018-04-17 11:18:04 +02:00
5ab584bc6a Fix panic in atomic on ARM and x86-32 platforms 2018-04-17 10:32:03 +02:00
a2e03e3bd0 Create backup file during migration from ACME V1 to ACME V2 2018-04-16 19:34:04 +02:00
f0589b310f Fix multiple frontends with docker-compose --scale 2018-04-16 18:14:04 +02:00
8519b0d353 Fix nil value when tracing is enabled 2018-04-16 17:42:03 +02:00
21b8b2deb5 Support multi-port services. 2018-04-16 14:44:04 +02:00
6b82a77e36 Improved cluster api to include the current leader node 2018-04-16 14:10:04 +02:00
1954a49f37 add http headers to healthcheck 2018-04-16 11:40:03 +02:00
0e3d1e1503 fix: redirect to HTTPS first before basic auth if header redirect (secure) is set 2018-04-16 11:06:03 +02:00
ebd77f314d Fix duplicated tags in InfluxDB 2018-04-16 10:28:04 +02:00
749d833f65 fix: template version documentation. 2018-04-16 00:34:03 +02:00
0373cd6f97 Add missing argument in log. 2018-04-13 19:46:03 +02:00
1f3fc8a366 fix: backend name for stateful service and more. 2018-04-13 15:44:04 +02:00
89c3930b28 Merge branch 'v1.5' into 'v1.6' 2018-04-13 15:02:29 +02:00
29e1e9eef2 fix: backend name for stateful service. 2018-04-13 14:38:03 +02:00
de3aeb9732 Merge branch 'v1.6' into mrg-current-v1.6 2018-04-12 14:36:36 +02:00
85aa1a444a Prepare release 1.6.0-rc5 2018-04-12 11:44:03 +02:00
702876ae7f Limit label selector to Ingress factory. 2018-04-12 11:14:05 +02:00
7109910f46 Generate wildcard certificate with SANs in ACME 2018-04-11 17:16:07 +02:00
8168d2fdc1 Server weight zero 2018-04-11 16:30:04 +02:00
edbcd01fbc Merge branch 'v1.5' into 'v1.6' 2018-04-11 14:20:53 +02:00
c99266e961 Fix: error pages 2018-04-11 13:54:03 +02:00
f804053736 Factorize labels managements. 2018-04-11 12:26:03 +02:00
2641832304 Default certificate expiry 2018-04-11 10:36:03 +02:00
21f6f81914 Update kubernetes.md 2018-04-11 10:34:04 +02:00
ccd919aba3 Fix Azure brand 2018-04-10 17:26:04 +02:00
2387010556 Disable closeNotify when method GET for http pipelining 2018-04-10 17:24:04 +02:00
f35d574759 Minor updates to dumpcerts.sh 2018-04-10 16:52:05 +02:00
3be74bb275 Fix acme.json file automatic creation 2018-04-10 10:52:04 +02:00
b1be062437 fix: update lego. 2018-04-09 18:28:03 +02:00
2d0d320d05 Remove useless ACME tab from UI. 2018-04-09 16:06:03 +02:00
1de5111ab5 s/Host/HostRegexp 2018-04-09 11:18:03 +02:00
3d530e4747 Command version explanation for alpine image. 2018-04-06 18:14:03 +02:00
0ef1b7b683 Fix: Add TTL and custom Timeout in DigitalOcean DNS provider 2018-04-06 17:04:03 +02:00
66485e81b4 Normalize parameter names in configs 2018-04-06 09:38:03 +02:00
e74e7cf734 Add ACME certificates only on ACME EntryPoint 2018-04-06 08:44:03 +02:00
03ce6a1cc4 Merge tag 'v1.6.0-rc4' into master 2018-04-04 15:10:03 +02:00
a19b93c966 fix: overflow on 32 bits arch. 2018-04-04 15:04:04 +02:00
f7fd1f2a63 Prepare release v1.6.0-rc4 2018-04-04 14:12:03 +02:00
88b71d23db Several apps with same backend name in Marathon. 2018-04-04 12:28:03 +02:00
762ef12eb6 Support TLS MinVersion and CipherSuite as CLI option. 2018-04-04 11:56:04 +02:00
6845068b82 doc: template version for ECS, Consul Catalog and Mesos. 2018-04-04 11:52:05 +02:00
5c0b18efe4 chore: autogen. 2018-04-04 11:52:05 +02:00
4b93d040b3 refactor: Mesos labels. 2018-04-04 11:52:05 +02:00
ff61cc971e refactor: Consul Catalog labels. 2018-04-04 11:52:05 +02:00
46db91ce73 refactor: ECS labels. 2018-04-04 11:52:05 +02:00
5921909ef5 Add tests on IPWhiteLister. 2018-04-03 18:36:03 +02:00
1537861c61 Merge branch 'v1.5' into 'v1.6' 2018-04-03 12:12:19 +02:00
1b93551572 Update docker-and-lets-encrypt example to show traefik:1.5.4 2018-04-03 11:14:04 +02:00
197a5fbcf4 Update kubernetes.md 2018-04-03 10:30:03 +02:00
ff32529345 Moved /api/cluster/leadership handler under public routes (requires no authentication) 2018-04-03 10:00:07 +02:00
a179c3b399 Fixes prefixed annotations support. 2018-04-03 09:40:04 +02:00
a820585f56 Fixed documentation urls on README.md 2018-03-30 11:18:03 +02:00
bfb12f415c Prepare release v1.6.0-rc3. 2018-03-28 17:56:04 +02:00
a731b43b52 Frontend rule and segment labels. 2018-03-28 17:18:04 +02:00
118b4eb07a Prepare release v1.6.0-rc2 2018-03-27 16:48:05 +02:00
f1a05ab73c Add wildcard match to acme domains 2018-03-27 16:18:03 +02:00
4c85a41bfb Fix basic documentation 2018-03-27 14:58:03 +02:00
30e048d4ab Fix panic with wrong ACME configuration 2018-03-27 12:22:03 +02:00
aa0ab6d387 Update SF white list documentation section. 2018-03-27 10:24:03 +02:00
30b87985b7 chore: update changelog. 2018-03-26 16:40:03 +02:00
df73211d56 feature: Service Fabric white list. 2018-03-26 16:40:03 +02:00
e3a4ddcd08 Prepare release 1.6.0-rc1 2018-03-26 16:04:03 +02:00
0ea007b26f Segments Labels: Rancher & Marathon 2018-03-26 15:32:04 +02:00
16bb9b6836 ACME V2 Integration 2018-03-26 14:12:03 +02:00
d2766b1b4f Ability to use "X-Forwarded-For" as a source of IP for white list. 2018-03-23 17:40:04 +01:00
4802484729 Segment labels: Docker 2018-03-23 13:30:03 +01:00
c762b9bb2e add access log filter for retry attempts 2018-03-23 09:28:03 +01:00
5792a19b97 Toggle /ping to artificially return unhealthy response on SIGTERM during requestAcceptGraceTimeout interval 2018-03-22 18:18:03 +01:00
9699dc2a85 Added cluster/leader endpoint 2018-03-22 18:00:05 +01:00
0fa0c2256a Update Service Fabric backend. 2018-03-22 17:42:03 +01:00
1b410980ca Remove non-supported label. 2018-03-22 17:16:04 +01:00
be0dbd62c1 Drop capabilities in Kubernetes DaemonSet example 2018-03-22 16:44:05 +01:00
1a411b658b Added support for templates to file provider 2018-03-22 16:14:04 +01:00
d2e84a700f Merge branch 'v1.5' into master 2018-03-22 12:46:51 +01:00
b9af55fc49 Introduction update 2018-03-22 12:34:03 +01:00
e0d92aed6d Miss-leading Docker backend documentation 2018-03-22 10:22:04 +01:00
f94fa78565 Introduce k8s informer factory 2018-03-22 10:14:04 +01:00
007a1fc7f2 Merge branch 'v1.5' into master 2018-03-22 08:48:01 +01:00
a3372acb6d Dependency fsnotify organization has been renamed 2018-03-21 17:04:08 +01:00
af7c9b520f Allow overriding the log level in debug mode. 2018-03-21 14:42:07 +01:00
43a510c046 Fix goroutine leak in consulcatalog when consul is down 2018-03-20 14:36:03 +01:00
329c576f44 Add SF to supported backends in docs 2018-03-20 10:34:03 +01:00
7afa33dfa1 Fix link to InsecureSkipVerify option. 2018-03-20 09:12:03 +01:00
73c6007730 Set INFO log level in Kubernetes guide and examples. 2018-03-19 10:38:04 +01:00
526c19181e Merge v1.5.4 into master 2018-03-15 22:22:03 +01:00
79cd306ac2 Prepare release v1.5.4 2018-03-15 14:26:03 +01:00
35b83678bd Add TLS Docs 2018-03-15 12:24:03 +01:00
eacb6ea15a Fix Rancher Healthcheck when upgrading a service 2018-03-15 12:06:04 +01:00
d88263dbf9 Use goroutine pool in throttleProvider 2018-03-15 10:54:03 +01:00
b1e3444798 Add lower-case passHostHeader key support. 2018-03-15 10:14:03 +01:00
f6c6d2bcd0 Add [file] in syntax reference 2018-03-15 09:02:03 +01:00
8d468925d3 Ultimate Access log filter 2018-03-14 14:12:04 +01:00
f99363674b Use context in Server 2018-03-14 13:14:03 +01:00
526a04d4c8 Merge branch 'v1.5' into master 2018-03-13 11:38:21 +01:00
593c0e7ce2 Updated the test-it example according to the latest docker version 2018-03-13 08:42:03 +01:00
e2b42ca57b Handle quoted strings in UnmarshalJSON 2018-03-12 22:00:04 +01:00
7860534f0c Clarify how setting a frontend priority works 2018-03-12 11:12:05 +01:00
fc81d92c88 Enhance Traefik TOML sample. 2018-03-12 10:40:04 +01:00
8fbac2e39e Fix typo in docs 2018-03-12 10:04:03 +01:00
b91ae71241 Added entrypoint metrics to influxdb 2018-03-12 09:34:03 +01:00
0a41cd43a5 Merge branch 'v1.5' into master 2018-03-09 12:02:29 +01:00
59f7b2ea98 Propagate insecure in white list. 2018-03-08 15:08:03 +01:00
862957c30c Safe access to ECS API pointer values. 2018-03-08 10:08:03 +01:00
4831890232 Merge branch 'v1.5' into master 2018-03-08 01:12:36 +01:00
546f0173ab Don't failed traefik start if register and subscribe failed on acme 2018-03-08 00:54:02 +01:00
b001b0da86 Add some missing quotes in templates 2018-03-07 22:10:04 +01:00
04e3f2f401 Unable to generate documentation 2018-03-07 21:50:04 +01:00
3a2b421566 Replace Delay by RefreshSecond in Eureka 2018-03-07 10:46:04 +01:00
acc432b5a8 capitalize Sec-WebSocket-Protocol Header 2018-03-07 08:08:03 +01:00
c4529820f2 Delete TLS-SNI-01 challenge from ACME 2018-03-06 14:50:03 +01:00
d3edccb839 Check all the C/N and SANs of provided certificates before generating ACME certificates in ACME provider 2018-03-06 10:12:04 +01:00
8380de1bd9 Create ACME Provider 2018-03-05 20:54:04 +01:00
bf43149d7e Merge branch 'v1.5' into master 2018-03-02 16:44:24 +01:00
13e2358815 Clarify some deprecations. 2018-03-02 14:46:03 +01:00
1f6f8d5e0f New option in secure middleware 2018-03-02 14:24:03 +01:00
716eca5976 fix: gh-pages drop edge. 2018-03-02 14:20:04 +01:00
9ae808aac4 Fix panic when parsing resolv.conf 2018-03-02 10:46:04 +01:00
c77fe6b434 Use responseModifier to override secure headers 2018-03-01 16:42:04 +01:00
f149b56063 Enhance API, REST, ping documentation. 2018-03-01 08:42:03 +01:00
831a3e384b Separate command from the main package 2018-03-01 08:10:04 +01:00
49a9e2a9e0 Second defaultEntryPoint should be https, not http. 2018-02-28 14:24:03 +01:00
a2db3e0499 Merge branch 'v1.5' into master 2018-02-27 14:10:24 +01:00
422109b82f Prepare release v1.5.3 2018-02-27 12:28:03 +01:00
c864a7297b Add DEBUG log when no provided certificate can check a domain 2018-02-27 11:10:03 +01:00
8da038041d Default value for lifecycle 2018-02-27 10:24:03 +01:00
dd954f3c0a Fix Duration JSON unmarshal 2018-02-26 22:14:03 +01:00
6f81e3479a Externalize Træfik rules in a dedicated package 2018-02-26 15:34:04 +01:00
db483e9d34 Check all the C/N and SANs of provided certificates before to generat… 2018-02-26 11:38:03 +01:00
700b7a1b51 Add a CLI help command for Docker. 2018-02-26 10:00:05 +01:00
ed65d00574 Infinite entry point redirection. 2018-02-26 09:34:03 +01:00
0306b5e8f7 Missing annotation prefix support. 2018-02-23 18:36:03 +01:00
cb54e414ed TLS Support for ConsulCatalog 2018-02-23 12:14:03 +01:00
bad71d1a36 Remove hardcoded frontend prefix in Kubernetes template 2018-02-23 11:38:02 +01:00
088b8fb348 Fix <nil> tracer value in KV 2018-02-23 11:16:03 +01:00
e28ebf1c62 Change port of traefik for error pages integration test 2018-02-23 10:52:03 +01:00
39eeb67d91 Upgrade AWS SKD to version v1.13.1 2018-02-22 14:58:04 +01:00
f460c1990e Starting Træfik even if TLS certificates are in error 2018-02-22 14:38:04 +01:00
0c0949679f Check for endpoints while detecting Consul service changes 2018-02-22 09:48:03 +01:00
58d4481118 Docs: Fix typos in k8s user-guide 2018-02-21 17:34:04 +01:00
83381e99cf it's -> its 2018-02-21 17:18:05 +01:00
21e28ae848 Merge branch 'v1.5' into master 2018-02-21 16:55:57 +01:00
31550fd2c9 Replace nginx by whoami in integration tests 2018-02-21 16:28:03 +01:00
7c7ee2ca61 Added missing metrics to registry for DataDog and StatsD 2018-02-21 10:04:03 +01:00
ba046b4d3a Fix doc cipher suites 2018-02-21 08:00:03 +01:00
d675d46930 Multiple issue and pull request templates. 2018-02-20 10:44:03 +01:00
7ea76929d4 Empty ip address when endpoint mode dnsrr 2018-02-20 08:12:02 +01:00
5ef55dd8b4 Add app-root annotation support for kubernetes ingress 2018-02-19 15:36:03 +01:00
d47c1a7975 Update to golang 1.10 2018-02-19 13:40:03 +01:00
8068057040 chore: add gometlinter configuration. 2018-02-19 10:54:03 +01:00
fcdeec0bfa refactor: use positive error code. 2018-02-19 10:54:03 +01:00
b9d8eff994 refactor: some minor changes. 2018-02-19 10:54:03 +01:00
529e34d2ae Remove unnecessary returns in tracing setup 2018-02-17 08:32:03 +01:00
26b3fe201b Split security labels and custom labels documentation. 2018-02-16 16:04:05 +01:00
f98c537ec2 Smooth dashboard refresh. 2018-02-16 16:02:03 +01:00
083bde64ee Fix traffic pronounce dead link 2018-02-16 13:22:02 +01:00
462dcbcf03 Change boolean annotation values to string 2018-02-16 12:20:04 +01:00
45fe218ee2 Isolate backend with same name on different provider 2018-02-16 11:04:04 +01:00
d54777236c Update documentation on onHostRule, ping examples, and web deprecation 2018-02-16 10:32:03 +01:00
dafdaa4208 Correct conditional setting of buffering retry expression. 2018-02-15 16:06:03 +01:00
5212b7d3bd Handle zipkin collector creation 2018-02-15 10:28:03 +01:00
83a92596c3 Bump kubernetes/client-go 2018-02-14 09:56:04 +01:00
4f3b06472b Check ping configuration. 2018-02-13 23:42:03 +01:00
029fa83690 Remove unnecessary conversion 2018-02-13 17:14:04 +01:00
abdcb9e332 Homogenization of templates: Eureka 2018-02-13 09:20:04 +01:00
17e85e31cd Remove health check filter from Marathon tasks. 2018-02-13 08:00:05 +01:00
7d3dd5a0e4 Update Lego (Gandi API v5, cloudxns, ...) 2018-02-12 18:10:05 +01:00
dd873fbeee Fix support for macvlan driver in docker provider 2018-02-12 17:50:05 +01:00
38a4c80995 Logger and Leaks 2018-02-12 17:24:03 +01:00
91fa727c74 Update Staert. 2018-02-12 16:42:02 +01:00
794c0206f3 Merge 'v1.5.2' into master 2018-02-12 15:39:12 +01:00
52bad03c8d Prepare release v1.5.2 2018-02-12 11:46:03 +01:00
2fde3e8679 Continue refresh the configuration after a failure. 2018-02-12 09:28:03 +01:00
1e71f52b72 Explain how to write entrypoints definition in a compose file 2018-02-09 18:16:04 +01:00
2b1d2853cd Compress ACME certificates in KV stores. 2018-02-09 10:38:03 +01:00
6a92ac0b7b Add new options to the CLI entrypoint definition. 2018-02-08 09:30:06 +01:00
f07e8f58e6 Fix goroutine leaks in websocket 2018-02-08 08:24:03 +01:00
7b19cb5631 Migrate to dep 0.4 2018-02-07 23:30:05 +01:00
f5adea1061 Merge branch 'v1.5' into master 2018-02-07 16:20:40 +01:00
dbd173b4e4 Docs: regex+replacement hints for URL rewriting 2018-02-07 13:42:04 +01:00
85cfd87c44 Clarify how setting a frontend priority works 2018-02-07 13:00:04 +01:00
c867f48f11 Change go-bindata 2018-02-07 12:40:03 +01:00
514f9a7215 Reduce oxy round trip logs to debug. 2018-02-07 11:32:03 +01:00
0b0380b690 Fix typo 2018-02-06 14:30:04 +01:00
4d0c8c189a Fixed typo. 2018-02-06 14:04:03 +01:00
afe4c307f9 Traefik still start when Let's encrypt is down 2018-02-05 18:20:04 +01:00
c0563f1a39 Remove web provider in example 2018-02-05 15:04:02 +01:00
ce3a0fdd46 Fix dnsrr endpoint mode excluded when not using swarm LB 2018-02-05 11:34:03 +01:00
ce3c72e9d9 Update traefik-ds.yaml with --api command line parameter 2018-02-05 10:50:03 +01:00
dcba74deb9 Display file log when test fails. 2018-02-05 09:48:03 +01:00
203a5c5c48 Hide the pflag error when displaying help. 2018-02-05 09:12:03 +01:00
be4aeaacde Add documentation about entry points definition with CLI. 2018-02-05 08:54:03 +01:00
04ebd9d46a Allow custom value for kubernetes.io/ingress.class annotation 2018-02-01 19:04:04 +01:00
52b4e93c38 Fix typo in doc for rate limit label 2018-02-01 08:04:03 +01:00
58d6681824 Redirection: permanent move option. 2018-01-31 19:10:04 +01:00
c944d203fb chore(k8s): gen templates. 2018-01-31 17:16:05 +01:00
62df067fac doc(k8s): add documentation. 2018-01-31 17:16:05 +01:00
7c80b9a692 refactor(k8s): new annotations style. 2018-01-31 17:16:05 +01:00
a4a8345a33 refactor(k8s): baseName and ObjectMeta. 2018-01-31 17:16:05 +01:00
742dde72bb refactor(k8s): template readability.
fix(k8s): redirection template.
2018-01-31 17:16:05 +01:00
4497ddbb0e refactor(k8s): default to nil headers struct. 2018-01-31 17:16:05 +01:00
53388a3570 feat(k8s): add max conn annotations. 2018-01-31 17:16:05 +01:00
1c495d7ea4 feat(k8s): add rate limit annotations. 2018-01-31 17:16:05 +01:00
4c0d6e211b feat(k8s): add error pages annotations. 2018-01-31 17:16:05 +01:00
5bfd6acd52 fix(k8s): add passTLSCert to template. 2018-01-31 17:16:05 +01:00
0b49de94c6 refactor(k8s): extract functions. 2018-01-31 17:16:05 +01:00
7c0e557f84 refactor(k8s): template readability. 2018-01-31 17:16:05 +01:00
a81171d5f1 Request buffering middleware 2018-01-31 15:32:04 +01:00
26dc2f4d61 doc: option not available in 1.5. 2018-01-30 17:16:03 +01:00
d426126a92 Merge 'v1.5.1' into master 2018-01-29 17:12:23 +01:00
6aac78fc36 typo in "i"ngress annotations. 2018-01-29 16:48:05 +01:00
f6c53f0450 Rebuild experimental image 2018-01-29 16:08:03 +01:00
54e09b98c7 Prepare release v1.5.1 2018-01-29 15:04:03 +01:00
395b1702de Extract providers configuration from server.go 2018-01-29 14:58:03 +01:00
4eebaa1a80 Enhance file provider documentation. 2018-01-29 14:36:03 +01:00
cb9bf3ce68 Fix domain names in dynamic TLS configuration 2018-01-29 10:48:03 +01:00
ef4aa202d0 Fix high memory usage in retry middleware 2018-01-26 18:22:03 +01:00
cc5ee00b89 extend metrics and rebuild prometheus exporting logic 2018-01-26 11:58:03 +01:00
49a8cb76f5 Add note on redirect for ACME http challenge 2018-01-26 09:22:03 +01:00
bf12306f17 Change gzipwriter receiver to implement CloseNotifier 2018-01-25 21:46:04 +01:00
fa1f4f761d Add status code text to webui bar chart tooltip 2018-01-25 16:54:03 +01:00
b50aebd2ed Tracing statusCodeTracker need to implement CloseNotify 2018-01-25 16:34:02 +01:00
323b8237a0 Handle undefined entrypoint on ACME config and frontend config 2018-01-25 12:02:04 +01:00
9f741abd84 Fix integration tests in tracing 2018-01-25 12:00:05 +01:00
32ccc26712 Add username in accesslog 2018-01-24 18:18:03 +01:00
563a0bd274 Migrate from libkv to valkeyrie library 2018-01-24 17:52:03 +01:00
a91080b060 Merge branch 'v1.5' into master 2018-01-24 17:01:05 +01:00
039ccaf4f1 Fix tar gz source only on tags on travis 2018-01-24 16:10:04 +01:00
c878d262bf refactor: remove Tracing integration tests. 2018-01-24 15:20:47 +01:00
c8446c2dc8 Merge branch 'v1.5' into master 2018-01-24 15:11:21 +01:00
4afb39778a Fix add src.tar.gz in Træfik release 2018-01-24 10:40:04 +01:00
751781a3b7 Increase integration tests timeout. 2018-01-24 09:14:02 +01:00
f5d150c3b4 Fix the k8s redirection template. 2018-01-24 08:12:03 +01:00
ae9342208e Prepare release v1.5.0 2018-01-23 17:34:04 +01:00
3040d9df0d Build cross binary only on tags in travis 2018-01-23 17:00:06 +01:00
00e0571811 Rename TLSConfigurations to TLS. 2018-01-23 16:30:07 +01:00
bfb07746fe Deploy pages on all branches. 2018-01-23 14:48:04 +01:00
171cda6186 New multi version documentation mechanism 2018-01-23 14:18:03 +01:00
4cc17e112f Fix goroutine leak in throttler logic. 2018-01-23 12:44:03 +01:00
b6af61fa6e ACME and corporate proxy. 2018-01-23 09:52:03 +01:00
4e07d92190 Fix doc dynamic certificates 2018-01-23 09:12:03 +01:00
fb4ba7af2b Migrate Sirupsen to sirupsen. 2018-01-22 12:16:03 +01:00
c134dcd6fe remove unecessary mutex usage in healthchecks 2018-01-22 11:32:02 +01:00
fc00e1c228 Don't reload configuration when rancher server is down 2018-01-22 11:00:07 +01:00
ae34486b57 Fix some doc links 2018-01-22 10:26:03 +01:00
d7b513e9aa Disable websocket compression 2018-01-19 17:34:03 +01:00
d8297a055a Fix breaking change in web metrics 2018-01-19 14:30:04 +01:00
5140bbe99a doc(mesos): add documentation. 2018-01-18 18:26:03 +01:00
0c33d110f4 chore(mesos): gen templates. 2018-01-18 18:26:03 +01:00
5b37fb83fd feat(mesos): add all labels. 2018-01-18 18:26:03 +01:00
bc6879ecc1 fix(mesos): invalid ip source. 2018-01-18 18:26:03 +01:00
17137ba3e7 refactor(mesos) be testable. 2018-01-18 18:26:03 +01:00
e9d2124885 refactor(mesos): template readability. 2018-01-18 18:26:03 +01:00
f1f2e1bf64 Fix missing configuration for jaeger reporter 2018-01-18 17:24:03 +01:00
ced5aa5dc6 Challenge HTTP must ignore deprecated web.path option 2018-01-17 18:46:03 +01:00
72bc74001f Add Tracing entry in the documentation. 2018-01-17 13:14:03 +01:00
adfa3f795c Fix typo in anonymous usage log message. 2018-01-17 12:20:04 +01:00
89d90de7d8 Merge branch '1.5.0-rc5' into master 2018-01-15 17:27:37 +01:00
fe426f6fb2 Prepare release v1.5.0-rc5 2018-01-15 16:48:03 +01:00
3e439cc39b Add Let's Encrypt HTTP Challenge 2018-01-15 16:04:05 +01:00
56c0634918 Return errors from Docker client.Events 2018-01-15 14:26:03 +01:00
bcadd68904 Fix data races. 2018-01-15 11:46:04 +01:00
9790aa91fe Apply various contentual and stylish improvements to the k8s docs. 2018-01-15 09:40:05 +01:00
5316b412d2 Fix concurrent map writes on digest auth 2018-01-12 20:00:05 +01:00
b5ee5c34f2 Add compression and better error handling 2018-01-12 17:52:03 +01:00
2618aef008 Switch to golang/dep. 2018-01-11 17:46:04 +01:00
8239e04a19 fix: typo in Docker template. 2018-01-11 15:20:06 +01:00
709d50836b Fix bad access log 2018-01-11 10:04:03 +01:00
e2c5f3712f Fix redirect problem on dashboard + docs/tests on [web] 2018-01-11 09:46:03 +01:00
ee71b4bfef homogenization of templates: ECS 2018-01-10 18:28:03 +01:00
0d57e2aed9 homogenization of templates: Rancher 2018-01-10 18:08:03 +01:00
30ffba78e6 Opentracing support 2018-01-10 17:48:04 +01:00
8394549857 homogenization of templates: Consul Catalog 2018-01-10 16:20:10 +01:00
d0f3ad6024 Modify DEBUG messages to get ACME certificates 2018-01-10 15:20:03 +01:00
870c0b5cf4 homogenization of templates: Marathon 2018-01-10 11:58:03 +01:00
044d87d96d Switch to golang/dep. 2018-01-09 21:46:04 +01:00
b60edd9ee9 fix: list parsing. 2018-01-09 20:00:05 +01:00
b1ea36793b refactor: simplify template and use typed function. 2018-01-09 20:00:05 +01:00
750878d668 homogenization of templates: Docker 2018-01-09 16:26:03 +01:00
617b8b20f0 Merge branch 'v1.5' into master 2018-01-09 15:46:56 +01:00
d88554fa92 fix: list entries parsing. 2018-01-09 12:40:04 +01:00
e74a20de24 Document rewrite-target annotation. 2018-01-09 11:56:02 +01:00
7c227392fa fix: glide files. 2018-01-09 11:24:03 +01:00
8a697f7a39 Fix: timeout integration test 2018-01-09 10:08:03 +01:00
8327dd0c0b Add support for fetching k8s Ingress TLS data from secrets 2018-01-08 00:36:03 +01:00
60fd26e0b7 Add a clustering example with Docker Swarm 2018-01-07 15:54:03 +01:00
acd0c1bcd5 GzipResponse must implement CloseNotifier if ResponseWriter implement it 2018-01-05 02:26:03 +01:00
9b3750320b chore(kv): gen templates. 2018-01-04 18:42:02 +01:00
b9f1f7752d feat(kv): add more tests. 2018-01-04 18:42:02 +01:00
944008661f feat(kv): add custom headers configuration. 2018-01-04 18:42:02 +01:00
79ae52aca7 feat(kv): add rate limits configuration. 2018-01-04 18:42:02 +01:00
51390aa874 feat(kv): add error pages configuration. 2018-01-04 18:42:02 +01:00
cfa1f47226 feat(kv): add frontend redirect configuration. 2018-01-04 18:42:02 +01:00
40b59da224 feat(kv): add basicAuth configuration. 2018-01-04 18:42:02 +01:00
f7ed4a5805 feat(kv): add whitelistSourceRange configuration. 2018-01-04 18:42:02 +01:00
3d47030349 feat(kv): add health check port configuration. 2018-01-04 18:42:02 +01:00
34eb2e371e feat(kv): add passTLSCert configuration. 2018-01-04 18:42:02 +01:00
6573634012 feat(kv): constants and generic methods. 2018-01-04 18:42:02 +01:00
61ecb4cd18 Split consul and consul catalog. 2018-01-04 15:56:02 +01:00
22bdbd2498 Prepare release 1.5.0-rc4 2018-01-04 15:22:03 +01:00
287fb78654 Split Consul and Consul Catalog documentation 2018-01-04 14:48:03 +01:00
06d528a2bd refactor(consulcatalog): enhance tests. 2018-01-04 11:42:03 +01:00
1fe6a8b04d chore(consulcatalog): gen templates. 2018-01-04 11:42:03 +01:00
bd5cab6e87 doc(consulcatalog): add tags documentation
- add a dedicate page for Consul Catalog.
2018-01-04 11:42:03 +01:00
238acd9330 feat(consulcatalog): add custom Headers tags. 2018-01-04 11:42:03 +01:00
8e7ac513b6 refactor: add backend name functions. 2018-01-04 11:42:03 +01:00
e56551d047 feat(consulcatalog): add rate limit and error pages tags. 2018-01-04 11:42:03 +01:00
170fc13e02 feat(consulcatalog): add frontend redirect tags. 2018-01-04 11:42:03 +01:00
97ce77169a feat(consulcatalog): add HealthCheck tags. 2018-01-04 11:42:03 +01:00
c9b871a03a feat(consulcatalog): add WhitelistSourceRange tags. 2018-01-04 11:42:03 +01:00
2fdefa258e feat(consulcatalog): add passTLSCert tags. 2018-01-04 11:42:03 +01:00
f0a733d6d6 refactor(consulcatalog): new template methods approach. 2018-01-04 11:42:03 +01:00
586b5714a7 refactor(consulcatalog): reorganize code. 2018-01-04 11:42:03 +01:00
6e23454202 refactor(consulcatalog): template readability. 2018-01-04 11:42:03 +01:00
5b24403c8e Don't panic if ResponseWriter does not implement CloseNotify 2018-01-04 11:18:03 +01:00
e83599dd08 Add a note on how to add label to a docker compose file 2018-01-04 10:34:03 +01:00
de7dd068d9 refactor(ecs): headers as pointer. 2018-01-03 23:52:03 +01:00
a33476dea8 doc(ecs): update labels documentation. 2018-01-03 23:52:03 +01:00
dceccbdb92 chore(ecs): gen templates. 2018-01-03 23:52:03 +01:00
393651f5e2 feat(ecs): add error pages and rate limits. 2018-01-03 23:52:03 +01:00
5acee9e11d refactor: enhance template function readability. 2018-01-03 23:52:03 +01:00
81626eef38 feat(ecs): add headers labels. 2018-01-03 23:52:03 +01:00
e60fbbbebe feat(ecs): add frontend redirect labels. 2018-01-03 23:52:03 +01:00
e45e63dc37 feat(ecs): add whitelistSourceRange label. 2018-01-03 23:52:03 +01:00
c3d5ad2eeb feat(ecs): add PassTLSCert label. 2018-01-03 23:52:03 +01:00
7c64f5d31e feat(ecs): add MaxConn label. 2018-01-03 23:52:03 +01:00
66f46c5b96 feat(ecs): add circuit Breaker label. 2018-01-03 23:52:03 +01:00
07a6d48a27 refactor(ecs): add hasLoadBalancerLabel function. 2018-01-03 23:52:03 +01:00
722ea28e3a feat(ecs): add HealthCheck port label. 2018-01-03 23:52:03 +01:00
f195ef27f3 refactor(ecs): template readability. 2018-01-03 23:52:03 +01:00
7e5c258266 refactor(rancher): headers as pointer. 2018-01-03 23:26:03 +01:00
38b5aef208 chore(rancher): gen templates. 2018-01-03 23:26:03 +01:00
a7e4ded722 doc(rancher): add labels documentation. 2018-01-03 23:26:03 +01:00
22405a1259 feat(rancher): add rate limit and error pages labels. 2018-01-03 23:26:03 +01:00
d0a6689413 feat(rancher): add headers labels. 2018-01-03 23:26:03 +01:00
a1f47cb4db feat(rancher): add HealthCheck labels. 2018-01-03 23:26:03 +01:00
c884c7bb8a feat(rancher): add WhitelistSourceRange label. 2018-01-03 23:26:03 +01:00
c042098889 feat(rancher): add PassTLSCert label. 2018-01-03 23:26:03 +01:00
571f41dcf0 refactor(rancher): template readability. 2018-01-03 23:26:03 +01:00
f30ad20c9b Use gorilla readMessage and writeMessage instead of just an io.Copy 2018-01-03 15:32:03 +01:00
cbd54470ba Improve logging output for failing healthchecks 2018-01-03 12:32:03 +01:00
01e17b6c3e k8s guide: Leave note about assumed DaemonSet usage. 2018-01-03 09:12:03 +01:00
3e13ebec93 We need to flush the end of the body when retry is streamed 2018-01-02 16:02:03 +01:00
c84fb9895e Merge branch 'v1.5' into master 2018-01-02 15:21:17 +01:00
23c1a9ca8e Merge branch 'v1.4' into v1.5 2018-01-02 13:10:11 +01:00
741c739ef1 Prepare release v1.4.6 2018-01-02 12:54:03 +01:00
52f16e11a8 Use gorilla readMessage and writeMessage instead of just an io.Copy 2018-01-02 12:30:05 +01:00
5623a53464 chore(kv): gen templates. 2018-01-02 11:46:02 +01:00
c95393b238 refactor(kv): template readability. 2018-01-02 11:46:02 +01:00
be0dd71bb4 refactor(kv): split provide and configuration. 2018-01-02 11:46:02 +01:00
0ee6973e2f Upgrade docs dependencies and adapt configuration 2018-01-02 11:28:02 +01:00
4819974a1c Improve Marathon service label documentation. 2018-01-02 11:08:02 +01:00
e8e8b41eed Normalize serviceName added to the service backend names 2018-01-02 10:52:03 +01:00
7d23d3c0a4 Typo in docker.endpoint TCP port. 2018-01-02 10:38:03 +01:00
718fc7a79d Fix bug report command 2018-01-02 10:14:03 +01:00
bfd142b13b Fix custom headers template 2018-01-02 10:10:04 +01:00
75533b2beb Use prefix for sticky and stickiness tags. 2018-01-02 09:44:02 +01:00
e3d1201b46 Fix custom headers template 2018-01-02 09:42:03 +01:00
8f982ff1f2 Simplify storing renewed acme certificate 2017-12-27 14:22:02 +01:00
0391e21c84 Add default values for some Docker labels 2017-12-27 07:14:02 +01:00
b8a1cb5c68 refactor(marathon): fix labels and add tests. 2017-12-26 12:46:03 +01:00
7a71cd3012 doc(marathon): update labels documentation. 2017-12-26 12:46:03 +01:00
26bedced35 chore(marathon): gen templates. 2017-12-26 12:46:03 +01:00
c1aefb8ad8 feat(marathon): add error pages and rate limits. 2017-12-26 12:46:03 +01:00
576e87f398 feat(marathon): add headers labels. 2017-12-26 12:46:03 +01:00
b4f6bf0f6a feat(marathon): add frontend redirect labels. 2017-12-26 12:46:03 +01:00
edc55aad3c feat(marathon): add whitelistSourceRange label. 2017-12-26 12:46:03 +01:00
38a3fe4316 feat(marathon): add PassTLSCert label. 2017-12-26 12:46:03 +01:00
81e3b2dd4c feat(marathon): add HealthCheck port label. 2017-12-26 12:46:03 +01:00
4524cdc151 refactor(marathon): template readability. 2017-12-26 12:46:03 +01:00
9a7821b8fa Send empty configuration from file provider 2017-12-21 21:24:03 +01:00
e8333883df Add tests for TLS dynamic configuration in ETCD3 2017-12-21 18:02:04 +01:00
aeffe1036d refactor: no rate limits must return nil. 2017-12-21 17:44:03 +01:00
987e8a93bd refactor: no error pages must return nil. 2017-12-21 17:44:03 +01:00
2cb4acd6cc Remove obsolete paragraph about error pages. 2017-12-21 15:40:05 +01:00
1e44e339ad Allow deleting dynamically all TLS certificates from an entryPoint 2017-12-21 14:16:03 +01:00
59549d5f39 Use pointer of error pages 2017-12-21 11:26:03 +01:00
4a7297d05c Merge branch 'v1.5' into master 2017-12-20 15:47:15 +01:00
a5335667bb refactor(docker): move services tests. 2017-12-20 15:20:07 +01:00
498b806ca9 chore(docker): gen templates. 2017-12-20 15:20:07 +01:00
dd7a8a9a87 fix(docker): whitelist on services. 2017-12-20 15:20:07 +01:00
133aa77c21 doc(docker): add ratelimit and errorpages doc. 2017-12-20 15:20:07 +01:00
942614dd23 feat(docker): add rate limit labels. 2017-12-20 15:20:07 +01:00
c30ebe5f90 feat(docker): add error pages labels. 2017-12-20 15:20:07 +01:00
50757b5e99 refactor(docker): re-order templates functions. 2017-12-20 15:20:07 +01:00
42b900b9b2 doc(docker): HealthCheck labels. 2017-12-20 15:20:07 +01:00
c26b9b1a5d feat(docker): add HealthCheck labels. 2017-12-20 15:20:07 +01:00
9ee642a7db doc(docker): order labels. 2017-12-20 15:20:07 +01:00
423385bca0 feat(docker): add passTLSCert label. 2017-12-20 15:20:07 +01:00
6e5f7650a5 refactor(docker): template readability. 2017-12-20 15:20:07 +01:00
89a79d0f1b Prepare release 1.5.0-rc3 2017-12-20 15:10:06 +01:00
9e41485ff1 Modify ACME configuration migration into KV store 2017-12-20 14:40:07 +01:00
3c7c6c4d9f Mesos: Use slave.PID.Host as task SlaveIP. 2017-12-20 12:12:03 +01:00
cd1b3904da Add missing entrypoints template. 2017-12-20 10:26:03 +01:00
b23b2611b3 Add non regex pathPrefix 2017-12-19 17:00:12 +01:00
877770f7cf Update go-marathon 2017-12-19 16:00:09 +01:00
3142a4f4b3 Fix stickiness bug due to template syntax error 2017-12-19 14:08:03 +01:00
b4dc96527d Move rate limit documentation. 2017-12-19 09:48:03 +01:00
35b5ca4c63 fix isHealthy logic. 2017-12-18 10:30:08 +01:00
daf3023b02 Change Zookeeper default prefix. 2017-12-18 09:22:03 +01:00
705f3f1372 Drop unnecessary type conversions 2017-12-18 09:14:03 +01:00
f6520727a3 Merge branch 'v1.5' into master 2017-12-15 22:16:48 +01:00
b17d5b80b8 Reload configuration when port change for one service 2017-12-15 20:52:03 +01:00
48b4eb5c0d Fix bad Træfik update on Consul Catalog 2017-12-15 16:00:14 +01:00
7ecd6d20ba Support regex redirect by frontend 2017-12-15 11:48:03 +01:00
bddad57a7b Fix RawPath handling in addPrefix 2017-12-15 03:50:07 +01:00
799136a714 fix: backend name for Stateful services. (Service Fabric) 2017-12-15 01:22:03 +01:00
350d61b4a6 Fix github.com/containous/traefik-extra-service-fabric dep to v1.0.1. 2017-12-14 16:06:03 +01:00
b6f5a66fab Grammar 2017-12-13 18:22:05 +01:00
b0c12e2422 Fix: frontend redirect 2017-12-13 17:02:04 +01:00
623a7dc7e6 Fix small missing property in documentation for consul catalog 2017-12-13 11:56:02 +01:00
709c7e5707 Improve documentation for Cloudflare API key 2017-12-13 11:56:02 +01:00
5f6c5025d5 Fix Flaky Consul Catalog tests. 2017-12-13 11:54:03 +01:00
328be161d6 Forward Authentication: add X-Forwarded-Uri 2017-12-10 00:58:21 +01:00
ee04f52a16 Fix broken links and improve ResponseCodeRatio() description 2017-12-08 16:12:04 +01:00
c446c291d9 Use default entryPoints when certificates are added with no entryPoints. 2017-12-08 11:02:03 +01:00
c66d9de759 Custom headers by service labels for docker backends 2017-12-06 22:26:03 +01:00
260ee980e0 Merge 'v1.5.0-rc2' into master 2017-12-06 20:24:46 +01:00
7d98c1c4e0 Prepare release v1.5.0-rc2 2017-12-06 15:58:03 +01:00
4387cf38d7 Close ring buffer used in throttling function. 2017-12-06 14:54:03 +01:00
a9d38570ab Merge tag 'v1.4.5' into v1.5 2017-12-06 13:05:08 +01:00
0e619369fd fix healthcheck when web is not specified 2017-12-06 11:20:03 +01:00
6890dc1844 Simplification 2017-12-06 10:52:03 +01:00
cda09c843a Prepare release v1.4.5 2017-12-06 10:44:03 +01:00
e2190bd9d5 Builders in k8s tests 2017-12-05 20:24:03 +01:00
0472d19bd4 refactor: fix some code. 2017-12-05 19:40:04 +01:00
07524f5c99 refactor: remove common_label.go 2017-12-05 19:40:04 +01:00
1710800cc0 refactor(consulCatalog): review and split. 2017-12-05 19:40:04 +01:00
c705d6f9b3 refactor(ecs): rewrite configuration system. 2017-12-05 19:40:04 +01:00
be718aea11 refactor(mesos): rewrite configuration system. 2017-12-05 19:40:04 +01:00
ca680710a2 refactor(rancher): rewrite configuration system. 2017-12-05 19:40:04 +01:00
5f71a43758 refactor(eureka): rewrite configuration system. 2017-12-05 19:40:04 +01:00
04dd63da1c refactor(k8s): rewrite configuration system. 2017-12-05 19:40:04 +01:00
cee022b935 refactor(marathon): rewrite configuration system. 2017-12-05 19:40:04 +01:00
ae2ae85070 refactor(docker): rewrite configuration system. 2017-12-05 19:40:04 +01:00
ce6bbbaa33 feat: labels/annotations parser. 2017-12-05 19:40:04 +01:00
6333bfe6e8 Modify the ACME renewing logs level 2017-12-05 15:42:03 +01:00
41d8863d2f Fix pprof route order. 2017-12-05 10:50:03 +01:00
523b7f96f8 Add note to Kubernetes RBAC docs about RoleBindings and namespaces 2017-12-05 02:46:03 +01:00
ab1a930705 Emphasize the necessity of enabling file backend 2017-12-05 02:30:02 +01:00
dc74f76a03 Merge branch 'v1.5' into master 2017-12-04 13:35:02 +01:00
3a99c86cb3 Change custom headers separator 2017-12-04 11:40:03 +01:00
d6ad7e2e64 Fix empty IP for backend when dnsrr in Docker swarm mode 2017-12-01 14:34:03 +01:00
aaf120f263 Reduce logs with new Kubernetes security annotations 2017-12-01 14:00:04 +01:00
c228e73b26 fix Docker labels documentation render. 2017-12-01 09:36:02 +01:00
e27e65eb76 Fix wrong defaultentrypoint and unexisting entrypoint issue 2017-11-30 16:10:02 +01:00
1c8acf3929 Doesn't ignore web params when web.metrics.prometheus is set 2017-11-30 14:12:04 +01:00
40b3c17703 Fix metrics problem on multiple entrypoints 2017-11-30 12:18:03 +01:00
e042ef3f27 Bump Lego Version for GoDaddy DNS Provider 2017-11-30 10:44:03 +01:00
313357a6b3 quote template strings 2017-11-30 10:42:02 +01:00
37a1aaad64 Improve consul documentation 2017-11-30 10:12:03 +01:00
f084d2a28b Fix Labels/annotation logs and values. 2017-11-30 09:26:03 +01:00
077b39d7c6 Add option -s to gofmt for autogen 2017-11-30 08:52:03 +01:00
7081f3df58 Sync vendor and glide. 2017-11-29 13:26:03 +01:00
9fe6a0a894 Prepare release v1.5.0-rc1 2017-11-28 14:50:06 +01:00
3d452fd5b9 Merge branch 'v1.4' into master 2017-11-28 14:03:55 +01:00
47a5cfbd3e Fix empty ip when container is stopped 2017-11-28 13:58:04 +01:00
4cb6241e93 Kubernetes security header annotations 2017-11-28 13:36:03 +01:00
b572879691 Add link to futur 1.5 documentation. 2017-11-28 13:06:03 +01:00
ad07a6ab2b fix: Service Fabric 'expose' as boolean. 2017-11-28 12:02:02 +01:00
4bdeb33ac1 Docker labels 2017-11-28 11:16:03 +01:00
101a4d0d8d Describe 'refreshSecond' configuration. 2017-11-27 17:02:05 +01:00
89e07d0c55 Add link to crypto/tls godoc. 2017-11-27 15:24:03 +01:00
39c1cc1b3c Add Service Fabric Provider 2017-11-27 14:26:04 +01:00
9f6f637527 Merge branch 'v1.4' into master 2017-11-27 11:40:50 +01:00
0f09551a76 Fix kubernetes path prefix rule with rewrite-target 2017-11-27 11:22:03 +01:00
8cd72cfc1b remove obsolete links in k8s docs 2017-11-27 10:04:02 +01:00
7a141c8616 Document filename parameter for Kubernetes. 2017-11-26 01:02:03 +01:00
0ca65f955d Stats collection. 2017-11-25 13:36:03 +01:00
011b748a55 Change server receiver name. 2017-11-24 19:18:03 +01:00
f6181ef3e2 Fix custom headers replacement 2017-11-23 17:40:03 +01:00
24368747ab Use healthcheck for systemd watchdog 2017-11-23 16:10:04 +01:00
66591cf216 Merge tag 'v1.4.4' into master 2017-11-23 15:21:47 +01:00
1feeeb2eec Manage certificates dynamically in kv store 2017-11-23 11:50:03 +01:00
419d46c958 Prepare release v1.4.4 2017-11-23 11:48:03 +01:00
7063da1c7d Add docker security headers via labels 2017-11-22 19:40:04 +01:00
bee8ebb00b Resync oxy with original repository 2017-11-22 18:20:03 +01:00
da5e4a13bf add entrypoint in prometheus doc and remove web on influxdb doc 2017-11-22 16:28:03 +01:00
5dc1ec68a3 Uncompress generated files. 2017-11-22 12:00:04 +01:00
3d2e5ebe39 Fix typo in examples 2017-11-22 10:16:03 +01:00
f5130db6b0 gofmt generated file. 2017-11-21 21:30:03 +01:00
676b79db42 Fix raw path handling in strip prefix 2017-11-21 14:28:03 +01:00
6d2f4a0813 Add health check label to ECS 2017-11-21 11:06:03 +01:00
4b91204686 Marathon constraints filtering 2017-11-21 10:48:04 +01:00
7ddefcef72 Add file to storeconfig 2017-11-21 10:24:03 +01:00
0f3e42d463 autogen file mode 2017-11-21 08:20:04 +01:00
c9129b8ecf Remove GzipHandler Fork 2017-11-20 18:32:03 +01:00
a6955ecf59 Vendor generated file from template 2017-11-20 15:26:03 +01:00
6619a787a3 Fix problems about duplicated and missing Docker backends/frontends. 2017-11-20 15:16:03 +01:00
aae17c817b Fix issue with label traefik.backend.loadbalancer.stickiness.cookieName 2017-11-20 11:42:03 +01:00
ab87bad952 Run Rancher tests cases in parallel. 2017-11-20 11:40:04 +01:00
be306d651e Register pprof handlers. 2017-11-20 11:04:03 +01:00
8fe5c22075 Exclude RC from doc publication. 2017-11-20 09:42:02 +01:00
05a9350e57 Use contants from http package. 2017-11-20 09:40:03 +01:00
7ed4ae2f8c Add labels for traefik.frontend.entryPoints & PassTLSCert to Kubernetes 2017-11-20 02:12:03 +01:00
5d6384e101 redirect to another entryPoint per frontend 2017-11-18 13:50:03 +01:00
1a4564d998 http.Server log goes to Debug level. 2017-11-18 01:10:03 +01:00
66e489addb Update libkv dependency 2017-11-17 17:22:03 +01:00
cdab6b1796 fix concurrent provider config reloads 2017-11-17 10:26:03 +01:00
722f299306 Support template as raw string. 2017-11-17 10:12:03 +01:00
66be04f39e Documentation archive 2017-11-16 09:20:03 +01:00
8719f2836e Merge 'v1.4.3' into master
Release v1.4.3
2017-11-15 23:01:08 +01:00
0c702b0b6b Revert "Merge v1.4.2 into master" 2017-11-15 18:18:03 +01:00
6fcab72ec7 Merge v1.4.2 into master 2017-11-14 16:48:03 +01:00
77b111702b Prepare release v1.4.3 2017-11-14 12:06:03 +01:00
96a7cc483f Add Traefik prefix to the KV key 2017-11-14 11:38:03 +01:00
1e3506848a Flush and errorcode 2017-11-14 11:16:03 +01:00
5ee2cae85c Fix Traefik reload if Consul Catalog tags change 2017-11-13 12:14:02 +01:00
5c119fe2d6 Exclude GRPC from compress 2017-11-10 14:12:02 +01:00
d55115844a Fix typos in changelog 2017-11-10 11:12:02 +01:00
4f4491c247 Allow adding optional Client CA files 2017-11-10 10:30:04 +01:00
1691f586d7 fix: flaky test influxdb. 2017-11-09 17:22:03 +01:00
04dfe0de84 Put subcommand in dedicated files. 2017-11-09 17:08:03 +01:00
27d1b46835 Split Web into API/Dashboard, ping, metric and Rest Provider 2017-11-09 16:12:04 +01:00
2f62ec3632 Link corrected 2017-11-09 15:54:04 +01:00
384488ac02 Remove unused lightMarathonClient. 2017-11-09 12:40:02 +01:00
c469e669fd Make the TLS certificates management dynamic. 2017-11-09 12:16:03 +01:00
56affb90ae Add secret creation to docs for kubernetes backend 2017-11-09 10:52:03 +01:00
f6aa147c78 Add tests for websocket headers 2017-11-09 10:04:03 +01:00
9bd0fff319 Keep status when stream mode and compress 2017-11-09 00:48:03 +01:00
00d7c5972f Add InfluxDB support for traefik metrics 2017-11-08 15:14:03 +01:00
58a438167b Minor fix for docker volume vs created directory 2017-11-08 15:12:03 +01:00
e3131481e9 chore: sort imports 2017-11-08 11:40:04 +01:00
bc8d68bd31 docs: fix some typos 2017-11-07 11:50:03 +01:00
07c6e33598 Update Rancher API integration to go-rancher client v2. 2017-11-05 13:02:03 +01:00
70812c70fc Postfix windows binaries with .exe 2017-11-03 17:02:14 +01:00
d89b234cad Fix typo in frontend.headers.customresponseheaders label 2017-11-03 14:32:03 +01:00
2070aa9443 Merge 'v1.4.2' into master 2017-11-03 13:51:24 +01:00
91ff94ea56 dumpcerts.sh: Fix call to "base64" for Alpine 2017-11-02 15:52:04 +01:00
0347537f43 Freeze version of mkdocs-material. 2017-11-02 14:38:03 +01:00
db9b18f121 Prepare release v1.4.2 2017-11-02 12:28:03 +01:00
ee70001be3 [doc] - update documentation to add AWS_HOSTED_ZONE_ID 2017-11-02 11:44:04 +01:00
972eea97fe [ecs] - fix import order 2017-11-02 11:44:04 +01:00
2b4d33e919 Pass through certain forward auth negative response headers 2017-11-02 11:06:03 +01:00
fc4d670c88 Minor grammar change 2017-11-02 10:38:03 +01:00
02035d4942 Missing Backend key in configuration when application has no tasks 2017-11-01 11:26:03 +01:00
93a46089ce Support Host NetworkMode for ECS provider 2017-10-31 11:44:03 +01:00
e8d63b2a3b Update github.com/xenolf/lego to 0.4.1 2017-10-31 10:42:03 +01:00
d3c7681bc5 New PR template 2017-10-30 16:38:03 +01:00
dc66db4abe Make the traefik.port label optional when using service labels in Docker containers. 2017-10-30 15:10:05 +01:00
a0e1cf8376 Fix IP address when Docker container network mode is container 2017-10-30 14:36:04 +01:00
5292b84f4f fixed dead link in kubernetes backend config docs 2017-10-30 14:04:03 +01:00
b27455a36f entrypoints -> entryPoints 2017-10-30 13:20:03 +01:00
5042c5bf40 Added ReplacePathRegex middleware 2017-10-30 12:54:03 +01:00
da7b6f0baf Make frontend names differents for similar routes 2017-10-30 12:06:03 +01:00
9b5845f1cb Fix datastore corruption on reload due to shrinking config size 2017-10-30 11:22:04 +01:00
e8633d17e8 Add proxy protocol tests 2017-10-30 10:02:03 +01:00
d1d8b01dfb Use Node IP in Swarm Standalone with "host" NetworkMode 2017-10-25 20:20:03 +02:00
7c4353a0ac Add missing functions for ECS template 2017-10-25 17:18:03 +02:00
1b2cb53d4f Fix the k8s docs example deployment yaml 2017-10-25 16:58:04 +02:00
3158e51c62 Remove hardcoded runtime.GOMAXPROCS. 2017-10-25 16:16:02 +02:00
a0c72cdf00 Merge v1.4.1 into master 2017-10-25 11:36:14 +02:00
f0371da838 Add unique ID to Docker services replicas 2017-10-25 10:00:03 +02:00
44b82e6231 Fix mkdocs version 2017-10-24 18:06:03 +02:00
04f0bf3070 Prepare release v1.4.1 2017-10-24 15:52:04 +02:00
7400c39511 Stream mode when http2 2017-10-24 14:38:02 +02:00
008a5af6d6 Add mmatur to maintainers 2017-10-24 13:18:03 +02:00
35ca40c3de Enhance Trust Forwarded Headers 2017-10-23 16:12:03 +02:00
de821fc305 fix healthcheck path 2017-10-23 15:48:03 +02:00
e3cac7d0e5 fix(docker): Network filter. 2017-10-23 14:20:03 +02:00
81f7aa9df2 Regex capturing group. 2017-10-23 10:20:02 +02:00
6bce298d90 Add a note about redirection rule to precise how regex/replacement work. 2017-10-22 09:44:03 +02:00
afbad56012 Force http/1.1 for websocket 2017-10-20 17:38:04 +02:00
d973096464 Add Custom header parsing to Docker Provider 2017-10-20 17:14:03 +02:00
7192aa86b5 Merge 'v1.4.0' into master 2017-10-16 23:10:44 +02:00
9c8df8b9ce Fix 1.4.0 release date 2017-10-16 19:44:02 +02:00
ff4c7b82bc Prepare release v1.4.0 2017-10-16 18:42:03 +02:00
47ff51e640 add retry backoff to staert config loading 2017-10-16 18:06:04 +02:00
08503655d9 Backward compatibility for sticky 2017-10-16 17:38:03 +02:00
3afd6024b5 Fix consul catalog retry 2017-10-16 16:58:03 +02:00
aa308b7a3a Add TrustForwardHeader options. 2017-10-16 12:46:03 +02:00
9598f646f5 New entry point parser. 2017-10-13 15:04:02 +02:00
8af39bdaf7 Changed Docker network filter to allow any swarm network 2017-10-13 12:00:03 +02:00
914f3d1fa3 Do not run integration tests by default. 2017-10-13 11:08:03 +02:00
8cb3f0835a Stickiness cookie name. 2017-10-12 17:50:03 +02:00
cba0898e4f fix seconds to really be seconds 2017-10-12 16:26:03 +02:00
8d158402f3 Continue processing on invalid auth-realm annotation. 2017-10-12 15:48:03 +02:00
7f2582e3b6 Nil body retries 2017-10-12 15:10:04 +02:00
dbc796359f Fix Proxy Protocol documentation 2017-10-12 11:10:03 +02:00
4d1285d8e5 Add docker things for documentation 2017-10-11 14:46:03 +02:00
871d097b30 Fix traefik logs to behave like configured 2017-10-11 10:38:03 +02:00
1532033a7f Create dummy main() function in generate.go. 2017-10-10 18:20:02 +02:00
9faae7387e Merge tag 'v1.4.0-rc5' into master 2017-10-10 17:17:44 +02:00
a5c644e719 Only listen to configured k8s namespaces. 2017-10-10 16:26:03 +02:00
7a2ce59563 Prepare release v1.4.0-rc5 2017-10-10 15:50:03 +02:00
14cec7e610 Stickiness documentation 2017-10-10 15:24:03 +02:00
6287a3dd53 Add trusted whitelist proxy protocol 2017-10-10 14:50:03 +02:00
93a1db77c5 Move http2 configure transport 2017-10-10 12:14:03 +02:00
a9d4b09bdb Stickiness cookie name 2017-10-10 11:10:02 +02:00
ed2eb7b5a6 Quote priority values in annotation examples. 2017-10-09 14:16:03 +02:00
18d8537d29 Document ways to partition Ingresses in the k8s guide. 2017-10-09 12:36:03 +02:00
72f3b1ed39 Remove pod from RBAC rules. 2017-10-09 12:12:03 +02:00
fd70e6edb1 enable prefix matching within slash boundaries 2017-10-06 11:34:03 +02:00
5a578c5375 Updating make run-dev 2017-10-06 10:44:03 +02:00
9db8773055 fix flakiness in log rotation test 2017-10-06 09:20:13 +02:00
8a67434380 Sanitize cookie names. 2017-10-05 12:14:03 +02:00
c94e5f3589 Delay first version check 2017-10-05 08:42:02 +02:00
adef7200f6 Fix grammar 2017-10-03 10:22:03 +02:00
cf508b6d48 Merge 'v1.4.0-rc4' into master 2017-10-02 17:18:24 +02:00
f8d36fda28 Prepare release v1.4.0-rc4 2017-10-02 16:00:03 +02:00
4fe9cc7730 Add tests for urlencoded part in url 2017-10-02 15:36:02 +02:00
758b7f875b Fix grammar mistake in the kv-config docs 2017-10-02 14:58:04 +02:00
0b97a67cfa CI: speed up pull images. 2017-10-02 14:22:03 +02:00
ec5976bbc9 Update gRPC example 2017-10-02 11:34:03 +02:00
5cc49e2931 bug command. 2017-10-02 10:32:02 +02:00
b6752a2c02 Forward upgrade error from backend 2017-09-29 21:04:03 +02:00
d41e28fc36 Handle empty ECS Clusters properly 2017-09-29 16:56:03 +02:00
64c52a6921 Consul catalog remove service failed 2017-09-29 16:30:03 +02:00
691a678b19 Improve compression documentation 2017-09-29 10:34:03 +02:00
1ba7fd91ff grep to-be-pulled-images directly to avoid newline issue. 2017-09-26 14:44:03 +02:00
1c98a9ad3e Add request accepting grace period delaying graceful shutdown. 2017-09-26 10:22:03 +02:00
dd23ceeead Updating Docker output and curl for sticky sessions 2017-09-22 17:22:03 +02:00
058fa1367b CI: speed up pull images. 2017-09-22 16:46:03 +02:00
9db12374ea Be certain to clear our marshalled representation before reloading it 2017-09-22 16:14:03 +02:00
fc550ac1fc Dumpcerts.sh: fixed sed, extracted domain keys 2017-09-22 15:18:03 +02:00
d6ef8ec3d1 Merge branch 'v1.4' into master 2017-09-21 11:37:33 +02:00
837db9a2d9 add json format support for traefik logs 2017-09-21 10:42:02 +02:00
a941739f8a Change pull image command in Makefile 2017-09-20 20:02:02 +02:00
795a346006 Flaky tests and refresh problem in consul catalog 2017-09-20 19:08:02 +02:00
9d00da7285 fix SSE subscriptions when retries are enabled 2017-09-20 18:40:03 +02:00
52c1909f24 Fix deprecated IdleTimeout config 2017-09-20 18:14:03 +02:00
2cbf9cae71 Merge tag 'v1.4.0-rc3' into master 2017-09-18 21:52:44 +02:00
f9225c54ff Prepare release v1.4.0-rc3 2017-09-18 18:20:03 +02:00
cb05f36976 Manage Headers for the Authentication forwarding. 2017-09-18 17:48:07 +02:00
49e0e20ce2 fix healthcheck port 2017-09-18 15:50:03 +02:00
7c35337999 Remove GZIPHandler fork. 2017-09-18 11:04:03 +02:00
2296aab5a8 refactor: unflaky access log. 2017-09-18 09:44:03 +02:00
ce3b255f1a chore: Use go-check fork. 2017-09-18 09:44:03 +02:00
3942f3366d User guide gRPC 2017-09-16 10:56:02 +02:00
df76cc33a5 Fixes entry points configuration. 2017-09-15 20:56:04 +02:00
cf387d5a6d Enable loss less rotation of log files 2017-09-15 15:02:03 +02:00
0a0cf87625 Fix rancher host IP address 2017-09-15 12:30:03 +02:00
1a2544610d Enhance web backend documentation 2017-09-15 09:18:03 +02:00
5229b7cfba Add forward auth documentation. 2017-09-14 21:26:02 +02:00
243b45881d Document custom error page restrictions. 2017-09-14 08:50:02 +02:00
883028d981 Add examples of proxying ping 2017-09-13 15:24:03 +02:00
bdeb7bfb9f Display Traefik logs in integration test 2017-09-13 10:34:04 +02:00
808ffb0491 Explains new bot features. 2017-09-12 21:04:03 +02:00
5305a16350 Add guide section on production advice, esp. CPU. 2017-09-12 19:56:04 +02:00
63b581935d Add stack name to backend name generation to fix rancher metadata backend 2017-09-12 15:06:04 +02:00
c7c9349b00 Enhance documentation readability. 2017-09-11 19:10:04 +02:00
d54417acfe Rate limiting for frontends 2017-09-09 13:36:03 +02:00
9fba37b409 Merge v1.4.0-rc2 into master 2017-09-09 01:00:48 +02:00
6d28c52f59 Prepare release v1.4.0-rc2 2017-09-08 21:28:02 +02:00
f80a6ef2a6 Fix consul catalog refresh problems 2017-09-08 20:50:04 +02:00
ecf31097ea Upgrade oxy for websocket bug 2017-09-08 16:14:03 +02:00
16fc3675db Force GOARM to v6. 2017-09-08 14:50:04 +02:00
651d993d9c prometheus, HTTP method and utf8 2017-09-08 11:22:03 +02:00
03eb5139a2 Anonymize contributing doc 2017-09-08 10:28:03 +02:00
286d882f1e Remove old glide elements for integration tests. 2017-09-08 10:26:03 +02:00
3b6afdf80c Fix error in prepareServer 2017-09-07 20:14:03 +02:00
c19cce69fa Add basic auth for ecs 2017-09-07 17:34:03 +02:00
5c4931e235 Update oxy for websocket bug 2017-09-07 16:06:04 +02:00
b705e64a8a Add Basic auth for consul catalog 2017-09-07 15:28:02 +02:00
7fd1eb3780 Upgrade libkermit/compose version 2017-09-07 15:14:03 +02:00
8c5514612f Fix whitespaces 2017-09-07 12:02:03 +02:00
924e82ab0c doc: add notes on server urls with path 2017-09-07 11:40:03 +02:00
adcb99d330 Update cluster.md 2017-09-07 11:16:03 +02:00
8339139400 Access log default values 2017-09-07 10:54:03 +02:00
a43cf8d2b8 Fix IAM policy sid. 2017-09-07 10:08:04 +02:00
2b863d9bc2 Upgrade libkermit/compose version 2017-09-06 15:02:03 +02:00
9ce4f94818 ECS provider refactoring 2017-09-06 12:10:05 +02:00
5157a6ad47 Send traefik logs to stdout 2017-09-06 11:58:03 +02:00
cd6c58a372 fix rancher api environment get 2017-09-06 10:50:04 +02:00
03ba8396f3 Add test for SSL TERMINATION in Websocket 2017-09-06 09:36:02 +02:00
b0a0e16136 Enhance documentation. 2017-09-05 15:58:03 +02:00
732d73dd43 [Docs] Fix invalid service yaml example 2017-09-05 11:42:03 +02:00
e075dfe911 refactor: re-organize doc. 2017-09-01 20:38:03 +02:00
425b53585a doc: fix error pages configuration. 2017-09-01 20:38:03 +02:00
d5bbb103d4 HTTPS for images, video and links in docs. 2017-09-01 19:44:03 +02:00
5c2849ea07 Enhance security headers doc. 2017-09-01 17:44:03 +02:00
723418e2cc fix: documentation Mesos. 2017-08-30 14:52:03 +02:00
45e2e8baec Update traefik SSH key take 2 (#2023) 2017-08-29 09:37:47 +02:00
b0ae6bc049 Prepare release v1.4.0-rc1 2017-08-29 02:10:03 +02:00
ffb53c07b8 refactor: basic configuration. 2017-08-28 23:02:04 +02:00
f329b3b51d chore: change CODEOWNERS file. 2017-08-28 23:02:04 +02:00
5b27aba3e1 doc: Material Theme. 2017-08-28 23:02:04 +02:00
7c2ba62b56 doc: structural review
- user-guide review.
- add DataDog and StatD configuration.
- sync sample.toml and doc.
- split entry points doc.
- Deprecated.
2017-08-28 23:02:04 +02:00
24862402e5 Refactor doc pages 2017-08-28 23:02:04 +02:00
d568d2f55a Update golang version in contributing guide 2017-08-28 15:20:03 +02:00
dae7e7a80a add RetryAttempts to AccessLog in JSON format 2017-08-28 12:50:02 +02:00
23cdb37165 Update Traefiker SSH key 2017-08-28 11:48:03 +02:00
2c82dfd444 Merge v1.3.7 2017-08-25 22:58:49 +02:00
c8c31aea62 Add proxy protocol 2017-08-25 21:32:03 +02:00
89b0037ec1 Improve Let's Encrypt documentation 2017-08-25 21:10:03 +02:00
b75fb23887 Update documentation for 1.4 release 2017-08-25 20:40:03 +02:00
52b69fbcb8 Add forward authentication option 2017-08-25 18:22:03 +02:00
f16219f90a Exposed by default feature in Consul Catalog 2017-08-25 17:32:03 +02:00
7b0cef0fac Prepare release v1.3.7 2017-08-25 17:08:02 +02:00
e0af17a17a Refactor globalConfiguration / WebProvider 2017-08-25 16:10:03 +02:00
92fb86b66f log X-Forwarded-For as ClientHost if present 2017-08-25 13:00:03 +02:00
919295cffc Only forward X-Fowarded-Port. 2017-08-25 12:14:03 +02:00
086a85d2f0 Enable loadbalancer.sticky for ECS 2017-08-25 11:42:03 +02:00
8235cd3645 refactor: minor changes. 2017-08-25 11:08:02 +02:00
f1a257abf8 refactor: enhance bug report command. 2017-08-25 11:08:02 +02:00
98dfd2ba0e Added a check to ensure clientTLS configuration contains either a cert or a key 2017-08-25 10:26:02 +02:00
87e6285cf6 Update certificates. 2017-08-25 09:20:03 +02:00
0d56a98836 Add support for Query String filtering 2017-08-24 20:28:03 +02:00
8105f1c379 Enable loadbalancer.sticky for Consul Catalog 2017-08-24 18:38:05 +02:00
e6c2040ea8 Extract metrics to own package and refactor implementations 2017-08-23 20:46:03 +02:00
c1b5b740ff toml page - replace li by table 2017-08-23 19:46:03 +02:00
1d2d0cefaa Fix documentation glitches. 2017-08-23 09:22:03 +02:00
04e65958ee Merge 'v1.3.6' 2017-08-22 16:23:18 +02:00
8765494cbd Add support for several ECS backends 2017-08-22 11:46:03 +02:00
05665f4eec Add more visibility to docker stack deploy label issue 2017-08-22 10:56:03 +02:00
396449c07f Add healthcheck command 2017-08-21 23:18:02 +02:00
eda679776e Add Marco Jantke to maintainers 2017-08-21 22:22:04 +02:00
69d57d602f Add guide for Docker, Traefik & Letsencrypt 2017-08-21 21:20:04 +02:00
32b2736efd Bump gorilla/mux version. 2017-08-21 20:40:02 +02:00
3f650bbd11 Support X-Forwarded-Port. 2017-08-21 17:54:02 +02:00
5313922bb7 compress: preserve status code 2017-08-21 11:10:03 +02:00
ec3e2c08b8 Support multi-port service routing for containers running on Marathon 2017-08-21 10:46:03 +02:00
0367034f93 Fix docs about default namespaces. 2017-08-18 19:18:02 +02:00
b80ecd51a7 Use default frontend priority of zero. 2017-08-18 16:14:03 +02:00
14a0d66410 Add configurable timeouts and curate default timeout settings 2017-08-18 15:34:04 +02:00
d84ccbc52a doc: add bots documentation.
- move contributing guide
- move maintainer guide
2017-08-18 10:24:03 +02:00
1190768f4b chore: remove all PR scripts. 2017-08-18 10:24:03 +02:00
ea3510d1f3 Add support for readiness checks. 2017-08-18 03:08:03 +02:00
3f76f73e8c Mark Marathon and Kubernetes as constraint-supporting. 2017-08-18 02:40:03 +02:00
759c269dee Code cleaning. 2017-08-18 02:18:02 +02:00
c360395afc examples/k8s: fix ui ingress port out of sync with deployment 2017-08-18 01:40:03 +02:00
60a35c8aba Setting the Cookie Path explicitly to root 2017-08-13 11:34:34 +02:00
50dd2b8cff Change Traefik intro video 2017-08-11 15:19:36 +02:00
4e5fcac9cb Add log file close and reopen on receipt of SIGUSR1 2017-08-11 12:04:58 +02:00
64b8fc52c3 [marathon] Fix and extend integration tests.
- Update compose file.
- Add integration test for Marathon application deployment.
2017-08-10 21:58:08 +02:00
19a5ba3264 Update github.com/docker/libcompose
Update github.com/docker/libcompose in glide.* files.
Vendor github.com/docker/libcompose update.
2017-08-10 21:58:08 +02:00
7ff6c32452 Add the sprig functions in the template engine 2017-08-10 20:42:39 +02:00
ff11467022 Bind healthcheck to backend by entryPointName 2017-08-10 18:00:31 +02:00
7d3878214a Update documentation 2017-08-10 17:29:32 +02:00
984817d3a0 Add more files to CODEOWNERS. 2017-08-10 16:47:11 +02:00
6b133e24b9 Added RetryMetrics to DataDog and StatsD providers 2017-08-09 02:54:35 +02:00
990ee89650 Add helloworld tests with gRPC 2017-08-06 11:55:42 +02:00
8071f31721 Moved namespace to correct place 2017-08-03 10:25:05 +02:00
d456c2ce6a Merge 'v1.3.5' 2017-08-01 19:32:44 +02:00
94f922cd28 Added ability to override frontend priority for k8s ingress router 2017-07-29 18:35:23 +02:00
29390a3c4a Update the documentation to use DaemonSet or Deployment (#1735) 2017-07-29 12:50:04 +02:00
765c44d77f [kubernetes] Add secrets resource to in-line RBAC spec.
Previously only existed in the Github-hosted example file.
2017-07-27 10:02:02 +02:00
64ee68763b feat: match doc also. 2017-07-24 10:06:22 +02:00
4122aef12e chore: fix CODEOWERS file. 2017-07-24 10:06:22 +02:00
8cb44598c0 [marathon] Use test builder.
This change introduces the builder pattern to the Marathon unit tests in
order to simplify and reduce the amount of testing boilerplate.

Additional changes:

- Add missing unit tests.
- Make all tests look consistent.
- Use dedicated type for task states for increased type safety.
- Remove obsoleted getApplication function.
2017-07-21 17:15:29 +02:00
69c628b626 DataDog and StatsD Metrics Support
* Added support for DataDog and StatsD monitoring
* Added documentation
2017-07-21 00:26:43 +02:00
cd28e7b24f fix GraceTimeOut description
Documentation stated that GraceTimeOut describes the timeout between
hot-reloads, which is not the case. GraceTimeOut describes the timeout
Traefik uses to finish serving active requests before stopping only.
2017-07-20 23:42:43 +02:00
40d9058bb6 refactor: migration Negroni from codegangsta to urfave 2017-07-20 15:19:15 +02:00
c36e0b3b06 refactor: add Safe everywhere is needing. 2017-07-20 14:59:54 +02:00
3174fb8861 [marathon] Assign filtered tasks to apps contained in slice.
We previously assigned them to a copy of each application, which
effectively disabled all filtering.

Fixes a bug introduced along commit 779eeba.
2017-07-20 10:39:27 +02:00
074b31b5e9 respond with 503 on empty backend 2017-07-19 19:28:24 +02:00
16609cd485 Update docs for dnsimple env vars.
* Lego library uses DNS_OAUTH_TOKEN instead of DNSIMPLE_OAUTH_TOKEN
2017-07-19 18:01:24 +02:00
70ab34cfb8 doc change regarding consul SSL
document change to clarify consul ssl, vs consul ssl client certificate security
2017-07-18 17:22:08 +02:00
c53be185f4 chore(glide): change nergoni git url. 2017-07-12 10:22:39 +02:00
779eeba650 [marathon] Use single API call to fetch Marathon resources.
Change Marathon provider to make just one API call instead of two per
configuration update by means of specifying embedded resources, which
enable retrieving multiple response types from the API at once. Apart
from the obvious savings in API calls, we primarily gain a consistent
view on both applications and tasks that allows us to drop a lot of
correlation logic.  Additionally, it will serve as the basis for the
introduction of readiness checks which require application/task
consistency for correct leverage on the proxy end.

Additional changes:

marathon.go:
- Filter on tasks now embedded inside the applications.
- Reduce/simplify signature on multiple template functions as we do not
  need to check for proper application/task correlation anymore.
- Remove getFrontendBackend in favor of just getBackend.
- Move filtering on enabled/exposed applications from `taskFilter` to
  `applicationFilter`. (The task filter just reached out to the
  applications anyway, so it never made sense to locate it with the
  tasks where the filter was called once for every task even though the
  result would never change.)
- Remove duplicate constraints filter in tasks, where it neither made
  sense to keep as it operates on the application level only.
- Add context to rendering error.

marathon_test.go:
- Simplify and reduce numerous tests.
- Convert tests with high number of cases into parallelized sub-tests.
- Improve readability/structure for several tests.
- Add missing test for enabled/exposed applications.
- Simplify the mocked Marathon server.

marathon.tmpl:
- Update application/task iteration.
- Replace `getFrontendBackend` by `getBackend`.
2017-07-11 14:35:01 +02:00
58ffea6627 extract lb configuration steps into method 2017-07-10 19:18:31 +02:00
a2d68ed881 chore: GitHub Code Owners. 2017-07-10 17:45:58 +02:00
d653a348b1 Factorize labels
* refactor(accesslog): factorize file name.
* traefik.frontend.rule
* traefik.frontend.value
* traefik.backend.circuitbreaker.expression
* traefik.enable
* traefik.backend.loadbalancer.method
* traefik.backend.loadbalancer.sticky
* traefik.backend.maxconn.amount
* traefik.backend.maxconn.extractorfunc
* traefik.port
* traefik.tags
* traefik.backend
* traefik.weight
* traefik.domain
* traefik.protocol
* traefik.frontend.passHostHeader
* traefik.frontend.whitelistSourceRange
* traefik.frontend.priority
* traefik.frontend.entryPoints
* traefik.frontend.auth.basic
* traefik.backend.id
* traefik.backend.circuitbreaker
* traefik.frontend.rule.type
* traefik.portIndex
* refactor(docker): specific labels
* refactor(rancher): specific labels
* traefik.backend.healthcheck.*
* refactor(providers): factorize labels.
2017-07-10 16:58:12 +02:00
2e84b1e556 Enhance integration tests
* refactor: remove unused code.
* refactor: factorize Traefik cmd start.
* refactor(whitelist): minor change.
* refactor(accesslog): better use of checker.
* refactor(errorpages): factorize containers IP variables.
* refactor(integration): refactor cmdTraefikWithConfigFile.
2017-07-10 14:58:31 +02:00
bbb133d94c doc: remove glide integration. 2017-07-10 11:33:05 +02:00
d90fa5ab3e [kubernetes] Improve documentation.
- Add details to the labelselector parameter.
- Add section on ExternalNames in the guide.
2017-07-08 12:59:12 +02:00
759a19bc4f Add whitelist configuration option for entrypoints
* Add whitelist configuration option for entrypoints
* Add whitelist support to --entrypoint flag
2017-07-08 12:21:14 +02:00
a7ec785994 refactor(dynamodb): Use Traefik Logger. 2017-07-08 00:05:53 +02:00
46faa7a745 refactor(ecs): Use Traefik Logger. 2017-07-08 00:05:53 +02:00
54e3f08833 refactor(marathon): Use Traefik Logger. 2017-07-08 00:05:53 +02:00
b365836c57 feat: Add Trace in Base Provider. 2017-07-08 00:05:53 +02:00
242f1b9c3c feat(logger): Expose Logrus writer.
- Hack logrus scanner buffer size.
- dedicate method for large scanner buffer.
2017-07-08 00:05:53 +02:00
4dfbb6d489 Add marathon label to configure basic auth, similar to docker and rancher providers 2017-07-07 23:36:04 +02:00
c31b4c55c2 Update contributing guide build steps 2017-07-07 23:13:23 +02:00
ca5bbab20a traefik controller access to secrets
The traefik controller shall have access to secrets for the k8s basic authentication (#1488) to work
2017-07-07 22:35:03 +02:00
41dd124a4b kubernetes ingress rewrite-target implementation
* Adding support for `ingress.kubernetes.io/rewrite-target`

We create a rule using the `PathPrefixStrip` to trim out the bit in the rewrite rule.
2017-07-07 21:27:54 +02:00
dbf6161fa1 always rebuild webui on 'make image'
and introduce a new make target image-dirty that is used for the Traefik
deployment.
2017-07-07 17:56:48 +02:00
7aabd6e385 Update README.md 2017-07-07 14:34:25 +02:00
cb203f8e7e Make the ACME developements testing easier
* ADD docker-compose and shell script to allow developers to get ACME environment easily
2017-07-07 11:36:32 +02:00
8f845bac74 Merge tag 'v1.3.3' 2017-07-06 19:37:12 +02:00
a89eb122a0 Clarify that provider-enabling argument parameters set all defaults. 2017-07-06 17:00:44 +02:00
b7daa2f3a4 Update traefik dependencies (docker/docker and related) (#1823)
Update traefik dependencies (docker/docker and related)

- Update dependencies
- Fix compilation problems
- Remove vdemeester/docker-events (in docker api now)
- Remove `integration/vendor`
- Use `testImport`
- update some deps.
- regenerate the lock from scratch (after a `glide cc`)
2017-07-06 16:28:13 +02:00
7d178f49b4 Update docker version to 17.03.2…
… and also update the url to get static binaries.

Signed-off-by: Vincent Demeester <vincent@sbr.pm>
2017-07-03 16:21:28 +02:00
85f4f26942 doc: release cycle. 2017-07-03 14:57:19 +02:00
eee8ba8a53 doc: Traefik bug command. 2017-07-03 12:42:06 +02:00
22aceec426 Re-think integration vendoring
- remove docker/docker from  Traefik vendor (unused)
- use `ignore` for all Traefik vendor in integration glide.
- defined only integration specific version of the dependencies.
2017-07-03 11:53:31 +02:00
121c057b90 Custom Error Pages (#1675)
* custom error pages
2017-07-01 01:04:18 +02:00
2c976227dd remove confusing go-marathon log message
Log message produced by go-marathon was:
time="2017-06-28T09:08:19Z" level=debug msg="listenToSSE(): failed to
handle event: failed to decode the event type, content: , error: EOF"

The fix for this was done in the upstream project of go-marathon
donovanhide/eventsource.

Background is that Marathon periodically sends a \n over the SSE
subscription, in order to keep the connection alive. This was parsed as
empty event by the eventsource and published. go-marathon in turn was
not able to do something with this empty event was producing the log
message above. By getting rid of publishing empty events in the
downstream library, we also get rid of this log message.
2017-06-30 22:14:57 +02:00
81d011e57d Handle RootCAs Certificate 2017-06-30 14:56:55 +02:00
3776e58041 Merge branch 'v1.3' 2017-06-30 00:04:04 +02:00
36c88111de Merge branch 'v1.3' 2017-06-27 23:27:00 +02:00
2201dcd505 doc: Manuel Laufenberg become Manuel Zapf. 2017-06-27 22:02:23 +02:00
7a7cafcbaa Add Nicolas Mengin to maintainers 2017-06-27 22:02:23 +02:00
efb671401d Add Julien Salleyron to maintainers 2017-06-27 21:35:47 +02:00
4128c1ac8d Allow file provider to load config from files in a directory. 2017-06-27 16:58:04 +02:00
73e10c96cc Merge branch 'v1.3' 2017-06-27 14:42:12 +02:00
0055965295 add status code to request duration metric 2017-06-26 18:21:28 +02:00
34e60a8404 Change to a more flexible PR review process
Signed-off-by: Emile Vauge <emile@vauge.com>
2017-06-26 11:04:12 +02:00
ceec81011b Address review comments. 2017-06-24 12:32:05 +02:00
927003329e contrib: Dump keys/certs from acme.json to files
In the event that a user needs to explode their acme.json file into
a set of directories and relevant files for troubleshooting or use
with other programs this script will parse them into the components
in the following path structure:

```
certdir
├── certs
│   ├── domain-1.example.com
│   ├── domain-2.example.com
│   └── domain-n.example.com
└── private
    └── letsencrypt.key
```
2017-06-24 12:32:05 +02:00
01bb0a80ab doc: update Rancher documentation. 2017-06-21 14:54:36 +02:00
db1baf80a9 Speeding up health change detection by separating it from catalog services check. 2017-06-20 20:27:04 +02:00
9cb07d026f Refactor into dual Rancher API/Metadata providers
Introduces Rancher's metadata service as an optional provider source for
Traefik, enabled by setting `rancher.MetadataService`.

The provider uses a long polling technique to watch the metadata service and
obtain near instantaneous updates. Alternatively it can be configured to poll
the metadata service every `rancher.RefreshSeconds` by setting
`rancher.MetadataPoll`.

The refactor splits API and metadata service code into separate source
files respectively, and specific configuration is deferred to
sub-structs.

Incorporates bugfix #1414
2017-06-20 19:08:53 +02:00
984ea1040f Fix error handling for docker swarm mode 2017-06-20 18:10:21 +02:00
447109e868 Add HTTP HEAD handling to /ping endpoint
Also updates documentation to reflect new method.
2017-06-20 11:40:14 +02:00
f79317a435 retry only on real network errors
Now retries only happen when actual network errors occur and not only
anymore based on the HTTP status code. This is because the backend could
also send this status codes as their normal interface and in that case
we don't want to retry.
2017-06-19 20:13:46 +02:00
131d8dd765 Merge tag 'v1.3.1' 2017-06-16 16:52:53 +02:00
b452695c20 added consul acl token note 2017-06-16 16:31:03 +02:00
f17785c3ab doc: fix typo in maintainer.md 2017-06-16 14:00:24 +02:00
2a578748fd Merge branch 'v1.3' 2017-06-14 22:26:35 +02:00
2ddae2e856 update go-marathon to 441a03a
in order to get the latest fixes regarding SSE subscription failover.
2017-06-14 10:03:49 +02:00
885b9f371c enable logging to stdout for access logs 2017-06-13 23:43:38 +02:00
f275e4ad3c Create Header Middleware 2017-06-13 12:34:17 +02:00
aea7bc0c07 chore: update Glide hash. 2017-06-12 22:15:33 +02:00
a457392ec3 refactor: clean coreos/etcd dependency. 2017-06-12 22:15:33 +02:00
37ec7d0505 refactor: subpackage for x/oauth2. 2017-06-12 22:15:33 +02:00
8f6404ab3a fix: sirupsen/logrus version
State:
- Current version: 10f801ebc38b33738c9d17d50860f484a0988ff5
- Glide suggest: f7f79f729e0fbe2fcc061db48a9ba0263f588252

https://github.com/sirupsen/logrus/commits/master?after=85b1699d505667d13f8ac4478c1debbf85d6c5de+34
10f801ebc3 (17 Mar 2017)
f7f79f729e (19 Jan 2016)
2017-06-12 22:15:33 +02:00
1538b16b21 fix: golang/protobuf version
`github.com/golang/protobuf`:
- `github.com/prometheus/client_golang` (no version)
- `github.com/gogo/protobuf` (no version)
- `google.golang.org/appengine` (no version)
- `github.com/matttproud/golang_protobuf_extensions` (no version)

State:
- Current version: 2bba0603135d7d7f5cb73b2125beeda19c09f4ef
- Glide suggest: 8616e8ee5e20a1704615e6c8d7afcdac06087a67

Force to keep the current version.

Refs
- 2bba060313 (Mar 31, 2017) next commit the Apr 27, 2017.
- 8616e8ee5e (8 Jun 2016)
2017-06-12 22:15:33 +02:00
a6477fbd95 fix: Prometheus dependency version: matttproud/golang_protobuf_extensions
`matttproud/golang_protobuf_extensions` is used by:
- `github.com/prometheus/client_golang`
- `github.com/prometheus/common`

Force to the latest version.

Refs:
- https://github.com/matttproud/golang_protobuf_extensions/commits/master (no dependencies manager)
- 24 Apr 2016, c12348ce28 (master, HEAD)
- 6 Apr 2015, fc2b8d3a73
2017-06-12 22:15:33 +02:00
e802dcd189 fix: Mesos/k8s dependency version: golang/glog
`golang/glog` is used by:
- `github.com/mesos/mesos-go` (no version)
- `k8s.io/client-go` (`44145f04b68cf362d9c4df2182967c2275eaefed`)

In #353 (add Mesos provider, 20 Jul 2016), the `golang/glog` hash is `fca8c8854093a154ff1eb580aae10276ad6b1b5f`.

The problem appear in #836 (use k8s client, 1 Dec 2016).

Refs:
- Traefik:
  - https://github.com/containous/traefik/pull/836
  - 131f581f77
- Glog
  - https://github.com/golang/glog/commits/master
  - https://github.com/golang/glog/pull/13
  - 44145f04b6
  - fca8c88540
- k8s
  - e121606b0d/Godeps/Godeps.json
  - https://github.com/kubernetes/client-go/blob/master/Godeps/Godeps.json
2017-06-12 22:15:33 +02:00
931dc02c09 fix: Vulcand dependency version : vulcand/predicate
`vulcand/predicate` is used by:
- `github.com/vulcand/oxy` (no dependencies manager)
- `github.com/vulcand/route` (used by `github.com/vulcand/vulcand`)

`github.com/vulcand/vulcand` (Godeps) required a old version `cb0bff91a7ab7cf7571e661ff883fc997bc554a3`.

`19b9dde14240d94c804ae5736ad0e1de10bf8fe6` is the only commit before `cb0bff91a7ab7cf7571e661ff883fc997bc554a3`.

refs:
- 42492a3a85/Godeps/Godeps.json
- https://github.com/vulcand/predicate/commits/master
- 19b9dde142
2017-06-12 22:15:33 +02:00
7017cdcf49 fix: oxy dependency version: mailgun/timetools. 2017-06-12 22:15:33 +02:00
5aa017d9b5 fix: k8s dependency version: emicklei/go-restful
`emicklei/go-restful` is used by:
- `k8s.io/client-go`  (Godeps)

Refs:
- e121606b0d/Godeps/Godeps.json
2017-06-12 22:15:33 +02:00
a7297b49a4 fix: Prometheus dependencies
Prometheus is related to `go-kit/kit`.
`go-kit/kit` doesn't have dependency manager.

We use `go-kit/kit` v0.3.0 (15 Nov 2016).

We must explicitly declare the Prometheus dependencies.
Prometheus doesn't have dependency manager.
Use the commit date to fixed all hash.

refs:
- go-kit
  - https://github.com/go-kit/kit/tree/v0.3.0 (15 Nov 2016)
- Prometheus
  - https://github.com/prometheus/client_golang/commits/master
  - 08fd2e1237 (Apr 1, 2017)
  - https://github.com/prometheus/common/commits/master
  - 49fee292b2 (Feb 20, 2017)
  - https://github.com/prometheus/client_model/commits/master
  - 6f38060186 (Feb 16, 2017, master, HEAD)
  - https://github.com/prometheus/procfs/commits/master
  - a1dba9ce8b (Feb 16, 2017)
2017-06-12 22:15:33 +02:00
3eaeb81831 Adds definitions to backend kv template for health checking 2017-06-12 21:54:08 +02:00
7d6c778211 Enhanced flexibility in Consul Catalog configuration 2017-06-12 21:18:55 +02:00
9c27a98821 refactor: move Marathon client mock.
refactor: remove old Marathon mock.
refactor: generate new Marathon mock.

mockery -recursive -dir=vendor/github.com/gambol99/ -name=Marathon -output=provider/marathon/mocks
2017-06-12 20:27:54 +02:00
ad54c5a278 drop "slave" wording for "worker"
Traefik should follow modern IT trends, and use manager/leader/worker/agent, etc. instead of "master/slave".

e.g jenkinsci/jenkins#2007 (https://issues.jenkins-ci.org/browse/JENKINS-27268)

NB: of course, it can only apply where possible, since backends like Mesos should retain their own concepts, and not add more confusion.
2017-06-12 20:07:39 +02:00
96939e2990 chore: Enhance GitHub issue template. 2017-06-12 19:29:23 +02:00
5268db47a1 fix: glide go-marathon 2017-06-11 21:44:36 +02:00
3048509807 enable TLS client forwarding
Copys the incoming TLS client certificate to the outgoing
request. The backend can then use this certificate for
client authentication ie. k8s client cert authentication
2017-06-11 15:24:29 +02:00
7399a83c74 refactor: Use Statefull interface in access log. 2017-06-09 23:55:49 +02:00
18c3d8dc62 test: add AddPrefix test. 2017-06-09 23:55:49 +02:00
2d1ddcf28b test: HealthCheck review. 2017-06-09 23:55:49 +02:00
a1a0420314 test: use MustNewRequest. 2017-06-09 23:55:49 +02:00
2223587fc0 refactor: ordering imports. 2017-06-09 23:55:49 +02:00
63f9bccf9f refactor: fix typos.
refactor: typo in whitelister file name.
2017-06-09 23:55:49 +02:00
18d11e02d0 test: simplify stripPrefix* tests. 2017-06-09 23:55:49 +02:00
a71d69cc3c make the cookie name unique to the backend being served 2017-06-07 20:18:16 +02:00
e007bb7546 add metrics for backend_retries_total 2017-06-07 08:56:50 +02:00
7874ffd506 Minor Health UI fixes
- format the Oy axis ticks as integers on the Total Status Code
Count chart
- prevent the Average Response Time chart from showing negative
values on the Oy axis
- remove the deprecated transitionDuration field
- set the transition duration to 0 on the Average Response Time
chart to avoid triggering an NVD3 marker placement bug
2017-06-06 22:40:39 +02:00
a9216e24f5 Add JSON as access logging format 2017-06-06 16:26:22 +02:00
39388a2199 Exported getSubDomain function from Marathon provider to be able to use in custom templates 2017-06-06 14:31:30 +02:00
71111708d4 Merge branch 'v1.3' into master 2017-06-02 19:56:15 +02:00
d5efc99876 doc: Enhance GitHub issue template. 2017-06-01 21:53:05 -07:00
1e84e77a67 Merge branch 'v1.3' into master 2017-06-01 20:53:02 +02:00
d6b448f430 Merge branch 'v1.3' into master 2017-05-31 23:29:23 +02:00
e426b27581 refactor: valid Git branch name must work. 2017-05-31 10:34:00 +02:00
b6c5c14447 refactor: Enhance rules tests.
- refactor: change incorrect package.
- refactor: test readability.
2017-05-31 10:34:00 +02:00
cbccdd51c5 refactor: Logs & errors review.
- log & error: remove format if not necessary, add if necessary.
- add constants for k8s annotations.
- fix typos
2017-05-30 23:33:27 +02:00
994e135368 refactor: typo in misspelling. 2017-05-26 16:42:26 -07:00
87e5cda506 Update CONTRIBUTING.md.
- Go 1.8 is the current minimum requirement.
- The main binary moved to cmd/traefik.
- Remove obsolete gox example.
2017-05-25 00:18:22 +02:00
2833d68f15 Merge branch 'v1.3' into merge-back-1_3_0-rc3 2017-05-24 20:39:38 +02:00
64e8b31d49 Switch access logging to logrus 2017-05-24 14:20:42 +02:00
2643271053 Use more inclusive language in README.md {guys => folks}
While usage of the word "guys" can be considered gender neutral depending on location and context, it is widely considered to be gendered -- and more inclusive options are readily available. 💜

References:

* [When is "guys" gender neutral? I did a survey! -- Julia Evans](https://jvns.ca/blog/2013/12/27/guys-guys-guys/)
2017-05-22 21:14:43 +02:00
5b36b274a3 doc(maintainer): add contributor/needs-resolve-conflicts
Replace `contributor/needs-rebase` by `contributor/needs-resolve-conflicts`.
2017-05-22 20:05:10 +02:00
8ad31d6eb4 Merge remote-tracking branch 'upstream/v1.3' into merge-v1_3 2017-05-22 11:38:28 +02:00
13e8a875cf Allow overriding port for backend healthchecks 2017-05-19 17:48:16 +02:00
c7281df230 Update usage of .local with .minikube in k8s docs
Fixes #1521
2017-05-19 17:02:39 +02:00
5f0b215e90 IP Whitelists for Frontend (with Docker- & Kubernetes-Provider Support) 2017-05-19 15:19:29 +02:00
55f610422a Install github.com/stretchr/testify/require. 2017-05-19 15:19:29 +02:00
a04ef15bcd Issue template: Emphasize SO and Slack for support questions.
- Be more explicit in the purpose of the issue tracker.
- Move SO before Slack since it seems preferable.
- Refer to SO and Slack on first question again.
2017-05-19 10:39:05 +02:00
81754840ff Update README.md 2017-05-18 23:17:16 +02:00
2610023131 refactor: Deflake and Try package
- feat: add CI multiplier
- refactor: readability
- feat: custom Sleep function
- refactor(integration): use custom Sleep
- feat: show Try progress
- feat(try): try response with status code
- refactor(try): use a dedicate package.
- refactor(integration): Try everywhere
- feat(CI): pass CI env var to Integration Tests.
- refactor(acme): increase timeout.
- feat(acme): show Traefik logs
- refactor(integration): use `http.StatusXXX`
- refactor: remove Sleep
2017-05-18 22:34:15 +02:00
ff3481f06b Merge pull request #1613 from containous/merge-v1.3.0-rc2-master
Merge v1.3.0-rc2 master
2017-05-17 12:41:26 +02:00
f8ea19d29c Merge branch 'v1.3' into merge-v1.3.0-rc2-master 2017-05-17 11:44:53 +02:00
3b8ebf7d33 Merge pull request #1603 from antoine-aumjaud/patch-1
Small toml documentation update
2017-05-17 10:03:57 +02:00
5e14f20786 Update documentation
fix some "errors"
2017-05-17 09:45:36 +02:00
96b19deac5 Merge pull request #1616 from containous/remove-trecloux-maintainers
Remove Thomas Recloux from maintainers
2017-05-16 23:42:16 +02:00
a6aff7c85c Remove Thomas Recloux from maintainers 2017-05-16 23:20:29 +02:00
1310347395 Remove Russell from maintainers (#1614)
It's been a pleasure
2017-05-16 18:10:28 +01:00
40c94d80d7 Merge pull request #1582 from ldez/doc/maintainer-labels
doc: add labels documentation.
2017-05-16 17:59:30 +02:00
921a704c24 doc: add labels documentation. 2017-05-16 14:21:26 +02:00
3f490f95c6 Merge pull request #1589 from containous/add-ldez-maintainers
Add @ldez to maintainers
2017-05-16 11:26:54 +02:00
24d80b1909 Add @ldez to maintainers
Signed-off-by: Emile Vauge <emile@vauge.com>
2017-05-16 11:06:59 +02:00
78b2fba033 Merge pull request #1595 from ldez/refactor/remove-legacy-ci-data
chore(CI): remove old CI data.
2017-05-12 20:32:29 +02:00
218b76275c chore(CI): remove old CI data. 2017-05-12 19:16:36 +02:00
cf5b6d837f Merge pull request #1594 from ldez/doc/semaphoreci-badge
doc(CI): Add SemaphoreCI badge.
2017-05-12 19:04:00 +02:00
0babc7bb64 doc(CI): Add SemaphoreCI badge. 2017-05-12 18:46:02 +02:00
8a551d91fd Merge pull request #1573 from atbore-phx/ci-retry-tests
[CI] retry function
2017-05-12 17:41:21 +02:00
eeed035ef0 added retry function to validate script 2017-05-12 17:18:47 +02:00
33404a7772 added retry function to tests script 2017-05-12 17:18:47 +02:00
bd90745528 Merge pull request #1593 from atbore-phx/ci-switch
[CI] removed unit and integration tests from travis
2017-05-12 17:17:00 +02:00
ede1212cb0 removed unit and integration tests from travis 2017-05-12 16:19:35 +02:00
2dcbc01e51 Merge pull request #1544 from maxwo/proxy-dev-mode
Proxy in dev mode
2017-05-12 10:11:58 +02:00
61ba50fac9 feat(Dev proxy) : Add proxy to localhost:8080 in dev mode. 2017-05-12 09:41:22 +02:00
b24b5e20b4 Merge pull request #1548 from timoreimann/kubernetes-ignore-missing-pass-host-header-annotation
Merge v1.3 branch into master [2017-05-11]
2017-05-12 00:36:52 +02:00
3112432480 Merge remote-tracking branch 'upstream/v1.3' into HEAD 2017-05-11 21:10:20 +02:00
94f5b0d9ff Merge pull request #1571 from containous/restore-access-logger
Restore: First stage of access logging middleware.
2017-05-11 17:24:26 +02:00
d2c8824902 refactor: restore "First stage of access logging middleware."
This reverts commit 82651985c4.
2017-05-11 16:27:13 +02:00
db09007dbc Merge pull request #1558 from Stibbons/yarnpkg
prefere yarnpkg over yarn
2017-05-10 18:26:05 +02:00
5b2e8990f1 prefere yarnpkg over yarn
to avoid conflict with Hadoop Yarn cli.

I don’t know the best practice, but i do
have Apache Yarn installed on my machine, so
I get this conflict. Of course this conflict does
not arised when building within the docker.

https://github.com/yarnpkg/yarn/issues/2337
Signed-off-by: Gaetan Semet <gaetan@xeberon.net>
2017-05-10 17:35:17 +02:00
2f6068decc Merge pull request #1580 from atbore-phx/docker-light
[CI] Reduce size of Docker Images
2017-05-10 17:23:37 +02:00
1e591dd188 clean up apt-cache in webui/Dockerfile 2017-05-10 11:24:19 +02:00
6838a81e50 replaced docker images with alpine if available (nginx, rabbitmq) 2017-05-10 11:24:19 +02:00
ceef5e39b7 Merge pull request #1572 from atbore-phx/ci-docker-version
[CI] set Docker version
2017-05-09 16:04:08 +02:00
ef339af623 added DOCKER_VERSION variable 2017-05-09 11:25:25 +02:00
acc7865542 Merge pull request #1554 from ldez/feat-push-force-pr
feat(github): push force PR branch.
2017-05-05 17:19:30 +02:00
c00c240c14 feat(github): push force contributor branch. 2017-05-05 16:19:23 +02:00
6376 changed files with 142876 additions and 1878489 deletions

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
# vendor/github.com/go-acme/lego/providers/dns/cloudxns/cloudxns.go eol=crlf

24
.github/CODEOWNERS vendored Normal file
View File

@ -0,0 +1,24 @@
provider/kubernetes/** @containous/kubernetes
provider/rancher/** @containous/rancher
provider/marathon/** @containous/marathon
provider/docker/** @containous/docker
docs/user-guide/kubernetes.md @containous/kubernetes
docs/user-guide/marathon.md @containous/marathon
docs/user-guide/swarm.md @containous/docker
docs/user-guide/swarm-mode.md @containous/docker
docs/configuration/backends/docker.md @containous/docker
docs/configuration/backends/kubernetes.md @containous/kubernetes
docs/configuration/backends/marathon.md @containous/marathon
docs/configuration/backends/rancher.md @containous/rancher
examples/k8s/ @containous/kubernetes
examples/compose-k8s.yaml @containous/kubernetes
examples/k8s.namespace.yaml @containous/kubernetes
examples/compose-rancher.yml @containous/rancher
examples/compose-marathon.yml @containous/marathon
vendor/github.com/gambol99/go-marathon @containous/marathon
vendor/github.com/rancher @containous/rancher
vendor/k8s.io/ @containous/kubernetes

View File

@ -1,150 +0,0 @@
# Contributing
### Building
You need either [Docker](https://github.com/docker/docker) and `make` (Method 1), or `go` (Method 2) in order to build traefik. For changes to its dependencies, the `glide` dependency management tool and `glide-vc` plugin are required.
#### Method 1: Using `Docker` and `Makefile`
You need to run the `binary` target. This will create binaries for Linux platform in the `dist` folder.
```bash
$ make binary
docker build -t "traefik-dev:no-more-godep-ever" -f build.Dockerfile .
Sending build context to Docker daemon 295.3 MB
Step 0 : FROM golang:1.7
---> 8c6473912976
Step 1 : RUN go get github.com/Masterminds/glide
[...]
docker run --rm -v "/var/run/docker.sock:/var/run/docker.sock" -it -e OS_ARCH_ARG -e OS_PLATFORM_ARG -e TESTFLAGS -v "/home/emile/dev/go/src/github.com/containous/traefik/"dist":/go/src/github.com/containous/traefik/"dist"" "traefik-dev:no-more-godep-ever" ./script/make.sh generate binary
---> Making bundle: generate (in .)
removed 'gen.go'
---> Making bundle: binary (in .)
$ ls dist/
traefik*
```
#### Method 2: Using `go`
###### Setting up your `go` environment
- You need `go` v1.7+
- It is recommended you clone Træfik into a directory like `~/go/src/github.com/containous/traefik` (This is the official golang workspace hierarchy, and will allow dependencies to resolve properly)
- This will allow your `GOPATH` and `PATH` variable to be set to `~/go` via:
```bash
$ export GOPATH=~/go
$ export PATH=$PATH:$GOPATH/bin
```
This can be verified via `$ go env`
- You will want to add those 2 export lines to your `.bashrc` or `.bash_profile`
- You need `go-bindata` to be able to use `go generate` command (needed to build) : `$ go get github.com/jteeuwen/go-bindata/...` (Please note, the ellipses are required)
#### Setting up `glide` and `glide-vc` for dependency management
- Glide is not required for building; however, it is necessary to modify dependencies (i.e., add, update, or remove third-party packages)
- Glide can be installed either via homebrew: `$ brew install glide` or via the official glide script: `$ curl https://glide.sh/get | sh`
- The glide plugin `glide-vc` must be installed from source: `go get github.com/sgotti/glide-vc`
If you want to add a dependency, use `$ glide get` to have glide put it into the vendor folder and update the glide manifest/lock files (`glide.yaml` and `glide.lock`, respectively). A following `glide-vc` run should be triggered to trim down the size of the vendor folder. The final result must be committed into VCS.
Dependencies for the integration tests in the `integration` folder are managed in a separate `integration/glide.yaml` file using the same toolset.
Care must be taken to choose the right arguments to `glide` when dealing with either main or integration test dependencies, or otherwise risk ending up with a broken build. For that reason, the helper script `script/glide.sh` encapsulates the gory details and conveniently calls `glide-vc` as well. Call it without parameters for basic usage instructions.
Here's a full example:
```bash
# install the new main dependency github.com/foo/bar and minimize vendor size
$ ./script/glide.sh get github.com/foo/bar
# install another dependency, this time for the integration tests
$ ( cd integration && ../script/glide.sh get github.com/baz/quuz )
# generate (Only required to integrate other components such as web dashboard)
$ go generate
# Standard go build
$ go build
# Using gox to build multiple platform
$ gox "linux darwin" "386 amd64 arm" \
-output="dist/traefik_{{.OS}}-{{.Arch}}" \
./cmd/traefik
# run other commands like tests
```
### Tests
##### Method 1: `Docker` and `make`
You can run unit tests using the `test-unit` target and the
integration test using the `test-integration` target.
```bash
$ make test-unit
docker build -t "traefik-dev:your-feature-branch" -f build.Dockerfile .
# […]
docker run --rm -it -e OS_ARCH_ARG -e OS_PLATFORM_ARG -e TESTFLAGS -v "/home/vincent/src/github/vdemeester/traefik/dist:/go/src/github.com/containous/traefik/dist" "traefik-dev:your-feature-branch" ./script/make.sh generate test-unit
---> Making bundle: generate (in .)
removed 'gen.go'
---> Making bundle: test-unit (in .)
+ go test -cover -coverprofile=cover.out .
ok github.com/containous/traefik 0.005s coverage: 4.1% of statements
Test success
```
For development purposes, you can specify which tests to run by using:
```bash
# Run every tests in the MyTest suite
TESTFLAGS="-check.f MyTestSuite" make test-integration
# Run the test "MyTest" in the MyTest suite
TESTFLAGS="-check.f MyTestSuite.MyTest" make test-integration
# Run every tests starting with "My", in the MyTest suite
TESTFLAGS="-check.f MyTestSuite.My" make test-integration
# Run every tests ending with "Test", in the MyTest suite
TESTFLAGS="-check.f MyTestSuite.*Test" make test-integration
```
More: https://labix.org/gocheck
##### Method 2: `go`
- Tests can be run from the cloned directory, by `$ go test ./...` which should return `ok` similar to:
```
ok _/home/vincent/src/github/vdemeester/traefik 0.004s
```
### Documentation
The [documentation site](http://docs.traefik.io/) is built with [mkdocs](http://mkdocs.org/)
First make sure you have python and pip installed
```shell
$ python --version
Python 2.7.2
$ pip --version
pip 1.5.2
```
Then install mkdocs with pip
```shell
$ pip install mkdocs
```
To test documentation locally run `mkdocs serve` in the root directory, this should start a server locally to preview your changes.
```shell
$ mkdocs serve
INFO - Building documentation...
WARNING - Config value: 'theme'. Warning: The theme 'united' will be removed in an upcoming MkDocs release. See http://www.mkdocs.org/about/release-notes/ for more details
INFO - Cleaning site directory
[I 160505 22:31:24 server:281] Serving on http://127.0.0.1:8000
[I 160505 22:31:24 handlers:59] Start watching changes
[I 160505 22:31:24 handlers:61] Start detecting changes
```

View File

@ -1,32 +1,41 @@
<!-- PLEASE FOLLOW THE ISSUE TEMPLATE TO HELP TRIAGE AND SUPPORT! -->
### Do you want to request a *feature* or report a *bug*?
<!--
PLEASE READ THIS MESSAGE.
DO NOT FILE ISSUES FOR GENERAL SUPPORT QUESTIONS.
Please keep in mind that the GitHub issue tracker is not intended as a general support forum, but for reporting bugs and feature requests.
The issue tracker is for reporting bugs and feature requests only.
For end-user related support questions, please refer to one of the following:
For other type of questions, consider using one of:
- the Traefik community forum: https://community.containo.us/
- the Traefik community Slack channel: https://traefik.herokuapp.com
- StackOverflow: https://stackoverflow.com/questions/tagged/traefik
-->
HOW TO WRITE A GOOD ISSUE?
Bug
- if it's possible use the command `traefik bug`. See https://www.youtube.com/watch?v=Lyz62L8m93I.
- The title must be short and descriptive.
- Explain the conditions which led you to write this issue: the context.
<!--
The configurations between 1.X and 2.X are NOT compatible.
Please have a look here https://docs.traefik.io/v2.0/getting-started/configuration-overview/.
-->
### What did you do?
<!--
HOW TO WRITE A GOOD BUG REPORT?
- Respect the issue template as much as possible.
- The title should be short and descriptive.
- Explain the conditions which led you to report this issue: the context.
- The context should lead to something, an idea or a problem that youre facing.
- Remain clear and concise.
- Format your messages to help the reader focus on what matters and understand the structure of your message, use Markdown syntax https://help.github.com/articles/github-flavored-markdown
-->
### Do you want to request a *feature* or report a *bug*?
### What did you do?
### What did you expect to see?
@ -37,6 +46,15 @@ HOW TO WRITE A GOOD ISSUE?
### Output of `traefik version`: (_What version of Traefik are you using?_)
<!--
`latest` is not considered as a valid version.
For the Traefik Docker image:
docker run [IMAGE] version
ex: docker run traefik version
-->
```
(paste your output here)
```
@ -46,12 +64,13 @@ HOW TO WRITE A GOOD ISSUE?
```toml
# (paste your configuration here)
```
<!--
Add more configuration information here.
-->
### If applicable, please paste the log output in debug mode (`--debug` switch)
### If applicable, please paste the log output in DEBUG level (`--log.level=DEBUG` switch)
```
(paste your output here)

82
.github/ISSUE_TEMPLATE/Bug_report.md vendored Normal file
View File

@ -0,0 +1,82 @@
---
name: Bug report
about: Create a report to help us improve
---
<!-- PLEASE FOLLOW THE ISSUE TEMPLATE TO HELP TRIAGE AND SUPPORT! -->
### Do you want to request a *feature* or report a *bug*?
<!--
DO NOT FILE ISSUES FOR GENERAL SUPPORT QUESTIONS.
The issue tracker is for reporting bugs and feature requests only.
For end-user related support questions, please refer to one of the following:
- the Traefik community forum: https://community.containo.us/
-->
Bug
<!--
The configurations between 1.X and 2.X are NOT compatible.
Please have a look here https://docs.traefik.io/v2.0/getting-started/configuration-overview/.
-->
### What did you do?
<!--
HOW TO WRITE A GOOD BUG REPORT?
- Respect the issue template as much as possible.
- The title should be short and descriptive.
- Explain the conditions which led you to report this issue: the context.
- The context should lead to something, an idea or a problem that youre facing.
- Remain clear and concise.
- Format your messages to help the reader focus on what matters and understand the structure of your message, use Markdown syntax https://help.github.com/articles/github-flavored-markdown
-->
### What did you expect to see?
### What did you see instead?
### Output of `traefik version`: (_What version of Traefik are you using?_)
<!--
`latest` is not considered as a valid version.
For the Traefik Docker image:
docker run [IMAGE] version
ex: docker run traefik version
-->
```
(paste your output here)
```
### What is your environment & configuration (arguments, toml, provider, platform, ...)?
```toml
# (paste your configuration here)
```
<!--
Add more configuration information here.
-->
### If applicable, please paste the log output in DEBUG level (`--log.level=DEBUG` switch)
```
(paste your output here)
```

View File

@ -0,0 +1,35 @@
---
name: Feature request
about: Suggest an idea for this project
---
<!-- PLEASE FOLLOW THE ISSUE TEMPLATE TO HELP TRIAGE AND SUPPORT! -->
### Do you want to request a *feature* or report a *bug*?
<!--
DO NOT FILE ISSUES FOR GENERAL SUPPORT QUESTIONS.
The issue tracker is for reporting bugs and feature requests only.
For end-user related support questions, please refer to one of the following:
- the Traefik community forum: https://community.containo.us/
-->
Feature
### What did you expect to see?
<!--
HOW TO WRITE A GOOD ISSUE?
- Respect the issue template as much as possible.
- The title should be short and descriptive.
- Explain the conditions which led you to report this issue: the context.
- The context should lead to something, an idea or a problem that youre facing.
- Remain clear and concise.
- Format your messages to help the reader focus on what matters and understand the structure of your message, use Markdown syntax https://help.github.com/articles/github-flavored-markdown
-->

View File

@ -1,23 +1,37 @@
<!--
PLEASE READ THIS MESSAGE.
HOW TO WRITE A GOOD PULL REQUEST?
Documentation fixes or enhancements:
- for Traefik v1: use branch v1.7
- for Traefik v2: use branch v2.0
- Make it small.
- Do only one thing.
- Avoid re-formatting.
- Make sure the code builds.
- Make sure all tests pass.
- Add tests.
- Write useful descriptions and titles.
- Address review comments in terms of additional commits.
- Do not amend/squash existing ones unless the PR is trivial.
- Read the contributing guide: https://github.com/containous/traefik/blob/master/.github/CONTRIBUTING.md.
Bug fixes:
- for Traefik v1: use branch v1.7
- for Traefik v2: use branch v2.0
Enhancements:
- for Traefik v1: we only accept bug fixes
- for Traefik v2: use branch master
HOW TO WRITE A GOOD PULL REQUEST? https://docs.traefik.io/contributing/submitting-pull-requests/
-->
### Description
### What does this PR do?
<!--
Briefly describe the pull request in a few paragraphs.
-->
<!-- A brief description of the change being made with this pull request. -->
### Motivation
<!-- What inspired you to submit this pull request? -->
### More
- [ ] Added/updated tests
- [ ] Added/updated documentation
### Additional Notes
<!-- Anything else we should know when reviewing? -->

View File

@ -0,0 +1,7 @@
### What does this PR do?
Merge v{{.Version}} into master
### Motivation
Be sync.

View File

@ -0,0 +1,7 @@
### What does this PR do?
Prepare release v{{.Version}}.
### Motivation
Create a new release.

26
.github/cpr.sh vendored
View File

@ -1,26 +0,0 @@
#!/bin/sh
#
# git config --global alias.cpr '!sh .github/cpr.sh'
set -e # stop on error
usage="$(basename "$0") pr -- Checkout a Pull Request locally"
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
echo "$usage" >&2
exit 1
fi
command -v jq >/dev/null 2>&1 || { echo "I require jq but it's not installed. Aborting." >&2; exit 1; }
set -x # echo on
initial=$(git rev-parse --abbrev-ref HEAD)
pr=$1
remote=$(curl -s https://api.github.com/repos/containous/traefik/pulls/$pr | jq -r .head.repo.owner.login)
branch=$(curl -s https://api.github.com/repos/containous/traefik/pulls/$pr | jq -r .head.ref)
git remote add $remote git@github.com:$remote/traefik.git
git fetch $remote $branch
git checkout -t -b "$pr--$branch" $remote/$branch

27
.github/rmpr.sh vendored
View File

@ -1,27 +0,0 @@
#!/bin/sh
#
# git config --global alias.rmpr '!sh .github/rmpr.sh'
set -e # stop on error
usage="$(basename "$0") pr -- remove a Pull Request local branch & remote"
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
echo "$usage" >&2
exit 1
fi
command -v jq >/dev/null 2>&1 || { echo "I require jq but it's not installed. Aborting." >&2; exit 1; }
set -x # echo on
initial=$(git rev-parse --abbrev-ref HEAD)
pr=$1
remote=$(curl -s https://api.github.com/repos/containous/traefik/pulls/$pr | jq -r .head.repo.owner.login)
branch=$(curl -s https://api.github.com/repos/containous/traefik/pulls/$pr | jq -r .head.ref)
# clean
git checkout $initial
git branch -D "$pr--$branch"
git remote remove $remote

36
.github/rpr.sh vendored
View File

@ -1,36 +0,0 @@
#!/bin/sh
#
# git config --global alias.rpr '!sh .github/rpr.sh'
set -e # stop on error
usage="$(basename "$0") pr remote/branch -- rebase a Pull Request against a remote branch"
if [ "$#" -ne 2 ]; then
echo "Illegal number of parameters"
echo "$usage" >&2
exit 1
fi
command -v jq >/dev/null 2>&1 || { echo "I require jq but it's not installed. Aborting." >&2; exit 1; }
set -x # echo on
initial=$(git rev-parse --abbrev-ref HEAD)
pr=$1
base=$2
remote=$(curl -s https://api.github.com/repos/containous/traefik/pulls/$pr | jq -r .head.repo.owner.login)
branch=$(curl -s https://api.github.com/repos/containous/traefik/pulls/$pr | jq -r .head.ref)
clean ()
{
git checkout $initial
.github/rmpr.sh $pr
}
trap clean EXIT
.github/cpr.sh $pr
git rebase $base
git push --force-with-lease $remote "$pr--$branch"

21
.gitignore vendored
View File

@ -1,13 +1,18 @@
/dist
/autogen/gen.go
.idea
.intellij
.idea/
.intellij/
*.iml
.vscode/
.DS_Store
/dist
/webui/.tmp/
/site/
/docs/site/
/static/
/autogen/
/traefik
/traefik.toml
/static/
.vscode/
/site/
/traefik.yml
*.log
*.exe
.DS_Store
cover.out
vendor/

97
.golangci.toml Normal file
View File

@ -0,0 +1,97 @@
[run]
timeout = "10m"
skip-files = []
skip-dirs = [
"pkg/provider/kubernetes/crd/generated/",
]
[linters-settings]
[linters-settings.govet]
check-shadowing = false
[linters-settings.golint]
min-confidence = 0.0
[linters-settings.gocyclo]
min-complexity = 14.0
[linters-settings.maligned]
suggest-new = true
[linters-settings.goconst]
min-len = 3.0
min-occurrences = 4.0
[linters-settings.misspell]
locale = "US"
[linters-settings.funlen]
lines = 230 # default 60
statements = 120 # default 40
[linters]
enable-all = true
disable = [
"gocyclo", # FIXME must be fixed
"gosec",
"dupl",
"maligned",
"lll",
"unparam",
"prealloc",
"scopelint",
"gochecknoinits",
"gochecknoglobals",
"godox",
"gocognit",
"bodyclose", # Too many false-positive and panics.
"wsl", # Too strict
"stylecheck", # skip because report issues related to some generated files.
]
[issues]
exclude-use-default = false
max-per-linter = 0
max-same-issues = 0
exclude = [
"SA1019: http.CloseNotifier is deprecated: the CloseNotifier interface predates Go's context package. New code should use Request.Context instead.", # FIXME must be fixed
"Error return value of .((os\\.)?std(out|err)\\..*|.*Close|.*Flush|os\\.Remove(All)?|.*printf?|os\\.(Un)?Setenv). is not checked",
"should have a package comment, unless it's in another file for this package",
]
[[issues.exclude-rules]]
path = "(.+)_test.go"
linters = ["goconst", "funlen"]
[[issues.exclude-rules]]
path = "integration/.+_test.go"
text = "Error return value of `cmd\\.Process\\.Kill` is not checked"
[[issues.exclude-rules]]
path = "integration/(consul_catalog_test|constraint_test).go"
text = "Error return value of `(s.deregisterService|s.deregisterAgentService)` is not checked"
[[issues.exclude-rules]]
path = "integration/grpc_test.go"
text = "Error return value of `closer` is not checked"
[[issues.exclude-rules]]
path = "pkg/h2c/h2c.go"
text = "Error return value of `rw.Write` is not checked"
[[issues.exclude-rules]]
path = "pkg/middlewares/recovery/recovery.go"
text = "`logger` can be `github.com/stretchr/testify/assert.TestingT`"
[[issues.exclude-rules]]
path = "pkg/provider/docker/builder_test.go"
text = "(U1000: func )?`(.+)` is unused"
[[issues.exclude-rules]]
path = "pkg/provider/kubernetes/builder_(endpoint|service)_test.go"
text = "(U1000: func )?`(.+)` is unused"
[[issues.exclude-rules]]
path = "pkg/config/parser/.+_test.go"
text = "U1000: field `(foo|fuu)` is unused"
[[issues.exclude-rules]]
path = "pkg/server/service/bufferpool.go"
text = "SA6002: argument should be pointer-like to avoid allocations"
[[issues.exclude-rules]]
path = "cmd/configuration.go"
text = "string `traefik` has (\\d) occurrences, make it a constant"
[[issues.exclude-rules]] # FIXME must be fixed
path = "cmd/context.go"
text = "S1000: should use a simple channel send/receive instead of `select` with a single case"

58
.goreleaser.yml Normal file
View File

@ -0,0 +1,58 @@
project_name: traefik
before:
hooks:
- go generate
builds:
- binary: traefik
main: ./cmd/traefik/traefik.go
env:
- CGO_ENABLED=0
ldflags:
- -s -w -X github.com/containous/traefik/v2/pkg/version.Version={{.Version}} -X github.com/containous/traefik/v2/pkg/version.Codename={{.Env.CODENAME}} -X github.com/containous/traefik/v2/pkg/version.BuildDate={{.Date}}
goos:
- linux
- darwin
- windows
- freebsd
- openbsd
goarch:
- amd64
- 386
- arm
- arm64
- ppc64le
goarm:
- 7
- 6
- 5
ignore:
- goos: darwin
goarch: 386
- goos: openbsd
goarch: arm
- goos: freebsd
goarch: arm
changelog:
skip: true
archives:
- id: traefik
name_template: '{{ .ProjectName }}_v{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
format: tar.gz
format_overrides:
- goos: windows
format: zip
files:
- LICENSE.md
- CHANGELOG.md
checksum:
name_template: "{{ .ProjectName }}_v{{ .Version }}_checksums.txt"
release:
disable: true

View File

@ -1,10 +0,0 @@
- repo: git://github.com/pre-commit/pre-commit-hooks
sha: 44e1753f98b0da305332abe26856c3e621c5c439
hooks:
- id: detect-private-key
- repo: git://github.com/containous/pre-commit-hooks
sha: 35e641b5107671e94102b0ce909648559e568d61
hooks:
- id: goFmt
- id: goLint
- id: goErrcheck

4
.semaphoreci/cleanup.sh Executable file
View File

@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -e
sudo rm -rf static

20
.semaphoreci/golang.sh Executable file
View File

@ -0,0 +1,20 @@
#!/usr/bin/env bash
set -e
curl -O https://dl.google.com/go/go"${GO_VERSION}".linux-amd64.tar.gz
tar -xvf go"${GO_VERSION}".linux-amd64.tar.gz
rm -rf go"${GO_VERSION}".linux-amd64.tar.gz
sudo mkdir -p /usr/local/golang/"${GO_VERSION}"/go
sudo mv go /usr/local/golang/"${GO_VERSION}"/
sudo rm /usr/local/bin/go
sudo chmod +x /usr/local/golang/"${GO_VERSION}"/go/bin/go
sudo ln -s /usr/local/golang/"${GO_VERSION}"/go/bin/go /usr/local/bin/go
export GOROOT="/usr/local/golang/${GO_VERSION}/go"
export GOTOOLDIR="/usr/local/golang/${GO_VERSION}/go/pkg/tool/linux_amd64"
go version

6
.semaphoreci/job1.sh Executable file
View File

@ -0,0 +1,6 @@
#!/usr/bin/env bash
set -e
if [ -n "$SHOULD_TEST" ]; then ci_retry make pull-images; fi
if [ -n "$SHOULD_TEST" ]; then ci_retry make test-integration; fi

8
.semaphoreci/job2.sh Executable file
View File

@ -0,0 +1,8 @@
#!/usr/bin/env bash
set -e
ci_retry make validate
if [ -n "$SHOULD_TEST" ]; then ci_retry make test-unit; fi
if [ -n "$SHOULD_TEST" ]; then make -j"${N_MAKE_JOBS}" crossbinary-default-parallel; fi

View File

@ -1,11 +1,35 @@
#!/usr/bin/env bash
set -e
# For personnal CI
# mv /home/runner/workspace/src/github.com/<username>/ /home/runner/workspace/src/github.com/containous/
# cd /home/runner/workspace/src/github.com/containous/traefik/
for s in apache2 cassandra elasticsearch memcached mysql mongod postgresql sphinxsearch rethinkdb rabbitmq-server redis-server; do sudo service $s stop; done
sudo swapoff -a
sudo dd if=/dev/zero of=/swapfile bs=1M count=3072
sudo mkswap /swapfile
sudo swapon /swapfile
sudo rm -rf /home/runner/.rbenv
sudo rm -rf /usr/local/golang/{1.4.3,1.5.4,1.6.4,1.7.6,1.8.6,1.9.7,1.10.3,1.11}
#export DOCKER_VERSION=18.06.3
source .semaphoreci/vars
if [ -z "${PULL_REQUEST_NUMBER}" ]; then SHOULD_TEST="-*-"; else TEMP_STORAGE=$(curl --silent https://patch-diff.githubusercontent.com/raw/containous/traefik/pull/${PULL_REQUEST_NUMBER}.diff | patch --dry-run -p1 -R || true); fi
echo ${SHOULD_TEST}
if [ -n "$TEMP_STORAGE" ]; then SHOULD_TEST=$(echo "$TEMP_STORAGE" | grep -Ev '(.md|.yaml|.yml)' || :); fi
echo ${TEMP_STORAGE}
echo ${SHOULD_TEST}
#if [ -n "$SHOULD_TEST" ]; then sudo -E apt-get -yq update; fi
#if [ -n "$SHOULD_TEST" ]; then sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install docker-ce=${DOCKER_VERSION}*; fi
if [ -n "$SHOULD_TEST" ]; then docker version; fi
export GO_VERSION=1.12
if [ -f "./go.mod" ]; then GO_VERSION="$(grep '^go .*' go.mod | awk '{print $2}')"; export GO_VERSION; fi
#if [ "${GO_VERSION}" == '1.13' ]; then export GO_VERSION=1.13rc2; fi
echo "Selected Go version: ${GO_VERSION}"
sudo -E apt-get -yq update
sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install docker-ce=${DOCKER_VERSION}*
docker version
if [ -f "./.semaphoreci/golang.sh" ]; then ./.semaphoreci/golang.sh; fi
if [ -f "./.semaphoreci/golang.sh" ]; then export GOROOT="/usr/local/golang/${GO_VERSION}/go"; fi
if [ -f "./.semaphoreci/golang.sh" ]; then export GOTOOLDIR="/usr/local/golang/${GO_VERSION}/go/pkg/tool/linux_amd64"; fi
go version
pip install --user -r requirements.txt
if [ -f "./go.mod" ]; then export GO111MODULE=on; fi
if [ -f "./go.mod" ]; then export GOPROXY=https://proxy.golang.org; fi
if [ -f "./go.mod" ]; then go mod download; fi
make pull-images
ci_retry make validate
df

View File

@ -1,6 +0,0 @@
#!/usr/bin/env bash
set -e
make test-unit
ci_retry make test-integration
make -j${N_MAKE_JOBS} crossbinary-default-parallel

View File

@ -1,8 +1,6 @@
#!/usr/bin/env bash
set -e
export secure='btt4r13t09gQlHb6gYrvGC2yGCMMHfnp1Mz1RQedc4Mpf/FfT8aE6xmK2a2i9CCvskjrP0t/BFaS4yxIURjnFRn+ugQIEa0pLspB9UJArW/vgOSpIWM9/OQ/fg8z5XuMxN6Md4DL1/iLypMNSageA1x0TRdt89+D1N1dALpg5XRCXLFbC84TLi0gjlFuib9ibPKzEhLT+anCRJ6iZMzeupDSoaCVbAtJMoDvXw4+4AcRZ1+k4MybBLyCib5boaEOt4pTT88mz4Kk0YaMwPVJyg9Qv36VqyUcPS09Yd95LuyVQ4+tZt8Y1ccbIzULsK+sLM3hLCzxlmlpN3dQBlZJiiRtQde0mgGAKyC0P0A1XjuDTywcsa5edB+fTk1Dsewz9xZ9V0NmMz8t+UNZnaSsAPga9i86jULbXUUwMVSzVRc+Xgx02liB/8qI1xYC9FM6ilStt7rn7mF0k3KbiWhcptgeXjO6Lah9FjEKd5w4MXsdUSTi/86rQaLo+kj+XdaTrXCTulKHyRyQEUj+8V1w0oVz7pcGjePHd7y5oU9ByifVQy6sytuFBfRZvugM5bKHo+i0pcWvixrZS42DrzwxZJsspANOvqSe5ifVbvOkfUppQdCBIwptxV5N1b49XPKU3W/w34QJ8xGmKp3TFA7WwVCztriFHjPgiRpB3EG99Bg='
export REPO='containous/traefik'
if VERSION=$(git describe --exact-match --abbrev=0 --tags);
@ -12,7 +10,7 @@ else
export VERSION=''
fi
export CODENAME=raclette
export CODENAME=montdor
export N_MAKE_JOBS=2
@ -26,8 +24,8 @@ function ci_retry {
until [ $n -ge $NRETRY ]
do
"$@" && break
n=$[$n+1]
echo "$@ failed, attempt ${n}/${NRETRY}"
n=$((n+1))
echo "${*} failed, attempt ${n}/${NRETRY}"
sleep $NSLEEP
done
@ -36,4 +34,3 @@ function ci_retry {
}
export -f ci_retry

View File

@ -1,19 +1,22 @@
sudo: required
dist: trusty
git:
depth: false
services:
- docker
env:
global:
- secure: btt4r13t09gQlHb6gYrvGC2yGCMMHfnp1Mz1RQedc4Mpf/FfT8aE6xmK2a2i9CCvskjrP0t/BFaS4yxIURjnFRn+ugQIEa0pLspB9UJArW/vgOSpIWM9/OQ/fg8z5XuMxN6Md4DL1/iLypMNSageA1x0TRdt89+D1N1dALpg5XRCXLFbC84TLi0gjlFuib9ibPKzEhLT+anCRJ6iZMzeupDSoaCVbAtJMoDvXw4+4AcRZ1+k4MybBLyCib5boaEOt4pTT88mz4Kk0YaMwPVJyg9Qv36VqyUcPS09Yd95LuyVQ4+tZt8Y1ccbIzULsK+sLM3hLCzxlmlpN3dQBlZJiiRtQde0mgGAKyC0P0A1XjuDTywcsa5edB+fTk1Dsewz9xZ9V0NmMz8t+UNZnaSsAPga9i86jULbXUUwMVSzVRc+Xgx02liB/8qI1xYC9FM6ilStt7rn7mF0k3KbiWhcptgeXjO6Lah9FjEKd5w4MXsdUSTi/86rQaLo+kj+XdaTrXCTulKHyRyQEUj+8V1w0oVz7pcGjePHd7y5oU9ByifVQy6sytuFBfRZvugM5bKHo+i0pcWvixrZS42DrzwxZJsspANOvqSe5ifVbvOkfUppQdCBIwptxV5N1b49XPKU3W/w34QJ8xGmKp3TFA7WwVCztriFHjPgiRpB3EG99Bg=
- REPO: $TRAVIS_REPO_SLUG
- VERSION: $TRAVIS_TAG
- CODENAME: raclette
- N_MAKE_JOBS: 2
- REPO=$TRAVIS_REPO_SLUG
- VERSION=$TRAVIS_TAG
- CODENAME=montdor
- GO111MODULE=on
script:
- echo "Skipping tests... (Tests are executed on SemaphoreCI)"
- if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then make docs; fi
before_deploy:
- >
@ -22,21 +25,15 @@ before_deploy:
sudo -E apt-get -yq update;
sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install docker-ce=${DOCKER_VERSION}*;
docker version;
pip install --user -r requirements.txt;
make -j${N_MAKE_JOBS} crossbinary-parallel;
make image;
mkdocs build --clean;
tar cfz dist/traefik-${VERSION}.src.tar.gz --exclude-vcs --exclude dist .;
make build-image;
if [ "$TRAVIS_TAG" ]; then
make release-packages;
fi;
curl -sfL https://raw.githubusercontent.com/containous/structor/master/godownloader.sh | bash -s -- -b "${GOPATH}/bin" ${STRUCTOR_VERSION}
structor -o containous -r traefik --dockerfile-url="https://raw.githubusercontent.com/containous/traefik/v1.7/docs.Dockerfile" --menu.js-url="https://raw.githubusercontent.com/containous/structor/master/traefik-menu.js.gotmpl" --rqts-url="https://raw.githubusercontent.com/containous/structor/master/requirements-override.txt" --force-edit-url --exp-branch=master --debug;
fi
deploy:
- provider: pages
edge: true
github_token: ${GITHUB_TOKEN}
local_dir: site
skip_cleanup: true
on:
repo: containous/traefik
tags: true
- provider: releases
api_key: ${GITHUB_TOKEN}
file: dist/traefik*
@ -51,8 +48,11 @@ deploy:
on:
repo: containous/traefik
tags: true
- provider: script
script: sh script/deploy-docker.sh
- provider: pages
edge: false
github_token: ${GITHUB_TOKEN}
local_dir: site
skip_cleanup: true
on:
repo: containous/traefik
all_branches: true

Binary file not shown.

BIN
.travis/traefiker_rsa.enc Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -2,17 +2,11 @@
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience,nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
@ -22,53 +16,36 @@ include:
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at contact@containo.us
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.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at contact@containo.us
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.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
[version]: http://contributor-covenant.org/version/1/4/

4
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,4 @@
# Contributing
- https://docs.traefik.io/contributing/submitting-pull-requests/
- https://docs.traefik.io/contributing/submitting-issues/

View File

@ -2,4 +2,5 @@ FROM scratch
COPY script/ca-certificates.crt /etc/ssl/certs/
COPY dist/traefik /
EXPOSE 80
VOLUME ["/tmp"]
ENTRYPOINT ["/traefik"]

View File

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2016-2017 Containous SAS
Copyright (c) 2016-2018 Containous SAS
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

197
Makefile
View File

@ -1,4 +1,22 @@
.PHONY: all
.PHONY: all docs docs-serve
SRCS = $(shell git ls-files '*.go' | grep -v '^vendor/')
TAG_NAME := $(shell git tag -l --contains HEAD)
SHA := $(shell git rev-parse HEAD)
VERSION_GIT := $(if $(TAG_NAME),$(TAG_NAME),$(SHA))
VERSION := $(if $(VERSION),$(VERSION),$(VERSION_GIT))
BIND_DIR := "dist"
GIT_BRANCH := $(subst heads/,,$(shell git rev-parse --abbrev-ref HEAD 2>/dev/null))
TRAEFIK_DEV_IMAGE := traefik-dev$(if $(GIT_BRANCH),:$(subst /,-,$(GIT_BRANCH)))
REPONAME := $(shell echo $(REPO) | tr '[:upper:]' '[:lower:]')
TRAEFIK_IMAGE := $(if $(REPONAME),$(REPONAME),"containous/traefik")
INTEGRATION_OPTS := $(if $(MAKE_DOCKER_HOST),-e "DOCKER_HOST=$(MAKE_DOCKER_HOST)", -e "TEST_CONTAINER=1" -v "/var/run/docker.sock:/var/run/docker.sock")
DOCKER_BUILD_ARGS := $(if $(DOCKER_VERSION), "--build-arg=DOCKER_VERSION=$(DOCKER_VERSION)",)
TRAEFIK_ENVS := \
-e OS_ARCH_ARG \
@ -7,108 +25,127 @@ TRAEFIK_ENVS := \
-e VERBOSE \
-e VERSION \
-e CODENAME \
-e TESTDIRS
-e TESTDIRS \
-e CI \
-e CONTAINER=DOCKER # Indicator for integration tests that we are running inside a container.
SRCS = $(shell git ls-files '*.go' | grep -v '^vendor/' | grep -v '^integration/vendor/')
BIND_DIR := "dist"
TRAEFIK_MOUNT := -v "$(CURDIR)/$(BIND_DIR):/go/src/github.com/containous/traefik/$(BIND_DIR)"
GIT_BRANCH := $(subst heads/,,$(shell git rev-parse --abbrev-ref HEAD 2>/dev/null))
TRAEFIK_DEV_IMAGE := traefik-dev$(if $(GIT_BRANCH),:$(GIT_BRANCH))
REPONAME := $(shell echo $(REPO) | tr '[:upper:]' '[:lower:]')
TRAEFIK_IMAGE := $(if $(REPONAME),$(REPONAME),"containous/traefik")
INTEGRATION_OPTS := $(if $(MAKE_DOCKER_HOST),-e "DOCKER_HOST=$(MAKE_DOCKER_HOST)", -v "/var/run/docker.sock:/var/run/docker.sock")
DOCKER_BUILD_ARGS := $(if $(DOCKER_VERSION), "--build-arg=DOCKER_VERSION=$(DOCKER_VERSION)",)
DOCKER_RUN_OPTS := $(TRAEFIK_ENVS) $(TRAEFIK_MOUNT) "$(TRAEFIK_DEV_IMAGE)"
DOCKER_RUN_TRAEFIK := docker run $(INTEGRATION_OPTS) -it $(DOCKER_RUN_OPTS)
DOCKER_RUN_TRAEFIK_NOTTY := docker run $(INTEGRATION_OPTS) -i $(DOCKER_RUN_OPTS)
print-%: ; @echo $*=$($*)
PRE_TARGET ?= build-dev-image
default: binary
all: generate-webui build ## validate all checks, build linux binary, run all tests\ncross non-linux binaries
$(DOCKER_RUN_TRAEFIK) ./script/make.sh
binary: generate-webui build ## build the linux binary
$(DOCKER_RUN_TRAEFIK) ./script/make.sh generate binary
crossbinary: generate-webui build ## cross build the non-linux binaries
$(DOCKER_RUN_TRAEFIK) ./script/make.sh generate crossbinary
crossbinary-parallel:
$(MAKE) generate-webui
$(MAKE) build crossbinary-default crossbinary-others
crossbinary-default: generate-webui build
$(DOCKER_RUN_TRAEFIK_NOTTY) ./script/make.sh generate crossbinary-default
crossbinary-default-parallel:
$(MAKE) generate-webui
$(MAKE) build crossbinary-default
crossbinary-others: generate-webui build
$(DOCKER_RUN_TRAEFIK_NOTTY) ./script/make.sh generate crossbinary-others
crossbinary-others-parallel:
$(MAKE) generate-webui
$(MAKE) build crossbinary-others
test: build ## run the unit and integration tests
$(DOCKER_RUN_TRAEFIK) ./script/make.sh generate test-unit binary test-integration
test-unit: build ## run the unit tests
$(DOCKER_RUN_TRAEFIK) ./script/make.sh generate test-unit
test-integration: build ## run the integration tests
$(DOCKER_RUN_TRAEFIK) ./script/make.sh generate binary test-integration
validate: build ## validate gofmt, golint and go vet
$(DOCKER_RUN_TRAEFIK) ./script/make.sh validate-glide validate-gofmt validate-govet validate-golint validate-misspell validate-vendor
build: dist
## Build Dev Docker image
build-dev-image: dist
docker build $(DOCKER_BUILD_ARGS) -t "$(TRAEFIK_DEV_IMAGE)" -f build.Dockerfile .
build-webui:
docker build -t traefik-webui -f webui/Dockerfile webui
build-no-cache: dist
## Build Dev Docker image without cache
build-dev-image-no-cache: dist
docker build --no-cache -t "$(TRAEFIK_DEV_IMAGE)" -f build.Dockerfile .
shell: build ## start a shell inside the build env
$(DOCKER_RUN_TRAEFIK) /bin/bash
image: binary ## build a docker traefik image
docker build -t $(TRAEFIK_IMAGE) .
## Create the "dist" directory
dist:
mkdir dist
run-dev:
go generate
go build
./traefik
## Build WebUI Docker image
build-webui-image:
docker build -t traefik-webui -f webui/Dockerfile webui
generate-webui: build-webui
## Generate WebUI
generate-webui: build-webui-image
if [ ! -d "static" ]; then \
mkdir -p static; \
docker run --rm -v "$$PWD/static":'/src/static' traefik-webui npm run build; \
docker run --rm -v "$$PWD/static":'/src/static' traefik-webui npm run build:nc; \
docker run --rm -v "$$PWD/static":'/src/static' traefik-webui chown -R $(shell id -u):$(shell id -g) ../static; \
echo 'For more informations show `webui/readme.md`' > $$PWD/static/DONT-EDIT-FILES-IN-THIS-DIRECTORY.md; \
fi
lint:
script/validate-golint
## Build the linux binary
binary: generate-webui $(PRE_TARGET)
$(if $(PRE_TARGET),$(DOCKER_RUN_TRAEFIK)) ./script/make.sh generate binary
## Build the binary for the standard plaforms (linux, darwin, windows)
crossbinary-default: generate-webui build-dev-image
$(DOCKER_RUN_TRAEFIK_NOTTY) ./script/make.sh generate crossbinary-default
## Build the binary for the standard plaforms (linux, darwin, windows) in parallel
crossbinary-default-parallel:
$(MAKE) generate-webui
$(MAKE) build-dev-image crossbinary-default
## Run the unit and integration tests
test: build-dev-image
$(DOCKER_RUN_TRAEFIK) ./script/make.sh generate test-unit binary test-integration
## Run the unit tests
test-unit: $(PRE_TARGET)
$(if $(PRE_TARGET),$(DOCKER_RUN_TRAEFIK)) ./script/make.sh generate test-unit
## Pull all images for integration tests
pull-images:
grep --no-filename -E '^\s+image:' ./integration/resources/compose/*.yml | awk '{print $$2}' | sort | uniq | xargs -P 6 -n 1 docker pull
## Run the integration tests
test-integration: $(PRE_TARGET)
$(if $(PRE_TARGET),$(DOCKER_RUN_TRAEFIK),TEST_CONTAINER=1) ./script/make.sh generate binary test-integration
TEST_HOST=1 ./script/make.sh test-integration
## Validate code and docs
validate-files: $(PRE_TARGET)
$(if $(PRE_TARGET),$(DOCKER_RUN_TRAEFIK)) ./script/make.sh generate validate-lint validate-misspell
bash $(CURDIR)/script/validate-shell-script.sh
## Validate code, docs, and vendor
validate: $(PRE_TARGET)
$(if $(PRE_TARGET),$(DOCKER_RUN_TRAEFIK)) ./script/make.sh generate validate-lint validate-misspell validate-vendor
bash $(CURDIR)/script/validate-shell-script.sh
## Clean up static directory and build a Docker Traefik image
build-image: binary
rm -rf static
docker build -t $(TRAEFIK_IMAGE) .
## Build a Docker Traefik image
build-image-dirty: binary
docker build -t $(TRAEFIK_IMAGE) .
## Start a shell inside the build env
shell: build-dev-image
$(DOCKER_RUN_TRAEFIK) /bin/bash
## Build documentation site
docs:
make -C ./docs docs
## Serve the documentation site localy
docs-serve:
make -C ./docs docs-serve
## Generate CRD clientset
generate-crd:
./script/update-generated-crd-code.sh
## Create packages for the release
release-packages: generate-webui build-dev-image
rm -rf dist
$(DOCKER_RUN_TRAEFIK_NOTTY) goreleaser release --skip-publish --timeout="60m"
$(DOCKER_RUN_TRAEFIK_NOTTY) tar cfz dist/traefik-${VERSION}.src.tar.gz \
--exclude-vcs \
--exclude .idea \
--exclude .travis \
--exclude .semaphoreci \
--exclude .github \
--exclude dist .
$(DOCKER_RUN_TRAEFIK_NOTTY) chown -R $(shell id -u):$(shell id -g) dist/
## Format the Code
fmt:
gofmt -s -l -w $(SRCS)
pull-images:
for f in $(shell find ./integration/resources/compose/ -type f); do \
docker-compose -f $$f pull; \
done
help: ## this help
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {sub("\\\\n",sprintf("\n%22c"," "), $$2);printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
run-dev:
go generate
GO111MODULE=on go build ./cmd/traefik
./traefik

195
README.md
View File

@ -1,147 +1,160 @@
<p align="center">
<img src="docs/img/traefik.logo.png" alt="Træfik" title="Træfik" />
<img src="docs/content/assets/img/traefik.logo.png" alt="Traefik" title="Traefik" />
</p>
[![Build Status](https://travis-ci.org/containous/traefik.svg?branch=master)](https://travis-ci.org/containous/traefik)
[![Build Status SemaphoreCI](https://semaphoreci.com/api/v1/containous/traefik/branches/master/shields_badge.svg)](https://semaphoreci.com/containous/traefik)
[![Docs](https://img.shields.io/badge/docs-current-brightgreen.svg)](https://docs.traefik.io)
[![Go Report Card](https://goreportcard.com/badge/containous/traefik)](http://goreportcard.com/report/containous/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/containous/traefik/blob/master/LICENSE.md)
[![Join the chat at https://traefik.herokuapp.com](https://img.shields.io/badge/style-register-green.svg?style=social&label=Slack)](https://traefik.herokuapp.com)
[![Twitter](https://img.shields.io/twitter/follow/traefikproxy.svg?style=social)](https://twitter.com/intent/follow?screen_name=traefikproxy)
[![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/)
[![Twitter](https://img.shields.io/twitter/follow/traefik.svg?style=social)](https://twitter.com/intent/follow?screen_name=traefik)
Træfik (pronounced like [traffic](https://speak-ipa.bearbin.net/speak.cgi?speak=%CB%88tr%C3%A6f%C9%AAk)) is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease.
It supports several backends ([Docker](https://www.docker.com/), [Swarm](https://docs.docker.com/swarm), [Kubernetes](http://kubernetes.io), [Marathon](https://mesosphere.github.io/marathon/), [Mesos](https://github.com/apache/mesos), [Consul](https://www.consul.io/), [Etcd](https://coreos.com/etcd/), [Zookeeper](https://zookeeper.apache.org), [BoltDB](https://github.com/boltdb/bolt), [Eureka](https://github.com/Netflix/eureka), [Amazon DynamoDB](https://aws.amazon.com/dynamodb/), Rest API, file...) to manage its configuration automatically and dynamically.
Traefik (pronounced _traffic_) is a modern HTTP reverse proxy and load balancer that makes deploying microservices easy.
Traefik integrates with your existing infrastructure components ([Docker](https://www.docker.com/), [Swarm mode](https://docs.docker.com/engine/swarm/), [Kubernetes](https://kubernetes.io), [Marathon](https://mesosphere.github.io/marathon/), [Consul](https://www.consul.io/), [Etcd](https://coreos.com/etcd/), [Rancher](https://rancher.com), [Amazon ECS](https://aws.amazon.com/ecs), ...) and configures itself automatically and dynamically.
Pointing Traefik at your orchestrator should be the _only_ configuration step you need.
---
. **[Overview](#overview)** .
**[Features](#features)** .
**[Supported backends](#supported-backends)** .
**[Quickstart](#quickstart)** .
**[Web UI](#web-ui)** .
**[Documentation](#documentation)** .
. **[Support](#support)** .
**[Release cycle](#release-cycle)** .
**[Contributing](#contributing)** .
**[Maintainers](#maintainers)** .
**[Credits](#credits)** .
---
:warning: Please be aware that the old configurations for Traefik v1.x are NOT compatible with the v2.x config as of now. If you're running v2, please ensure you are using a [v2 configuration](https://docs.traefik.io/).
## Overview
Imagine that you have deployed a bunch of microservices on your infrastructure. You probably used a service registry (like etcd or consul) and/or an orchestrator (swarm, Mesos/Marathon) to manage all these services.
If you want your users to access some of your microservices from the Internet, you will have to use a reverse proxy and configure it using virtual hosts or prefix paths:
Imagine that you have deployed a bunch of microservices with the help of an orchestrator (like Swarm or Kubernetes) or a service registry (like etcd or consul).
Now you want users to access these microservices, and you need a reverse proxy.
- domain `api.domain.com` will point the microservice `api` in your private network
- path `domain.com/web` will point the microservice `web` in your private network
- domain `backoffice.domain.com` will point the microservices `backoffice` in your private network, load-balancing between your multiple instances
Traditional reverse-proxies require that you configure _each_ route that will connect paths and subdomains to _each_ microservice.
In an environment where you add, remove, kill, upgrade, or scale your services _many_ times a day, the task of keeping the routes up to date becomes tedious.
But a microservices architecture is dynamic... Services are added, removed, killed or upgraded often, eventually several times a day.
**This is when Traefik can help you!**
Traditional reverse-proxies are not natively dynamic. You can't change their configuration and hot-reload easily.
Traefik listens to your service registry/orchestrator API and instantly generates the routes so your microservices are connected to the outside world -- without further intervention from your part.
Here enters Træfik.
![Architecture](docs/img/architecture.png)
Træfik can listen to your service registry/orchestrator API, and knows each time a microservice is added, removed, killed or upgraded, and can generate its configuration automatically.
Routes to your services will be created instantly.
Run it and forget it!
**Run Traefik and let it do the work for you!**
_(But if you'd rather configure some of your routes manually, Traefik supports that too!)_
![Architecture](docs/content/assets/img/traefik-architecture.png)
## Features
- [It's fast](http://docs.traefik.io/benchmarks)
- No dependency hell, single binary made with go
- Rest API
- Multiple backends supported: Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, and more to come
- Watchers for backends, can listen for changes in backends to apply a new configuration automatically
- Hot-reloading of configuration. No need to restart the process
- Graceful shutdown http connections
- Circuit breakers on backends
- Round Robin, rebalancer load-balancers
- Rest Metrics
- [Tiny](https://microbadger.com/images/traefik) [official](https://hub.docker.com/r/_/traefik/) docker image included
- SSL backends support
- SSL frontend support (with SNI)
- Clean AngularJS Web UI
- Websocket support
- HTTP/2 support
- Retry request if network error
- [Let's Encrypt](https://letsencrypt.org) support (Automatic HTTPS with renewal)
- High Availability with cluster mode
- Continuously updates its configuration (No restarts!)
- Supports multiple load balancing algorithms
- Provides HTTPS to your microservices by leveraging [Let's Encrypt](https://letsencrypt.org) (wildcard certificates support)
- Circuit breakers, retry
- See the magic through its clean web UI
- Websocket, HTTP/2, GRPC ready
- Provides metrics (Rest, Prometheus, Datadog, Statsd, InfluxDB)
- Keeps access logs (JSON, CLF)
- Fast
- Exposes a Rest API
- Packaged as a single binary file (made with :heart: with go) and available as a [tiny](https://microbadger.com/images/traefik) [official](https://hub.docker.com/r/_/traefik/) docker image
## Supported Backends
- [Docker](https://docs.traefik.io/providers/docker/) / [Swarm mode](https://docs.traefik.io/providers/docker/)
- [Kubernetes](https://docs.traefik.io/providers/kubernetes-crd/)
- [Marathon](https://docs.traefik.io/providers/marathon/)
- [Rancher](https://docs.traefik.io/providers/rancher/) (Metadata)
- [File](https://docs.traefik.io/configuration/backends/file)
## Quickstart
You can have a quick look at Træfik in this [Katacoda tutorial](https://www.katacoda.com/courses/traefik/deploy-load-balancer) that shows how to load balance requests between multiple Docker containers.
Here is a talk given by [Ed Robinson](https://github.com/errm) at the [ContainerCamp UK](https://container.camp) conference.
You will learn fundamental Træfik features and see some demos with Kubernetes.
[![Traefik ContainerCamp UK](http://img.youtube.com/vi/aFtpIShV60I/0.jpg)](https://www.youtube.com/watch?v=aFtpIShV60I)
Here is a talk (in French) given by [Emile Vauge](https://github.com/emilevauge) at the [Devoxx France 2016](http://www.devoxx.fr) conference.
You will learn fundamental Træfik features and see some demos with Docker, Mesos/Marathon and Let's Encrypt.
[![Traefik Devoxx France](http://img.youtube.com/vi/QvAz9mVx5TI/0.jpg)](http://www.youtube.com/watch?v=QvAz9mVx5TI)
To get your hands on Traefik, you can use the [5-Minute Quickstart](https://docs.traefik.io/getting-started/quick-start/) in our documentation (you will need Docker).
## Web UI
You can access the simple HTML frontend of Træfik.
You can access the simple HTML frontend of Traefik.
![Web UI Providers](docs/img/web.frontend.png)
![Web UI Health](docs/img/traefik-health.png)
![Web UI Providers](docs/content/assets/img/webui-dashboard.png)
## Plumbing
## Documentation
- [Oxy](https://github.com/vulcand/oxy): an awesome proxy library made by Mailgun guys
- [Gorilla mux](https://github.com/gorilla/mux): famous request router
- [Negroni](https://github.com/codegangsta/negroni): web middlewares made simple
- [Lego](https://github.com/xenolf/lego): the best [Let's Encrypt](https://letsencrypt.org) library in go
You can find the complete documentation of Traefik v2 at [https://docs.traefik.io](https://docs.traefik.io).
## Test it
If you are using Traefik v1, you can find the complete documentation at [https://docs.traefik.io/v1.7/](https://docs.traefik.io/v1.7/)
- The simple way: grab the latest binary from the [releases](https://github.com/containous/traefik/releases) page and just run it with the [sample configuration file](https://raw.githubusercontent.com/containous/traefik/master/traefik.sample.toml):
A collection of contributions around Traefik can be found at [https://awesome.traefik.io](https://awesome.traefik.io).
## Support
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/)
If you need commercial support, please contact [Containo.us](https://containo.us) by mail: <mailto:support@containo.us>.
## Download
- Grab the latest binary from the [releases](https://github.com/containous/traefik/releases) page and run it with the [sample configuration file](https://raw.githubusercontent.com/containous/traefik/master/traefik.sample.toml):
```shell
./traefik --configFile=traefik.toml
```
- Use the tiny Docker image:
- Or use the official tiny Docker image and run it with the [sample configuration file](https://raw.githubusercontent.com/containous/traefik/master/traefik.sample.toml):
```shell
docker run -d -p 8080:8080 -p 80:80 -v $PWD/traefik.toml:/etc/traefik/traefik.toml traefik
```
- From sources:
- Or get the sources:
```shell
git clone https://github.com/containous/traefik
```
## Documentation
## Introductory Videos
You can find the complete documentation [here](https://docs.traefik.io).
## Contributing
Please refer to [this section](.github/CONTRIBUTING.md).
## Code Of Conduct
Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
## Support
You can join [![Join the chat at https://traefik.herokuapp.com](https://img.shields.io/badge/style-register-green.svg?style=social&label=Slack)](https://traefik.herokuapp.com) to get basic support.
If you prefer commercial support, please contact [containo.us](https://containo.us) by mail: <mailto:support@containo.us>.
You can find high level and deep dive videos on [videos.containo.us](https://videos.containo.us)
## Maintainers
- Emile Vauge [@emilevauge](https://github.com/emilevauge)
- Vincent Demeester [@vdemeester](https://github.com/vdemeester)
- Russell Clare [@Russell-IO](https://github.com/Russell-IO)
- Ed Robinson [@errm](https://github.com/errm)
- Daniel Tomcej [@dtomcej](https://github.com/dtomcej)
- Manuel Laufenberg [@SantoDE](https://github.com/SantoDE)
- Thomas Recloux [@trecloux](https://github.com/trecloux)
- Timo Reimann [@timoreimann](https://github.com/timoreimann)
[Information about process and maintainers](docs/content/contributing/maintainers.md)
## Contributing
If you'd like to contribute to the project, refer to the [contributing documentation](CONTRIBUTING.md).
Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md).
By participating in this project, you agree to abide by its terms.
## Release Cycle
- We release a new version (e.g. 1.1.0, 1.2.0, 1.3.0) every other month.
- Release Candidates are available before the release (e.g. 1.1.0-rc1, 1.1.0-rc2, 1.1.0-rc3, 1.1.0-rc4, before 1.1.0)
- Bug-fixes (e.g. 1.1.1, 1.1.2, 1.2.1, 1.2.3) are released as needed (no additional features are delivered in those versions, bug-fixes only)
Each version is supported until the next one is released (e.g. 1.1.x will be supported until 1.2.0 is out)
We use [Semantic Versioning](http://semver.org/)
## Mailing lists
- General announcements, new releases: mail at news+subscribe@traefik.io or on [the online viewer](https://groups.google.com/a/traefik.io/forum/#!forum/news)
- Security announcements: mail at security+subscribe@traefik.io or on [the online viewer](https://groups.google.com/a/traefik.io/forum/#!forum/security).
## Credits
Kudos to [Peka](http://peka.byethost11.com/photoblog/) for his awesome work on the logo ![logo](docs/img/traefik.icon.png).
Traefik's logo licensed under the Creative Commons 3.0 Attributions license.
Kudos to [Peka](http://peka.byethost11.com/photoblog/) for his awesome work on the logo ![logo](docs/content/assets/img/traefik.icon.png).
Traefik's logo 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 original Go gopher was designed by Renee French (http://reneefrench.blogspot.com/).
The original Go gopher was designed by Renee French (http://reneefrench.blogspot.com/).

View File

@ -1,245 +0,0 @@
package acme
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/tls"
"crypto/x509"
"errors"
"reflect"
"sort"
"strings"
"sync"
"time"
"github.com/containous/traefik/log"
"github.com/xenolf/lego/acme"
)
// Account is used to store lets encrypt registration info
type Account struct {
Email string
Registration *acme.RegistrationResource
PrivateKey []byte
DomainsCertificate DomainsCertificates
ChallengeCerts map[string]*ChallengeCert
}
// ChallengeCert stores a challenge certificate
type ChallengeCert struct {
Certificate []byte
PrivateKey []byte
certificate *tls.Certificate
}
// Init inits acccount struct
func (a *Account) Init() error {
err := a.DomainsCertificate.Init()
if err != nil {
return err
}
for _, cert := range a.ChallengeCerts {
if cert.certificate == nil {
certificate, err := tls.X509KeyPair(cert.Certificate, cert.PrivateKey)
if err != nil {
return err
}
cert.certificate = &certificate
}
if cert.certificate.Leaf == nil {
leaf, err := x509.ParseCertificate(cert.certificate.Certificate[0])
if err != nil {
return err
}
cert.certificate.Leaf = leaf
}
}
return nil
}
// NewAccount creates an account
func NewAccount(email string) (*Account, error) {
// Create a user. New accounts need an email and private key to start
privateKey, err := rsa.GenerateKey(rand.Reader, 4096)
if err != nil {
return nil, err
}
domainsCerts := DomainsCertificates{Certs: []*DomainsCertificate{}}
domainsCerts.Init()
return &Account{
Email: email,
PrivateKey: x509.MarshalPKCS1PrivateKey(privateKey),
DomainsCertificate: DomainsCertificates{Certs: domainsCerts.Certs},
ChallengeCerts: map[string]*ChallengeCert{}}, nil
}
// GetEmail returns email
func (a *Account) GetEmail() string {
return a.Email
}
// GetRegistration returns lets encrypt registration resource
func (a *Account) GetRegistration() *acme.RegistrationResource {
return a.Registration
}
// GetPrivateKey returns private key
func (a *Account) GetPrivateKey() crypto.PrivateKey {
if privateKey, err := x509.ParsePKCS1PrivateKey(a.PrivateKey); err == nil {
return privateKey
}
log.Errorf("Cannot unmarshall private key %+v", a.PrivateKey)
return nil
}
// Certificate is used to store certificate info
type Certificate struct {
Domain string
CertURL string
CertStableURL string
PrivateKey []byte
Certificate []byte
}
// DomainsCertificates stores a certificate for multiple domains
type DomainsCertificates struct {
Certs []*DomainsCertificate
lock sync.RWMutex
}
func (dc *DomainsCertificates) Len() int {
return len(dc.Certs)
}
func (dc *DomainsCertificates) Swap(i, j int) {
dc.Certs[i], dc.Certs[j] = dc.Certs[j], dc.Certs[i]
}
func (dc *DomainsCertificates) Less(i, j int) bool {
if reflect.DeepEqual(dc.Certs[i].Domains, dc.Certs[j].Domains) {
return dc.Certs[i].tlsCert.Leaf.NotAfter.After(dc.Certs[j].tlsCert.Leaf.NotAfter)
}
if dc.Certs[i].Domains.Main == dc.Certs[j].Domains.Main {
return strings.Join(dc.Certs[i].Domains.SANs, ",") < strings.Join(dc.Certs[j].Domains.SANs, ",")
}
return dc.Certs[i].Domains.Main < dc.Certs[j].Domains.Main
}
func (dc *DomainsCertificates) removeDuplicates() {
sort.Sort(dc)
for i := 0; i < len(dc.Certs); i++ {
for i2 := i + 1; i2 < len(dc.Certs); i2++ {
if reflect.DeepEqual(dc.Certs[i].Domains, dc.Certs[i2].Domains) {
// delete
log.Warnf("Remove duplicate cert: %+v, expiration :%s", dc.Certs[i2].Domains, dc.Certs[i2].tlsCert.Leaf.NotAfter.String())
dc.Certs = append(dc.Certs[:i2], dc.Certs[i2+1:]...)
i2--
}
}
}
}
// Init inits DomainsCertificates
func (dc *DomainsCertificates) Init() error {
dc.lock.Lock()
defer dc.lock.Unlock()
for _, domainsCertificate := range dc.Certs {
tlsCert, err := tls.X509KeyPair(domainsCertificate.Certificate.Certificate, domainsCertificate.Certificate.PrivateKey)
if err != nil {
return err
}
domainsCertificate.tlsCert = &tlsCert
if domainsCertificate.tlsCert.Leaf == nil {
leaf, err := x509.ParseCertificate(domainsCertificate.tlsCert.Certificate[0])
if err != nil {
return err
}
domainsCertificate.tlsCert.Leaf = leaf
}
}
dc.removeDuplicates()
return nil
}
func (dc *DomainsCertificates) renewCertificates(acmeCert *Certificate, domain Domain) error {
dc.lock.Lock()
defer dc.lock.Unlock()
for _, domainsCertificate := range dc.Certs {
if reflect.DeepEqual(domain, domainsCertificate.Domains) {
tlsCert, err := tls.X509KeyPair(acmeCert.Certificate, acmeCert.PrivateKey)
if err != nil {
return err
}
domainsCertificate.Certificate = acmeCert
domainsCertificate.tlsCert = &tlsCert
return nil
}
}
return errors.New("Certificate to renew not found for domain " + domain.Main)
}
func (dc *DomainsCertificates) addCertificateForDomains(acmeCert *Certificate, domain Domain) (*DomainsCertificate, error) {
dc.lock.Lock()
defer dc.lock.Unlock()
tlsCert, err := tls.X509KeyPair(acmeCert.Certificate, acmeCert.PrivateKey)
if err != nil {
return nil, err
}
cert := DomainsCertificate{Domains: domain, Certificate: acmeCert, tlsCert: &tlsCert}
dc.Certs = append(dc.Certs, &cert)
return &cert, nil
}
func (dc *DomainsCertificates) getCertificateForDomain(domainToFind string) (*DomainsCertificate, bool) {
dc.lock.RLock()
defer dc.lock.RUnlock()
for _, domainsCertificate := range dc.Certs {
domains := []string{}
domains = append(domains, domainsCertificate.Domains.Main)
domains = append(domains, domainsCertificate.Domains.SANs...)
for _, domain := range domains {
if domain == domainToFind {
return domainsCertificate, true
}
}
}
return nil, false
}
func (dc *DomainsCertificates) exists(domainToFind Domain) (*DomainsCertificate, bool) {
dc.lock.RLock()
defer dc.lock.RUnlock()
for _, domainsCertificate := range dc.Certs {
if reflect.DeepEqual(domainToFind, domainsCertificate.Domains) {
return domainsCertificate, true
}
}
return nil, false
}
// DomainsCertificate contains a certificate for multiple domains
type DomainsCertificate struct {
Domains Domain
Certificate *Certificate
tlsCert *tls.Certificate
}
func (dc *DomainsCertificate) needRenew() bool {
for _, c := range dc.tlsCert.Certificate {
crt, err := x509.ParseCertificate(c)
if err != nil {
// If there's an error, we assume the cert is broken, and needs update
return true
}
// <= 30 days left, renew certificate
if crt.NotAfter.Before(time.Now().Add(time.Duration(24 * 30 * time.Hour))) {
return true
}
}
return false
}

View File

@ -1,635 +0,0 @@
package acme
import (
"context"
"crypto/tls"
"errors"
"fmt"
"io/ioutil"
fmtlog "log"
"os"
"regexp"
"strings"
"time"
"github.com/BurntSushi/ty/fun"
"github.com/cenk/backoff"
"github.com/containous/staert"
"github.com/containous/traefik/cluster"
"github.com/containous/traefik/log"
"github.com/containous/traefik/safe"
"github.com/containous/traefik/types"
"github.com/eapache/channels"
"github.com/xenolf/lego/acme"
"github.com/xenolf/lego/providers/dns"
)
var (
// OSCPMustStaple enables OSCP stapling as from https://github.com/xenolf/lego/issues/270
OSCPMustStaple = false
)
// ACME allows to connect to lets encrypt and retrieve certs
type ACME struct {
Email string `description:"Email address used for registration"`
Domains []Domain `description:"SANs (alternative domains) to each main domain using format: --acme.domains='main.com,san1.com,san2.com' --acme.domains='main.net,san1.net,san2.net'"`
Storage string `description:"File or key used for certificates storage."`
StorageFile string // deprecated
OnDemand bool `description:"Enable on demand certificate. This will request a certificate from Let's Encrypt during the first TLS handshake for a hostname that does not yet have a certificate."`
OnHostRule bool `description:"Enable certificate generation on frontends Host rules."`
CAServer string `description:"CA server to use."`
EntryPoint string `description:"Entrypoint to proxy acme challenge to."`
DNSProvider string `description:"Use a DNS based challenge provider rather than HTTPS."`
DelayDontCheckDNS int `description:"Assume DNS propagates after a delay in seconds rather than finding and querying nameservers."`
ACMELogging bool `description:"Enable debug logging of ACME actions."`
client *acme.Client
defaultCertificate *tls.Certificate
store cluster.Store
challengeProvider *challengeProvider
checkOnDemandDomain func(domain string) bool
jobs *channels.InfiniteChannel
TLSConfig *tls.Config `description:"TLS config in case wildcard certs are used"`
}
//Domains parse []Domain
type Domains []Domain
//Set []Domain
func (ds *Domains) Set(str string) error {
fargs := func(c rune) bool {
return c == ',' || c == ';'
}
// get function
slice := strings.FieldsFunc(str, fargs)
if len(slice) < 1 {
return fmt.Errorf("Parse error ACME.Domain. Imposible to parse %s", str)
}
d := Domain{
Main: slice[0],
SANs: []string{},
}
if len(slice) > 1 {
d.SANs = slice[1:]
}
*ds = append(*ds, d)
return nil
}
//Get []Domain
func (ds *Domains) Get() interface{} { return []Domain(*ds) }
//String returns []Domain in string
func (ds *Domains) String() string { return fmt.Sprintf("%+v", *ds) }
//SetValue sets []Domain into the parser
func (ds *Domains) SetValue(val interface{}) {
*ds = Domains(val.([]Domain))
}
// Domain holds a domain name with SANs
type Domain struct {
Main string
SANs []string
}
func (a *ACME) init() error {
if a.ACMELogging {
acme.Logger = fmtlog.New(os.Stderr, "legolog: ", fmtlog.LstdFlags)
} else {
acme.Logger = fmtlog.New(ioutil.Discard, "", 0)
}
// no certificates in TLS config, so we add a default one
cert, err := generateDefaultCertificate()
if err != nil {
return err
}
a.defaultCertificate = cert
// TODO: to remove in the futurs
if len(a.StorageFile) > 0 && len(a.Storage) == 0 {
log.Warnf("ACME.StorageFile is deprecated, use ACME.Storage instead")
a.Storage = a.StorageFile
}
a.jobs = channels.NewInfiniteChannel()
return nil
}
// CreateClusterConfig creates a tls.config using ACME configuration in cluster mode
func (a *ACME) CreateClusterConfig(leadership *cluster.Leadership, tlsConfig *tls.Config, checkOnDemandDomain func(domain string) bool) error {
err := a.init()
if err != nil {
return err
}
if len(a.Storage) == 0 {
return errors.New("Empty Store, please provide a key for certs storage")
}
a.checkOnDemandDomain = checkOnDemandDomain
tlsConfig.Certificates = append(tlsConfig.Certificates, *a.defaultCertificate)
tlsConfig.GetCertificate = a.getCertificate
a.TLSConfig = tlsConfig
listener := func(object cluster.Object) error {
account := object.(*Account)
account.Init()
if !leadership.IsLeader() {
a.client, err = a.buildACMEClient(account)
if err != nil {
log.Errorf("Error building ACME client %+v: %s", object, err.Error())
}
}
return nil
}
datastore, err := cluster.NewDataStore(
leadership.Pool.Ctx(),
staert.KvSource{
Store: leadership.Store,
Prefix: a.Storage,
},
&Account{},
listener)
if err != nil {
return err
}
a.store = datastore
a.challengeProvider = &challengeProvider{store: a.store}
ticker := time.NewTicker(24 * time.Hour)
leadership.Pool.AddGoCtx(func(ctx context.Context) {
log.Infof("Starting ACME renew job...")
defer log.Infof("Stopped ACME renew job...")
for {
select {
case <-ctx.Done():
return
case <-ticker.C:
a.renewCertificates()
}
}
})
leadership.AddListener(func(elected bool) error {
if elected {
object, err := a.store.Load()
if err != nil {
return err
}
transaction, object, err := a.store.Begin()
if err != nil {
return err
}
account := object.(*Account)
account.Init()
var needRegister bool
if account == nil || len(account.Email) == 0 {
account, err = NewAccount(a.Email)
if err != nil {
return err
}
needRegister = true
}
if err != nil {
return err
}
a.client, err = a.buildACMEClient(account)
if err != nil {
return err
}
if needRegister {
// New users will need to register; be sure to save it
log.Debugf("Register...")
reg, err := a.client.Register()
if err != nil {
return err
}
account.Registration = reg
}
// The client has a URL to the current Let's Encrypt Subscriber
// Agreement. The user will need to agree to it.
log.Debugf("AgreeToTOS...")
err = a.client.AgreeToTOS()
if err != nil {
// Let's Encrypt Subscriber Agreement renew ?
reg, err := a.client.QueryRegistration()
if err != nil {
return err
}
account.Registration = reg
err = a.client.AgreeToTOS()
if err != nil {
log.Errorf("Error sending ACME agreement to TOS: %+v: %s", account, err.Error())
}
}
err = transaction.Commit(account)
if err != nil {
return err
}
a.retrieveCertificates()
a.renewCertificates()
a.runJobs()
}
return nil
})
return nil
}
// CreateLocalConfig creates a tls.config using local ACME configuration
func (a *ACME) CreateLocalConfig(tlsConfig *tls.Config, checkOnDemandDomain func(domain string) bool) error {
err := a.init()
if err != nil {
return err
}
if len(a.Storage) == 0 {
return errors.New("Empty Store, please provide a filename for certs storage")
}
a.checkOnDemandDomain = checkOnDemandDomain
tlsConfig.Certificates = append(tlsConfig.Certificates, *a.defaultCertificate)
tlsConfig.GetCertificate = a.getCertificate
a.TLSConfig = tlsConfig
localStore := NewLocalStore(a.Storage)
a.store = localStore
a.challengeProvider = &challengeProvider{store: a.store}
var needRegister bool
var account *Account
if fileInfo, fileErr := os.Stat(a.Storage); fileErr == nil && fileInfo.Size() != 0 {
log.Infof("Loading ACME Account...")
// load account
object, err := localStore.Load()
if err != nil {
return err
}
account = object.(*Account)
} else {
log.Infof("Generating ACME Account...")
account, err = NewAccount(a.Email)
if err != nil {
return err
}
needRegister = true
}
a.client, err = a.buildACMEClient(account)
if err != nil {
return err
}
if needRegister {
// New users will need to register; be sure to save it
log.Infof("Register...")
reg, err := a.client.Register()
if err != nil {
return err
}
account.Registration = reg
}
// The client has a URL to the current Let's Encrypt Subscriber
// Agreement. The user will need to agree to it.
log.Debugf("AgreeToTOS...")
err = a.client.AgreeToTOS()
if err != nil {
// Let's Encrypt Subscriber Agreement renew ?
reg, err := a.client.QueryRegistration()
if err != nil {
return err
}
account.Registration = reg
err = a.client.AgreeToTOS()
if err != nil {
log.Errorf("Error sending ACME agreement to TOS: %+v: %s", account, err.Error())
}
}
// save account
transaction, _, err := a.store.Begin()
if err != nil {
return err
}
err = transaction.Commit(account)
if err != nil {
return err
}
a.retrieveCertificates()
a.renewCertificates()
a.runJobs()
ticker := time.NewTicker(24 * time.Hour)
safe.Go(func() {
for range ticker.C {
a.renewCertificates()
}
})
return nil
}
func (a *ACME) getCertificate(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) {
domain := types.CanonicalDomain(clientHello.ServerName)
account := a.store.Get().(*Account)
if providedCertificate := a.getProvidedCertificate([]string{domain}); providedCertificate != nil {
return providedCertificate, nil
}
if challengeCert, ok := a.challengeProvider.getCertificate(domain); ok {
log.Debugf("ACME got challenge %s", domain)
return challengeCert, nil
}
if domainCert, ok := account.DomainsCertificate.getCertificateForDomain(domain); ok {
log.Debugf("ACME got domain cert %s", domain)
return domainCert.tlsCert, nil
}
if a.OnDemand {
if a.checkOnDemandDomain != nil && !a.checkOnDemandDomain(domain) {
return nil, nil
}
return a.loadCertificateOnDemand(clientHello)
}
log.Debugf("ACME got nothing %s", domain)
return nil, nil
}
func (a *ACME) retrieveCertificates() {
a.jobs.In() <- func() {
log.Infof("Retrieving ACME certificates...")
for _, domain := range a.Domains {
// check if cert isn't already loaded
account := a.store.Get().(*Account)
if _, exists := account.DomainsCertificate.exists(domain); !exists {
domains := []string{}
domains = append(domains, domain.Main)
domains = append(domains, domain.SANs...)
certificateResource, err := a.getDomainsCertificates(domains)
if err != nil {
log.Errorf("Error getting ACME certificate for domain %s: %s", domains, err.Error())
continue
}
transaction, object, err := a.store.Begin()
if err != nil {
log.Errorf("Error creating ACME store transaction from domain %s: %s", domain, err.Error())
continue
}
account = object.(*Account)
_, err = account.DomainsCertificate.addCertificateForDomains(certificateResource, domain)
if err != nil {
log.Errorf("Error adding ACME certificate for domain %s: %s", domains, err.Error())
continue
}
if err = transaction.Commit(account); err != nil {
log.Errorf("Error Saving ACME account %+v: %s", account, err.Error())
continue
}
}
}
log.Infof("Retrieved ACME certificates")
}
}
func (a *ACME) renewCertificates() {
a.jobs.In() <- func() {
log.Debugf("Testing certificate renew...")
account := a.store.Get().(*Account)
for _, certificateResource := range account.DomainsCertificate.Certs {
if certificateResource.needRenew() {
log.Debugf("Renewing certificate %+v", certificateResource.Domains)
renewedCert, err := a.client.RenewCertificate(acme.CertificateResource{
Domain: certificateResource.Certificate.Domain,
CertURL: certificateResource.Certificate.CertURL,
CertStableURL: certificateResource.Certificate.CertStableURL,
PrivateKey: certificateResource.Certificate.PrivateKey,
Certificate: certificateResource.Certificate.Certificate,
}, true, OSCPMustStaple)
if err != nil {
log.Errorf("Error renewing certificate: %v", err)
continue
}
log.Debugf("Renewed certificate %+v", certificateResource.Domains)
renewedACMECert := &Certificate{
Domain: renewedCert.Domain,
CertURL: renewedCert.CertURL,
CertStableURL: renewedCert.CertStableURL,
PrivateKey: renewedCert.PrivateKey,
Certificate: renewedCert.Certificate,
}
transaction, object, err := a.store.Begin()
if err != nil {
log.Errorf("Error renewing certificate: %v", err)
continue
}
account = object.(*Account)
err = account.DomainsCertificate.renewCertificates(renewedACMECert, certificateResource.Domains)
if err != nil {
log.Errorf("Error renewing certificate: %v", err)
continue
}
if err = transaction.Commit(account); err != nil {
log.Errorf("Error Saving ACME account %+v: %s", account, err.Error())
continue
}
}
}
}
}
func dnsOverrideDelay(delay int) error {
var err error
if delay > 0 {
log.Debugf("Delaying %d seconds rather than validating DNS propagation", delay)
acme.PreCheckDNS = func(_, _ string) (bool, error) {
time.Sleep(time.Duration(delay) * time.Second)
return true, nil
}
} else if delay < 0 {
err = fmt.Errorf("Invalid negative DelayDontCheckDNS: %d", delay)
}
return err
}
func (a *ACME) buildACMEClient(account *Account) (*acme.Client, error) {
log.Debugf("Building ACME client...")
caServer := "https://acme-v01.api.letsencrypt.org/directory"
if len(a.CAServer) > 0 {
caServer = a.CAServer
}
client, err := acme.NewClient(caServer, account, acme.RSA4096)
if err != nil {
return nil, err
}
if len(a.DNSProvider) > 0 {
log.Debugf("Using DNS Challenge provider: %s", a.DNSProvider)
err = dnsOverrideDelay(a.DelayDontCheckDNS)
if err != nil {
return nil, err
}
var provider acme.ChallengeProvider
provider, err = dns.NewDNSChallengeProviderByName(a.DNSProvider)
if err != nil {
return nil, err
}
client.ExcludeChallenges([]acme.Challenge{acme.HTTP01, acme.TLSSNI01})
err = client.SetChallengeProvider(acme.DNS01, provider)
} else {
client.ExcludeChallenges([]acme.Challenge{acme.HTTP01, acme.DNS01})
err = client.SetChallengeProvider(acme.TLSSNI01, a.challengeProvider)
}
if err != nil {
return nil, err
}
return client, nil
}
func (a *ACME) loadCertificateOnDemand(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) {
domain := types.CanonicalDomain(clientHello.ServerName)
account := a.store.Get().(*Account)
if certificateResource, ok := account.DomainsCertificate.getCertificateForDomain(domain); ok {
return certificateResource.tlsCert, nil
}
certificate, err := a.getDomainsCertificates([]string{domain})
if err != nil {
return nil, err
}
log.Debugf("Got certificate on demand for domain %s", domain)
transaction, object, err := a.store.Begin()
if err != nil {
return nil, err
}
account = object.(*Account)
cert, err := account.DomainsCertificate.addCertificateForDomains(certificate, Domain{Main: domain})
if err != nil {
return nil, err
}
if err = transaction.Commit(account); err != nil {
return nil, err
}
return cert.tlsCert, nil
}
// LoadCertificateForDomains loads certificates from ACME for given domains
func (a *ACME) LoadCertificateForDomains(domains []string) {
a.jobs.In() <- func() {
log.Debugf("LoadCertificateForDomains %v...", domains)
if len(domains) == 0 {
// no domain
return
}
domains = fun.Map(types.CanonicalDomain, domains).([]string)
// Check provided certificates
if a.getProvidedCertificate(domains) != nil {
return
}
operation := func() error {
if a.client == nil {
return fmt.Errorf("ACME client still not built")
}
return nil
}
notify := func(err error, time time.Duration) {
log.Errorf("Error getting ACME client: %v, retrying in %s", err, time)
}
ebo := backoff.NewExponentialBackOff()
ebo.MaxElapsedTime = 30 * time.Second
err := backoff.RetryNotify(safe.OperationWithRecover(operation), ebo, notify)
if err != nil {
log.Errorf("Error getting ACME client: %v", err)
return
}
account := a.store.Get().(*Account)
var domain Domain
if len(domains) > 1 {
domain = Domain{Main: domains[0], SANs: domains[1:]}
} else {
domain = Domain{Main: domains[0]}
}
if _, exists := account.DomainsCertificate.exists(domain); exists {
// domain already exists
return
}
certificate, err := a.getDomainsCertificates(domains)
if err != nil {
log.Errorf("Error getting ACME certificates %+v : %v", domains, err)
return
}
log.Debugf("Got certificate for domains %+v", domains)
transaction, object, err := a.store.Begin()
if err != nil {
log.Errorf("Error creating transaction %+v : %v", domains, err)
return
}
account = object.(*Account)
_, err = account.DomainsCertificate.addCertificateForDomains(certificate, domain)
if err != nil {
log.Errorf("Error adding ACME certificates %+v : %v", domains, err)
return
}
if err = transaction.Commit(account); err != nil {
log.Errorf("Error Saving ACME account %+v: %v", account, err)
return
}
}
}
// Get provided certificate which check a domains list (Main and SANs)
func (a *ACME) getProvidedCertificate(domains []string) *tls.Certificate {
// Use regex to test for provided certs that might have been added into TLSConfig
providedCertMatch := false
log.Debugf("Look for provided certificate to validate %s...", domains)
for k := range a.TLSConfig.NameToCertificate {
selector := "^" + strings.Replace(k, "*.", "[^\\.]*\\.?", -1) + "$"
for _, domainToCheck := range domains {
providedCertMatch, _ = regexp.MatchString(selector, domainToCheck)
if !providedCertMatch {
break
}
}
if providedCertMatch {
log.Debugf("Got provided certificate for domains %s", domains)
return a.TLSConfig.NameToCertificate[k]
}
}
log.Debugf("No provided certificate found for domains %s, get ACME certificate.", domains)
return nil
}
func (a *ACME) getDomainsCertificates(domains []string) (*Certificate, error) {
domains = fun.Map(types.CanonicalDomain, domains).([]string)
log.Debugf("Loading ACME certificates %s...", domains)
bundle := true
certificate, failures := a.client.ObtainCertificate(domains, bundle, nil, OSCPMustStaple)
if len(failures) > 0 {
log.Error(failures)
return nil, fmt.Errorf("Cannot obtain certificates %s+v", failures)
}
log.Debugf("Loaded ACME certificates %s", domains)
return &Certificate{
Domain: certificate.Domain,
CertURL: certificate.CertURL,
CertStableURL: certificate.CertStableURL,
PrivateKey: certificate.PrivateKey,
Certificate: certificate.Certificate,
}, nil
}
func (a *ACME) runJobs() {
safe.Go(func() {
for job := range a.jobs.Out() {
function := job.(func())
function()
}
})
}

View File

@ -1,296 +0,0 @@
package acme
import (
"crypto/tls"
"encoding/base64"
"net/http"
"net/http/httptest"
"reflect"
"sync"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/xenolf/lego/acme"
)
func TestDomainsSet(t *testing.T) {
checkMap := map[string]Domains{
"": {},
"foo.com": {Domain{Main: "foo.com", SANs: []string{}}},
"foo.com,bar.net": {Domain{Main: "foo.com", SANs: []string{"bar.net"}}},
"foo.com,bar1.net,bar2.net,bar3.net": {Domain{Main: "foo.com", SANs: []string{"bar1.net", "bar2.net", "bar3.net"}}},
}
for in, check := range checkMap {
ds := Domains{}
ds.Set(in)
if !reflect.DeepEqual(check, ds) {
t.Errorf("Expected %+v\nGot %+v", check, ds)
}
}
}
func TestDomainsSetAppend(t *testing.T) {
inSlice := []string{
"",
"foo1.com",
"foo2.com,bar.net",
"foo3.com,bar1.net,bar2.net,bar3.net",
}
checkSlice := []Domains{
{},
{
Domain{
Main: "foo1.com",
SANs: []string{}}},
{
Domain{
Main: "foo1.com",
SANs: []string{}},
Domain{
Main: "foo2.com",
SANs: []string{"bar.net"}}},
{
Domain{
Main: "foo1.com",
SANs: []string{}},
Domain{
Main: "foo2.com",
SANs: []string{"bar.net"}},
Domain{Main: "foo3.com",
SANs: []string{"bar1.net", "bar2.net", "bar3.net"}}},
}
ds := Domains{}
for i, in := range inSlice {
ds.Set(in)
if !reflect.DeepEqual(checkSlice[i], ds) {
t.Errorf("Expected %s %+v\nGot %+v", in, checkSlice[i], ds)
}
}
}
func TestCertificatesRenew(t *testing.T) {
foo1Cert, foo1Key, _ := generateKeyPair("foo1.com", time.Now())
foo2Cert, foo2Key, _ := generateKeyPair("foo2.com", time.Now())
domainsCertificates := DomainsCertificates{
lock: sync.RWMutex{},
Certs: []*DomainsCertificate{
{
Domains: Domain{
Main: "foo1.com",
SANs: []string{}},
Certificate: &Certificate{
Domain: "foo1.com",
CertURL: "url",
CertStableURL: "url",
PrivateKey: foo1Key,
Certificate: foo1Cert,
},
},
{
Domains: Domain{
Main: "foo2.com",
SANs: []string{}},
Certificate: &Certificate{
Domain: "foo2.com",
CertURL: "url",
CertStableURL: "url",
PrivateKey: foo2Key,
Certificate: foo2Cert,
},
},
},
}
foo1Cert, foo1Key, _ = generateKeyPair("foo1.com", time.Now())
newCertificate := &Certificate{
Domain: "foo1.com",
CertURL: "url",
CertStableURL: "url",
PrivateKey: foo1Key,
Certificate: foo1Cert,
}
err := domainsCertificates.renewCertificates(
newCertificate,
Domain{
Main: "foo1.com",
SANs: []string{}})
if err != nil {
t.Errorf("Error in renewCertificates :%v", err)
}
if len(domainsCertificates.Certs) != 2 {
t.Errorf("Expected domainsCertificates length %d %+v\nGot %+v", 2, domainsCertificates.Certs, len(domainsCertificates.Certs))
}
if !reflect.DeepEqual(domainsCertificates.Certs[0].Certificate, newCertificate) {
t.Errorf("Expected new certificate %+v \nGot %+v", newCertificate, domainsCertificates.Certs[0].Certificate)
}
}
func TestRemoveDuplicates(t *testing.T) {
now := time.Now()
fooCert, fooKey, _ := generateKeyPair("foo.com", now)
foo24Cert, foo24Key, _ := generateKeyPair("foo.com", now.Add(24*time.Hour))
foo48Cert, foo48Key, _ := generateKeyPair("foo.com", now.Add(48*time.Hour))
barCert, barKey, _ := generateKeyPair("bar.com", now)
domainsCertificates := DomainsCertificates{
lock: sync.RWMutex{},
Certs: []*DomainsCertificate{
{
Domains: Domain{
Main: "foo.com",
SANs: []string{}},
Certificate: &Certificate{
Domain: "foo.com",
CertURL: "url",
CertStableURL: "url",
PrivateKey: foo24Key,
Certificate: foo24Cert,
},
},
{
Domains: Domain{
Main: "foo.com",
SANs: []string{}},
Certificate: &Certificate{
Domain: "foo.com",
CertURL: "url",
CertStableURL: "url",
PrivateKey: foo48Key,
Certificate: foo48Cert,
},
},
{
Domains: Domain{
Main: "foo.com",
SANs: []string{}},
Certificate: &Certificate{
Domain: "foo.com",
CertURL: "url",
CertStableURL: "url",
PrivateKey: fooKey,
Certificate: fooCert,
},
},
{
Domains: Domain{
Main: "bar.com",
SANs: []string{}},
Certificate: &Certificate{
Domain: "bar.com",
CertURL: "url",
CertStableURL: "url",
PrivateKey: barKey,
Certificate: barCert,
},
},
{
Domains: Domain{
Main: "foo.com",
SANs: []string{}},
Certificate: &Certificate{
Domain: "foo.com",
CertURL: "url",
CertStableURL: "url",
PrivateKey: foo48Key,
Certificate: foo48Cert,
},
},
},
}
domainsCertificates.Init()
if len(domainsCertificates.Certs) != 2 {
t.Errorf("Expected domainsCertificates length %d %+v\nGot %+v", 2, domainsCertificates.Certs, len(domainsCertificates.Certs))
}
for _, cert := range domainsCertificates.Certs {
switch cert.Domains.Main {
case "bar.com":
continue
case "foo.com":
if !cert.tlsCert.Leaf.NotAfter.Equal(now.Add(48 * time.Hour).Truncate(1 * time.Second)) {
t.Errorf("Bad expiration %s date for domain %+v, now %s", cert.tlsCert.Leaf.NotAfter.String(), cert, now.Add(48*time.Hour).Truncate(1*time.Second).String())
}
default:
t.Errorf("Unknown domain %+v", cert)
}
}
}
func TestNoPreCheckOverride(t *testing.T) {
acme.PreCheckDNS = nil // Irreversable - but not expecting real calls into this during testing process
err := dnsOverrideDelay(0)
if err != nil {
t.Errorf("Error in dnsOverrideDelay :%v", err)
}
if acme.PreCheckDNS != nil {
t.Errorf("Unexpected change to acme.PreCheckDNS when leaving DNS verification as is.")
}
}
func TestSillyPreCheckOverride(t *testing.T) {
err := dnsOverrideDelay(-5)
if err == nil {
t.Errorf("Missing expected error in dnsOverrideDelay!")
}
}
func TestPreCheckOverride(t *testing.T) {
acme.PreCheckDNS = nil // Irreversable - but not expecting real calls into this during testing process
err := dnsOverrideDelay(5)
if err != nil {
t.Errorf("Error in dnsOverrideDelay :%v", err)
}
if acme.PreCheckDNS == nil {
t.Errorf("No change to acme.PreCheckDNS when meant to be adding enforcing override function.")
}
}
func TestAcmeClientCreation(t *testing.T) {
acme.PreCheckDNS = nil // Irreversable - but not expecting real calls into this during testing process
// Lengthy setup to avoid external web requests - oh for easier golang testing!
account := &Account{Email: "f@f"}
account.PrivateKey, _ = base64.StdEncoding.DecodeString(`
MIIBPAIBAAJBAMp2Ni92FfEur+CAvFkgC12LT4l9D53ApbBpDaXaJkzzks+KsLw9zyAxvlrfAyTCQ
7tDnEnIltAXyQ0uOFUUdcMCAwEAAQJAK1FbipATZcT9cGVa5x7KD7usytftLW14heQUPXYNV80r/3
lmnpvjL06dffRpwkYeN8DATQF/QOcy3NNNGDw/4QIhAPAKmiZFxA/qmRXsuU8Zhlzf16WrNZ68K64
asn/h3qZrAiEA1+wFR3WXCPIolOvd7AHjfgcTKQNkoMPywU4FYUNQ1AkCIQDv8yk0qPjckD6HVCPJ
llJh9MC0svjevGtNlxJoE3lmEQIhAKXy1wfZ32/XtcrnENPvi6lzxI0T94X7s5pP3aCoPPoJAiEAl
cijFkALeQp/qyeXdFld2v9gUN3eCgljgcl0QweRoIc=---`)
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`{
"new-authz": "https://foo/acme/new-authz",
"new-cert": "https://foo/acme/new-cert",
"new-reg": "https://foo/acme/new-reg",
"revoke-cert": "https://foo/acme/revoke-cert"
}`))
}))
defer ts.Close()
a := ACME{DNSProvider: "manual", DelayDontCheckDNS: 10, CAServer: ts.URL}
client, err := a.buildACMEClient(account)
if err != nil {
t.Errorf("Error in buildACMEClient: %v", err)
}
if client == nil {
t.Errorf("No client from buildACMEClient!")
}
if acme.PreCheckDNS == nil {
t.Errorf("No change to acme.PreCheckDNS when meant to be adding enforcing override function.")
}
}
func TestAcme_getProvidedCertificate(t *testing.T) {
mm := make(map[string]*tls.Certificate)
mm["*.containo.us"] = &tls.Certificate{}
mm["traefik.acme.io"] = &tls.Certificate{}
a := ACME{TLSConfig: &tls.Config{NameToCertificate: mm}}
domains := []string{"traefik.containo.us", "trae.containo.us"}
certificate := a.getProvidedCertificate(domains)
assert.NotNil(t, certificate)
domains = []string{"traefik.acme.io", "trae.acme.io"}
certificate = a.getProvidedCertificate(domains)
assert.Nil(t, certificate)
}

View File

@ -1,97 +0,0 @@
package acme
import (
"crypto/tls"
"fmt"
"strings"
"sync"
"time"
"github.com/cenk/backoff"
"github.com/containous/traefik/cluster"
"github.com/containous/traefik/log"
"github.com/containous/traefik/safe"
"github.com/xenolf/lego/acme"
)
var _ acme.ChallengeProviderTimeout = (*challengeProvider)(nil)
type challengeProvider struct {
store cluster.Store
lock sync.RWMutex
}
func (c *challengeProvider) getCertificate(domain string) (cert *tls.Certificate, exists bool) {
log.Debugf("Challenge GetCertificate %s", domain)
if !strings.HasSuffix(domain, ".acme.invalid") {
return nil, false
}
c.lock.RLock()
defer c.lock.RUnlock()
account := c.store.Get().(*Account)
if account.ChallengeCerts == nil {
return nil, false
}
account.Init()
var result *tls.Certificate
operation := func() error {
for _, cert := range account.ChallengeCerts {
for _, dns := range cert.certificate.Leaf.DNSNames {
if domain == dns {
result = cert.certificate
return nil
}
}
}
return fmt.Errorf("Cannot find challenge cert for domain %s", domain)
}
notify := func(err error, time time.Duration) {
log.Errorf("Error getting cert: %v, retrying in %s", err, time)
}
ebo := backoff.NewExponentialBackOff()
ebo.MaxElapsedTime = 60 * time.Second
err := backoff.RetryNotify(safe.OperationWithRecover(operation), ebo, notify)
if err != nil {
log.Errorf("Error getting cert: %v", err)
return nil, false
}
return result, true
}
func (c *challengeProvider) Present(domain, token, keyAuth string) error {
log.Debugf("Challenge Present %s", domain)
cert, _, err := TLSSNI01ChallengeCert(keyAuth)
if err != nil {
return err
}
c.lock.Lock()
defer c.lock.Unlock()
transaction, object, err := c.store.Begin()
if err != nil {
return err
}
account := object.(*Account)
if account.ChallengeCerts == nil {
account.ChallengeCerts = map[string]*ChallengeCert{}
}
account.ChallengeCerts[domain] = &cert
return transaction.Commit(account)
}
func (c *challengeProvider) CleanUp(domain, token, keyAuth string) error {
log.Debugf("Challenge CleanUp %s", domain)
c.lock.Lock()
defer c.lock.Unlock()
transaction, object, err := c.store.Begin()
if err != nil {
return err
}
account := object.(*Account)
delete(account.ChallengeCerts, domain)
return transaction.Commit(account)
}
func (c *challengeProvider) Timeout() (timeout, interval time.Duration) {
return 60 * time.Second, 5 * time.Second
}

View File

@ -1,135 +0,0 @@
package acme
import (
"crypto"
"crypto/ecdsa"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto/tls"
"crypto/x509"
"crypto/x509/pkix"
"encoding/hex"
"encoding/pem"
"fmt"
"math/big"
"time"
)
func generateDefaultCertificate() (*tls.Certificate, error) {
randomBytes := make([]byte, 100)
_, err := rand.Read(randomBytes)
if err != nil {
return nil, err
}
zBytes := sha256.Sum256(randomBytes)
z := hex.EncodeToString(zBytes[:sha256.Size])
domain := fmt.Sprintf("%s.%s.traefik.default", z[:32], z[32:])
certPEM, keyPEM, err := generateKeyPair(domain, time.Time{})
if err != nil {
return nil, err
}
certificate, err := tls.X509KeyPair(certPEM, keyPEM)
if err != nil {
return nil, err
}
return &certificate, nil
}
func generateKeyPair(domain string, expiration time.Time) ([]byte, []byte, error) {
rsaPrivKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
return nil, nil, err
}
keyPEM := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(rsaPrivKey)})
certPEM, err := generatePemCert(rsaPrivKey, domain, expiration)
if err != nil {
return nil, nil, err
}
return certPEM, keyPEM, nil
}
func generatePemCert(privKey *rsa.PrivateKey, domain string, expiration time.Time) ([]byte, error) {
derBytes, err := generateDerCert(privKey, expiration, domain)
if err != nil {
return nil, err
}
return pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derBytes}), nil
}
func generateDerCert(privKey *rsa.PrivateKey, expiration time.Time, domain string) ([]byte, error) {
serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
if err != nil {
return nil, err
}
if expiration.IsZero() {
expiration = time.Now().Add(365)
}
template := x509.Certificate{
SerialNumber: serialNumber,
Subject: pkix.Name{
CommonName: "TRAEFIK DEFAULT CERT",
},
NotBefore: time.Now(),
NotAfter: expiration,
KeyUsage: x509.KeyUsageKeyEncipherment,
BasicConstraintsValid: true,
DNSNames: []string{domain},
}
return x509.CreateCertificate(rand.Reader, &template, &template, &privKey.PublicKey, privKey)
}
// TLSSNI01ChallengeCert returns a certificate and target domain for the `tls-sni-01` challenge
func TLSSNI01ChallengeCert(keyAuth string) (ChallengeCert, string, error) {
// generate a new RSA key for the certificates
var tempPrivKey crypto.PrivateKey
tempPrivKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
return ChallengeCert{}, "", err
}
rsaPrivKey := tempPrivKey.(*rsa.PrivateKey)
rsaPrivPEM := pemEncode(rsaPrivKey)
zBytes := sha256.Sum256([]byte(keyAuth))
z := hex.EncodeToString(zBytes[:sha256.Size])
domain := fmt.Sprintf("%s.%s.acme.invalid", z[:32], z[32:])
tempCertPEM, err := generatePemCert(rsaPrivKey, domain, time.Time{})
if err != nil {
return ChallengeCert{}, "", err
}
certificate, err := tls.X509KeyPair(tempCertPEM, rsaPrivPEM)
if err != nil {
return ChallengeCert{}, "", err
}
return ChallengeCert{Certificate: tempCertPEM, PrivateKey: rsaPrivPEM, certificate: &certificate}, domain, nil
}
func pemEncode(data interface{}) []byte {
var pemBlock *pem.Block
switch key := data.(type) {
case *ecdsa.PrivateKey:
keyBytes, _ := x509.MarshalECPrivateKey(key)
pemBlock = &pem.Block{Type: "EC PRIVATE KEY", Bytes: keyBytes}
case *rsa.PrivateKey:
pemBlock = &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)}
break
case *x509.CertificateRequest:
pemBlock = &pem.Block{Type: "CERTIFICATE REQUEST", Bytes: key.Raw}
break
case []byte:
pemBlock = &pem.Block{Type: "CERTIFICATE", Bytes: []byte(data.([]byte))}
}
return pem.EncodeToMemory(pemBlock)
}

View File

@ -1,97 +0,0 @@
package acme
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"sync"
"github.com/containous/traefik/cluster"
"github.com/containous/traefik/log"
)
var _ cluster.Store = (*LocalStore)(nil)
// LocalStore is a store using a file as storage
type LocalStore struct {
file string
storageLock sync.RWMutex
account *Account
}
// NewLocalStore create a LocalStore
func NewLocalStore(file string) *LocalStore {
return &LocalStore{
file: file,
}
}
// Get atomically a struct from the file storage
func (s *LocalStore) Get() cluster.Object {
s.storageLock.RLock()
defer s.storageLock.RUnlock()
return s.account
}
// Load loads file into store
func (s *LocalStore) Load() (cluster.Object, error) {
s.storageLock.Lock()
defer s.storageLock.Unlock()
account := &Account{}
err := checkPermissions(s.file)
if err != nil {
return nil, err
}
f, err := os.Open(s.file)
if err != nil {
return nil, err
}
defer f.Close()
file, err := ioutil.ReadAll(f)
if err != nil {
return nil, err
}
if err := json.Unmarshal(file, &account); err != nil {
return nil, err
}
account.Init()
s.account = account
log.Infof("Loaded ACME config from store %s", s.file)
return account, nil
}
// Begin creates a transaction with the KV store.
func (s *LocalStore) Begin() (cluster.Transaction, cluster.Object, error) {
s.storageLock.Lock()
return &localTransaction{LocalStore: s}, s.account, nil
}
var _ cluster.Transaction = (*localTransaction)(nil)
type localTransaction struct {
*LocalStore
dirty bool
}
// Commit allows to set an object in the file storage
func (t *localTransaction) Commit(object cluster.Object) error {
t.LocalStore.account = object.(*Account)
defer t.storageLock.Unlock()
if t.dirty {
return fmt.Errorf("transaction already used, please begin a new one")
}
// write account to file
data, err := json.MarshalIndent(object, "", " ")
if err != nil {
return err
}
err = ioutil.WriteFile(t.file, data, 0600)
if err != nil {
return err
}
t.dirty = true
return nil
}

View File

@ -1,25 +0,0 @@
// +build !windows
package acme
import (
"fmt"
"os"
)
// Check file permissions
func checkPermissions(name string) error {
f, err := os.Open(name)
if err != nil {
return err
}
defer f.Close()
fi, err := f.Stat()
if err != nil {
return err
}
if fi.Mode().Perm()&0077 != 0 {
return fmt.Errorf("permissions %o for %s are too open, please use 600", fi.Mode().Perm(), name)
}
return nil
}

View File

@ -1,6 +0,0 @@
package acme
// Do not check file permissions on Windows right now
func checkPermissions(name string) error {
return nil
}

View File

@ -1,35 +1,37 @@
FROM golang:1.8
FROM golang:1.13-alpine
# Install a more recent version of mercurial to avoid mismatching results
# between glide run on a decently updated host system and the build container.
RUN awk '$1 ~ "^deb" { $3 = $3 "-backports"; print; exit }' /etc/apt/sources.list > /etc/apt/sources.list.d/backports.list && \
DEBIAN_FRONTEND=noninteractive apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -t jessie-backports --yes --no-install-recommends mercurial=3.9.1-1~bpo8+1 && \
rm -fr /var/lib/apt/lists/
RUN go get github.com/jteeuwen/go-bindata/... \
&& go get github.com/golang/lint/golint \
&& go get github.com/kisielk/errcheck \
&& go get github.com/client9/misspell/cmd/misspell \
&& go get github.com/mattfarina/glide-hash \
&& go get github.com/sgotti/glide-vc
RUN apk --update upgrade \
&& apk --no-cache --no-progress add git mercurial bash gcc musl-dev curl tar ca-certificates tzdata \
&& update-ca-certificates \
&& rm -rf /var/cache/apk/*
# Which docker version to test on
ARG DOCKER_VERSION=17.03.1
# Which glide version to test on
ARG GLIDE_VERSION=v0.12.3
# Download glide
RUN mkdir -p /usr/local/bin \
&& curl -fL https://github.com/Masterminds/glide/releases/download/${GLIDE_VERSION}/glide-${GLIDE_VERSION}-linux-amd64.tar.gz \
| tar -xzC /usr/local/bin --transform 's#^.+/##x'
ARG DOCKER_VERSION=18.09.7
# Download docker
RUN mkdir -p /usr/local/bin \
&& curl -fL https://get.docker.com/builds/Linux/x86_64/docker-${DOCKER_VERSION}-ce.tgz \
&& curl -fL https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz \
| tar -xzC /usr/local/bin --transform 's#^.+/##x'
# Download go-bindata binary to bin folder in $GOPATH
RUN mkdir -p /usr/local/bin \
&& curl -fsSL -o /usr/local/bin/go-bindata https://github.com/containous/go-bindata/releases/download/v1.0.0/go-bindata \
&& chmod +x /usr/local/bin/go-bindata
# Download golangci-lint binary to bin folder in $GOPATH
RUN curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s -- -b $GOPATH/bin v1.20.0
# Download golangci-lint and misspell binary to bin folder in $GOPATH
RUN GO111MODULE=off go get github.com/client9/misspell/cmd/misspell
# Download goreleaser binary to bin folder in $GOPATH
RUN curl -sfL https://install.goreleaser.com/github.com/goreleaser/goreleaser.sh | sh
WORKDIR /go/src/github.com/containous/traefik
# Download go modules
COPY go.mod .
COPY go.sum .
RUN GO111MODULE=on GOPROXY=https://proxy.golang.org go mod download
COPY . /go/src/github.com/containous/traefik

View File

@ -1,255 +0,0 @@
package cluster
import (
"context"
"encoding/json"
"fmt"
"sync"
"time"
"github.com/cenk/backoff"
"github.com/containous/staert"
"github.com/containous/traefik/job"
"github.com/containous/traefik/log"
"github.com/containous/traefik/safe"
"github.com/docker/libkv/store"
"github.com/satori/go.uuid"
)
// Metadata stores Object plus metadata
type Metadata struct {
object Object
Object []byte
Lock string
}
// NewMetadata returns new Metadata
func NewMetadata(object Object) *Metadata {
return &Metadata{object: object}
}
// Marshall marshalls object
func (m *Metadata) Marshall() error {
var err error
m.Object, err = json.Marshal(m.object)
return err
}
func (m *Metadata) unmarshall() error {
if len(m.Object) == 0 {
return nil
}
return json.Unmarshal(m.Object, m.object)
}
// Listener is called when Object has been changed in KV store
type Listener func(Object) error
var _ Store = (*Datastore)(nil)
// Datastore holds a struct synced in a KV store
type Datastore struct {
kv staert.KvSource
ctx context.Context
localLock *sync.RWMutex
meta *Metadata
lockKey string
listener Listener
}
// NewDataStore creates a Datastore
func NewDataStore(ctx context.Context, kvSource staert.KvSource, object Object, listener Listener) (*Datastore, error) {
datastore := Datastore{
kv: kvSource,
ctx: ctx,
meta: &Metadata{object: object},
lockKey: kvSource.Prefix + "/lock",
localLock: &sync.RWMutex{},
listener: listener,
}
err := datastore.watchChanges()
if err != nil {
return nil, err
}
return &datastore, nil
}
func (d *Datastore) watchChanges() error {
stopCh := make(chan struct{})
kvCh, err := d.kv.Watch(d.lockKey, stopCh)
if err != nil {
return err
}
go func() {
ctx, cancel := context.WithCancel(d.ctx)
operation := func() error {
for {
select {
case <-ctx.Done():
stopCh <- struct{}{}
return nil
case _, ok := <-kvCh:
if !ok {
cancel()
return err
}
err = d.reload()
if err != nil {
return err
}
// log.Debugf("Datastore object change received: %+v", d.meta)
if d.listener != nil {
err := d.listener(d.meta.object)
if err != nil {
log.Errorf("Error calling datastore listener: %s", err)
}
}
}
}
}
notify := func(err error, time time.Duration) {
log.Errorf("Error in watch datastore: %+v, retrying in %s", err, time)
}
err := backoff.RetryNotify(safe.OperationWithRecover(operation), job.NewBackOff(backoff.NewExponentialBackOff()), notify)
if err != nil {
log.Errorf("Error in watch datastore: %v", err)
}
}()
return nil
}
func (d *Datastore) reload() error {
log.Debugf("Datastore reload")
d.localLock.Lock()
err := d.kv.LoadConfig(d.meta)
if err != nil {
d.localLock.Unlock()
return err
}
err = d.meta.unmarshall()
if err != nil {
d.localLock.Unlock()
return err
}
d.localLock.Unlock()
return nil
}
// Begin creates a transaction with the KV store.
func (d *Datastore) Begin() (Transaction, Object, error) {
id := uuid.NewV4().String()
log.Debugf("Transaction %s begins", id)
remoteLock, err := d.kv.NewLock(d.lockKey, &store.LockOptions{TTL: 20 * time.Second, Value: []byte(id)})
if err != nil {
return nil, nil, err
}
stopCh := make(chan struct{})
ctx, cancel := context.WithCancel(d.ctx)
var errLock error
go func() {
_, errLock = remoteLock.Lock(stopCh)
cancel()
}()
select {
case <-ctx.Done():
if errLock != nil {
return nil, nil, errLock
}
case <-d.ctx.Done():
stopCh <- struct{}{}
return nil, nil, d.ctx.Err()
}
// we got the lock! Now make sure we are synced with KV store
operation := func() error {
meta := d.get()
if meta.Lock != id {
return fmt.Errorf("Object lock value: expected %s, got %s", id, meta.Lock)
}
return nil
}
notify := func(err error, time time.Duration) {
log.Errorf("Datastore sync error: %v, retrying in %s", err, time)
err = d.reload()
if err != nil {
log.Errorf("Error reloading: %+v", err)
}
}
ebo := backoff.NewExponentialBackOff()
ebo.MaxElapsedTime = 60 * time.Second
err = backoff.RetryNotify(safe.OperationWithRecover(operation), ebo, notify)
if err != nil {
return nil, nil, fmt.Errorf("Datastore cannot sync: %v", err)
}
// we synced with KV store, we can now return Setter
return &datastoreTransaction{
Datastore: d,
remoteLock: remoteLock,
id: id,
}, d.meta.object, nil
}
func (d *Datastore) get() *Metadata {
d.localLock.RLock()
defer d.localLock.RUnlock()
return d.meta
}
// Load load atomically a struct from the KV store
func (d *Datastore) Load() (Object, error) {
d.localLock.Lock()
defer d.localLock.Unlock()
err := d.kv.LoadConfig(d.meta)
if err != nil {
return nil, err
}
err = d.meta.unmarshall()
if err != nil {
return nil, err
}
return d.meta.object, nil
}
// Get atomically a struct from the KV store
func (d *Datastore) Get() Object {
d.localLock.RLock()
defer d.localLock.RUnlock()
return d.meta.object
}
var _ Transaction = (*datastoreTransaction)(nil)
type datastoreTransaction struct {
*Datastore
remoteLock store.Locker
dirty bool
id string
}
// Commit allows to set an object in the KV store
func (s *datastoreTransaction) Commit(object Object) error {
s.localLock.Lock()
defer s.localLock.Unlock()
if s.dirty {
return fmt.Errorf("Transaction already used, please begin a new one")
}
s.Datastore.meta.object = object
err := s.Datastore.meta.Marshall()
if err != nil {
return fmt.Errorf("Marshall error: %s", err)
}
err = s.kv.StoreConfig(s.Datastore.meta)
if err != nil {
return fmt.Errorf("StoreConfig error: %s", err)
}
err = s.remoteLock.Unlock()
if err != nil {
return fmt.Errorf("Unlock error: %s", err)
}
s.dirty = true
log.Debugf("Transaction committed %s", s.id)
return nil
}

View File

@ -1,104 +0,0 @@
package cluster
import (
"context"
"time"
"github.com/cenk/backoff"
"github.com/containous/traefik/log"
"github.com/containous/traefik/safe"
"github.com/containous/traefik/types"
"github.com/docker/leadership"
)
// Leadership allows leadership election using a KV store
type Leadership struct {
*safe.Pool
*types.Cluster
candidate *leadership.Candidate
leader *safe.Safe
listeners []LeaderListener
}
// NewLeadership creates a leadership
func NewLeadership(ctx context.Context, cluster *types.Cluster) *Leadership {
return &Leadership{
Pool: safe.NewPool(ctx),
Cluster: cluster,
candidate: leadership.NewCandidate(cluster.Store, cluster.Store.Prefix+"/leader", cluster.Node, 20*time.Second),
listeners: []LeaderListener{},
leader: safe.New(false),
}
}
// LeaderListener is called when leadership has changed
type LeaderListener func(elected bool) error
// Participate tries to be a leader
func (l *Leadership) Participate(pool *safe.Pool) {
pool.GoCtx(func(ctx context.Context) {
log.Debugf("Node %s running for election", l.Cluster.Node)
defer log.Debugf("Node %s no more running for election", l.Cluster.Node)
backOff := backoff.NewExponentialBackOff()
operation := func() error {
return l.run(ctx, l.candidate)
}
notify := func(err error, time time.Duration) {
log.Errorf("Leadership election error %+v, retrying in %s", err, time)
}
err := backoff.RetryNotify(safe.OperationWithRecover(operation), backOff, notify)
if err != nil {
log.Errorf("Cannot elect leadership %+v", err)
}
})
}
// AddListener adds a leadership listerner
func (l *Leadership) AddListener(listener LeaderListener) {
l.listeners = append(l.listeners, listener)
}
// Resign resigns from being a leader
func (l *Leadership) Resign() {
l.candidate.Resign()
log.Infof("Node %s resigned", l.Cluster.Node)
}
func (l *Leadership) run(ctx context.Context, candidate *leadership.Candidate) error {
electedCh, errCh := candidate.RunForElection()
for {
select {
case elected := <-electedCh:
l.onElection(elected)
case err := <-errCh:
return err
case <-ctx.Done():
l.candidate.Resign()
return nil
}
}
}
func (l *Leadership) onElection(elected bool) {
if elected {
log.Infof("Node %s elected leader ♚", l.Cluster.Node)
l.leader.Set(true)
l.Start()
} else {
log.Infof("Node %s elected slave ♝", l.Cluster.Node)
l.leader.Set(false)
l.Stop()
}
for _, listener := range l.listeners {
err := listener(elected)
if err != nil {
log.Errorf("Error calling Leadership listener: %s", err)
}
}
}
// IsLeader returns true if current node is leader
func (l *Leadership) IsLeader() bool {
return l.leader.Get().(bool)
}

View File

@ -1,16 +0,0 @@
package cluster
// Object is the struct to store
type Object interface{}
// Store is a generic interface to represents a storage
type Store interface {
Load() (Object, error)
Get() Object
Begin() (Transaction, Object, error)
}
// Transaction allows to set a struct in the KV store
type Transaction interface {
Commit(object Object) error
}

34
cmd/configuration.go Normal file
View File

@ -0,0 +1,34 @@
package cmd
import (
"time"
"github.com/containous/traefik/v2/pkg/config/static"
"github.com/containous/traefik/v2/pkg/types"
)
// TraefikCmdConfiguration wraps the static configuration and extra parameters.
type TraefikCmdConfiguration struct {
static.Configuration `export:"true"`
// ConfigFile is the path to the configuration file.
ConfigFile string `description:"Configuration file to use. If specified all other flags are ignored." export:"true"`
}
// NewTraefikConfiguration creates a TraefikCmdConfiguration with default values.
func NewTraefikConfiguration() *TraefikCmdConfiguration {
return &TraefikCmdConfiguration{
Configuration: static.Configuration{
Global: &static.Global{
CheckNewVersion: true,
},
EntryPoints: make(static.EntryPoints),
Providers: &static.Providers{
ProvidersThrottleDuration: types.Duration(2 * time.Second),
},
ServersTransport: &static.ServersTransport{
MaxIdleConnsPerHost: 200,
},
},
ConfigFile: "",
}
}

22
cmd/context.go Normal file
View File

@ -0,0 +1,22 @@
package cmd
import (
"context"
"os"
"os/signal"
"syscall"
)
// ContextWithSignal creates a context canceled when SIGINT or SIGTERM are notified
func ContextWithSignal(ctx context.Context) context.Context {
newCtx, cancel := context.WithCancel(ctx)
signals := make(chan os.Signal)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
go func() {
select {
case <-signals:
cancel()
}
}()
return newCtx
}

View File

@ -0,0 +1,79 @@
package healthcheck
import (
"errors"
"fmt"
"net/http"
"os"
"time"
"github.com/containous/traefik/v2/pkg/cli"
"github.com/containous/traefik/v2/pkg/config/static"
)
// NewCmd builds a new HealthCheck command.
func NewCmd(traefikConfiguration *static.Configuration, loaders []cli.ResourceLoader) *cli.Command {
return &cli.Command{
Name: "healthcheck",
Description: `Calls Traefik /ping endpoint (disabled by default) to check the health of Traefik.`,
Configuration: traefikConfiguration,
Run: runCmd(traefikConfiguration),
Resources: loaders,
}
}
func runCmd(traefikConfiguration *static.Configuration) func(_ []string) error {
return func(_ []string) error {
traefikConfiguration.SetEffectiveConfiguration()
resp, errPing := Do(*traefikConfiguration)
if resp != nil {
resp.Body.Close()
}
if errPing != nil {
fmt.Printf("Error calling healthcheck: %s\n", errPing)
os.Exit(1)
}
if resp.StatusCode != http.StatusOK {
fmt.Printf("Bad healthcheck status: %s\n", resp.Status)
os.Exit(1)
}
fmt.Printf("OK: %s\n", resp.Request.URL)
os.Exit(0)
return nil
}
}
// Do try to do a healthcheck
func Do(staticConfiguration static.Configuration) (*http.Response, error) {
if staticConfiguration.Ping == nil {
return nil, errors.New("please enable `ping` to use health check")
}
ep := staticConfiguration.Ping.EntryPoint
if ep == "" {
ep = "traefik"
}
pingEntryPoint, ok := staticConfiguration.EntryPoints[ep]
if !ok {
return nil, fmt.Errorf("ping: missing %s entry point", ep)
}
client := &http.Client{Timeout: 5 * time.Second}
protocol := "http"
// FIXME Handle TLS on ping etc...
// if pingEntryPoint.TLS != nil {
// protocol = "https"
// tr := &http.Transport{
// TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
// }
// client.Transport = tr
// }
path := "/"
return client.Head(protocol + "://" + pingEntryPoint.Address + path + "ping")
}

View File

@ -1,152 +0,0 @@
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/url"
"os/exec"
"regexp"
"runtime"
"text/template"
"github.com/containous/flaeg"
"github.com/mvdan/xurls"
)
var (
bugtracker = "https://github.com/containous/traefik/issues/new"
bugTemplate = `<!--
PLEASE READ THIS MESSAGE.
Please keep in mind that the GitHub issue tracker is not intended as a general support forum, but for reporting bugs and feature requests.
For other type of questions, consider using one of:
- the Traefik community Slack channel: https://traefik.herokuapp.com
- StackOverflow: https://stackoverflow.com/questions/tagged/traefik
HOW TO WRITE A GOOD ISSUE?
- if it's possible use the command` + "`" + `traefik bug` + "`" + `. See https://www.youtube.com/watch?v=Lyz62L8m93I.
- The title must be short and descriptive.
- Explain the conditions which led you to write this issue: the context.
- The context should lead to something, an idea or a problem that youre facing.
- Remain clear and concise.
- Format your messages to help the reader focus on what matters and understand the structure of your message, use Markdown syntax https://help.github.com/articles/github-flavored-markdown
-->
### Do you want to request a *feature* or report a *bug*?
### What did you do?
### What did you expect to see?
### What did you see instead?
### Output of ` + "`" + `traefik version` + "`" + `: (_What version of Traefik are you using?_)
` + "```" + `
{{.Version}}
` + "```" + `
### What is your environment & configuration (arguments, toml, provider, platform, ...)?
` + "```" + `toml
{{.Configuration}}
` + "```" + `
<!--
Add more configuration information here.
-->
### If applicable, please paste the log output in debug mode (` + "`" + `--debug` + "`" + ` switch)
` + "```" + `
(paste your output here)
` + "```" + `
`
)
// newBugCmd builds a new Bug command
func newBugCmd(traefikConfiguration interface{}, traefikPointersConfiguration interface{}) *flaeg.Command {
//version Command init
return &flaeg.Command{
Name: "bug",
Description: `Report an issue on Traefik bugtracker`,
Config: traefikConfiguration,
DefaultPointersConfig: traefikPointersConfiguration,
Run: func() error {
var version bytes.Buffer
if err := getVersionPrint(&version); err != nil {
return err
}
tmpl, err := template.New("").Parse(bugTemplate)
if err != nil {
return err
}
configJSON, err := json.MarshalIndent(traefikConfiguration, "", " ")
if err != nil {
return err
}
v := struct {
Version string
Configuration string
}{
Version: version.String(),
Configuration: anonymize(string(configJSON)),
}
var bug bytes.Buffer
if err := tmpl.Execute(&bug, v); err != nil {
return err
}
body := bug.String()
URL := bugtracker + "?body=" + url.QueryEscape(body)
if err := openBrowser(URL); err != nil {
fmt.Print("Please file a new issue at " + bugtracker + " using this template:\n\n")
fmt.Print(body)
}
return nil
},
Metadata: map[string]string{
"parseAllSources": "true",
},
}
}
func openBrowser(URL string) error {
var err error
switch runtime.GOOS {
case "linux":
err = exec.Command("xdg-open", URL).Start()
case "windows":
err = exec.Command("rundll32", "url.dll,FileProtocolHandler", URL).Start()
case "darwin":
err = exec.Command("open", URL).Start()
default:
err = fmt.Errorf("unsupported platform")
}
return err
}
func anonymize(input string) string {
replace := "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
mailExp := regexp.MustCompile(`\w[-._\w]*\w@\w[-._\w]*\w\.\w{2,3}"`)
return xurls.Relaxed.ReplaceAllString(mailExp.ReplaceAllString(input, replace), replace)
}

View File

@ -1,313 +1,314 @@
package main
import (
"crypto/tls"
"context"
"encoding/json"
"fmt"
fmtlog "log"
stdlog "log"
"net/http"
"os"
"path/filepath"
"reflect"
"runtime"
"strings"
"time"
"github.com/Sirupsen/logrus"
"github.com/containous/flaeg"
"github.com/containous/staert"
"github.com/containous/traefik/acme"
"github.com/containous/traefik/cluster"
"github.com/containous/traefik/log"
"github.com/containous/traefik/middlewares"
"github.com/containous/traefik/provider/kubernetes"
"github.com/containous/traefik/safe"
"github.com/containous/traefik/server"
"github.com/containous/traefik/types"
"github.com/containous/traefik/version"
"github.com/containous/traefik/v2/autogen/genstatic"
"github.com/containous/traefik/v2/cmd"
"github.com/containous/traefik/v2/cmd/healthcheck"
cmdVersion "github.com/containous/traefik/v2/cmd/version"
"github.com/containous/traefik/v2/pkg/cli"
"github.com/containous/traefik/v2/pkg/collector"
"github.com/containous/traefik/v2/pkg/config/dynamic"
"github.com/containous/traefik/v2/pkg/config/static"
"github.com/containous/traefik/v2/pkg/log"
"github.com/containous/traefik/v2/pkg/provider/acme"
"github.com/containous/traefik/v2/pkg/provider/aggregator"
"github.com/containous/traefik/v2/pkg/safe"
"github.com/containous/traefik/v2/pkg/server"
"github.com/containous/traefik/v2/pkg/server/router"
traefiktls "github.com/containous/traefik/v2/pkg/tls"
"github.com/containous/traefik/v2/pkg/version"
"github.com/coreos/go-systemd/daemon"
"github.com/docker/libkv/store"
"github.com/satori/go.uuid"
assetfs "github.com/elazarl/go-bindata-assetfs"
"github.com/sirupsen/logrus"
"github.com/vulcand/oxy/roundrobin"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
// traefik config inits
tConfig := cmd.NewTraefikConfiguration()
//traefik config inits
traefikConfiguration := server.NewTraefikConfiguration()
traefikPointersConfiguration := server.NewTraefikDefaultPointersConfiguration()
//traefik Command init
traefikCmd := &flaeg.Command{
loaders := []cli.ResourceLoader{&cli.FileLoader{}, &cli.FlagLoader{}, &cli.EnvLoader{}}
cmdTraefik := &cli.Command{
Name: "traefik",
Description: `traefik is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease.
Description: `Traefik is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease.
Complete documentation is available at https://traefik.io`,
Config: traefikConfiguration,
DefaultPointersConfig: traefikPointersConfiguration,
Run: func() error {
run(traefikConfiguration)
return nil
Configuration: tConfig,
Resources: loaders,
Run: func(_ []string) error {
return runCmd(&tConfig.Configuration)
},
}
//storeconfig Command init
var kv *staert.KvSource
var err error
storeconfigCmd := &flaeg.Command{
Name: "storeconfig",
Description: `Store the static traefik configuration into a Key-value stores. Traefik will not start.`,
Config: traefikConfiguration,
DefaultPointersConfig: traefikPointersConfiguration,
Run: func() error {
if kv == nil {
return fmt.Errorf("Error using command storeconfig, no Key-value store defined")
}
jsonConf, err := json.Marshal(traefikConfiguration.GlobalConfiguration)
if err != nil {
return err
}
fmtlog.Printf("Storing configuration: %s\n", jsonConf)
err = kv.StoreConfig(traefikConfiguration.GlobalConfiguration)
if err != nil {
return err
}
if traefikConfiguration.GlobalConfiguration.ACME != nil && len(traefikConfiguration.GlobalConfiguration.ACME.StorageFile) > 0 {
// convert ACME json file to KV store
store := acme.NewLocalStore(traefikConfiguration.GlobalConfiguration.ACME.StorageFile)
object, err := store.Load()
if err != nil {
return err
}
meta := cluster.NewMetadata(object)
err = meta.Marshall()
if err != nil {
return err
}
source := staert.KvSource{
Store: kv,
Prefix: traefikConfiguration.GlobalConfiguration.ACME.Storage,
}
err = source.StoreConfig(meta)
if err != nil {
return err
}
}
return nil
},
Metadata: map[string]string{
"parseAllSources": "true",
},
}
//init flaeg source
f := flaeg.New(traefikCmd, os.Args[1:])
//add custom parsers
f.AddParser(reflect.TypeOf(server.EntryPoints{}), &server.EntryPoints{})
f.AddParser(reflect.TypeOf(server.DefaultEntryPoints{}), &server.DefaultEntryPoints{})
f.AddParser(reflect.TypeOf(types.Constraints{}), &types.Constraints{})
f.AddParser(reflect.TypeOf(kubernetes.Namespaces{}), &kubernetes.Namespaces{})
f.AddParser(reflect.TypeOf([]acme.Domain{}), &acme.Domains{})
f.AddParser(reflect.TypeOf(types.Buckets{}), &types.Buckets{})
//add commands
f.AddCommand(newVersionCmd())
f.AddCommand(newBugCmd(traefikConfiguration, traefikPointersConfiguration))
f.AddCommand(storeconfigCmd)
usedCmd, err := f.GetCommand()
err := cmdTraefik.AddCommand(healthcheck.NewCmd(&tConfig.Configuration, loaders))
if err != nil {
fmtlog.Println(err)
os.Exit(-1)
stdlog.Println(err)
os.Exit(1)
}
if _, err := f.Parse(usedCmd); err != nil {
fmtlog.Printf("Error parsing command: %s\n", err)
os.Exit(-1)
}
//staert init
s := staert.NewStaert(traefikCmd)
//init toml source
toml := staert.NewTomlSource("traefik", []string{traefikConfiguration.ConfigFile, "/etc/traefik/", "$HOME/.traefik/", "."})
//add sources to staert
s.AddSource(toml)
s.AddSource(f)
if _, err := s.LoadConfig(); err != nil {
fmtlog.Println(fmt.Errorf("Error reading TOML config file %s : %s", toml.ConfigFileUsed(), err))
os.Exit(-1)
}
traefikConfiguration.ConfigFile = toml.ConfigFileUsed()
kv, err = CreateKvSource(traefikConfiguration)
err = cmdTraefik.AddCommand(cmdVersion.NewCmd())
if err != nil {
fmtlog.Printf("Error creating kv store: %s\n", err)
os.Exit(-1)
stdlog.Println(err)
os.Exit(1)
}
// IF a KV Store is enable and no sub-command called in args
if kv != nil && usedCmd == traefikCmd {
if traefikConfiguration.Cluster == nil {
traefikConfiguration.Cluster = &types.Cluster{Node: uuid.NewV4().String()}
}
if traefikConfiguration.Cluster.Store == nil {
traefikConfiguration.Cluster.Store = &types.Store{Prefix: kv.Prefix, Store: kv.Store}
}
s.AddSource(kv)
if _, err := s.LoadConfig(); err != nil {
fmtlog.Printf("Error loading configuration: %s\n", err)
os.Exit(-1)
}
}
if err := s.Run(); err != nil {
fmtlog.Printf("Error running traefik: %s\n", err)
os.Exit(-1)
err = cli.Execute(cmdTraefik)
if err != nil {
stdlog.Println(err)
os.Exit(1)
}
os.Exit(0)
}
func run(traefikConfiguration *server.TraefikConfiguration) {
fmtlog.SetFlags(fmtlog.Lshortfile | fmtlog.LstdFlags)
func runCmd(staticConfiguration *static.Configuration) error {
configureLogging(staticConfiguration)
// load global configuration
globalConfiguration := traefikConfiguration.GlobalConfiguration
http.DefaultTransport.(*http.Transport).Proxy = http.ProxyFromEnvironment
http.DefaultTransport.(*http.Transport).MaxIdleConnsPerHost = globalConfiguration.MaxIdleConnsPerHost
if globalConfiguration.InsecureSkipVerify {
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
}
loggerMiddleware := middlewares.NewLogger(globalConfiguration.AccessLogsFile)
defer loggerMiddleware.Close()
if globalConfiguration.File != nil && len(globalConfiguration.File.Filename) == 0 {
// no filename, setting to global config file
if len(traefikConfiguration.ConfigFile) != 0 {
globalConfiguration.File.Filename = traefikConfiguration.ConfigFile
} else {
log.Errorln("Error using file configuration backend, no filename defined")
}
if err := roundrobin.SetDefaultWeight(0); err != nil {
log.WithoutContext().Errorf("Could not set roundrobin default weight: %v", err)
}
if len(globalConfiguration.EntryPoints) == 0 {
globalConfiguration.EntryPoints = map[string]*server.EntryPoint{"http": {Address: ":80"}}
globalConfiguration.DefaultEntryPoints = []string{"http"}
staticConfiguration.SetEffectiveConfiguration()
if err := staticConfiguration.ValidateConfiguration(); err != nil {
return err
}
if globalConfiguration.Debug {
globalConfiguration.LogLevel = "DEBUG"
}
log.WithoutContext().Infof("Traefik version %s built on %s", version.Version, version.BuildDate)
// logging
level, err := logrus.ParseLevel(strings.ToLower(globalConfiguration.LogLevel))
jsonConf, err := json.Marshal(staticConfiguration)
if err != nil {
log.Error("Error getting level", err)
}
log.SetLevel(level)
if len(globalConfiguration.TraefikLogsFile) > 0 {
dir := filepath.Dir(globalConfiguration.TraefikLogsFile)
err := os.MkdirAll(dir, 0755)
if err != nil {
log.Errorf("Failed to create log path %s: %s", dir, err)
}
fi, err := os.OpenFile(globalConfiguration.TraefikLogsFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
defer func() {
if err := fi.Close(); err != nil {
log.Error("Error closing file", err)
}
}()
if err != nil {
log.Error("Error opening file", err)
} else {
log.SetOutput(fi)
log.SetFormatter(&logrus.TextFormatter{DisableColors: true, FullTimestamp: true, DisableSorting: true})
}
log.WithoutContext().Errorf("Could not marshal static configuration: %v", err)
log.WithoutContext().Debugf("Static configuration loaded [struct] %#v", staticConfiguration)
} else {
log.SetFormatter(&logrus.TextFormatter{FullTimestamp: true, DisableSorting: true})
log.WithoutContext().Debugf("Static configuration loaded %s", string(jsonConf))
}
jsonConf, _ := json.Marshal(globalConfiguration)
log.Infof("Traefik version %s built on %s", version.Version, version.BuildDate)
if globalConfiguration.CheckNewVersion {
ticker := time.NewTicker(24 * time.Hour)
safe.Go(func() {
version.CheckNewVersion()
for {
select {
case <-ticker.C:
version.CheckNewVersion()
}
if staticConfiguration.API != nil && staticConfiguration.API.Dashboard {
staticConfiguration.API.DashboardAssets = &assetfs.AssetFS{Asset: genstatic.Asset, AssetInfo: genstatic.AssetInfo, AssetDir: genstatic.AssetDir, Prefix: "static"}
}
if staticConfiguration.Global.CheckNewVersion {
checkNewVersion()
}
stats(staticConfiguration)
providerAggregator := aggregator.NewProviderAggregator(*staticConfiguration.Providers)
tlsManager := traefiktls.NewManager()
acmeProviders := initACMEProvider(staticConfiguration, &providerAggregator, tlsManager)
serverEntryPointsTCP := make(server.TCPEntryPoints)
for entryPointName, config := range staticConfiguration.EntryPoints {
ctx := log.With(context.Background(), log.Str(log.EntryPointName, entryPointName))
serverEntryPointsTCP[entryPointName], err = server.NewTCPEntryPoint(ctx, config)
if err != nil {
return fmt.Errorf("error while building entryPoint %s: %v", entryPointName, err)
}
serverEntryPointsTCP[entryPointName].RouteAppenderFactory = router.NewRouteAppenderFactory(*staticConfiguration, entryPointName, acmeProviders)
}
svr := server.NewServer(*staticConfiguration, providerAggregator, serverEntryPointsTCP, tlsManager)
resolverNames := map[string]struct{}{}
for _, p := range acmeProviders {
resolverNames[p.ResolverName] = struct{}{}
svr.AddListener(p.ListenConfiguration)
}
svr.AddListener(func(config dynamic.Configuration) {
for rtName, rt := range config.HTTP.Routers {
if rt.TLS == nil || rt.TLS.CertResolver == "" {
continue
}
})
if _, ok := resolverNames[rt.TLS.CertResolver]; !ok {
log.WithoutContext().Errorf("the router %s uses a non-existent resolver: %s", rtName, rt.TLS.CertResolver)
}
}
})
ctx := cmd.ContextWithSignal(context.Background())
if staticConfiguration.Ping != nil {
staticConfiguration.Ping.WithContext(ctx)
}
if len(traefikConfiguration.ConfigFile) != 0 {
log.Infof("Using TOML configuration file %s", traefikConfiguration.ConfigFile)
}
log.Debugf("Global configuration loaded %s", string(jsonConf))
svr := server.NewServer(globalConfiguration)
svr.Start()
svr.Start(ctx)
defer svr.Close()
sent, err := daemon.SdNotify(false, "READY=1")
if !sent && err != nil {
log.Error("Fail to notify", err)
log.WithoutContext().Errorf("Failed to notify: %v", err)
}
t, err := daemon.SdWatchdogEnabled(false)
if err != nil {
log.Error("Problem with watchdog", err)
log.WithoutContext().Errorf("Could not enable Watchdog: %v", err)
} else if t != 0 {
// Send a ping each half time given
t = t / 2
log.Info("Watchdog activated with timer each ", t)
t /= 2
log.WithoutContext().Infof("Watchdog activated with timer duration %s", t)
safe.Go(func() {
tick := time.Tick(t)
for range tick {
if ok, _ := daemon.SdNotify(false, "WATCHDOG=1"); !ok {
log.Error("Fail to tick watchdog")
resp, errHealthCheck := healthcheck.Do(*staticConfiguration)
if resp != nil {
resp.Body.Close()
}
if staticConfiguration.Ping == nil || errHealthCheck == nil {
if ok, _ := daemon.SdNotify(false, "WATCHDOG=1"); !ok {
log.WithoutContext().Error("Fail to tick watchdog")
}
} else {
log.WithoutContext().Error(errHealthCheck)
}
}
})
}
svr.Wait()
log.Info("Shutting down")
log.WithoutContext().Info("Shutting down")
logrus.Exit(0)
return nil
}
// CreateKvSource creates KvSource
// TLS support is enable for Consul and Etcd backends
func CreateKvSource(traefikConfiguration *server.TraefikConfiguration) (*staert.KvSource, error) {
var kv *staert.KvSource
var store store.Store
var err error
// initACMEProvider creates an acme provider from the ACME part of globalConfiguration
func initACMEProvider(c *static.Configuration, providerAggregator *aggregator.ProviderAggregator, tlsManager *traefiktls.Manager) []*acme.Provider {
challengeStore := acme.NewLocalChallengeStore()
localStores := map[string]*acme.LocalStore{}
switch {
case traefikConfiguration.Consul != nil:
store, err = traefikConfiguration.Consul.CreateStore()
kv = &staert.KvSource{
Store: store,
Prefix: traefikConfiguration.Consul.Prefix,
}
case traefikConfiguration.Etcd != nil:
store, err = traefikConfiguration.Etcd.CreateStore()
kv = &staert.KvSource{
Store: store,
Prefix: traefikConfiguration.Etcd.Prefix,
}
case traefikConfiguration.Zookeeper != nil:
store, err = traefikConfiguration.Zookeeper.CreateStore()
kv = &staert.KvSource{
Store: store,
Prefix: traefikConfiguration.Zookeeper.Prefix,
}
case traefikConfiguration.Boltdb != nil:
store, err = traefikConfiguration.Boltdb.CreateStore()
kv = &staert.KvSource{
Store: store,
Prefix: traefikConfiguration.Boltdb.Prefix,
var resolvers []*acme.Provider
for name, resolver := range c.CertificatesResolvers {
if resolver.ACME != nil {
if localStores[resolver.ACME.Storage] == nil {
localStores[resolver.ACME.Storage] = acme.NewLocalStore(resolver.ACME.Storage)
}
p := &acme.Provider{
Configuration: resolver.ACME,
Store: localStores[resolver.ACME.Storage],
ChallengeStore: challengeStore,
ResolverName: name,
}
if err := providerAggregator.AddProvider(p); err != nil {
log.WithoutContext().Errorf("Unable to add ACME provider to the providers list: %v", err)
continue
}
p.SetTLSManager(tlsManager)
if p.TLSChallenge != nil {
tlsManager.TLSAlpnGetter = p.GetTLSALPNCertificate
}
p.SetConfigListenerChan(make(chan dynamic.Configuration))
resolvers = append(resolvers, p)
}
}
return kv, err
return resolvers
}
func configureLogging(staticConfiguration *static.Configuration) {
// configure default log flags
stdlog.SetFlags(stdlog.Lshortfile | stdlog.LstdFlags)
// configure log level
// an explicitly defined log level always has precedence. if none is
// given and debug mode is disabled, the default is ERROR, and DEBUG
// otherwise.
levelStr := "error"
if staticConfiguration.Log != nil && staticConfiguration.Log.Level != "" {
levelStr = strings.ToLower(staticConfiguration.Log.Level)
}
level, err := logrus.ParseLevel(levelStr)
if err != nil {
log.WithoutContext().Errorf("Error getting level: %v", err)
}
log.SetLevel(level)
var logFile string
if staticConfiguration.Log != nil && len(staticConfiguration.Log.FilePath) > 0 {
logFile = staticConfiguration.Log.FilePath
}
// configure log format
var formatter logrus.Formatter
if staticConfiguration.Log != nil && staticConfiguration.Log.Format == "json" {
formatter = &logrus.JSONFormatter{}
} else {
disableColors := len(logFile) > 0
formatter = &logrus.TextFormatter{DisableColors: disableColors, FullTimestamp: true, DisableSorting: true}
}
log.SetFormatter(formatter)
if len(logFile) > 0 {
dir := filepath.Dir(logFile)
if err := os.MkdirAll(dir, 0755); err != nil {
log.WithoutContext().Errorf("Failed to create log path %s: %s", dir, err)
}
err = log.OpenFile(logFile)
logrus.RegisterExitHandler(func() {
if err := log.CloseFile(); err != nil {
log.WithoutContext().Errorf("Error while closing log: %v", err)
}
})
if err != nil {
log.WithoutContext().Errorf("Error while opening log file %s: %v", logFile, err)
}
}
}
func checkNewVersion() {
ticker := time.Tick(24 * time.Hour)
safe.Go(func() {
for time.Sleep(10 * time.Minute); ; <-ticker {
version.CheckNewVersion()
}
})
}
func stats(staticConfiguration *static.Configuration) {
logger := log.WithoutContext()
if staticConfiguration.Global.SendAnonymousUsage {
logger.Info(`Stats collection is enabled.`)
logger.Info(`Many thanks for contributing to Traefik's improvement by allowing us to receive anonymous information from your configuration.`)
logger.Info(`Help us improve Traefik by leaving this feature on :)`)
logger.Info(`More details on: https://docs.traefik.io/v2.0/contributing/data-collection/`)
collect(staticConfiguration)
} else {
logger.Info(`
Stats collection is disabled.
Help us improve Traefik by turning this feature on :)
More details on: https://docs.traefik.io/v2.0/contributing/data-collection/
`)
}
}
func collect(staticConfiguration *static.Configuration) {
ticker := time.Tick(24 * time.Hour)
safe.Go(func() {
for time.Sleep(10 * time.Minute); ; <-ticker {
if err := collector.Collect(staticConfiguration); err != nil {
log.WithoutContext().Debug(err)
}
}
})
}

View File

@ -1,63 +0,0 @@
package main
import (
"fmt"
"io"
"os"
"runtime"
"text/template"
"github.com/containous/flaeg"
"github.com/containous/traefik/version"
)
var versionTemplate = `Version: {{.Version}}
Codename: {{.Codename}}
Go version: {{.GoVersion}}
Built: {{.BuildTime}}
OS/Arch: {{.Os}}/{{.Arch}}`
// newVersionCmd builds a new Version command
func newVersionCmd() *flaeg.Command {
//version Command init
return &flaeg.Command{
Name: "version",
Description: `Print version`,
Config: struct{}{},
DefaultPointersConfig: struct{}{},
Run: func() error {
if err := getVersionPrint(os.Stdout); err != nil {
return err
}
fmt.Printf("\n")
return nil
},
}
}
func getVersionPrint(wr io.Writer) error {
tmpl, err := template.New("").Parse(versionTemplate)
if err != nil {
return err
}
v := struct {
Version string
Codename string
GoVersion string
BuildTime string
Os string
Arch string
}{
Version: version.Version,
Codename: version.Codename,
GoVersion: runtime.Version(),
BuildTime: version.BuildDate,
Os: runtime.GOOS,
Arch: runtime.GOARCH,
}
return tmpl.Execute(wr, v)
}

60
cmd/version/version.go Normal file
View File

@ -0,0 +1,60 @@
package version
import (
"fmt"
"io"
"os"
"runtime"
"text/template"
"github.com/containous/traefik/v2/pkg/cli"
"github.com/containous/traefik/v2/pkg/version"
)
var versionTemplate = `Version: {{.Version}}
Codename: {{.Codename}}
Go version: {{.GoVersion}}
Built: {{.BuildTime}}
OS/Arch: {{.Os}}/{{.Arch}}`
// NewCmd builds a new Version command
func NewCmd() *cli.Command {
return &cli.Command{
Name: "version",
Description: `Shows the current Traefik version.`,
Configuration: nil,
Run: func(_ []string) error {
if err := GetPrint(os.Stdout); err != nil {
return err
}
fmt.Print("\n")
return nil
},
}
}
// GetPrint write Printable version
func GetPrint(wr io.Writer) error {
tmpl, err := template.New("").Parse(versionTemplate)
if err != nil {
return err
}
v := struct {
Version string
Codename string
GoVersion string
BuildTime string
Os string
Arch string
}{
Version: version.Version,
Codename: version.Codename,
GoVersion: runtime.Version(),
BuildTime: version.BuildDate,
Os: runtime.GOOS,
Arch: runtime.GOARCH,
}
return tmpl.Execute(wr, v)
}

File diff suppressed because it is too large Load Diff

1055
contrib/grafana/traefik.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,41 @@
[Unit]
Description=Traefik
Documentation=https://docs.traefik.io
#After=network-online.target
#AssertFileIsExecutable=/usr/bin/traefik
#AssertPathExists=/etc/traefik/traefik.toml
[Service]
# Run traefik as its own user (create new user with: useradd -r -s /bin/false -U -M traefik)
#User=traefik
#AmbientCapabilities=CAP_NET_BIND_SERVICE
# configure service behavior
Type=notify
ExecStart=/usr/bin/traefik --configFile=/etc/traefik.toml
#ExecStart=/usr/bin/traefik --configFile=/etc/traefik/traefik.toml
Restart=always
WatchdogSec=1s
# lock down system access
# prohibit any operating system and configuration modification
#ProtectSystem=strict
# create separate, new (and empty) /tmp and /var/tmp filesystems
#PrivateTmp=true
# make /home directories inaccessible
#ProtectHome=true
# turns off access to physical devices (/dev/...)
#PrivateDevices=true
# make kernel settings (procfs and sysfs) read-only
#ProtectKernelTunables=true
# make cgroups /sys/fs/cgroup read-only
#ProtectControlGroups=true
# allow writing of acme.json
#ReadWritePaths=/etc/traefik/acme.json
# depending on log and entrypoint configuration, you may need to allow writing to other paths, too
# limit number of processes in this unit
#LimitNPROC=1
[Install]
WantedBy=multi-user.target

1
docs/.dockerignore Normal file
View File

@ -0,0 +1 @@
site/

12
docs/.markdownlint.json Normal file
View File

@ -0,0 +1,12 @@
{
"no-hard-tabs": false,
"MD007": { "indent": 4 },
"MD009": false,
"MD013": false,
"MD024": false,
"MD026": false,
"MD033": false,
"MD034": false,
"MD036": false,
"MD046": false
}

52
docs/Makefile Normal file
View File

@ -0,0 +1,52 @@
#######
# This Makefile contains all targets related to the documentation
#######
DOCS_VERIFY_SKIP ?= false
DOCS_LINT_SKIP ?= false
TRAEFIK_DOCS_BUILD_IMAGE ?= traefik-docs
TRAEFIK_DOCS_CHECK_IMAGE ?= $(TRAEFIK_DOCS_BUILD_IMAGE)-check
SITE_DIR := $(CURDIR)/site
DOCKER_RUN_DOC_PORT := 8000
DOCKER_RUN_DOC_MOUNTS := -v $(CURDIR):/mkdocs
DOCKER_RUN_DOC_OPTS := --rm $(DOCKER_RUN_DOC_MOUNTS) -p $(DOCKER_RUN_DOC_PORT):8000
# Default: generates the documentation into $(SITE_DIR)
docs: docs-clean docs-image docs-lint docs-build docs-verify
# Writer Mode: build and serve docs on http://localhost:8000 with livereload
docs-serve: docs-image
docker run $(DOCKER_RUN_DOC_OPTS) $(TRAEFIK_DOCS_BUILD_IMAGE) mkdocs serve
# Utilities Targets for each step
docs-image:
docker build -t $(TRAEFIK_DOCS_BUILD_IMAGE) -f docs.Dockerfile ./
docs-build: docs-image
docker run $(DOCKER_RUN_DOC_OPTS) $(TRAEFIK_DOCS_BUILD_IMAGE) sh -c "mkdocs build \
&& chown -R $(shell id -u):$(shell id -g) ./site"
docs-verify: docs-build
@if [ "$(DOCS_VERIFY_SKIP)" != "true" ]; then \
docker build -t $(TRAEFIK_DOCS_CHECK_IMAGE) -f check.Dockerfile ./; \
docker run --rm -v $(CURDIR):/app $(TRAEFIK_DOCS_CHECK_IMAGE) /verify.sh; \
else \
echo "DOCS_VERIFY_SKIP is true: no verification done."; \
fi
docs-lint:
@if [ "$(DOCS_LINT_SKIP)" != "true" ]; then \
docker build -t $(TRAEFIK_DOCS_CHECK_IMAGE) -f check.Dockerfile ./ && \
docker run --rm -v $(CURDIR):/app $(TRAEFIK_DOCS_CHECK_IMAGE) /lint.sh; \
else \
echo "DOCS_LINT_SKIP is true: no linting done."; \
fi
docs-clean:
rm -rf $(SITE_DIR)
.PHONY: all docs-verify docs docs-clean docs-build docs-lint

View File

@ -1,442 +0,0 @@
# Concepts
Let's take our example from the [overview](https://docs.traefik.io/#overview) again:
> Imagine that you have deployed a bunch of microservices on your infrastructure. You probably used a service registry (like etcd or consul) and/or an orchestrator (swarm, Mesos/Marathon) to manage all these services.
> If you want your users to access some of your microservices from the Internet, you will have to use a reverse proxy and configure it using virtual hosts or prefix paths:
> - domain `api.domain.com` will point the microservice `api` in your private network
> - path `domain.com/web` will point the microservice `web` in your private network
> - domain `backoffice.domain.com` will point the microservices `backoffice` in your private network, load-balancing between your multiple instances
> ![Architecture](img/architecture.png)
Let's zoom on Træfik and have an overview of its internal architecture:
![Architecture](img/internal.png)
- Incoming requests end on [entrypoints](#entrypoints), as the name suggests, they are the network entry points into Træfik (listening port, SSL, traffic redirection...).
- Traffic is then forwarded to a matching [frontend](#frontends). A frontend defines routes from [entrypoints](#entrypoints) to [backends](#backends).
Routes are created using requests fields (`Host`, `Path`, `Headers`...) and can match or not a request.
- The [frontend](#frontends) will then send the request to a [backend](#backends). A backend can be composed by one or more [servers](#servers), and by a load-balancing strategy.
- Finally, the [server](#servers) will forward the request to the corresponding microservice in the private network.
## Entrypoints
Entrypoints are the network entry points into Træfik.
They can be defined using:
- a port (80, 443...)
- SSL (Certificates, Keys, authentication with a client certificate signed by a trusted CA...)
- redirection to another entrypoint (redirect `HTTP` to `HTTPS`)
Here is an example of entrypoints definition:
```toml
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[[entryPoints.https.tls.certificates]]
certFile = "tests/traefik.crt"
keyFile = "tests/traefik.key"
```
- Two entrypoints are defined `http` and `https`.
- `http` listens on port `80` and `https` on port `443`.
- We enable SSL on `https` by giving a certificate and a key.
- We also redirect all the traffic from entrypoint `http` to `https`.
And here is another example with client certificate authentication:
```toml
[entryPoints]
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
clientCAFiles = ["tests/clientca1.crt", "tests/clientca2.crt"]
[[entryPoints.https.tls.certificates]]
certFile = "tests/traefik.crt"
keyFile = "tests/traefik.key"
```
- We enable SSL on `https` by giving a certificate and a key.
- One or several files containing Certificate Authorities in PEM format are added.
- It is possible to have multiple CA:s in the same file or keep them in separate files.
## Frontends
A frontend consists of a set of rules that determine how incoming requests are forwarded from an entrypoint to a backend.
Rules may be classified in one of two groups: Modifiers and matchers.
### Modifiers
Modifier rules only modify the request. They do not have any impact on routing decisions being made.
Following is the list of existing modifier rules:
- `AddPrefix: /products`: Add path prefix to the existing request path prior to forwarding the request to the backend.
- `ReplacePath: /serverless-path`: Replaces the path and adds the old path to the `X-Replaced-Path` header. Useful for mapping to AWS Lambda or Google Cloud Functions.
### Matchers
Matcher rules determine if a particular request should be forwarded to a backend.
Separate multiple rule values by `,` (comma) in order to enable ANY semantics (i.e., forward a request if any rule matches). Does not work for `Headers` and `HeadersRegexp`.
Separate multiple rule values by `;` (semicolon) in order to enable ALL semantics (i.e., forward a request if all rules match).
You can optionally enable `passHostHeader` to forward client `Host` header to the backend.
Following is the list of existing matcher rules along with examples:
- `Headers: Content-Type, application/json`: Match HTTP header. It accepts a comma-separated key/value pair where both key and value must be literals.
- `HeadersRegexp: Content-Type, application/(text|json)`: Match HTTP header. It accepts a comma-separated key/value pair where the key must be a literal and the value may be a literal or a regular expression.
- `Host: traefik.io, www.traefik.io`: Match request host. It accepts a sequence of literal hosts.
- `HostRegexp: traefik.io, {subdomain:[a-z]+}.traefik.io`: Match request host. It accepts a sequence of literal and regular expression hosts.
- `Method: GET, POST, PUT`: Match request HTTP method. It accepts a sequence of HTTP methods.
- `Path: /products/, /articles/{category}/{id:[0-9]+}`: Match exact request path. It accepts a sequence of literal and regular expression paths.
- `PathStrip: /products/`: Match exact path and strip off the path prior to forwarding the request to the backend. It accepts a sequence of literal paths.
- `PathStripRegex: /articles/{category}/{id:[0-9]+}`: Match exact path and strip off the path prior to forwarding the request to the backend. It accepts a sequence of literal and regular expression paths.
- `PathPrefix: /products/, /articles/{category}/{id:[0-9]+}`: Match request prefix path. It accepts a sequence of literal and regular expression prefix paths.
- `PathPrefixStrip: /products/`: Match request prefix path and strip off the path prefix prior to forwarding the request to the backend. It accepts a sequence of literal prefix paths. Starting with Traefik 1.3, the stripped prefix path will be available in the `X-Forwarded-Prefix` header.
- `PathPrefixStripRegex: /articles/{category}/{id:[0-9]+}`: Match request prefix path and strip off the path prefix prior to forwarding the request to the backend. It accepts a sequence of literal and regular expression prefix paths. Starting with Traefik 1.3, the stripped prefix path will be available in the `X-Forwarded-Prefix` header.
In order to use regular expressions with Host and Path matchers, you must declare an arbitrarily named variable followed by the colon-separated regular expression, all enclosed in curly braces. Any pattern supported by [Go's regexp package](https://golang.org/pkg/regexp/) may be used. Example: `/posts/{id:[0-9]+}`.
(Note that the variable has no special meaning; however, it is required by the gorilla/mux dependency which embeds the regular expression and defines the syntax.)
#### Path Matcher Usage Guidelines
This section explains when to use the various path matchers.
Use `Path` if your backend listens on the exact path only. For instance, `Path: /products` would match `/products` but not `/products/shoes`.
Use a `*Prefix*` matcher if your backend listens on a particular base path but also serves requests on sub-paths. For instance, `PathPrefix: /products` would match `/products` but also `/products/shoes` and `/products/shirts`. Since the path is forwarded as-is, your backend is expected to listen on `/products`.
Use a `*Strip` matcher if your backend listens on the root path (`/`) but should be routeable on a specific prefix. For instance, `PathPrefixStrip: /products` would match `/products` but also `/products/shoes` and `/products/shirts`. Since the path is stripped prior to forwarding, your backend is expected to listen on `/`.
If your backend is serving assets (e.g., images or Javascript files), chances are it must return properly constructed relative URLs. Continuing on the example, the backend should return `/products/shoes/image.png` (and not `/images.png` which Traefik would likely not be able to associate with the same backend). The `X-Forwarded-Prefix` header (available since Traefik 1.3) can be queried to build such URLs dynamically.
Instead of distinguishing your backends by path only, you can add a Host matcher to the mix. That way, namespacing of your backends happens on the basis of hosts in addition to paths.
### Examples
Here is an example of frontends definition:
```toml
[frontends]
[frontends.frontend1]
backend = "backend2"
[frontends.frontend1.routes.test_1]
rule = "Host:test.localhost,test2.localhost"
[frontends.frontend2]
backend = "backend1"
passHostHeader = true
priority = 10
entrypoints = ["https"] # overrides defaultEntryPoints
[frontends.frontend2.routes.test_1]
rule = "HostRegexp:localhost,{subdomain:[a-z]+}.localhost"
[frontends.frontend3]
backend = "backend2"
[frontends.frontend3.routes.test_1]
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
### Combining multiple rules
As seen in the previous example, you can combine multiple rules.
In TOML file, you can use multiple routes:
```toml
[frontends.frontend3]
backend = "backend2"
[frontends.frontend3.routes.test_1]
rule = "Host:test3.localhost"
[frontends.frontend3.routes.test_2]
rule = "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, same result:
```toml
[frontends.frontend3]
backend = "backend2"
[frontends.frontend3.routes.test_1]
rule = "Host:test3.localhost;Path:/test"
```
Finally, you can create a rule to bind multiple domains or Path to a frontend, using the `,` separator:
```toml
[frontends.frontend2]
[frontends.frontend2.routes.test_1]
rule = "Host:test1.localhost,test2.localhost"
[frontends.frontend3]
backend = "backend2"
[frontends.frontend3.routes.test_1]
rule = "Path:/test1,/test2"
```
### Rules Order
When combining `Modifier` rules with `Matcher` rules, it is important to remember that `Modifier` rules **ALWAYS** apply after the `Matcher` rules.
The following rules are both `Matchers` and `Modifiers`, so the `Matcher` portion of the rule will apply first, and the `Modifier` will apply later.
- `PathStrip`
- `PathStripRegex`
- `PathPrefixStrip`
- `PathPrefixStripRegex`
`Modifiers` will be applied in a pre-determined order regardless of their order in the `rule` configuration section.
1. `PathStrip`
2. `PathPrefixStrip`
3. `PathStripRegex`
4. `PathPrefixStripRegex`
5. `AddPrefix`
6. `ReplacePath`
### Priorities
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:
```toml
[frontends]
[frontends.frontend1]
backend = "backend1"
priority = 10
passHostHeader = true
[frontends.frontend1.routes.test_1]
rule = "PathPrefix:/to"
[frontends.frontend2]
priority = 5
backend = "backend2"
passHostHeader = true
[frontends.frontend2.routes.test_1]
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.
Various methods of load-balancing are supported:
- `wrr`: Weighted Round Robin
- `drr`: Dynamic Round Robin: increases weights on servers that perform better than others. It also rolls back to original weights if the servers have changed.
A circuit breaker can also be applied to a backend, preventing high loads on failing servers.
Initial state is Standby. CB observes the statistics and does not modify the request.
In case the condition matches, CB enters Tripped state, where it responds with predefined code or redirects to another frontend.
Once Tripped timer expires, CB enters Recovering state and resets all stats.
In case the condition does not match and recovery timer expires, CB enters Standby state.
It can be configured using:
- Methods: `LatencyAtQuantileMS`, `NetworkErrorRatio`, `ResponseCodeRatio`
- Operators: `AND`, `OR`, `EQ`, `NEQ`, `LT`, `LE`, `GT`, `GE`
For example:
- `NetworkErrorRatio() > 0.5`: watch error ratio over 10 second sliding window for a frontend
- `LatencyAtQuantileMS(50.0) > 50`: watch latency at quantile in milliseconds.
- `ResponseCodeRatio(500, 600, 0, 600) > 0.5`: ratio of response codes in range [500-600) to [0-600)
To proactively prevent backends from being overwhelmed with high load, a maximum connection limit can
also be applied to each backend.
Maximum connections can be configured by specifying an integer value for `maxconn.amount` and
`maxconn.extractorfunc` which is a strategy used to determine how to categorize requests in order to
evaluate the maximum connections.
For example:
```toml
[backends]
[backends.backend1]
[backends.backend1.maxconn]
amount = 10
extractorfunc = "request.host"
```
- `backend1` will return `HTTP code 429 Too Many Requests` if there are already 10 requests in progress for the same Host header.
- Another possible value for `extractorfunc` is `client.ip` which will categorize requests based on client source ip.
- Lastly `extractorfunc` can take the value of `request.header.ANY_HEADER` which will categorize requests based on `ANY_HEADER` that you provide.
Sticky sessions are supported with both load balancers. When sticky sessions are enabled, a cookie called `_TRAEFIK_BACKEND` is set on the initial
request. On subsequent requests, the client will be directed to the backend stored in the cookie if it is still healthy. If not, a new backend
will be assigned.
For example:
```toml
[backends]
[backends.backend1]
[backends.backend1.loadbalancer]
sticky = true
```
A health check can be configured in order to remove a backend from LB rotation
as long as it keeps returning HTTP status codes other than 200 OK to HTTP GET
requests periodically carried out by Traefik. The check is defined by a path
appended to the backend URL and an interval (given in a format understood by [time.ParseDuration](https://golang.org/pkg/time/#ParseDuration)) specifying how
often the health check should be executed (the default being 30 seconds). Each
backend must respond to the health check within 5 seconds.
A recovering backend returning 200 OK responses again is being returned to the
LB rotation pool.
For example:
```toml
[backends]
[backends.backend1]
[backends.backend1.healthcheck]
path = "/health"
interval = "10s"
```
## Servers
Servers are simply defined using a `URL`. You can also apply a custom `weight` to each server (this will be used by load-balancing).
Here is an example of backends and servers definition:
```toml
[backends]
[backends.backend1]
[backends.backend1.circuitbreaker]
expression = "NetworkErrorRatio() > 0.5"
[backends.backend1.servers.server1]
url = "http://172.17.0.2:80"
weight = 10
[backends.backend1.servers.server2]
url = "http://172.17.0.3:80"
weight = 1
[backends.backend2]
[backends.backend2.LoadBalancer]
method = "drr"
[backends.backend2.servers.server1]
url = "http://172.17.0.4:80"
weight = 1
[backends.backend2.servers.server2]
url = "http://172.17.0.5:80"
weight = 2
```
- Two backends are defined: `backend1` and `backend2`
- `backend1` will forward the traffic to two servers: `http://172.17.0.2:80"` with weight `10` and `http://172.17.0.3:80` with weight `1` using default `wrr` load-balancing strategy.
- `backend2` will forward the traffic to two servers: `http://172.17.0.4:80"` with weight `1` and `http://172.17.0.5:80` with weight `2` using `drr` load-balancing strategy.
- a circuit breaker is added on `backend1` using the expression `NetworkErrorRatio() > 0.5`: watch error ratio over 10 second sliding window
# Configuration
Træfik's configuration has two parts:
- The [static Træfik configuration](/basics#static-trfk-configuration) which is loaded only at the beginning.
- The [dynamic Træfik configuration](/basics#dynamic-trfk-configuration) which can be hot-reloaded (no need to restart the process).
## Static Træfik configuration
The static configuration is the global configuration which is setting up connections to configuration backends and entrypoints.
Træfik can be configured using many configuration sources with the following precedence order.
Each item takes precedence over the item below it:
- [Key-value Store](/basics/#key-value-stores)
- [Arguments](/basics/#arguments)
- [Configuration file](/basics/#configuration-file)
- Default
It means that arguments override configuration file, and Key-value Store overrides arguments.
### Configuration file
By default, Træfik will try to find a `traefik.toml` in the following places:
- `/etc/traefik/`
- `$HOME/.traefik/`
- `.` *the working directory*
You can override this by setting a `configFile` argument:
```bash
$ traefik --configFile=foo/bar/myconfigfile.toml
```
Please refer to the [global configuration](/toml/#global-configuration) section to get documentation on it.
### Arguments
Each argument (and command) is described in the help section:
```bash
$ traefik --help
```
Note that all default values will be displayed as well.
### Key-value stores
Træfik supports several Key-value stores:
- [Consul](https://consul.io)
- [etcd](https://coreos.com/etcd/)
- [ZooKeeper](https://zookeeper.apache.org/)
- [boltdb](https://github.com/boltdb/bolt)
Please refer to the [User Guide Key-value store configuration](/user-guide/kv-config/) section to get documentation on it.
## Dynamic Træfik configuration
The dynamic configuration concerns :
- [Frontends](/basics/#frontends)
- [Backends](/basics/#backends)
- [Servers](/basics/#servers)
Træfik can hot-reload those rules which could be provided by [multiple configuration backends](/toml/#configuration-backends).
We only need to enable `watch` option to make Træfik watch configuration backend changes and generate its configuration automatically.
Routes to services will be created and updated instantly at any changes.
Please refer to the [configuration backends](/toml/#configuration-backends) section to get documentation on it.
# Commands
Usage: `traefik [command] [--flag=flag_argument]`
List of Træfik available commands with description :                                                             
- `version` : Print version 
- `storeconfig` : Store the static traefik configuration into a Key-value stores. Please refer to the [Store Træfik configuration](/user-guide/kv-config/#store-trfk-configuration) section to get documentation on it.
Each command may have related flags.
All those related flags will be displayed with :
```bash
$ traefik [command] --help
```
Note that each command is described at the beginning of the help section:
```bash
$ traefik --help
```

View File

@ -1,213 +0,0 @@
# Benchmarks
## Configuration
I would like to thanks [vincentbernat](https://github.com/vincentbernat) from [exoscale.ch](https://www.exoscale.ch) who kindly provided the infrastructure needed for the benchmarks.
I used 4 VMs for the tests with the following configuration:
- 32 GB RAM
- 8 CPU Cores
- 10 GB SSD
- Ubuntu 14.04 LTS 64-bit
## Setup
1. One VM used to launch the benchmarking tool [wrk](https://github.com/wg/wrk)
2. One VM for traefik (v1.0.0-beta.416) / nginx (v1.4.6)
3. Two VMs for 2 backend servers in go [whoami](https://github.com/emilevauge/whoamI/)
Each VM has been tuned using the following limits:
```bash
sysctl -w fs.file-max="9999999"
sysctl -w fs.nr_open="9999999"
sysctl -w net.core.netdev_max_backlog="4096"
sysctl -w net.core.rmem_max="16777216"
sysctl -w net.core.somaxconn="65535"
sysctl -w net.core.wmem_max="16777216"
sysctl -w net.ipv4.ip_local_port_range="1025 65535"
sysctl -w net.ipv4.tcp_fin_timeout="30"
sysctl -w net.ipv4.tcp_keepalive_time="30"
sysctl -w net.ipv4.tcp_max_syn_backlog="20480"
sysctl -w net.ipv4.tcp_max_tw_buckets="400000"
sysctl -w net.ipv4.tcp_no_metrics_save="1"
sysctl -w net.ipv4.tcp_syn_retries="2"
sysctl -w net.ipv4.tcp_synack_retries="2"
sysctl -w net.ipv4.tcp_tw_recycle="1"
sysctl -w net.ipv4.tcp_tw_reuse="1"
sysctl -w vm.min_free_kbytes="65536"
sysctl -w vm.overcommit_memory="1"
ulimit -n 9999999
```
### Nginx
Here is the config Nginx file use `/etc/nginx/nginx.conf`:
```
user www-data;
worker_processes auto;
worker_rlimit_nofile 200000;
pid /var/run/nginx.pid;
events {
worker_connections 10000;
use epoll;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 300;
keepalive_requests 10000;
types_hash_max_size 2048;
open_file_cache max=200000 inactive=300s;
open_file_cache_valid 300s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
server_tokens off;
dav_methods off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log combined;
error_log /var/log/nginx/error.log warn;
gzip off;
gzip_vary off;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;
}
```
Here is the Nginx vhost file used:
```
upstream whoami {
server IP-whoami1:80;
server IP-whoami2:80;
keepalive 300;
}
server {
listen 8001;
server_name test.traefik;
access_log off;
error_log /dev/null crit;
if ($host != "test.traefik") {
return 404;
}
location / {
proxy_pass http://whoami;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Host $host;
}
}
```
### Traefik
Here is the `traefik.toml` file used:
```toml
MaxIdleConnsPerHost = 100000
defaultEntryPoints = ["http"]
[entryPoints]
[entryPoints.http]
address = ":8000"
[file]
[backends]
[backends.backend1]
[backends.backend1.servers.server1]
url = "http://IP-whoami1:80"
weight = 1
[backends.backend1.servers.server2]
url = "http://IP-whoami2:80"
weight = 1
[frontends]
[frontends.frontend1]
backend = "backend1"
[frontends.frontend1.routes.test_1]
rule = "Host: test.traefik"
```
## Results
### whoami:
```shell
wrk -t20 -c1000 -d60s -H "Host: test.traefik" --latency http://IP-whoami:80/bench
Running 1m test @ http://IP-whoami:80/bench
20 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 70.28ms 134.72ms 1.91s 89.94%
Req/Sec 2.92k 742.42 8.78k 68.80%
Latency Distribution
50% 10.63ms
75% 75.64ms
90% 205.65ms
99% 668.28ms
3476705 requests in 1.00m, 384.61MB read
Socket errors: connect 0, read 0, write 0, timeout 103
Requests/sec: 57894.35
Transfer/sec: 6.40MB
```
### nginx:
```shell
wrk -t20 -c1000 -d60s -H "Host: test.traefik" --latency http://IP-nginx:8001/bench
Running 1m test @ http://IP-nginx:8001/bench
20 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 101.25ms 180.09ms 1.99s 89.34%
Req/Sec 1.69k 567.69 9.39k 72.62%
Latency Distribution
50% 15.46ms
75% 129.11ms
90% 302.44ms
99% 846.59ms
2018427 requests in 1.00m, 298.36MB read
Socket errors: connect 0, read 0, write 0, timeout 90
Requests/sec: 33591.67
Transfer/sec: 4.97MB
```
### traefik:
```shell
wrk -t20 -c1000 -d60s -H "Host: test.traefik" --latency http://IP-traefik:8000/bench
Running 1m test @ http://IP-traefik:8000/bench
20 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 91.72ms 150.43ms 2.00s 90.50%
Req/Sec 1.43k 266.37 2.97k 69.77%
Latency Distribution
50% 19.74ms
75% 121.98ms
90% 237.39ms
99% 687.49ms
1705073 requests in 1.00m, 188.63MB read
Socket errors: connect 0, read 0, write 0, timeout 7
Requests/sec: 28392.44
Transfer/sec: 3.14MB
```
## Conclusion
Traefik is obviously slower than Nginx, but not so much: Traefik can serve 28392 requests/sec and Nginx 33591 requests/sec which gives a ratio of 85%.
Not bad for young project :) !
Some areas of possible improvements:
- Use [GO_REUSEPORT](https://github.com/kavu/go_reuseport) listener
- Run a separate server instance per CPU core with `GOMAXPROCS=1` (it appears during benchmarks that there is a lot more context switches with traefik than with nginx)

36
docs/check.Dockerfile Normal file
View File

@ -0,0 +1,36 @@
FROM alpine:3.10 as alpine
RUN apk --no-cache --no-progress add \
libcurl \
ruby \
ruby-bigdecimal \
ruby-etc \
ruby-ffi \
ruby-json \
ruby-nokogiri
RUN gem install html-proofer --version 3.13.0 --no-document -- --use-system-libraries
# After Ruby, some NodeJS YAY!
RUN apk --no-cache --no-progress add \
git \
nodejs \
npm \
&& npm install --global \
markdownlint@0.17.2 \
markdownlint-cli@0.19.0
# Finally the shell tools we need for later
# tini helps to terminate properly all the parallelized tasks when sending CTRL-C
RUN apk --no-cache --no-progress add \
ca-certificates \
curl \
tini
COPY ./scripts/verify.sh /verify.sh
COPY ./scripts/lint.sh /lint.sh
WORKDIR /app
VOLUME ["/tmp","/app"]
ENTRYPOINT ["/sbin/tini","-g","sh"]

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

View File

@ -0,0 +1,4 @@
/* Highlight */
(function(hljs) {
hljs.initHighlightingOnLoad();
})(hljs);

View File

@ -0,0 +1,24 @@
Copyright (c) 2006, Ivan Sagalaev
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of highlight.js nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,96 @@
/*
Atom One Light by Daniel Gamage
Original One Light Syntax theme from https://github.com/atom/one-light-syntax
base: #fafafa
mono-1: #383a42
mono-2: #686b77
mono-3: #a0a1a7
hue-1: #0184bb
hue-2: #4078f2
hue-3: #a626a4
hue-4: #50a14f
hue-5: #e45649
hue-5-2: #c91243
hue-6: #986801
hue-6-2: #c18401
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #383a42;
background: #fafafa;
}
.hljs-comment,
.hljs-quote {
color: #a0a1a7;
font-style: italic;
}
.hljs-doctag,
.hljs-keyword,
.hljs-formula {
color: #a626a4;
}
.hljs-section,
.hljs-name,
.hljs-selector-tag,
.hljs-deletion,
.hljs-subst {
color: #e45649;
}
.hljs-literal {
color: #0184bb;
}
.hljs-string,
.hljs-regexp,
.hljs-addition,
.hljs-attribute,
.hljs-meta-string {
color: #50a14f;
}
.hljs-built_in,
.hljs-class .hljs-title {
color: #c18401;
}
.hljs-attr,
.hljs-variable,
.hljs-template-variable,
.hljs-type,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo,
.hljs-number {
color: #986801;
}
.hljs-symbol,
.hljs-bullet,
.hljs-link,
.hljs-meta,
.hljs-selector-id,
.hljs-title {
color: #4078f2;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
.hljs-link {
text-decoration: underline;
}

View File

@ -0,0 +1,63 @@
@import url('https://fonts.googleapis.com/css?family=Noto+Sans|Noto+Serif');
.md-logo img {
background-color: white;
border-radius: 50%;
width: 30px;
height: 30px;
}
/* Fix for Chrome */
.md-typeset__table td code {
word-break: unset;
}
.md-typeset__table tr :nth-child(1) {
word-wrap: break-word;
max-width: 30em;
}
body {
font-family: 'Noto Sans', sans-serif;
}
h1 {
font-weight: bold !important;
color: rgba(0,0,0,.9) !important;
}
h2 {
font-weight: bold !important;
}
h3 {
font-weight: bold !important;
}
.md-typeset h5 {
text-transform: none;
}
figcaption {
text-align: center;
font-size: 0.8em;
font-style: italic;
color: #8D909F;
}
p.subtitle {
color: rgba(0,0,0,.54);
padding-top: 0;
margin-top: -2em;
font-weight: bold;
font-size: 1.25em;
}
.markdown-body .task-list-item {
list-style-type: none !important;
}
.markdown-body .task-list-item input[type="checkbox"] {
margin: 0 4px 0.25em -20px;
vertical-align: middle;
}

View File

@ -0,0 +1,10 @@
# Advocating
Spread the Love & Tell Us about It
{: .subtitle }
There are many ways to contribute to the project, and there is one that always spark joy: when we see/read about users talking about how Traefik helps them solve their problems.
If you're talking about Traefik, [let us know](https://blog.containo.us/spread-the-love-ba5a40aa72e7) and we'll promote your enthusiasm!
Also, if you've written about Traefik or shared useful information you'd like to promote, feel free to add links in the [dedicated wiki page on Github](https://github.com/containous/traefik/wiki/Awesome-Traefik).

View File

@ -0,0 +1,174 @@
# Building and Testing
Compile and Test Your Own Traefik!
{: .subtitle }
So you want to build your own Traefik binary from the sources?
Let's see how.
## Building
You need either [Docker](https://github.com/docker/docker) and `make` (Method 1), or `go` (Method 2) in order to build Traefik.
For changes to its dependencies, the `dep` dependency management tool is required.
### Method 1: Using `Docker` and `Makefile`
Run make with the `binary` target.
This will create binaries for the Linux platform in the `dist` folder.
```bash
$ make binary
docker build -t traefik-webui -f webui/Dockerfile webui
Sending build context to Docker daemon 2.686MB
Step 1/11 : FROM node:8.15.0
---> 1f6c34f7921c
[...]
Successfully built ce4ff439c06a
Successfully tagged traefik-webui:latest
[...]
docker build -t "traefik-dev:4475--feature-documentation" -f build.Dockerfile .
Sending build context to Docker daemon 279MB
Step 1/10 : FROM golang:1.13-alpine
---> f4bfb3d22bda
[...]
Successfully built 5c3c1a911277
Successfully tagged traefik-dev:4475--feature-documentation
docker run -e "TEST_CONTAINER=1" -v "/var/run/docker.sock:/var/run/docker.sock" -it -e OS_ARCH_ARG -e OS_PLATFORM_ARG -e TESTFLAGS -e VERBOSE -e VERSION -e CODENAME -e TESTDIRS -e CI -e CONTAINER=DOCKER -v "/home/ldez/sources/go/src/github.com/containous/traefik/"dist":/go/src/github.com/containous/traefik/"dist"" "traefik-dev:4475--feature-documentation" ./script/make.sh generate binary
---> Making bundle: generate (in .)
removed 'autogen/genstatic/gen.go'
---> Making bundle: binary (in .)
$ ls dist/
traefik*
```
The following targets can be executed outside Docker by setting the variable `PRE_TARGET` to an empty string (we don't recommend that):
- `test-unit`
- `test-integration`
- `validate`
- `binary` (the webUI is still generated by using Docker)
ex:
```bash
PRE_TARGET= make test-unit
```
### Method 2: Using `go`
Requirements:
- `go` v1.13+
- environment variable `GO111MODULE=on`
- go-bindata `GO111MODULE=off go get -u github.com/containous/go-bindata/...`
!!! tip "Source Directory"
It is recommended that you clone Traefik into the `~/go/src/github.com/containous/traefik` directory.
This is the official golang workspace hierarchy that will allow dependencies to be properly resolved.
!!! note "Environment"
Set your `GOPATH` and `PATH` variable to be set to `~/go` via:
```bash
export GOPATH=~/go
export PATH=$PATH:$GOPATH/bin
```
For convenience, add `GOPATH` and `PATH` to your `.bashrc` or `.bash_profile`
Verify your environment is setup properly by running `$ go env`.
Depending on your OS and environment, you should see an output similar to:
```bash
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/<yourusername>/go"
GORACE=""
## ... and the list goes on
```
#### Build Traefik
Once you've set up your go environment and cloned the source repository, you can build Traefik.
Beforehand, you need to get `go-bindata` (the first time) in order to be able to use the `go generate` command (which is part of the build process).
```bash
cd ~/go/src/github.com/containous/traefik
# Get go-bindata. (Important: the ellipses are required.)
GO111MODULE=off go get github.com/containous/go-bindata/...
# Let's build
# generate
# (required to merge non-code components into the final binary, such as the web dashboard and the provider's templates)
go generate
# Standard go build
go build ./cmd/traefik
```
You will find the Traefik executable (`traefik`) in the `~/go/src/github.com/containous/traefik` directory.
### Updating the templates
If you happen to update the provider's templates (located in `/templates`), you must run `go generate` to update the `autogen` package.
## Testing
### Method 1: `Docker` and `make`
Run unit tests using the `test-unit` target.
Run integration tests using the `test-integration` target.
Run all tests (unit and integration) using the `test` target.
```bash
$ make test-unit
docker build -t "traefik-dev:your-feature-branch" -f build.Dockerfile .
# […]
docker run --rm -it -e OS_ARCH_ARG -e OS_PLATFORM_ARG -e TESTFLAGS -v "/home/user/go/src/github/containous/traefik/dist:/go/src/github.com/containous/traefik/dist" "traefik-dev:your-feature-branch" ./script/make.sh generate test-unit
---> Making bundle: generate (in .)
removed 'gen.go'
---> Making bundle: test-unit (in .)
+ go test -cover -coverprofile=cover.out .
ok github.com/containous/traefik 0.005s coverage: 4.1% of statements
Test success
```
For development purposes, you can specify which tests to run by using (only works the `test-integration` target):
```bash
# Run every tests in the MyTest suite
TESTFLAGS="-check.f MyTestSuite" make test-integration
# Run the test "MyTest" in the MyTest suite
TESTFLAGS="-check.f MyTestSuite.MyTest" make test-integration
# Run every tests starting with "My", in the MyTest suite
TESTFLAGS="-check.f MyTestSuite.My" make test-integration
# Run every tests ending with "Test", in the MyTest suite
TESTFLAGS="-check.f MyTestSuite.*Test" make test-integration
```
More: https://labix.org/gocheck
### Method 2: `go`
Unit tests can be run from the cloned directory using `$ go test ./...` which should return `ok`, similar to:
```test
ok _/home/user/go/src/github/containous/traefik 0.004s
```
Integration tests must be run from the `integration/` directory and require the `-integration` switch: `$ cd integration && go test -integration ./...`.

View File

@ -0,0 +1,95 @@
# Data Collection
Understanding How Traefik is Being Used
{: .subtitle }
## Configuration Example
Understanding how you use Traefik is very important to us: it helps us improve the solution in many different ways.
For this very reason, the sendAnonymousUsage option is mandatory: we want you to take time to consider whether or not you wish to share anonymous data with us so we can benefit from your experience and use cases.
!!! example "Enabling Data Collection"
```toml tab="File (TOML)"
[global]
# Send anonymous usage data
sendAnonymousUsage = true
```
```yaml tab="File (YAML)"
global:
# Send anonymous usage data
sendAnonymousUsage: true
```
```bash tab="CLI"
# Send anonymous usage data
--global.sendAnonymousUsage
```
## Collected Data
This feature comes from the public proposal [here](https://github.com/containous/traefik/issues/2369).
In order to help us learn more about how Traefik is being used and improve it, we collect anonymous usage statistics from running instances.
Those data help us prioritize our developments and focus on what's important for our users (for example, which provider is popular, and which is not).
### What's collected / when ?
Once a day (the first call begins 10 minutes after the start of Traefik), we collect:
- the Traefik version number
- a hash of the configuration
- an **anonymized version** of the static configuration (token, user name, password, URL, IP, domain, email, etc, are removed).
!!! info
- We do not collect the dynamic configuration information (routers & services).
- We do not collect this data to run advertising programs.
- We do not sell this data to third-parties.
### Example of Collected Data
```toml tab="Original configuration"
[entryPoints]
[entryPoints.web]
address = ":80"
[api]
[providers.docker]
endpoint = "tcp://10.10.10.10:2375"
exposedByDefault = true
swarmMode = true
[providers.docker.TLS]
ca = "dockerCA"
cert = "dockerCert"
key = "dockerKey"
insecureSkipVerify = true
```
```toml tab="Resulting Obfuscated Configuration"
[entryPoints]
[entryPoints.web]
address = ":80"
[api]
[providers.docker]
endpoint = "xxxx"
exposedByDefault = true
swarmMode = true
[providers.docker.TLS]
ca = "xxxx"
cert = "xxxx"
key = "xxxx"
insecureSkipVerify = false
```
## The Code for Data Collection
If you want to dig into more details, here is the source code of the collecting system: [collector.go](https://github.com/containous/traefik/blob/master/pkg/collector/collector.go)
By default we anonymize all configuration fields, except fields tagged with `export=true`.

View File

@ -0,0 +1,100 @@
# Documentation
Features Are Better When You Know How to Use Them
{: .subtitle }
You've found something unclear in the documentation and want to give a try at explaining it better?
Let's see how.
## Building Documentation
### General
This [documentation](https://docs.traefik.io/) is built with [mkdocs](https://mkdocs.org/).
### Method 1: `Docker` and `make`
You can build the documentation and test it locally (with live reloading), using the `docs` target:
```bash
$ make docs
docker build -t traefik-docs -f docs.Dockerfile .
# […]
docker run --rm -v /home/user/go/github/containous/traefik:/mkdocs -p 8000:8000 traefik-docs mkdocs serve
# […]
[I 170828 20:47:48 server:283] Serving on http://0.0.0.0:8000
[I 170828 20:47:48 handlers:60] Start watching changes
[I 170828 20:47:48 handlers:62] Start detecting changes
```
!!! tip "Default URL"
Your local documentation server will run by default on [http://127.0.0.1:8000](http://127.0.0.1:8000).
If you only want to build the documentation without serving it locally, you can use the following command:
```bash
$ make docs-build
...
```
### Method 2: `mkdocs`
First, make sure you have `python` and `pip` installed.
```bash
$ python --version
Python 2.7.2
$ pip --version
pip 1.5.2
```
Then, install mkdocs with `pip`.
```bash
pip install --user -r requirements.txt
```
To build the documentation locally and serve it locally, run `mkdocs serve` from the root directory.
This will start a local server.
```bash
$ mkdocs serve
INFO - Building documentation...
INFO - Cleaning site directory
[I 160505 22:31:24 server:281] Serving on http://127.0.0.1:8000
[I 160505 22:31:24 handlers:59] Start watching changes
[I 160505 22:31:24 handlers:61] Start detecting changes
```
### Check the Documentation
To check that the documentation meets standard expectations (no dead links, html markup validity, ...), use the `docs-verify` target.
```bash
$ make docs-verify
docker build -t traefik-docs-verify ./script/docs-verify-docker-image ## Build Validator image
...
docker run --rm -v /home/travis/build/containous/traefik:/app traefik-docs-verify ## Check for dead links and w3c compliance
=== Checking HTML content...
Running ["HtmlCheck", "ImageCheck", "ScriptCheck", "LinkCheck"] on /app/site/basics/index.html on *.html...
```
!!! note "Clean & Verify"
If you've made changes to the documentation, it's safter to clean it before verifying it.
```bash
$ make docs-clean docs-verify
...
```
!!! note "Disabling Documentation Verification"
Verification can be disabled by setting the environment variable `DOCS_VERIFY_SKIP` to `true`:
```shell
DOCS_VERIFY_SKIP=true make docs-verify
...
DOCS_LINT_SKIP is true: no linting done.
```

Some files were not shown because too many files have changed in this diff Show More