From 4152bd5e26130ccc70fc631eb1c66b8b83b3e18b Mon Sep 17 00:00:00 2001 From: emile Date: Mon, 1 Feb 2016 16:09:13 +0100 Subject: [PATCH] Update doc with entrypoints --- README.md | 20 ++++++-- docs/img/apollo-logo.png | Bin 0 -> 7417 bytes docs/img/mantl-logo.png | Bin 0 -> 19533 bytes docs/index.md | 107 +++++++++++++++++++++++++++++++-------- traefik.sample.toml | 56 +++++++++++++++----- 5 files changed, 147 insertions(+), 36 deletions(-) create mode 100644 docs/img/apollo-logo.png create mode 100644 docs/img/mantl-logo.png diff --git a/README.md b/README.md index d58ab6e46..05da4a276 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ ![Træfɪk](http://traefik.github.io/traefik.logo.svg "Træfɪk") ___ -[![Circle CI](https://circleci.com/gh/emilevauge/traefik.svg?style=shield&circle-token=:circle-token)](https://circleci.com/gh/emilevauge/traefik) -[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/EmileVauge/traefik/blob/master/LICENSE.md) +[![Circle CI](https://circleci.com/gh/emilevauge/traefik/tree/master.png?circle-token)](https://circleci.com/gh/emilevauge/traefik) +[![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/EmileVauge/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) @@ -22,7 +22,7 @@ It supports several backends ([Docker :whale:](https://www.docker.com/), [Mesos/ - Circuit breakers on backends - Round Robin, rebalancer load-balancers - Rest Metrics -- Tiny docker image included +- Tiny docker image included [![Image Layers](https://badge.imagelayers.io/emilevauge/traefik:latest.svg)](https://imagelayers.io/?images=emilevauge/traefik:latest 'Image Layers') - SSL backends support - SSL frontend support - Clean AngularJS Web UI @@ -76,6 +76,20 @@ You can find the complete documentation [here](docs/index.md). Refer to the [benchmarks section](docs/index.md#benchmarks) in the documentation. +## Træfɪk here and there + +These projects use Træfɪk internally. If your company uses Træfɪk, we would be glad to get your feedback :) Contact us on [![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) + +- Project [Mantl](http://http://mantl.io/) from Cisco + +![Web UI Providers](docs/img/mantl-logo.png) +> Mantl is a modern platform for rapidly deploying globally distributed services. A container orchestrator, docker, a network stack, something to pool your logs, something to monitor health, a sprinkle of service discovery and some automation. + +- Project [Apollo](http://capgemini.github.io/devops/apollo/) from Cap Gemini + +![Web UI Providers](docs/img/apollo-logo.png) +> Apollo is an open source project to aid with building and deploying IAAS and PAAS services. It is particularly geared towards managing containerized applications across multiple hosts, and big data type workloads. Apollo leverages other open source components to provide basic mechanisms for deployment, maintenance, and scaling of infrastructure and applications. + ## Contributing ### Building diff --git a/docs/img/apollo-logo.png b/docs/img/apollo-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc9659981885cb1708f19ecc9991ae44ca94b79 GIT binary patch literal 7417 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 TRR%bn0k+3uulvuenC$-opA*$Y literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index a4239409d..0ec4ebc92 100644 --- a/docs/index.md +++ b/docs/index.md @@ -39,8 +39,7 @@ Frontends can be defined using the following rules: A frontend is a set of rules that forwards the incoming http traffic to a backend. - You can optionally enable `passHostHeader` to -- []forward client `Host` header to the backend. + You can optionally enable `passHostHeader` to forward client `Host` header to the backend. ### HTTP Backends @@ -103,13 +102,13 @@ Flags: --boltdb.filename string Override default configuration template. For advanced users :) --boltdb.prefix string Prefix used for KV store (default "/traefik") --boltdb.watch Watch provider (default true) - --certificates value SSL certificates and keys pair, ie 'tests/traefik.crt,tests/traefik.key'. You may add several certificate/key pairs to terminate HTTPS for multiple domain names using TLS SNI -c, --configFile string Configuration file to use (TOML, JSON, YAML, HCL). --consul Enable Consul backend --consul.endpoint string Consul server endpoint (default "127.0.0.1:8500") --consul.filename string Override default configuration template. For advanced users :) --consul.prefix string Prefix used for KV store (default "/traefik") --consul.watch Watch provider (default true) + --defaultEntryPoints value Entrypoints to be used by frontends that do not specify any entrypoint (default &main.DefaultEntryPoints(nil)) --docker Enable Docker backend --docker.domain string Default domain used --docker.endpoint string Docker server endpoint. Can be a tcp or a unix socket endpoint (default "unix:///var/run/docker.sock") @@ -120,6 +119,7 @@ Flags: --docker.tls.insecureSkipVerify TLS insecure skip verify --docker.tls.key string TLS key --docker.watch Watch provider (default true) + --entryPoints value Entrypoints definition using format: --entryPoints='Name:http Address::8000 Redirect.EntryPoint:https' --entryPoints='Name:https Address::4442 TLS:tests/traefik.crt,tests/traefik.key' --etcd Enable Etcd backend --etcd.endpoint string Etcd server endpoint (default "127.0.0.1:4001") --etcd.filename string Override default configuration template. For advanced users :) @@ -162,12 +162,45 @@ Use "traefik [command] --help" for more information about a command. # Global configuration ################################################################ -# Reverse proxy port +# Entrypoints definition # # Optional -# Default: ":80" +# Default: +# [entryPoints] +# [entryPoints.http] +# address = ":80" # -# port = ":80" +# To redirect an http entrypoint to an https entrypoint (with SNI support): +# [entryPoints] +# [entryPoints.http] +# address = ":80" +# [entryPoints.http.redirect] +# entryPoint = "https" +# [entryPoints.https] +# address = ":443" +# [entryPoints.https.tls] +# [[entryPoints.https.tls.certificates]] +# CertFile = "integration/fixtures/https/snitest.com.cert" +# KeyFile = "integration/fixtures/https/snitest.com.key" +# [[entryPoints.https.tls.certificates]] +# CertFile = "integration/fixtures/https/snitest.org.cert" +# KeyFile = "integration/fixtures/https/snitest.org.key" +# +# To redirect an entrypoint rewriting the URL: +# [entryPoints] +# [entryPoints.http] +# address = ":80" +# [entryPoints.http.redirect] +# regex = "^http://localhost/(.*)" +# replacement = "http://mydomain/$1" + +# Entrypoints to be used by frontends that do not specify any entrypoint. +# Each frontend can specify its own entrypoints. +# +# Optional +# Default: ["http"] +# +# defaultEntryPoints = ["http", "https"] # Timeout in seconds. # Duration to give active requests a chance to finish during hot-reloads @@ -197,15 +230,6 @@ Use "traefik [command] --help" for more information about a command. # # logLevel = "ERROR" -# SSL certificates and keys -# You may add several certificate/key pairs to terminate HTTPS for multiple domain names using TLS SNI -# -# Optional -# -# [[certificates]] -# CertFile = "traefik.crt" -# KeyFile = "traefik.key" - # Backends throttle duration: minimum duration between 2 events from providers # before applying a new configuration. It avoids unnecessary reloads if multiples events # are sent in a short amount of time. @@ -234,7 +258,21 @@ Like any other reverse proxy, Træfɪk can be configured with a file. You have t ```toml # traefik.toml -port = ":80" +defaultEntryPoints = ["http", "https"] +[entryPoints] + [entryPoints.http] + address = ":80" + [entryPoints.http.redirect] + entryPoint = "https" + [entryPoints.https] + address = ":443" + [entryPoints.https.tls] + [[entryPoints.https.tls.certificates]] + CertFile = "integration/fixtures/https/snitest.com.cert" + KeyFile = "integration/fixtures/https/snitest.com.key" + [[entryPoints.https.tls.certificates]] + CertFile = "integration/fixtures/https/snitest.org.cert" + KeyFile = "integration/fixtures/https/snitest.org.key" graceTimeOut = 10 logLevel = "DEBUG" @@ -270,7 +308,13 @@ logLevel = "DEBUG" [frontends.frontend2] backend = "backend1" passHostHeader = true - [frontends.frontend2.routes.test_2] + entrypoints = ["https"] # overrides defaultEntryPoints + [frontends.frontend2.routes.test_1] + rule = "Host" + value = "{subdomain:[a-z]+}.localhost" + [frontends.frontend3] + entrypoints = ["http", "https"] # overrides defaultEntryPoints + backend = "backend2" rule = "Path" value = "/test" ``` @@ -279,7 +323,20 @@ logLevel = "DEBUG" ```toml # traefik.toml -port = ":80" +[entryPoints] + [entryPoints.http] + address = ":80" + [entryPoints.http.redirect] + entryPoint = "https" + [entryPoints.https] + address = ":443" + [entryPoints.https.tls] + [[entryPoints.https.tls.certificates]] + CertFile = "integration/fixtures/https/snitest.com.cert" + KeyFile = "integration/fixtures/https/snitest.com.key" + [[entryPoints.https.tls.certificates]] + CertFile = "integration/fixtures/https/snitest.org.cert" + KeyFile = "integration/fixtures/https/snitest.org.key" graceTimeOut = 10 logLevel = "DEBUG" @@ -318,10 +375,15 @@ filename = "rules.toml" [frontends.frontend2] backend = "backend1" passHostHeader = true - [frontends.frontend2.routes.test_2] + entrypoints = ["https"] # overrides defaultEntryPoints + [frontends.frontend2.routes.test_1] + rule = "Host" + value = "{subdomain:[a-z]+}.localhost" + [frontends.frontend3] + entrypoints = ["http", "https"] # overrides defaultEntryPoints + backend = "backend2" rule = "Path" value = "/test" - ``` If you want Træfɪk to watch file changes automatically, just add: @@ -534,6 +596,7 @@ Labels can be used on containers to override default behaviour: - `traefik.frontend.rule=Host`: override the default frontend rule (Default: Host). See [frontends](#frontends). - `traefik.frontend.value=test.example.com`: override the default frontend value (Default: `{containerName}.{domain}`) See [frontends](#frontends). Must be associated with label traefik.frontend.rule. - `traefik.frontend.passHostHeader=true`: forward client `Host` header to the backend. +- `traefik.frontend.entryPoints=http,https`: assign this frontend to entry points `http` and `https`. Overrides `defaultEntryPoints`. * `traefik.domain=traefik.localhost`: override the default domain @@ -598,6 +661,7 @@ Labels can be used on containers to override default behaviour: - `traefik.frontend.rule=Host`: override the default frontend rule (Default: Host). See [frontends](#frontends). - `traefik.frontend.value=test.example.com`: override the default frontend value (Default: `{appName}.{domain}`) See [frontends](#frontends). Must be associated with label traefik.frontend.rule. - `traefik.frontend.passHostHeader=true`: forward client `Host` header to the backend. +- `traefik.frontend.entryPoints=http,https`: assign this frontend to entry points `http` and `https`. Overrides `defaultEntryPoints`. * `traefik.domain=traefik.localhost`: override the default domain ## Consul backend @@ -676,6 +740,7 @@ The Keys-Values structure should look (using `prefix = "/traefik"`): |----------------------------------------------------|------------| | `/traefik/frontends/frontend2/backend` | `backend1` | | `/traefik/frontends/frontend2/passHostHeader` | `true` | +| `/traefik/frontends/frontend2/entrypoints` |`http,https`| | `/traefik/frontends/frontend2/routes/test_2/rule` | `Path` | | `/traefik/frontends/frontend2/routes/test_2/value` | `/test` | @@ -756,6 +821,7 @@ The Keys-Values structure should look (using `prefix = "/traefik"`): |----------------------------------------------------|------------| | `/traefik/frontends/frontend2/backend` | `backend1` | | `/traefik/frontends/frontend2/passHostHeader` | `true` | +| `/traefik/frontends/frontend2/entrypoints` |`http,https`| | `/traefik/frontends/frontend2/routes/test_2/rule` | `Path` | | `/traefik/frontends/frontend2/routes/test_2/value` | `/test` | @@ -835,6 +901,7 @@ The Keys-Values structure should look (using `prefix = "/traefik"`): |----------------------------------------------------|------------| | `/traefik/frontends/frontend2/backend` | `backend1` | | `/traefik/frontends/frontend2/passHostHeader` | `true` | +| `/traefik/frontends/frontend2/entrypoints` |`http,https`| | `/traefik/frontends/frontend2/routes/test_2/rule` | `Path` | | `/traefik/frontends/frontend2/routes/test_2/value` | `/test` | diff --git a/traefik.sample.toml b/traefik.sample.toml index 7d120959b..3f77ea863 100644 --- a/traefik.sample.toml +++ b/traefik.sample.toml @@ -2,12 +2,45 @@ # Global configuration ################################################################ -# Reverse proxy port +# Entrypoints definition # # Optional -# Default: ":80" +# Default: +# [entryPoints] +# [entryPoints.http] +# address = ":80" # -# port = ":80" +# To redirect an http entrypoint to an https entrypoint (with SNI support): +# [entryPoints] +# [entryPoints.http] +# address = ":80" +# [entryPoints.http.redirect] +# entryPoint = "https" +# [entryPoints.https] +# address = ":443" +# [entryPoints.https.tls] +# [[entryPoints.https.tls.certificates]] +# CertFile = "integration/fixtures/https/snitest.com.cert" +# KeyFile = "integration/fixtures/https/snitest.com.key" +# [[entryPoints.https.tls.certificates]] +# CertFile = "integration/fixtures/https/snitest.org.cert" +# KeyFile = "integration/fixtures/https/snitest.org.key" +# +# To redirect an entrypoint rewriting the URL: +# [entryPoints] +# [entryPoints.http] +# address = ":80" +# [entryPoints.http.redirect] +# regex = "^http://localhost/(.*)" +# replacement = "http://mydomain/$1" + +# Entrypoints to be used by frontends that do not specify any entrypoint. +# Each frontend can specify its own entrypoints. +# +# Optional +# Default: ["http"] +# +# defaultEntryPoints = ["http", "https"] # Timeout in seconds. # Duration to give active requests a chance to finish during hot-reloads @@ -37,15 +70,6 @@ # # logLevel = "ERROR" -# SSL certificates and keys -# You may add several certificate/key pairs to terminate HTTPS for multiple domain names using TLS SNI -# -# Optional -# -# [[certificates]] -# CertFile = "traefik.crt" -# KeyFile = "traefik.key" - # Backends throttle duration: minimum duration between 2 events from providers # before applying a new configuration. It avoids unnecessary reloads if multiples events # are sent in a short amount of time. @@ -390,6 +414,12 @@ # [frontends.frontend2] # backend = "backend1" # passHostHeader = true -# [frontends.frontend2.routes.test_2] +# entrypoints = ["https"] # overrides defaultEntryPoints +# [frontends.frontend2.routes.test_1] +# rule = "Host" +# value = "{subdomain:[a-z]+}.localhost" +# [frontends.frontend3] +# entrypoints = ["http", "https"] # overrides defaultEntryPoints +# backend = "backend2" # rule = "Path" # value = "/test"