使用 Tailscale 暴露服务
Tailscale 是一个基于 WireGuard 的零配置 VPN 服务,非常适合安全地暴露内网服务。
为什么选择 Tailscale?
- ✅ 零配置:无需复杂的网络设置
- ✅ 端到端加密:基于 WireGuard 协议
- ✅ 无需公网 IP:支持 NAT 穿透
- ✅ 免费额度充足:个人使用完全免费
- ✅ 跨平台支持:支持所有主流操作系统
快速开始
步骤 1: 注册 Tailscale 账号
- 访问 Tailscale 官网
- 点击 "Get Started" 注册账号
- 可以使用 Google、Microsoft 或 GitHub 账号登录
步骤 2: 获取认证密钥
- 登录 Tailscale 管理控制台
- 点击 "Generate auth key"
- 配置密钥选项:
- ✅ Reusable: 不建议勾选
- 点击 "Generate key" 并复制密钥
安全提示
Auth Key 只显示一次,请妥善保存!
步骤 3: 配置 Docker Compose
在您的 docker-compose.yml
中添加或更新 Tailscale 服务、Traefik 反向代理:
services:
tailscale:
image: tailscale/tailscale:latest
container_name: tailscale
hostname: ${TS_HOSTNAME}
environment:
- TS_AUTHKEY=${TS_AUTHKEY}
- TS_STATE_DIR=/var/lib/tailscale
- TS_SOCKET=/var/run/tailscale/tailscaled.sock
volumes:
- ./tailscale/state:/var/lib/tailscale:rw
- ./tailscale/socket:/var/run/tailscale
- /dev/net/tun:/dev/net/tun
cap_add:
- NET_ADMIN
- SYS_MODULE
restart: unless-stopped
traefik:
image: traefik:latest
container_name: traefik
network_mode: service:tailscale
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./tailscale/state:/var/lib/tailscale:rw
- ./tailscale/socket:/var/run/tailscale
command:
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --certificatesresolvers.myresolver.tailscale=true
restart: unless-stopped
depends_on:
- tailscale
步骤 4: 配置服务标签
为需要暴露的服务添加 Traefik 标签:
services:
teslamateapi:
# ... 其他配置 ...
labels:
- "traefik.enable=true"
- "traefik.http.routers.teslamateapi.rule=Host(`${TS_HOSTNAME}.${TS_TAILNET_NAME}`) && (Path(`/api`) || PathPrefix(`/api/`))"
- "traefik.http.routers.teslamateapi.entrypoints=websecure"
- "traefik.http.routers.teslamateapi.tls=true"
- "traefik.http.routers.teslamateapi.tls.certresolver=myresolver"
- "traefik.port=8080"
teslamate:
# ... 其他配置 ...
labels:
- "traefik.enable=true"
- "traefik.port=4000"
- "traefik.http.routers.teslamate.rule=Host(`${TS_HOSTNAME}.${TS_TAILNET_NAME}`)"
- "traefik.http.routers.teslamate.entrypoints=websecure"
- "traefik.http.routers.teslamate.tls=true"
- "traefik.http.routers.teslamate.tls.certresolver=myresolver"
- "traefik.http.routers.teslamate-ws.rule=Host(`${TS_HOSTNAME}.${TS_TAILNET_NAME}`) && Path(`/live/websocket`)"
- "traefik.http.routers.teslamate-ws.entrypoints=websecure"
- "traefik.http.routers.teslamate-ws.tls="
步骤 5: 环境变量配置
在 .env
文件中添加:
# Tailscale 配置
TS_HOSTNAME=mytesla # 您的设备名称
TS_AUTHKEY=tskey-auth-XXXXX-YYYYY # 从步骤2获取的密钥
TS_TAILNET_NAME=your-name.ts.net # 您的 Tailnet 域名
获取 Tailnet 域名
在 Tailscale 控制台 的 DNS 页面可以找到您的 Tailnet 域名。
步骤6:更新 tailscale node key expire setting
tailscale machines 中找到您的节点,设置中选择 Disable key expiry,否则节点会过期,导致服务无法访问。
步骤 7: 启动服务
# 启动服务
docker-compose up -d tailscale traefik teslamateapi
# 查看日志
docker-compose logs -f tailscale
# 检查 Tailscale 状态
docker exec tailscale tailscale status
验证配置
1. 检查 Tailscale 连接
# 查看设备状态
docker exec tailscale tailscale status
# 输出示例:
# 100.64.0.1 mytesla linux -
# 100.64.0.2 your-laptop macOS -
浏览器访问
确认 Tailscale 连接正常工作后,您可以在任何连接到您 Tailnet 的设备上,使用浏览器打开 https://mytesla.your-name.ts.net
来访问服务。
2. 测试 HTTPS 访问
首先,在另一台设备上设置 Tailscale:
- 将您的另一台设备安装 tailscale 客户端
- 连接到您的 Tailnet
- 然后从该设备测试 API 访问:
# 从任何安装了 Tailscale 的设备访问
curl https://mytesla.your-name.ts.net/api/ping
# 应该返回
{"message": "pong"}
API 验证
/api/ping
端点专门用于验证 TeslaMateAPI 服务是否可访问且正常工作。成功返回 {"message": "pong"}
表示服务运行正常。
3. 在 Mytesla 配置
- 访问 https://mytesla.cc
- 进入 Settings → TeslaMate
- 输入 API 地址:
https://mytesla.your-name.ts.net
- 点击测试连接
- 您也可以在浏览器中访问
https://mytesla.your-name.ts.net/api/ping
进行手动验证 - 应该返回{"message": "pong"}