Cómo instalar y configurar un servidor de almacenamiento de objetos compatible con S3 utilizando Minio en Ubuntu 20.04

El almacenamiento de objetos es el almacenamiento y la recuperación de bloques no estructurados de datos y metadatos mediante una API HTTP. En lugar de almacenar archivos de forma convencional, dividiéndolos en bloques para almacenarlos en el disco mediante un sistema de archivos, tratamos con objetos enteros almacenados en la red. Estos objetos pueden ser una imagen, un vídeo, registros, archivos HTML, copias de seguridad, imágenes contenedoras o cualquier masa de bytes autocontenida. No están estructurados porque no siguen ningún esquema o formato específico.

Minio es un popular servidor de almacenamiento de objetos de código abierto, autoalojado y compatible con Amazon S3. Minio está escrito en Go, viene con clientes independientes del sistema operativo y una interfaz de navegador. En este tutorial, instalarás el servidor de Minio en un servidor Ubuntu 20.04, lo protegerás con un certificado SSL de Let’s Encrypt, y accederás a él mediante un cliente de línea de comandos.

Requisitos previos

  • Un servidor Ubuntu 20.04 con un usuario no root con privilegios sudo.
  • Un nombre de dominio completamente registrado, minio.example.com.
  • Una máquina Ubuntu 20.04 para actuar como cliente.
  • El sistema está actualizado.

    $ sudo apt update
    
  • Algunos paquetes que necesita tu sistema.

    $ sudo apt install wget curl nano ufw software-properties-common apt-transport-https ca-certificates -y
    

    Algunos de estos paquetes pueden estar ya instalados en tu sistema.

Paso 1 – Instalar el servidor Minio

Minio, al estar escrito en Go, se envía como un simple archivo binario. Descarga el archivo binario del sitio web oficial de Minio.

$ wget https://dl.min.io/server/minio/release/linux-amd64/minio

Haz que el archivo sea ejecutable.

$ chmod +x minio

Mueve el binario al directorio /usr/local/bin.

$ sudo mv minio /usr/local/bin

Verifica la instalación.

$ minio --version
minio version RELEASE.2022-01-28T02-28-16Z

Paso 2 – Preparar el disco de almacenamiento de objetos

Tenemos que preparar un dispositivo de bloques dedicado para almacenar objetos. La ruta de almacenamiento puede estar en tu disco o en un segundo disco conectado a tu servidor. Para nuestro tutorial, vamos a utilizar un disco secundario.

$ lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda      8:0    0  50G  0 disk
??sda1   8:1    0  50G  0 part /
sdb      8:16   0  50G  0 disk

Instala la aplicación parted para crear y modificar las particiones del disco.

$ sudo apt install parted

Ejecuta los siguientes comandos para montar el disco secundario en el directorio /data.

$ sudo parted -s -a optimal -- /dev/sdb mklabel gpt
$ sudo parted -s -a optimal -- /dev/sdb mkpart primary 0% 100%
$ sudo parted -s -- /dev/sdb align-check optimal 1
$ sudo mkfs.ext4 /dev/sdb1
$ echo "/dev/sdb1 /data ext4 defaults 0 0" | sudo tee -a /etc/fstab
$ sudo mkdir /data
$ sudo mount -a

Paso 3 – Configurar Minio

El servidor Minio nunca debe ejecutarse como root para evitar cualquier daño. Por lo tanto, crearemos un usuario y un grupo llamados minio-user.

$ sudo useradd -r minio-user -s /sbin/nologin

La bandera -s establece el shell de la cuenta de usuario en /sbin/nologin, que no permite el inicio de sesión del usuario.

Cambia la propiedad del archivo binario de Minio.

$ sudo chown minio-user:minio-user /usr/local/bin/minio

Da la propiedad del directorio /data a minio-user.

$ sudo chown minio-user:minio-user /data -R

El siguiente paso es crear un archivo de configuración para Minio. Crea un directorio para almacenar el archivo de configuración.

$ sudo mkdir /etc/minio

Da la propiedad del directorio al usuario minio-user.

