You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
8.7 KiB
240 lines
8.7 KiB
9 months ago
|
---
|
||
|
title: NAS中安装Traefik
|
||
|
tags:
|
||
|
- 网络
|
||
|
- NAS技术
|
||
|
- 反向代理
|
||
|
categories: NAS服务
|
||
|
description: NAS中安装Traefik作反向代理
|
||
|
abbrlink: 2636364671
|
||
|
date: 2023-02-30 11:02:22
|
||
|
keywords:
|
||
|
---
|
||
|
>我在家里的NAS上使用docker搭建了许多服务,这些服务都使用traefik进行代理,当这些服务需要使用HTTPS时,我们可以使用Traefik的Let’s Encrypt来自动获取证书,本篇文章主要介绍Traefik的安装以及如何使用traefik来自动获取证书。
|
||
|
|
||
|
# 安装Traefik
|
||
|
我在NAS上的服务大部分都是采用docker-compose的方式进行安装,而traefik的反向代理对docker原生支持,所以我采用traefik作为所有服务的入口。当我们使用不同的域名,比如:gitea.dreamlyn.cn或者给blog.dreamlyn.cn来访问网站时,traefik会根据不同的域名,将访问代理到不同的docker容器。有兴趣深入了解traefik的可以参考[中文文档](https://www.traefik.tech/)或者[官方文档](https://doc.traefik.io/traefik/v2.9/)。
|
||
|
|
||
|
<img src="https://img.dreamlyn.cn:8443/i/2024/02/23/150652.webp">
|
||
|
|
||
|
traefik反向代理
|
||
|
对于traefik本身的安装,我也是采用了docker-compose的方式。
|
||
|
|
||
|
在nas上合适的位置创建目录,并创建如下文件。
|
||
|
|
||
|
<img src="https://img.dreamlyn.cn:8443/i/2024/02/23/150751.webp">
|
||
|
|
||
|
其中docker-compose文件如下:
|
||
|
|
||
|
```
|
||
|
---
|
||
|
version: "3"
|
||
|
services:
|
||
|
traefik:
|
||
|
image: traefik:latest
|
||
|
container_name: traefik
|
||
|
environment:
|
||
|
- PUID=1000
|
||
|
- PGID=1000
|
||
|
- TZ=Asia/Shanghai
|
||
|
volumes:
|
||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||
|
- ./configs/traefik.yml:/etc/traefik/traefik.yml
|
||
|
- ./configs/conf.d:/configs/conf.d:rw
|
||
|
ports:
|
||
|
- "80:80"
|
||
|
- "443:443"
|
||
|
labels:
|
||
|
- "traefik.enable=true"
|
||
|
#设置http
|
||
|
- "traefik.http.routers.traefik.entrypoints=web"
|
||
|
- "traefik.http.routers.traefik.service=traefik"
|
||
|
- "traefik.http.routers.traefik.rule=Host(`traefik.dreamlyn.cn`)"
|
||
|
#设定端口号,traefik本身有个dashboard,端口为8080
|
||
|
- "traefik.http.services.traefik.loadbalancer.server.port=8080"
|
||
|
restart: always
|
||
|
networks:
|
||
|
default:
|
||
|
external:
|
||
|
name: docker_default
|
||
|
```
|
||
|
traefik配置文件如下:
|
||
|
|
||
|
```
|
||
|
entryPoints:
|
||
|
web:
|
||
|
address: :80
|
||
|
websecure:
|
||
|
address: :443
|
||
|
# 两种Traefik的配置方式,
|
||
|
providers:
|
||
|
#docker配置方式
|
||
|
#可以在使用docker-compose安装wordpress的时候直接配置好wordpress的相关配置,而不需要修改traefik的任何东西。
|
||
|
docker:
|
||
|
exposedByDefault: false
|
||
|
defaultRule: "Host(`{{trimPrefix `/` .Name}}.dreamlyn.cn`)"
|
||
|
#file配置方式,反向代理非docker时使用,配置文件统一放在/configs/conf.d目录里
|
||
|
file:
|
||
|
watch: true
|
||
|
directory: /configs/conf.d
|
||
|
api:
|
||
|
debug: true
|
||
|
dashboard: true
|
||
|
insecure: true
|
||
|
#log:
|
||
|
# level: DEBUG
|
||
|
```
|
||
|
此时在traefik目录下执行如下命令:
|
||
|
```
|
||
|
# 创建docker网络,如果已经有docker_default网络,则不需要。
|
||
|
docker network create -d bridge --attachable=true docker_default
|
||
|
# 启动traefik
|
||
|
docker-compose up -d
|
||
|
# 查看启动日志
|
||
|
docker-compose logs -f
|
||
|
```
|
||
|
如果启动没有问题,那么就可以使用http://traefik.dreamlyn.cn:880来访问traefik的dashboard了。
|
||
|
|
||
|
# 使用DNS Challenge
|
||
|
当我们的服务需要使用HTTPS时,我们可以使用traefik的Let’s Encrypt来自动获取证书。Traefik有三种方式来使用Let’s Encrypt:TLS Challenge、HTTP Challenge和DNS Challenge。
|
||
|
|
||
|
其中TLS Challenge和HTTP Challenge两种方式较为简单,但是需要服务的访问端口为80或者443,而我们在家中的网络一般都是屏蔽了80和443端口的,所以需要使用较为复杂的DNS Challenge。
|
||
|
```
|
||
|
Let's Encrypt是一种自动获取HTTPS证书的方式,也就是我们设置好之后,不需要再去手动申请证书,然后各种配置了。
|
||
|
```
|
||
|
使用DNS Challenge有几个前置条件:
|
||
|
|
||
|
1. 确保域名的服务商在Traefik支持的域名服务商列表中(不在列表中时,请参考这篇文章对域名服务商进行修改)。
|
||
|
2. 确保使用DNS Challenge申请的域名使用的是A记录,并且正确解析到traefik服务上。(在NAS折腾记录:打通网络篇,我将DDNS的主机域名直接设置为了*.dreamlyn.cn就是这个原因)
|
||
|
|
||
|
<img src="https://img.dreamlyn.cn:8443/i/2024/02/23/151024.webp">
|
||
|
|
||
|
那么接下来就根据上面的原理一步步实现DNS Challenge。
|
||
|
|
||
|
## DNS设置
|
||
|
DNS Challenge自动获取HTTPS证书的一个过程是验证域名的归属权,这个过程是Traefik通过调用域名服务商的API自动进行的(Traefik支持的域名服务商参考[这里](https://doc.traefik.io/traefik/https/acme/#providers)),而Traefik调用API的时候,是需要SecretId和SecretKey的,接下来具体操作。
|
||
|
|
||
|
到 https://doc.traefik.io/traefik/https/acme/#providers 查看Traefik是否支持自己所购买的域名服务商,如果不支持也没关系,参考[这篇文章](https://www.dreamlyn.cn/40925.html),将域名服务商修改为DNSPOD(被腾讯收购后改为了Tencent Cloud DNS)。
|
||
|
|
||
|
在DNSPOD的控制台中,如下图所示点击API密钥中。
|
||
|
|
||
|
<img src="https://img.dreamlyn.cn:8443/i/2024/02/23/151239.webp">
|
||
|
|
||
|
新建密钥。
|
||
|
|
||
|
<img src="https://img.dreamlyn.cn:8443/i/2024/02/23/151305.webp">
|
||
|
|
||
|
## 修改docker-compose.yml
|
||
|
如图,在相应位置创建acme.json。需要使用命令`chmod 600 acme.json`将acme.json文件权限调整为600
|
||
|
|
||
|
<img src="https://img.dreamlyn.cn:8443/i/2024/02/23/151412.webp">
|
||
|
|
||
|
修改docker-compose.yml,确保下图红框部分正确配置。
|
||
|
|
||
|
<img src="https://img.dreamlyn.cn:8443/i/2024/02/23/151443.webp">
|
||
|
|
||
|
最终代码如下:
|
||
|
|
||
|
```
|
||
|
---
|
||
|
version: "2.1"
|
||
|
services:
|
||
|
traefik:
|
||
|
image: traefik
|
||
|
container_name: traefik
|
||
|
environment:
|
||
|
- PUID=1000
|
||
|
- PGID=1000
|
||
|
- TZ=Asia/Shanghai
|
||
|
# 因为家中的服务端口不是443,在使用Let’s Encrypt时只能用DNS Challenge的方式
|
||
|
# 前期如果不需要HTTPS,可以忽略
|
||
|
- "TENCENTCLOUD_SECRET_ID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
|
||
|
- "TENCENTCLOUD_SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
||
|
|
||
|
volumes:
|
||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||
|
- ./configs/traefik.yml:/etc/traefik/traefik.yml
|
||
|
# 如果不用HTTPS,可以忽略acem.json
|
||
|
# 用的话,需要使用 chmod 600 acme.json 命令修改文件的权限
|
||
|
- ./configs/acme.json:/configs/acme.json:rw
|
||
|
- ./configs/conf.d:/configs/conf.d:rw
|
||
|
- ./configs/certs:/configs/certs
|
||
|
ports:
|
||
|
- "80:80"
|
||
|
- "443:443"
|
||
|
labels:
|
||
|
- "traefik.enable=true"
|
||
|
#设置http
|
||
|
- "traefik.http.routers.traefik.entrypoints=web"
|
||
|
- "traefik.http.routers.traefik.service=traefik"
|
||
|
- "traefik.http.routers.traefik.rule=Host(`traefik.dreamlyn.cn`)"
|
||
|
#设定端口号,traefik本身有个dashboard,端口为8080
|
||
|
- "traefik.http.services.traefik.loadbalancer.server.port=8080"
|
||
|
restart: always
|
||
|
networks:
|
||
|
default:
|
||
|
external:
|
||
|
name: docker_default
|
||
|
```
|
||
|
## 修改traefik.yml
|
||
|
修改traefik.yml文件,确保红框部分的正确配置。
|
||
|
|
||
|
<img src="https://img.dreamlyn.cn:8443/i/2024/02/23/151535.webp">
|
||
|
|
||
|
最终代码如下:
|
||
|
|
||
|
```
|
||
|
entryPoints:
|
||
|
web:
|
||
|
address: :80
|
||
|
websecure:
|
||
|
address: :443
|
||
|
# 不使用HTTPS的话,下面可以忽略
|
||
|
http:
|
||
|
tls:
|
||
|
certResolver: letsencrypt
|
||
|
domains:
|
||
|
- main: dreamlyn.cn
|
||
|
sans:
|
||
|
- "*.dreamlyn.cn"
|
||
|
# 两种配置方式,
|
||
|
providers:
|
||
|
#docker配置方式
|
||
|
#比如:可以在使用docker-compose安装wordpress的时候直接配置好wordpress的相关配置,而不需要修改traefik的任何东西。
|
||
|
docker:
|
||
|
exposedByDefault: false
|
||
|
defaultRule: "Host(`{{trimPrefix `/` .Name}}.dreamlyn.cn`)"
|
||
|
#file配置方式,反向代理非docker时使用,比如群晖上的Plex,配置文件统一放在/configs/conf.d目录里
|
||
|
file:
|
||
|
watch: true
|
||
|
directory: /configs/conf.d
|
||
|
#注意,letsencrypt在服务器无法开放80和443端口的情况下无法使用tls和http,暂时不用。
|
||
|
#后来发现DNS的服务商可以修改,故将花生壳的DNS服务商修改为DNSPod,可以使用DNS-01进行自动tls申请
|
||
|
certificatesResolvers:
|
||
|
letsencrypt:
|
||
|
acme:
|
||
|
email: lyn@dreamlyn.cn
|
||
|
storage: /configs/acme.json
|
||
|
dnschallenge:
|
||
|
provider: tencentcloud
|
||
|
api:
|
||
|
debug: true
|
||
|
dashboard: true
|
||
|
insecure: true
|
||
|
#log:
|
||
|
# level: DEBUG
|
||
|
```
|
||
|
## 运行Traefik
|
||
|
在traefik目录下执行如下命令:
|
||
|
```
|
||
|
# 创建docker网络,如果已经有docker_default网络,则不需要。
|
||
|
docker network create -d bridge --attachable=true docker_default
|
||
|
# 启动traefik
|
||
|
docker-compose up -d
|
||
|
# 查看启动日志
|
||
|
docker-compose logs -f
|
||
|
```
|
||
|
如果日志没有问题的话,我们就可以通过http://traefik.dreamlyn.cn:880来访问了。
|
||
|
|
||
|
至此,Traefik的安装已经完成了。
|