Skip to content

Commit e510d88

Browse files
committed
Clear TeslaMate tokens after backup restore
1 parent 501698d commit e510d88

3 files changed

Lines changed: 54 additions & 5 deletions

File tree

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Nginx / Frontend -- 内网 HTTP --> FastAPI Backend -- Docker 内网 --> Pos
1616
TeslaMate Collector -- 内网 --> PostgreSQL + MQTT
1717
```
1818

19-
默认生产部署只发布 `web``WEB_PORT``api` 只在 Docker 内网暴露 `8000`,TeslaMate 只在 Docker 内网暴露 `4000`,PostgreSQL 和 MQTT 也都只在内网可见。`database` 镜像内置首次启动恢复备份脚本,`db-init` 服务会自动创建只读数据库账号,不需要手工执行 SQL,也不需要在部署目录额外复制脚本文件。
19+
默认生产部署只发布 `web``WEB_PORT``api` 只在 Docker 内网暴露 `8000`,TeslaMate 只在 Docker 内网暴露 `4000`,PostgreSQL 和 MQTT 也都只在内网可见。`database` 镜像内置首次启动恢复备份脚本,恢复后会自动清空备份里的旧 TeslaMate token,`db-init` 服务会自动创建只读数据库账号,不需要手工执行 SQL,也不需要在部署目录额外复制脚本文件。
2020

2121
## 功能
2222

@@ -29,7 +29,7 @@ TeslaMate Collector -- 内网 --> PostgreSQL + MQTT
2929

3030
## 本地用当前备份验证
3131

32-
当前目录里的 `teslamate.bck` 是 PostgreSQL 18 plain SQL dump,可以直接用本地 compose 恢复测试库
32+
当前目录里的 `teslamate.bck` 是 PostgreSQL 18 plain SQL dump,可以直接用本地 compose 通过同一套恢复脚本恢复测试库。恢复完成后,脚本会自动清空备份里的旧 TeslaMate token
3333

3434
```bash
3535
docker compose version
@@ -164,7 +164,7 @@ http://部署机IP:8080
164164

165165
如果目录里有多个备份文件,脚本会按名称优先级取第一个匹配项。这个导入只在数据库卷首次初始化时执行一次;后续镜像更新、容器重启不会再次导入,也不会覆盖已有数据。若要重新导入,需要先删除对应的 PostgreSQL volume。
166166

167-
如果备份里包含旧的 TeslaMate token,并且 `TM_ENCRYPTION_KEY` 也保持一致,那么恢复后通常可以直接继续使用,不需要重新额外配置授权 token
167+
恢复脚本会在备份导入完成后自动清空 `private.tokens`。如果备份来自旧版 TeslaMate,脚本也会兼容清空 `public.tokens`。这样历史行程、充电、位置等数据会保留,但不会继承备份里的旧 Tesla 授权;启动后访问 `http://部署机IP:8080/teslamate/` 重新完成授权即可
168168

169169
完整重建并重新导入备份:
170170

compose.local.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@ name: tesla-dashboard-local
22

33
services:
44
db:
5-
image: postgres:18-trixie
5+
build:
6+
context: ./deploy
7+
dockerfile: Dockerfile.postgres
68
restart: unless-stopped
79
environment:
810
POSTGRES_USER: teslamate
911
POSTGRES_PASSWORD: teslamate
1012
POSTGRES_DB: teslamate
1113
volumes:
1214
- pgdata18:/var/lib/postgresql
13-
- ./teslamate.bck:/docker-entrypoint-initdb.d/10-teslamate.sql:ro
15+
- ./:/backup-source:ro
1416
networks:
1517
- data
1618
healthcheck:

deploy/restore-backup-if-present.sh

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ fi
4646

4747
echo "Restoring TeslaMate database backup: $backup_file"
4848

49+
prepare_database_for_restore() {
50+
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<'SQL'
51+
DROP SCHEMA IF EXISTS public CASCADE;
52+
DROP SCHEMA IF EXISTS private CASCADE;
53+
CREATE SCHEMA public;
54+
CREATE EXTENSION IF NOT EXISTS cube WITH SCHEMA public;
55+
CREATE EXTENSION IF NOT EXISTS earthdistance WITH SCHEMA public;
56+
SQL
57+
}
58+
4959
restore_dump_or_sql() {
5060
candidate="$1"
5161

@@ -56,6 +66,41 @@ restore_dump_or_sql() {
5666
fi
5767
}
5868

69+
clear_restored_teslamate_tokens() {
70+
echo "Clearing restored TeslaMate API tokens so this instance can be authorized fresh."
71+
72+
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<'SQL'
73+
DO $$
74+
DECLARE
75+
token_table record;
76+
cleared_count integer := 0;
77+
BEGIN
78+
FOR token_table IN
79+
SELECT table_schema, table_name
80+
FROM information_schema.tables
81+
WHERE table_name = 'tokens'
82+
AND table_schema IN ('private', 'public')
83+
AND table_type = 'BASE TABLE'
84+
LOOP
85+
EXECUTE format(
86+
'TRUNCATE TABLE %I.%I RESTART IDENTITY CASCADE',
87+
token_table.table_schema,
88+
token_table.table_name
89+
);
90+
cleared_count := cleared_count + 1;
91+
RAISE NOTICE 'Cleared restored TeslaMate tokens from %.%', token_table.table_schema, token_table.table_name;
92+
END LOOP;
93+
94+
IF cleared_count = 0 THEN
95+
RAISE NOTICE 'No TeslaMate tokens table found to clear.';
96+
END IF;
97+
END
98+
$$;
99+
SQL
100+
}
101+
102+
prepare_database_for_restore
103+
59104
case "$backup_file" in
60105
*.sql|*.bck)
61106
restore_dump_or_sql "$backup_file"
@@ -81,4 +126,6 @@ case "$backup_file" in
81126
;;
82127
esac
83128

129+
clear_restored_teslamate_tokens
130+
84131
echo "TeslaMate database backup restore completed."

0 commit comments

Comments
 (0)