跳到主要内容

全新部署 Mytesla

本指南适用于从零开始部署完整 Mytesla 系统的用户。如果您已经有 TeslaMate 运行,请参考 已有 TeslaMate 指南。

适合人群
  • 没有安装过 TeslaMate 的用户
  • 希望使用最新配置的用户
  • 追求最佳实践的用户
注意

确保已完成环境初始化

部署概览

完整的 Mytesla 系统包括以下组件:

部署架构

核心服务层

  • PostgreSQL: 数据持久化存储
  • MQTT: 实时消息传递
  • TeslaMate: 车辆数据收集器
  • Grafana: 数据可视化仪表板

API 服务层

  • TeslaMateAPI: RESTful API 服务
  • 健康检查: 服务状态监控

网络暴露层

  • Tailscale (推荐): 零配置 VPN
  • Cloudflare Tunnel: 企业级代理
  • Traefik: 反向代理和负载均衡

一键部署 TODO

手动部署

如果您希望完全控制部署过程,可以按照详细步骤手动配置。

步骤 1: 准备工作环境

# 创建项目目录
mkdir -p ~/mytesla/
cd ~/mytesla

步骤 2: 创建核心配置

创建 .env 环境配置文件:

cat > .env << 'EOF'
# 数据库配置
TM_DB_USER=teslamate
TM_DB_PASS=password
TM_DB_NAME=teslamate
# 建议使用复杂密码,使用 openssl 生成
TM_ENCRYPTION_KEY=

# API 安全配置(强烈建议设置)
# 生成安全令牌:openssl rand -hex 32
API_TOKEN=

# 时区配置 - 请替换为您的时区,参考 https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
TZ=Asia/Shanghai

# Grafana 配置,默认密码后续登录后可修改
GRAFANA_PW=admin
GRAFANA_USER=admin

# Tailscale 配置见下文
TS_AUTHKEY=
TS_HOSTNAME=
TS_TAILNET_NAME=
EOF

步骤 3: 创建 Docker Compose 配置

大陆网络优化

由于大陆网络环境的特殊性,如果无法拉取 Docker 镜像,可以使用镜像加速服务。将配置中的镜像地址替换为:

  • mytesla/teslamateapidocker.1ms.run/mytesla/teslamateapi
  • teslamate/teslamate:2.0.0docker.1ms.run/teslamate/teslamate:2.0.0
  • teslamate/grafana:2.0.0docker.1ms.run/teslamate/grafana:2.0.0
  • postgres:17docker.1ms.run/postgres:17
  • eclipse-mosquitto:2docker.1ms.run/eclipse-mosquitto:2
  • tailscale/tailscale:latestdocker.1ms.run/tailscale/tailscale:latest
  • traefik:latestdocker.1ms.run/traefik:latest
cat > docker-compose.yml << 'EOF'
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

teslamate:
image: teslamate/teslamate:2.0.0
container_name: teslamate
restart: unless-stopped
depends_on:
- database
environment:
- DATABASE_USER=${TM_DB_USER}
- DATABASE_PASS=${TM_DB_PASS}
- DATABASE_NAME=${TM_DB_NAME}
- DATABASE_HOST=database
- MQTT_HOST=mosquitto
- VIRTUAL_HOST=${TS_HOSTNAME}.${TS_TAILNET_NAME}
- ENCRYPTION_KEY=${TM_ENCRYPTION_KEY}
- TZ=${TZ} # 📍 设置您的时区,参考 https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ports: # Remove if you access Teslamate only via Tailscale
- 4000:4000
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="

grafana:
image: teslamate/grafana:2.0.0
container_name: grafana
restart: unless-stopped
environment:
- DATABASE_USER=${TM_DB_USER}
- DATABASE_PASS=${TM_DB_PASS}
- DATABASE_NAME=${TM_DB_NAME}
- DATABASE_HOST=database
- GRAFANA_PASSWD=${GRAFANA_PW}
- GF_SECURITY_ADMIN_USER=${GRAFANA_USER}
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PW}
- GF_AUTH_ANONYMOUS_ENABLED=false
- GF_SERVER_DOMAIN=${TS_HOSTNAME}.${TS_TAILNET_NAME}
- GF_SERVER_ROOT_URL=https://${TS_HOSTNAME}.${TS_TAILNET_NAME}/grafana
- GF_SERVER_SERVE_FROM_SUB_PATH=true
volumes:
- grafana-data:/var/lib/grafana
ports: # Remove if you access Grafana only via Tailscale
- 3000:3000
labels:
- "traefik.enable=true"
- "traefik.http.routers.grafana.rule=Host(`${TS_HOSTNAME}.${TS_TAILNET_NAME}`) && PathPrefix(`/grafana`)"
- "traefik.http.routers.grafana.entrypoints=websecure"
- "traefik.http.routers.grafana.tls=true"
- "traefik.http.routers.grafana.tls.certresolver=myresolver"
- "traefik.port=3000"

