Configuración de TypeBot y MinIO con Docker Compose: Una Guía Completa

En este artículo vamos a abordar cómo configurar TypeBot, una herramienta potente para crear bots conversacionales, y MinIO, un servidor de almacenamiento de objetos compatible con Amazon S3, usando Docker Compose. Además, veremos cómo integrar NGINX para actuar como un proxy inverso, protegiendo tus servicios con certificados SSL de Let's Encrypt.

Esta configuración te permitirá levantar una infraestructura sólida con almacenamiento local escalable y fácil acceso a tus bots creados en TypeBot.

Prerrequisitos

  • Conocimientos básicos de Docker y Docker Compose.

  • Un servidor Linux con Docker y Docker Compose instalados.

  • NGINX instalado para manejar el tráfico externo.

  • Un dominio configurado con DNS que apunte a tu servidor.

  • Certificados SSL gestionados por Certbot (Let's Encrypt) para NGINX.

Paso 1: Estructura del docker-compose.yml

Primero, revisemos el archivo docker-compose.yml, que define los contenedores necesarios para levantar TypeBot y MinIO.

# Archivo docker-compose.yml oficial de TypeBot.
version: '3.3'

volumes:
  db-data:     # Volumen persistente para la base de datos PostgreSQL de TypeBot
  s3-data:     # Volumen persistente para los datos almacenados en MinIO

services:
  # Base de datos para TypeBot
  typebot-db:
    image: postgres:14-alpine
    restart: always
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=typebot
      - POSTGRES_PASSWORD=typebot

  # Builder de TypeBot para crear bots
  typebot-builder:
    image: baptistearno/typebot-builder:2.28.2
    restart: always
    depends_on:
      - typebot-db
    ports:
      - '8080:3000'  # Expone el puerto 8080 en la máquina local
    extra_hosts:
      - 'host.docker.internal:host-gateway'
    env_file: .env  # Configuración adicional desde el archivo .env

  # Viewer de TypeBot para visualizar los bots
  typebot-viewer:
    image: baptistearno/typebot-viewer:2.28.2
    restart: always
    ports:
      - '8081:3000'  # Expone el puerto 8081 en la máquina local
    env_file: .env

  # MinIO para almacenamiento de objetos
  minio:
    image: minio/minio
    command: server /data --console-address ":9001"
    ports:
      - '9000:9000'  # Puerto para la API de MinIO
      - '9001:9001'  # Puerto para la consola de administración de MinIO
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
      MINIO_BROWSER_REDIRECT_URL: https://storage.mydomain.com
    volumes:
      - s3-data:/data

  # Servicio para crear un bucket en MinIO
  createbuckets:
    image: minio/mc
    depends_on:
      - minio
    entrypoint: >
      /bin/sh -c "
      sleep 10;
      /usr/bin/mc config host add minio http://minio:9000 minio minio123;
      /usr/bin/mc mb minio/typebot;
      /usr/bin/mc anonymous set public minio/typebot/public;
      exit 0;
      "

Explicación:

  • typebot-db: Utiliza PostgreSQL como base de datos para almacenar la información de los bots creados en TypeBot.

  • typebot-builder y typebot-viewer: Estos servicios manejan la creación y la visualización de los bots en el puerto 8080 (builder) y 8081 (viewer).

  • MinIO: Proporciona un almacenamiento compatible con S3, útil para almacenar archivos estáticos de tus bots o cualquier otro tipo de recurso.

  • createbuckets: Este servicio crea un bucket en MinIO llamado typebot y lo hace público para que se pueda acceder fácilmente a los objetos que almacenes allí.

Paso 2: Archivo .env para TypeBot

El archivo .env contiene las variables de entorno necesarias para que TypeBot y MinIO funcionen correctamente.

S3_ACCESS_KEY=minio
S3_SECRET_KEY=minio123
S3_BUCKET=typebot
S3_ENDPOINT=minio.mydomain.com
S3_SSL=true

NODE_OPTIONS=--no-node-snapshot

Explicación:

  • S3_ACCESS_KEY y S3_SECRET_KEY: Credenciales de MinIO para acceder a los recursos almacenados.

  • S3_BUCKET: El bucket typebot que MinIO utiliza.

  • S3_ENDPOINT: El dominio configurado para acceder a MinIO a través de NGINX.

  • S3_SSL: Habilita el acceso seguro (HTTPS).

Paso 3: Configuración de NGINX como proxy inverso

El siguiente paso es configurar NGINX para que funcione como un proxy inverso para el almacenamiento y la consola de MinIO.

Configuración de NGINX (/etc/nginx/sites-available/storage.mydomain.com.conf):

upstream minio_s3 {
   least_conn;
   server localhost:9000;  # API de MinIO
}

upstream minio_console {
   least_conn;
   server localhost:9001;  # Consola de MinIO
}

# Proxy para MinIO S3 API
server {
   server_name minio.mydomain.com;

   ignore_invalid_headers off;
   client_max_body_size 0;
   proxy_buffering off;
   proxy_request_buffering off;

   location / {
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;

      proxy_connect_timeout 300;
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      chunked_transfer_encoding off;

      proxy_pass http://minio_s3;
   }
}

# Proxy para la consola de MinIO
server {
   server_name storage.mydomain.com;

   ignore_invalid_headers off;
   client_max_body_size 0;
   proxy_buffering off;
   proxy_request_buffering off;

   location / {
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-NginX-Proxy true;

      real_ip_header X-Real-IP;
      proxy_connect_timeout 300;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      chunked_transfer_encoding off;

      proxy_pass http://minio_console/;
   }
}

Explicación:

  • upstream: Define dos bloques para manejar las conexiones hacia los servicios de MinIO (minio_s3 para la API y minio_console para la consola).

  • proxy_pass: Redirige las solicitudes hacia los servicios correctos.

Paso 4: Obtener Certificados SSL con Certbot

Antes de que puedas obtener los certificados es importante que configures los subdominios minio.mydomain.com y storage.mydomain.com en tu proveedor de DNS. Estos subdominios deben apuntar a la dirección IP de tu servidor donde está configurado MinIO.

Pasos para configurar los subdominios:

1. Accede al panel de control de tu proveedor de DNS.

2. Crea dos registros A o CNAME:

minio.mydomain.com apuntando a la IP de tu servidor.

storage.mydomain.com apuntando a la misma IP.

3. Guarda los cambios y espera a que los DNS se propaguen (esto puede tardar entre minutos y horas, dependiendo del proveedor

Para asegurar tu servidor con HTTPS, asegúrate de haber configurado Certbot correctamente. Luego, obtén los certificados ejecutando:

sudo certbot --nginx -d minio.mydomain.com -d storage.mydomain.com

Paso 5: Arrancar el entorno

Finalmente, puedes levantar todo el entorno ejecutando:

docker-compose up -d

Este comando levantará todos los servicios de TypeBot y MinIO, y podrás acceder a ellos a través de los subdominios configurados.

Ahora deberías poder acceder a la consola de minio a través de storage.mydomain.com y ver los objetos que guardas a través del dashboard de TypeBot.

Dashboard de Typebot

Consola de Minio

Conclusión

Este tutorial te ha guiado a través de la configuración completa de TypeBot y MinIO utilizando Docker Compose, con un proxy inverso configurado mediante NGINX. Ahora puedes gestionar tus bots y su almacenamiento de manera eficiente con una infraestructura robusta y segura.

0
Subscribe to my newsletter

Read articles from Roylan Suarez Reyes directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Roylan Suarez Reyes
Roylan Suarez Reyes

Desarrollador web Fullstack con Python/Django, Javascript, Vue, Quasar, React... con más de 10 años de experiencia.