Categoría: Sin categoría

  • Instalar SQL Server 2022 en Ubuntu 22.04

    Instalar SQL Server 2022 en Ubuntu 22.04

    Hay dos maneras de tener SQL Server en Ubuntu/linux, una es de manera nativa y otra mediante un contenedor en Docker.

    En mi experiencia, como buena práctica siempre es mejor tener la última versión de lo que este disponible en su momento, si hubiera problemas de compatibilidad o soporte, tuve un caso donde SQL Server no era compatible con mi versión de Ubuntu de ese momento ya que era muy reciente, la solución fue simple y sencilla, usar Docker y virtualizar una versión anterior de Ubuntu para correr SQL Server.

    En este caso es de forma directa y son pasos muy sencillos.

    Ejecutamos el siguiente comando para la clave pública:

    curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
    

    Posteriormente bajamos ubuntu del repositorio:

    curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list | sudo tee /etc/apt/sources.list.d/mssql-server-2022.list
    

    Ejecutamos un update

    sudo apt-get update

    Si nos muestra un error como el siguiente:

    W: GPG error: https://packages.microsoft.com/ubuntu/22.04/mssql-server-2022 jammy InRelease: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY EB3E94ADBE1229CF

    Ejecutamos el siguiente comando para corregir el error:

    curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc

    Ahora si ejecutamos nuestro apt-get update y después el siguiente comando:

    sudo apt-get install -y mssql-server

    Si nos muestra un error, podemos ejecutar el siguiente comando para continuar la instalación:

    sudo /opt/mssql/bin/mssql-conf setup

    Y posteriormente nos pedirá escoger nuestra versión, seleccionan su versión que requieran, nos pedirá aceptar la licencia, el idioma y con eso concluiremos nuestra instalación.

    Para validar la ejecución de SQL, haremos lo siguiente:

    systemctl status mssql-server --no-pager

  • Espacio en disco lleno en Ubuntu por /var/lib/docker/overlay2

    Espacio en disco lleno en Ubuntu por /var/lib/docker/overlay2

    Error: No space left, pero el disco no está lleno

    En esta ocasión vi que mi VPS con Ubuntu y un contenedor en docker de SQL Server y 2 aplicaciones en Net Core estaba al 99.99% de espacio en disco, el cuál ejecutando comandos como

    sudo df -h

    ó

    du -hs * | sort -nr | head -3

    Me ayudaron a identificar que era una carpeta de Docker:

    /var/lib/docker/overlay2

    Leyendo por internet vi algunos comandos como:

    docker system prune --all

    Que ayuda a depurar tu flujo en docker, es peligroso ya que elimina definitivamente contenedores que estén detenidos, yo sin conflicto alguno lo ejecuté y no me liberó nada de espacio.

    Navegando y navegando me encontré con el siguiente comando que me funcionó:

    sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
    
    

    lo cual hace referencia a el Controlador de registro de archivos JSON y en la documentación oficial podemos configurar como deben crecer en tamaño y cantidad.

    https://docs.docker.com/engine/logging/drivers/json-file

    Ejemplo máximo de 3 registros archivos de no más de 10 megabytes cada uno:

    docker run -it --log-opt max-size=10m --log-opt max-file=3 alpine ash
  • Implementando un sitio .Net Core en un servidor Linux

    Implementando un sitio .Net Core en un servidor Linux

    Create Domain Directory
    sudo mkdir -p /var/www/diarioweb.mirandamx.dev/html

    Installing Nginx

    $ sudo apt-get update
    $ sudo apt-get install nginx
    sudo ufw app listOutput
    Available applications:
    Nginx Full
    Nginx HTTP
    Nginx HTTPS
    OpenSSH
    $ sudo ufw allow 'Nginx Full'
    $ sudo ufw allow ssh
    $ sudo ufw enable

    Validando el estatus de nuestro server nginx

    systemctl status nginx

    Algunos comandos útiles que necesitaremos en algún momento:

    $ sudo systemctl stop nginx
    $ sudo systemctl start nginx
    $ sudo systemctl restart nginx

    Creando los directorios y estructuras de nuestros sitios que requiramos

    sudo mkdir -p /var/www/diarioweb.mirandamx.dev/html
    sudo mkdir -p /var/www/diarioapi.mirandamx.dev/html

    Asignando permisos:

    sudo chown -R $USER:$USER /var/www/diarioweb.mirandamx.dev/html
    sudo chown -R $USER:$USER /var/www/diarioapi.mirandamx.dev/html

    sudo chmod -R 755 /var/www

    Server Block for Domain

    sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/diarioweb.mirandamx.dev
    
    sudo nano /etc/nginx/sites-available/diarioweb.mirandamx.dev

    Con CTRL + K podemos borrar contenido de manera rápida en nano

    server {
            listen 80;
            listen [::]:80;
    
            root /var/www/diarioweb.mirandamx.dev/html;
            index index.html index.htm index.nginx-debian.html;
    
            server_name diarioweb.mirandamx.dev www.diarioweb.mirandamx.dev;
    
            location / {
                    try_files $uri $uri/ =404;
            }
    }

    En este punto, dependiendo su versión de ubuntu, algunas versiones anteriores de net core podrían no ser compatible, en mi servidor Ubuntu 23.04 pude instalar net core 6.0 de la siguiente manera

    sudo apt-get update && \<br>sudo apt-get install -y aspnetcore-runtime-6.0
    

    Sin embargo en mi servidor con Ubuntu 24.04.1 LTS no pude realizarlo, así que decidí instalar la versión 8

     sudo apt-get update && \
     sudo apt-get install -y dotnet-sdk-8.0
    
    

    Si quisieran forzar la instalación de una versión no soportada, pueden poner lo siguiente:

    sudo add-apt-repository ppa:dotnet/backports
    sudo apt-get install aspnetcore-runtime-6.0

    Para validar que este instalado net core procedemos a hacer lo siguiente:

    dotnet --info

    Instalando SSL

    sudo snap install --classic certbot
    

    Antes de ejecutar el siguiente comando, nuestro dominio ya debe estar apuntando a nuestro servidor.

    sudo certbot –nginx -d diarioweb.mirandamx.dev -d diarioweb.mirandamx.dev

    Y a nuestro archivo de configuración de nginx

    sudo nano /etc/nginx/sites-available/diarioweb.mirandamx.dev

    Le añadimos lo siguiente:

    ssl_certificate /etc/letsencrypt/live/diarioweb.mirandamx.dev/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/diarioweb.mirandamx.dev/privkey.pem; # managed by Certbot

    Y se vería algo así:

    Ahora creamos nuestro archivo para levantar nuestra aplicación en el servidor kestrel mediante el siguiente comando:

    sudo nano /etc/systemd/system/kestrel-diarioWeb.service

    Le añadimos lo siguiente:

    Nota importante: Cuando configuremos múltiples sitios, tendremos que ir cambiando el puerto para que cada aplicación/sitio apunte de manera correspondiente.

    Ejemplos: <::5001>, <::5002>, <::5003>,

    [Unit]
    Description=Example .NET Web API App running on Ubuntu
    [Service]
    WorkingDirectory=/var/www/diarioweb.mirandamx.dev/html
    ExecStart=/usr/bin/dotnet /var/www/diarioweb.mirandamx.dev/html/DiarioFrontEndMVC.dll
    Restart=always
    # Restart service after 10 seconds if the dotnet service crashes:
    RestartSec=10
    KillSignal=SIGINT
    SyslogIdentifier=dotnet-example
    User=www-data
    Environment=ASPNETCORE_ENVIRONMENT=Release
    Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
    Environment=ASPNETCORE_URLS=http://127.0.0.1::5001
    [Install]
    WantedBy=multi-user.target
    
    

    Ahora en nuestro archivo de configuración cambiamos el location por un proxy_pass

    sudo nano /etc/nginx/sites-available/diarioapi.mirandamx.dev
           location / {
              proxy_pass  http://localhost:5001;    
           }
    
    
    server {
      listen 80;
      listen [::]:80;
    
      server_name api1.example.com *.example.com;
    
      root /var/www/api1.example.com;
    
      index index.html index.htm;
           location / {
              proxy_pass  http://localhost:5001;    
           }
    }
    

    Reiniciamos

    sudo systemctl enable kestrel-diarioWeb.service
    sudo systemctl start kestrel-diarioWeb.service
    sudo systemctl restart kestrel-diarioWeb.service
    sudo systemctl status kestrel-diarioWeb.service

    En este caso yo ya tenía mi compilado de mi otro sitio y solo copie mi compilado.

    Y si es exitoso, debería verse algo así: