<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[kode]]></title><description><![CDATA[#SoyDeveloper
Me gustar resolver problemas creando aplicaciones.]]></description><link>https://blog.karlosencalada.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 19:45:56 GMT</lastBuildDate><atom:link href="https://blog.karlosencalada.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Bases de datos modernas]]></title><description><![CDATA[La idea original era ampliar esta entrada, pero para el segundo reto del Backend de la Suerte 2023 tuve que realizar algunas cosas adicionales y al final decidí crear una nueva entrada para esta mini saga.
Ampliando la base de datos
Para cumplir el r...]]></description><link>https://blog.karlosencalada.dev/bases-de-datos-modernas</link><guid isPermaLink="true">https://blog.karlosencalada.dev/bases-de-datos-modernas</guid><category><![CDATA[APIs]]></category><category><![CDATA[GeneXus]]></category><category><![CDATA[docker images]]></category><dc:creator><![CDATA[Carlos G. Encalada B.]]></dc:creator><pubDate>Sun, 26 Mar 2023 03:53:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/lRoX0shwjUQ/upload/769b3a3acb025769f6715812052cc50f.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>La idea original era ampliar <a target="_blank" href="https://blog.karlosencalada.dev/desarrollo-x">esta entrada</a>, pero para el <a target="_blank" href="https://github.com/webreactiva-devs/backend-de-la-suerte-2023#reto-2-o%C3%ADdo-cocina">segundo reto</a> del <strong>Backend de la Suerte 2023</strong> tuve que realizar algunas cosas adicionales y al final decidí crear una nueva entrada para esta mini saga.</p>
<h3 id="heading-ampliando-la-base-de-datos">Ampliando la base de datos</h3>
<p>Para cumplir el requerimiento cree varias tablas, al igual que la primera vez, lo hice desde la web de Xata. El editor es sencillo pero suficiente para lo que necesito.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679709140573/1af8017e-d5ef-489e-90ee-cf0aa99b6ef0.png" alt="esquema de la base de datos" class="image--center mx-auto" /></p>
<p>Para manejar las <em>ordenes</em> tal cual se especifica en el README del reto, me pareció conveniente utilizar el concepto de <strong>objeto</strong> dentro de una tabla. Lo intente desde el editor web pero no me funcionó (luego encontré el por qué en la documentación*) así que opte por cargar el schema desde un .json 😵</p>
<blockquote>
<p>*While the API supports the object type, the Web UI and CLI do not expose it as an option yet. There is still work in progress.</p>
</blockquote>
<p>Lo primero fue instalar el <a target="_blank" href="https://xata.io/docs/getting-started/installation">cliente</a> de xata, seguir los pasos para autenticarlo con la cuenta y ejecutar los comandos deseados. Para no perder la definición de las tablas creadas, primero un dump, agregar la definición de la tabla ordenes y luego un upload.</p>
<pre><code class="lang-powershell">xata schema dump
xata shema upload C:\coding\xata\CocinaZombie.json
</code></pre>
<p>Acá el schema completo</p>
<pre><code class="lang-json">{

  <span class="hljs-attr">"tables"</span>: [
    {
      <span class="hljs-attr">"name"</span>: <span class="hljs-string">"comanda"</span>,
      <span class="hljs-attr">"columns"</span>: [
        {
          <span class="hljs-attr">"name"</span>: <span class="hljs-string">"FechaHora"</span>,
          <span class="hljs-attr">"type"</span>: <span class="hljs-string">"datetime"</span>,
          <span class="hljs-attr">"defaultValue"</span>: <span class="hljs-string">"2023-03-09T12:00:00Z"</span>
        }
      ]
    },
    {
      <span class="hljs-attr">"name"</span>: <span class="hljs-string">"cocina"</span>,
      <span class="hljs-attr">"columns"</span>: [
        {
          <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Limite"</span>,
          <span class="hljs-attr">"type"</span>: <span class="hljs-string">"int"</span>,
          <span class="hljs-attr">"defaultValue"</span>: <span class="hljs-string">"0"</span>
        }
      ]
    },
    {
      <span class="hljs-attr">"name"</span>: <span class="hljs-string">"menu"</span>,
      <span class="hljs-attr">"columns"</span>: [
        {
          <span class="hljs-attr">"name"</span>: <span class="hljs-string">"nombre"</span>,
          <span class="hljs-attr">"type"</span>: <span class="hljs-string">"string"</span>
        },
        {
          <span class="hljs-attr">"name"</span>: <span class="hljs-string">"detalle"</span>,
          <span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>
        },
        {
          <span class="hljs-attr">"name"</span>: <span class="hljs-string">"especial"</span>,
          <span class="hljs-attr">"type"</span>: <span class="hljs-string">"bool"</span>
        }
      ]
    },

    {
      <span class="hljs-attr">"name"</span>: <span class="hljs-string">"order"</span>,
      <span class="hljs-attr">"columns"</span>: [
        {
          <span class="hljs-attr">"name"</span>: <span class="hljs-string">"table"</span>,
          <span class="hljs-attr">"type"</span>: <span class="hljs-string">"int"</span>
        },
        {
          <span class="hljs-attr">"name"</span>: <span class="hljs-string">"createdAt"</span>,
          <span class="hljs-attr">"type"</span>: <span class="hljs-string">"datetime"</span>
        },
        {
          <span class="hljs-attr">"name"</span>: <span class="hljs-string">"dishes"</span>,
          <span class="hljs-attr">"type"</span>: <span class="hljs-string">"object"</span>,
          <span class="hljs-attr">"columns"</span>: [
            {
              <span class="hljs-attr">"name"</span>: <span class="hljs-string">"name"</span>,
              <span class="hljs-attr">"type"</span>: <span class="hljs-string">"string"</span>
            },
            {
              <span class="hljs-attr">"name"</span>: <span class="hljs-string">"quantity"</span>,
              <span class="hljs-attr">"type"</span>: <span class="hljs-string">"int"</span>
            }
          ]
        }
      ]
    }
  ]
}
</code></pre>
<p>Primera vez que trabajo con una base de datos en esta modalidad, me parece casi magia y sobre todo al leer un poco más la documentación, se me ocurren varias cosas que podría hacer con la posibilidad de crear nuevas columnas en una tabla utilizando el API REST 🤯</p>
<h3 id="heading-querys-con-apis">Querys con APIs</h3>
<p>Primero, unas pruebas con Insomnia para tener claro los endpoints y métodos. Ahí me di cuenta que definir <em>dishes</em> como objeto no me sirve, ya que solo permite un elemento. Entonces veo dos opciones:</p>
<ul>
<li><p>Utilizar un campo texto y almacenar la colección de platos en formato json</p>
</li>
<li><p>Crear una tabla subordinada</p>
</li>
</ul>
<p>En un desarrollo de los que estoy acostumbrado me iría por la segunda opción sin pensarlo, pero como la idea del reto es probar cosas nuevas me decidí por la primera.</p>
<p>Así que eliminé las dos columnas <strong>dishes.name</strong> y <strong>dishes.quantity</strong>, y las reemplacé por un campo texto <strong>dishes</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679712947091/83292954-5bc1-4ad9-9f4b-5539f52bcbda.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-un-poco-de-lowcode">Un poco de LowCode</h3>
<p>Ya con las tablas listas, hay que utilizarlas en la aplicación. Primero pensé en modificar el mismo web panel del reto 1 (<a target="_blank" href="https://cocina-zombie.karlosencalada.dev/comandas.aspx">ver acá</a>), pero al final terminé creando uno nuevo con:</p>
<ul>
<li><p>un botón para crear nueva orden</p>
</li>
<li><p>una grilla con el listado de las órdenes creadas</p>
</li>
<li><p>un popup para ver el menú y crear la orden</p>
</li>
</ul>
<p>El resultado se lo puede ver <a target="_blank" href="https://cocina-zombie.karlosencalada.dev/gestionordenes.aspx">aquí</a>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679794284134/11ddf4e0-52fc-4336-8254-2acdeb7ad66e.png" alt class="image--center mx-auto" /></p>
<p>Un detalle que descubrí al hacer el deploy, es que si se hace el push desde línea de comandos a un repositorio que no existe da error, pero si se lo hace desde Docker Desktop se crea el repositorio. <a target="_blank" href="https://hub.docker.com/r/karlos7/backend-de-la-suerte-2023">Acá</a> el repositorio con las imágenes.</p>
<p>Nota de color, el menú 'zombie' es una muestra de la gastronomía ecuatoriana 😁</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679712094592/f2985b72-71f8-4a16-b17f-63ae3c36acc2.png" alt="listado de platos típicos de la cocina ecuatoriana" class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[Desarrollo X]]></title><description><![CDATA[El título no tiene nada que ver con desarrollo de apps prohibidas o realizado con poco ropa 😁 surge a raíz de las herramientas utilizadas: GeneXus (nunca puede faltar) y Xata (un interesante descubrimiento).
Como parte del Backend de la suerte 2023 ...]]></description><link>https://blog.karlosencalada.dev/desarrollo-x</link><guid isPermaLink="true">https://blog.karlosencalada.dev/desarrollo-x</guid><category><![CDATA[xata]]></category><category><![CDATA[GeneXus]]></category><category><![CDATA[APIs]]></category><dc:creator><![CDATA[Carlos G. Encalada B.]]></dc:creator><pubDate>Thu, 16 Mar 2023 05:08:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/jLwVAUtLOAQ/upload/5f4967b8a38c449a757d7ac0506af394.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>El título no tiene nada que ver con desarrollo de apps prohibidas o realizado con poco ropa 😁 surge a raíz de las herramientas utilizadas: GeneXus (nunca puede faltar) y Xata (un interesante descubrimiento).</p>
<p>Como parte del <a target="_blank" href="https://github.com/webreactiva-devs/backend-de-la-suerte-2023">Backend de la suerte 2023</a> (actividad que se está volviendo tradicional en la comunidad <a target="_blank" href="https://premium.danielprimo.io/">Malandriner</a>) me tocó resolver el reto con <a target="_blank" href="https://xata.io/">Xata</a>, una herramienta que se presenta como "la base de datos serverless que te dará super-poderes". No la conocía de nada pero veo que tiene características interesantes (consulta vía API, manejo de ramas para migración), una capa gratuita generosa y unos precios muy atractivos, muy probablemente la vuelva a utilizar en un futuro en algún proyecto real.</p>
<h3 id="heading-primeros-pasos"><strong>Primeros pasos</strong></h3>
<p>Se puede acceder a Xata con los clientes oficiales (la documentación muestra ejemplos con TS) y vía su API REST. Como siempre hago al utilizar un API nueva (o incluso en alguna conocida) es probar los endpoints con Insomnia.</p>
<p>La documentación se ve completa, pero con pocos ejemplos, sin embargo resulta sencilla de seguir hasta dar con los endpoints que creo voy a necesitar. Lo primero es obtener el token (desde la configuración de la cuenta) que irá en todas las llamadas.</p>
<p>Para las pruebas utilicè los siguientes métodos:</p>
<ul>
<li><p>Get user details <a target="_blank" href="https://xata.io/docs/api-reference/user#get-user-details">https://xata.io/docs/api-reference/user#get-user-details</a></p>
</li>
<li><p>Get list of workspaces <a target="_blank" href="https://xata.io/docs/api-reference/workspaces#get-list-of-workspaces">https://xata.io/docs/api-reference/workspaces#get-list-of-workspaces</a></p>
</li>
<li><p>List databases <a target="_blank" href="https://xata.io/docs/api-reference/workspaces/workspace_id/dbs#list-databases">https://xata.io/docs/api-reference/workspaces/workspace_id/dbs#list-databases</a></p>
</li>
<li><p>Insert record <a target="_blank" href="https://xata.io/docs/api-reference/db/db_branch_name/tables/table_name/data#insert-record">https://xata.io/docs/api-reference/db/db_branch_name/tables/table_name/data#insert-record</a></p>
</li>
<li><p>Query table <a target="_blank" href="https://xata.io/docs/api-reference/db/db_branch_name/tables/table_name/query#query-table">https://xata.io/docs/api-reference/db/db_branch_name/tables/table_name/query#query-table</a></p>
</li>
</ul>
<p>Primera parte lista, con esto tengo la seguridad de poder consumir desde GX.</p>
<h3 id="heading-el-mvp"><strong>El MVP</strong></h3>
<p>Ahora si a usar Xata desde GeneXus, lo que me pareció interesante es que tienen disponible la especificación <a target="_blank" href="https://xata.io/docs/rest-api/openapi">OpenApi</a> para importarla (con ejemplos en insomnia y postman). Así que voy por esa opción a ver cómo me va, primero con el <em>Core API</em> que da acceso al usuario y el espacio de trabajo, y luego con la <em>Workspace API</em> que da acceso a las bases de datos, tablas, registros, entre otras.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678930097045/ba7af452-5b47-4d9c-94f1-b7357fa4e08f.png" alt="Genexus - OpenAPI Import Tool" class="image--center mx-auto" /></p>
<p>Al cargar se despliegan todos los métodos, selecciono solo los que creo voy a necesitar para el primer reto (luego veré cómo agregar más). Si bien esto genera todos los objetos necesarios, el consumo de los endpoints es un poco enredado, así que mejor opté por utilizar el código generado desde insomnia.</p>
<pre><code class="lang-bash">curl --request POST \
  --url https://carlos-encalada-s-workspace-gq7o0i.us-west-2.xata.sh/db/cocina-zombie:main/tables/comanda/data \
  --header <span class="hljs-string">'Authorization: Bearer xau_Z5b2SjkZRrLHOlYqWxjvZ8LNIR3j9jxM1'</span> \
  --header <span class="hljs-string">'Content-Type: application/json'</span> \
  --data <span class="hljs-string">'{"FechaHora":"2023-03-13T20:00:00Z"}'</span>
