# Deploy BARE-METAL — canale MQTT scanner ⇆ cloud

Variante **senza docker** del canale MQTT scanner⇆cloud, per il server online dove
c4rgocloud gira con nginx+php-fpm di sistema (il `docker-compose.yml` è solo per il dev
locale). Broker = `mosquitto` di sistema sullo **stesso host** del web; worker =
servizio **systemd**. Per il *perché* dell'architettura vedi [../../docker/mqtt/README.md](../../docker/mqtt/README.md).

## Segnaposto da sostituire (i tuoi valori)
- `__DEPLOY_PATH__` = root del progetto c4rgocloud sul server (es. `/var/www/c4rgocloud`)
- `__PHP_BIN__`     = binario PHP CLI (es. `/usr/bin/php` o `/usr/bin/php8.2`)
- `__RUN_USER__`    = utente che esegue l'app (es. `www-data`)

## 0. Prerequisiti
- Accesso root (sudo) al server `my.c4rgo.cloud`.
- **Porta 8883/tcp aperta in ingresso** (firewall/security-group) per i device.
- Chiave privata **C4rgo-CA** (`ca.key`) + `ca.crt` (la stessa che firma i cert dei device).
- Accesso al DB MySQL/MariaDB dell'app.
- PHP CLI con le estensioni dell'app (le stesse di php-fpm).

## 1. Codice
Copia i file nuovi nel progetto (NON servono `docker-compose.yml` né i suoi servizi):
```bash
cp -r files/. __DEPLOY_PATH__/          # dal pacchetto: src/Command, src/Services, docker/mqtt, deploy/mqtt-baremetal
```
Integra **solo 2** file esistenti (vedi `INTEGRAZIONI.md`, ma **salta la parte docker-compose.yml**):
- `.env` → blocco `SCANNER_MQTT_*`
- `config/services.yaml` → parametri `scanner_mqtt_*` + wiring del command

## 2. Schema DB — colonna `mqtt_device_id`
```bash
mysql -h "$DB_HOST" -u "$DB_USER" -p "$DB_NAME" < __DEPLOY_PATH__/docker/mqtt/ensure-mqtt-schema.sql
mysql -h "$DB_HOST" -u "$DB_USER" -p "$DB_NAME" \
  -e "UPDATE macchine SET mqtt_device_id='kiosk_36b94b28' WHERE id=131;"
```

## 3. Broker mosquitto di sistema
```bash
cd __DEPLOY_PATH__/deploy/mqtt-baremetal
sudo ./install-broker-baremetal.sh /percorso/ca.crt /percorso/ca.key
```
Lo script installa mosquitto (se manca), genera il cert `my.c4rgo.cloud` firmato dalla CA,
posa `acl`+`conf.d/c4rgo-scanner.conf`, crea l'utente `r_server` e **stampa la sua
password** (serve al passo 4). Poi crea un utente per ogni device:
```bash
sudo mosquitto_passwd -b /etc/mosquitto/c4rgo-scanner.passwd kiosk_36b94b28 '<password-device>'
```
Verifica: `journalctl -u mosquitto -n 30` → listener 8883 (TLS) e 1883 (127.0.0.1) aperti.

## 4. Segreti in `.env.local`
Nel bare-metal il worker è sull'host, quindi punta al broker su `127.0.0.1` (NON `mqtt`,
che è il nome del servizio docker). In `__DEPLOY_PATH__/.env.local`:
```dotenv
SCANNER_MQTT_HOST=127.0.0.1
SCANNER_MQTT_PASSWORD=<password di r_server dal passo 3>
```
(gli altri `SCANNER_MQTT_*` di default vanno bene: porta 1883, TLS off, verso il locale.)

## 5. Worker come servizio systemd
```bash
cd __DEPLOY_PATH__/deploy/mqtt-baremetal
# sostituisci i segnaposto nell'unit, poi installala:
sed -e "s#__DEPLOY_PATH__#__DEPLOY_PATH__#g" \
    -e "s#__PHP_BIN__#__PHP_BIN__#g" \
    -e "s#__RUN_USER__#__RUN_USER__#g" \
    c4rgo-scanner-listener.service | sudo tee /etc/systemd/system/c4rgo-scanner-listener.service >/dev/null

# la DI e' compilata: rigenera la cache dopo aver toccato services.yaml/.env
sudo -u __RUN_USER__ __PHP_BIN__ __DEPLOY_PATH__/bin/console cache:clear --env=prod
sudo -u __RUN_USER__ __PHP_BIN__ __DEPLOY_PATH__/bin/console debug:container 'App\Command\ScannerMqttListenerCommand'

sudo systemctl daemon-reload
sudo systemctl enable --now c4rgo-scanner-listener
```
> Nginx/php-fpm **non** vanno riavviati: il canale MQTT non li tocca. Il `cache:clear`
> basta perché php-fpm rilegge la cache DI compilata.

## 6. Lato scanner — bridge per-device
Come nella guida standard: installa `c4rgo-cloud-bridge.conf` (address `my.c4rgo.cloud:8883`)
in `/etc/mosquitto/conf.d/` sul Raspberry e riavvia il suo mosquitto. Il file per
`kiosk_36b94b28` è già pronto.

## 7. Verifica end-to-end
```bash
systemctl status c4rgo-scanner-listener --no-pager
journalctl -u c4rgo-scanner-listener -f      # "Connesso", subscribe, nessun errore auth
# dal server, come r_server sul listener locale in chiaro (device via --device-id):
python3 tools/c4rgo_scanner_probe.py --host 127.0.0.1 --port 1883 --no-tls \
  --username r_server --password '<pwd>' --device-id kiosk_36b94b28 ping
python3 tools/c4rgo_scanner_probe.py --host 127.0.0.1 --port 1883 --no-tls \
  --username r_server --password '<pwd>' --device-id kiosk_36b94b28 status modem
```

## Rollback
```bash
sudo systemctl disable --now c4rgo-scanner-listener
sudo rm /etc/systemd/system/c4rgo-scanner-listener.service /etc/mosquitto/conf.d/c4rgo-scanner.conf
sudo systemctl daemon-reload && sudo systemctl restart mosquitto
```
La colonna `mqtt_device_id` è nullable e inerte: non richiede rollback DB.
