Traefik新一代反代服务器,兼容所有主要的集群技术(二)
简介#
笔记将记录如何使用docker配置traefik,代理一个gitea,自动申请tls证书,cloudflare反代80,443端口一系列实操。
daemon.json配置如下,主要是为了IPv6能访问,以及更改了主存储位置,配置了docker代理。
{
"data-root": "/storage/docker",
"ipv6": true,
"fixed-cidr-v6": "fc00:0:0:1::/64",
"experimental": true,
"ip6tables": true,
"registry-mirrors": [
"https://*******.top"
]
}
启动traefik#
compose.yaml如下:
services:
reverse-proxy:
# The official v3 Traefik docker image
image: traefik:v3.3
# Enables the web UI and tells Traefik to listen to docker
command:
# 测试环境,启用api
- "--api.insecure=true"
# 启用监听docker
- "--providers.docker"
# 入口点 HTTP 80
- "--entryPoints.web.address=:80"
# 入口点 HTTPS 443
- "--entryPoints.websecure.address=:443"
ports:
# 突破家庭宽带,用18080
- "18080:80"
# The Web UI (enabled by --api.insecure=true)
- "8080:8080"
# 突破家庭宽带,用18443
- "18443:443"
volumes:
# 监听docker映射
- "/var/run/docker.sock:/var/run/docker.sock"
- "./letsencrypt:/letsencrypt"
networks:
#未设置网络时,使用默认网络
default:
#自定义默认网络名
name: mynet
#启用ipv6
enable_ipv6: true
能通过http://ip:8080访问即可。IPV6也可以试试。
启动gitea#
compose.yaml如下:
services:
server:
image: jackadam/gitea-arm:1.23.1
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
restart: always
ports:
- "3000:3000"
- "222:22"
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
networks:
#未设置网络时,使用默认网络
default:
#自定义默认网络名
name: mynet
#启用ipv6
enable_ipv6: true
能通过http://ip:3000访问即可。IPV6也可以试试。
互联互通#
networks:
#未设置网络时,使用默认网络
default:
#自定义默认网络名
name: mynet
#启用ipv6
enable_ipv6: true
两个compose都配置了这样的网络设置,在服务容器启动时如果没有配置网络,那么将使用默认网络mynet,并启用IPv6。
如果不配置默认网络名,那么这两个compose将自动创建网络,两个容器就不通了。
Traefik HTTP代理Gitea#
由于traefik监听docker,所以仅需配置gitea的启动项即可被traefik自动发现。省去了以前nginx配置代理,被代理的节点没启动,nginx还要报错。
修改gitea的compose.yaml
services:
server:
image: jackadam/gitea-arm:1.23.1
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
restart: always
# ports:
# - "3000:3000"
# - "222:22"
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
labels:
- "traefik.enable=true"
- "traefik.http.routers.gitea.rule=Host(`git.jackadam.top`)" # 替换为你的域名
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
networks:
#未设置网络时,使用默认网络
default:
#自定义默认网络名
name: mynet
#启用ipv6
enable_ipv6: true
主要添加labels,enable,开启traefik代理监听。
启用路由,routers.gitea.rule,添加gitea路由,Host主机是 git.jackadam.top
services.gitea服务gitea,loadbalancer负载均衡,server.port,服务端口 3000。不改的话,默认80。
删除了默认的端口映射。
不管你是改host还是注册DNS,可以试试了。
我的是访问http://git.jackadam.top:18080。
访问traefik的18080,由traefik,经mynet网络转发到gitea未暴漏的3000。
Traefik申请证书#
记得这里的myresolver,这个叫证书管理器。
services:
reverse-proxy:
# The official v3 Traefik docker image
image: traefik
restart: always
command:
- "--certificatesresolvers.myresolver.acme.dnschallenge=true"
- "--certificatesresolvers.myresolver.acme.dnschallenge.provider=cloudflare"
- "--certificatesresolvers.myresolver.acme.email=jackadam1981@hotmail.com"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
# Enable Traefik logging
- "--log.level=DEBUG"
- "--log.filePath=/var/log/traefik.log"
environment:
- CF_DNS_API_TOKEN=AsfVcuQ************************
volumes:
# 监听docker映射
- "/var/run/docker.sock:/var/run/docker.sock"
- "./letsencrypt:/letsencrypt"
# Mount a volume for logs
- "./logs:/var/log"
代码多,就不全贴了。
command 添加四行:#
dnschallenge,DNS域名挑战,就是要证明域名是你的。
dnschallenge.provider=cloudflare" DNS挑战使用的cloudflare接口插件。
email,cloudflare账号的邮箱
storage=/letsencrypt/acme.json" 证书存储路径
command关于日志添加两行#
记录等级 level
记录位置 filePath
environment添加一行#
cloudflare申请的API TOKEN,权限只要DNS完整权限就好了。建议单独申请。
volumes添加两行#
关于日志:"./logs:/var/log"
关于证书:"./letsencrypt:/letsencrypt"
Gitea申请证书#
services:
server:
image: jackadam/gitea-arm:1.23.1
container_name: gitea
labels:
- "traefik.enable=true"
- "traefik.http.routers.gitea.rule=Host(`git.jackadam.top`)" # 替换为你的域名
- "traefik.http.routers.gitea.entrypoints=websecure"
- "traefik.http.routers.gitea.tls.certresolver=myresolver"
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
一样是能精简的都精简了。
labels添加两行:
entrypoints=websecure 入口点改websecure https
certresolver=myresolver 使用证书管理器 myresolver
申请证书测试#
重启两个容器以后,可以通过https来访问了。但是证书是traefik的证书,并不受信。要耐心等待acme 到Let's Encrypt申请证书。
同时还有域名挑战,默认的是80端口,可是我家用宽带80被封禁,只能使用 DNS挑战了。
traefik会通过设置一个随机字符串的TXT格式的DNS解析,等待一会儿生效后再验证这个TXT记录来证明域名是你的,才能给你发证书。
坑:#
openwrt的DNS劫持会使DNS无法返回TXT格式的解析记录,导致无法通过DNS域名挑战。
正常的时候时可以查询到txt记录的。
#nslookup -type=txt example.com
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
example.com text = "_k2n1y4vw3qtb4skdx9e7dxt97qrmmq9"
example.com text = "v=spf1 -all"
关闭这个DNS重定向即可。
耐心等待几分钟,或者查看日志
tail -f logs/traefik.log
Certificates obtained for domains [git.jackadam.top] ACME CA=https://acme-v02.api.letsencrypt.org/directory acmeCA=https://acme-v02.api.letsencrypt.org/directory providerName=myresolver.acme routerName=gitea@docker rule=Host(git.jackadam.top
)
这就是申请成功的日志了。
白嫖Cloudflare#
谁也不想用带端口的地址示人。但是家用宽带的80 443都被封禁了。
不止嫖端口,还要嫖CDN加速,DDOS防火墙……
赛博活佛cloudflare,就提供了这样的功能。
端口映射,cdn加速,ddos防火墙,全免费。
先嫖个端口:
我的规则如下:
自定义筛选表达式 SSL = TRUE 则 重写到18443
等几分钟生效即可不带端口的访问了。
路线大概是这样的
请求域名--cloudflare解析代理服务器地址--转发到你的18443端口服务器。
由cloudflare提供一级暴漏,你的IP,端口,就由cloudflare保护了。
作者:上官飞鸿
出处:https://www.cnblogs.com/jackadam/p/18697969
版权:本作品采用「知识共享-署名-非商业性-禁止演绎(CC-BY-NC-ND)」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2023-02-04 fedora37 手动安装cockpit
2018-02-04 python *args **kwargs,传入不固定的参数给函数,或者传入很多的内容给函数,常用在构造函数中。
2018-02-04 pyinstaller 把你的程序变成windows的可执行程序。py exe UPX