</code></pre>
<p>Para cumplir con los requisitos del primer reto (<a target="_blank" href="https://github.com/webreactiva-devs/backend-de-la-suerte-2023#reto-1-hasta-loz-zombies-tienen-cerebro">ver detalles</a>), simplemente hice un web panel que en el evento Star recupera la última fecha-hora y al dar clic en el botón inserta un nuevo registro. Para el deploy utilice docker, la imagen se la puede encontrar <a target="_blank" href="https://hub.docker.com/r/karlos7/backend-de-la-suerte-2023/tags">aquí</a> y una versión de prueba <a target="_blank" href="https://cocina-zombie.karlosencalada.dev/comandas.aspx">acá</a>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678942810213/f1581142-78f3-4aa8-a825-e57a9ad007de.png" alt="Web para registrar comandas" class="image--center mx-auto" /></p>
<p>Para los próximos retos espero hacer algo más sofisticado y actualizar esta entrada, pero en conclusión <strong>Xata</strong> me parece una herramienta muy interesante para profundizar.</p>
]]></content:encoded></item><item><title><![CDATA[Respaldo de Bases de Datos MSSQL]]></title><description><![CDATA[En este articulo detallaré los pasos para tener respaldos automáticos de un servidor MS SQL 2017 y almacenarlos en un bucket de Backblaze.
Plan de Mantenimiento
Con esta funcionalidad disponible desde el Management Studio se puede configurar el respa...]]></description><link>https://blog.karlosencalada.dev/respaldo-de-bases-de-datos-mssql</link><guid isPermaLink="true">https://blog.karlosencalada.dev/respaldo-de-bases-de-datos-mssql</guid><category><![CDATA[mssql-management-studio]]></category><category><![CDATA[Backblaze]]></category><category><![CDATA[rclone]]></category><category><![CDATA[windows server]]></category><category><![CDATA[SQL Server]]></category><dc:creator><![CDATA[Carlos G. Encalada B.]]></dc:creator><pubDate>Mon, 02 Jan 2023 01:01:17 GMT</pubDate><content:encoded><![CDATA[<p>En este articulo detallaré los pasos para tener respaldos automáticos de un servidor MS SQL 2017 y almacenarlos en un bucket de <a target="_blank" href="https://www.backblaze.com/">Backblaze</a>.</p>
<h2 id="heading-plan-de-mantenimiento">Plan de Mantenimiento</h2>
<p>Con esta funcionalidad disponible desde el Management Studio se puede configurar el respaldo de bases de datos, así como otras tareas útiles.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672615388650/636d05fc-6402-4021-a120-ba4fe1e4ea16.png" alt class="image--center mx-auto" /></p>
<p>La forma más sencilla de configurar el plan es seguir el Wizard e ir completando la información necesaria en cada paso.</p>
<p><strong>Propiedades</strong>: Nombre, descripción y la periodicidad de ejecución. En este caso se ejecutará todos los días a las 2am.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672615717367/73051b04-c2e7-4f24-ab0f-343ac3c6493a.png" alt class="image--center mx-auto" /></p>
<p><strong>Tareas de Mantenimiento:</strong> Se selecciona todas las tareas que se necesitan en el plan. En este caso será la revisión la limpieza de respaldos antiguos y el respaldo total.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672617001596/99c1e8a9-1dfa-44c8-a367-f1e6fb3197b9.png" alt class="image--center mx-auto" /></p>
<p>Una vez seleccionadas las tareas se puede definir el orden de ejecución, quedando de la siguiente forma:</p>
<ol>
<li><p>Limpieza de backups</p>
</li>
<li><p>Respaldo total</p>
</li>
</ol>
<p>Luego se presentan las pantallas específicas para cada tarea.</p>
<p><strong>Tarea de Limpieza:</strong> Se configura el directorio en el que se buscarán los respaldos y la antigüedad a considerar para eliminarlos.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672616778355/15450342-53fe-4391-8e2e-2c0f80b404d4.png" alt class="image--center mx-auto" /></p>
<p><strong>Respaldo Total:</strong> Se seleccionan las bases de datos requeridas, el destino del respaldo y el tipo de compresión.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672617236597/137efcbc-c5f5-4480-96b4-efa877f76f42.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672617279821/74e30528-78b1-45cd-ac05-730dbc3c949c.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672617340460/557c2c0e-037b-4235-873b-99a35b462e0f.png" alt class="image--center mx-auto" /></p>
<p>Si no existen errores con alguna de las tareas, el plan se crea exitosamente.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672617814901/8bb6ae77-893c-48c4-920b-6489ec137f08.png" alt class="image--center mx-auto" /></p>
<p>Lo podemos probar ejecutándolo manualmente desde el menú contextual del plan.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672617868176/0f811635-6fcd-46cf-b10c-61d645485dcc.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672618013325/721d241e-fb3e-4d23-b28d-db3fe19fec9a.png" alt class="image--center mx-auto" /></p>
<p>Con esto tenemos lista la primera parte, pero los respaldos siguen estando en el mismo equipo, lo que no es la mejor opción en caso de fallas.</p>
<h2 id="heading-respaldo-en-la-nube">Respaldo en la nube</h2>
<h3 id="heading-proveedor">Proveedor</h3>
<p>Como servicio de almacenamiento utilizaré Backblaze, ya que el manejo es sencillo y los costos asociados muy bajos. Luego de iniciar sesión en la cuenta, se crea un bucket con las características deseadas, en esta caso son:</p>
<ul>
<li><p>Privado</p>
</li>
<li><p>Sin encriptación</p>
</li>
<li><p>Y con retención de archivos de 5 días</p>
</li>
</ul>
<p>En la sección App Keys se crea una nueva con acceso al bucket y con acceso de lectura/escritura.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672618856197/cba4c052-8a3a-478f-ad05-ad59a6db2660.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-cliente">Cliente</h3>
<p>Para este caso utilizaré <a target="_blank" href="https://rclone.org/">RClone</a> ya que tiene soporte para Backblaze (y más de 40 destinos). Luego de descarga el zip, simplemente se copia el contenido a una carpeta del sistema y se ejecuta la utilidad desde linea de comandos (<a target="_blank" href="https://rclone.org/b2/">página oficial</a>).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672618349782/efab94d3-ef8f-4c76-aaec-464808a2bcc8.png" alt class="image--center mx-auto" /></p>
<p>Los pasos son:</p>
<ol>
<li><p>New remote (n)</p>
</li>
<li><p>Backblaze (6)</p>
</li>
<li><p>Account: aquí se debe introducir el keyID generado desde la web de Backblaze</p>
</li>
<li><p>Key: aquí se debe introducir el aplicationKey generado desde la web de Backblaze</p>
</li>
<li><p>hard_delete: false</p>
</li>
<li><p>Advance config: false</p>
</li>
</ol>
<p>Para probar la configuración, se puede ejecutar la sincronización desde línea de comandos.</p>
<pre><code class="lang-bash">rclone sync C:\BasesBackup\B2 b2-sql:Bases-EncDia
</code></pre>
<p>Los parámetros del comando son:</p>
<ul>
<li><p>El directorio a sincronizar (C:\BasesBackup\B2)</p>
</li>
<li><p>El nombre del remoto configurado en rclone (b2-sql)</p>
</li>
<li><p>El nombre del bucket (bases-encdia)</p>
</li>
</ul>
<h3 id="heading-tarea-programada">Tarea programada</h3>
<p>Con la ayuda de una tarea de windows, se configura la ejecución de la sincronización todos los días a las 3am.</p>
<p>Para eso se crea un .bat y el contenido será el comando de rclone</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672620891309/61b9c708-596e-4e48-8f98-029abe6a1f81.png" alt class="image--center mx-auto" /></p>
<p>Y con esto queda lista la generación de respaldos diarios y su almacenamiento en la nube.</p>
]]></content:encoded></item><item><title><![CDATA[Conectar unidad de red al inicio]]></title><description><![CDATA[Crear un fichero .bat con el siguiente contenido
cd\
net use \\[ip]\[folder] /u:[user] [password]
Colocarlo en el directorio de inicio, ejecutando 
shell:Startup]]></description><link>https://blog.karlosencalada.dev/conectar-unidad-de-red-al-inicio</link><guid isPermaLink="true">https://blog.karlosencalada.dev/conectar-unidad-de-red-al-inicio</guid><category><![CDATA[windows server]]></category><category><![CDATA[networking]]></category><dc:creator><![CDATA[Carlos G. Encalada B.]]></dc:creator><pubDate>Sat, 12 Mar 2022 19:53:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/eVWWr6nmDf8/upload/v1647114756104/DP8DCMnLG.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Crear un fichero .bat con el siguiente contenido</p>
<pre><code><span class="hljs-selector-tag">cd</span>\
<span class="hljs-selector-tag">net</span> <span class="hljs-selector-tag">use</span> \\<span class="hljs-selector-attr">[ip]</span>\<span class="hljs-selector-attr">[folder]</span> /<span class="hljs-selector-tag">u</span>:<span class="hljs-selector-attr">[user]</span> <span class="hljs-selector-attr">[password]</span>
</code></pre><p>Colocarlo en el directorio de inicio, ejecutando </p>
<pre><code><span class="hljs-attribute">shell</span>:Startup
</code></pre>]]></content:encoded></item><item><title><![CDATA[Servidor de Desarrollo GX]]></title><description><![CDATA[Pre-requisitos
Lo primero es instalar Microsoft SQL Server dependiendo de la versión de GeneXus. Se puede utilizar la versión  Express  o  Developer .  

Para ejecutar las aplicaciones se requiere  URL Rewrite, para compilar en Java o Android el  JDK...]]></description><link>https://blog.karlosencalada.dev/servidor-de-desarrollo-gx</link><guid isPermaLink="true">https://blog.karlosencalada.dev/servidor-de-desarrollo-gx</guid><category><![CDATA[General Programming]]></category><dc:creator><![CDATA[Carlos G. Encalada B.]]></dc:creator><pubDate>Fri, 17 Dec 2021 05:43:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/6sAl6aQ4OWI/upload/v1639713377669/AgYln9VBf.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-pre-requisitos">Pre-requisitos</h3>
<p>Lo primero es instalar Microsoft SQL Server dependiendo de la versión de GeneXus. Se puede utilizar la versión  <a target="_blank" href="https://go.microsoft.com/fwlink/?linkid=866662">Express</a>  o  <a target="_blank" href="https://go.microsoft.com/fwlink/?linkid=866658">Developer</a> .  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639712851635/spx3txf0m.png" alt="imagen.png" /></p>
<p>Para ejecutar las aplicaciones se requiere  <a target="_blank" href="https://www.iis.net/downloads/microsoft/url-rewrite">URL Rewrite</a>, para compilar en Java o Android el  <a target="_blank" href="M0A85BkTSi">JDK 1.8</a>  o superior</p>
<p>Complementos adicionales (error en la instalación):  <a target="_blank" href="http://dcserver.genexus.com/runtimesLocalDB/msodbcsqlx64.msi">Microsoft ODBC Driver for SQL Server</a> ,  <a target="_blank" href="https://dcserver.genexus.com/runtimesLocalDB/MsSqlCmdLnUtilsx64.msi">Microsoft Command Line Utilities for SQL Server</a> y  <a target="_blank" href="https://dcserver.genexus.com/runtimesLocalDB/SqlLocalDB.x64.msi">Microsoft LocalDB</a> .</p>
<h3 id="heading-instalacion">Instalación</h3>
<p>En este caso se utilizarán las versiones  <a target="_blank" href="https://files.genexus.com/files/1639712706/genexus16u10.exe">v16 upgrade 10</a>  y  <a target="_blank" href="https://files.genexus.com/files/1639712639/genexus17u6.exe">v17 upgrade 6</a> </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639713211756/H9GVXPggD.png" alt="imagen.png" /><br />Durante la instalación se presentó un error indicando que faltaban algunas dependencias, pero al parecer la instalación terminó por que se encontraba disponible para iniciar🤔.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639714092563/D6wMgEYrK.png" alt="imagen.png" />  </p>
<h3 id="heading-validar-instalacion">Validar Instalación</h3>
<p>Luego de cargar las licencias se crea una KB de prueba para verificar que se puede generar una aplicación web y luego se instala el SDK de Android (aprox. 4GB) para comprobar la generación de una app nativa.  </p>
<p>Luego de esto el equipo está listo para trabajar con GeneXus.</p>
<h3 id="heading-referencias">Referencias</h3>
<p> <a target="_blank" href="https://www.microsoft.com/es-es/sql-server/sql-server-downloads">SQL Server Downloads</a><br /> <a target="_blank" href="https://wiki.genexus.com/commwiki/servlet/wiki?45192,GeneXus+16+hardware+and+software+requirements+%28GeneXus+16+Upgrade+7+or+prior%29">GeneXus 16 hardware and software requirements</a><br /> <a target="_blank" href="https://wiki.genexus.com/commwiki/servlet/wiki?30900,GeneXus+17+hardware+and+software+requirements">GeneXus 17 hardware and software requirements</a><br /> <a target="_blank" href="https://docplayer.es/125280492-Verificacion-de-la-instalacion-de-genexus-version-16-como-verificar-que-genexus-16-tm-este-correctamente-instalado.html">Verificación de la instalación de GeneXus versión 16</a><br /> <a target="_blank" href="https://ealmeida.blogspot.com/2020/12/caracteristicas-de-genexus-que-vale-la.html">Características de GeneXus que vale la pena conocer: LocalDB</a> </p>
]]></content:encoded></item><item><title><![CDATA[VPS Windows]]></title><description><![CDATA[Conexión al servidor
La forma más cómoda es mediante Escritorio Remoto (RDP), en Windows utilizo  mRemoteNG  ya que permite tener organizadas las conexiones. Para Linux una alternativa es  Remmina .Una vez conectado el primer paso es actualizar (no i...]]></description><link>https://blog.karlosencalada.dev/vps-windows</link><guid isPermaLink="true">https://blog.karlosencalada.dev/vps-windows</guid><category><![CDATA[windows server]]></category><category><![CDATA[vps]]></category><category><![CDATA[SSL]]></category><category><![CDATA[Firefox]]></category><dc:creator><![CDATA[Carlos G. Encalada B.]]></dc:creator><pubDate>Fri, 17 Dec 2021 03:09:32 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/T01GZhBSyMQ/upload/v1639537422453/c6Pth3knw.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-conexion-al-servidor">Conexión al servidor</h3>
<p>La forma más cómoda es mediante Escritorio Remoto (RDP), en Windows utilizo <strong> <a target="_blank" href="https://mremoteng.org/">mRemoteNG</a> </strong> ya que permite tener organizadas las conexiones. Para Linux una alternativa es <strong> <a target="_blank" href="https://remmina.org/">Remmina</a> </strong>.<br />Una vez conectado el primer paso es actualizar (no importa si dice que está actualizado, hay que darle a Check) y luego reiniciar, actualizar, reiniciar.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639540536260/_BSBQyNw6.png" alt="imagen.png" /></p>
<h3 id="heading-cambiar-clave-de-administrador">Cambiar clave de administrador</h3>
<p>Una medida básica de seguridad, los pasos son <strong>Settings,</strong> <strong>Accounts,</strong> <strong>Sign-in options,</strong> <strong>Password,</strong> <strong>Change</strong>.<br />Colocar la clave actual, digitar la nueva dos veces y colocar una pista (requerido). Cerrar sesión y volverse a conectar para validar.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639541718559/h_CSugr8o.png" alt="imagen.png" /></p>
<h3 id="heading-software-esencial">Software esencial</h3>
<p>Empezando por el navegador (Edge esta bien, pero) la opción recomendada es Firefox ESR (la versión de soporte extendido).</p>
<p>Habilitar la característica de servidor web, abrir <strong>Server Manager,</strong> <strong>Manage,</strong> <strong>Add Roles and Features,</strong> y seguir la guía del asistente.</p>
<p>Para manejar de forma sencilla los certificados SSL y poder configurar varios sitios en IIS utilizo <strong> <a target="_blank" href="https://certifytheweb.com/">Certify the Web</a> </strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639710378628/0LUayzpTv.png" alt="imagen.png" /></p>
<h3 id="heading-crear-usuarios">Crear usuarios</h3>
<p>Siempre es preferible realizar cualquier tarea con un usuario diferente al Administrador y dependiendo de los requerimientos, se puede tener hasta dos usuarios conectados de forma concurrente sin necesidad de instalar una licencia adicional.<br />Los pasos son <strong>Settings,</strong> <strong>Accounts,</strong> <strong>Other Users,</strong> <strong>Add someone else to this PC,</strong> <strong>Users,</strong> <strong>New User...</strong>.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639543382627/2hGka1Flh.png" alt="imagen.png" />
Luego asegurarse de habilitar el acceso remoto: <strong>Settings, </strong> <strong>Remote Desktop,</strong> <strong>User accounts, </strong> <strong>Select users that can remotely access this PC.</strong></p>
<h3 id="heading-vnc">VNC</h3>
<p>Dependiendo del proveedor en el que se encuentre alojado el VPS, existe la posibilidad de conectarse por VNC. Como medida de seguridad se cambia la clave y si es posible desde el panel desactivar el acceso.  </p>
<p>Luego de esto el servidor se encuentra listo para instalar el software adicional en función del uso que se le vaya a dar.</p>
<h3 id="heading-referencias">Referencias</h3>
<p><a target="_blank" href="https://docs.microsoft.com/es-es/windows-server/get-started/editions-comparison-windows-server-2022">Comparación de las ediciones Standard, Datacenter y Datacenter Azure Edition de Windows Server 2022</a><br /><a target="_blank" href="https://www.mozilla.org/es-ES/firefox/enterprise/">Obtén Firefox para tu empresa</a> </p>
]]></content:encoded></item><item><title><![CDATA[Primeros pasos en OCI]]></title><description><![CDATA[El primer paso es crear la cuenta. Una vez completados los datos y confirmado el correo estamos dentro de la consola. Se puede observar los servicios que son elegibles para Always Free

La idea es levantar dos instancias de computo, una para bases de...]]></description><link>https://blog.karlosencalada.dev/primeros-pasos-en-oci</link><guid isPermaLink="true">https://blog.karlosencalada.dev/primeros-pasos-en-oci</guid><category><![CDATA[Oracle]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Carlos G. Encalada B.]]></dc:creator><pubDate>Sun, 12 Dec 2021 23:31:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/n6B49lTx7NM/upload/v1639338225084/NJ9SlRPOo.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>El primer paso es crear la <a target="_blank" href="https://signup.cloud.oracle.com/">cuenta.</a> Una vez completados los datos y confirmado el correo estamos dentro de la consola. Se puede observar los servicios que son elegibles para <em>Always Free</em>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639340420569/qPHcz9z75.png" alt="imagen.png" /></p>
<p>La idea es levantar dos instancias de computo, una para bases de datos y otra para aplicaciones. Para esto se utilizarán procesadores ARM, ya que en la capa gratuita se tiene el equivalente a 4 cores y 24 GB en RAM 😮.<br /><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639346631691/vR0ZJcQhK.png" alt="imagen.png" /></p>
<h3 id="heading-personalizacion-de-la-instancia">Personalización de la instancia</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639346008439/MTVELUbP9.png" alt="imagen.png" />  </p>
<p>El primer cambio es la ubicación (Placement) para colocar dos instancias en el mismo dominio de falla (Fault Domains) con la idea de reducir la latencia.  </p>
<p>Luego elegir la imagen y el aspecto (Image and shape), las bases de datos irán en instancias de Oracle Linux 8 y las aplicaciones en instancias Ubuntu 20.04 😎. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1639347659785/IpF6DS-aC.png" alt="imagen.png" /><br />En la parte de red le puse nombres 'amigables' a la red y subred. Para la conexión subí la llave ssh pública y con eso la instancia estaba lista para crear.</p>
<p>Una vez aprovisionada la instancia es cuestión de conectarse por ssh para iniciar la configuración inicial (ver check lists  <a target="_blank" href="https://blog.karlosencalada.dev/check-list-vps">1</a>  y  <a target="_blank" href="https://blog.karlosencalada.dev/check-list-vps-ii">2</a>)</p>
<p>Para más detalles de las características de la nube de Oracle y las opciones de la capa gratuita, se pueden consultar las referencias.</p>
<h3 id="heading-referencias">Referencias</h3>
<p><a target="_blank" href="https://avalos.sv/podcast/428-dos-vps-siempre-gratis/">Dos VPS ¡y más!… Siempre gratis</a><br /><a target="_blank" href="https://www.servethehome.com/oracle-cloud-giving-away-ampere-arm-a1-instances-always-free/">Oracle Cloud Giving Away Ampere Arm A1 Instances Always Free</a><br /><a target="_blank" href="https://docs.oracle.com/en-us/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm">Always Free Resources</a><br /><a target="_blank" href="https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm#fault">Fault Domains</a><br /><a target="_blank" href="https://docs.oracle.com/en-us/iaas/Content/Compute/Tasks/accessinginstance.htm">Connecting to an Instance</a> </p>
]]></content:encoded></item><item><title><![CDATA[Check list VPS II]]></title><description><![CDATA[Ampliación del primer post con particularidades de distribuciones derivadas de CentOS. En este caso todo fue realizado en Alma Linux 8.4
Actualizar
dnf check-update && dnf update
Cambiar la contraseña de root
passwd
Agregar un nuevo usuario y definir...]]></description><link>https://blog.karlosencalada.dev/check-list-vps-ii</link><guid isPermaLink="true">https://blog.karlosencalada.dev/check-list-vps-ii</guid><category><![CDATA[vps]]></category><category><![CDATA[linux for beginners]]></category><category><![CDATA[Docker]]></category><category><![CDATA[ssh]]></category><dc:creator><![CDATA[Carlos G. Encalada B.]]></dc:creator><pubDate>Sat, 11 Dec 2021 22:26:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/Skf7HxARcoc/upload/v1639261772485/5vNdyXWj7.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ampliación del primer post con particularidades de distribuciones derivadas de CentOS. En este caso todo fue realizado en Alma Linux 8.4</p>
<h3 id="heading-actualizar">Actualizar</h3>
<pre><code>dnf <span class="hljs-keyword">check</span>-<span class="hljs-keyword">update</span> &amp;&amp; dnf <span class="hljs-keyword">update</span>
</code></pre><h3 id="heading-cambiar-la-contrasena-de-root">Cambiar la contraseña de root</h3>
<pre><code>passwd
</code></pre><h3 id="heading-agregar-un-nuevo-usuario-y-definir-la-clave">Agregar un nuevo usuario y definir la clave</h3>
<pre><code><span class="hljs-attribute">adduser</span> karlos

passwd karlos
</code></pre><h3 id="heading-dar-privilegios-de-root">Dar privilegios de root</h3>
<pre><code><span class="hljs-attribute">gpasswd</span> -a karlos wheel
</code></pre><h3 id="heading-ssh">SSH</h3>
<p>La parte de configuración y conexión SSH no varia con respecto a la  <a target="_blank" href="https://blog.karlosencalada.dev/check-list-vps#heading-crear-llaves-ssh">parte 1</a> </p>
<p>Finalmente reiniciar el servicio </p>
<pre><code><span class="hljs-attribute">systemctl</span> reload sshd
</code></pre><h3 id="heading-firewall">Firewall</h3>
<h3 id="heading-docker">Docker</h3>
<p>Eliminar versiones antiguas</p>
<pre><code>sudo yum remove docker \
                  docker<span class="hljs-operator">-</span>client \
                  docker<span class="hljs-operator">-</span>client<span class="hljs-operator">-</span>latest \
                  docker<span class="hljs-operator">-</span>common \
                  docker<span class="hljs-operator">-</span>latest \
                  docker<span class="hljs-operator">-</span>latest<span class="hljs-operator">-</span>logrotate \
                  docker<span class="hljs-operator">-</span>logrotate \
                  docker<span class="hljs-operator">-</span>engine
</code></pre><p>Actualizar índice de paquetes e instalar complementos</p>
<pre><code>sudo yum <span class="hljs-keyword">check</span>-<span class="hljs-keyword">update</span>  

sudo yum <span class="hljs-keyword">install</span> -y yum-utils
</code></pre><p>Agregar repositorio</p>
<pre><code>sudo yum<span class="hljs-operator">-</span>config<span class="hljs-operator">-</span>manager \
    <span class="hljs-operator">-</span><span class="hljs-operator">-</span>add<span class="hljs-operator">-</span>repo \
    https:<span class="hljs-comment">//download.docker.com/linux/centos/docker-ce.repo</span>
</code></pre><p>Instalar</p>
<pre><code>sudo yum install docker<span class="hljs-operator">-</span>ce docker<span class="hljs-operator">-</span>ce<span class="hljs-operator">-</span>cli containerd.io
</code></pre><p>Iniciar servicio y verificar  </p>
<pre><code>sudo systemctl <span class="hljs-keyword">start</span> docker

sudo systemctl <span class="hljs-keyword">status</span> docker
</code></pre><p>Habilitar arranque al inicio  </p>
<pre><code>sudo systemctl <span class="hljs-keyword">enable</span> docker
</code></pre><p>Verificar instalación  </p>
<pre><code class="lang-`">sudo docker run hello-world
</code></pre>
<p>Permisos de ejecución  </p>
<pre><code>sudo usermod -aG docker <span class="hljs-variable">$(whoami)</span>
</code></pre><p>Volver a iniciar sesión</p>
<h3 id="heading-docker-compose">Docker Compose</h3>
<p>Descargar ejecutable</p>
<pre><code>sudo curl <span class="hljs-operator">-</span>L <span class="hljs-string">"https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)"</span> <span class="hljs-operator">-</span>o <span class="hljs-operator">/</span>usr<span class="hljs-operator">/</span>local<span class="hljs-operator">/</span>bin<span class="hljs-operator">/</span>docker<span class="hljs-operator">-</span>compose
</code></pre><p>Asignar permisos</p>
<pre><code>sudo chmod <span class="hljs-operator">+</span>x <span class="hljs-operator">/</span>usr<span class="hljs-operator">/</span>local<span class="hljs-operator">/</span>bin<span class="hljs-operator">/</span>docker<span class="hljs-operator">-</span>compose
</code></pre><p>Verificar instalación  </p>
<pre><code>docker<span class="hljs-operator">-</span>compose <span class="hljs-operator">-</span><span class="hljs-operator">-</span>version
</code></pre><p>Con estos pasos se tiene listo el server con Alma Linux (uno de los candidatos a sustituir a CentOS).</p>
<p>Para más detalles de las opciones utilizadas se pueden consultar los artículos de referencia.</p>
<h3 id="heading-referencias">Referencias</h3>
<p><a target="_blank" href="https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7">Initial Server Setup with CentOS 7</a><br /><a target="_blank" href="https://linuxconfig.org/how-to-update-almalinux">How to update AlmaLinux</a><br /><a target="_blank" href="https://docs.bluehosting.cl/tutoriales/servidores/introduccion-a-firewalld-en-centos.html">Text</a> 
<a target="_blank" href="https://docs.docker.com/engine/install/centos/">Install Docker Engine on CentOS</a><br /><a target="_blank" href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-centos-7">How To Install and Use Docker on CentOS 7</a><br /><a target="_blank" href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-centos-7">How To Install and Use Docker Compose on CentOS 7</a>  </p>
]]></content:encoded></item><item><title><![CDATA[Check list VPS]]></title><description><![CDATA[Una vez habilitado el servidor en el proveedor de turno, hay una serie de pasos que sigo normalmente.
Actualizar
apt update && apt upgrade
Cambiar la contraseña de root
passwd
Agregar un nuevo usuario
adduser karlos
Dar privilegios de root
usermod -a...]]></description><link>https://blog.karlosencalada.dev/check-list-vps</link><guid isPermaLink="true">https://blog.karlosencalada.dev/check-list-vps</guid><category><![CDATA[vps]]></category><category><![CDATA[Docker]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[ssh]]></category><dc:creator><![CDATA[Carlos G. Encalada B.]]></dc:creator><pubDate>Sun, 28 Nov 2021 02:30:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/UgA3Xvi3SkA/upload/v1639257134126/9AXTY1JHb.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Una vez habilitado el servidor en el proveedor de turno, hay una serie de pasos que sigo normalmente.</p>
<h3 id="heading-actualizar">Actualizar</h3>
<pre><code>apt <span class="hljs-keyword">update</span> &amp;&amp; apt <span class="hljs-keyword">upgrade</span>
</code></pre><h3 id="heading-cambiar-la-contrasena-de-root">Cambiar la contraseña de root</h3>
<pre><code>passwd
</code></pre><h3 id="heading-agregar-un-nuevo-usuario">Agregar un nuevo usuario</h3>
<pre><code><span class="hljs-attribute">adduser</span> karlos
</code></pre><h3 id="heading-dar-privilegios-de-root">Dar privilegios de root</h3>
<pre><code><span class="hljs-attribute">usermod</span> -aG sudo karlos
</code></pre><h3 id="heading-crear-llaves-ssh">Crear llaves ssh</h3>
<pre><code>ssh<span class="hljs-operator">-</span>keygen
</code></pre><h3 id="heading-copiar-al-servidor">Copiar al servidor</h3>
<pre><code>ssh-<span class="hljs-keyword">copy</span>-<span class="hljs-keyword">id</span> karlos@remote_host
</code></pre><h3 id="heading-configuraciones-adicionales-de-ssh">Configuraciones adicionales de SSH</h3>
<p>Editar el archivo <strong>/etc/ssh/sshd_config</strong> para: </p>
<ul>
<li>Cambiar puerto (Port)</li>
<li>Deshabilitar el acceso con contraseña (PasswordAuthentication)</li>
<li>Deshabilitar el acceso root (PermitRootLogin)</li>
<li>Limitar usuarios con acceso (AllowUsers karlos)</li>
</ul>
<p>Finalmente reiniciar el servicio </p>
<pre><code>systemctl <span class="hljs-keyword">restart</span> ssh
</code></pre><h3 id="heading-docker">Docker</h3>
<p>Eliminar versiones antiguas</p>
<pre><code>sudo apt<span class="hljs-operator">-</span>get remove docker docker<span class="hljs-operator">-</span>engine docker.io containerd runc
</code></pre><p>Actualizar índice de paquetes e instalar complementos</p>
<pre><code>sudo apt-<span class="hljs-keyword">get</span> <span class="hljs-keyword">update</span>
sudo apt-<span class="hljs-keyword">get</span> install \
    ca-certificates \
    curl \
    gnupg \
    lsb-<span class="hljs-keyword">release</span>
