Ir al contenido

← Todas las funcionalidades

Riego agrícola automatizadoRaspberry Pi (Docker)HTTPMySQLInfraestructura

Un stack de automatización de cuatro contenedores en una sola Raspberry Pi

Una sola Raspberry Pi puede alojar una plataforma de supervisión completa si cada pieza vive en su propio contenedor. Este stack de Docker Compose ejecuta cuatro: Node-RED para la lógica de planta, MySQL para el histórico de alarmas, un frontend Laravel con login multiempresa y Nginx como único contenedor expuesto a la red. Los volúmenes con nombre sobreviven a la recreación y los secretos se quedan en un fichero .env. Es la infraestructura exacta de un despliegue real de riego automatizado.

Una sola puerta de entrada — Nginx

Solo Nginx publica un puerto; Laravel, Node-RED y MySQL están en una red bridge interna. El proxy enruta / al frontend PHP y /nodered/ al editor y al dashboard, de modo que el router de la finca solo necesita un puerto redirigido y la base de datos es sencillamente inalcanzable desde fuera. Para depurar en local basta con descomentar una línea y exponer el 1880 directamente.

Arranque ordenado con healthchecks

Laravel y Node-RED declaran depends_on con service_healthy contra MySQL, cuyo healthcheck lanza mysqladmin cada 10 segundos. En un arranque en frío de la Raspberry Pi — donde MySQL puede tardar medio minuto en una tarjeta SD — esto evita la clásica tormenta de errores connection-refused y migraciones rotas al volver la corriente tras un corte en campo.

Secretos y estado fuera de las imágenes

Todas las credenciales (MYSQL_PASSWORD, OPENWEATHER_API_KEY, TELEGRAM_TOKEN) provienen de un fichero .env junto al compose y se inyectan como variables de entorno, así los flujos y las imágenes siguen siendo compartibles. Los volúmenes con nombre persisten los datos de MySQL y la paleta de Node-RED, y el esquema de alarmas se monta en docker-entrypoint-initdb.d para que el primer arranque cree las tablas por sí solo.

Un fragmento de la implementación

Tal cual del ejemplo desplegado en el Raspberry Pi (Docker) — cópialo libremente:

services:

  # ---- Reverse proxy: the only container exposed to the outside --------------
  nginx:
    image: nginx:stable-alpine
    container_name: irrigation-nginx
    restart: unless-stopped
    ports:
      - "80:80"                       # only port published on the Raspberry Pi
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
      - laravel_public:/var/www/html/public:ro
    depends_on:
      - laravel
      - nodered
    networks: [irrigation]

  # ---- Laravel frontend (multi-company login, alarm history) -----------------
  laravel:
    build: ./laravel                  # Dockerfile with php-fpm + composer
    container_name: irrigation-laravel
    restart: unless-stopped
    environment:
      APP_ENV: production
      DB_HOST: mysql
      DB_DATABASE: irrigation
      DB_USERNAME: irrigation
      DB_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - laravel_public:/var/www/html/public

El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.

Preguntas frecuentes

¿Tiene una Raspberry Pi potencia suficiente para cuatro contenedores?

De sobra, en una Pi 4 con 4 GB. Node-RED y MySQL son los únicos consumidores relevantes; Nginx y PHP-FPM se quedan en unas pocas decenas de megabytes en reposo. Usa un sistema operativo de 64 bits y una tarjeta SD de calidad o un SSD para el volumen de MySQL.

¿Cómo actualizo un servicio sin tocar el resto?

docker compose pull nodered seguido de docker compose up -d nodered recrea solo ese contenedor. Los flujos, las credenciales y los nodos instalados de la paleta viven en el volumen nodered_data, así que sobreviven a la actualización.

¿Por qué fijar la zona horaria en el contenedor de Node-RED?

Los programadores de riego se disparan en hora civil local, mañana y tarde. Sin TZ=Europe/Madrid el contenedor funciona en UTC y los ciclos se desplazan una o dos horas según el horario de verano — regando a la hora equivocada del día.

Funcionalidades relacionadas