家用住宅主机Linux Traefik反向代理容器多站点
为什么要在家用主机上使用Traefik反向代理
如果你有一台Linux家用服务器,
想跑多个Web服务(比如博客、
导航页、
文件管理器),
直接用端口区分既麻烦又不安全。Traefik 是一个专为容器环境设计的反向代理工具,
能自动发现Docker容器,
自动申请HTTPS证书,
非常适合家用场景下的多站点管理。
本文假设你有基础的Linux操作能力(会使用终端),其余步骤按顺序来即可。
前置准备:硬件与软件要求
- 一台运行Linux的家庭主机(推荐Ubuntu 22.04或Debian 11)。
- 确保设备有公网IP(或内网穿透能力),并已将域名(例如
site1.example.com)解析到主机IP。 - 安装 Docker 和 Docker Compose。如果没有,请先执行以下命令:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
# 重新登录或 newgrp docker 使生效
sudo apt install docker-compose-plugin # 或安装 docker-compose 独立命令
注意:如果你使用的是轻量云主机或内网环境,需要先配置好端口映射和域名解析。
第一步:编写Traefik的Compose配置文件
创建一个项目目录,并编写 docker-compose.yml:
version: '3.8'
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./config:/etc/traefik
- ./letsencrypt:/letsencrypt
networks:
- web
networks:
web:
external: true
如果 web 网络未创建,先运行:
docker network create web
接着创建 config/traefik.yaml 核心配置:
api:
dashboard: true
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: web
certificatesResolvers:
letsencrypt:
acme:
email: your-email@example.com
storage: /letsencrypt/acme.json
httpChallenge:
entryPoint: web
启动 Traefik:
docker compose up -d
打开浏览器访问 http://你的IP:8080 可看到 Dashboard(安全起见生产环境不建议暴露端口,可后续调整)。
第二步:添加第一个容器站点
以简单的 nginx 静态网站为例,新建另一个 docker-compose.yml 或使用以下命令启动:
version: '3.8'
services:
site1:
image: nginx:alpine
container_name: site1
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.site1.rule=Host(`site1.example.com`)"
- "traefik.http.routers.site1.entrypoints=websecure"
- "traefik.http.routers.site1.tls.certresolver=letsencrypt"
networks:
- web
networks:
web:
external: true
启动后,Traefik 会自动发现该容器,并为 site1.example.com 申请 SSL 证书。
稍等几秒,访问 https://site1.example.com 就能看到 Nginx 默认页面。
第三步:部署第二个站点(以 Portainer 为例)
同理,再创建一个 docker-compose-site2.yml:
version: '3.8'
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./portainer_data:/data
labels:
- "traefik.enable=true"
- "traefik.http.routers.portainer.rule=Host(`admin.example.com`)"
- "traefik.http.routers.portainer.entrypoints=websecure"
- "traefik.http.routers.portainer.tls.certresolver=letsencrypt"
networks:
- web
networks:
web:
external: true
启动后,访问 https://admin.example.com 即可进入 Portainer 管理界面。
避坑指南(常见问题)
- Docker socket 权限不足:确保挂载了
/var/run/docker.sock:ro,如果 Traefik 日志报 Permission denied,检查 socket 权限或使用docker group。 - 网络未共享:所有容器必须在同一个
web网络中,否则 Traefik 无法发现它们。 - 域名解析未生效:先 ping 一下域名确认解析到主机 IP。
- 端口被占用:80/443 端口不能被其他程序占用(如 nginx、apache)。
- Let's Encrypt 证书申请失败:检查邮箱是否正确,且域名 80 端口对外可达(用于 HTTP 验证)。
- Dashboard 暴露风险:建议在正式环境为 Dashboard 也添加域名规则,而不是直接开放 8080 端口。
效果验证
- 分别访问你的两个域名,确认能正常加载 HTTPS 页面并显示绿色锁标志。
- 检查 Traefik 日志:
docker logs traefik,观察是否有certificate obtained等成功信息。 - 在 Dashboard 中查看路由和证书状态,确认所有 Router 和 Service 都 active。
如果你后续需要添加更多站点,只需按照第二步的标签格式复制一份容器配置即可。
整个架构稳定、安全,无需手动管理 SSL 证书,非常适合家用住宅主机的多站点场景。
遇到其他异常时,优先检查网络、标签和 traefik.enable=true 是否遗漏。
祝你的家庭服务器运行顺利!