TeslaMate安装部署、数据备份及恢复

73

TeslaMate介绍

TeslaMate是一款备受特斯拉车主欢迎的开源解决方案,它为特斯拉车主提供了一系列强大的功能,包括数据分析、监控、统计通知等。作为开源项目,TeslaMate的代码完全开放,有一个活跃的社区在不断更新和改进它。 本文将详细介绍TeslaMate是什么以及它所提供的功能。

TeslaMate有什么功能?

数据分析和监控

TeslaMate通过特斯拉车辆的API接口获取各种数据,包括车辆状态、充电历史、行驶里程、能源消耗等。这些数据可以通过用户界面进行可视化展示,使车主能够直观地了解车辆的使用情况和性能表现。通过数据分析,车主可以更好地了解车辆的效率、充电习惯以及能源消耗情况。

Docker安装

本文档提供了在运行 Docker 的任何系统上安装 TeslaMate 的必要步骤。

本文档中使用的TeslaMate中文版本,主要解决了如下问题

  1. 界面汉化,大部分图表都能中文显示

  2. 修复国内地图和位置信息无法显示的问题

  3. 添加更多的报表,比如:电池健康度等

  4. 地图和位置接口换成高德地图,可以显示精确的位置信息而不再是xx路

  5. 支持微信公众号实时推送行程和充电等消息。

  6. 4和5功能目前仅在TeslaMate盒子上生效,后续自行安装的版本也会更新。

需求

  • Docker (如果你是docker新手, 参考 Installing Docker and Docker Compose)

  • 一台始终开启的服务器,让TeslaMate可以持续获取数据

  • 1G RAM

  • 互联网接入, 可以链接到 tesla.com

指示

  1. 创建 docker-compose.yml 文件,内容为:

    docker-compose.yml

    version: "3"
    
    services:
      teslamate:
        image: dhuar/teslamate:latest
        restart: always
        environment:
          - ENCRYPTION_KEY= #insert a secure key to encrypt your Tesla API tokens
          - DATABASE_USER=teslamate
          - DATABASE_PASS= #insert your secure database password!
          - DATABASE_NAME=teslamate
          - DATABASE_HOST=database
          - MQTT_HOST=mosquitto
        ports:
          - 4000:4000
        volumes:
          - ./import:/opt/app/import
        cap_drop:
          - all
    
      database:
        image: postgres:15
        restart: always
        environment:
          - POSTGRES_USER=teslamate
          - POSTGRES_PASSWORD= #insert your secure database password!
          - POSTGRES_DB=teslamate
        volumes:
          - teslamate-db:/var/lib/postgresql/data
    
      grafana:
        image: dhuar/grafana:latest
        restart: always
        environment:
          - DATABASE_USER=teslamate
          - DATABASE_PASS= #insert your secure database password!
          - DATABASE_NAME=teslamate
          - DATABASE_HOST=database
        ports:
          - 3000:3000
        volumes:
          - teslamate-grafana-data:/var/lib/grafana
    
      mosquitto:
        image: eclipse-mosquitto:2
        restart: always
        command: mosquitto -c /mosquitto-no-auth.conf
        # ports:
        #   - 1883:1883
        volumes:
          - mosquitto-conf:/mosquitto/config
          - mosquitto-data:/mosquitto/data
    
    volumes:
      teslamate-db:
      teslamate-grafana-data:
      mosquitto-conf:
      mosquitto-data:
  2. 设置加密密钥 用于加密你的 Tesla API tokens,随便写个密码就行,不写的话,每次重启都要输入token ( ENCRYPTION_KEY).

  3. 设置数据库密码 (DATABASE_PASS , POSTGRES_PASSWORD)

  4. 使用 docker-compose up -d 命令启动docker容器.

    docker-compose up -d

用法

  1. 在浏览器访问: http://your-ip-address:4000

  2. 设置您的Tesla API tokens (参考常见问题)

  3. Grafana 数据仪表盘可以访问 http://your-ip-address:3000. 使用默认用户 admin (初始密码 admin) 登录.

更新

要将TeslaMate更新到最新版,可以运行以下命令:

docker-compose pull
docker-compose up -d

数据备份和还原

备份

登录到终端

  • 如果你是阿里云腾讯云之类的云服务器,推荐直接进云服务器管理后台,在网页的终端操作(简单)

  • 如果你是群晖之类的nas,可以通过ssh登录到nas

进入teslamate目录

  • 云服务器一般在 /opt/teslamate 下

cd /opt/teslamate
  • nas一般在 /volume1/docker/teslamate 下

cd /volume1/docker/teslamate
  • 飞牛一般在你的docker compose配置路径下

cd /vol1/1000/docker-compose启动配置/tesla_mate

创建备份文件

docker-compose exec -T database pg_dump -U teslamate teslamate > ./teslamate.bck

或者

docker compose exec -T database pg_dump -U teslamate teslamate > ./teslamate.bck

检查备份文件大小

ls -lh teslamate.bck

如果teslamate.bck文件的大小为0,那就出错了没有备份成功。

压缩备份文件(可选)

gzip teslamate.bck

备份文件下载到电脑(可选)

  • 阿里云腾讯云之类的云服务器的web终端,都有网页直接下载云服务器文件的功能,你可以点击web终端左上角的文件夹图标,然后,点击文件夹树进入/opt/teslamate 目录,然后直接下载文件。如果提示文件过大,可以压缩文件再下载。

  • nas请自行用nas的管理工具下载到电脑。

  • 如果是ssh登录的,也可以用ssh工具的下载文件功能。

