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.
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.
Haz clic en el botón Crear cubo para crear tu primer cubo.
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.
Para subir archivos, haz clic en el botón Examinar, y aparecerá la siguiente página.
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.
Haz clic en el botón de la papelera para borrar la cola de subida una vez que hayas terminado.
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.