$ sudo chown minio-user:minio-user /etc/minio

Crea el archivo de entorno para almacenar la configuración por defecto. Este archivo debe almacenarse en el directorio /etc/default.

$ sudo nano /etc/default/minio

Pega el siguiente código con las variables de entorno para definir a Minio.

MINIO_ROOT_USER="minio"
MINIO_VOLUMES="/data"
MINIO_OPTS="-C /etc/minio --address your_server_ip:9000 --console-address :9001"
MINIO_ROOT_PASSWORD="miniostorage"

Vamos a comprobar todas las variables y lo que hacen.

  • MINIO_ROOT_USER: establece la clave de acceso/usuario para acceder a la interfaz de usuario de Minio. Debe tener una longitud mínima de 3 caracteres.
  • MINIO_VOLUMES: especifica el directorio de almacenamiento de los datos.
  • MINIO_OPTS: establece varias opciones para el servidor de Minio. La bandera -C especifica el directorio de configuración creado anteriormente. La bandera --address especifica la dirección IP y el puerto a los que se debe enlazar. Si no especificas la dirección IP, Minio se enlazará con todas las direcciones IP del servidor, incluyendo localhost o cualquier dirección IP relacionada con Docker. El puerto por defecto es el 9000. La bandera --console-address establece el puerto 9001 para la consola web de Minio.
  • MINIO_ROOT_PASSWORD: establece la clave/contraseña privada para acceder a la interfaz de Minio. Debe tener un mínimo de 8 caracteres de longitud. Elige una clave secreta fuerte y complicada.

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Paso 4 – Instalar el servicio Minio

Descarga el archivo del servicio Minio desde el repositorio oficial de Github.

$ curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service

Abre el archivo con el editor Nano.

$ nano minio.service

Encontrarás el siguiente código.

[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local/

User=minio-user
Group=minio-user
ProtectProc=invisible

EnvironmentFile=/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=1048576

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})

Este servicio inicia Minio utilizando el usuario minio-user que hemos creado antes. Utiliza/etc/default/minio como el archivo de entorno que configuramos en el paso 3. Cuando estés satisfecho, cierra el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Mueve el archivo de servicio al directorio /etc/systemd/system.

$ sudo mv minio.service /etc/systemd/system

Vuelve a cargar el demonio del servicio.

$ sudo systemctl daemon-reload

Habilita el servicio Minio.

$ sudo systemctl enable minio
Created symlink from /etc/systemd/system/multi-user.target.wants/minio.service to /etc/systemd/system/minio.service.

Paso 5 – Iniciar el Servidor de Minio

Inicia el Servidor de Minio.

$ sudo systemctl start minio

Comprueba el estado.

$ sudo systemctl status minio
? minio.service - MinIO
     Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-02-01 13:30:44 UTC; 5s ago
       Docs: https://docs.min.io
    Process: 26068 ExecStartPre=/bin/bash -c if [ -z "${MINIO_VOLUMES}" ]; then echo "Variable MINIO_VOLUMES not set in /etc/default/minio"; exi>
   Main PID: 26076 (minio)
      Tasks: 6
     Memory: 55.3M
     CGroup: /system.slice/minio.service
             ??26076 /usr/local/bin/minio server -C /etc/minio --address 209.208.26.129:9000 --console-address :9001 /data

Permitir los puertos 9000 y 9001 mediante el Firewall sin complicaciones (UFW).

$ sudo ufw allow 9000
$ sudo ufw allow 9001

Activa el cortafuegos.

$ sudo ufw enable

Abre la URL http://your_server_ip:9001 en el navegador, y verás la siguiente pantalla.

Inicio de sesión en la consola web de Minio

Paso 6 – Proteger a Minio mediante SSL

Utilizaremos Let’s Encrypt para asegurar Minio. Para obtener un certificado SSL gratuito, necesitamos descargar la herramienta Certbot. Para ello utilizaremos el instalador de paquetes Snapd.

Instala el instalador de Snap.

$ sudo apt install snapd

Asegúrate de que tu versión de Snapd está actualizada.

