Aggiunta configurazione tramite variabili d'ambiente e fix Docker Hub secrets
Build Docker Image for Raspberry Pi / build-and-push (push) Failing after 23s
Build Docker Image for Raspberry Pi / build-and-push (push) Failing after 23s
- Aggiunto supporto ENV variables nel Dockerfile: * INVERTER_DEVICE, MQTT_SERVER, MQTT_PORT, MQTT_TOPIC * MQTT_DEVICENAME, MQTT_USERNAME, MQTT_PASSWORD * FORCE_DISCOVERY, SKIP_DISCOVERY - Implementata funzione update_mqtt_config() in entrypoint.sh * Aggiorna automaticamente mqtt.json da ENV variables all'avvio * Backup automatico configurazione originale - Fix workflow Docker build: * Login Docker Hub solo se secrets configurati * Push solo se secrets disponibili (evita errori CI/CD) * Build funziona anche senza secrets (utile per test locali) - Aggiornato docker-compose.yml con esempio ENV variables - Creata documentazione completa DOCKER_SETUP.md: * Guida configurazione variabili d'ambiente * Esempi docker-compose e docker run * Guida configurazione secrets Gitea * Troubleshooting e health check Ora è possibile configurare completamente il container senza modificare file
This commit is contained in:
@@ -43,7 +43,7 @@ jobs:
|
|||||||
type=raw,value=latest,enable={{is_default_branch}}
|
type=raw,value=latest,enable={{is_default_branch}}
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
- name: Login to Docker Hub
|
||||||
if: github.event_name != 'pull_request'
|
if: github.event_name != 'pull_request' && secrets.DOCKER_USERNAME != ''
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v2
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
@@ -55,7 +55,7 @@ jobs:
|
|||||||
context: .
|
context: .
|
||||||
file: ./Dockerfile.multiarch
|
file: ./Dockerfile.multiarch
|
||||||
platforms: linux/arm/v6,linux/arm/v7,linux/arm64
|
platforms: linux/arm/v6,linux/arm/v7,linux/arm64
|
||||||
push: ${{ github.event_name != 'pull_request' }}
|
push: ${{ github.event_name != 'pull_request' && secrets.DOCKER_USERNAME != '' }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
build-args: |
|
build-args: |
|
||||||
|
|||||||
@@ -24,6 +24,17 @@ ADD config/ /etc/inverter/
|
|||||||
RUN cd /opt/inverter-cli && \
|
RUN cd /opt/inverter-cli && \
|
||||||
mkdir bin && cmake . && make
|
mkdir bin && cmake . && make
|
||||||
|
|
||||||
|
# Environment variables for runtime configuration
|
||||||
|
ENV INVERTER_DEVICE="/dev/ttyUSB0" \
|
||||||
|
MQTT_SERVER="192.168.1.37" \
|
||||||
|
MQTT_PORT="1883" \
|
||||||
|
MQTT_TOPIC="homeassistant" \
|
||||||
|
MQTT_DEVICENAME="voltronic" \
|
||||||
|
MQTT_USERNAME="" \
|
||||||
|
MQTT_PASSWORD="" \
|
||||||
|
FORCE_DISCOVERY="false" \
|
||||||
|
SKIP_DISCOVERY="false"
|
||||||
|
|
||||||
HEALTHCHECK \
|
HEALTHCHECK \
|
||||||
--interval=30s \
|
--interval=30s \
|
||||||
--timeout=10s \
|
--timeout=10s \
|
||||||
|
|||||||
+11
-2
@@ -19,9 +19,18 @@ services:
|
|||||||
|
|
||||||
# Environment variables for auto-discovery
|
# Environment variables for auto-discovery
|
||||||
environment:
|
environment:
|
||||||
# Default device (can be ttyUSB0, ttyUSB1, ttyS0, hidraw0, etc.)
|
# Device configuration
|
||||||
- INVERTER_DEVICE=/dev/ttyUSB1
|
- INVERTER_DEVICE=/dev/ttyUSB0
|
||||||
|
|
||||||
|
# MQTT Broker configuration
|
||||||
|
- MQTT_SERVER=192.168.1.37
|
||||||
|
- MQTT_PORT=1883
|
||||||
|
- MQTT_TOPIC=homeassistant
|
||||||
|
- MQTT_DEVICENAME=voltronic
|
||||||
|
- MQTT_USERNAME=mqtt_user
|
||||||
|
- MQTT_PASSWORD=your_password_here
|
||||||
|
|
||||||
|
# Auto-discovery options
|
||||||
# Force auto-discovery on every container start (default: false)
|
# Force auto-discovery on every container start (default: false)
|
||||||
# Set to "true" to re-run discovery even if previous results exist
|
# Set to "true" to re-run discovery even if previous results exist
|
||||||
- FORCE_DISCOVERY=false
|
- FORCE_DISCOVERY=false
|
||||||
|
|||||||
@@ -0,0 +1,203 @@
|
|||||||
|
# Docker Setup e Configurazione
|
||||||
|
|
||||||
|
## Variabili d'Ambiente
|
||||||
|
|
||||||
|
Il container supporta la configurazione tramite variabili d'ambiente per massima flessibilità.
|
||||||
|
|
||||||
|
### Variabili Disponibili
|
||||||
|
|
||||||
|
| Variabile | Descrizione | Default |
|
||||||
|
|-----------|-------------|---------|
|
||||||
|
| `INVERTER_DEVICE` | Device seriale inverter | `/dev/ttyUSB0` |
|
||||||
|
| `MQTT_SERVER` | Indirizzo IP/hostname broker MQTT | `192.168.1.37` |
|
||||||
|
| `MQTT_PORT` | Porta broker MQTT | `1883` |
|
||||||
|
| `MQTT_TOPIC` | Topic base MQTT | `homeassistant` |
|
||||||
|
| `MQTT_DEVICENAME` | Nome device per i topic | `voltronic` |
|
||||||
|
| `MQTT_USERNAME` | Username autenticazione MQTT | (vuoto) |
|
||||||
|
| `MQTT_PASSWORD` | Password autenticazione MQTT | (vuoto) |
|
||||||
|
| `FORCE_DISCOVERY` | Forza discovery ad ogni avvio | `false` |
|
||||||
|
| `SKIP_DISCOVERY` | Salta discovery, usa solo config | `false` |
|
||||||
|
|
||||||
|
### Esempio docker-compose.yml
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: '3'
|
||||||
|
|
||||||
|
services:
|
||||||
|
voltronic-mqtt:
|
||||||
|
image: bushrangers/ha-voltronic-mqtt
|
||||||
|
container_name: voltronic-mqtt
|
||||||
|
privileged: true
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
environment:
|
||||||
|
# Device configuration
|
||||||
|
- INVERTER_DEVICE=/dev/ttyUSB0
|
||||||
|
|
||||||
|
# MQTT Broker configuration
|
||||||
|
- MQTT_SERVER=192.168.1.100
|
||||||
|
- MQTT_PORT=1883
|
||||||
|
- MQTT_TOPIC=homeassistant
|
||||||
|
- MQTT_DEVICENAME=voltronic
|
||||||
|
- MQTT_USERNAME=mqtt_user
|
||||||
|
- MQTT_PASSWORD=secret_password
|
||||||
|
|
||||||
|
# Discovery options
|
||||||
|
- FORCE_DISCOVERY=false
|
||||||
|
- SKIP_DISCOVERY=false
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- ./config/:/etc/inverter/
|
||||||
|
|
||||||
|
devices:
|
||||||
|
- /dev/ttyUSB0:/dev/ttyUSB0:rwm
|
||||||
|
- /dev/ttyUSB1:/dev/ttyUSB1:rwm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Esempio docker run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -d \
|
||||||
|
--name voltronic-mqtt \
|
||||||
|
--privileged \
|
||||||
|
--restart always \
|
||||||
|
-e INVERTER_DEVICE=/dev/ttyUSB0 \
|
||||||
|
-e MQTT_SERVER=192.168.1.100 \
|
||||||
|
-e MQTT_PORT=1883 \
|
||||||
|
-e MQTT_USERNAME=mqtt_user \
|
||||||
|
-e MQTT_PASSWORD=secret_password \
|
||||||
|
-v $(pwd)/config:/etc/inverter/ \
|
||||||
|
--device=/dev/ttyUSB0:/dev/ttyUSB0:rwm \
|
||||||
|
bushrangers/ha-voltronic-mqtt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Topic MQTT Pubblicati
|
||||||
|
|
||||||
|
Con configurazione default (`MQTT_DEVICENAME=voltronic`):
|
||||||
|
|
||||||
|
### Singolo Inverter
|
||||||
|
```
|
||||||
|
homeassistant/sensor/voltronic_Battery_voltage
|
||||||
|
homeassistant/sensor/voltronic_Load_watt
|
||||||
|
homeassistant/sensor/voltronic_PV_in_voltage
|
||||||
|
... (e altri)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Multi-Inverter Paralleli
|
||||||
|
```
|
||||||
|
homeassistant/sensor/voltronic_inv1_serial
|
||||||
|
homeassistant/sensor/voltronic_inv1_Battery_voltage
|
||||||
|
homeassistant/sensor/voltronic_inv1_Load_watt
|
||||||
|
homeassistant/sensor/voltronic_inv2_serial
|
||||||
|
homeassistant/sensor/voltronic_inv2_Battery_voltage
|
||||||
|
homeassistant/sensor/voltronic_inv2_Load_watt
|
||||||
|
... (e altri)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Build Locale
|
||||||
|
|
||||||
|
### Build Semplice (architettura corrente)
|
||||||
|
```bash
|
||||||
|
docker build -f Dockerfile.multiarch -t voltronic-mqtt:local .
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build Multi-Arch (richiede buildx)
|
||||||
|
```bash
|
||||||
|
docker buildx build \
|
||||||
|
--platform linux/arm/v6,linux/arm/v7,linux/arm64 \
|
||||||
|
-f Dockerfile.multiarch \
|
||||||
|
-t voltronic-mqtt:multi-arch \
|
||||||
|
--load \
|
||||||
|
.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configurazione Secrets Gitea (per CI/CD)
|
||||||
|
|
||||||
|
Se vuoi abilitare il push automatico su Docker Hub tramite Gitea Actions:
|
||||||
|
|
||||||
|
1. Vai su Gitea → Repository → Settings → Secrets
|
||||||
|
2. Aggiungi i seguenti secrets:
|
||||||
|
- `DOCKER_USERNAME`: tuo username Docker Hub
|
||||||
|
- `DOCKER_PASSWORD`: token di accesso Docker Hub (o password)
|
||||||
|
|
||||||
|
**Nota:** Se i secrets non sono configurati, il workflow eseguirà comunque la build ma **non farà push** su Docker Hub (utile per testing).
|
||||||
|
|
||||||
|
### Creare un Access Token Docker Hub
|
||||||
|
|
||||||
|
1. Login su https://hub.docker.com
|
||||||
|
2. Account Settings → Security → New Access Token
|
||||||
|
3. Copia il token generato
|
||||||
|
4. Usa questo token come `DOCKER_PASSWORD` in Gitea
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Container non si avvia
|
||||||
|
|
||||||
|
**Verifica device:**
|
||||||
|
```bash
|
||||||
|
ls -la /dev/ttyUSB*
|
||||||
|
```
|
||||||
|
|
||||||
|
**Verifica permessi:**
|
||||||
|
```bash
|
||||||
|
# Aggiungi utente al gruppo dialout
|
||||||
|
sudo usermod -a -G dialout $USER
|
||||||
|
|
||||||
|
# Riavvia la sessione o logout/login
|
||||||
|
```
|
||||||
|
|
||||||
|
### MQTT non funziona
|
||||||
|
|
||||||
|
**Test connessione MQTT:**
|
||||||
|
```bash
|
||||||
|
docker exec -it voltronic-mqtt bash -c "mosquitto_pub -h \$MQTT_SERVER -p \$MQTT_PORT -u \$MQTT_USERNAME -P \$MQTT_PASSWORD -t test/voltronic -m 'test'"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Verifica topic pubblicati:**
|
||||||
|
```bash
|
||||||
|
mosquitto_sub -h 192.168.1.100 -p 1883 -u mqtt_user -P password -v -t "homeassistant/sensor/voltronic_#"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Discovery fallisce
|
||||||
|
|
||||||
|
**Forza re-discovery:**
|
||||||
|
```bash
|
||||||
|
docker restart voltronic-mqtt
|
||||||
|
# oppure
|
||||||
|
docker stop voltronic-mqtt
|
||||||
|
docker rm voltronic-mqtt
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
**Test manuale discovery:**
|
||||||
|
```bash
|
||||||
|
docker exec -it voltronic-mqtt bash -c '/opt/inverter-cli/bin/inverter_poller -d -a'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verificare logs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Logs real-time
|
||||||
|
docker logs -f voltronic-mqtt
|
||||||
|
|
||||||
|
# Ultimi 100 righe
|
||||||
|
docker logs --tail 100 voltronic-mqtt
|
||||||
|
|
||||||
|
# Logs con timestamp
|
||||||
|
docker logs -t voltronic-mqtt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Health Check
|
||||||
|
|
||||||
|
Il container include un healthcheck automatico che verifica:
|
||||||
|
- Processo inverter_poller attivo
|
||||||
|
- Comunicazione con l'inverter funzionante
|
||||||
|
|
||||||
|
Status:
|
||||||
|
```bash
|
||||||
|
docker ps
|
||||||
|
# Colonna STATUS mostra "healthy" o "unhealthy"
|
||||||
|
|
||||||
|
# Dettagli healthcheck
|
||||||
|
docker inspect --format='{{json .State.Health}}' voltronic-mqtt | jq
|
||||||
|
```
|
||||||
@@ -14,13 +14,50 @@ TEMP_CONF="/tmp/inverter_discovered.conf"
|
|||||||
INVERTER_DEVICE="${INVERTER_DEVICE:-/dev/ttyUSB0}"
|
INVERTER_DEVICE="${INVERTER_DEVICE:-/dev/ttyUSB0}"
|
||||||
FORCE_DISCOVERY="${FORCE_DISCOVERY:-false}"
|
FORCE_DISCOVERY="${FORCE_DISCOVERY:-false}"
|
||||||
SKIP_DISCOVERY="${SKIP_DISCOVERY:-false}"
|
SKIP_DISCOVERY="${SKIP_DISCOVERY:-false}"
|
||||||
|
MQTT_SERVER="${MQTT_SERVER:-192.168.1.37}"
|
||||||
|
MQTT_PORT="${MQTT_PORT:-1883}"
|
||||||
|
MQTT_TOPIC="${MQTT_TOPIC:-homeassistant}"
|
||||||
|
MQTT_DEVICENAME="${MQTT_DEVICENAME:-voltronic}"
|
||||||
|
MQTT_USERNAME="${MQTT_USERNAME:-}"
|
||||||
|
MQTT_PASSWORD="${MQTT_PASSWORD:-}"
|
||||||
|
|
||||||
echo "Configuration:"
|
echo "Configuration:"
|
||||||
echo " Device: $INVERTER_DEVICE"
|
echo " Device: $INVERTER_DEVICE"
|
||||||
echo " Force Discovery: $FORCE_DISCOVERY"
|
echo " Force Discovery: $FORCE_DISCOVERY"
|
||||||
echo " Skip Discovery: $SKIP_DISCOVERY"
|
echo " Skip Discovery: $SKIP_DISCOVERY"
|
||||||
|
echo " MQTT Server: $MQTT_SERVER:$MQTT_PORT"
|
||||||
|
echo " MQTT Topic: $MQTT_TOPIC"
|
||||||
|
echo " MQTT Device: $MQTT_DEVICENAME"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
# Function to update MQTT configuration
|
||||||
|
update_mqtt_config() {
|
||||||
|
local mqtt_conf="/etc/inverter/mqtt.json"
|
||||||
|
echo "Updating MQTT configuration from environment variables..."
|
||||||
|
|
||||||
|
# Backup original
|
||||||
|
cp $mqtt_conf ${mqtt_conf}.backup
|
||||||
|
|
||||||
|
# Update MQTT settings using jq
|
||||||
|
jq --arg server "$MQTT_SERVER" \
|
||||||
|
--arg port "$MQTT_PORT" \
|
||||||
|
--arg topic "$MQTT_TOPIC" \
|
||||||
|
--arg devicename "$MQTT_DEVICENAME" \
|
||||||
|
--arg username "$MQTT_USERNAME" \
|
||||||
|
--arg password "$MQTT_PASSWORD" \
|
||||||
|
'.server = $server | .port = $port | .topic = $topic | .devicename = $devicename | .username = $username | .password = $password' \
|
||||||
|
$mqtt_conf > ${mqtt_conf}.tmp && mv ${mqtt_conf}.tmp $mqtt_conf
|
||||||
|
|
||||||
|
echo "✓ MQTT configuration updated"
|
||||||
|
echo " Server: $MQTT_SERVER:$MQTT_PORT"
|
||||||
|
echo " Topic: $MQTT_TOPIC/sensor/$MQTT_DEVICENAME"
|
||||||
|
[ ! -z "$MQTT_USERNAME" ] && echo " Auth: Enabled (username: $MQTT_USERNAME)"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Update MQTT config from ENV on startup
|
||||||
|
update_mqtt_config
|
||||||
|
|
||||||
# Function to update config file with discovered values
|
# Function to update config file with discovered values
|
||||||
update_config_with_discovery() {
|
update_config_with_discovery() {
|
||||||
local qmod=$1
|
local qmod=$1
|
||||||
|
|||||||
Reference in New Issue
Block a user