注意:

  • -T 是很重要的,如果你在 crontab 中添加这行,否则备份将无法工作,因为 Docker 会产生这个错误:the input device is not a TTY

  • 确保将 teslamate.bck 文件移动到另一个安全位置,因为如果你使用 docker-compose GUI 升级 teslamate 配置,你可能会丢失该备份文件。某些 GUI 在更新时会删除包含 docker-compose.yml 的文件夹。

如果出现错误 "No such service: database",请更新你的 docker-compose.yml 文件,或者在上述命令中使用 db 而不是 database

如果你在 .env 文件中更改了 TM_DB_USER(根据某些高级指南),确保在上述命令中将第一个teslamate 替换为 TM_DB_USER 的值。

恢复

注意:

将默认的 TeslaMate 值与 .env 文件中定义的值(TM_DB_USER 和 TM_DB_NAME)进行替换。

# 停止 teslamate 容器以避免写入冲突
docker compose stop teslamate

# 删除现有数据并重新初始化
docker compose exec -T database psql -U teslamate << .
drop schema public cascade;
create schema public;
create extension cube;
create extension earthdistance;
CREATE OR REPLACE FUNCTION public.ll_to_earth(float8, float8)
    RETURNS public.earth
    LANGUAGE SQL
    IMMUTABLE STRICT
    PARALLEL SAFE
    AS 'SELECT public.cube(public.cube(public.cube(public.earth()*cos(radians(\$1))*cos(radians(\$2))),public.earth()*cos(radians(\$1))*sin(radians(\$2))),public.earth()*sin(radians(\$1)))::public.earth';
.

# 恢复数据
docker compose exec -T database psql -U teslamate -d teslamate < teslamate.bck

# 重启 teslamate 容器
docker compose start teslamate

Grafana 重置 admin 密码

该方法基于 Grafana 4.1 以上

grafana-cli admin reset-admin-password <new password>

如果上述方法报错:Could not find config defaults, make sure homepath command line parameter is set or working directory is homepath

那么使用如下 flag 来指定参数

grafana-cli admin reset-admin-password --homepath "/usr/share/grafana" newpass

自动备份脚本

#!/bin/bash

# 启用严格模式
set -e

echo "------开始执行TeslaMate备份脚本------"

# 初始化通知变量
backup_time=$(date "+%Y-%m-%d %H:%M:%S")
status="失败"
backup_file=""
original_size=0
copy_size=0
error_message="无"

# 定义备份目录和带日期的文件名
BACKUP_DIR="/share/Video/config/teslamate/teslamate_backups"
BACKUP_FILE="teslamate_$(date +%Y%m%d).bck"
backup_file="$BACKUP_FILE"

# 捕获退出信号发送通知
trap 'send_bark_notification' EXIT

echo "1.进入docker-compose.yml文件所在目录..."
cd /share/Video/config/teslamate

echo "2.开始执行官方备份命令..."
docker compose exec -T database pg_dump -U teslamate teslamate > "./$BACKUP_FILE"

echo "3.创建备份目录(如果不存在)..."
mkdir -p "$BACKUP_DIR"

echo "4.拷贝备份文件到备份目录..."
cp "./$BACKUP_FILE" "$BACKUP_DIR/$BACKUP_FILE"

echo "5.执行双重验证(文件存在性+非空检查)..."
original_size=$(ls -l "./$BACKUP_FILE" | awk '{print $5}')
if [ ! -f "./$BACKUP_FILE" ] || [ "$original_size" -eq 0 ]; then
    error_message="原始备份文件验证失败"
    exit 1
fi

copy_size=$(ls -l "$BACKUP_DIR/$BACKUP_FILE" | awk '{print $5}')
if [ ! -f "$BACKUP_DIR/$BACKUP_FILE" ] || [ "$copy_size" -eq 0 ]; then
    error_message="拷贝备份文件验证失败"
    exit 1
fi

echo "✅ 双重验证通过:"
echo "   原始文件大小: ${original_size} bytes"
echo "   备份文件大小: ${copy_size} bytes"

echo "6.输出最终目录列表..."
ls -l "./$BACKUP_FILE" "$BACKUP_DIR/$BACKUP_FILE"

# 标记状态为成功
status="成功"

echo "------备份脚本执行完毕!本次备份文件:$BACKUP_FILE ------"

# Bark通知函数
send_bark_notification() {
    local exit_code=$?
    [ $exit_code -eq 0 ] || status="失败"

    # 构造推送内容
    local content="备份时间:${backup_time}%0A\
文件名称:${backup_file}%0A\
原始大小:${original_size}%20bytes%0A\
备份大小:${copy_size}%20bytes%0A\
错误详情:${error_message}"

    # 编码处理
    local encoded_title="TeslaMate备份成功"
    encoded_title=$(echo "$encoded_title" | sed 's/ /%20/g')
    local encoded_content=$(echo "$content" | sed 's/ /%20/g; s/%0A/%0A/g')

    # 发送请求(静默模式,失败时输出提示)
    curl -sfL "https://api.day.app/[bark推送api]/${encoded_title}/${encoded_content}" >/dev/null 2>&1 || \
    echo "──❗ Bark通知发送失败──"
}