docs | ||
integration | ||
middlewares | ||
providerTemplates | ||
script | ||
static | ||
templates | ||
tests | ||
vendor/github.com/docker/docker/autogen/dockerversion | ||
.gitignore | ||
adapters.go | ||
boltdb.go | ||
build.Dockerfile | ||
circle.yml | ||
configuration.go | ||
consul.go | ||
docker.go | ||
Dockerfile | ||
etcd.go | ||
file.go | ||
file_test.go | ||
generate.go | ||
glide.yaml | ||
kv.go | ||
LICENSE.md | ||
Makefile | ||
marathon.go | ||
provider.go | ||
README.md | ||
traefik.go | ||
traefik.sample.toml | ||
web.go | ||
zk.go |
Træfɪk is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease. It supports several backends (Docker 🐳, Mesos/Marathon, Consul, Etcd, Zookeeper, BoltDB, Rest API, file...) to manage its configuration automatically and dynamically.
Features
- No dependency hell, single binary made with go
- Simple json Rest API
- Simple TOML file configuration
- Multiple backends supported: Docker, Mesos/Marathon, Consul, Etcd, and more to come
- Watchers for backends, can listen change in backends to apply a new configuration automatically
- Hot-reloading of configuration. No need to restart the process
- Graceful shutdown http connections during hot-reloads
- Circuit breakers on backends
- Round Robin, rebalancer load-balancers
- Rest Metrics
- Tiny docker image included
- SSL backends support
- SSL frontend support
- WebUI
Demo
Here is a demo of Træfɪk using Docker backend, showing a load-balancing between two servers, hot reloading of configuration, and graceful shutdown.
Plumbing
- Oxy: an awsome proxy library made by Mailgun guys
- Gorilla mux: famous request router
- Negroni: web middlewares made simple
- Manners: graceful shutdown of http.Handler servers
Quick start
- The simple way: grab the latest binary from the releases page and just run it with the sample configuration file:
./traefik traefik.toml
- Use the tiny Docker image:
docker run -d -p 8080:8080 -p 80:80 -v $PWD/traefik.toml:/traefik.toml emilevauge/traefik
- From sources:
git clone https://github.com/EmileVauge/traefik
Documentation
You can find the complete documentation here.
Benchmarks
Refer to the benchmarks section in the documentation.
Web UI
You can access to a simple HTML frontend of Træfik.
Contributing
Building
You need either Docker and make
, or go
and glide
in order to build traefik.
Setting up your go
environment
- You need
go
v1.5 - You need to set
export GO15VENDOREXPERIMENT=1
environment variable - If you clone Træfɪk into something like
~/go/src/github.com/traefik
, yourGOPATH
variable will have to be set to~/go
: exportGOPATH=~/go
.
Using Docker
and Makefile
You need to run the binary
target. This will create binaries for
linux platform in the dist
folder.
$ 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.5
---> 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/emilevauge/traefik/"dist":/go/src/github.com/emilevauge/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*
Using glide
The idea behind glide
is the following :
- when checkout(ing) a project, run
glide up
to install (go get …
) the dependencies in theGOPATH
. - if you need another dependency, import and use it in
the source, and run
glide get github.com/Masterminds/cookoo
to save it invendor
and add it to yourglide.yaml
.
$ glide up --update-vendored
# generate
$ go generate
# Simple go build
$ go build
# Using gox to build multiple platform
$ gox "linux darwin" "386 amd64 arm" \
-output="dist/traefik_{{.OS}}-{{.Arch}}"
# run other commands like tests
$ go test ./...
ok _/home/vincent/src/github/vdemeester/traefik 0.004s
Tests
You can run unit tests using the test-unit
target and the
integration test using the test-integration
target.
$ 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/emilevauge/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/emilevauge/traefik 0.005s coverage: 4.1% of statements
Test success