# Instalación de Servicios Web utilizando herramientas "Red Abya Yala"
La siguiente guía aborda los pasos necesarios para que con pocos recursos y utilizando las herramientas disponibles en [Red Abya Yala](https://abyaya.la), podamos montar una plataforma web autónoma y segura en Internet. Te recomendamos revisar los requerimientos mínimos en esta guía antes llenar nuestro [formulario de inscripción](https://).
## Nota importante sobre los comandos
Los "comandos" son líneas de código que se escriben en el programa "Terminal" de una computadora con el sistema operativo Linux.
Para usar un comando, abrimos el programa "Terminal" y veremos una ventana con fondo negro (a veces blanco) donde podemos escribir un comando por línea. Funciona un poco distinto a un editor de texto, con lo que podemos sorprendernos. Por ejemplo, presionar Enter para escribir un salto de línea "envía" el comando, independientemente de donde esté el cursor en la línea. Si usamos las flechas arriba y abajo, podemos revisar comandos anteriores y modificarlos para volver a enviarlos. Es importante tomar nota del resultado de cada comando, porque nos informan de qué cosas sucedieron como resultado, aunque algunos comandos no dan ningún resultado.
La mayoría de los comandos que damos de ejemplo en esta guía pueden copiarse y pegarse. Nos gustaría que hagan el intento de escribirlos, para que puedan familiarizarse con su "sintaxis", es decir la forma en que se generan oraciones que tienen sentido para la computadora que interpreta nuestros comandos.
:::warning
Algunos comandos necesitan adaptación, marcamos las palabras que necesitan modificacion con <font color="#f00">MAYÚSCULA Y EN COLOR ROJO</font>.
También lean las indicaciones en los <span style="color: darkblue;"> **#comentarios**, para que no se pierdan nada.
:::
## Requerimientos mínimos
Para poder llevar a cabo nuestro objetivo, requeriremos de los siguientes materiales.
:::info
Una **Computadora** (física o [virtual](https://)) para alojar los servicios, nuestro servidor como tal.
- Procesador 2 Ghz 2GB RAM
- Sistema Operativo [Ubuntu Server](https://)
Una red con **Acceso a Internet**
- De preferencia [conexión simétrica](https://)
- De preferencia conexión de [fibra óptica](https://)
**Acceso a Suministro Eléctrico Estable**
- Lo ideal es que un servidor funcione las 24 horas, por ello es importante contar con un suministro eléctrico constante. Utilizar energía solar no es una mala idea.
- Un [regulador de voltaje](https://) o [no-break](https://) es altamente recomendable para evitar picos de energía y con ello daños al equipo.
**Espacio Físico adecuado**
- En tu servidor estará almacenada toda tu información por lo que es importante que lo coloques en un lugar seguro y dónde no sufra[ riesgos de pérdida](https://).
- Es importante que el ambiente esté lo más fresco y seco posible, para evitar el [polvo y la humedad](https://) en nuestros equipos.
**Computadora Personal** (Terminal de trabajo)
- Con acceso a Internet
- Sistema Operativo GNU/Linux con SSH de preferencia (si usas Windows, revisa esta [información](https://))
:::
## Preparando el Servidor
Necesitaremos una computadora que utilizaremos como nuestro **servidor**, ya sea física o virtual debe contar con acceso a internet. En ella instalaremos un Sistema Operativo [Ubuntu Server](https://). Una vez acabada la instalación del SO ingresaremos con la usuaria sudo que hemos creado durante la instalación
- Lo primero será averiguar que dirección IP tiene asignada la computadora. Anotemos esa información en algún lado ya que nos será útil posteriormente.
```bash
hostname -I
```
- Para poder conectarnos remotamente, sin necesidad de teclado y monitor en el servidor, comprobamos que tengamos instalado SSH con
```bash
sudo systemctl status ssh
```
Si no tienes instalado ssh puedes hacerlo con el siguiente comando:
```
sudo apt install openssh-server
```
Con estos pasos ya hemos averiguado la ip de nuestro servidor. Ella nos servirá para que nos conectemos remotamente y hagamos todas las instalaciones de los servicios que queremos poner en línea. También nos hemos asegurado que SSH está instalado en la máquina.
Ya podemos ubicar el **servidor** en su sitio físico que hemos escogido, recordando que sea un espacio con las condiciones necesarias (electricidad, internet, clima). No es necesario que tenga monitor y teclado conectados a partir de ahora! Aunque siempre viene bien para poder resolver problemas sin acceso a la red.
## Preparando la Terminal de Trabajo
Ahora nos cambiamos de equipo y comenzaremos a trabajar en la **Terminal de Trabajo**, que es la computadora personal que utilizaremos para controlar remotamente nuestro servidor. Como dijimos anteriormente en indudablemente mejor contar para esta labor con un sistema operativo GNU/Linux en esta computadora.
### Intercambiar llaves SSH
Si bien Abra será nuestra herramienta principal para comunicarnos y controlar el servidor, utiliza **SSH** para la comunicación remota.
Por ello haremos algunas modificaciones en SSH (programa que viene pre instalado en Ubuntu Server) para utilizar una comunicación más segura a través de **llaves de cifrado**.
- Comenzamos generando nuestro par de Llaves de Cifrado con
```bash
ssh-keygen -t ed25519
```
Aceptamos todas las opciones dando click en `ENTER`
- Ahora podemos revisar las llaves SSH que tenemos en nuestra computadora escribiendo
```
ls .ssh
```
Ahí veremos el archivo `id_ed25519` (tu llave privada que no compartes) y el `id_ed25519.pub` (la llave pública que compartes con los demás).
- Procedemos a copiar nuestra llave pública en el servidor remoto, donde `USUARIA` es el nombre de usuaria que elegimos durante la instalación e `IP_DEL_SERVIDOR` la dirección IP que vimos antes con `hostname -I`
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
ssh-copy-id <span style="color: red;">USUARIA</span>@<span style="color: red;">IP_DEL_SERVIDOR</span>
</pre>
Nos pedirá la contraseña sudo de la usuaria del servidor
- Ahora podemos logearemos remotamente a nuestro servidor con el siguiente comando, comprobemos que funcione
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
ssh <span style="color: red;">USUARIA</span>@<span style="color: red;">IP_DEL_SERVIDOR</span>
</pre>
Si todo funciona, hemos intercambiado correctamente entre ambas computadoras sus **llaves de cifrado** por lo que podrán comunicarse de forma más segura. Continuemos con la guía.
## Instalación de la red Común
Red Común un tipo de red especial que usan todas las computadoras ("nodos") de la Red Abya Yala. Permite la comunicación de forma segura y que las plataformas web instaladas en los nodos sean visibles al Internet, **sin tener que configurar el enrutador de nuestra conexión o aunque nuestro proveedor de internet (ISP) no nos permita la apertura de puertos**. Técnicamente se conoce como una VPN, pero es un tipo distinto al que quizás conozcamos.
Dentro de la red Común, cada nodo tiene una dirección IP dentro del rango `10.13.12.0/24` es decir que las direcciones van desde el `10.13.12.1` hasta el `10.13.12.255` (255 nodos!). Esto es un rango de direcciones IP **privado** es decir que no son accesibles a computadoras fuera de la red común.
Es necesario para poder ser parte de red Común, pasar por un proceso de aprobación. Una vez que crees tus nodos, ponte en contacto con nosotres para que revisemos tu aplicación y te demos acceso a la red. Sin esto, los servicios públicos no funcionarán!
### Instalación VPN
Los pasos que vienen a continuación deben ser ejecutados en el **servidor** como también en la **terminal de trabajo**. En esta sección descargaremos la VPN y nos daremos de alta en ella, por ello es importante que este proceso lo hagamos en ambos equipos, así nos aseguramos la comunicación entre ellos.
En esta guía te encontrarás algunos comandos que requieren modificaciones, adaptándose a las necesidades de cada nodo. Cuando en algún comando veamos `PALABRAS EN MAYÚSCULAS`, quiere decir que esa sección del comando debe ser ajustada a tus necesidades.
Por ejemplo cuando aparezca algo como `NOMBRE_DEL_NODO`, ahí debes colocar el nombre escogido para tu nodo.
Es importante que a la hora de elegir el nombre del nodo, escogas uno distinto para el servidor y para la terminal de trabajo, es decir **dos nombres distintos**!
Como sugerencia, el nombre del nodo servidor puede ser el nombre de la organización (por ejemplo `sutty`) y el nombre de la terminal, el mismo nombre con un indicador de terminal (por ejemplo `suttyterminal`).
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
<span style="color: darkblue;"># Solo para instalar la red comun en el servidor, ignoramos este comando en la terminal de trabajo</span>
<span style="color: grey;">1 |</span> ssh <span style="color: red;">USUARIA</span>@<span style="color: red;">IP_DEL_SERVIDOR</span>
<span style="color: darkblue;"># Instalar los programas necesarios</span>
<span style="color: grey;">2 |</span> sudo apt install git rsync tinc dhcpcd5 -y
<span style="color: darkblue;"># Descargar el gestor de la red común</span>
<span style="color: grey;">3 |</span> git clone https://git.coopcloud.tech/escuela-comun/rap
<span style="color: darkblue;"># Ingresar a la carpeta creada</span>
<span style="color: grey;">4 |</span> cd rap
<span style="color: darkblue;"># Crear el nodo, el nombre del nodo puede ser cualquier palabra, para el nombre del servidor, podemos usar el nombre de nuestra organización, para el de la terminal de trabajo, el mismo nombre más terminal</span>
<span style="color: grey;">5 |</span> NETWORK=comun ./rap init <span style="color: red;">NOMBRE_DEL_NODO</span>
<span style="color: darkblue;"># Veremos una lista de cosas sucediendo y una confirmación de que todo salió bien</span>
</pre>
:::success
Recibiremos automáticamente la información de tu nodo, pero ahora debes contactarnos completando el siguiente [formulario de aplicación](https://nube.yanapak.abyaya.la/apps/forms/s/AzP9QbY8JKGTHKsWNcofxr5s) para que podamos darte de alta en la VPN Común.
Nos contactaremos con ustedes a la brevedad.
:::
Al darse de alta, podrás conocer tu número IP de la red Común con el siguiente comando:
```
ip a show comun
```
y veremos algo así:
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
comun: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
link/ether 5b:16:a8:4b:2p:7b brd ff:ff:ff:ff:ff:ff
inet <span style="color: blue;">10.13.12.254</span>/24 brd 10.13.12.255 scope global noprefixroute comun
valid_lft forever preferred_lft forever
inet6 fe60::1c23:5623:1f4:2c68/64 scope link
valid_lft forever preferred_lft forever
inet6 fe40::3c94:b5ff:fe7f:2b5a/64 scope link
valid_lft forever preferred_lft forever
</pre>
Nuestra IP válida dentro de la VPN Común será una similar a la que está destacada
## Instalación de Herramientas Abya Yala
Dejamos nuestro servidor a un lado y de ahora en adelante trabajaremos todo desde nuestra **terminal de trabajo**. En ella instalaremos un set de aplicaciones (Herramientas Abya Yala) que nos permitirán comunicarnos con el servidor, instalar y controlar todas las aplicaciones necesarias para desplegar los servicios en ella.
La idea es manejar remotamente todo lo correspondiente al servidor para que éste pueda estar en un lugar seguro y nosotras trabajar desde un lugar cómodo.
### Instalar Abra
Iniciamos instalando Abra en nuestra computadora personal, a través de ella daremos todas las instrucciones remotas a nuestro servidor
- En la terminal escribimos (este comando se puede copiar y pegar)
```
curl https://install.abra.coopcloud.tech | bash
```
- Al finalizar la instalación de Abra nos pide que hagamos una modificación para poder ejercutarlo con la palabra `abra`. Para ello debemos ingresar en la terminal la línea que nos entrega el mismo mensaje (este comando se puede copiar y pegar)
```nash=
echo 'export PATH=$HOME/.local/bin:$PATH' >> $HOME/.bashrc
source ~/.bashrc
```
- Ahora comprobemos que se instaló Abra correctamente escribiendo en la terminal
```
abra
```
- Ahora instalaremos complementos para que Abra tenga funciones adicionales (estos comandos se pueden copiar y pegar línea por línea)
```nash=
abra autocomplete bash
sudo mkdir -p /etc/bash_completion.d/
sudo cp $HOME/.abra/autocompletion/bash /etc/bash_completion.d/abra
echo "source /etc/bash_completion.d/abra" >> ~/.bashrc
source ~/.bashrc
```
- Y finalmente comprobaremos que el complemento este en funcionamiento, escribiendo nuevamente
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
<span style="color: grey;">1 |</span> abra <span style="color: darkblue;"># presionar tecla TAB dos veces
# si aparece esto es porque el autocompletado funcionó y podemos escribir una parte del texto y autocompletarla presionando tab por cada palabra</span>
app autocomplete catalogue recipe server upgrade
</pre>
Ahora podemos conocer fácilmente qué comandos se pueden ejecutar en Abra.
### Instalar Docker
Una vez dentro del servidor de manera remota *a través de SSH con llaves de cifrado*, procederemos a instalar Docker. Este programa es la herramienta de virtualización que estamos usando para los despliege de los servicios.
- Por SSH en el servidor remoto escribimos
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
<span style="color: grey;">1 |</span> ssh <span style="color: red;">USUARIA</span>@<span style="color: red;">IP_DEL_SERVIDOR</span>
<span style="color: grey;">2 |</span> wget -O- https://get.docker.com | bash
</pre>
Nos pedirá nuestra contraseña sudo
- Una vez finalizada la instalación damos acceso a nuestra usuaria al grupo Docker
```
sudo usermod -aG docker $USER
```
Después de esto cerramos la conexión y abriremos una nueva para que los cambios sobre la usuaria se afecten.
- Para ello cerramos la sesión actual
```
exit
```
- y volvemos a acceder remotamente con
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
ssh <span style="color: red;">USUARIA</span>@<span style="color: red;">IP_DEL_SERVIDOR</span>
</pre>
Con esto hemos iniciado una nueva sesión.
- Una vez dentro iniciamos docker swarm
```bash=
docker swarm init
docker network create -d overlay proxy
```
Con esto ya hemos dejado Docker intalado y preparado en el servidor remoto. Ya podemos volver a nuestra estación de trabajo local
- cerramos sesión con
```
exit
```
### Agregar nodo con Abra
En este momento, el **servidor** y la **terminal de trabajo** tienen una dirección IP de la **red Común** pero no hay una relación entre las dos, así que las vincularemos. Primero necesitaremos conocer cuál es el número IP común del servidor, para logeados remotamente en el servido, escribimos:
```
ip a show comun
```
Anotamos la dirección ip que será `10.13.12.X` y terminamos la sesión remota:
```
exit
```
Ahora, en la terminal de trabajo, agregamos los registros necesarios para asociar un dominio al número IP del servidor:
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
<span style="color: grey;">1 | </span>echo "<span style="color: red;">IP_COMUN_SERVIDOR NOMBRE_DEL_NODO</span>.comun" | sudo tee -a /etc/hosts
<span style="color: grey;">2 | </span>echo -e "Host<span style="color: red;"> NOMBRE_DEL_NODO</span>.comun\n User <span style="color: red;">USUARIA_DEL_SERVIDOR</span>" >> ~/.ssh/config
</pre>
Con este paso, podemos contactar al servidor por su nombre, además de por su IP. Y `abra` también Probemos esta función ingresando remotament al servidor con:
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
ssh <span style="color: red;">NOMBRE_DEL_NODO</span>.comun
</pre>
Si logramos ingresar al servidor quiere decir que está todo bien, podemos salir de ella
```
exit
```
Una vez de vuelta a nuestra computadora personal, procederemos a agregar el nodo (servidor) que tenemos a disposición al listado de servidores manejados por Abra.
- Para ello
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
abra server add <span style="color: red;">NOMBRE_DEL_NODO</span>.comun
</pre>
- Comprobemos que se agregó a la lista con
```
abra server ls
```
y deberíamos ver algo como lo siguiente
```
+-----------------+------------------+---------+------+
| NAME | HOST | USER | PORT |
+-----------------+------------------+---------+------+
| NOMBRE_DEL_NODO | NOMBRE_DEL_NODO | usuaria | 22 |
+-----------------+------------------+---------+------+
```
Con estos pasos ya tenemos dado de alta nuestro nodo en el listado de servidores que vamos a manejar con Abra.
### Instalar Traefik
Ahora que el servidor está agregado en abra, pasemos a instalar en él **Traefik**. Este programa controlará todo lo que tenga que ver con el tráfico de red de nuestro nodo.
En nuestra **terminal de trabajo** escribimos
```
abra app new traefik
```
Nos va a realizar preguntas (en inglés), las líneas que empiezan con `?` son la pregunta y con `>` nuestra respuesta.
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
? Select app server:
> <span style="color: red;">NOMBRE_DEL_NODO</span>
? Specify app domain
> traefik.<span style="color: red;">NOMBRE_DEL_NODO</span>.abyaya.la
</pre>
Ahora configuramos Traefik
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
EDITOR=nano abra app config traefik.<span style="color: red;">NOMBRE_DEL_NODO</span>.abyaya.la
</pre>
- se abrirá un editor de texto `nano` donde configuramos lo siguiente buscando las líneas que empiezan con `#` (numeral) para denotar comentarios y las "descomentamos" eliminandolo
Por ejemplo:
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
<span style="color: darkblue;">#esto es un comentario</span>
esto ya no es un comentario
</pre>
Buscamos las líneas que dicen `LETS_ENCRYPT_ENV=production` y las cambiamos por el texto de la primera línea del ejemplo a continuación, luego eliminamos el `#` al principio de las líneas siguientes. La información debería quedar así:
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
LETS_ENCRYPT_ENV=<span style="color: red;">staging</span>
WILDCARDS_ENABLED=1
SECRET_WILDCARD_CERT_VERSION=v1
SECRET_WILDCARD_KEY_VERSION=v1
COMPOSE_FILE="$COMPOSE_FILE:compose.wildcard.yml"
</pre>
Guardamos presionando `Ctrl` + `O`, `ENTER` y salimos presionando `Ctrl` + `X`, `ENTER`
Ahora procederemos a activar los **certificados SSL** en Traefik, éstos permitirán que toda la comunicación efectuada entre la plataforma y sus usuarias este encriptada.
#### Certificados internos
Para poder asegurar la conectividad entre nuestro nodo y el servidor proxy de Abya Yala, necesitamos emitir certificados SSL/TLS internos.
En la terminal de trabajo:
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
<span style="color: darkblue;"># Instalar las dependencias</span>
<span style="color: grey;">1 | </span>sudo apt install --no-install-recommends gnutls-bin make git
<span style="color: darkblue;"># Descargar el emisor de certificados internos</span>
<span style="color: grey;">2 | </span>git clone https://git.coopcloud.tech/escuela-comun/certificados.git ~/certificados
<span style="color: darkblue;"> Ingresar al directorio</span>
<span style="color: grey;">3 | </span>cd ~/certificados
<span style="color: darkblue;"># Generar un certificado y asignárselo a Traefik</span>
<span style="color: grey;">4 |</span>make coopcloud domain=<span style="color: red;">NOMBRE_DEL_NODO</span>.abyaya.la
</pre>
Recibiremos una información de confirmación y podemos seguir con la instalación de Traefik.
Si ya has desplegado un nodo antes con esa misma terminal, en vez de descargar el respositorio nuevamente, ingresa a la carpeta `/sutty.local` y ejecuta
```
git pull
```
Con ello actualizarás el repositorio y podrás pasar directo al último comando:
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
make coopcloud domain=<span style="color: red;">NOMBRE_DEL_NODO</span>.abyaya.la
</pre>
#### Despliegue de Traefik
Ya que tenemos todo listos y los certificados SSL asignados, procedemos a desplegar Traefik en el servidor.
<pre style="color: black; background-color: #f5f5f5; padding: 10px;">
abra app deploy -D traefik.<span style="color: red;">NOMBRE_DEL_NODO</span>.abyaya.la
</pre>
Al finalizar, el servicio de traefik que controlará las comunicaciones de nuestros servicios debería estar disponible en la dirección web:
<https://traefik.NOMBRE_DEL_NODO.abyaya.la>
:::warning
Atención: Este paso solo va a funcionar cuando seas parte de VPN Común!
:::
Finalizando estos pasos hemos instalado y configurado todas las herramientas necesarias, *tanto en nuestra computadora personal como en el servidor*, que nos permitirán de ahora en adelante, desplegar fácilmente cualquiera de las recetas disponible en nuestro [repositorio de recetas](https://).
---
---