# Instalando e Configurando o Soketi: um Servidor WebSocket Baseado em Pusher

O [Soketi](https://docs.soketi.app) é baseado no [uWebSocket.js](https://github.com/uNetworking/uWebSockets.js), um servidor WebSocket baseado em Node.js, transpilado a partir da linguagem C. Ele oferece uma solução robusta e eficiente para comunicação em tempo real entre aplicações.

Se você está procurando uma maneira fácil de habilitar a comunicação bidirecional entre um servidor e um cliente em tempo real, o [Soketi](https://docs.soketi.app) é a escolha ideal. Ele permite que você transmita informações instantaneamente e de forma assíncrona, sem a necessidade de atualizações constantes da página ou consultas repetitivas ao servidor.

Neste tutorial, você aprenderá como instalar e configurar o [Soketi](https://docs.soketi.app) em uma máquina virtual hospedada na [DigitalOcean](https://m.do.co/c/b7582264f56f), uma plataforma de computação em nuvem confiável e escalável.

Não é meu objetivo mostrar como configurar uma máquina na [DO](https://m.do.co/c/b7582264f56f). Vou assumir que você já possui esse conhecimento.

Vamos lá.

## **Instalação**

<mark>É necessário ter o Node.js LTS (14.x, 16.x, etc.) devido às limitações de compilação do uWebSockets.js.</mark>

O Soketi pode ser facilmente instalado através do NPM

```basic
npm install -g @soketi/soketi
```

Após a instalação, um servidor Soketi com a configuração padrão pode ser iniciado usando o comando

```basic
soketi start
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1686814155656/d527e0a4-fc1b-4455-a7e8-74d4f66bbbbe.png align="center")

Por padrão, o comando irá iniciar um servidor em `127.0.0.1:6001` com as seguintes credenciais de aplicativo:

* App ID: `app-id`
    
* App Key: `app-key`
    
* Secret: `app-secret`
    

Essas credenciais são usadas pra autenticar seus aplicativos no frontend e backend, permitindo que você mande e receba mensagens em tempo real.

Logo mais abaixo, te explico como você pode alterar.

## **Configuração do Servidor**

Você pode declarar as configuração do servidor soketi usando variáveis de ambiente ao invocar diretamente o servidor soketi no console, ou como atributos chave-valor em um arquivo .env que é colocado no mesmo diretório onde o comando do servidor soketi é executado.

Exemplo de um arquivo `.env`

```basic
SOKETI_DEBUG=1
SOKETI_DEFAULT_APP_ID=1111
SOKETI_DEFAULT_APP_KEY=2222
SOKETI_DEFAULT_APP_SECRET=3333
```

Uma lista completa de variaveis de ambiente pode ser encontrada [clicando aqui](https://docs.soketi.app/app-management/array-driver).

Exemplo de um arquivo de configuração `config.json`

```JSON
{
    "debug":true,
    "appManager.array.apps":[
        {
            "id":"1111",
            "key":"2222",
            "secret":"3333"
        }
    ]
}
```

Uma lista completa de opções a serem configuradas pode ser encontrada [clicando aqui](https://github.com/soketi/soketi/blob/master/src/options.ts).

Note que em ambos os arquivos de configuração, temos as informações de APP-ID, APP-KEY e APP-SECRET, você pode modificar esses valores livremente. O importante é que uma vez definidos, você use-os no momento de se conectar ao servidor soketi, seja no frontend ou no backend.

## Iniciando o serviço

Lembre-se, se você optou por usar um arquivo de configuração json, deve iniciar o serviço como mostrado abaixo

```basic
soketi start --config=/path/to/config.json
```

Já se tiver optado por usar um arquivo `.env,` você deve iniciar o serviço no mesmo diretório onde o arquivo `.env` foi criado. Então a inicialização ficaria:

```basic
soketi start
```

Após iniciar o serviço, você deve ver algo como a figura abaixo:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1686817802406/2685fc44-4077-48bd-9fe4-1d2569e082ac.png align="center")

## Instalando o Supervisor

Para manter o servidor soketi permanentemente ativo, você deve instalar um gerenciador de processos, no nosso exemplo, iremos utilizar o supervisor, um daemon que pode executar e reiniciar processos em segundo plano.

***Passo 1***

Comece atualizando suas fontes de pacotes e instalando o Supervisor:

```basic
sudo apt update && sudo apt install supervisor
```

O serviço do Supervisor é executado automaticamente após a instalação. Você pode verificar o seu status utilizando o comando:

```basic
sudo systemctl status supervisor
```

Você deve ver algo no seu console parecido com:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1686818486267/95bb1000-2910-4788-99d6-5e808a00b42e.png align="left")

***Passo 2***

Uma prática recomendada ao trabalhar com o Supervisor é escrever um arquivo de configuração para cada programa que ele irá gerenciar.

Crie o arquivo de configuração executando o comando abaixo:

```basic
sudo nano /etc/supervisor/conf.d/soketi.conf
```

Em seguida, cole o conteudo abaixo:

```basic
[program:soketi] 
process_name=%(program_name)s_%(process_num)02d 
command=soketi start --config=/PATH/TO/CONFIG-FILE
autostart=true 
autorestart=true 
stopasgroup=true 
killasgroup=true 
user=ubuntu 
numprocs=1 
redirect_stderr=true 
stdout_logfile=/var/log/soketi-supervisor.log 
stopwaitsecs=60 
stopsignal=sigint 
minfds=10240
```

Como você pode ver na configuração acima, um único servidor soketi será iniciado e este servidor reiniciará automaticamente em caso de falha. Os registros de log serão gravados em `/var/log/soketi-supervisor.log`.

É importante observar que as opções de configuração `stopwaitsecs` e `stopsignal` devem ser definidas como no exemplo acima. Se necessário, você pode aumentar o valor de `stopwaitsecs` para um valor maior. Esse é o número de segundos que o Supervisor permitirá que o soketi encerre todas as conexões de forma adequada quando o servidor estiver parando ou reiniciando.

Em ambientes Linux, tudo é um arquivo, incluindo os sockets ativos. Para rastrear as conexões de socket, o soketi cria um descritor de arquivo para cada conexão. Em alguns casos, você pode encontrar um limite suave de descritores de arquivo definido pelo seu sistema operacional. Nessa situação, você pode definir a opção de configuração `minfds` do Supervisor para um valor mais alto, permitindo que o sistema operacional gerencie mais conexões.

Um ponto importante a destacar é de que se você tiver optado por configurar o soketi com arquivo `.env` você precisa configurar o Supervisor para que o serviço seja executado em um diretório especifico, aquele onde você colocou o arquivo `.env` a configuração ficaria levemente diferente.

```basic
[program:soketi] 
process_name=%(program_name)s_%(process_num)02d 
directory=/PATH/WHERE/ENV-FILE/IS
command=soketi start 
...
```

É isso, se te ajudei, comente! Obrigado.
