Puedes fijar la asignación de los puertos USB con reglas udev 
Le pedí a ChatGPT que escribiera una pequeña guía, aquí está lo que me da (me parece bien):
1. Usar reglas udev para asignar nombres persistentes a los dispositivos USB
Los puertos /dev/ttyUSB0 y /dev/ttyUSB1 se asignan dinámicamente al iniciar el sistema, lo que puede provocar la inversión aleatoria de los dispositivos. Con udev, puedes asignar un nombre único y persistente a cada dispositivo según sus características (como su ID de producto, fabricante o número de serie).
Estos son los pasos:
- Identificar los dispositivos USB:
Usa el siguiente comando para encontrar la información de cada dispositivo:
udevadm info -q all -n /dev/ttyUSB0
udevadm info -q all -n /dev/ttyUSB1
Busca atributos como ID_VENDOR_ID, ID_MODEL_ID o ID_SERIAL.
- Crear una regla udev:
Edita o crea un archivo en /etc/udev/rules.d/ (por ejemplo /etc/udev/rules.d/99-usb-serial.rules) y añade una regla para cada dispositivo:
SUBSYSTEM==« tty », ATTRS{idVendor}==« XXXX », ATTRS{idProduct}==« YYYY », SYMLINK+=« zigbee_adapter »
SUBSYSTEM==« tty », ATTRS{idVendor}==« ZZZZ », ATTRS{idProduct}==« WWWW », SYMLINK+=« rflink_adapter »
Reemplaza XXXX, YYYY, ZZZZ y WWWW con los valores correspondientes encontrados en el paso anterior.
- Reiniciar el servicio udev:
Aplica las reglas reiniciando udev:
sudo udevadm control --reload-rules
sudo udevadm trigger
- Actualizar el comando Docker:
Modifica tu comando Docker para apuntar a los nuevos nombres persistentes (/dev/zigbee_adapter y /dev/rflink_adapter):
docker run -d \
–log-opt max-size=10m \
–restart=always \
–network=host \
–name node_red \
-u node-red:dialout \
–device=/dev/zigbee_adapter \
–device=/dev/rflink_adapter \
–label com.centurylinklabs.watchtower.enable=false \
-v /var/lib/node-red:/data \
nodered/node-red
2. Usar las opciones de Docker para especificar los dispositivos a través de su ruta estable
Si no quieres usar udev, puedes especificar directamente los dispositivos a través de su ruta física estable, accesible en /dev/serial/by-id/.
- Listar los dispositivos USB:
Ejecuta el siguiente comando para identificar los nombres estables:
ls -l /dev/serial/by-id/
Verás enlaces simbólicos como:
usb-1a86_USB2.0-Serial-if00-port0 → ../../ttyUSB0
usb-0403_6001_RFLINK-if00-port0 → ../../ttyUSB1
- Actualizar el comando Docker:
Modifica el comando Docker para usar estas rutas:
docker run -d \
–log-opt max-size=10m \
–restart=always \
–network=host \
–name node_red \
-u node-red:dialout \
–device=/dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0 \
–device=/dev/serial/by-id/usb-0403_6001_RFLINK-if00-port0 \
–label com.centurylinklabs.watchtower.enable=false \
-v /var/lib/node-red:/data \
nodered/node-red
Resumen
• Solución recomendada: Usar reglas udev para asignar nombres persistentes, lo cual es flexible e independiente de Docker.
• Alternativa rápida: Usar las rutas /dev/serial/by-id/ directamente en el comando Docker.
Estas soluciones garantizarán que tus dispositivos USB no se inviertan, incluso después de un reinicio o un corte de energía.