资源共享,记录个人心得等

搭建Teslamate配合Mytesla记录展示车辆所有数据

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不存储用户数据。

Mytesla 文档

TeslaMate中文版中文手册,注意并非官方中文手册,我搭建未使用这个手册中的镜像

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

参考Mytesla手册-全新部署

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 创建隧道

  1. 登录 Zero Trust 控制台
  2. 导航到 Networks > Tunnels
  3. 点击 Create a tunnel
  4. 选择 Cloudflared 连接器类型,然后点击 Next
  5. 为隧道输入描述性名称(例如:teslamate-api-tunnel
  6. 点击 Save tunnel

4.2 安装并运行 Cloudflared

  1. 在这个隧道的概述中根据不同操作系统安装Cloudflared,我们选择docker,不是群辉的话可以选择其他的方法。
  2. 在群辉的Container Manger中的镜像仓库设置中 新增 镜像库名称:1ms 镜像仓库url:https://docker.1ms.run 然后使用这个
  3. 在镜像仓库搜索: cloudflare-cloudflared,然后下载
  4. 创建容器,映像选择cloudflared,然后在命令中输入概述中的内容从“tunnel”开始复制,也就是“tunnel –no-autoupdate run –token xxxx” xxx是cloudflare的token。然后启动
  5. 等待连接器出现在 Zero Trust 控制台中
  6. 当连接器激活后点击 Next

4.3 配置公共主机名

  1. Public Hostnames 选项卡中,点击 Add a public hostname
  2. 配置主机名:
    • Subdomain: 输入您想要的子域名(例如:teslamate-api
    • Domain: 从下拉菜单中选择您的域名
    • Service: 输入 http://localhost:38080 ⚠️ 重要:使用 HTTP,不是 HTTPS
  3. Additional application settings 下,配置任何需要的参数
  4. 点击 Save hostname

4.4 测试并配置 Mytesla

  1. 您的 API 现在可以通过 https://your-subdomain.your-domain.com 访问
  2. 测试连接:
   curl https://your-subdomain.your-domain.com/api/ping
  # 应该返回:{"message": "pong"}

5.配置Mytesla

  1. Mytesla.cc 中,转到 设置 → TeslaMate
  2. 输入您的 API URL:https://your-subdomain.your-domain.com
  3. 如果配置了 API 令牌,请添加它
  4. 测试连接
  5. 测试成功后保存
赞(0) 打赏
转载需标明出处Lee's Blog » 搭建Teslamate配合Mytesla记录展示车辆所有数据

评论 抢沙发

觉得文章有用就打赏一下文章作者

Sol地址:7MrBphQke6RSiJ4xerbfipDhVnEoiRyP7H6rc1nCF1Zy

Solana地址

登录

找回密码

注册