TeslaMate安装部署、数据备份及恢复
TeslaMate介绍
TeslaMate是一款备受特斯拉车主欢迎的开源解决方案,它为特斯拉车主提供了一系列强大的功能,包括数据分析、监控、统计通知等。作为开源项目,TeslaMate的代码完全开放,有一个活跃的社区在不断更新和改进它。 本文将详细介绍TeslaMate是什么以及它所提供的功能。
TeslaMate有什么功能?
数据分析和监控
TeslaMate通过特斯拉车辆的API接口获取各种数据,包括车辆状态、充电历史、行驶里程、能源消耗等。这些数据可以通过用户界面进行可视化展示,使车主能够直观地了解车辆的使用情况和性能表现。通过数据分析,车主可以更好地了解车辆的效率、充电习惯以及能源消耗情况。
Docker安装
本文档提供了在运行 Docker 的任何系统上安装 TeslaMate 的必要步骤。
本文档中使用的TeslaMate中文版本,主要解决了如下问题
界面汉化,大部分图表都能中文显示
修复国内地图和位置信息无法显示的问题
添加更多的报表,比如:电池健康度等
地图和位置接口换成高德地图,可以显示精确的位置信息而不再是xx路
支持微信公众号实时推送行程和充电等消息。
4和5功能目前仅在TeslaMate盒子上生效,后续自行安装的版本也会更新。
需求
Docker (如果你是docker新手, 参考 Installing Docker and Docker Compose)
一台始终开启的服务器,让TeslaMate可以持续获取数据
1G RAM
互联网接入, 可以链接到 tesla.com
指示
创建 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:
设置加密密钥 用于加密你的 Tesla API tokens,随便写个密码就行,不写的话,每次重启都要输入token (
ENCRYPTION_KEY
).设置数据库密码 (
DATABASE_PASS
,POSTGRES_PASSWORD
)使用
docker-compose up -d
命令启动docker容器.docker-compose up -d
用法
在浏览器访问: http://your-ip-address:4000
设置您的Tesla API tokens (参考常见问题)
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通知发送失败──"
}