1.前言
teslamate是后端接收车辆数据软件,使用Docker部署,将数据通过api让mytesla作为前端进行访问,然后将数据展示出来。个人的数据存放在PostgreSQL中。本文参考mytesla的手册进行搭建,部分配置更换为我自己使用的,我尽量详细备注,供自行修改。
如果订车但还没有提车,部署后输入特斯拉的Token是无效的,需要提车后,将账号绑定到车上,然后获取特斯拉的Token输入到Teslamate中,切记!
我搭建的位置在自己的群辉NAS上,同时也可以使用vps搭建,mytesla.cc手册中要求配置为2核心CPU,2G内存,50G使用空间。teslamate的官方文档要求最低1G内存,我开始将所有所需程序搭建在512M的服务器上,可以搭建,但是mytesla.cc的作者不建议,未来可能还会迁移,只能作罢。
需要将api服务暴露在公网中,mytesla手册建议使用Tailscale组网,我则使用Cloudflare Tunnel将api端口配置到公网上,如果设备有能够链接到NAS中的手段,如使用Wireguard,这一步都可以略过。
Mytesla是一个网页,通过网页能够在移动端和PC端都完美展示车辆数据,即通过浏览器链接Teslamate服务,只要当前设备能链接到Teslamate服务即可,Mytesla不存储用户数据。
TeslaMate中文版中文手册,注意并非官方中文手册,我搭建未使用这个手册中的镜像
2.搭建Teslamate
需要搭建的服务有:
- PostgreSQL: 数据持久化存储
- MQTT: 实时消息传递
- TeslaMate: 车辆数据收集器(使用MyteslaDocker镜像)
- Grafana: 数据可视化仪表板(使用MyteslaDocker镜像)
- TeslaMateAPI: RESTful API 服务(使用MyteslaDocker镜像);(如果只使用Grafana展示不用Mytesla,可以不拉镜像)
使用Docker-compose搭建,
2.1 创建环境变量
首先创建一个目录用来存放所有的文件,尤其是数据库,我选择将容器内的数据映射到本地文件夹,以方便备份与迁移。
在文件中创建容器需要的文件夹,我在yml文件中详细标注。
创建.env文件设置环境变量,也可以将参数直接写在docker-compose.yml中。
# 数据库配置
TM_DB_USER=teslamate
TM_DB_PASS= #设置数据库密码
TM_DB_NAME=teslamate
# 建议使用复杂密码,使用 openssl 生成加密密钥
TM_ENCRYPTION_KEY=
# API 安全配置(强烈建议设置)
# 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
2.2 编写Docker-compose文件
打开群辉的Container Manger,点击项目,点击新增,填写好路径,也就是刚才创建的文件夹,也是存放上面.env环境变量文件的文件夹。比如我使用 /volume3/docker3/teslamate/
然后创建Docker-compose.yml文件
其中使用docker.1ms.run替换默认的镜像,以增加下载速度。
yml文件中有一些容器映射地址的文件夹需要提前创建一下,如postgres-data,teslamateapi-data,grafana-data等,在volumes: 这个类别下,下面会看到。
同时注意一下端口映射那里。
version: "3"
services:
teslamate:
image: docker.1ms.run/mytesla/teslamate:v2.1
container_name: teslamate
restart: unless-stopped
depends_on:
- database
environment:
# - BD_MAP_AK= #可以去百度地图开发者那申请获取aksk将地图替换为百度地图
# - BD_MAP_SK= #可以去百度地图开发者那申请获取aksk将地图替换为百度地图
- DATABASE_USER=${TM_DB_USER}
- DATABASE_PASS=${TM_DB_PASS}
- DATABASE_NAME=${TM_DB_NAME}
- DATABASE_HOST=database
- MQTT_HOST=mosquitto
- 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
- 50000:4000 #前面是容器外端口,后面是容器内端口,比如需要50000端口,就将前面的改为50000:4000
volumes:
- /volume3/docker3/teslamate/teslamate/import:/opt/app/import #前面是容器外地址,也就是本机地址,填写上面创建用来存放Docker-compose文件的文件夹即可,后面第二个teslamate,是用来存放这个容器的文件夹。
cap_drop:
- all
grafana:
image: docker.1ms.run/mytesla/grafana:v2.1
container_name: grafana
restart: unless-stopped
environment:
- GF_LOG_LEVEL=error #避免日志过多,如果容器启动失败可以注释这行查看详细日志。
- 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_SERVE_FROM_SUB_PATH=true
volumes:
- /volume3/docker3/teslamate/grafana-data:/var/lib/grafana
ports: # Remove if you access Grafana only via Tailscale
- 44000:3000 #前面是容器外端口,后面是容器内端口
teslamateapi:
image: mytesla/teslamateapi:latest #这个使用官方的下载mytesla生成的api镜像,无法加速,可能有点慢
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:
- /volume3/docker3/teslamate/teslamateapi-data:/opt/app/data
ports: # 如果仅通过 Tailscale 访问 TeslamateAPI,请删除此部分
- 38080: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:
- /volume3/docker3/teslamate/postgres-data:/var/lib/postgresql/data #前面是容器外地址,也就是本机地址,填写上面创建用来存放Docker-compose文件的文件夹即可,postgres-data文件夹是用来专门存放数据库的文件夹
mosquitto:
image: eclipse-mosquitto:2
restart: always
command: mosquitto -c /mosquitto-no-auth.conf
volumes:
- /volume3/docker3/teslamate/mosquitto-conf:/mosquitto/config
- /volume3/docker3/teslamate/mosquitto-data:/mosquitto/data
确定无误后点击构建即可。
如果是vps使用ssh登录的话,将.env和docker-compose.yml文件存放好,同样是创建一个单独的文件夹下。然后构建即可
docker-compose up -d
如果按照我的yml设置,先确定一下所有服务是否正常。
nasip为搭建服务器的主机ip
http://nasip:50000 访问TeslaMate
http://nasip:44000 访问Grafana (首次构建使用群辉可能比较慢,稍微等等,如果没有明确说启动失败的话)
http://nasip:38080 TeslaMateAPI
3. 获取特斯拉访问令牌
- 需要注意的是,Refresh Token对应的中文是刷新令牌,ios版的顺序和网页是相反的。注意别输入错误
- 输入错误后,有可能卡住导致之后一直提示无效令牌,这时需要重启下服务或重启服务器.
- 需要在提车绑定手机车钥匙后获取令牌,提前输入令牌再绑定钥匙,车辆信息不会自动跟过来
下载地址
之后登录http://nasip:50000 ,将获取的Token填入即可,注意不建议将这个服务的端口暴露在公网,因为默认没有鉴权,也就是没有输入用户名密码的过程,访问即可修改里面内容。
成功的话会显示车辆位置和信息。
4.配置网络暴露
如果不使用mytesla前端展示的话,这一步可以不做。或者如果想要在公网访问Grafana的话,也可以将下面的端口替换为Grafana的端口。我下面的操作暴露的是teslamateapi的端口,用来连接mytesla
如果想使用Tailscale组网的话,可以参考 Mytesla手册-使用 Tailscale 暴露服务
同时上面搭建也按照他手册提供的搭建方法多拉两个容器。
我本身就已经完成组网,并且还要多拉一个不熟悉的Web应用服务,因此不考虑这个方案。
下面我介绍使用Cloudflare Zero Trust 暴露API端口
可以参考手册 使用 Cloudflare Zero Trust 暴露服务
这个方法需要有一个自己的域名,我建议使用6位xyz域名即可,一年1刀。我推荐使用 NameSilo.com购买,然后修改ns,用cloudflare进行解析。
4.1 创建隧道
- 登录 Zero Trust 控制台
- 导航到 Networks > Tunnels
- 点击 Create a tunnel
- 选择 Cloudflared 连接器类型,然后点击 Next
- 为隧道输入描述性名称(例如:
teslamate-api-tunnel
) - 点击 Save tunnel
4.2 安装并运行 Cloudflared
- 在这个隧道的概述中根据不同操作系统安装Cloudflared,我们选择docker,不是群辉的话可以选择其他的方法。
- 在群辉的Container Manger中的镜像仓库设置中 新增 镜像库名称:1ms 镜像仓库url:https://docker.1ms.run 然后使用这个
- 在镜像仓库搜索: cloudflare-cloudflared,然后下载
- 创建容器,映像选择cloudflared,然后在命令中输入概述中的内容从“tunnel”开始复制,也就是“tunnel –no-autoupdate run –token xxxx” xxx是cloudflare的token。然后启动
- 等待连接器出现在 Zero Trust 控制台中
- 当连接器激活后点击 Next
4.3 配置公共主机名
- 在 Public Hostnames 选项卡中,点击 Add a public hostname
- 配置主机名:
- Subdomain: 输入您想要的子域名(例如:
teslamate-api
) - Domain: 从下拉菜单中选择您的域名
- Service: 输入
http://localhost:38080
⚠️ 重要:使用 HTTP,不是 HTTPS
- Subdomain: 输入您想要的子域名(例如:
- 在 Additional application settings 下,配置任何需要的参数
- 点击 Save hostname
4.4 测试并配置 Mytesla
- 您的 API 现在可以通过
https://your-subdomain.your-domain.com
访问 - 测试连接:
curl https://your-subdomain.your-domain.com/api/ping
# 应该返回:{"message": "pong"}
5.配置Mytesla
- 在 Mytesla.cc 中,转到 设置 → TeslaMate
- 输入您的 API URL:
https://your-subdomain.your-domain.com
- 如果配置了 API 令牌,请添加它
- 测试连接
- 测试成功后保存