One place for hosting & domains

      Configuración

      Configuración inicial del servidor con Ubuntu 20.04


      Introducción

      Cuando crea por primera vez un nuevo servidor Ubuntu 20.04, debe realizar algunos pasos de configuración importantes como parte de la configuración básica. Estos pasos aumentarán la seguridad y utilidad de su servidor, y le brindará una base sólida para las siguientes acciones.

      Paso 1: Iniciar sesión como root

      Para iniciar sesión en su servidor, deberá conocer la dirección IP pública de este. También necesitará la contraseña o, si instaló una clave SSH para la autenticación, la clave privada para la cuenta del root user. Si aún no inició sesión en su servidor, quizá desee seguir nuestra guía sobre cómo establecer conexión con Droplets mediante SSH, que cubre con detalle este proceso.

      Si aún no está conectado con su servidor, inicie sesión como root user usando ahora el siguiente comando (sustituya la parte resaltada del comando por la dirección IP pública de su servidor):

      Acepte la advertencia sobre la autenticidad del host si aparece. Si utiliza la autenticación con contraseña, proporcione su contraseña root para iniciar sesión. Si utiliza una clave SSH protegida con una frase de contraseña, es posible que se le solicite ingresar esta última la primera vez que utilice la clave en cada sesión. Si es la primera vez que inicia sesión en el servidor con una contraseña, puede que también se le solicite cambiar la contraseña root.

      Acerca de root

      El root user es el usuario administrativo en un entorno Linux y tiene privilegios muy amplios. Debido a estos privilegios mayores de la cuenta root, no se recomienda usarla de manera regular. Esto se debe a que parte del poder inherente de la cuenta root es la capacidad de realizar cambios muy destructivos, incluso por accidente.

      El siguiente paso es configurar una nueva cuenta de usuario con menos privilegios para el uso cotidiano. Más tarde, le enseñaremos cómo obtener más privilegios solo durante los momentos en que los necesite.

      Paso 2: Crear un nuevo usuario

      Una vez que haya iniciado sesión como root, estaremos preparados para añadir la nueva cuenta de usuario. En el futuro, iniciaremos sesión con esta nueva cuenta en vez de con root.

      En este ejemplo se crea un nuevo usuario llamado sammy, pero debe sustituirlo por cualquier nombre de usuario que prefiera:

      Se le harán algunas preguntas, comenzando con la contraseña de la cuenta.

      Introduzca una contraseña segura y, opcionalmente, complete la información adicional si lo desea. Esto no es obligatorio y puede pulsar ENTER en cualquier campo que desee omitir.

      Paso 3: Conceder privilegios administrativos

      Ahora, tenemos una nueva cuenta de usuario con privilegios de una cuenta regular. Sin embargo, a veces necesitaremos realizar tareas administrativas.

      Para evitar tener que cerrar la sesión de nuestro usuario normal y volver a iniciar sesión como cuenta root, podemos configurar lo que se conoce como “superusuario” o privilegios root para nuestra cuenta normal. Esto permitirá a nuestro usuario normal ejecutar comandos con privilegios administrativos anteponiendo la palabra sudo a cada comando.

      Para añadir estos privilegios a nuestro nuevo usuario, debemos agregarlo al grupo sudo. Por defecto, en Ubuntu 20.04, los usuarios que son miembros del grupo sudo pueden usar el comando sudo.

      Como root, ejecute este comando para añadir su nuevo usuario al grupo sudo (sustituya el nombre de usuario resaltado por su nuevo usuario):

      Ahora, cuando inicie sesión como usuario normal, puede escribir sudo antes de los comandos para realizar acciones con privilegios de superusuario.

      Paso 4: Configurar un firewall básico

      Los servidores Ubuntu 20.04 pueden usar el firewall UFW para garantizar que solo se permiten las conexiones con ciertos servicios. Podemos configurar un firewall básico fácilmente usando esta aplicación.

      Nota: Si sus servidores están funcionan con DigitalOcean, puede usar de manera opcional los firewalls en la nube de DigitalOcean en lugar del firewall UFW. Recomendamos usar solo un firewall a la vez para evitar reglas conflictivas que pueden ser difíciles de depurar.

      Las aplicaciones pueden registrar sus perfiles con UFW tras la instalación. Estos perfiles permiten a UFW gestionar estas aplicaciones por su nombre. OpenSSH, el servicio que nos permite conectar con nuestro servidor ahora, tiene un perfil registrado con UFW.

      Puede ver esto escribiendo lo siguiente:

      Output

      Available applications: OpenSSH

      Debemos asegurarnos que el firewall permite conexiones SSH de forma que podamos iniciar sesión de nuevo la próxima vez. Podemos permitir estas conexiones escribiendo lo siguiente:

      Posteriormente, podemos habilitar el firewall escribiendo:

      Escriba y y pulse INTRO para continuar. Puede ver que las conexiones SSH aún están permitidas escribiendo lo siguiente:

      Output

      Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

      Ya que el firewall está bloqueando actualmente todas las conexiones excepto SSH, si instala y configura servicios adicionales, deberá ajustar la configuración del firewall para permitir el tráfico entrante. Puede obtener más información sobre algunas operaciones comunes de UFW en nuestra guía Puntos esenciales de UFW.

      Paso 5: Habilitar el acceso externo para su usuario normal

      Ahora que tenemos un usuario regular para el uso cotidiano, debemos asegurarnos que podemos realizar SSH en la cuenta directamente.

      Nota: Mientras no verifique que pueda iniciar sesión y usar sudo con su nuevo usuario, le recomendamos permanecer conectado como root. De esta manera, si tiene problemas, puede resolverlos y realizar cualquier cambio necesario como root. Si utiliza un Droplet de DigitalOcean y experimenta problemas con su conexión SSH de root, puede iniciar sesión en el Droplet usando la consola de DigitalOcean.

      El proceso para configurar el acceso SSH de su nuevo usuario depende de que en la cuenta root de su servidor se utilicen una contraseña o claves SSH para la autenticación.

      Si en la cuenta root se utiliza la autenticación con contraseña

      Si inició sesión en su cuenta root usando una contraseña, entonces la autenticación con contraseña estará habilitada para SSH. Puede aplicar SSH en su nueva cuenta de usuario abriendo una nueva sesión de terminal y usando SSH con su nuevo nombre de usuario:

      Después de ingresar la contraseña de su usuario normal, iniciará sesión. Recuerde que si necesita ejecutar un comando con privilegios administrativos debe escribir sudo antes de este, como se muestra a continuación:

      Se le solicitará la contraseña de su usuario normal cuando utilice sudo por primera vez en cada sesión (y periódicamente después).

      Para mejorar la seguridad de su servidor, le recomendamos enfáticamente establecer claves de SSH en lugar de usar la autenticación con contraseña. Siga nuestra guía de configuración de claves de SSH en Ubuntu 20.04 para aprender a configurar la autenticación basada en claves.

      Si en la cuenta root se utiliza la autenticación con clave SSH

      Si inició sesión en su cuenta root usando claves SSH, la autenticación con contraseña estará desactivada para SSH. Para iniciar sesión correctamente deberá añadir una copia de su clave pública local al archivo ~/.ssh/authorized_keys del nuevo usuario.

      Debido a que su clave pública ya está en el archivo ~/.ssh/authorized_keys de la cuenta root, podemos copiar esa estructura de archivos y directorios a nuestra nueva cuenta de usuario en nuestra sesión existente.

      El medio más sencillo para copiar los archivos con la propiedad y los permisos adecuados es el comando rsync. Con este, se copiará el directorio .ssh del usuario root, se conservarán los permisos y se modificarán los propietarios de archivos; todo a través de un solo comando. Asegúrese de cambiar las porciones resaltadas del comando que se muestra a continuación para que coincida con el nombre de su usuario normal:

      Nota: El comando rsync trata de manera diferente las fuentes y destinos que tienen una barra diagonal al final respecto de aquellos que no la tienen. Al usar rsync a continuación, asegúrese de que en el directorio de origen (~/.ssh) no se incluya una barra diagonal al final (verifique que no esté usando ~/.ssh/).

      Si accidentalmente añade una barra diagonal al final del comando, en rsync se copiará el contenido del directorio ~/.ssh de la cuenta root al directorio principal del usuario sudo en lugar de la estructura de directorios completa ~/.ssh. Los archivos se encontrarán en la ubicación equivocada y SSH no podrá encontrarlos ni utilizarlos.

      • rsync --archive --chown=sammy:sammy ~/.ssh /home/sammy

      Ahora, abra una nueva sesión terminal en su equipo local, y utilice SSH con su nuevo nombre de usuario:

      Su sesión de la nueva cuenta de usuario deberá iniciarse sin contraseña. Recuerde que si necesita ejecutar un comando con privilegios administrativos debe escribir sudo antes de este, como se muestra a continuación:

      Se le solicitará la contraseña de su usuario normal cuando utilice sudo por primera vez en cada sesión (y periódicamente después).

      ¿Dónde puedo ir desde aquí?

      En este momento, dispondrá de una base sólida para su servidor. Ahora podrá instalar el software que necesite en su servidor.



      Source link

      Configuración inicial para servidores con CentOS 8


      Introducción

      Cuando se cree por primera vez un nuevo servidor de CentOS 8, hay algunos pasos de configuración que se deben seguir desde el principio como parte de la configuración básica. Esto aumentará la seguridad y utilidad de su servidor, y le brindará una base sólida para las siguientes acciones.

      Paso 1: Iniciar sesión como root

      Para iniciar sesión en su servidor, deberá conocer la dirección IP pública de este. También necesitará la contraseña o, si instaló una clave SSH para la autenticación, la clave privada para la cuenta del usuario root. Si aún no inició sesión en su servidor, quizá desee aplicar nuestra documentación relacionada con cómo establecer conexión con su Droplet mediante SSH, en la que se abarca en detalle este proceso.

      Si aún no está conectado con su servidor, inicie sesión como usuario root usando ahora el siguiente comando (sustituya la parte resaltada del comando por la dirección IP pública de su servidor):

      Acepte la advertencia sobre la autenticidad del host si aparece. Si utiliza la autenticación con contraseña, proporcione su contraseña root para iniciar sesión. Si utiliza una clave SSH protegida con una frase de contraseña, es posible que se le solicite ingresar esta última la primera vez que utilice la clave en cada sesión. Si es la primera vez que inicia sesión en el servidor con una contraseña, puede que también se le solicite cambiar la contraseña root.

      Acerca de root

      El usuario root es el usuario administrativo de un entorno de Linux y tiene privilegios muy amplios. Debido a estos privilegios mayores de la cuenta root, no se recomienda usarla de manera regular. Esto se debe a que parte del poder inherente de la cuenta root es la capacidad de realizar cambios muy destructivos, incluso por accidente.

      Por lo tanto, en el siguiente paso se establece una cuenta de usuario alternativa con un ámbito de influencia reducido para las tareas cotidianas. En esta cuenta todavía se podrán aumentar los privilegios cuando sea necesario.

      Paso 2: Crear un nuevo usuario

      Una vez que inicie sesión como root, podrá crear la nueva cuenta de usuario que usaremos de ahora en adelante para iniciar sesión.

      En este ejemplo se crea un nuevo usuario llamado sammy, pero debe sustituirlo por cualquier nombre de usuario que prefiera:

      A continuación, establezca una contraseña segura para el usuario sammy:

      Se le solicitará ingresar la contraseña dos veces. Después de hacerlo, su usuario estará listo para usarse, pero primero daremos a este privilegios adicionales para usar el comando sudo. Esto nos permitirá ejecutar comandos como root cuando sea necesario.

      Paso 3: Conceder privilegios administrativos

      Ahora, tenemos una nueva cuenta de usuario con privilegios de una cuenta regular. Sin embargo, a veces necesitaremos realizar tareas administrativas.

      Para evitar tener que cerrar la sesión de nuestro usuario normal y volver a iniciar sesión como cuenta root, podemos configurar lo que se conoce como “superusuario” o privilegios root para nuestra cuenta normal. Esto permitirá a nuestro usuario normal ejecutar comandos con privilegios administrativos anteponiendo la palabra sudo a cada comando.

      Para añadir estos privilegios a nuestro nuevo usuario, debemos agregarlo al grupo wheel. Por defecto, en CentOS 8, los usuarios que pertenecen al grupo wheel están autorizados para usar el comando sudo.

      Como root, ejecute este comando para añadir su nuevo usuario al grupo wheel (sustituya la palabra resaltada por su nuevo nombre de usuario):

      Ahora, cuando inicie sesión como usuario normal, puede escribir sudo antes de los comandos para realizar acciones con privilegios de superusuario.

      Paso 4: Configurar un firewall básico

      Los firewalls proporcionan un nivel básico de seguridad para su servidor. Estas aplicaciones se encargan de negar el tráfico a cada puerto de su servidor, salvo en el caso de aquellos puertos y servicios que haya aprobado de forma explícita. CentOS cuenta con un servicio llamado firewalld para realizar esta función. Se utiliza una herramienta llamada firewall-cmd para configurar las políticas de firewall de firewalld.

      Nota: Si sus servidores están funcionan con DigitalOcean, puede usar de manera opcional los firewalls en la nube de DigitalOcean en lugar del firewall UFW. Recomendamos usar solo un firewall a la vez para evitar reglas conflictivas que pueden ser difíciles de depurar.

      Primero, instale firewalld:

      En la configuración predeterminada de firewalld se permiten las conexiones ssh, por lo que podemos activar el firewall de inmediato:

      • systemctl start firewalld

      Compruebe el estado del servicio para asegurar que se haya iniciado:

      • systemctl status firewalld

      Output

      ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-02-06 16:39:40 UTC; 3s ago Docs: man:firewalld(1) Main PID: 13180 (firewalld) Tasks: 2 (limit: 5059) Memory: 22.4M CGroup: /system.slice/firewalld.service └─13180 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid

      Observe que su estado es active y enabled, lo cual significa que se iniciará por defecto si se reinicia el servidor.

      Ahora que el servicio está activo y en ejecución, podemos usar la utilidad firewall-cmd a fin de obtener y establecer información sobre políticas para el firewall.

      Primero, enumeraremos los servicios ya permitidos:

      • firewall-cmd --permanent --list-all

      Output

      public (active) target: default icmp-block-inversion: no interfaces: eth0 eth1 sources: services: cockpit dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

      Para ver los servicios adicionales que puede habilitar por nombre, escriba lo siguiente:

      • firewall-cmd --get-services

      Para añadir un servicio que debe estar permitido, utilice el indicador --add-service:

      • firewall-cmd --permanent --add-service=http

      Con esto, se agregaría el servicio http y se permitiría el tráfico TCP entrante en el puerto 80. La configuración se actualizará después de que usted vuelva a cargar el firewall:

      Recuerde que deberá abrir el firewall de forma explícita (con servicios o puertos) para cualquier servicio adicional que pueda configurar más adelante.

      Paso 5: Habilitar el acceso externo para su usuario normal

      Ahora que tenemos un usuario no root normal para uso diario, debemos asegurarnos de que podamos usarlo para aplicar SSH en nuestro servidor.

      Nota: Mientras no verifique que pueda iniciar sesión y usar sudo con su nuevo usuario, le recomendamos permanecer conectado como root. De esta manera, si tiene problemas, puede resolverlos y realizar cualquier cambio necesario como root. Si utiliza un Droplet de DigitalOcean y experimenta problemas con su conexión SSH de root, puede iniciar sesión en el Droplet usando la consola de DigitalOcean.

      El proceso para configurar el acceso SSH de su nuevo usuario depende de que en la cuenta root de su servidor se utilicen una contraseña o claves SSH para la autenticación.

      Si en la cuenta root se utiliza la autenticación con contraseña

      Si inició sesión en su cuenta root usando una contraseña, entonces la autenticación con contraseña estará habilitada para SSH. Puede aplicar SSH en su nueva cuenta de usuario abriendo una nueva sesión de terminal y usando SSH con su nuevo nombre de usuario:

      Después de ingresar la contraseña de su usuario normal, iniciará sesión. Recuerde que si necesita ejecutar un comando con privilegios administrativos debe escribir sudo antes de este, como se muestra a continuación:

      Se le solicitará la contraseña de su usuario normal cuando utilice sudo por primera vez en cada sesión (y periódicamente después).

      Para mejorar la seguridad de su servidor, le recomendamos enfáticamente establecer claves de SSH en lugar de usar la autenticación con contraseña. Siga nuestra guía de configuración de claves de SSH en CentOS 8 para aprender a configurar la autenticación basada en claves.

      Si en la cuenta root se utiliza la autenticación con clave SSH

      Si inició sesión en su cuenta root usando claves SSH, la autenticación con contraseña estará *desactivada *para SSH. Para iniciar sesión con éxito, deberá añadir una copia de su clave pública al archivo ~/.ssh/authorized_keys del nuevo usuario.

      Debido a que su clave pública ya está en el archivo ~/.ssh/authorized_keys de la cuenta root del servidor, podemos copiar esa estructura de archivos y directorios a nuestra nueva cuenta de usuario.

      El medio más sencillo para copiar los archivos con la propiedad y los permisos adecuados es el comando rsync. Con este, se copiará el directorio .ssh del usuario** root**, se conservarán los permisos y se modificarán los propietarios de archivos; todo a través de un solo comando. Asegúrese de cambiar las porciones resaltadas del comando que se muestra a continuación para que coincida con el nombre de su usuario normal:

      Nota: El comando rsync trata de manera diferente las fuentes y destinos que tienen una barra diagonal al final respecto de aquellos que no la tienen. Al usar rsync a continuación, asegúrese de que en el directorio de origen (~/.ssh) no se incluya una barra diagonal al final (verifique que no esté usando ~/.ssh/).

      Si accidentalmente añade una barra diagonal al final del comando, en rsync se copiará el contenido del directorio ~/.ssh de la cuenta root al directorio principal del usuario sudo en lugar de la estructura de directorios completa ~/.ssh. Los archivos se encontrarán en la ubicación equivocada y SSH no podrá encontrarlos ni utilizarlos.

      • rsync --archive --chown=sammy:sammy ~/.ssh /home/sammy

      Ahora, de vuelta en la nueva terminal de su máquina local, abra una nueva sesión de SSH con su usuario no root:

      Su sesión de la nueva cuenta de usuario deberá iniciarse sin contraseña. Recuerde que si necesita ejecutar un comando con privilegios administrativos debe escribir sudo antes de este, como se muestra a continuación:

      Se le solicitará la contraseña de su usuario normal cuando utilice sudo por primera vez en cada sesión (y periódicamente después).

      Conclusión

      En este momento, dispondrá de una base sólida para su servidor. Ahora podrá instalar el software que necesite en su servidor.



      Source link

      Cómo usar migraciones y alimentadores de bases de datos para abstraer la configuración de bases de datos en Laravel


      Las migraciones y los sembradores son poderosas utilidades de bases de datos que se proporcionan a través del marco PHP Laravel para permitir a los desarrolladores iniciar, destruir y volver a crear rápidamente la base de datos de una aplicación. Estas utilidades permiten minimizar los problemas de inconsistencia que pueden surgir en la base de datos cuando varios desarrolladores trabajan en la misma aplicación: los nuevos colaboradores solo deben ejecutar un par de comandos artisan para configurar la base de datos en una nueva instalación.

      A lo largo de esta guía, crearemos migraciones y alimentadores para completar una base de datos de aplicación de demostración de Laravel con datos de ejemplo. Al final, podrá destruir y volver a crear las tablas de su base de datos cuantas veces lo desee, usando solo comandos artisan.

      Requisitos previos

      Para completar los pasos de esta guía, necesitará lo siguiente:

      Nota: En esta guía, para ejecutar la aplicación usaremos un entorno de desarrollo en contenedor administrado por Docker Compose, pero también puede optar por ejecutar la aplicación en un servidor LEMP. Para configurarlo, puede seguir nuestra guía Cómo instalar y configurar Laravel con LEMP en Ubuntu 18.04.

      Paso 1: Obtener la aplicación de demostración

      Para comenzar, obtendremos la aplicación Laravel de demostración de su repositorio de GitHub. Nos interesa la ramificación tutorial-02, en la que se incluye una configuración de Docker Compose para ejecutar la aplicación en contenedores. En este ejemplo, descargaremos la aplicación en nuestra carpeta de inicio, pero puede usar cualquier directorio que elija:

      • cd ~
      • curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-2.0.1.zip -o travellist.zip

      Debido a que descargamos el código de la aplicación como un archivo .zip, necesitaremos el comando unzip para desempaquetarlo. Si no lo hizo recientemente, actualice el índice local de paquetes de su computadora:

      A continuación instale el paquete unzip:

      Después de eso, descomprima el contenido de la aplicación:

      Luego para facilitar el acceso cambie el nombre del directorio desempaquetado por travellist-demo:

      • mv travellist-laravel-demo-tutorial-2.0.1 travellist-demo

      En el siguiente paso, crearemos un archivo de configuración .env para configurar la aplicación.

      Paso 2: Configurar el archivo .env de la aplicación

      En Laravel, se utiliza un archivo .env para establecer configuraciones dependientes del entorno, como las credenciales y cualquier información que pueda variar entre las implementaciones. Este archivo no está incluido en el control de revisiones.

      Advertencia: En el archivo de configuración del entorno se encuentra información confidencial sobre su servidor, incluidas las credenciales de bases de datos y las claves de seguridad. Por ese motivo, nunca debe compartir públicamente este archivo.

      Los valores incluidos en el archivo .env tendrán prioridad sobre los valores establecidos en los archivos de configuración normales que se encuentran en el directorio config. Para cada instalación en un nuevo entorno se requiere un archivo de entorno personalizado a fin de definir elementos como las configuraciones de conexión de bases de datos, las opciones de depuración y las URL de aplicación, entre otros elementos que pueden variar dependiendo del entorno en el que se ejecute la aplicación.

      Diríjase al directorio travellist-demo:

      Ahora, crearemos un nuevo archivo .env para personalizar las opciones de configuración para el entorno de desarrollo que configuraremos. En Laravel se incluye un archivo .env de ejemplo que podemos copiar para crear el nuestro:

      Abra este archivo utilzando nano o el editor de texto que prefiera:

      Así es como se ve su archivo .env ahora:

      .env

      APP_NAME=Travellist
      APP_ENV=dev
      APP_KEY=
      APP_DEBUG=true
      APP_URL=http://localhost:8000
      
      LOG_CHANNEL=stack
      
      DB_CONNECTION=mysql
      DB_HOST=db
      DB_PORT=3306
      DB_DATABASE=travellist
      DB_USERNAME=travellist_user
      DB_PASSWORD=password

      En el archivo .env actual de la aplicación de demostración travellist se incluyen las configuraciones para usar el entorno en contenedor que creamos con Docker Compose en la última parte de esta serie. No necesita cambiar ninguno de estos valores, pero puede modificar DB_DATABASE, DB_USERNAME y DB_PASSWORD si lo desea, ya que nuestro archivo docker-compose.yml los obtiene automáticamente para configurar la base de datos de desarrollo. Solo asegúrese de que la variable DB_HOST permanezca sin cambios, ya que esta hace referencia al nombre de nuestro servicio de base de datos dentro del entorno de Docker Compose.

      Si realiza algún cambio en el archivo, asegúrese de guardarlo y cerrarlo presionando CTRL + X, Y y luego INTRO.

      Nota: Si optó por ejecutar la aplicación en un servidor LEMP, deberá cambiar los valores resaltados para reflejar la configuración de su propia base de datos, incluida la variable DB_HOST.

      Paso 3: Instalar las dependencias de la aplicación con Composer

      Ahora usaremos Composer, la herramienta de administración de dependencias de PHP, para instalar las dependencias de la aplicación y garantizar que podamos ejecutar comandos artisan.

      Abra su entorno de Docker Compose con el comando siguiente. Con esto, se creará la imagen travellist para el servicio app y se extraerán las imágenes adicionales de Docker requeridas por los servicios de nginx y db a fin de crear el entorno de la aplicación:

      Output

      Creating network "travellist-demo_travellist" with driver "bridge" Building app Step 1/11 : FROM php:7.4-fpm ---> fa37bd6db22a Step 2/11 : ARG user ---> Running in 9259bb2ac034 … Creating travellist-app ... done Creating travellist-nginx ... done Creating travellist-db ... done

      Esta operación puede tardar unos minutos en completarse. Una vez terminado el proceso, podemos ejecutar Composer para instalar las dependencias de la aplicación.

      Para ejecutar composer y otros comandos en el contenedor de servicio app, usaremos docker-compose exec. El comando exec nos permite ejecutar cualquier comando que elijamos en los contenedores gestionados por Docker Compose. Se utiliza la siguiente sintaxis: docker-compose exec service_name command.

      Nota: En caso de optar por utilizar un servidor LEMP para ejecutar la aplicación de demostración, debe ignorar la parte de docker-compose exec app de los comandos enumerados a lo largo de esta guía. Por ejemplo, en lugar de ejecutar el siguiente comando como está escrito, simplemente ejecutaría lo siguiente:

      Para ejecutar composer install en el contenedor app, ejecute lo siguiente:

      • docker-compose exec app composer install

      Output

      Loading composer repositories with package information Installing dependencies (including require-dev) from lock file Package operations: 85 installs, 0 updates, 0 removals - Installing doctrine/inflector (1.3.1): Downloading (100%) - Installing doctrine/lexer (1.2.0): Downloading (100%) - Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%) …

      Cuando Composer termine de instalar las dependencias de la aplicación, podrá ejecutar los comandos artisan. Para verificar que en la aplicación se pueda establecer conexión con la base de datos, ejecute el siguiente comando en el que se eliminará cualquier tabla existente:

      • docker-compose exec app php artisan db:wipe

      Con este comando se eliminará cualquier tabla ya existente de la base de datos configurada. Si se ejecutó con éxito y en la aplicación se pudo establecer conexión con la base de datos, verá un resultado como el siguiente:

      Output

      Dropped all tables successfully.

      Ahora que instaló las dependencias de la aplicación con Composer, puede usar la herramienta artisan para crear migraciones y alimentadores.

      Paso 4: Crear migraciones de bases de datos

      En la herramienta de línea de comandos artisan que se incluye con Laravel hay una serie de comandos auxiliares que pueden utilizarse para administrar la aplicación e iniciar nuevas clases. Para generar una nueva clase de migración, podemos usar el comando make:migration de la siguiente manera:

      • docker-compose exec app php artisan make:migration create_places_table

      Laravel infiere la operación que se ejecutará (create), el nombre de la tabla (places) y si en esta migración se creará una tabla nueva o no, basada en el nombre descriptivo proporcionado al comando make:migration.

      Verá un resultado similar a este:

      Output

      Created Migration: 2020_02_03_143622_create_places_table

      Con esto se generará un nuevo archivo en el directorio database/migrations de la aplicación. Laravel utiliza la marca de tiempo incluida en el archivo generado automáticamente para determinar el orden en que se deben ejecutar las migraciones.

      Utilice su editor de texto preferido para abrir el archivo de migración generado. Recuerde sustituir el valor resaltado por el nombre de su propio archivo de migración:

      • nano database/migrations/2020_02_03_143622_create_places_table.php

      En el archivo de migración generado se incluye una clase llamada CreatePlacesTable:

      database/migrations/2020_02_03_143622_create_places_table.php

      <?php
      
      use IlluminateDatabaseMigrationsMigration;
      use IlluminateDatabaseSchemaBlueprint;
      use IlluminateSupportFacadesSchema;
      
      class CreatePlacesTable extends Migration
      {
          /**
           * Run the migrations.
           *
           * @return void
           */
          public function up()
          {
              Schema::create('places', function (Blueprint $table) {
                  $table->bigIncrements('id');
                  $table->timestamps();
              });
          }
      
          /**
           * Reverse the migrations.
           *
           * @return void
           */
          public function down()
          {
              Schema::dropIfExists('places');
          }
      }
      
      

      En esta clase se incluyen dos métodos: up y down. Ambos métodos contienen código de arranque que puede ampliar para personalizar lo que ocurre cuando se ejecuta esa migración y también lo que sucede cuando se revierte.

      Modificaremos el método up para que en la tabla places se refleje la estructura que ya estamos usando en la versión actual de la aplicación:

      • id: campo de clave primaria.
      • name: nombre del lugar.
      • visited: indica si este lugar ya recibió visitas o no.

      En el constructor de esquemas de Laravel se exponen los métodos para crear, actualizar y eliminar tablas de una base de datos. En la clase Blueprint se define la estructura de la tabla y se proporcionan varios métodos para abstraer la definición de cada campo de la tabla.

      En el código generado automáticamente se establece un campo de id primario llamado id. En el método timestamps se crean dos campos datetime que las clases de base de datos subyacentes actualizan de manera automática cuando se insertan o actualizan datos dentro de la tabla. Además de estas, tendremos que incluir un campo name y otro visited.

      Nuestro campo name será del tipo string y nuestro campo visited estará configurado con el tipo boolean. También estableceremos un valor predeterminado 0 para el campo visited, de modo que si no se transmite ningún valor, significa que aún no se visitó el lugar. El método up tendrá ahora el siguiente aspecto:

      database/migrations/2020_02_03_143622_create_places_table.php

      …
          public function up()
          {
              Schema::create('places', function (Blueprint $table) {
                  $table->bigIncrements('id');
                  $table->string('name', 100);
                  $table->boolean('visited')->default(0);
                  $table->timestamps();
              });
          }
      …
      

      Nota: Puede encontrar la lista completa de tipos de columnas disponibles en la documentación de Laravel.

      Después de incluir las dos líneas resaltadas en su propia secuencia de comandos de migración, guarde y cierre el archivo.

      Su migración estará lista para ejecutarse a través de artisan migrate. Sin embargo, eso solo crearía una tabla vacía; también debemos poder insertar datos de ejemplo para desarrollo y pruebas. En el siguiente paso, veremos cómo hacerlo usando alimentadores de bases de datos.

      Paso 5: Crear alimentadores de bases de datos

      Un alimentador es una clase especial que se utiliza para generar e insertar datos de ejemplo (semillas) en una base de datos. Esta es una característica importante en los entornos de desarrollo, ya que le permite volver a crear la aplicación con una base de datos nueva usando valores de ejemplo que de otra manera tendría que insertar manualmente al volver a crear la base de datos.

      Ahora, usaremos el comando artisan a fin de generar una nueva clase de alimentador para nuestra tabla places llamada PlacesTableSeeder:

      • docker-compose exec app php artisan make:seeder PlacesTableSeeder

      Con el comando se creará un nuevo archivo llamado PlacesTableSeeder.php dentro del directorio database/seeds. Abra el archivo usando su editor de texto preferido:

      • nano database/seeds/PlacesTableSeeder.php

      El archivo PlacesTableSeeder.php generado automáticamente tiene el siguiente aspecto:

      database/seeds/PlacesTableSeeder.php

      <?php
      
      use IlluminateDatabaseSeeder;
      
      class PlacesTableSeeder extends Seeder
      {
          /**
           * Run the database seeds.
           *
           * @return void
           */
          public function run()
          {
              //
          }
      }
      
      

      Nuestra nueva clase de alimentador contiene un método vacío llamado run. Este método se invocará cuando se ejecute el comando db:seed de Artisan.

      Debemos editar el método run para que se incluyan las instrucciones de inserción de datos de ejemplo en la base de datos. Usaremos el generador de consultas de Laravel para simplificar este proceso.

      El generador de consultas de Laravel ofrece una interfaz fluida para operaciones de bases de datos como la inseción, actualización, eliminación y recuperación de datos. También cuenta con elementos de protección contra ataques de inyección SQL. Está expuesto por la fachada DB, un proxy estático para las clases de base de datos subyacentes en el contenedor de servicio.

      Para comenzar, crearemos una variable de clase estática para contener todos los lugares de ejemplo que queramos insertar en la base de datos como matriz. Esto nos permitirá usar un bucle foreach para iterar todos los valores, insertando cada uno en la base de datos con el generador de consultas.

      Daremos a esta variable el nombre $places:

      database/seeds/PlacesTableSeeder.php

      <?php
      
      use IlluminateDatabaseSeeder;
      
      class PlacesTableSeeder extends Seeder
      {
          static $places = [
              'Berlin',
              'Budapest',
              'Cincinnati',
              'Denver',
              'Helsinki',
              'Lisbon',
              'Moscow',
              'Nairobi',
              'Oslo',
              'Rio',
              'Tokyo'
          ];

      A continuación, tendremos que incluir una instrucción use en la parte superior de nuestra clase PlacesTableSeeder para facilitar la referencia a la fachada DB en el código:

      database/seeds/PlacesTableSeeder.php

      <?php
      
      use IlluminateDatabaseSeeder;
      use IlluminateSupportFacadesDB;
      
      class PlacesTableSeeder extends Seeder
      …
      

      Ahora, podemos iterar los valores de la matriz $places usando un bucle foreach e insertar cada uno en nuestra tabla places con el generador de consultas:

      database/seeds/PlacesTableSeeder.php

      …
          public function run()
          {
              foreach (self::$places as $place) {
                  DB::table('places')->insert([
                      'name' => $place,
                      'visited' => rand(0,1) == 1
                  ]);
              }
          }
      
      

      El bucle foreach itera cada valor de la matriz estática $places. En cada iteración, usamos la fachada DB para insertar una nueva fila en la tabla places. Para el campo name, fijamos el nombre del lugar que acabamos de obtener de la matriz $places y para el campo visited marcamos un valor aleatorio de 0 o 1.

      Así es como se visualizará la clase PlacesTableSeeder completa después de todas las actualizaciones:

      database/seeds/PlacesTableSeeder.php

      <?php
      
      use IlluminateDatabaseSeeder;
      use IlluminateSupportFacadesDB;
      
      class PlacesTableSeeder extends Seeder
      {
          static $places = [
              'Berlin',
              'Budapest',
              'Cincinnati',
              'Denver',
              'Helsinki',
              'Lisbon',
              'Moscow',
              'Nairobi',
              'Oslo',
              'Rio',
              'Tokyo'
          ];
      
          /**
           * Run the database seeds.
           *
           * @return void
           */
          public function run()
          {
              foreach (self::$places as $place) {
                  DB::table('places')->insert([
                      'name' => $place,
                      'visited' => rand(0,1) == 1
                  ]);
              }
          }
      }
      

      Guarde y cierre el archivo cuando termine de realizar estos cambios.

      Las clases de alimentadores no se cargan automáticamente en la aplicación. Debemos editar la clase principal DatabaseSeeder para incluir una invocación al alimentador que acabamos de crear.

      Abra el archivo database/seeds/DatabaseSeeder.php con nano o su editor favorito:

      • nano database/seeds/DatabaseSeeder.php

      La clase DatabaseSeeder se parece a cualquier otro sembrador: deriva de la clase Seeder y tiene un método run. Actualizaremos este método para incluir una invocación a PlacesTableSeeder.

      Actualice el método actual run dentro de su clase DatabaseSeeder eliminando la línea marcada con comentarios y reemplazándola por el siguiente código resaltado:

      database/seeds/DatabaseSeeder.php

      …
          public function run()
          {
              $this->call(PlacesTableSeeder::class);
          }
      ...
      

      Después de la actualización, la clase DatabaseSeeder completa tendrá el siguiente aspecto:

      database/seeds/DatabaseSeeder.php

      <?php
      
      use IlluminateDatabaseSeeder;
      
      class DatabaseSeeder extends Seeder
      {
          /**
           * Seed the application's database.
           *
           * @return void
           */
          public function run()
          {
              $this->call(PlacesTableSeeder::class);
          }
      }
      
      
      

      Guarde y cierre el archivo cuando termine de actualizar su contenido.

      Con esto, terminamos de preparar una migración y un alimentador para nuestra tabla places. En el siguiente paso, veremos la manera de ejecutarlos.

      Paso 6: Ejecutar migraciones y alimentadores de bases de datos

      Antes de continuar, debemos asegurarnos de que su aplicación esté lista y en funcionamiento. Configuraremos la clave de cifrado de la aplicación y luego accederemos a esta última desde un navegador para probar el servidor web.

      Para generar la clave de cifrado requerida por Laravel, puede usar el comando artisan key:generate:

      • docker-compose exec app php artisan key:generate

      Una vez generada la clave, podrá acceder a la aplicación orientando su navegador al nombre de host o a la dirección IP de su servidor en el puerto 8000:

      http://server_host_or_ip:8000
      

      Verá una página como la siguiente:

      Error de MySQL

      Esto significa que en la aplicación se puede establecer conexión con la base de datos, pero no se logró encontrar una tabla llamada places. Ahora crearemos la tabla places usando el siguiente comando migrate de Artisan:

      • docker-compose exec app php artisan migrate

      Verá un resultado similar a este:

      Output

      Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.06 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (0.06 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.03 seconds) Migrating: 2020_02_10_144134_create_places_table Migrated: 2020_02_10_144134_create_places_table (0.03 seconds)

      Observará que se ejecutaron algunas otras migraciones junto con la migración create_places_table que configuramos. Estas migraciones se generan de forma automática cuando se instala Laravel. Aunque ahora no usaremos estas tablas adicionales, serán necesarias en el futuro cuando ampliemos la aplicación para tener usuarios registrados y tareas programadas. Por ahora, puede dejarlas como están.

      En este momento, nuestra tabla sigue vacía. Debemos ejecutar el comando db:seed para propagar la base de datos con nuestros lugares de ejemplo:

      • docker-compose exec app php artisan db:seed

      Con esto, se ejecutará nuestro alimentador y se insertarán los valores de ejemplo que definimos en nuestra clase PlacesTableSeeder. Verá un resultado similar a este:

      Output

      Seeding: PlacesTableSeeder Seeded: PlacesTableSeeder (0.06 seconds) Database seeding completed successfully.

      Ahora, vuelva a cargar la página de la aplicación en su navegador. Verá una página similar a la siguiente:

      Aplicación de demostración de Laravel

      Cuando necesite comenzar desde cero, podrá descartar todas sus tablas de la base de datos con lo siguiente:

      • docker-compose exec app php artisan db:wipe

      Output

      Dropped all tables successfully.

      Para ejecutar las migraciones de la aplicación y propagar las tablas con un solo comando, puede usar lo siguiente:

      • docker-compose exec app php artisan migrate --seed

      Output

      Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.06 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (0.07 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.03 seconds) Migrating: 2020_02_10_144134_create_places_table Migrated: 2020_02_10_144134_create_places_table (0.03 seconds) Seeding: PlacesTableSeeder Seeded: PlacesTableSeeder (0.06 seconds) Database seeding completed successfully.

      Si quiere revertir una migración, puede ejecutar lo siguiente:

      • docker-compose exec app php artisan migrate:rollback

      Con esto, se activará el método down para cada clase de migración dentro de la carpeta migrations. Normalmente, se eliminarán todas las tablas que se crearon a través de las clases de migración y se dejarán solo las tablas que se puedan haber creado de forma manual. Verá resultados como este:

      Output

      Rolling back: 2020_02_10_144134_create_places_table Rolled back: 2020_02_10_144134_create_places_table (0.02 seconds) Rolling back: 2019_08_19_000000_create_failed_jobs_table Rolled back: 2019_08_19_000000_create_failed_jobs_table (0.02 seconds) Rolling back: 2014_10_12_100000_create_password_resets_table Rolled back: 2014_10_12_100000_create_password_resets_table (0.02 seconds) Rolling back: 2014_10_12_000000_create_users_table Rolled back: 2014_10_12_000000_create_users_table (0.02 seconds)

      El comando rollback es especialmente útil cuando se realizan cambios en los modelos de la aplicación y no se puede usar un comando db:wipe; por ejemplo, si varios sistemas dependen de la misma base de datos.

      Conclusión

      En esta guía, abordamos la forma de usar migraciones y alimentadores de bases de datos para facilitar la creación de bases de datos de desarrollo y la prueba de estas para una aplicación de Laravel 6.

      Como paso siguiente, podría intereserle consultar la documentación de Laravel para obtener más información sobre cómo usar el generador de consultas y modelos de Eloquent para abstraer aún más el esquema de la base de datos de su aplicación.



      Source link