Configuración in situ: requisitos e instalación

Esta documentación presenta los pasos para instalar la solución LockSelf On-Premises.

____________________________________________________________________________________

Para instalar su instancia On Premises, tiene dos opciones:

    • Instalar la aplicación manualmente, siguiendo los pasos que se indican a continuación
    • .
    • Utilizar nuestro script de instalación, que permite instalar la aplicación en pocos minutos (y que sigue los mismos pasos de esta documentación).
      • No dude en solicitar el script a su gestor de cuenta
      • .

    Si opta por el script, deberá decidir si desea configurar su propia instancia de MariaDB y crear su base de datos (consulte el punto 5 de la documentación). Para ello puedes:

    • O dejar que el script de instalación genere la base de datos en la máquina.
    • O dejar que el script de instalación genere la base de datos en la máquina.
    • O configurar su instancia de MariaDB y crear su base de datos, y luego, en el script de instalación, definir la información de su base de datos manualmente.
    • O dejar que el script de instalación genere la base de datos en la máquina.

    En todos los casos (instalación manual o script), será importante:

    1. Conocer el entorno Linux.
    2. .
    3. Conocer el manejo de un entorno Docker y sentirse cómodo con docker-compose.
    4. Conocer el entorno Docker y sentirse cómodo con docker-compose.
    5. Ser competente con "docker ps", "docker exec", "docker logs", "docker images", "docker load" y todos los comandos básicos de docker.
    6. Conocer el entorno Linux y sentirse cómodo con docker-compose.
    7. Tener ya desplegados y mantenidos entornos MySQL/MariaDB.
    8. Tener ya desplegados y mantenidos entornos MySQL/MariaDB.
    9. Tener un flujo HTTPS entre una estación de trabajo de usuario y el servidor de verificación de licencia LockSelf (necesario para activar la clave de licencia, ver paso 7)
    10. .

    1. Preámbulo

    La aplicación LockSelf utiliza dos componentes:

    • Una API REST PHP
    • Una base de datos MariaDB.
    • Una base de datos MariaDB

    La base de datos y la API de LockSelf se despliegan a través de Docker utilizando las imágenes oficiales de MariaDB (https://hub.docker.com/_/mariadb) y php:fpm-alpine (https://hub.docker.com/_/php) respectivamente.

    La imagen de MariaDB se despliega a través de Docker utilizando la imagen oficial de MariaDB (https://hub.docker.com/_/mariadb).

    La imagen de MariaDB se utiliza sin ninguna modificación particular.

    En cuanto a la imagen PHP (Alpine base), ha sido optimizada:

    • Compilación y configuración de Nginx
    • .
    • Configuración de PHP-FPM
    • Instalación de Supervord
    • Instalación y configuración de Supervord
    • .

    Todos los procesos dentro del contenedor de aplicaciones se ejecutan con el usuario 'nobody'. En cuanto al contenedor de MariaDB, el usuario utilizado es 'mysql'

    .

    Desaconsejamos poner las dos partes (base de datos y aplicación) en el mismo servidor y recomendamos utilizar uno de los siguientes SO:

    .

    • Ubuntu (LTS)
    • Debian (LTS)
    • Debian (LTS)
    • CentOS (LTS)
    • CentOS (LTS)
    • RockyLinux (LTS)
    • RockyLinux (LTS)
    • CentOS (LTS)

    Recomendamos las siguientes configuraciones:

    • si utilizas 1 mismo servidor para ambas partes (base de datos y aplicación) = 2 CPUs y 4 GB RAM
    • si utiliza 2 servidores separados: cada uno con 2 CPU y 2 GB de RAM (aunque recomendamos 4 GB de RAM para el servidor de base de datos)

    Ambos servidores (base de datos y aplicación) deben tener instalado el paquete docker. No explicaremos cómo funciona docker en este procedimiento, debes estar iniciado a esta herramienta para poder realizar correctamente la instalación.

    💡Recomendamos pasar vía Ansible el hardening del playbook, que permite implementar seguridad adicional dentro del host (https://github.com/openstack/ansible-hardening).

    2. Requisitos previos

    Antes de comenzar a instalar el servicio, asegúrese de tener lo siguiente:

    • El nombre de dominio que desea utilizar. (por ejemplo, lockself.empresa.com)
    • El nombre de dominio que desea utilizar.
    • El certificado SSL, los certificados intermedios y la clave privada asociados a este nombre de dominio. Estos certificados serán utilizados por el servidor web de la aplicación para asegurar los intercambios entre el usuario y la aplicación. En el marco de una interconexión SSO entre un AD y LockSelf, estos certificados serán utilizados para generar los metadatos de la aplicación, que serán luego suministrados al AD. En caso de que sus certificados contengan Atributos de Bolsa y Atributos de Clave, por favor bórrelos.
    • .
    • La información de autenticación y conexión para su SMTP (que se utilizará para enviar correos electrónicos del sistema relacionados con el uso de la aplicación)
    • .

    Si desea configurar una interconexión en un directorio corporativo, utilizamos el protocolo SAMLv2. Por lo tanto, debes asegurarte de que cuentas con un módulo tipo ADFS para Active Directory, OpenID para OpenLDAP o los módulos SAMLv2 incluidos en Azure u Office 365.

    3. Descripción de la infraestructura simplificada

    mceclip0.png

    💡La instalación de LockSelf también puede realizarse en modo clúster, para la parte de la aplicación y para la parte de la base de datos..

    4. Matriz de flujos de la red

    Los flujos a configurar para los distintos servidores son:

    Servidor Entrada Saliendo
    Aplicación 443 desde el exterior 25, 465 o 587 a su servidor SMTP
    Base de datos 3306 de la subred de los servidores de aplicaciones

    5. Instalando el primer componente: Base de datos MariaDB

    5.1. Acciones a realizar en el servidor de base de datos - Paso 1

    Hay tres opciones para desplegar el contenedor de base de datos. Depende de ti elegir cuál quieres utilizar según las recomendaciones de la empresa.

    5.1.1. Lanzamiento manual

    docker run
    --name mariadb \
    -v /var/lib/mysql:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=my-secret-pwd \
    -e MYSQL_DATABASE=lockself \
    -p 3306:3306 \
    -d mariadb:10.6.X
    • --name : corresponde al nombre del contenedor una vez creado
    • .
    • -v: corresponde al volumen montado habilitando la persistencia de datos
    • .
    • -e : MYSQL_ROOT_PASSWORD - sustituye "my-secret-pwd" por la contraseña que se asociará al usuario root cuando se lance el contenedor por primera vez
    • -e : MYSQL_DATABASE - "lockself" corresponde al nombre de la base de datos creada cuando el contenedor se lanza por primera vez
    • -p: permite al servidor anfitrión reenviar peticiones en el puerto 3306 al contenedor
    • .
    • -d: permite que el contenedor se inicie en segundo plano
    • mariadb:10.6.X: corresponde a la versión de la imagen de MariaDB utilizada

    Las variables de entorno opción -e sólo se tienen en cuenta cuando se inicia el contenedor por primera vez. Si los datos están presentes en /var/lib/mysql, estos valores no se tendrán en cuenta y no tendrán ningún efecto.

    ⚠️ Atención, la versión de la imagen debe adaptarse según la versión actual 10.6 de MariaDB..

    5.1.2. Lanzamiento a través de docker-composer

    Si desea utilizar docker-compose para iniciar el contenedor de base de datos, puede utilizar el archivo de configuración docker-compose.yml a continuación:

    version: '3.8'
    services:
    mariadb:
    image: mariadb:10.6.X
    restart: always
    volumes:
    - "/var/lib/mysql:/var/lib/mysql"
    ports :
    - "3306:3306"
    environment:
    MYSQL_ROOT_PASSWORD: my-secret-pwd
    MYSQL_DATABASE: lockself

    Una vez recuperado el archivo de configuración del servidor anfitrión, puede iniciar el contenedor mediante el siguiente comando:

    docker-compose up -d --build
    ⚠️ Atención, la versión de la imagen debe adaptarse según la versión actual 10.6 de MariaDB.

    5.1.3. Lanzamiento a través de docker-swarm

    Si desea utilizar docker-swarm para iniciar el contenedor de base de datos, puede utilizar el archivo de configuración yaml que se muestra a continuación:

    version: '3.7'

    services:
    mariadb:
    image: mariadb:10.6.X
    ports:
    - target: 3306
    published: 3306
    protocol: tcp
    mode: host
    environment:
    MYSQL_ROOT_PASSWORD: my-secret-pwd
    MYSQL_DATABASE: lockself
    volumes:
    - "/var/lib/mysql:/var/lib/mysql"

    Swarm se puede utilizar de varias formas que no vamos a detallar en este procedimiento. Puedes encontrar todos los detalles de su funcionamiento en su web oficial: https://docs.docker.com/engine/swarm/

    ⚠️ Atención, la versión de la imagen debe adaptarse según la versión actual 10.6 de MariaDB. Para desplegar a través de este mecanismo, puede que necesite añadir opciones, como red, desplegar, etc..

    5.2. Explicaciones relativas al paso 5.1

    5.2.1. Punto obligatorio para el correcto funcionamiento de la aplicación

    Para obtener la persistencia de los datos, es necesario el montaje de un volumen para compartir la carpeta /var/lib/mysql del contenedor (que contiene los datos db) con el host.

    Este punto de montaje se realiza a través de la opción -v o volumes dependiendo del modo de lanzamiento elegido.

    En el paso 5.1, utilizamos el siguiente punto de montaje: /var/lib/mysql:/var/lib/mysql

    .

    Opcional: En el caso de que SELinux esté habilitado en los servidores anfitriones, se debe realizar un cambio de derechos en los distintos ficheros:

    Los servidores anfitriones deben tener SELinux habilitado.

    chcon -Rt svirt_sandbox_file_t /var/lib/mysql

    En este ejemplo, los datos de MariaDB que se almacenan en el contenedor en la carpeta /var/lib/mysql también se almacenarán en el host en la carpeta /var/lib/mysql.

    5.2.2. Más información sobre los volúmenes

    https://docs.docker.com/storage/volumes/

    5.3. Acción a realizar en el servidor de base de datos - Paso 2

    Este paso se debe realizar en el servidor de base de datos una vez iniciado el contenedor MariaDB, para preparar el script de añadir usuario.

    Este paso se debe realizar en el servidor de base de datos una vez iniciado el contenedor MariaDB, para preparar el script de añadir usuario.

    Para ello, recupera el siguiente script y modifica los siguientes valores:

    • PASSWORD - A sustituir por las contraseñas que desea asociar a los usuarios.
    • IP - Para ser reemplazado por la IP/Rango de los servidores de aplicación. Tenga cuidado de estar seguro de la IP de salida que se utilizará. Dependiendo de la arquitectura, los servidores de aplicaciones pueden salir desde la IP del contenedor (generalmente 172.X) o desde la IP del servidor anfitrión.
    • Servidores de aplicaciones
    • Salida desde la IP del servidor anfitrión.
    -- Crear usuario www. Es utilizado por la aplicación para leer la db.
    -- Hay que modificar la IP con la IP/Rango de los servidores de la aplicación.
    -- Hay que modificar la PASSWORD con la contraseña que se quiera dar a este usuario.
    CREATE USER 'www'@'IP' IDENTIFIED BY 'PASSWORD';
    -- Concede derechos al usuario www.
    -- Sustituye IP por la IP/Rango de los servidores de aplicación.
    GRANT SELECT,INSERT,UPDATE,DELETE ON lockself.* TO 'www'@'IP';

    -- Crea el usuario lockself_migration. Lo usará la aplicación para migrar la db.
    -- Hay que modificar IP con la IP/Rango de los servidores de la aplicación.
    -- Hay que modificar PASSWORD con la contraseña que se quiera dar a este usuario.
    CREATE USER 'lockself_migration'@'IP' IDENTIFIED BY 'PASSWORD';
    -- Concede derechos al usuario lockself_migration.
    -- Sustituye IP por la IP/Rango de los servidores de aplicación.
    GRANT SELECT,INSERT,UPDATE,DELETE,ALTER,CREATE,DROP,INDEX ON lockself.* TO 'lockself_migration'@'IP';

    Como recordatorio, el usuario root y la creación de la base de datos se realizan mediante las variables de entorno cuando se lanza el contenedor por primera vez.

    💡 Si lo deseas, puedes crear otros usuarios para tus necesidades de copia de seguridad, monitorización, etc..

    5.4. Acciones a realizar en el servidor de base de datos - Paso 3

    Una vez modificado el script anterior y adaptado a tus necesidades, ejecuta el siguiente comando para crear los usuarios en la base de datos:

    docker exec -i mariadb sh -c 'exec mysql -uroot -pmy-secret-pwd' < create_user.sql

    • mariadb debe modificarse con el nombre del contenedor elegido (nombre elegido en el paso 5.1)
    • .
    • my-secret-pwd se debe modificar con la contraseña de root
    • crear_usuario.sql se debe modificar con respecto al nombre del archivo que contiene el script SQL anterior

    6. Instalación del segundo componente: La aplicación LockSelf

    6.1. Preámbulo

    En primer lugar, necesitamos recuperar el paquete proporcionado por los equipos LockSelf y comprobar su integridad. Este paquete incluye:

    • La imagen contenedora: lockself-api-X.X.X.tar.gz
    • La firma de la imagen del contenedor: lockself-api-X.X.X.tar.gz.sig
    ⚠️ Antes de cualquier operación, debe comprobar la firma adherida a la imagen del contenedor.

    6.2. Acción a realizar en el servidor de aplicaciones - Paso 1

    El primer paso es crear un par de claves RSA. Esta será utilizada por la aplicación LockSelf. Estas claves deben ser almacenadas en el servidor, las utilizaremos en el paso 6.5.

    6.5.

    openssl genpkey -out private.pem -aes256 -algorithm rsa -pkeyopt rsa_keygen_bits:4096

    Para la frase de contraseña solicitada durante la ejecución de este comando, recomendamos una frase de contraseña aleatoria de 32 caracteres alfanuméricos con caracteres especiales. Esta frase de contraseña se solicitará en el paso 6.3.

    openssl pkey -in private.pem -out public.pem -pubout

    El primer comando crea la clave privada RSA (4096 bits) y la cifra en AES256 con la frase de contraseña especificada.

    El segundo extrae la clave privada RSA (4096 bits) y la cifra en AES256 con la frase de contraseña especificada.

    El segundo extrae la clave pública asociada.

    6.3. Acciones a realizar en el servidor de aplicaciones - Paso 2

    Recupera el script install_lockself.sh del apéndice del documento (13.1) en el servidor y ejecútalo. Se le pedirán varios datos. Al final de la ejecución del script, recuperará un archivo llamado env que utilizaremos en el paso 6.5.

    El archivo de entorno generado env contiene, en particular, las sales de cifrado y las variables relativas a su infraestructura local.

    6.5.

    6.4. Antes del despliegue del contenedor

    Antes de desplegar el contenedor, comprueba que tienes la siguiente información disponible en el servidor web:

    • El archivo env (por ejemplo en: /home/user/lockself/env) generado por el script install_lockself.sh (Paso 6.3)

      .

    • En una carpeta (por ejemplo: /home/user/lockself/ssl/), los certificados SSL (como recordatorio: En caso de que tus certificados contengan Atributos de la bolsa y Atributos clave, por favor, elimínelos):

      • El certificado seguido de la cadena de certificación bajo el nombre: ssl-certificate.crt.
      • La clave privada sin cifrar bajo el nombre: ssl-certificate.key
      • Sólo como parte de una conexión SSO:
        • El certificado SIN la cadena de certificación bajo el nombre: sp.crt
    • En una carpeta (por ejemplo: /home/user/lockself/jwt/) el par de claves RSA generado en el paso 6.2:

      • La clave privada bajo el nombre: private.pem.
      • La clave pública bajo el nombre: public.pem
    • Una carpeta que se utilizará para almacenar los archivos y hacerlos permanentes si se reinicia el contenedor (por ejemplo: /home/usuario/lockself/files).

    • Opcional: En el caso de que SELinux esté habilitado en los servidores anfitriones, se debe realizar un cambio de derechos en los distintos ficheros:
      • chcon -Rt svirt_sandbox_file_t /home/user/lockself/jwt
      • .
      • chcon -Rt svirt_sandbox_file_t /home/user/lockself/ssl
      • chcon -Rt svirt_sandbox_file_t /home/user/lockself/env
      • chcon -Rt svirt_sandbox_file_t /home/user/lockself/files

    6.5. Acciones a realizar en el servidor de aplicaciones - Paso 3

    Cargar la imagen LockSelf en el servidor web:

    docker load --input lockself-api-X.X.X.tar.gz

    Para desplegar el contenedor de aplicaciones, hay tres posibilidades. Depende de ti elegir cuál quieres usar según las recomendaciones de la compañía.

    6.5.1. Lanzamiento manual

    docker run 
    --name lockself-api-3
    -v /home/user/lockself/jwt:/usr/local/var/www/html/config/jwt
    -v /home/user/lockself/ssl:/usr/local/etc/nginx/ssl
    -v /home/user/lockself/env:/usr/local/var/www/html/.env
    -v /home/user/lockself/files:/usr/local/var/www/html/var/glutton
    -v /home/user/lockself/ssl/sp.crt:/usr/local/var/www/html/vendor/onelogin/php-saml/certs/sp.crt
    -v /home/user/lockself/ssl/ssl-certificate.key:/usr/local/var/www/html/vendor/onelogin/php-saml/certs/sp.key
    -p 80:8080 \
    -p 443:4443 \
    -d lockself-api-v3:X.X.X
    • --nombre: corresponde al nombre del contenedor una vez creado
    • -v: corresponde a los volúmenes montados
    • -p : permite que el host reenvíe peticiones en los puertos 80 y 443 al contenedor
    • -d: permite que el contenedor se lance en segundo plano
    • lockself-api-v3:X.X.X: corresponde a la versión de la imagen LockSelf utilizada
    ⚠️ Tenga cuidado de adaptar correctamente la etiqueta de imagen, así como las rutas relativas a los volúmenes. Los dos últimos puntos de montaje sólo deben hacerse para que funcione una conexión SSO.

    6.5.2. Lanzamiento a través de docker-compose

    Si desea utilizar docker-compose para iniciar el contenedor de la aplicación, puede utilizar el archivo de configuración docker-compose.yml que se muestra a continuación:

    version: '3.8'

    servicios:
    lockself-api-3:
    imagen: lockself-api-v3:X.X.X
    restart: always
    volumes:
    - "/home/user/lockself/jwt:/usr/local/var/www/html/config/jwt"
    - "/home/user/lockself/ssl:/usr/local/etc/nginx/ssl"
    - "/home/user/lockself/env:/usr/local/var/www/html/.env"
    - "/home/user/lockself/files:/usr/local/var/www/html/var/glutton"
    - "/home/user/lockself/ssl/sp.crt:/usr/local/var/www/html/vendor/onelogin/php-saml/certs/sp.crt"
    - "/home/user/lockself/ssl/ssl-certificate.key:/usr/local/var/www/html/vendor/onelogin/php-saml/certs/sp.key"
    ports :
    - "80:8080"
    - "443:4443"

    Una vez recuperado el fichero de configuración del servidor anfitrión, puede iniciar el contenedor mediante el siguiente comando:

    docker-compose up -d --build
    ⚠️ Ten cuidado de adaptar correctamente la etiqueta de imagen, así como las rutas relativas a los volúmenes. Los dos últimos puntos de montaje sólo deben hacerse para que funcione una conexión SSO..

    6.5.3. Lanzamiento a través de docker-swarm

    Si desea utilizar docker-swarm para iniciar el contenedor de base de datos, puede utilizar el siguiente archivo de configuración yaml:

    version: '3.7'

    services:
    lockself-api-3:
    image: lockself-api-v3:X.X.X
    ports:
    - target: 8080
    published: 80
    protocol: tcp
    mode: host
    - target: 4443
    published: 443
    protocol: tcp
    mode: host
    volúmenes:
    - "/home/user/lockself/jwt:/usr/local/var/www/html/config/jwt"
    - "/home/user/lockself/ssl:/usr/local/etc/nginx/ssl"
    - "/home/user/lockself/env:/usr/local/var/www/html/.env"
    - "/home/user/lockself/files:/usr/local/var/www/html/var/glutton"
    - "/home/user/lockself/ssl/sp.crt:/usr/local/var/www/html/vendor/onelogin/php-saml/certs/sp.crt"
    - "/home/user/lockself/ssl/ssl-certificate.key:/usr/local/var/www/html/vendor/onelogin/php-saml/certs/sp.key"

    Swarm se puede utilizar de varias maneras, que no vamos a entrar en detalle en este procedimiento. Puedes encontrar todos los detalles de su funcionamiento en su web oficial: https://docs.docker.com/engine/swarm/

    .
    ⚠️ Tenga cuidado de adaptar correctamente la etiqueta de imagen, así como las rutas relativas a los volúmenes. Los dos últimos puntos de montaje sólo deben realizarse para permitir que funcione una conexión SSO. Es posible que también necesite añadir opciones, como red, desplegar, etc.

    Las migraciones de bases de datos (incluyendo la creación de estructuras) se harán automáticamente al iniciar el contenedor. Comprueba que se inicia ejecutando el comando:

    • docker logs -f CONTAINER_ID

    7. Crear la cuenta de administrador

    Una vez creada la infraestructura, tendrás la oportunidad de crear tu cuenta de administrador. Para ello, dirígete a la siguiente URL y rellena la información solicitada:

    https://FQDN/external/users/validate-account/index.html?firstCo

    Donde FQDN es el nombre de dominio que opera

    Solicite la clave de licencia a su gestor de cuentas.

    Para activar la clave de licencia, necesitará un ordenador con conexión a Internet a nuestro sistema de licencias. El nombre de dominio y la IP de este servidor puede proporcionárselos su Gestor de Cuenta.

    Solicite la clave de licencia a su Gestor de Cuenta.

    8. Copia de seguridad

    Dos elementos son importantes para realizar una copia de seguridad en un lugar seguro una vez finalizada la instalación:

      .
      • El archivo env generado en el paso 6.3.
        • Este archivo contiene los archivos de configuración imprescindibles para que tu instalación funcione correctamente. Estos archivos una vez generados no pueden ser regenerados de forma idéntica. Si los perdiera, la información contenida en la base de datos se volvería indescifrable.
      • La base de datos

      Recomendamos aplicar cifrado (simétrico o asimétrico) para la copia de seguridad de estos dos componentes.

      Seguridad

      9. Interconectar la aplicación en SSO

      Para conectar la aplicación en SSO, puedes seguir la siguiente documentación: Configuración de interconexión SSO

      9.1. Sincronización de grupos

      Si envías grupos de usuarios a través de la Federación y quieres que se sincronicen en LockSelf, tendrás que cambiar el siguiente parámetro en el fichero env: (asegúrate de que el claim grupos lo envía la Federación):

      .

      intercoAd=0 por intercoAd=1

      Si no quieres recuperar todos los grupos de tu directorio, puedes elegir un prefijo donde sólo los grupos con este prefijo serán recuperados por LockSelf. La siguiente variable tendrá que ser reemplazada en el archivo env:

      intercoAdPrefix='' por intercoAdPrefix='MY_PREFIX'

      A continuación, reinicie el contenedor.

      9.2 Verificar la conexión

      Si todos los pasos se han realizado correctamente, tendrás la opción de realizar una conexión desde la pestaña SSO de la aplicación.

      Si todos los pasos se han realizado correctamente, tendrás la opción de realizar una conexión desde la pestaña SSO de la aplicación.

      10. Apéndices

      Apéndice 1 - install_lockself.sh

      #!/bin/bash
      # Este script configurará tu instalación de LockSelf
      # Creará un archivo env. Este archivo será montado en su contenedor.
      # Mantener: LockSelf SAS <contact@lockself.com>

      if [ -.f $PWD/env ]
      then
      printf "Ya tienes una instalación de LockSelf. Tenga cuidado de no perder el archivo '~/env'. Sin él, será imposible acceder a sus datos. Si está seguro de reinstalar LockSelf, suprima el fichero ~/env y relance este script."
      exit 1
      fi
      printf " _ _ _____ _ __ \n"
      printf "| | | / ____| |/ _|""
      printf "| ___ ___| | _| (___ ___| | |_ \n"
      printf "| / _ \ / __| |/ /\___ \ / _ | _|\n"
      printf "|___| (_) | (__| < ____) | __/ | | \n"
      printf "|_________\___/ \|_|\______/ \___|_|_| \n\n"
      printf "Bienvenido al programa de instalación local de LockSelf\n"
      printf "En primer lugar, configuraremos la información de la base de datos (cuenta aplicativa - paso 5.3):\n\n"

      mientras [[ class="token variable">$dbHost == "" ]]
      do
      printf "DB Host: >" && read dbHost
      done
      while [[ $dbName == "" ]]
      do
      printf "DB Name: >" && read dbName
      done
      while [[ $dbUser == "" ]]
      do
      printf "DB User (applicative account): >" && read dbUser
      done
      while [[ $dbPassword == "" ]]
      do
      printf "Contraseña BD (cuenta aplicativa): >" && read -s dbContraseña
      hecho
      mientras [[ $dbContraseña2 == "" ]]
      do
      printf "\nVerifica tu contraseña de BD (cuenta aplicativa): >" && read -¡s dbContraseña2
      done
      if [[ $dbContraseña != $dbContraseña2 ]]

      then
      printf "\nLas dos contraseñas no se corresponden. Por favor, reinicie la instalación."
      exit 1
      fi
      printf "\n\nAhora, vamos a configurar la información de la base de datos para el usuario lockself_migration: (paso 5.3)\n"
      while [[ $dbPasswordPhinx == "" ]]
      do
      printf "Contraseña DB lockself_migration: >" && read -s dbPasswordPhinx
      done
      while [[ $dbPassword2Phinx == "" ]]
      do
      printf "\nVerifica tu contraseña de BD lockself_migration: >" && read -¡s dbPassword2Phinx
      done
      if [[ $dbPasswordPhinx != $dbPassword2Phinx ]]
      then
      printf "\nLas dos contraseñas no se corresponden. Por favor, reinicie la instalación."
      exit 1
      fi
      printf "\n\nIntroduzca ahora la frase de contraseña elegida para el JWT: (paso 6.2)\n"
      while [[ $jwtPassphrase == "" ]]
      do
      printf "Escribe tu frase de contraseña JWT: >" && read -s jwtPassphrase
      done
      while [[ $jwtPassphrase2 == "" ]]
      do
      printf "\nVerifica tu frase de contraseña JWT: >" && read -¡s jwtPassphrase2
      done
      if [[ $jwtPassphrase != $jwtPassphrase2 ]]
      then
      printf "Las dos contraseñas no se corresponden. Por favor, reinicie la instalación."
      exit 1
      fi
      printf "\n\nConfiguremos la conexión SMTP (se utilizará para enviar el correo electrónico del sistema):\n"
      while [[ $smtpHost == "" ]]
      do
      printf "SMTP Host: >" && read smtpHost
      done
      while [[ $smtpPort == "" ]]
      do
      printf "Puerto SMTP: >" && read smtpPort
      done
      while [[ $smtpAuth == "" ]]
      do
      printf "SMTP Auth: (true or false) >" && read smtpAuth
      done
      if [ $smtpAuth == "true" ]
      entonces
      while [[ $smtpUsername == "" ]]
      do
      printf "Nombre de usuario SMTP: >" && read smtpUsername
      done
      while [[ $smtpPassword == "" ]]
      do
      printf "Contraseña SMTP: >" && read smtpPassword
      done
      else
      smtpUsername=""
      smtpContraseña=""
      fi
      while [[ $smtpSsl == "" ]]
      do
      printf "SMTP SSL: (ssl or tls or null) >" && read smtpSsl
      done
      if [ $smtpSsl == "null" ]
      entonces
      smtpSsl=""
      fi
      while [[ [ [$smtpNoReply == "" ]]
      do
      printf "Dirección de no respuesta: (ex: no-reply@company.com) >" && read smtpNoReply
      done
      printf `date`
      printf "\nConfiguración SMTP finalizadan"
      printf "\n\nPor último, especifica el dominio que quieres usar:"
      while [[ $domain == "" ]]
      do
      printf "\nDominio: (ex: lockself.empresa.com) >" && readdominio
      done
      /bin/cat <<EOF > $PWD/env
      ###> symfony/framework-bundle ###
      APP_ENV=prod
      APP_DEBUG=0
      APP_SECRET=62ab7ba420f13ef7f912d270c2a40ee0
      ###< symfony/framework-bundle ###

      ###> lexik/jwt-authentication-bundle ###
      JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem
      JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem
      JWT_PASSPHRASE="$jwtPassphrase"
      JWT_TTL=604800
      ###< lexik/jwt-authentication-bundle ###

      ###> doctrine/doctrine-bundle ###
      DATABASE_URL='mysql://$dbUser:$dbPassword@$dbHost:3306/$dbName'
      ##< doctrine/doctrine-bundle ###
      ###> robmorgan/phinx ###
      PHINX_USER='lockself_migration'
      PHINX_PASSWORD='$dbPasswordPhinx'
      PHINX_HOST='$dbHost'
      PHINX_PORT='3306'
      PHINX_DB_NAME='$dbName'
      ###< robmorgan/phinx ###

      ###> LockSelf ###
      debug=0
      dominio=$dominio
      saltContraseña1="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      saltContraseña2="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      saltPin1="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      saltPin2="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      keyPin="$(LC_ALL=C tr -dc 'A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 32 ; echo)"
      ivPin="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      saltApiHash1="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      saltApiHash2="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      sampleHash="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      blockConnexionInSecond=900
      pinLength=6
      saltTransfer1="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      saltTransfer2="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      saltTransferProtectedEmail1="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      saltTransferProtectedEmail2="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      saltDeposit1="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      saltDeposit2="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      saltMail1="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      saltMail2="$(LC_ALL=C tr -dc '¡A-Za-z0-9!#%&()+,-./:;<=>?@[\]^_{|}~' </dev/urandom | head -c 16 ; echo)"
      bucket=
      providerAccessKey=
      providerSecretKey=
      providerRegion=
      providerEndpoint=
      provider=LOCAL
      depositTokenTime=15
      noReplyEmail='$smtpNoReply'
      colorBtn='#39499b'
      companyName="LockSelf"
      nameDepositBox="Acceso a una caja de depósito"
      newFileDeposit="Nuevo archivo cargado"
      newFileDeposit="Nuevo archivo cargado"
      newTransfer="Nuevo archivo protegido recibido"
      apiVersion=3
      apiVersion=3
      intercoAd=0
      intercoAdPrefix=''
      importOrganization=0
      importOrganizationSendEmail=0
      intercoAdOrganizations=0
      ###< LockSelf ###

      ####> symfony/swiftmailer-bundle ###
      MAILER_URL=smtp://$smtpHost:$smtpPort?encryption=$smtpSsl&username=$smtpUsername&contraseña=$smtpContraseña
      ###< symfony/swiftmailer-bundle ###

      ###> ovh/ovh ###
      smsApplicationKey=
      smsApplicationSecret=
      smsConsumerKey=
      smsEndpoint=
      ###< ovh/ovh ###

      ###> knplabs/knp-snappy-bundle ###
      WKHTMLTOPDF_PATH=/usr/local/bin/wkhtmltopdf
      WKHTMLTOIMAGE_PATH=/usr/local/bin/wkhtmltoimage
      ##< knplabs/knp-snappy-bundle ###

      EOF
      printf "\n\nStep 6.3 terminado. Si desea revisar su archivo de configuración, como su configuración smtp o base de datos, puede comprobar el archivo 'env' que es creado por este script o puede continuar la guía de despliegue."

Actualización