A multi-arch container that makes it easy to spin up a virtual DCFC for testing.
- Multi-Architecture: Supports ARM64 (Apple Silicon, Raspberry Pi) and AMD64
- OCPP Support: Configurable OCPP version (1.6, 2.0.1, 2.1) via environment variable
- Multi-Connector: Configurable number of EVSEs/connectors (1–16) via
NUM_CONNECTORS - Charging Profiles: Full support for smart charging profiles
- Node-RED Dashboard: Visual interface for simulation control and monitoring
- Debug Build: Full debug symbols for detailed crash stack traces
Create a network w/ IPv6 enabled:
docker network create --ipv6 ip6net
Basic usage with OCPP 1.6:
docker run -d \
--name everest \
--network ip6net \
-p 1880:1880 \
-e OCPP_VERSION=1.6 \
-e OCPP_URL=ws://your-csms-server:9000 \
-e OCPP_ID=CP001 \
ghcr.io/relion-charging/everest-dcfc:latestUsing OCPP 2.0.1:
docker run -d \
--name everest \
--network ip6net \
-p 1880:1880 \
-e OCPP_VERSION=2.0.1 \
-e OCPP_URL=ws://your-csms-server:9000 \
-e OCPP_ID=CP001 \
ghcr.io/relion-charging/everest-dcfc:latestStarting a charger with 8 connectors:
docker run -d \
--name everest \
--network ip6net \
-p 1880:1880 \
-e OCPP_VERSION=1.6 \
-e OCPP_URL=ws://your-csms-server:9000 \
-e OCPP_ID=CP001 \
-e NUM_CONNECTORS=8 \
ghcr.io/relion-charging/everest-dcfc:latest| Variable | Default | Description |
|---|---|---|
OCPP_VERSION |
1.6 |
OCPP version to use. Options: 1.6, 2.0.1, 2.1 |
OCPP_URL |
ws://localhost:9000 |
WebSocket URL of the CSMS (Central System) |
OCPP_ID |
CP1 |
Charge Point ID for OCPP registration |
NUM_CONNECTORS |
1 |
Number of EVSEs/connectors to simulate (1–16) |
When NUM_CONNECTORS is set to more than 1, the container dynamically generates a full EVerest module stack for each connector at startup. Each connector gets its own evse_manager, yeti_driver, dc_supply, slac, evse_v2g, and ev_manager modules with independently addressable MQTT topics.
In the Node-RED dashboard, use the "Select Connector #" numeric input in the Connector panel to target a specific connector before clicking simulation or control buttons. For example, to start a session on connector 7 of an 8-connector charger:
- Set
NUM_CONNECTORS=8when starting the container - Open the Node-RED dashboard at http://localhost:1880/dashboard
- Set "Select Connector #" to
7 - Toggle "Enable EV Simulation" on
- Click "Car Plugin" to start a session on connector 7
Once the container is running:
- Node-RED Dashboard: http://localhost:1880/ui
- Node-RED Editor: http://localhost:1880/admin
The included Node-RED dashboard provides:
- Car Simulation Controls: Plugin/Unplug simulated EV
- Charging Controls: Pause/Resume charging sessions
- Monitoring: Real-time power, voltage, temperature display
- State Display: Current charging state
┌─────────────────────────────────────────────────────┐
│ Docker Container │
│ ┌─────────────────────────────────────────────┐ │
│ │ Supervisord (PID 1) │ │
│ └─────────────┬──────────┬──────────┬─────────┘ │
│ │ │ │ │
│ ┌─────────┐ │ ┌───────┴───────┐ │ ┌────────┐ │
│ │Mosquitto│◄──┤ │ EVerest │ ├─►│Node-RED│ │
│ │ :1883 │ │ │ Manager │ │ │ :1880 │ │
│ └─────────┘ │ └───────────────┘ │ └────────┘ │
│ ▲ │ │ │ │ │
│ │ │ ▼ │ │ │
│ │ │ ┌───────────────┐ │ │ │
│ └────────┴──│ OCPP Client │──┴───────┘ │
│ │ (1.6/2.0.1) │ │
│ └───────┬───────┘ │
└───────────────────────────┼─────────────────────────┘
│
▼
┌───────────────┐
│ CSMS │
│ (External) │
└───────────────┘
├── Dockerfile # Multi-stage build: EVerest + gomplate binary
├── entrypoint.sh # Startup script: runs gomplate, injects OCPP config
├── supervisord.conf # Process manager configuration
├── config-ocpp16.yaml.tmpl # Gomplate template → EVerest config for OCPP 1.6
├── config-ocpp201.yaml.tmpl # Gomplate template → EVerest config for OCPP 2.0.1/2.1
├── ocpp-config-16.json # OCPP 1.6 protocol configuration (processed by jq)
├── ocpp-config-201.json # OCPP 2.0.1 protocol configuration (processed by jq)
├── flows.json # Node-RED dashboard flows
└── README.md # This file
At runtime, entrypoint.sh calls gomplate on the appropriate .tmpl file. The template loops over NUM_CONNECTORS to emit one full EVerest module stack per connector, then appends the shared module section. The resulting /etc/everest/config.yaml is consumed by EVerest Manager.
To customise the EVerest module layout (e.g. change DC supply limits, add a new module), edit the relevant .tmpl file — no shell scripting required.
This container includes full support for OCPP Smart Charging profiles:
- OCPP 1.6:
SetChargingProfile,ClearChargingProfile,GetCompositeSchedule - OCPP 2.0.1: Smart Charging feature profile with enhanced scheduling
The EnergyManager module processes charging profiles and adjusts the charging current accordingly.
This container is built with full debug symbols (-g3 -ggdb) for better crash diagnostics. When a crash occurs, stack traces will include:
- Function names
- Source file names
- Line numbers
When a crash occurs (like the buffer overflow), the container will:
- Print the error message to stdout/stderr (captured in docker logs)
- Generate a core dump file at
/tmp/everest-logs/core.*(if enabled) - The error will include memory addresses that can be resolved with debug symbols
# View container logs for crash information
docker logs everest
# Copy crash logs out of the container
docker cp everest:/tmp/everest-logs/ ./crash-logs/
# If core dumps are available, analyze with gdb
docker exec -it everest gdb /usr/local/bin/manager /tmp/everest-logs/core.*Once in gdb with a core dump:
# Show the stack trace
bt
# Show full stack trace with local variables
bt full
# Show source code context (if available)
list
# Print variable values
print <variable_name># All logs
docker logs everest
# Follow logs
docker logs -f everest
# Specific service logs (exec into container)
docker exec -it everest tail -f /var/log/supervisor/everest.log
docker exec -it everest tail -f /var/log/supervisor/nodered.log
docker exec -it everest tail -f /var/log/supervisor/mosquitto.log
# Check for core dumps after a crash
docker exec -it everest ls -la /tmp/everest-logs/docker exec -it everest supervisorctl status# Subscribe to all EVerest topics
docker exec -it everest mosquitto_sub -t 'everest/#' -vApache 2.0 - See the EVerest project for full license details.
