Controlar varias impresoras usando instancias Docker

Otra alternativa que nos gusta mucho es el uso de Docker para que la creación, uso y mantenimiento de instancias de Octoprint sea más versátil

Qué necesitamos?

A continuación os detallamos los componentes que vamos a necesitar, indicar que vamos a centrar esta guía basada en Raspberry Pi pero podemos usar cualquier otro "host" que soporte Docker.

  • Raspberry Pi 3B+ o superior, idealmente una 4 con 2Gb al menos de RAM

  • Tarjeta Micro SD y un lector de estas si nuestro ordenador no tiene lector integrado, con un mínimo de 8Gb aunque lo aconsejable son 16Gb o más dado que vamos a tener varias instancias... es aconsejable que esta SD sea de la máxima calidad y velocidad posibles

  • Una imagen de Raspberry PiOS (idealmente la lite). Descargaremos e instalaremos el Raspberry Pi Imager en nuestro ordenador que nos facilitará la tarea de generar la SD para nuestra Raspberry.

  • Un cliente SSH para conectar por terminal a nuestra Pi, aconsejamos Terminus ya que es multiplataforma y dispone de versión para teléfono/tablet... además de que tiene un interfaz sencilla y funcional.

  • Un scanner de red para nuestro teléfono/tablet para poder detectar si nuestra Pi se enlazó correctamente en nuesta red. En este caso aconsejamos Fing.

  • Un editor de textos como Visual Studio Code, Notepad++ o Atom. Es importante usar uno de estos ya que algunos como Word, Wordpad o editores con formato enriquecido pueden añadir caracteres de escape en los ficheros de configuración y no funcionar correctamente.

  • Obviamente un par de impresoras 3D al menos y un par de webcams si queremos controlar visualmente estas

Instalación de PiOS usando Raspberry Pi Imager

Podemos usar la herramienta Raspberry Pi Imager para personalizar, crear y quemar la imagen de PiOS que es quizás la forma más sencilla.

  • Descargaremos e instalaremos el Raspberry Pi Imager en nuestro ordenador

  • Buscaremos la imagen de PiOS en Choose OS y dentro de Raspberry Pi OS (other) y seleccionaremos Raspberry Pi OS Lite (32 o 64 bits dependiendo del modelo que Raspberry que tengamos)

  • Abriremos Advanced Options (icono de engranaje) para configurar las opciones de nuestra Wifi si es necesario para ello dentro de las opciones para seleccionar el OS pulsaremos CTRL+SHIFT+X (Windows) o CMD+SHIFT+X (MAC). En la nueva ventana aparecerán nuevas opciones avanzadas, la parte importante es la de configuración de nuestra wifi donde seleccionaremos nuestro SSID, contraseña y país. También es aconsejable:

    • Habilitar SSH usando autentificación por password

    • Configurar Time Zone y nuestro layout del teclado

  • Elegiremos la SD y grabaremos la imagen.

  • Extraeremos de forma segura la SD y la colocaremos en nuestra Raspberry, al encenderla y pasados unos segundos ya podremos conectarnos a ella tal como indicamos en los siguientes puntos de la guia.

  • Si hemos hecho todos los pasos de forma correcta y configurado nuestra Wifi o conectado por cable nuestra Raspberry ya podremos mirando en nuestro router o mediante Fing encontrar la IP de nuestra Raspberry.

Haciendo login usando Terminus via SSH

Si hemos realizado el proceso anterior tenemos nuestra Pi lista para conectarnos, para ello usaremos Terminus que es un cliente SSH multiplataforma y bastante intuitivo. Básicamente añadiremos un nuevo host, le daremos un nombre, IP, puerto (22) y el usuario y password por defecto (pi/raspberry).

Por seguridad es muy aconsejable que cambiemos el password por defecto de nuestra Pi. Para ello usaremos el comando passwd

Actualización del sistema e instalación de Docker

Una vez ya tenemos acceso SSH otro de los pasos es asegurarnos que nuestro PiOS está actualizado, usaremos el siguiente comando:

sudo apt-get update && sudo apt-get upgrade -y

Una vez finalizado el proceso procederemos a instalar Docker:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Daremos permisos a nuestro usuario pi a Docker y reiniciamos:

sudo usermod -aG docker pi
reboot

Instalación de Portainer

En un mundo ideal lo aconsejable es que conozcamos los comandos Docker para gestionar nuestras instancias... la realidad es que es mucho más sencillo y visual usar una interfaz/UI web para gestionarlas de una forma sencilla. En nuestro caso siempre usamos Portainer.

Para instalar Portainer lanzaremos desde el terminal los siguientes comandos:

docker pull portainer/portainer-ce:linux-arm
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:linux-arm

