bookmark_borderInstalar servidor NGINX en Ubuntu Server 22.04

Instala desde el repositorio de Ubuntu

  • Instala desde el repositorio de Ubuntu
sudo apt update
sudo apt install nginx
  • Actualiza el firewall
sudo ufw app list
sudo ufw allow 'Nginx FULL'
sudo ufw status
  • Verifica que se haya instalado el servidor correctamente
sudo systemctl status nginx
http://mi_servidor
  • Actualiza los server blocks
sudo mkdir -p /var/www/mi_nuevo_dominio/html
sudo chown -R $USER:$USER /var/www/mi_nuevo_dominio/html
sudo chmod -R 755 /var/www/mi_nuevo_dominio
sudo nano /var/www/mi_nuevo_dominio/html/index.html
sudo nano /etc/nginx/sites-available/mi_nuevo_dominio

Crea el index.html con la siguiente plantilla que despues deberás cambiar

<html>
    <head>
        <title>Bienvenido a mi_nuevo_dominio!</title>
    </head>
    <body>
        <h1>Perfect!  El server block de mi_nuevo_dominio esta trabajando!</h1>
    </body>
</html>

Crea el archivo de configuración para tu nuevo dominio con la siguiente plantilla, esta la uso para aplicación SPA (Angular, React) ya que todo el redireccionamiento se hace del lado de cliente.

server {
        listen 80;
        listen [::]:80;

        root /var/www/mi_nuevo_dominio/html;
        index index.html index.htm index.nginx-debian.html;

        server_name mi_nuevo_dominio www.mi_nuevo_dominio;

        location / {
            index index.html;
            try_files $uri $uri/ /index.html =404;
        }
}
  • Familiarizate con los archivos y directorios mas importantes de NGINX
    • Contenido. Los sitios se almacenan en /var/www/, cada sitio se almacena en un directorio diferente y el sitio por default se almacena en /var/www/html
    • Configuración.
      • /etc/nginx: Directorio de configuración del servidor Nginx. Todos los archivos de configuración de Nginx se encuentran aqui.
      • /etc/nginx/nginx.conf: The main Nginx configuration file. This can be modified to make changes to the Nginx global configuration.
      • /etc/nginx/sites-available/: The directory where per-site server blocks can be stored. Nginx will not use the configuration files found in this directory unless they are linked to the sites-enabled directory. Typically, all server block configuration is done in this directory, and then enabled by linking to the other directory.
      • /etc/nginx/sites-enabled/: The directory where enabled per-site server blocks are stored. Typically, these are created by linking to configuration files found in the sites-available directory.
      • /etc/nginx/snippets: This directory contains configuration fragments that can be included elsewhere in the Nginx configuration. Potentially repeatable configuration segments are good candidates for refactoring into snippets.
    • Logs
      • /var/log/nginx/access.log: Every request to your web server is recorded in this log file unless Nginx is configured to do otherwise.
      • /var/log/nginx/error.log: Any Nginx errors will be recorded in this log.

Fuente: https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-20-04

bookmark_borderConfigurar un pipeline Jenkins para una aplicación Angular

Vamos a configurar un pipeline de Jenkins para desplegar una aplicación Angular en un contenedor Docker. Como casi siempre vamos a utilizar versiones LTS (Long Term Service). En el momento de escribir este articulo las versiones LTS que tenemos son las siguientes:

