具有安全仪表板和 Let's Encrypt 的 Traefik docker-compose 配置

此配置仅提供让 Traefik 仪表板在 Let’s Encrypt 驱动的 SSL 加密和用户认证下运行的最小配置。它还将所有 HTTP 请求重定向到 HTTPS,以避免不安全地访问仪表板和其他服务。

Let’s Encrypt 使用 HTTP-01 挑战。这意味着 Traefik 必须可以从互联网通过端口 80 访问。

为了安装 docker 和 docker-compose,请参见如何在 30 秒内在 Ubuntu 上安装 docker 和 docker-compose

首先准备目录(/var/lib/traefik):

setup-traefik-dir.sh
sudo mkdir /var/lib/traefik
sudo chown -R $USER: /var/lib/traefik
cd /var/lib/traefik
mkdir acme conf

现在创建 docker-compose.yml

docker-compose-traefik.yml
services:
  traefik:
    image: "traefik:v2.3"
    container_name: "traefik"
    command:
      - "--api=true"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./acme:/etc/traefik/acme"
      - "./traefik.toml:/etc/traefik/traefik.toml"
      - "./conf:/etc/traefik/conf"

现在创建主 traefik.toml 配置文件:

traefik.toml
defaultEntryPoints = ["http", "https"]

[api]
dashboard = true

# 你可以在 /var/lib/traefik/traefik.conf 中创建配置文件,Traefik 将自动重新加载它们
[providers]
[providers.file]
directory = "/etc/traefik/conf/"
watch = true

# 如果你不需要那么多调试输出,将此更改为 INFO
[log]
level = "DEBUG"

[entryPoints.web]
address = ":80"
[entryPoints.web.http]
[entryPoints.web.http.redirections]
[entryPoints.web.http.redirections.entryPoint]
to = "websecure"
scheme = "https"
[entryPoints.websecure]
address = ":443"

[certificatesResolvers.letsencrypttls.acme]
# TODO 在此处添加你的邮箱
email = "[email protected]"
storage = "/etc/traefik/acme/acme.json"
[certificatesResolvers.letsencrypttls.acme.httpChallenge]
entryPoint = "web"

现在我们需要在 conf/api.toml 中创建 API 配置文件:

conf-api.toml
[http.routers.traefik-api]
# TODO: 在此处设置你的域名!!!
rule = "Host(`traefik.example.com`)"
service = "api@internal"
middlewares = ["auth"]
[http.routers.traefik-api.tls]
certresolver = "letsencrypttls"
[http.middlewares.auth.basicAuth]
# TODO 在此处添加你的管理员用户和密码,例如使用 https://wtools.io/generate-htpasswd-online 生成
users = [
  "admin:$1$ySFBr~_y$GsKgEasDQkpCX8sO8vNia0",
]

不要忘记更改配置文件中的邮箱地址和域名(由 TODO 标记)。确保你已正确设置所有 DNS 记录,以便你的域名指向运行 Traefik 的服务器!

现在是首次启动 Traefik 的时候了:

docker-compose-up.sh
docker-compose up

Traefik 将需要几秒钟自动为你的域名生成 Let’s Encrypt 证书。一旦你看到类似这样的消息

traefik-log.txt
traefik    | time="2020-09-20T23:48:30Z" level=debug msg="Certificates obtained for domains [traefik.mydomain.com]" providerName=letsencrypttls.acme routerName=traefik-api@file rule="Host(`traefik.mydomain.com`)"

证书即可用并自动加载。

现在你可以访问 https://traefik.mydomain.com/,使用你生成的用户名和密码登录并查看仪表板。

成功设置后的 Traefik 仪表板 Web 界面

如果需要,你还可以设置 systemd 服务以在开机时自动启动 Traefik(使用 docker-compose systemd .service 生成器 生成)。为此,首先如果你仍然打开终端,使用 Ctrl-C 停止正在运行的 docker-compose 实例并运行 docker-compose down

现在将此添加为 /etc/systemd/system/traefik.service

traefik.service
[Unit]
Description=traefik
Requires=docker.service
After=docker.service

[Service]
Restart=always
User=root
Group=docker
WorkingDirectory=/var/lib/traefik
# 单元停止时关闭容器(如果正在运行)
ExecStartPre=/usr/local/bin/docker-compose -f docker-compose.yml down -v
# 单元启动时启动容器
ExecStart=/usr/local/bin/docker-compose -f docker-compose.yml up
# 单元停止时停止容器
ExecStop=/usr/local/bin/docker-compose -f docker-compose.yml down -v

[Install]
WantedBy=multi-user.target

并运行

systemd-enable-traefik.sh
sudo systemctl enable traefik.service
sudo systemctl start traefik.service

Check out similar posts by category: Traefik