Skip to main content

Fresh Installation of Mytesla

This guide is for users who want to deploy a complete Mytesla system from scratch. If you already have TeslaMate running, please refer to the Existing TeslaMate guide.

Target Audience
  • Users who have never installed TeslaMate
  • Users who want to use the latest configuration
  • Users pursuing best practices
warning

Ensure you have completed Environment Setup

Deployment Overview​

The complete Mytesla system includes the following components:

Deployment Architecture​

Core Service Layer​

  • PostgreSQL: Data persistence storage
  • MQTT: Real-time message passing
  • TeslaMate: Vehicle data collector
  • Grafana: Data visualization dashboard

API Service Layer​

  • TeslaMateAPI: RESTful API service
  • Health Check: Service status monitoring

Network Exposure Layer​

  • Tailscale (Recommended): Zero-configuration VPN
  • Cloudflare Tunnel: Enterprise-grade proxy
  • Traefik: Reverse proxy and load balancing

One-Click Deployment TODO​

Manual Deployment​

If you want complete control over the deployment process, you can follow the detailed steps for manual configuration.

Step 1: Prepare Working Environment​

# Create project directory
mkdir -p ~/mytesla/
cd ~/mytesla

Step 2: Create Core Configuration​

Create .env environment configuration file:

cat > .env << 'EOF'
# Database configuration
TM_DB_USER=teslamate
TM_DB_PASS=password
TM_DB_NAME=teslamate
# Recommend using complex password, generate with openssl
TM_ENCRYPTION_KEY=

# API Security configuration (Strongly recommended)
# Generate secure token: openssl rand -hex 32
API_TOKEN=

# Timezone configuration - Replace with your timezone from https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
TZ=Asia/Shanghai

# Grafana configuration, default password can be changed after login
GRAFANA_PW=admin
GRAFANA_USER=admin

# Tailscale configuration see below
TS_AUTHKEY=
TS_HOSTNAME=
TS_TAILNET_NAME=
EOF

Step 3: Create Docker Compose Configuration​

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} # 📍 Set your timezone from 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
- mosquitto
- teslamate
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} # 🔐 Strongly recommended for security
volumes:
- teslamateapi-data:/opt/app/data
ports: # Remove if you access TeslamateAPI only via Tailscale
- 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

Step 4: Using Tailscale to Expose Services​

Tailscale is a zero-configuration VPN service based on WireGuard, perfect for securely exposing internal network services.

Why choose Tailscale?
  • ✅ Zero configuration: No need for complex network setup
  • ✅ End-to-end encryption: Based on WireGuard protocol
  • ✅ No public IP required: Supports NAT traversal
  • ✅ Generous free tier: Completely free for personal use
  • ✅ Cross-platform support: Supports all mainstream operating systems

Step 1: Register Tailscale Account​

  1. Visit Tailscale official website
  2. Click "Get Started" to register an account
  3. You can use Google, Microsoft or GitHub account to log in

Step 2: Get Authentication Key​

  1. Log in to Tailscale management console
  2. Click "Generate auth key"
  3. Configure key options:
    • ✅ Reusable: Not recommended to check
  4. Click "Generate key" and copy the key
Security Notice

Auth Key is only displayed once, please save it carefully!

Step 3: Environment Variable Configuration​

Add to .env file:

# Tailscale configuration
TS_HOSTNAME=mytesla # Your device name
TS_AUTHKEY=tskey-auth-XXXXX-YYYYY # Key obtained from step 2
TS_TAILNET_NAME=your-name.ts.net # Your Tailnet domain
Get Tailnet Domain

You can find your Tailnet domain on the DNS page of Tailscale console.

Step 5: Deploy and Start​

docker-compose up -d

docker-compose ps

Step 6: Update Tailscale Node Key Expire Setting​

Find your node in tailscale machines, select "Disable key expiry" in settings, otherwise the node will expire and services will become inaccessible.

Verify Deployment​

Service Status Check​

# Check all container status
docker-compose ps

# View service logs
docker-compose logs teslamate
docker-compose logs teslamateapi

Web Interface Access​

ServiceAddressPurposeDefault Account
TeslaMatehttp://localhost:4000Main configuration interfaceNo login required
Grafanahttp://localhost:3000Data visualizationadmin / [generated password]
TeslaMateAPIhttp://localhost:8080API status pageNo login required

⚙️ Initial Configuration​

1. Configure TeslaMate​

Visit http://localhost:4000:

Authorize Vehicle

2. Verify Grafana​

Visit http://localhost:3000/grafana:

  1. Log in with generated admin password
  2. Verify dashboards load normally
  3. Confirm data source connection is normal

3. Verify Tailscale​

  • Install tailscale client on your other device
  • Connect to your Tailnet
  • Visit https://[TS_HOSTNAME].[TS_TAILNET_NAME] to verify access
  • Test the API endpoint: https://[TS_HOSTNAME].[TS_TAILNET_NAME]/api/ping - should return {"message": "pong"}
Browser Access

Open your browser and visit https://[TS_HOSTNAME].[TS_TAILNET_NAME] from any device connected to your Tailnet to access the TeslaMate interface and verify the setup is working correctly.

4. Configure in Mytesla​

  1. Visit https://mytesla.cc
  2. Go to Settings → TeslaMate
  3. Enter API address: https://[TS_HOSTNAME].[TS_TAILNET_NAME]
  4. If you set API_TOKEN, enter it in the API Token field
  5. Click test connection

5. Congratulations​

Congratulations, you have completed the Mytesla deployment.

🆘 Troubleshooting​

If you encounter issues, please check: