# Instalación manual: WebFig y Winbox

Instala el agente desde los menús de WebFig o Winbox del router, formulario a formulario y sin la CLI; después arráncalo, compruébalo y retíralo.

Source: https://jmrplens.github.io/mikroscope/es/install/manual-gui/

Instala el agente desde los menús del propio router, sin un ordenador que ejecute la CLI. Cada paso
es un formulario: su menú, los campos que hay que rellenar y el formulario tal como queda relleno.
Los valores son los que escribe `mikroscope install`, así que `mikroscope status`, `upgrade` y
`uninstall` tratan el resultado como suyo. Winbox tiene los mismos menús y campos que WebFig,
aunque ninguna instalación se ha hecho en Winbox ([sin probar](https://jmrplens.github.io/mikroscope/es/about/status/#not-tested));
las capturas, y la instalación de la que salen, son de WebFig
([Probado en](https://jmrplens.github.io/mikroscope/es/about/status/#install-routes-tested)).

## Antes de empezar

- El router tiene RouterOS 7.24 o posterior, el paquete `container` y el modo de dispositivo con los
  contenedores activados: [Requisitos](https://jmrplens.github.io/mikroscope/es/install/prerequisites/). El modo de
  dispositivo no tiene página en WebFig; es una orden del terminal
  ([Modo de dispositivo](https://jmrplens.github.io/mikroscope/es/install/prerequisites/#device-mode-containeryes)).
- Para las pertenencias a listas: la lista de interfaces y la lista de direcciones por las que
  descarta tu firewall (`LAN` y `LANs` en la configuración por defecto de MikroTik):
  [Listas del firewall](https://jmrplens.github.io/mikroscope/es/install/firewall/).
- Para el tar de la imagen: el tar de la arquitectura del router, renombrado `mikroscope.tar`
  ([Instalación sin conexión](https://jmrplens.github.io/mikroscope/es/install/offline/#choose-the-image-tar) nombra cada uno).

Los pasos usan los valores por defecto de abajo. Para cambiar uno, cámbialo en cada paso donde
aparece, el manifiesto incluido.
[Instalación manual: terminal](https://jmrplens.github.io/mikroscope/es/install/manual-cli/#before-you-start) lista cada
valor y cómo se derivan de él los demás.

| Valor                                  | Por defecto                                                              |
| -------------------------------------- | ------------------------------------------------------------------------ |
| Etiqueta, el Comment de cada objeto    | `mikroscope:mikroscope (managed by mikroscope)`                          |
| veth                                   | `veth-mikroscope`                                                        |
| Dirección del router                   | `172.30.10.1/30`                                                         |
| Dirección y puerto del agente          | `172.30.10.2/30`, `9123`                                                 |
| Envlist                                | `mikroscope-env`                                                         |
| Root dir                               | `mikroscope/mikroscope`                                                  |
| Manifiesto                             | `mikroscope/mikroscope.manifest.txt`                                     |
| Imagen, descarga del registro          | `registry-1.docker.io/jmrplens/mikroscope-agent:1.6.1` |
| Imagen, tar                            | `mikroscope.tar`                                                         |

Deja la etiqueta tal cual, carácter a carácter: es como la CLI reconoce cada objeto como de la
instalación.

**Entra.** Abre `http://<dirección del router>/` y entra con un usuario administrador. Después elige
**Advanced** arriba: los pasos usan el árbol de menús completo, que Quick Set oculta.

*La página de acceso de WebFig: Login admin, el campo Password vacío y el botón Login.*

**Rellenar un formulario.** Un campo que solo muestra un botón **+** está sin valor: pulsa **+**
para abrirlo. Cuando RouterOS rechaza un objeto, el formulario sigue abierto con el motivo bajo sus
botones.

> **El terminal, para dos ajustes**
>
> Dos ajustes no tienen campo en WebFig: el modo de dispositivo e `ignore-remote-image-change`
> ([verificado](https://jmrplens.github.io/mikroscope/es/about/status/#verified-webfig-no-ignore-remote-image-change)). Ponlos en **Terminal**, arriba en WebFig, o en
> **New Terminal** en Winbox. Si el terminal pregunta si quieres ver la licencia del software,
> contesta primero: lo que escribas antes del prompt `] >` va a esa pregunta.

## Escribir el manifiesto

El manifiesto lista cada objeto que crean los pasos siguientes, para que `mikroscope uninstall`
los encuentre todos.

**Files** › **New** › **Text File**:

| Campo    | Valor                                                 |
| -------- | ----------------------------------------------------- |
| Name     | `mikroscope/mikroscope.manifest.txt`                  |
| Contents | las líneas de abajo, las del origen de imagen que uses |

- **Descarga del registro**

  ```text
  mikroscope-manifest=1
  name=mikroscope
  tag=mikroscope:mikroscope (managed by mikroscope)
  disk=
  veth=veth-mikroscope
  subnet=172.30.10.0/30
  port=9123
  iface-list=LAN
  addr-list=LANs
  expose=
  container-name=
  remote-image=registry-1.docker.io/jmrplens/mikroscope-agent:1.6.1
  token=no
  dir=mikroscope
  file=mikroscope/mikroscope.manifest.txt
  object=/interface/veth name=veth-mikroscope
  object=/ip/address interface=veth-mikroscope
  object=/interface/list/member interface=veth-mikroscope list=LAN
  object=/ip/firewall/address-list list=LANs address=172.30.10.0/30
  object=/container/envs list=mikroscope-env
  object=/container interface=veth-mikroscope
  dir=mikroscope/mikroscope
  ```

- **Tar de la imagen**

  ```text
  mikroscope-manifest=1
  name=mikroscope
  tag=mikroscope:mikroscope (managed by mikroscope)
  disk=
  veth=veth-mikroscope
  subnet=172.30.10.0/30
  port=9123
  iface-list=LAN
  addr-list=LANs
  expose=
  container-name=
  remote-image=
  token=no
  dir=mikroscope
  file=mikroscope/mikroscope.manifest.txt
  object=/interface/veth name=veth-mikroscope
  object=/ip/address interface=veth-mikroscope
  object=/interface/list/member interface=veth-mikroscope list=LAN
  object=/ip/firewall/address-list list=LANs address=172.30.10.0/30
  file=mikroscope.tar
  object=/container/envs list=mikroscope-env
  object=/container interface=veth-mikroscope
  dir=mikroscope/mikroscope
  ```

Si te saltas una pertenencia a lista, escribe `none` tras su `iface-list=` o `addr-list=` y quita su
línea `object=`. OK crea el directorio `mikroscope` junto con el archivo.
[Script de RouterOS](https://jmrplens.github.io/mikroscope/es/install/script/#install-manifest) explica cada línea.

*Files › New File: Name mikroscope/mikroscope.manifest.txt y, en Contents, el manifiesto, desde mikroscope-manifest=1 hasta dir=mikroscope/mikroscope.*

*Files tras OK: el nuevo directorio mikroscope y dentro mikroscope/mikroscope.manifest.txt.*

## Crear la veth

**Interfaces** › **VETH** › **New**:

| Campo   | Valor                                           |
| ------- | ----------------------------------------------- |
| Comment | `mikroscope:mikroscope (managed by mikroscope)` |
| Name    | `veth-mikroscope`                               |
| Address | `172.30.10.2/30`                                |
| Gateway | `172.30.10.1`                                   |

Deja el resto como está.

*Interfaces › New Interface de tipo VETH: Comment es la etiqueta de mikroscope, Name veth-mikroscope, Address 172.30.10.2/30 y Gateway 172.30.10.1.*

*La pestaña VETH tras OK: veth-mikroscope, con la etiqueta de mikroscope como comentario.*

## Añadir la dirección

**IP** › **Addresses** › **New**:

| Campo     | Valor                                           |
| --------- | ----------------------------------------------- |
| Comment   | `mikroscope:mikroscope (managed by mikroscope)` |
| Address   | `172.30.10.1/30`                                |
| Interface | `veth-mikroscope`                               |

*IP › Addresses › New Address: la etiqueta de mikroscope como Comment, Address 172.30.10.1/30 e Interface veth-mikroscope.*

*IP › Addresses tras OK: 172.30.10.1/30 en veth-mikroscope junto a las direcciones propias del router.*

## Añadir las pertenencias a listas

Opcional. Dejan pasar las respuestas del agente por las reglas raw del firewall que descartan por
lista de interfaces o por lista de direcciones. Una pertenencia no se limita a mikroscope:
cualquier otra regla que coincida con la lista coincide también con la veth o con el /30
([Listas del firewall](https://jmrplens.github.io/mikroscope/es/install/firewall/)).

**Interfaces** › **Interface List** › **New**:

| Campo     | Valor                                           |
| --------- | ----------------------------------------------- |
| Comment   | `mikroscope:mikroscope (managed by mikroscope)` |
| List      | `LAN`                                           |
| Interface | `veth-mikroscope`                               |

*Interfaces › Interface List › New Interface List Member: List LAN, Interface veth-mikroscope y la etiqueta de mikroscope como Comment.*

*La pestaña Interface List tras OK: veth-mikroscope es miembro de LAN.*

**IP** › **Firewall** › **Address Lists** › **New**:

| Campo   | Valor                                           |
| ------- | ----------------------------------------------- |
| Comment | `mikroscope:mikroscope (managed by mikroscope)` |
| List    | `LANs`                                          |
| Address | `172.30.10.0/30`                                |

*IP › Firewall › Address Lists › New: List LANs, Address 172.30.10.0/30 y la etiqueta de mikroscope como Comment.*

*La pestaña Address Lists tras OK: 172.30.10.0/30 en LANs junto al rango LAN del router.*

## Crear la envlist

**Container** › **Envs** › **New**, una vez por entrada, todas con List `mikroscope-env`:

| Key              | Value                                           |
| ---------------- | ----------------------------------------------- |
| `MIKROSCOPE_TAG` | `mikroscope:mikroscope (managed by mikroscope)` |
| `RATE_HZ`        | `10`                                            |
| `BUFFER_S`       | `60`                                            |
| `PORT`           | `9123`                                          |
| `ADDR`           | `172.30.10.2`                                   |
| `MEM_LIMIT_MB`   | `16`                                            |
| `CAPTURE_MB`     | `4`                                             |

`MIKROSCOPE_TAG` es como la CLI sabe que la envlist es de la instalación. Las demás claves son los
ajustes del agente: [Variables de entorno](https://jmrplens.github.io/mikroscope/es/reference/environment/#la-envlist-del-agente).
`MEM_LIMIT_MB` se deriva de la frecuencia y del anillo; el
[Generador de scripts](https://jmrplens.github.io/mikroscope/es/install/generator/) lo calcula para otros valores.

*Container › Envs › New: List mikroscope-env, Key MIKROSCOPE_TAG y la etiqueta de mikroscope como Value.*

*La pestaña Envs con las siete entradas de mikroscope-env: MIKROSCOPE_TAG, RATE_HZ 10, BUFFER_S 60, PORT 9123, ADDR 172.30.10.2, MEM_LIMIT_MB 16 y CAPTURE_MB 4.*

Una entrada `TOKEN` guarda su valor en claro, y WebFig lo muestra en claro en esta lista y en su
formulario ([verificado](https://jmrplens.github.io/mikroscope/es/about/status/#verified-webfig-shows-env-values)). Añádela solo para
[Exponer en la LAN](https://jmrplens.github.io/mikroscope/es/security/expose/), y trata como secreta cualquier pantalla que la
muestre.

## Crear el contenedor

- **Descarga del registro**

  **Container** › **New**:

  | Campo             | Valor                                                                    |
  | ----------------- | ------------------------------------------------------------------------ |
  | Comment           | `mikroscope:mikroscope (managed by mikroscope)`                          |
  | Remote Image      | `registry-1.docker.io/jmrplens/mikroscope-agent:1.6.1` |
  | Root Dir          | `mikroscope/mikroscope`                                                  |
  | Privileged        | marcado                                                                  |
  | Interface         | `veth-mikroscope`                                                        |
  | Envlists          | `mikroscope-env`                                                         |
  | Memory Max        | `64M`                                                                    |
  | Logging           | marcado                                                                  |
  | Start On Boot     | marcado                                                                  |
  | Restart Policy    | `on failure (non 0 exit code)`                                           |
  | Restart Interval  | `00:00:10`                                                               |
  | Restart Max Count | `5`                                                                      |

  Deja Name vacío: RouterOS nombra el contenedor a partir de la imagen. OK empieza la descarga: el
  router descarga la imagen de su propia arquitectura, así que necesita llegar al registro y tener
  sitio para las capas.

  *Container › New Container, parte superior del formulario: la etiqueta de mikroscope como Comment, Remote Image registry-1.docker.io/jmrplens/mikroscope-agent con la etiqueta de la versión y Root Dir mikroscope/mikroscope.*

  *El mismo formulario más abajo: Privileged marcado, Interface veth-mikroscope y Envlists mikroscope-env.*

  *La parte inferior del formulario: Memory Max 64M, Logging y Start On Boot marcados, Restart Policy on failure, Restart Interval 10 s y Restart Max Count 5.*

  Espera a `download/extract done` en **Log**. Entonces la fila está lista para arrancar, y aún no
  lleva la marca `R`.

  *La pestaña Container al terminar la descarga: una fila, con la etiqueta como Comment, su root dir, veth-mikroscope y mikroscope-env, y sin la marca R.*

- **Tar de la imagen**

  1. **Files** › **Upload…**, y elige `mikroscope.tar`. Queda en la raíz del almacenamiento del
     router.

        *Files tras Upload…: mikroscope.tar en la raíz del almacenamiento del router, junto al directorio mikroscope que guarda el manifiesto.*

  2. **Container** › **New**, con los campos de la descarga del registro pero **File**
     `mikroscope.tar` en lugar de Remote Image:

        *Container › New Container para el tar de la imagen: File mikroscope.tar en lugar de Remote Image, y Root Dir mikroscope/mikroscope.*

  3. Espera a `download/extract done` en **Log**.

        *La pestaña Container con el tar ya extraído: una fila, con la etiqueta como Comment, su root dir, veth-mikroscope y mikroscope-env, y sin la marca R.*

  Conserva el tar hasta terminar el paso siguiente.

### Poner ignore-remote-image-change

En el terminal, pon `ignore-remote-image-change` y nombra `restart-policy` en la misma orden: un
`/container/set` que no nombra `restart-policy` la devuelve a `always`
([verificado](https://jmrplens.github.io/mikroscope/es/about/status/#verified-container-set-resets-restart-policy)).

```routeros
/container/set [find comment="mikroscope:mikroscope (managed by mikroscope)"] ignore-remote-image-change=yes restart-policy=on-failure
:put [/container/get [find comment="mikroscope:mikroscope (managed by mikroscope)"] ignore-remote-image-change]
:put [/container/get [find comment="mikroscope:mikroscope (managed by mikroscope)"] restart-policy]
```

Las dos lecturas imprimen `true` y `on-failure`. `install` lo pone con los dos orígenes de imagen:
sin él, RouterOS para y borra el contenedor por su cuenta en cuanto se borra el tar, y lo vuelve a
crear minutos después.

*El Terminal de WebFig: /container/set con ignore-remote-image-change=yes y restart-policy=on-failure, y dos lecturas que imprimen true y on-failure.*

Con el tar de la imagen, bórralo ahora: **Files**, selecciona `mikroscope.tar`, **Remove**.

*Files con mikroscope.tar seleccionado, antes de Remove: la imagen ya está extraída y el tar sobra.*

## Arrancar y verificar

1. **Container**, selecciona la fila y después **Start** en el panel Actions.

      *La pestaña Container con la fila de mikroscope seleccionada y Start en el panel Actions.*

   La fila recibe la marca `R` (en marcha).

      *La pestaña Container tras Start: el contenedor mikroscope en marcha.*

2. **Log**, con **Filter** activado y Topics contains `container`: el registro termina con
   `*** started /mikroscope-agent` y la línea propia del agente.

      *Log, filtrado por container: la descarga terminando y el contenedor arrancando.*

3. En el terminal, pregunta al agente desde el router:

   ```routeros
   :put ([/tool/fetch url="http://172.30.10.2:9123/healthz" output=user as-value]->"data")
   ```

   Imprime `{"ok":true,…}`.

      *El Terminal de WebFig: /tool/fetch de `http://172.30.10.2:9123/healthz`, y la primera fila de la respuesta del agente, que empieza por "ok":true.*

Desde un ordenador de la LAN del router, `curl http://172.30.10.2:9123/healthz` responde lo mismo,
y `mikroscope status --router …` lista cada objeto de la instalación
([Acceso por red](https://jmrplens.github.io/mikroscope/es/install/reaching-the-agent/) si no responde).

## Retirar

Desde un ordenador con la CLI, `mikroscope uninstall --router … --yes` lee el manifiesto, retira
todo lo que han creado los pasos de arriba y comprueba que no queda nada
([Actualizar y desinstalar](https://jmrplens.github.io/mikroscope/es/install/upgrade/#uninstall)). Desde los menús, retira en este orden:

1. **Container**: selecciona la fila, **Stop** en el panel Actions, espera a que desaparezca la
   marca `R` y después **Remove**. RouterOS borra el root dir, `mikroscope/mikroscope`, con el
   contenedor; si Files aún lo lista, bórralo también ahí.

      *La pestaña Container con la fila parada de mikroscope seleccionada, antes de Remove.*

2. **Container** › **Envs**: selecciona las siete entradas de `mikroscope-env`, **Remove**.

      *La pestaña Envs con las siete entradas de mikroscope-env seleccionadas, antes de Remove.*

3. **IP** › **Firewall** › **Address Lists**: la entrada `172.30.10.0/30`, **Remove**.
4. **Interfaces** › **Interface List**: el miembro `veth-mikroscope`, **Remove**.
5. **IP** › **Addresses**: `172.30.10.1/30`, **Remove**.
6. **Interfaces** › **VETH**: `veth-mikroscope`, **Remove**.
7. **Files**: `mikroscope/mikroscope.manifest.txt`, **Remove**; después el directorio `mikroscope`,
   si no contiene nada más.

      *Files con mikroscope/mikroscope.manifest.txt seleccionado, antes de Remove: el root dir del contenedor se fue con el contenedor, y el directorio mikroscope se borra cuando queda vacío.*

Un tar que haya quedado de una extracción sin terminar también se va: **Files**, `mikroscope.tar`,
**Remove**.

## Véase también

- [Instalación manual: terminal](https://jmrplens.github.io/mikroscope/es/install/manual-cli/): los mismos objetos como
  órdenes.
- [Generador de scripts](https://jmrplens.github.io/mikroscope/es/install/generator/): las órdenes con tus valores, en un
  solo script.
- [Métodos de instalación](https://jmrplens.github.io/mikroscope/es/install/routes/): las demás formas de instalar, con un
  script entre ellas.
- [Almacenamiento y ajustes del contenedor](https://jmrplens.github.io/mikroscope/es/install/layout/): qué hace cada ajuste del contenedor.
- [Listas del firewall](https://jmrplens.github.io/mikroscope/es/install/firewall/): cuándo hacen falta las pertenencias a
  listas.
- [Exponer en la LAN](https://jmrplens.github.io/mikroscope/es/security/expose/): llegar al agente en la dirección propia del
  router.