En que lo vamos a utilizar

  • Ubuntu server 22.04 LTS.
  • Jenkins Server 2 LTS
  • OpenJDK 17
  • Node 18 LTS
  • Angular 15
  • Docker 20.10

    Instalación Angular en el servidor

    Lo primero que vamos a hacer es instalar node en el servidor de Jenkins

    • Agrega la llave de Nodejs, y ejecuta el instalador de paquetes apt. Siempre consulta la llave correcta tomada de la pagina oficial de node.
    $ curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - &&\
    sudo apt-get install -y nodejs
    • Verifica que se haya instalado correctamente node
    $ node -v
    v18.16.0
    • Ahora instalamos Angular 15, y verificamos su instalación. (si no le pones la versión instalas la ultima versión que tenga en el npm)
    $ sudo npm install -g @angular/cli@15.2.8
    ...
    $ ng version
         _                      _                 ____ _     ___
        / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
       / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
      / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
     /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                    |___/
        
    Angular CLI: 15.2.8
    Node: 18.16.0
    Package Manager: npm 9.6.6
    OS: linux x64
    
    Angular: 16.0.1
    ... animations, common, compiler, compiler-cli, core, forms
    ... platform-browser, platform-browser-dynamic, router
    
    Package                         Version
    ---------------------------------------------------------
    @angular-devkit/architect       0.1600.1
    @angular-devkit/build-angular   16.0.1
    @angular-devkit/core            16.0.1
    @angular-devkit/schematics      15.2.8 (cli-only)
    @schematics/angular             15.2.8 (cli-only)
    rxjs                            7.8.1
    typescript                      5.0.4
    
    • Para este articulo vamos crear una app de prueba, y la vamos a subir a un repositorio para que de alli lo tome Jenkins.
    $ ng new angular-app-jenkins
    ...
    Successfully initialized git.
    
    $ cd angular-app-jenkins
    $ git init 
    $ git add .
    $ git commit -am "Version inicial"
    $ git remote add origin https://gitlab.com/luidasa/angular-app-jenkins
    • Creamos el archivo Dockerfile en el proyecto de Angular, para tener las instrucciones de empaquetamiento.
    ### STAGE 1:BUILD ###
    # Defining a node image to be used as giving it an alias of "build"
    # Which version of Node image to use depends on project dependencies 
    # This is needed to build and compile our code 
    # while generating the docker image
    FROM node:18.16-alpine AS build
    # Create a Virtual directory inside the docker image
    WORKDIR /dist/src/app
    # Copy files to virtual directory
    # COPY package.json package-lock.json ./
    # Run command in Virtual directory
    # Install npm 9.6.6 que es al momento de escribir este articulo la versión mas reciente.
    RUN npm install -g npm@9.6.6
    RUN npm cache clean --force
    # Copy files from local machine to virtual directory in docker image
    COPY . .
    RUN npm install
    RUN npm run build --omit=dev
    
    
    ### STAGE 2:RUN ###
    # Defining nginx image to be used
    FROM nginx:latest AS ngi
    # Copying compiled code and nginx config to different folder
    # NOTE: This path may change according to your project's output folder 
    COPY --from=build /dist/src/app/dist/domain-app-name /usr/share/nginx/html
    COPY ./nginx.conf /etc/nginx/conf.d/default.conf
    # Exposing a port, here it means that inside the container 
    # the app will be using Port 80 while running
    EXPOSE 80
    • Creamos el archivo Jenkinsfile en el proyecto de Angular
    /* Requires the Docker Pipeline plugin */
    pipeline {
        agent any
        environment {
          VERSION = '1.0'
        }    
        stages {
          stage('build') {
            steps {
              git url: 'https://gitlab.com/luidasa/angular-app-jenkins.git', branch: 'master', credentialsId: 'gitlab-luidasa'
              sh '/usr/bin/ng build --prod'
            }
          }
          stage('build image') {
            steps {
              sh 'docker build -t luidasa/angular-app-jenkins:${VERSION}.${BUILD_NUMBER} .'
            }
          }
          stage('push image to hub') {
            steps {
              withDockerRegistry([credentialsId: "dockerhub", url: ""]) {
                sh 'docker push luidasa/angular-app-jenkins:${VERSION}.${BUILD_NUMBER}'
              }
            }
          }
        }
    }
    • Por ultimo, configuramos jenkins

    bookmark_borderCambiar el nombre del server Ubuntu 22.04 lts

    Para cambiar el nombre del servidor en ubuntu 22.04 lts, se requiere realizar los siguientes pasos.

    Con hostnamectl

    Esta es una utilidad que casi siempre esta presente, sino instalala.

    • Verifica el nombre del servidor
    $ sudo hostnamectl
    • Cambia el nombre de forma permanente. Requiere que seas sudo
    $ sudo hostnamectl set-hostname pruebas.midominio.com

    Cambiando con comando hostname y archivos de configuración

    • Para cambiarlo de forma temporal y vuelve a su nombre cuando se cierra la sesión.
    $ hostname
    $ hostname pruebas.midominio.com
    • Para cambiarlo de forma permanente, requiere que tengas permisos de sudo. Edita el archivo hostname.
    $ sudo vi /etc/hostname
    
    ***
    pruebas.midominio.com
    
    • Modifica el archivo hosts
    $ sudo vi /etc/hosts
    
    ***
    
    127.0.0.1       localhost
    127.0.0.1       pruebas.midominio.com
    
    • Por ultimo, si es estas en un ambiente virtualizado es posible que tengas el archivo de configuración de la nube. Cambia la bandera para preservar el nombre en la maquina virtual
    $ sudo vi /etc/cloud/cloud.cfg
    
    ***
    
    .....
    
    preserve_hostname: true
    
    .....
    
    • Por ultimo reinicia el servidor, y vuelve a conectarte para validar los cambios.
    $ sudo reboot
    $ ssh pruebas.midominio.com
    usuario@pruebas: ~$ 

    bookmark_borderInstalar Jenkins 2 LTS en ubuntu 22.04 LTS

    Vamos a instalar Jenkins 2 LTS para producción. Nota siempre ocupamos para producción las versiones LTS (Long Term Service) para los ambientes de producción.

    En una consola de ingresa los siguientes comandos

    • Instalación de Java JDK 17 LTS
    sudo apt update
    sudo apt install openjdk-17-jdk
    java -version
    javac -version
    sudo update-alternatives --config java
    • Instala Maven, en el Filesystem recomendado.
    curl https://dlcdn.apache.org/maven/maven-3/3.9.0/binaries/apache-maven-3.9.0-bin.tar.gz --output apache-maven-3.9.0-bin.tar.gz
    tar xzvf apache-maven-3.9.0-bin.tar.gz
    sudo chown root:root -R /usr/bin/apache-maven-3.9.0
    
    • Instala GIT
    sudo apt update
    sudo apt install git
    • Instala Jenkins

    Descarga la llave para mantener la versión actualizada.

    $ curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
        /usr/share/keyrings/jenkins-keyring.asc > /dev/null
    $ echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
        https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
        /etc/apt/sources.list.d/jenkins.list > /dev/null
    $ sudo apt install jenkins
    • Instala CertBot

    • Configura Jenkins con CertBot

    bookmark_borderInstalar jdk 17 LTS en ubuntu server 22.04 LTS

    Descripción

    En una consola escribe la sentencia, para actualizar, buscar y en su caso instalar el openjdk desde el repository default de Ubuntu

    sudo apt update
    sudo apt search openjdk-17-jdk
    sudo apt install openjdk-17-jdk

    Verifica que se haya instalado la versión con el siguiente comando

    java -version
    javac -version

    Si tienes varias versiones de java configura la que se va a ocupar por default

    sudo update-alternatives --config java

    bookmark_borderRenovar el certificado de keycloak

    Habia instalado keycloak con una imagen de docker y le puse un certificado hecho con certbot. El problema que ahora veo es que los certificados de cerbot solo tienen una vigencia de 3 meses, por lo tanto, unos dias antes de que expire hay que renovar el certificado y volver a pasarlo al contenedor de keycloak.

    Bueno en este articulo voy a describir los pasos que realice para renovar y automatizar la renovación de los certificados de certbot.

    Versiones

    Esto utilizando las siguientes versiones.

    • Ubuntu server 22.04
    • Docker version 20.10.8, build 3967b7d
    • certbot 1.32.2
    • KEYCLOAK_VERSION=15.0.0

    Procedimiento

    • Crea un nuevo certificado con certbot
    $ sudo certbot certonly --manual -d keycloak.yourdomain.com
    [sudo] contraseña para username: 
    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    Certificate not yet due for renewal
    
    You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
    (ref: /etc/letsencrypt/renewal/keycloak.yourdomain.com.conf)
    
    What would you like to do?
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    1: Keep the existing certificate for now
    2: Renew & replace the certificate (may be subject to CA rate limits)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
    Renewing an existing certificate for keycloak.yourdomain.com
    
    Successfully received certificate.
    Certificate is saved at: /etc/letsencrypt/live/keycloak.yourdomain.com/fullchain.pem
    Key is saved at:         /etc/letsencrypt/live/keycloak.yourdomain.com/privkey.pem
    This certificate expires on 2023-04-12.
    These files will be updated when the certificate renews.
    
    NEXT STEPS:
    - This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate's expiry date.
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
    If you like Certbot, please consider supporting our work by:
     * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
     * Donating to EFF:                    https://eff.org/donate-le
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    • Deten el contenedor de keycloak
    $ docker stop keycloak
    keycloak
    • Borra el contenedor de keycloak, asegurate de tener:
      • Configurada la base de datos fuera de tu contenedor
      • El script de creación del contenedor con la configuración de las variables de sesión.
    $ docker rm keycloak
    keycloak
    • Vuelve a crear el contenedor con el script de creación que tenias.
    docker run -it -d --name keycloak --net keycloak-network -p8080:8080 -p 8443:8443 -v /etc/letsencrypt/live/keycloak.yourdomain.com/fullchain.pem:/etc/x509/https/tls.crt -v /etc/letsencrypt/live/keycloak.yourdomain.com/privkey.pem:/etc/x509/https/tls.key -e KEYCLOAK_USER=administrador -e KEYCLOAK_PASSWORD=yourkeycloakpassword -e DB_VENDOR=mariadb -e DB_DATABASE=keycloak -e DB_USER=keycloak -e DB_PASSWORD=your-db-password jboss/keycloak
    • Asegurate de que la llave privada y la llave publica, el agente de docker tenga permisos para su ejecución.

    bookmark_borderComo instalar mariadb 10.05 en Ubuntu 20.04 para producción

    Con este procedimiento vamos a instalar una versión anterior de MariaDB server en Ubuntu 20.04, ya que en los sistemas legados es posible que se requieran versiones especificas, ya sea por las caracteristicas o que no hayan sido testeadas con las versiones nuevas.

    Prerequisitos

    • Servidor Ubuntu Server 20.04 LTS
    • El servidor de producción ya esta protegido siguiendo el procedimiento descrito en el articulo.

    Procedimiento

    • Agrega el repositorio de MariaDB en la lista de origenes autorizados, en el archivo /etc/apt/sources.list.d, e impora la llave publica PGP para verificar la descarga de los paquetes
    • Actualiza la información de tu sistema de paquetes
    $ sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
    $ sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10./ubuntu focal main'
    $ sudo apt update
    • Ejecuta la instalación con el servidor de paquetes del ubuntu, y comprueba la versión instalada
    $ sudo apt install mariadb-server
    $ mysql --version
    • Ejecuta la secuencia de comandos de seguridad. Revisa y confirma las opciones de seguridad dependiendo de tu caso.
    $ sudo mysql_secure_installation
    NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
          SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
    
    In order to log into MariaDB to secure it, we'll need the current
    password for the root user. If you've just installed MariaDB, and
    haven't set the root password yet, you should just press enter here.
    
    Enter current password for root (enter for none): 
    OK, successfully used password, moving on...
    
    Setting the root password or using the unix_socket ensures that nobody
    can log into the MariaDB root user without the proper authorisation.
    
    You already have your root account protected, so you can safely answer 'n'.
    
    Switch to unix_socket authentication [Y/n] Y
    Enabled successfully!
    Reloading privilege tables..
     ... Success!
    
    
    You already have your root account protected, so you can safely answer 'n'.
    
    Change the root password? [Y/n] Y
    New password: 
    Re-enter new password: 
    Password updated successfully!
    Reloading privilege tables..
     ... Success!
    
    
    By default, a MariaDB installation has an anonymous user, allowing anyone
    to log into MariaDB without having to have a user account created for
    them.  This is intended only for testing, and to make the installation
    go a bit smoother.  You should remove them before moving into a
    production environment.
    
    Remove anonymous users? [Y/n] Y
     ... Success!
    
    Normally, root should only be allowed to connect from 'localhost'.  This
    ensures that someone cannot guess at the root password from the network.
    
    Disallow root login remotely? [Y/n] Y
     ... Success!
    
    By default, MariaDB comes with a database named 'test' that anyone can
    access.  This is also intended only for testing, and should be removed
    before moving into a production environment.
    
    Remove test database and access to it? [Y/n] Y
     - Dropping test database...
     ... Success!
     - Removing privileges on test database...
     ... Success!
    
    Reloading the privilege tables will ensure that all changes made so far
    will take effect immediately.
    
    Reload privilege tables now? [Y/n] Y
     ... Success!
    
    Cleaning up...
    
    All done!  If you've completed all of the above steps, your MariaDB
    installation should now be secure.
    
    Thanks for using MariaDB!
    
    • Crea un usuario administrativo para conexión remota (solo si la administración es remota). Conectate al servidor con el usuario de root, y ejecuta los siguientes comandos
    $ sudo mariadb
    MariaDB [(none)]> GRANT ALL ON *.* TO 'admin'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
    MariaDB [(none)]> FLUSH PRIVILEGES;
    MariaDB [(none)]> exit
    • Por default, mariadb solo permite conexiones locales, si vas a conectarte desde un equipo diferente, debes de cambiar en el archivo de configuración /etc/mysql/my.cnf,
    $ sudo nano /etc/mysql/my.cnf
    $ more /etc/mysql/my.cnf | grep bind
    #bind-address		= 127.0.0.1
    bind-address		= 0.0.0.0
    
    • Para hacer las pruebas puedes conectarte con el usuario administrador, y crear una base de datos.
    mysql -h <ip-server> -u admin -p
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 10.4.24-MariaDB-1:10.4.24+maria~focal-log mariadb.org binary distribution
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]> create database test;
    Query OK, 1 row affected (0.075 sec)
    
    MariaDB [(none)]> show databases
        -> ;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    4 rows in set (0.073 sec)

    bookmark_borderInstala un servidor keycloak en producción con docker

    En esta entrada vamos a instalar un servidor keycloak en producción, utilizando docker, mariadb y certbot

    Los pasos que vamos a seguir son

    • Genera un certificado para producción utilizando certbot
    • Configura la red de docker y configura los contenedores.
    • Instala el reverse proxy para tu servidor.

    Genera un certificado para producción utilizando certbot

    $ sudo certbot certonly -d tu.dominio.com
    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    
    How would you like to authenticate with the ACME CA?
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    1: Nginx Web Server plugin (nginx)
    2: Spin up a temporary webserver (standalone)
    3: Place files in webroot directory (webroot)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 3
    Plugins selected: Authenticator webroot, Installer None
    Obtaining a new certificate
    Performing the following challenges:
    http-01 challenge for tu.dominio.com
    Input the webroot for tu.dominio.com: (Enter 'c' to cancel): /var/www/html
    Waiting for verification...
    Cleaning up challenges
    Subscribe to the EFF mailing list (email: pruebas@dominio.com).
    
    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at:
       /etc/letsencrypt/live/tu.dominio.com/fullchain.pem
       Your key file has been saved at:
       /etc/letsencrypt/live/tu.dominio.com/privkey.pem
       Your cert will expire on 2021-11-18. To obtain a new or tweaked
       version of this certificate in the future, simply run certbot
       again. To non-interactively renew *all* of your certificates, run
       "certbot renew"
     - If you like Certbot, please consider supporting our work by:
    
       Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
       Donating to EFF:                    https://eff.org/donate-le

    Si no quieres utilizar certbot, puedes ocupara para crear el certificado openssl, solo que como no es emitido por una entidad certificadora, seguramente lo va a detectar como aprocrifo.

    $ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/tudominio-selfsigned.key -out /etc/ssl/certs/tudominio-selfsigned.crt
       Country Name (2 letter code) [AU]:
       State or Province Name (full name) [Some-State]:
       Locality Name (eg, city) []:
       Organization Name (eg, company) [Internet Widgits Pty Ltd]:
       Organizational Unit Name (eg, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:
       Email Address []:

    Para que podamos leer la llave privada desde el servidor docker debemos de cambiarle los permisos para que se pueda leer.

    Si lo hicimios con certbot

    $ sudo chmod 644 /etc/letsencrypt/live/tu.dominio.com/privkey.pem

    Si lo hicimos con openssl

    $ sudo chmod 644 /etc/ssl/private/tudominio-selfsigned.key

    Configura la red de docker

    Esto lo vamos a ocupar para que sea vea el contenedor de keycloak y el de la base de datos.

    $ docker network create keycloak-network

    Instala una instancia de mariadb para almacenar la información

    $ docker run -d --name mariadb \
    --net keycloak-network \
    -e MYSQL_ROOT_PASSWORD=root_p@assword \
    -e MYSQL_DATABASE=keycloak \
    -e MYSQL_USER=keycloak \
    -e MYSQL_PASSWORD=p@ssword \
    mariadb

    Si ya tienes una instancia de mariadb en un contenedor docker solo debes de poner ponerla en la misma red de keycloak, con la sentencia

    $ docker network connect mariadb

    Donde mariadb es el nombre del contenedor de mariadb.

    Descarga e instala la imagen de keycloak para producción.

    $ docker run -it -d --name keycloak \
    --net keycloak-network \
    -p8080:8080 -p 8443:8443s \
    -v /etc/ssl/certs/keycloak-selfsigned.crt:/etc/x509/https/tls.crt \
    -v /etc/ssl/private/keycloak-selfsigned.key:/etc/x509/https/tls.key \
    -e KEYCLOAK_USER=administrador \
    -e KEYCLOAK_PASSWORD=p@ssword \
    -e DB_VENDOR=mariadb \
    -e DB_DATABASE=keycloak \
    -e DB_USER=keycloak \
    -e DB_PASSWORD=p@assworddb \
    jboss/keycloak

    donde

    -v se indican el certificado y la llave privada para el keycloak.

    Por último, si necesitamos reiniciar el servidor, debemos detener el contenedor, borrarlo y volverlo a construir

    $ docker stop keycloak
    $ docker rm keycloak

    bookmark_borderComandos comunes de linux

    Esta es una lista de los comando de linux que mas utilizo.

    • ssh. Este comando te permite abrir una terminal remota en el servidor que indiques utilizando las credenciales y el puerto que desees.
    ~$ ssh usuario@servidor -p puerto

    Donde

    Usuario. Nombre del usuario con el cual te vas a conectar.

    Servidor. IP o nombre del servidor con el cual te vas a conectar.

    Puerto. es el numero de puerto donde se escucha el ssh, por default es el 22 pero para producción es recomendable que el administrador lo cambie a otro puerto.

    • scp. Este es el comando realiza copias de archivos entre servidores a los cuales tengas acceso. Obviamente debo de tener credenciales en el servidor origen y en el destino, y ademas debo de tener ver el servidor al cual quiero conectarme (no estar atras de un firewall)
    ~$ scp -P 36 usuario@192.168.1.80:/home/usuario/archivo ruta_local

    Donde

    -P es el numero de puerto donde se escucha el ssh, por default es el 22 pero para producción es recomendable que el administrador lo cambie a otro puerto.

    El origen y el destino se especifica con el formato Usuario@Servidor:Archivo

    Usuario. El nombre con el cual te vas a conectar,

    servidor. Puede ser por IP o por nombre

    • curl. Obtiene los recursos de un servidor utilizando alguno de los protocolos http, https, ftp, etc. Ver mas con man curl.
    ~$ curl -o archivo url

    Donde

    archivo es el nombre del archivo en el cual se va a guardar la información obtenida desde la url

    url es la pagina o archivo que esta publicado en internet

    bookmark_borderInstalacion de Node JS 10 en Ubuntu Server 20.04

    Para este articulo vamos a instalar nodejs 10 en Ubuntu Server, aunque la fecha de termino de soporte de Node termina en mayo del 2021, lo voy a instalar debido a que la aplicación se desarrollo con esta versión y no se han hecho las pruebas para migrar a la versión mas reciente LTS. Recuerda siempre programar con versiones LTS si es que vas a implementarlo en produccion.

    Procedimiento

    • Actualiza el gestor de paquetes
    $ sudo apt update
    • Verifica que tengas instalado curl
    $ sudo apt install curl
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    curl is already the newest version (7.68.0-1ubuntu2.5).
    0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
    • Descarga el paquete desde nodesource, te va a marcar que esta desactualizado y que debes de actualizar tu aplicación.
    $ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
    
    ================================================================================
    ================================================================================
    
                                  DEPRECATION WARNING                            
    
      Node.js 10.x is no longer actively supported!
    
      You will not receive security or critical stability updates for this version.
    
      You should migrate to a supported version of Node.js as soon as possible.
      Use the installation script that corresponds to the version of Node.js you
      wish to install. e.g.
    
       * https://deb.nodesource.com/setup_12.x — Node.js 12 LTS "Erbium"
       * https://deb.nodesource.com/setup_14.x — Node.js 14 LTS "Fermium" (recommended)
       * https://deb.nodesource.com/setup_15.x — Node.js 15 "Fifteen"
       * https://deb.nodesource.com/setup_16.x — Node.js 16 "Gallium"
    
      Please see https://github.com/nodejs/Release for details about which
      version may be appropriate for you.
    
      The NodeSource Node.js distributions repository contains
      information both about supported versions of Node.js and supported Linux
      distributions. To learn more about usage, see the repository:
        https://github.com/nodesource/distributions
    
    ================================================================================
    ================================================================================
    
    • Una vez descargado el instalador, puedes instalarlo con el gestor de paquete apt.
    $ sudo apt install nodejs
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following NEW packages will be installed:
      nodejs
    0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded.
    
    • Verifica que se haya instalado correctamente
    $ node --version
    v10.24.1

    Referencias

    https://joshtronic.com/2018/05/08/how-to-install-nodejs-10-on-ubuntu-1804-lts/