$ sudo snap install core 
$ sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que el comando Certbot se ejecuta creando un enlace simbólico al directorio /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Genera un certificado SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d minio.example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/minio.example.com de tu servidor.

Copia los archivos privkey.pem y fullchain.pem en el directorio certs bajo la carpeta de configuración de Minio.

$ sudo cp /etc/letsencrypt/live/minio.example.com/privkey.pem /etc/minio/certs/private.key
$ sudo cp /etc/letsencrypt/live/minio.example.com/fullchain.pem /etc/minio/certs/public.crt

Cambia la propiedad de los certificados copiados.

$ sudo chown minio-user:minio-user /etc/minio/certs/private.key
$ sudo chown minio-user:minio-user /etc/minio/certs/public.crt

Permite los puertos HTTP y HTTPS a través del cortafuegos.

$ sudo ufw allow 80
$ sudo ufw allow 443

Abre el archivo de configuración de Minio.

$ sudo nano /etc/default/minio

Añade la siguiente línea al final.

MINIO_SERVER_URL="https://minio.example.com:9000"

Aunque se accede a la consola a través del puerto 9001, la URL del servidor SSL utiliza el puerto 9000 para acceder a la API de Minio.

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Reinicia el servidor de Minio.

$ sudo systemctl restart minio

Puedes acceder a la consola de Minio a través de la URL https://minio.example.com:9001 en tu navegador.

Paso 7 – Conéctate a Minio y configura los cubos

Conéctate a la consola de Minio utilizando el usuario y la contraseña establecidos anteriormente para acceder al panel de control de Minio.

Panel de control de Minio

Haz clic en el botón Crear cubo para crear tu primer cubo.

Minio Crear Página de Cubos

Como estamos instalando Minio en un único servidor/disco, algunas de las funciones están desactivadas. Introduce el nombre del cubo y haz clic en el botón Crear cubo para continuar. Una vez que hayas terminado, obtendrás la siguiente pantalla.

Lista de cubos de Minio

Para subir archivos, haz clic en el botón Examinar, y aparecerá la siguiente página.

Cubos de exploración Minio

Haz clic en el botón Subir Archivos y selecciona de nuevo Subir Archivos para abrir el Navegador de Archivos en tu PC. Puedes seleccionar varios archivos a la vez para subirlos.

Carga de archivos de Minio

Haz clic en el botón de la papelera para borrar la cola de subida una vez que hayas terminado.

Minio Borrar cola de subida

Eso es todo por ahora. Has creado tu primer cubo y has subido algunos archivos. A continuación, nos conectaremos al servidor mediante un cliente, accederemos a este cubo y lo gestionaremos.

Paso 8 – Instalar el cliente de Minio y acceder a los archivos

Instalaremos el cliente de línea de comandos de Minio en una máquina diferente basada en Ubuntu 20.04 para nuestro propósito. También puedes descargar los clientes de escritorio desde la página oficial de descargas de Minio.

Descarga el binario oficial de Minio.

$ wget https://dl.min.io/client/mc/release/linux-amd64/mc

Haz que el archivo binario sea ejecutable.

$ chmod +x mc

Mueve el binario al directorio /usr/local/bin.

$ sudo mv mc /usr/local/bin

Verifica la instalación.

$ mc --version
mc version RELEASE.2022-02-02T02-03-24Z

Establece un alias para tu servidor de Minio para que puedas acceder a él con un nombre fácilmente identificable. Sustituye minio y miniostorage por el nombre de usuario y la contraseña que hayas elegido para el servidor.

$ mc alias set howtoforge https://minio.example.com:9000 minio miniostorage
mc: Configuration written to `/home/<user>/.mc/config.json`. Please update your access credentials.
mc: Successfully created `/home/<user>/.mc/share`.
mc: Initialized share uploads `/home/<user>/.mc/share/uploads.json` file.
mc: Initialized share downloads `/home/<user>/.mc/share/downloads.json` file.
Added `howtoforge` successfully.

El cliente Minio almacena todas las configuraciones en el directorio /home/user/.mc.

Obtén la información del servidor de Minio. Para ello utilizamos el subcomando admin.