teslamateapi:
image: mytesla/teslamateapi:latest
container_name: teslamateapi
restart: unless-stopped
depends_on:
- database
environment:
- DATABASE_USER=${TM_DB_USER}
- DATABASE_PASS=${TM_DB_PASS}
- DATABASE_NAME=${TM_DB_NAME}
- DATABASE_HOST=database
- ENCRYPTION_KEY=${TM_ENCRYPTION_KEY}
- MQTT_HOST=mosquitto
- API_TOKEN=${API_TOKEN} # 🔐 强烈建议设置以提高安全性
volumes:
- teslamateapi-data:/opt/app/data
ports: # 如果仅通过 Tailscale 访问 TeslamateAPI,请删除此部分
- 8080:8080
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"

database:
image: postgres:17
container_name: database
restart: unless-stopped
environment:
- POSTGRES_USER=${TM_DB_USER}
- POSTGRES_PASSWORD=${TM_DB_PASS}
- POSTGRES_DB=${TM_DB_NAME}
volumes:
- postgres-data:/var/lib/postgresql/data

mosquitto:
image: eclipse-mosquitto:2
restart: always
command: mosquitto -c /mosquitto-no-auth.conf
volumes:
- mosquitto-conf:/mosquitto/config
- mosquitto-data:/mosquitto/data

volumes:
grafana-data:
postgres-data:
mosquitto-conf:
mosquitto-data:
teslamateapi-data:
EOF

步骤 4: 使用 Tailscale 暴露服务

Tailscale 是一个基于 WireGuard 的零配置 VPN 服务,非常适合安全地暴露内网服务。

为什么选择 Tailscale?
  • 零配置:无需复杂的网络设置
  • 端到端加密:基于 WireGuard 协议
  • 无需公网 IP:支持 NAT 穿透
  • 免费额度充足:个人使用完全免费
  • 跨平台支持:支持所有主流操作系统

步骤 1: 注册 Tailscale 账号

  1. 访问 Tailscale 官网
  2. 点击 "Get Started" 注册账号
  3. 可以使用 Google、Microsoft 或 GitHub 账号登录

步骤 2: 获取认证密钥

  1. 登录 Tailscale 管理控制台
  2. 点击 "Generate auth key"
  3. 配置密钥选项:
    • Reusable: 不建议勾选
  4. 点击 "Generate key" 并复制密钥
安全提示

Auth Key 只显示一次,请妥善保存!

步骤 3: 环境变量配置

.env 文件中添加:

# Tailscale 配置
TS_HOSTNAME=mytesla # 您的设备名称
TS_AUTHKEY=tskey-auth-XXXXX-YYYYY # 从步骤2获取的密钥
TS_TAILNET_NAME=your-name.ts.net # 您的 Tailnet 域名
获取 Tailnet 域名

Tailscale 控制台 的 DNS 页面可以找到您的 Tailnet 域名。

步骤 5: 部署和启动

docker-compose up -d 

docker-compose ps

步骤6:更新 tailscale node key expire setting

tailscale machines 中找到您的节点,设置中选择 Disable key expiry,否则节点会过期,导致服务无法访问。

验证部署

服务状态检查

# 检查所有容器状态
docker-compose ps

# 查看服务日志
docker-compose logs teslamate
docker-compose logs teslamateapi

Web 界面访问

服务地址用途默认账号
TeslaMatehttp://localhost:4000主配置界面无需登录
Grafanahttp://localhost:3000数据可视化admin / [生成的密码]
TeslaMateAPIhttp://localhost:8080API 状态页无需登录

⚙️ 初始配置

1. 配置 TeslaMate

访问 http://localhost:4000:

授权车辆

2. 验证 Grafana

访问 http://localhost:3000/grafana:

  1. 使用生成的管理员密码登录
  2. 验证仪表板是否正常加载
  3. 确认数据源连接正常

3. 验证 Tailscale

  • 将您的另一台设备安装 tailscale 客户端
  • 连接到您的 Tailnet
  • 访问 https://${TS_HOSTNAME}.${TS_TAILNET_NAME} 验证是否可以访问
  • 测试 API 端点:https://${TS_HOSTNAME}.${TS_TAILNET_NAME}/api/ping - 应该返回 {"message": "pong"}
浏览器访问

在任何连接到您 Tailnet 的设备上打开浏览器,访问 https://${TS_HOSTNAME}.${TS_TAILNET_NAME} 来访问 TeslaMate 界面并验证设置是否正常工作。

4. 在 Mytesla 配置

  1. 访问 https://mytesla.cc
  2. 进入 Settings → TeslaMate
  3. 输入 API 地址:https://[TS_HOSTNAME].[TS_TAILNET_NAME]
  4. 如果设置了 API_TOKEN,在 API Token 字段中输入
  5. 点击测试连接

5. 恭喜

恭喜你,你已经完成了 Mytesla 的部署。

🆘 故障排除

如果遇到问题,请查看: