从 0 搭建 TeslaMate

TeslaMate 简介

相较于传统燃油车,特斯拉提供了非常不一样的使用体验。驾驶层面,单踏板模式,自动辅助驾驶 EAP 和 FSD 等相信大家略有耳闻。都说特斯拉的车子是个大号的「电子产品」,除了车子是以电驱动,车子有许多花里胡哨的电子娱乐功能外。今天要给大家介绍的 TeslaMate,更能体现其电子产品气质。

TeslaMate 有什么功能

TeslaMate 可以记录并展示我们的行程信息(起点终点,距离,详细路线,海拔变化,速度变化,平均速度,电量变化,总耗电量,用电效率等),充电信息(加电量、费用、时长、充电速度),行程和充电报告,停车电力损耗,车辆状态历史,终生驾驶地图等。

TeslaMate 本体:简明扼要地展示车辆当前情况
Overview:展示车辆概要信息
Timeline:展示车辆状态历史
Drive Details:展示车辆每段行程的详细信息
Trip:按天展示行程信息(聚合时间可调)

TeslaMate 能做的事情还有许多,怎么样,是不是相当有趣而且强大呢?按本文一步步操作,你也可以拥有一个属于自己的行车日志记录分析工具。事不宜迟,马上开始。

选择适合自己的安装方式

在 TeslaMate 的官方文档中,有三种安装方式:

  • 直接使用 Docker 安装且不做加密(适用于自建 NAS,此方法不适用于可被公网访问的服务器上)
  • 使用 Docker 安装并加密访问(适用于可被公网访问的服务器)
  • 使用 Docker 安装并加密访问,且使用 Apache2 分发(适用于可被公网访问的服务器,且服务器上可同时运行博客等其他应用)

对于自建 NAS,或对 Linux 系统不是很熟悉的非技术同学,可以选择前两种方式安装 TeslaMate。具体参考这篇文章:特斯拉神器TeslaMate一键安装,来了!

本文重点介绍第三种方式:使用 Apache2 分发,使用 let’s encrypt 申请免费域名证书启用 ssl,使用 Docker 安装并加密访问 TeslaMate

前期准备

  1. 准备一个可被公网访问的服务器,可在阿里云上购买。选择包年包月 1 核 2GB 内存即可,磁盘我选了 40GB 的,目前完全够用,后续可以扩容。系统选择 Ubuntu 22.04 64 位
  2. 进入阿里云控制台 – 云服务器 ECS – 进入刚购买的 ECS 实例 – 安全组 – 进入默认的安全组 – 在安全组规则 – 访问规则 – 入规则中 – 选择快速添加 – 添加 HTTP(80) 和 HTTPS(443) 两个端口,使得服务器能被公网访问
  3. 准备一个域名,同样可以在阿里云上购买,为了能在国内正常使用,需完成 ICP 备案
  4. 进入阿里云控制台 – 域名解析管理 – 为刚购买的域名添加两条 A 记录
    1. teslamate 记录,指向服务器 IP
    2. grafana 记录,指向服务器 IP
    3. 准备工作完成,我们得到了一台服务器,以及 teslamate.yourdomain.comgrafana.yourdomain.com 两个指向此服务器的域名

