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重定向即可。

img

耐心等待几分钟,或者查看日志

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防火墙,全免费。

先嫖个端口:

登录cloudflare,点击域名,点击规则,点击创建规则
img

我的规则如下:

自定义筛选表达式 SSL = TRUE 则 重写到18443
img
img

DNS打开小云朵,开启代理(CDN加速)
img

等几分钟生效即可不带端口的访问了。

路线大概是这样的

请求域名--cloudflare解析代理服务器地址--转发到你的18443端口服务器。

由cloudflare提供一级暴漏,你的IP,端口,就由cloudflare保护了。

作者:上官飞鸿

出处:https://www.cnblogs.com/jackadam/p/18697969

版权:本作品采用「知识共享-署名-非商业性-禁止演绎(CC-BY-NC-ND)」许可协议进行许可。

posted @   上官飞鸿  阅读(92)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源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
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示