$ mc admin info howtoforge
?  minio.example.com:9000
   Uptime: 2 minutes
   Version: 2022-01-28T02:28:16Z
   Network: 1/1 OK

9.6 MiB Used, 1 Bucket, 5 Objects

Para listar todos los cubos de tu servidor Minio, utiliza el siguiente comando.

$ mc ls howtoforge
[2022-02-01 16:59:46 UTC]     0B howtoforge/

Para listar todos los objetos/archivos de un determinado cubo, utiliza el siguiente comando.

$ mc ls howtoforge/howtoforge
[2022-02-02 05:32:28 UTC] 2.9MiB STANDARD IMG_20160717_184947_HDR.jpg
[2022-02-02 05:32:00 UTC] 2.2MiB STANDARD IMG_20160903_220639_HDR.jpg
[2022-02-02 05:28:25 UTC] 2.4MiB STANDARD IMG_20161006_213936_HDR.jpg
[2022-02-02 05:28:07 UTC] 2.2MiB STANDARD IMG_20161015_194409_HDR.jpg
[2022-02-02 03:33:28 UTC]  25KiB STANDARD quarantine.jpg

Puedes crear un nuevo cubo utilizando el siguiente comando.

$ mc mb howtoforge/bucket2
Bucket created successfully `howtoforge/bucket2`.

Creemos un nuevo archivo para copiarlo en este cubo.

$ touch test.txt

Para copiar un archivo en el cubo recién creado, utiliza el siguiente comando.

$ mc cp test.txt howtoforge/bucket2
/home/nspeaks/test.txt:    0 B / ? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????

Enumera el archivo recién copiado.

$ mc ls howtoforge/bucket2
[2022-02-02 07:06:44 UTC]     0B STANDARD test.txt

Puedes comprobar todos los comandos utilizando el argumento --help.

$ mc --help
NAME:
  mc - MinIO Client for cloud storage and filesystems.

USAGE:
  mc [FLAGS] COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...]

COMMANDS:
  alias      set, remove and list aliases in configuration file
  ls         list buckets and objects
  mb         make a bucket
  rb         remove a bucket
  cp         copy objects
  mirror     synchronize object(s) to a remote site
  cat        display object contents
  head       display first 'n' lines of an object
  pipe       stream STDIN to an object
  share      generate URL for temporary access to an object
  find       search for objects
  sql        run sql queries on objects
  stat       show object metadata
  mv         move objects
  tree       list buckets and objects in a tree format
  du         summarize disk usage recursively
  retention  set retention for object(s)
  legalhold  manage legal hold for object(s)
  diff       list differences in object name, size, and date between two buckets
  rm         remove object(s)
  version    manage bucket versioning
  ilm        manage bucket lifecycle
  encrypt    manage bucket encryption config
  event      manage object notifications
  watch      listen for object notification events
  undo       undo PUT/DELETE operations
  anonymous  manage anonymous access to buckets and objects
  tag        manage tags for bucket and object(s)
  replicate  configure server side bucket replication
  admin      manage MinIO servers
  update     update mc to latest release
  support    Support related commands

GLOBAL FLAGS:
  --autocompletion              install auto-completion for your shell
  --config-dir value, -C value  path to configuration folder (default: "/home/<user>/.mc")
  --quiet, -q                   disable progress bar display
  --no-color                    disable color theme
  --json                        enable JSON lines formatted output
  --debug                       enable debug output
  --insecure                    disable SSL certificate verification
  --help, -h                    show help
  --version, -v                 print the version

TIP:
  Use 'mc --autocompletion' to enable shell autocompletion

VERSION:
  RELEASE.2022-02-02T02-03-24Z

Conclusión

Con esto concluye nuestro tutorial en el que has instalado el servidor de almacenamiento de objetos Minio en un servidor basado en Ubuntu 20.04. Es accesible a través de una consola web protegida por un certificado SSL de Let’s Encrypt. También has instalado el cliente de línea de comandos de Minio en otra máquina Ubuntu para gestionar y acceder al servidor de Minio.

Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...