全新部署 Mytesla
本指南适用于从零开始部署完整 Mytesla 系统的用户。如果您已经有 TeslaMate 运行,请参考 已有 TeslaMate 指南。
适合人群
- 没有安装过 TeslaMate 的用户
- 希望使用最新配置的用户
- 追求最佳实践的用户
注意
确保已完成环境初始化
部署概览
完整的 Mytesla 系统包括以下组件:
部署架构
核心服务层
- PostgreSQL: 数据持久化存储
- MQTT: 实时消息传递
- TeslaMate: 车辆数据收集器
- Grafana: 数据可视化仪表板
API 服务层
- TeslaMateAPI: RESTful API 服务
- 健康检查: 服务状态监控
网络暴露层
- Tailscale (推荐): 零配置 VPN
- Cloudflare Tunnel: 企业级代理
- Traefik: 反向代理和负载均衡
一键部署 TODO
手动部署
如果您希望完全控制部署过程,可以按照详细步骤手动配置。
步骤 1: 准备工作环境
# 创建项目目录
mkdir -p ~/mytesla/
cd ~/mytesla
步骤 2: 创建核心配置
创建 .env
环境配置文件:
cat > .env << 'EOF'
# 数据库配置
TM_DB_USER=teslamate
TM_DB_PASS=password
TM_DB_NAME=teslamate
# 建议使用复杂密码,使用 openssl 生成
TM_ENCRYPTION_KEY=
# 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
# Tailscale 配置见下文
TS_AUTHKEY=
TS_HOSTNAME=
TS_TAILNET_NAME=
EOF
步骤 3: 创建 Docker Compose 配置
大陆网络优化
由于大陆网络环境的特殊性,如果无法拉取 Docker 镜像,可以使用镜像加速服务。将配置中的镜像地址替换为:
mytesla/teslamateapi
→docker.1ms.run/mytesla/teslamateapi
teslamate/teslamate:2.0.0
→docker.1ms.run/teslamate/teslamate:2.0.0
teslamate/grafana:2.0.0
→docker.1ms.run/teslamate/grafana:2.0.0
postgres:17
→docker.1ms.run/postgres:17
eclipse-mosquitto:2
→docker.1ms.run/eclipse-mosquitto:2
tailscale/tailscale:latest
→docker.1ms.run/tailscale/tailscale:latest
traefik:latest
→docker.1ms.run/traefik:latest
cat > docker-compose.yml << 'EOF'
services:
tailscale:
image: tailscale/tailscale:latest
container_name: tailscale
hostname: ${TS_HOSTNAME}
environment:
- TS_AUTHKEY=${TS_AUTHKEY}
- TS_STATE_DIR=/var/lib/tailscale
- TS_SOCKET=/var/run/tailscale/tailscaled.sock
volumes:
- ./tailscale/state:/var/lib/tailscale:rw
- ./tailscale/socket:/var/run/tailscale
- /dev/net/tun:/dev/net/tun
cap_add:
- NET_ADMIN
- SYS_MODULE
restart: unless-stopped
traefik:
image: traefik:latest
container_name: traefik
network_mode: service:tailscale
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./tailscale/state:/var/lib/tailscale:rw
- ./tailscale/socket:/var/run/tailscale
command:
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --certificatesresolvers.myresolver.tailscale=true
restart: unless-stopped
depends_on:
- tailscale
teslamate:
image: teslamate/teslamate:2.0.0
container_name: teslamate
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
- MQTT_HOST=mosquitto
- VIRTUAL_HOST=${TS_HOSTNAME}.${TS_TAILNET_NAME}
- 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
- 4000:4000
labels:
- "traefik.enable=true"
- "traefik.port=4000"
- "traefik.http.routers.teslamate.rule=Host(`${TS_HOSTNAME}.${TS_TAILNET_NAME}`)"
- "traefik.http.routers.teslamate.entrypoints=websecure"
- "traefik.http.routers.teslamate.tls=true"
- "traefik.http.routers.teslamate.tls.certresolver=myresolver"
- "traefik.http.routers.teslamate-ws.rule=Host(`${TS_HOSTNAME}.${TS_TAILNET_NAME}`) && Path(`/live/websocket`)"
- "traefik.http.routers.teslamate-ws.entrypoints=websecure"
- "traefik.http.routers.teslamate-ws.tls="
grafana:
image: teslamate/grafana:2.0.0
container_name: grafana
restart: unless-stopped
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_ANONYMOUS_ENABLED=false
- GF_SERVER_DOMAIN=${TS_HOSTNAME}.${TS_TAILNET_NAME}
- GF_SERVER_ROOT_URL=https://${TS_HOSTNAME}.${TS_TAILNET_NAME}/grafana
- GF_SERVER_SERVE_FROM_SUB_PATH=true
volumes:
- grafana-data:/var/lib/grafana
ports: # Remove if you access Grafana only via Tailscale
- 3000:3000
labels:
- "traefik.enable=true"
- "traefik.http.routers.grafana.rule=Host(`${TS_HOSTNAME}.${TS_TAILNET_NAME}`) && PathPrefix(`/grafana`)"
- "traefik.http.routers.grafana.entrypoints=websecure"
- "traefik.http.routers.grafana.tls=true"
- "traefik.http.routers.grafana.tls.certresolver=myresolver"
- "traefik.port=3000"
teslamateapi:
image: mytesla/teslamateapi:latest
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:
- teslamateapi-data:/opt/app/data
ports: # 如果仅通过 Tailscale 访问 TeslamateAPI,请删除此部分
- 8080:8080
labels:
- "traefik.enable=true"
- "traefik.http.routers.teslamateapi.rule=Host(`${TS_HOSTNAME}.${TS_TAILNET_NAME}`) && (Path(`/api`) || PathPrefix(`/api/`))"
- "traefik.http.routers.teslamateapi.entrypoints=websecure"
- "traefik.http.routers.teslamateapi.tls=true"
- "traefik.http.routers.teslamateapi.tls.certresolver=myresolver"
- "traefik.port=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:
- postgres-data:/var/lib/postgresql/data
mosquitto:
image: eclipse-mosquitto:2
restart: always
command: mosquitto -c /mosquitto-no-auth.conf
volumes:
- mosquitto-conf:/mosquitto/config
- mosquitto-data:/mosquitto/data
volumes:
grafana-data:
postgres-data:
mosquitto-conf:
mosquitto-data:
teslamateapi-data:
EOF
步骤 4: 使用 Tailscale 暴露服务
Tailscale 是一个基于 WireGuard 的零配置 VPN 服务,非常适合安全地暴露内网服务。
为什么选择 Tailscale?
- ✅ 零配置:无需复杂的网络设置
- ✅ 端到端加密:基于 WireGuard 协议
- ✅ 无需公网 IP:支持 NAT 穿透
- ✅ 免费额度充足:个人使用完全免费
- ✅ 跨平台支持:支持所有主流操作系统
步骤 1: 注册 Tailscale 账号
- 访问 Tailscale 官网
- 点击 "Get Started" 注册账号
- 可以使用 Google、Microsoft 或 GitHub 账号登录
步骤 2: 获取认证密钥
- 登录 Tailscale 管理控制台
- 点击 "Generate auth key"
- 配置密钥选项:
- ✅ Reusable: 不建议勾选
- 点击 "Generate key" 并复制密钥
安全提示
Auth Key 只显示一次,请妥善保存!
步骤 3: 环境变量配置
在 .env
文件中添加:
# Tailscale 配置
TS_HOSTNAME=mytesla # 您的设备名称
TS_AUTHKEY=tskey-auth-XXXXX-YYYYY # 从步骤2获取的密钥
TS_TAILNET_NAME=your-name.ts.net # 您的 Tailnet 域名
获取 Tailnet 域名
在 Tailscale 控制台 的 DNS 页面可以找到您的 Tailnet 域名。
步骤 5: 部署和启动
docker-compose up -d
docker-compose ps
步骤6:更新 tailscale node key expire setting
tailscale machines 中找到您的节点,设置中选择 Disable key expiry,否则节点会过期,导致服务无法访问。
验证部署
服务状态检查
# 检查所有容器状态
docker-compose ps
# 查看服务日志
docker-compose logs teslamate
docker-compose logs teslamateapi
Web 界面访问
服务 | 地址 | 用途 | 默认账号 |
---|---|---|---|
TeslaMate | http://localhost:4000 | 主配置界面 | 无需登录 |
Grafana | http://localhost:3000 | 数据可视化 | admin / [生成的密码] |
TeslaMateAPI | http://localhost:8080 | API 状态页 | 无需登录 |
⚙️ 初始配置
1. 配置 TeslaMate
授权车辆
2. 验证 Grafana
访问 http://localhost:3000/grafana:
- 使用生成的管理员密码登录
- 验证仪表板是否正常加载
- 确认数据源连接正常
3. 验证 Tailscale
- 将您的另一台设备安装 tailscale 客户端
- 连接到您的 Tailnet
- 访问
https://${TS_HOSTNAME}.${TS_TAILNET_NAME}
验证是否可以访问 - 测试 API 端点:
https://${TS_HOSTNAME}.${TS_TAILNET_NAME}/api/ping
- 应该返回{"message": "pong"}
浏览器访问
在任何连接到您 Tailnet 的设备上打开浏览器,访问 https://${TS_HOSTNAME}.${TS_TAILNET_NAME}
来访问 TeslaMate 界面并验证设置是否正常工作。
4. 在 Mytesla 配置
- 访问 https://mytesla.cc
- 进入 Settings → TeslaMate
- 输入 API 地址:
https://[TS_HOSTNAME].[TS_TAILNET_NAME]
- 如果设置了 API_TOKEN,在 API Token 字段中输入
- 点击测试连接
5. 恭喜
恭喜你,你已经完成了 Mytesla 的部署。
🆘 故障排除
如果遇到问题,请查看: