Binary Coffee

¿Cómo configuro por primera vez mi hosting?

bash docker shell nginx

Llevo algún tiempo trabajando y configurando mis propios hostings con mis aplicaciones personales y proyectos en los que invierto mi tiempo libre. Producto de ello llega a mi la necesidad de definir cuales son aquellas cosas que necesito como base en mi hosting que me permitan desplegar y hostear mis aplicaciones sin problema.

Nota: los ejemplo que voy a utilizar en el artículo son compatibles con sistemas basados en debian, pero la idea general puede seguirse sin importar el sistema operativo del hosting

Crear el usuario inicial

Generalmente cuando utilizamos un hosting por primera vez, nos son dados por parte del proveedor de dicho hosting un usuario root y el password del mismo. En lo personal creo que es mala idea continuar con este usuario y lo que siempre hago, es crear un usuario para todo lo relacionado con el hosting.

Para crear este usuario nuevo, entramos en el hosting como root y hacemos lo siguiente:

# crear el usuario
$ sudo adduser app

Luego de creado el usuario y en caso de que se quiera dar privilegios de administración (sudo), se puede utilizar el comando visudo que abrirá el archivo de configuración de privilegios y se puede agregar la siguiente línea:

...

# User privilege specification
root    ALL=(ALL:ALL) ALL
app     ALL=(ALL:ALL) ALL #new line

...

Nótese que solo dupliqué la línea destinada al usuario root y puse en este caso el nuevo usuario app.

Hecho todo esto, ya podemos entrar nuevamente al hosting pero esta vez utilizando el usuario app creado.

Adicionar nuestras llaves SSH al hosting

Creado el nuevo usuario, pues todo está listo para hacer uso del mismo y conectarse al hosting:

$ ssh app@myhosting.com

Pero cada vez que utilicemos esto, vamos a necesitar el password del usuario en cuestión. Esto lo podemos evitar, si creamos una llave SSH en nuestra máquina local y luego agregamos dicha llave a las autorizadas del hosting.

  1. Crear llave local
$ ssh-keygen -t rsa
  1. Una vez creada la llave, vamos y mostramos el contenido de la llave pública, algo como esto
$ cat mykey.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDD9UUn/B/56eY/RUlwZBafIqwCYckyRmZCWhFy4our7K+xbwScWvZx2s0R8p+NjUsKQ9a5roO9dW/r5/irFEJ2VMXS+r+7r/XhK9RR56sT9mrB3u4faw1gpvKX/LJ5eS0PCNUxfGSeh5Bfc6IqQakbKWtcHqqLtRSRe6SqcfKLxb83kKwF+4FY66AqLlXrsYTUqlr88ore6qowUKFXwK4XtYggHLb/+XKirKEQMka2UG44YqXaXbtQVPRixk9zzWGIm1EWgLUrIqarh+4GM+67aNww8/P6cr6ZO1Jchk9lWGxF9g422da9G8N9z+1b7qbLMxNsLwaokBixj7U2wWUm0k/1s1et4mw3Ou4P91L7Ng65SmRy7jrazXT2FSyUnaQsPkvzDQQ51gxfbzf36m8FjKQ/6SZROou6Un33bLmRgMBuNWR+B3qot841xr8TZUWoJ/FT6xWS7xYJv2z9Mx3pmCDRrFBpLFS6jnHUhpnyKcs0JOHddmO4k39/q+c8raU= guille@guille-Lenovo-Legion
  1. Agregar la llave a las llaves autorizadas del hosting

Para este paso, se necesita abrir o crear el archivo ~/.ssh/authorized_keys y agregar una línea a dicho archivo con la llave pública antes mostrada.

$ nano .ssh/autorized_keys

y el fichero quedaría de la siguiente manera:

# my ssh key
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDD9UUn/B/56eY/RUlwZBafIqwCYckyRmZCWhFy4our7K+xbwScWvZx2s0R8p+NjUsKQ9a5roO9dW/r5/irFEJ2VMXS+r+7r/XhK9RR56sT9mrB3u4faw1gpvKX/LJ5eS0PCNUxfGSeh5Bfc6IqQakbKWtcHqqLtRSRe6SqcfKLxb83kKwF+4FY66AqLlXrsYTUqlr88ore6qowUKFXwK4XtYggHLb/+XKirKEQMka2UG44YqXaXbtQVPRixk9zzWGIm1EWgLUrIqarh+4GM+67aNww8/P6cr6ZO1Jchk9lWGxF9g422da9G8N9z+1b7qbLMxNsLwaokBixj7U2wWUm0k/1s1et4mw3Ou4P91L7Ng65SmRy7jrazXT2FSyUnaQsPkvzDQQ51gxfbzf36m8FjKQ/6SZROou6Un33bLmRgMBuNWR+B3qot841xr8TZUWoJ/FT6xWS7xYJv2z9Mx3pmCDRrFBpLFS6jnHUhpnyKcs0JOHddmO4k39/q+c8raU= guille@guille-Lenovo-Legion

Hecho esto, ya podemos conectarnos al hosting utilizando el password de la llave SSH o si lo dejamos en blanco tan solo con el comando ssh app@myhosting.com.

Instalar Nginx

Para todo lo relacionado con redireccionar y controlar las peticiones entrantes al servidor, es necesario utilizar un proxy reverso, y en este caso, el que generalmente utilizo por su gran popularidad es Nginx. Para instalar Nginx es sencillo solo tenemos que ejecutar el siguiente comando:

sudo apt update
sudo apt install nginx

Hecho esto, se crea una estructura de directorios en la dirección /etc/nginx, donde podemos posteriormente agregar nuestras configuración personalizadas. Para comprobar que Nginx se instaló y está correctamente funcionando, pueden abrir en un navegador, el ip del hosting y deben obtener una respuesta como la siguiente:

Nginx example

Configurar certbot en el hosting

Uno de los problemas con los que más me enfrenté al principio, fue el tema de los certificados SSL para el hosting. Existen muchas empresas que proveen este servicio por poco dinero, pero yo siempre trato de buscar la solución más fácil y más económica en cada caso. Por este motivo en un inicio utilicé servicios como https://letsencrypt.org/. Mi búsqueda terminó cuando un amigo me comentó sobre certbot.

Certbot es un software opensource que permite automatizar los certificados SSL de Let´s encrypt. Primer punto a favor, no nos cuesta un centavo, segundo punto a favor, certbot se encarga de renovar los certificados cuando están a punto de expirar. Todo esto se traduce, en que sin gastar un peso dejamos de preocuparnos para toda la vida de los certificados SSL.

Instalar certbot y configurarlo es bien sencillo, en su sitio web tienen documentación de cómo configurarlo en casi cualquier sistema operativo. En mi caso utilizo ubuntu, así que los pasos son los siguientes:

# instalar snap
$ sudo apt install snapd

# actualizar snap
sudo snap install core; sudo snap refresh core

Con snap instalado, ya podemos instalar certbot

sudo snap install --classic certbot

Crear los enlaces a certbot

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Una vez que certbot está instalado y configurado correctamente, solo resta integrarlo con las configuraciones de nginx. En mi caso preparé un sencillo nginx y lo puse en la carpeta /etc/nginx/sites-enabled/nginx.conf. Y dentro del nginx puse la siguiente configuración:

server {
  listen 80;
  server_name myhosting.com;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl;
  server_name myhosting.com;

  location / {
    root /home/app;
    index index.html;
  }
}

Con nginx listo, pues ejecutamos sudo certbot run y siguiendo los pasos de certbot, dejamos que haga la magia. Al terminar certbot, la configuración de nginx que antes hicimos, es modificada por certbot y queda de esta manera:

server {
  if ($host = catreplace.com) {
    return 301 https:// $ host $ request_uri;
  } # managed by Certbot

  listen 80;
  server_name myhosting.com;
}

server {
  listen 443 ssl;
  server_name myhosting.com;

  location / {
    root /home/app;
    index index.html;
  }

  ssl_certificate /etc/letsencrypt/live/catreplace.com/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/catreplace.com/privkey.pem; # managed by Certbot
}

Y listo, abrimos en el navegador la página y veremos como funciona con HTTPS por defecto.

Instalar Docker

Como nunca despliego un proyecto directamente en el hosting, necesito Docker para que se encargue de esto. Por este motivo es una herramienta que tengo que instalar con prioridad en el server. Existen varias maneras de instalar Docker, voy a compartir la que uso yo, pero pueden ir directamente al sitio oficial de Docker y encontrar todas las formas de hacerlo.

Primero se necesitan las siguientes dependencias:

$ sudo apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg \
     lsb-release

Hecho esto, pueden descargarse la llave GPG oficial:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Luego actualizan los sourcelist de linux:

$ echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $ (lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

y ya todo está listo para actualizar e instalar Docker:

$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

Para comprobar que Docker está correctamente instalado, pueden ejecutar docker -v y la respuesta sería algo como: Docker versión 20.10.6, build 370c289. Pero aún falta un detalle, Docker por defecto no tiene privilegios de administración, así que si intentan hacer un docker ps obtendrán un permission denied, para resolver esto, pueden hacer lo siguiente:

$ sudo groupadd docker
$ sudo usermod -aG docker $ USER

Nota: luego de agregar Docker al grupo USERS, tienen que cerrar y volver a abrir la conexión al hosting para que tome los cambios hechos.

Instalar docker-compose

En el caso de docker-compose es mucho más sencillo, solo necesitan descargar el ejecutable:

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose- $ (uname -s)-$ (uname -m)" -o /usr/local/bin/docker-compose

Hecho esto, falta hacerlo ejecutable y ya lo pueden probar:

$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c

Enlaces

Conclusiones

Estas fueron de alguna manera todas las herramientos que utilizo a la hora de configurar por primera vez un hosting. Puede ser que según el stack the tecnologías que utilicen, alguno de lo pasos anteriores se vea afectado, pero de manera general es un buen fundation para comenzar en un hosting nuevo. Espero esta experiencia compartida les sirva para configurar y prepara sus propios servidores.

Happy coding!!!

Opiniones