</code></pre><p>Agregar llave GPG</p>
<pre><code>curl -fsSL <span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/download.docker.com/linux</span><span class="hljs-regexp">/ubuntu/gpg</span> <span class="hljs-params">| sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span>
</code></pre><p>Agregar repositorio</p>
<pre><code>echo \
  <span class="hljs-string">"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable"</span> <span class="hljs-operator">|</span> sudo tee <span class="hljs-operator">/</span>etc<span class="hljs-operator">/</span>apt<span class="hljs-operator">/</span>sources.list.d/docker.list <span class="hljs-operator">&gt;</span> <span class="hljs-operator">/</span>dev<span class="hljs-operator">/</span>null
</code></pre><p>Instalar</p>
<pre><code>sudo apt<span class="hljs-operator">-</span>get update

sudo apt<span class="hljs-operator">-</span>get install docker<span class="hljs-operator">-</span>ce docker<span class="hljs-operator">-</span>ce<span class="hljs-operator">-</span>cli containerd.io
</code></pre><p>Verificar instalación</p>
<pre><code class="lang-`">sudo docker run hello-world
</code></pre>
<p>Permisos de ejecución</p>
<pre><code><span class="hljs-attribute">sudo</span> usermod -aG docker <span class="hljs-variable">$USER</span>
</code></pre><p>Volver a iniciar sesión</p>
<h3 id="heading-docker-compose">Docker Compose</h3>
<p>Descargar ejecutable</p>
<pre><code>sudo curl <span class="hljs-operator">-</span>L <span class="hljs-string">"https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)"</span> <span class="hljs-operator">-</span>o <span class="hljs-operator">/</span>usr<span class="hljs-operator">/</span>local<span class="hljs-operator">/</span>bin<span class="hljs-operator">/</span>docker<span class="hljs-operator">-</span>compose
</code></pre><p>Asignar permisos</p>
<pre><code>sudo chmod <span class="hljs-operator">+</span>x <span class="hljs-operator">/</span>usr<span class="hljs-operator">/</span>local<span class="hljs-operator">/</span>bin<span class="hljs-operator">/</span>docker<span class="hljs-operator">-</span>compose
</code></pre><p>Verificar instalación</p>
<pre><code>docker<span class="hljs-operator">-</span>compose <span class="hljs-operator">-</span><span class="hljs-operator">-</span>version
</code></pre><p>Con estos pasos tengo un servidor con todo listo para empezar a levantar diferentes servicios.</p>
<p>Para más detalles de las opciones utilizadas se pueden consultar los artículos de referencia.</p>
<h2 id="heading-referencias">Referencias</h2>
<p><a target="_blank" href="https://atareao.es/tutorial/servidor-virtual/primeros-pasos-con-tu-vps/">Primeros pasos con tu VPS</a><br /><a target="_blank" href="https://itsfoss.com/change-password-ubuntu/">How to Change User Password in Ubuntu [Beginner’s Tutorial]</a><br /><a target="_blank" href="https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-20-04">Initial Server Setup with Ubuntu 20.04</a><br /><a target="_blank" href="https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-ubuntu-20-04">How to Set Up SSH Keys on Ubuntu 20.04</a><br /><a target="_blank" href="https://atareao.es/ubuntu/configuracion-de-ssh/">Configuración de ssh. Simplifica tus conexiones en Ubuntu, Linux Mint, etc</a><br /><a target="_blank" href="https://docs.docker.com/engine/install/ubuntu/">Install Docker Engine on Ubuntu</a><br /><a target="_blank" href="https://atareao.es/tutorial/docker/">Tutorial de Docker</a><br /><a target="_blank" href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-20-04">How To Install and Use Docker Compose on Ubuntu 20.04</a>  </p>
]]></content:encoded></item></channel></rss>