安装和配置

  • 访问阿里云工作台,进入 ECS 详情
  • 远程连接 ECS,输入密码(首次访问时,密码会以短信形式发到手机上,可以自行修改)
  • 输入 sudo su 切换至管理员权限
  • 执行 apt-get update 更新 apt 下载源
  • 安装并配置 apache2(参考:帮助文档
    • 执行 apt install apache2 安装 apache2
    • 执行 a2enmod proxy proxy_http proxy_wstunnel rewrite ssl 启用以下 mod
      • proxy
      • proxy_http
      • proxy_wstunnel
      • rewrite
      • ssl
    • 执行 systemctl restart apache2 重启 apache2
    • 执行 systemctl status apache2 可查看 apaache2 状态
  • 安装并配置 certbot 获取 ssl 证书激活 https(参考:帮助文档
    • 执行 snap install core; sudo snap refresh core 确保 snapd 版本最新
    • 执行 snap install --classic certbot 安装 certbot
    • 执行 ln -s /snap/bin/certbot /usr/bin/certbot 来建立文件链接(类似快捷方式,但是修改会互相同步)来确保 certbot 能被运行
    • 执行 certbot certonly --Apache 获取证书(每三个月过一次期)
      • 执行过程中,需要输入自己的邮箱注册 let’s encrypt,输入域名来获取证书
      • 命令需要执行两次,分别为 teslamate.yourdomain.com 和 grafana.yourdomain.com 获取证书(记得将 yourdoamin.com 部分替换成你的域名)
  • 安装并配置 docker 和 docker-compose(参考:帮助文档
  • 安装并配置 teslamate(参考:帮助文档
    • 执行 mkdir /opt/teslamate 生成目标文件夹
    • 执行 cd /opt/teslamate 跳转至目标文件夹
    • 执行 vi docker-compose.yml 新建文件 docker-compose.yml,插入以下内容:

version: "3"

services:
  teslamate:
    image: teslamate/teslamate:latest
    restart: always
    environment:
      - ENCRYPTION_KEY=${TM_ENCRYPTION_KEY}
      - DATABASE_USER=${TM_DB_USER}
      - DATABASE_PASS=${TM_DB_PASS}
      - DATABASE_NAME=${TM_DB_NAME}
      - DATABASE_HOST=database
      - MQTT_HOST=mosquitto
      - VIRTUAL_HOST=${FQDN_TM}
      - CHECK_ORIGIN=true
      - TZ=${TM_TZ}
    volumes:
      - ./import:/opt/app/import
    ports:
      - 127.0.0.1:4000:4000
    cap_drop:
      - all

  database:
    image: postgres:14
    restart: always
    environment:
      - POSTGRES_USER=${TM_DB_USER}
      - POSTGRES_PASSWORD=${TM_DB_PASS}
      - POSTGRES_DB=${TM_DB_NAME}
    volumes:
      - teslamate-db:/var/lib/postgresql/data

  grafana:
    image: teslamate/grafana:latest
    restart: always
    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_BASIC_ENABLED=true
      - GF_AUTH_ANONYMOUS_ENABLED=false
      - GF_SERVER_ROOT_URL=https://${FQDN_GRAFANA}
    ports:
      - 127.0.0.1:3000:3000
    volumes:
      - teslamate-grafana-data:/var/lib/grafana

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

volumes:
  teslamate-db:
  teslamate-grafana-data:
  mosquitto-conf:
  mosquitto-data:

  • 插入完成后,按 esc 退出编辑模式,输入 :wq 保存文件并退出 vim 编辑器
  • 执行 vi .env 新建文件 .env,插入以下内容。记得将里头所有带 # 号的内容替换成你自己的内容

TM_ENCRYPTION_KEY= #your_encrypt_key
TM_DB_USER=teslamate
TM_DB_PASS= #your_pw
TM_DB_NAME=teslamate

GRAFANA_USER=admin
GRAFANA_PW=admin

FQDN_GRAFANA= #grafana.yourdomain.com
FQDN_TM= #teslamate.yourdomain.com

TM_TZ=Asia/Shanghai

LETSENCRYPT_EMAIL= #your@email.com

  • 插入完成后,按 esc 退出编辑模式,输入 :wq 保存文件并退出 vim 编辑器
  • 执行 vi /etc/apache2/sites-available/teslamate.conf 新建文件 teslamate.conf,插入以下内容。记得将第一行里的 yourdomain.com 替换成你的域名:

Define MYDOMAIN yourdomain.com
Define LOG access.teslamate.log

<VirtualHost *:80>
  ProxyPreserveHost On
  ServerName teslamate.${MYDOMAIN}
  CustomLog /var/log/apache2/${LOG} combined
  RewriteEngine on
  RewriteCond %{SERVER_NAME} =teslamate.${MYDOMAIN}
  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:80>
  ProxyPreserveHost On
  ServerName grafana.${MYDOMAIN}
  CustomLog /var/log/apache2/${LOG} combined
  RewriteEngine on
  RewriteCond %{SERVER_NAME} =grafana.${MYDOMAIN}
  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<IfModule mod_ssl.c>
  <VirtualHost *:443>
    ProxyPreserveHost On
    ServerName teslamate.${MYDOMAIN}
    ProxyPass /live/websocket ws://127.0.0.1:4000/live/websocket
    ProxyPassReverse /live/websocket ws://127.0.0.1:4000/live/websocket
    ProxyPass / http://127.0.0.1:4000/
    ProxyPassReverse / http://127.0.0.1:4000/
    CustomLog /var/log/apache2/${LOG} combined
    <Proxy *>
      Authtype Basic
      Authname "Password Required"
      AuthUserFile /etc/apache2/.htpasswd
      <RequireAny>
        <RequireAll>
          Require expr %{REQUEST_URI} =~ m#^/live/websocket.*#
        </RequireAll>
        Require valid-user
      </RequireAny>
    </Proxy>
    SSLCertificateFile /etc/letsencrypt/live/teslamate.${MYDOMAIN}/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/teslamate.${MYDOMAIN}/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
  </VirtualHost>
</IfModule>

<IfModule mod_ssl.c>
  <VirtualHost *:443>
    ProxyPreserveHost On
    ServerName grafana.${MYDOMAIN}
    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/
    CustomLog /var/log/apache2/${LOG} combined
    SSLCertificateFile /etc/letsencrypt/live/grafana.${MYDOMAIN}/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/grafana.${MYDOMAIN}/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
  </VirtualHost>
</IfModule>

  • 插入完成后,按 esc 退出编辑模式,输入 :wq 保存文件并退出 vim 编辑器
  • 由于服务器可被公网访问,为了防止隐私泄露,需要启用账户密码登录。我们利用以下网站来生成账户密码的密文:https://hostingcanada.org/htpasswd-generator/
  • 访问上述网站,输入你喜欢的用户名和密码,注意模式 (Mode) 要选 *BCrypt,点击 Create 按钮即可。接下来的步骤中,需要复制最上面的那行文本,进行输入。
  • 执行 vi /etc/apache2/.htpasswd 在目标文件夹新建文件 .htpasswd 用于存放刚才生成的登录账密密文,如:

User:$2y$10$eZEZEZXvnhc7HkYEPjWiIuqXiZ0c9y5cqH58KfgP3xbvwSvUMCL4C

  • 执行 a2ensite teslamate 启动 teslamate 的 vhost
  • 执行 systemctl reload apache2 重载 apache2
  • 执行 docker-compose pull 更新 docker 应用
  • 执行 docker-compose up -d 启动 docker 应用

等待应用安装和启动后,可访问 https://teslamate.yourdomain.com 来访问 TeslaMate,输入设定的账号密码即可登录。首次访问时,会需要绑定你的 Tesla 账号 token 以获取车辆数据,你可以通过以下方式获取自己的 token:Tesla Auth (macOS, Linux, Windows)。获取 token 后,对应输入即可:

获取并输入 Token

完成 token 输入后,即可进入 TeslaMate 主页,点击导航右侧「设置」,拉到底部,输入 URLs

  • Web 应用程序处,输入:https://teslamate.yourdomain.com
  • 控制台处,输入:https://grafana.yourdomain.com
  • 记得将 yourdomain.com 替换成你的域名

设置完成后,导航右侧会出现「控制台」选项,点击便进入 Grafana

点击控制台中的任意项,客房温暖 Grafana

首次访问 Grafana 时,会提示需要登录,默认的账户密码是 admin/admin,首次登录后可修改密码,记得修改。

好了,到这里,所有的配置已经完成,你也拥有了一个自己专属的行车日志记录分析工具。Enjoy!