import Tabs from '@/components/docs/Tabs.astro';
import Steps from '@/components/docs/Steps.astro';
import FileTree from '@/components/docs/FileTree.astro';
import Image from '@/components/docs/Image.astro';
import Alert from '@/components/docs/Alert.astro';
import Details from '@/components/docs/Details.astro';
import Cards from '@/components/docs/Cards.astro';
import Card from '@/components/docs/Card.astro';

<Alert type="note">
  Antes de empezar, asegúrese de que el servidor y los clientes cumplen los [requisitos del
  sistema](/es/platform/v3/requirements).
</Alert>

## Descarga de los archivos de instalación

Puede descargar las imágenes de instalación de la Plataforma IIoT de dos maneras.

<Tabs labels={['Desde un medio externo', 'A través de Internet']}>
  <Fragment slot="panel-0">
    Cuando el servidor no tiene acceso a Internet —por ejemplo, por una política de seguridad
    corporativa— puede instalar la plataforma sin conexión. Las imágenes de instalación se
    transfieren al servidor desde un medio externo.
  </Fragment>
  <Fragment slot="panel-1">
    Cuando el servidor tiene acceso a Internet, las imágenes de instalación se descargan al servidor
    desde un repositorio remoto.
  </Fragment>
</Tabs>

## Pasos de la instalación

<Steps>

### Copie el paquete de datos necesario

Copie el paquete de instalación al servidor (se requieren derechos de administrador):

- Copie el archivo `unicloud.tgz` descargado y la carpeta `images` (el paquete de instalación
  autónomo con las imágenes archivadas) a la carpeta personal del usuario. El archivo contiene
  también los ficheros de configuración `docker-compose.yml` y `.env` (`.env` está oculto, así que
  active la visualización de los archivos ocultos).

<FileTree
  tree={[
    {
      name: 'images',
      children: [
        { name: 'vadtel-nginx-latest.tar.gz' },
        { name: 'vadtel-app-latest.tar.gz' },
        { name: 'anytelemetry-latest.tar.gz' },
        { name: 'pgbouncer-latest.tar.gz' },
        { name: 'vadteljsondaemon-latest.tar.gz' },
        { name: 'logrotate-latest.tar.gz' },
        { name: 'postgres-15.1-alpine.tar.gz' },
        { name: 'redis-6.0.16-alpine.tar.gz' },
        { name: 'vector-latest.tar.gz' },
      ],
    },
  ]}
/>

- Copie los ficheros de configuración a `/opt/vadtelnewweb/`.

- Defina los usuarios y las contraseñas del sistema en el fichero `.env`:

```bash title=".env"
#key
SECRET_KEY_BASE=0356080kcn0ejgk4lwekrf

#DB PGSQL login
PG_APP_USER=ppppp

#DB PGSQL password
PG_APP_PASSWORD= ppppp

#WEB interface login
VADTEL_SUPER_ADMIN_EMAIL=NEED_USERNAME

#WEB interface password
VADTEL_SUPER_ADMIN_PASSWORD=NEED_PASSWORD

#DB PGSQL unicloud login
VADTEL_UNICLOUD_TEST_USERNAME=NEED_USERNAME

#DB PGSQL unicloud password
VADTEL_UNICLOUD_TEST_PASSWORD=NEED_PASSWORD
```

### Instale Docker y Docker Compose

#### En una distribución basada en CentOS

Instale Docker y Docker Compose:

```bash
sudo dnf install docker-ce docker-compose
```

Inicie Docker y habilítelo en el arranque:

```bash
sudo systemctl enable --now docker && systemctl start docker
```

#### En una distribución basada en Debian

Instale Docker y Docker Compose:

```bash
sudo apt update
sudo apt install docker docker-compose
```

### Instale el sistema

Los pasos restantes son los mismos en todos los sistemas operativos. Añada al grupo `docker` el
usuario que ejecutará la aplicación:

```bash
sudo usermod -aG docker ${USER}
```

<Alert type="warning">
  Después de ejecutar este comando, cierre la sesión y vuelva a iniciarla para aplicar los nuevos
  permisos.
</Alert>

Descomprima el archivo `unicloud.tgz` en la carpeta personal del usuario:

```bash
tar -xf unicloud.tgz
```

<FileTree
  tree={[
    {
      name: 'unicloud',
      children: [
        {
          name: 'run',
          state: 'closed',
          children: [{ name: 'db-unicloud', type: 'folder', state: 'closed' }],
        },
        { name: 'remote_install.sh' },
        { name: 'init-db', children: [{ name: 'create_tables.sql' }] },
        { name: 'script_conf.sh' },
        { name: 'docker-compose.yml' },
        {
          name: 'logs',
          state: 'closed',
          children: [
            { name: 'crontab', type: 'folder', state: 'closed' },
            { name: 'vadteljsondaemon', type: 'folder', state: 'closed' },
            { name: 'anytelemetry', type: 'folder', state: 'closed' },
          ],
        },
        { name: 'backups', type: 'folder', state: 'closed' },
        {
          name: 'data',
          state: 'closed',
          children: [{ name: 'db-unicloud', type: 'folder', state: 'closed' }],
        },
        {
          name: 'local-images',
          children: [
            { name: 'pgbouncer.tar.gz' },
            { name: 'postgres.tar.gz' },
            { name: 'vadteljsondaemon.tar.gz' },
            { name: 'anytelemetry.tar.gz' },
            { name: 'logrotate.tar.gz' },
          ],
        },
        { name: 'unicloud.service' },
      ],
    },
  ]}
/>

Abra la carpeta `unicloud` descomprimida en la carpeta personal del usuario y ejecute el script de
instalación:

```bash
sudo ./remote_install.sh
```

Una vez instalado el paquete, abra `/var/lib/unicloud` con privilegios de administrador y cambie el
propietario y el grupo del fichero `.env` al usuario actual.

El script genera el usuario y la contraseña de la base de datos en `/var/lib/unicloud/.env`. Copie
estos valores en `/opt/vadtelnewweb/.env`:

```bash
VADTEL_UNICLOUD_TEST_USERNAME=NEED_USERNAME

VADTEL_UNICLOUD_TEST_PASSWORD=NEED_PASSWORD
```

### Extraiga y cargue las imágenes

Descomprima los ficheros de imagen en la carpeta `images` copiada anteriormente:

```bash
gunzip vadtel-nginx-latest.tar.gz
gunzip vadtel-app-latest.tar.gz
gunzip anytelemetry-latest.tar.gz
gunzip pgbouncer-latest.tar.gz
gunzip vadteljsondaemon-latest.tar.gz
gunzip logrotate-latest.tar.gz
gunzip postgres-15.1-alpine.tar.gz
gunzip redis-6.0.16-alpine.tar.gz
gunzip vector-latest.tar.gz
```

Cargue las imágenes en Docker:

```bash
docker load -i vadtel-nginx-latest.tar
docker load -i vadtel-app-latest.tar
docker load -i anytelemetry-latest.tar
docker load -i pgbouncer-latest.tar
docker load -i vadteljsondaemon-latest.tar
docker load -i logrotate-latest.tar
docker load -i postgres-15.1-alpine.tar
docker load -i redis-6.0.16-alpine.tar
docker load -i vector-latest.tar.gz
```

Compruebe que las imágenes están disponibles:

```bash
docker images
```

Las nueve imágenes que ha cargado deberían aparecer en la lista.

Si las imágenes se cargaron sin errores, ejecute el siguiente comando desde la carpeta
`/var/lib/unicloud`:

```bash
docker-compose up -d
```

Cree un directorio para la aplicación `vadtelnewweb` en `/opt`:

```bash
sudo mkdir /opt/vadtelnewweb
cd /opt/vadtelnewweb
```

A continuación, copie los ficheros `docker-compose.yml` y `.env` (si no los copió antes para una
instalación nueva) en `/opt/vadtelnewweb`.

En la primera ejecución, cree la base de datos:

```bash
docker-compose run app bundle exec rails db:create
```

Ahora inicie la aplicación:

```bash
docker-compose up -d
```

<Details title="Resolución de problemas">
Si la aplicación notifica el siguiente error tras el arranque:

```bash
network unicloud_unicloud-net declared as external, but could not be found
```

la red externa no se creó durante la instalación. Realice la instalación inicial a partir del
archivo `unicloud.tar.tgz` tal como se describe en [Instale el sistema](#instale-el-sistema) y
vuelva a iniciar la aplicación:

```bash
docker-compose up -d
```

</Details>

Compruebe los contenedores en ejecución:

```bash
docker ps
```

Todos los contenedores deberían figurar con el estado `Up`.

### Compruebe el sistema

Una vez iniciada la aplicación, abra en su navegador la dirección IP del servidor donde se ejecuta
para confirmar que el sistema está operativo:

```bash
http://127.0.0.1/auth/users/sign_in
```

<Image
  src="/images/deployment/sign-in-en.webp"
  alt="Página de inicio de sesión de la Plataforma IIoT con los campos de correo electrónico y contraseña"
  caption="Página de inicio de sesión de la Plataforma IIoT"
  width={1873}
  height={902}
/>

El correo electrónico y la contraseña de inicio de sesión se definen en `/opt/vadtelnewweb/.env`:

```shell title=".env"
VADTEL_SUPER_ADMIN_EMAIL= (login)
VADTEL_SUPER_ADMIN_PASSWORD= (password)
```

</Steps>

## Próximos pasos

Con la plataforma instalada y en funcionamiento, configúrela para que se actualice sin
complicaciones y se reinicie automáticamente con el servidor.

<Cards>
  <Card
    icon="refresh-cw"
    title="Actualización y arranque automático"
    description="Actualice la plataforma a nuevas versiones de las imágenes y haga que se inicie automáticamente con el servidor."
    href="/es/platform/v3/installation/updates"
  />
</Cards>