Donde el primer comando docker pull descargará la imagen del container Portainer a nuestra Pi y el segundo, docker run, lo ejecutará.

Si todo ha ido bien ya tendremos nuestro container con Portainer funcionando y solamente deberemos acceder a el desde nuestro browser usando http://RaspberrypiIP:9000 donde RaspberrypiIP es la IP que encontramos en nuestro router o mediante Fing y usamos para conectar por SSH.

El primer paso del asistente de Portainer es para ajustar el password del usuario admin, no te aconsejo por ahora cambiar el nombre del usuario, solamente seguiremos las indicaciones y daremos sobre Create user.

El siguiente paso es el seleccionar el tipo de entorno de containers a gestionar. En nuestro caso seleccionaremos Docker y daremos sobre Connect.

De nuevo si todo ha salido según lo esperado ya tenemo nuestro Portainer gestionando nuestro entorno Docker funcionando!!!

Identificando nuestras impresoras y cámaras USB

Ya estamos cerca de poder tener nuestra multi instancia de Octoprint listo, el siguiente paso es identificar nuestras impresoras y cámaras para preparar nuestros contenedores.

Asumiendo que tengamos nuestras impresoras y webcams conectadas a nuestra Pi lanzaremos el siguiente comando:

ls /dev | grep 'ttyUSB\|ttyACM'

Este comando debería de mostrarnos los puntos de montaje de nuestras impresoras:

Ya tenemos nuestro par de impresoras detectadas y nos anotaremos sus nombres añadiendo /dev/ a lo detectatado en el punto anterior:

/dev/ttyACM0 --> Impresora #1
/dev/ttyUSB0 --> Impresora #2

Ahora haremos algo similar pero para detectar nuestras cámaras:

v4l2-ctl --list-devices

De los dispositivos detectados solamentete usaremos los dos últimos que son nuestras cámaras. La información importante es:

/dev/video0 --> WebCam #1
/dev/video2 --> WebCam #2

Ya tenemos todo detectado!!! ahora volveremos a nuestro Portainer.

Creando multiples instancias de Octoprint con Docker-Compose

De vuelta a nuestro Portainer iremos en STACKS y ADD STACK:

Esto abrirá el interfaz de Docker-Compose donde nos pedirá el nombre del stack el cual es aconsejable usar un nombre fácil de identificar si tenemos pensado usar otros containers en el futuro... en nuestro caso usaremos multiinstance.

En la parte de web editor section, vamos a escribir el Compose que podéis encontrar más abajo.

Por favor asegúrate que pones correctamente los parámetros de impresora y cámara detectados en el punto anterior.

version: '2'
volumes:
  octoprint-1:
  octoprint-2:
services:
  ghost5:
    image: octoprint/octoprint
    ports:
    #Puerto para instancia octoprint controlara Impresora #1
      - 5001:80
    devices:
    #Impresora #1
      - /dev/ttyUSB0:/dev/ttyUSB0
    #WebCam #1
      - /dev/video0:/dev/video0
    volumes:
      - octoprint-1:/home/octoprint/.octoprint
    environment:
      #Calidad del streaming de WEBCAM #1
      - MJPG_STREAMER_INPUT=-n -r 1280x720 -f 30
      #Habilitar streaming WEBCAM #1
      - ENABLE_MJPG_STREAMER=true
    restart: always
  prusa:
    image: octoprint/octoprint
    ports:
    #Puerto para instancia octoprint controlara Impresora #2
      - 5002:80
    devices:
    #Impresora #2
      - /dev/ttyACM0:/dev/ttyACM0
    #WebCam #2
      - /dev/video2:/dev/video0
    volumes:
      - octoprint-2:/home/octoprint/.octoprint
    environment:
      #Calidad del streaming de WEBCAM #2
      - MJPG_STREAMER_INPUT=-n -r 1280x720 -f 30
      #Habilitar streaming WEBCAM #2
      - ENABLE_MJPG_STREAMER=true
    restart: always

Una vez completado el Compose daremos en Deploy the stack.

Mágicamente si todo ha ido bien las dos instancias Octoprint estarán listas... para verificarlo iremos a Containers.

En la siguiente captura podemos ver los containers levantados con el estatus RUNNING y el puerto usado por cada uno de ellos:

Ahora ya podemos comenzar a configurar nuestros nuevos Octorpint siguiendo nuestra guía.

Para acceder a cada instancia pondremos en nuestro navegador la http://RaspberrypiIP:5001 para acceder a nuestra instancia de la impresora 1 y http://RaspberrypiIP:5002 para acceder a la instancia de la impresora 2.

Esperamos que os fuera de ayuda!!!

Última actualización