Criando e Executando Projetos Socket.io com o ServBay
O Socket.io é uma biblioteca JavaScript popular, criada para construir aplicações web em tempo real, bidirecionais e orientadas a eventos. Baseando-se no protocolo WebSocket, ele oferece mecanismos alternativos de fallback (como long polling) quando necessário, garantindo comunicação estável e confiável em diversas condições de clientes e redes.
Este guia detalha como aproveitar o poderoso ambiente local de desenvolvimento do ServBay para configurar, executar e gerenciar um projeto Socket.io. O ServBay fornece um ambiente Node.js pré-configurado e uma gestão prática de sites (anteriormente chamados de hosts), tornando o desenvolvimento com Socket.io ainda mais eficiente.
O que é o Socket.io?
O Socket.io é uma biblioteca que implementa comunicação em tempo real, bidirecional e baseada em eventos. É composta por duas partes:
- Uma biblioteca backend executada no servidor Node.js.
- Uma biblioteca frontend em JavaScript executada no navegador.
Embora o foco do Socket.io seja o uso do WebSocket, ele garante compatibilidade com navegadores antigos ou redes restritas, detectando automaticamente e alternando para outros mecanismos de transporte, como Adobe Flash Socket, Ajax Long Polling, Ajax Multipart Streaming, Forever IFrame, JSONP Polling, entre outros.
Principais Recursos e Vantagens do Socket.io
- Comunicação em tempo real: Permite troca de dados instantânea entre servidor e clientes, ideal para chats, ferramentas de colaboração, dashboards em tempo real, jogos online, etc.
- Suporte multiplataforma: Pode ser utilizado em navegadores web, aplicativos mobile e servidores Node.js.
- Reconexão automática: Caso a conexão caia, o cliente tenta se reconectar automaticamente, tornando a aplicação mais robusta.
- Orientado a eventos: Seu modelo de programação baseado em eventos facilita o gerenciamento e entendimento da comunicação assíncrona.
- Rooms e namespaces: Permite agrupar clientes em “salas” para transmissão segmentada de mensagens; “namespaces” permitem multiplexar múltiplas conexões no mesmo canal.
- Suporte a dados binários: Facilidade para enviar e receber arquivos binários.
- Alta compatibilidade: Trabalha de forma confiável sob diversas condições de rede usando múltiplos mecanismos de transporte.
Com o Socket.io, desenvolvedores podem focar na lógica da aplicação sem se preocupar com as complexidades da implementação da comunicação em tempo real.
Criando e Executando um Projeto Socket.io com ServBay
O ServBay oferece um ambiente pronto para desenvolvedores Node.js, incluindo o runtime do Node.js, o gerenciador de pacotes npm e uma poderosa ferramenta de gerenciamento de sites. Vamos usar esses recursos para configurar e rodar um projeto de exemplo com Socket.io.
Pré-requisitos
Antes de começar, certifique-se de que:
- Instalou o ServBay: Baixe e instale a versão mais recente do site oficial do ServBay.
- Instalou o pacote Node.js no ServBay: Dentro do ServBay, instale o pacote Node.js, caso ainda não o tenha feito. Você pode instalar e gerenciar pelo painel de controle, na seção “Pacotes” (anteriormente chamada de “Serviços”). Consulte o documento Usando Node.js no ServBay para orientações detalhadas.
Criando um Projeto de Exemplo com Socket.io
Vamos criar um app de chat simples como exemplo.
Inicialize o diretório do projeto:
Primeiro, abra seu app de terminal. A recomendação do ServBay é manter os projetos de sites em
/Applications/ServBay/www
. Navegue até esse diretório, crie uma pasta para seu projeto, inicialize o Node.js e instale as dependências:bashcd /Applications/ServBay/www mkdir servbay-socketio-chat cd servbay-socketio-chat npm init -y npm install express socket.io
1
2
3
4
5Isso cria o arquivo
package.json
emservbay-socketio-chat
e instala as dependências essenciais:express
(para servir arquivos estáticos e lidar com requisições HTTP) esocket.io
(biblioteca do servidor e do cliente).Crie o arquivo do servidor (
server.js
):No diretório raiz do projeto
servbay-socketio-chat
, crie um arquivo chamadoserver.js
e cole o seguinte código. Ele faz o bootstrap do servidor HTTP, integra o Socket.io e gerencia conexões de clientes e broadcast de mensagens.javascriptconst express = require('express'); const http = require('http'); const socketIo = require('socket.io'); const path = require('path'); // Importa o módulo path const app = express(); // Cria um servidor HTTP baseado no app express const server = http.createServer(app); // Anexa o Socket.io ao servidor HTTP const io = socketIo(server); // Configura diretório para arquivos estáticos, apontando para o diretório atual app.use(express.static(__dirname)); // Lida com requisições GET na raiz, enviando o arquivo index.html app.get('/', (req, res) => { // Usa path.join para garantir compatibilidade de caminho em diferentes sistemas operacionais res.sendFile(path.join(__dirname, 'index.html')); }); // Escuta eventos de conexão do Socket.io io.on('connection', (socket) => { console.log('um usuário conectou'); // Loga quando um usuário se conecta // Escuta eventos de desconexão socket.on('disconnect', () => { console.log('usuário desconectou'); // Loga quando o usuário desconecta }); // Escuta evento 'chat message' socket.on('chat message', (msg) => { console.log('mensagem: ' + msg); // Exibe a mensagem recebida // Repassa a mensagem para todos os clientes conectados io.emit('chat message', msg); }); }); // Pega a porta do ambiente ou usa 3000 como padrão const port = process.env.PORT || 3000; server.listen(port, () => { console.log(`Servidor rodando na porta ${port}`); console.log(`Acesse em http://localhost:${port} (direto) ou via proxy reverso do ServBay`); });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43Descrição do código:
- Usamos
express
para criar um servidor web simples e servir oindex.html
. http.createServer(app)
cria o servidor HTTP, base para o Socket.io.socketIo(server)
inicializa o Socket.io e o conecta ao servidor HTTP.io.on('connection', ...)
escuta novas conexões de clientes.socket.on('disconnect', ...)
trata desconexões.socket.on('chat message', ...)
recebe e processa eventos de mensagem de chat enviados pelos clientes.io.emit('chat message', msg)
transmite a mensagem recebida para todos os clientes atualmente conectados.
- Usamos
Crie o arquivo do cliente (
index.html
):No diretório raiz do projeto, crie o arquivo
index.html
e cole o seguinte conteúdo. Este arquivo traz a estrutura HTML do cliente, estilos CSS e o código JavaScript do cliente Socket.io — para conectar ao servidor, enviar e exibir mensagens.html<!DOCTYPE html> <html> <head> <title>ServBay Socket.io Chat</title> <style> body { margin: 0; padding-bottom: 3rem; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } #form { background: rgba(0, 0, 0, 0.15); padding: 0.25rem; position: fixed; bottom: 0; left: 0; right: 0; display: flex; height: 3rem; box-sizing: border-box; backdrop-filter: blur(10px); } #input { border: none; padding: 0 1rem; flex-grow: 1; border-radius: 2rem; margin: 0.25rem; } #input:focus { outline: none; } #form > button { background: #333; border: none; padding: 0 1rem; margin: 0.25rem; border-radius: 3px; outline: none; color: #fff; } #messages { list-style-type: none; margin: 0; padding: 0; } #messages > li { padding: 0.5rem 1rem; } #messages > li:nth-child(odd) { background: #efefef; } .servbay-banner { background-color: #007bff; /* Azul ServBay */ color: white; text-align: center; padding: 15px 0; font-size: 22px; margin-bottom: 20px; font-weight: bold; } </style> </head> <body> <div class="servbay-banner">Bem-vindo(a) ao Demo de Chat com ServBay Socket.io!</div> <ul id="messages"></ul> <form id="form" action=""> <input id="input" autocomplete="off" /><button type="submit">Enviar</button> </form> <!-- Inclui a biblioteca cliente do Socket.io --> <!-- Este arquivo é gerado dinamicamente pelo servidor Socket.io em tempo de execução --> <script src="/socket.io/socket.io.js"></script> <script> // Conecta ao servidor Socket.io // Se cliente e servidor estão no mesmo domínio/porta, io() conecta automaticamente var socket = io(); var form = document.getElementById('form'); var input = document.getElementById('input'); var messages = document.getElementById('messages'); // Obtém o elemento messages form.addEventListener('submit', function(e) { e.preventDefault(); // Impede o envio padrão do formulário if (input.value) { // Envia o evento 'chat message' e o conteúdo ao servidor socket.emit('chat message', input.value); input.value = ''; // Limpa o campo de entrada } }); // Escuta o evento 'chat message' enviado pelo servidor socket.on('chat message', function(msg) { // Cria novo item de lista para exibir mensagem var item = document.createElement('li'); item.textContent = msg; // Usa textContent para prevenir ataques XSS messages.appendChild(item); // Adiciona mensagem à lista // Rola para a última mensagem window.scrollTo(0, document.body.scrollHeight); }); </script> </body> </html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64Descrição do código:
- O HTML define uma página simples, com estilos CSS (incluindo banner azul do ServBay), um ul (
#messages
) para listar mensagens, e um form (#form
) para envio. <script src="/socket.io/socket.io.js"></script>
importa a biblioteca cliente do Socket.io — fornecida automaticamente pelo servidor.io()
inicializa e conecta ao servidor Socket.io.- O cliente intercepta o envio do formulário, envia a mensagem via
socket.emit('chat message', input.value)
. - Escuta por eventos
'chat message'
do servidor, adiciona as mensagens ao chat para visualização.
- O HTML define uma página simples, com estilos CSS (incluindo banner azul do ServBay), um ul (
Pronto! O código base do projeto está feito. Agora vamos executar e acessar o projeto usando o ServBay.
Executando o Projeto com ServBay (Modo Desenvolvimento)
No desenvolvimento, normalmente iniciamos o servidor Node.js diretamente e mapeamos seu acesso para um domínio local via proxy reverso no ServBay.
Inicie o servidor de desenvolvimento Node.js:
Abra o terminal, acesse o diretório
/Applications/ServBay/www/servbay-socketio-chat
e execute:bashcd /Applications/ServBay/www/servbay-socketio-chat PORT=8585 node server.js
1
2O servidor irá indicar no terminal algo como
Servidor rodando na porta 8585
. O app estará escutando na porta 8585 localmente.Configure o site (proxy reverso) no ServBay:
Para facilitar o acesso por domínio local e usar HTTPS/SSL, crie um site proxy reverso no ServBay:
- Abra o painel do ServBay.
- Vá para “Sites” (anteriormente “Hosts”).
- Clique no botão de adicionar novo site.
- Preenchimento sugerido:
- Nome:
ServBay Socket.io Dev
(ou nome de sua escolha) - Domínios:
servbay-socketio-dev.servbay.demo
(ou outro domínio.servbay.demo
) - Tipo de site: Selecione
Proxy Reverso
- Destino do Proxy:
http://127.0.0.1:8585
(apontando para sua instância Node.js)
- Nome:
- Salve. O ServBay aplicará as configurações e poderá reiniciar o servidor web (Caddy ou Nginx, conforme opção).
Atenção: O proxy reverso é fundamental para Socket.io, pois além de encaminhar requisições HTTP, trata corretamente a atualização para o protocolo WebSocket. O Caddy/Nginx integrado ao ServBay já configura o proxy para suportar WebSockets por padrão.
Para instruções detalhadas, confira Adicionando site Node.js de Desenvolvimento. Se desejar HTTPS para o domínio local, siga o guia Protegendo site com SSL/TLS. O ServBay User CA e o ServBay Public CA ajudam a gerar e confiar em certificados SSL locais.
Acesse o site em modo desenvolvimento:
No navegador, acesse o domínio local configurado,
https://servbay-socketio-dev.servbay.demo
. Você verá a interface do chat e poderá testar o tempo real abrindo em várias abas ou dispositivos.
Implantando o Projeto no ServBay (Modo Produção)
No ambiente de produção, recomenda-se executar o app Node.js de forma robusta (usando gerenciadores de processos como PM2/forever) e integrá-lo ao ServBay. Mostramos a seguir como configurar o proxy reverso do ServBay, assumindo que seu Node.js já esteja rodando estável numa porta específica.
Inicie o servidor de produção do Node.js:
Use um gerenciador de processos como o PM2 no ambiente de produção:
bash# Se ainda não tiver o PM2 instalado # npm install pm2 -g cd /Applications/ServBay/www/servbay-socketio-chat PORT=8586 NODE_ENV=production pm2 start server.js --name servbay-socketio-prod
1
2
3
4
5O comando acima inicia o
server.js
com o PM2, define a porta 8586 e seta a variável de ambienteNODE_ENV
como produção. O PM2 garante o app executando em segundo plano e reinício automático em caso de falha.Configure o site de produção (proxy reverso) no ServBay:
Repita o processo do modo desenvolvimento, criando um novo site proxy reverso no ServBay mirando a porta do ambiente de produção:
- Abra o painel do ServBay.
- Acesse a seção “Sites”.
- Clique para adicionar novo site.
- Dados sugeridos:
- Nome:
ServBay Socket.io Prod
(ou outro nome) - Domínios:
servbay-socketio-prod.servbay.demo
(ou domínio customizado.servbay.demo
) - Tipo de site:
Proxy Reverso
- Destino do Proxy:
http://127.0.0.1:8586
(porta do Node.js em produção)
- Nome:
- Salve.
Acesse o site em modo produção:
No navegador, vá para o domínio local configurado:
https://servbay-socketio-prod.servbay.demo
.
Com o proxy reverso do ServBay, é fácil gerenciar múltiplos apps Node.js (em desenvolvimento ou produção), designando domínios e SSL sem precisar mexer em hosts do sistema ou ajustes complexos no servidor web.
Conectando a Bancos de Dados do ServBay
O ServBay suporta diversos bancos de dados: MySQL, MariaDB, PostgreSQL, MongoDB e Redis. Seu app Socket.io pode se integrar a qualquer um deles para armazenar usuários, histórico de mensagens, etc. Veja exemplos de conexão usando Node.js.
Importante: Antes de rodar os exemplos, certifique-se de instalar e iniciar o respectivo banco de dados pelo painel do ServBay. Verifique dados de conexão (porta, usuário e senha padrão) no painel ou na documentação. O root do MySQL/MariaDB geralmente usa a senha definida na instalação do ServBay — você pode redefinir pelo painel, se necessário.
Conectando ao MongoDB:
Instale o Mongoose (ou driver oficial
mongodb
):bashnpm install mongoose
1No seu código Node.js (por exemplo, em
server.js
ou módulo dedicado):javascriptconst mongoose = require('mongoose'); // Conecta ao MongoDB local rodando na porta 27017 (padrão) // Nome do banco: servbay_socketio_app (exemplo) mongoose.connect('mongodb://localhost:27017/servbay_socketio_app', { useNewUrlParser: true, useUnifiedTopology: true, // Para autenticação, preencha user, pass se necessário // user: 'seu_usuario_mongo', // pass: 'sua_senha_mongo' }) .then(() => console.log('MongoDB conectado com sucesso via Mongoose')) .catch(err => console.error('Erro ao conectar ao MongoDB:', err)); // Defina Schemas e Models usando mongoose.model() // ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Conectando ao Redis:
Instale o cliente Redis:
bashnpm install redis
1No seu código:
javascriptconst redis = require('redis'); // Cria client Redis conectando ao localhost:6379 (padrão) const client = redis.createClient({ // Para autenticação, preencha password, se necessário // password: 'sua_senha_redis', // url: 'redis://localhost:6379' }); client.on('error', (err) => { console.error('Erro ao conectar ao Redis:', err); }); client.on('connect', () => { console.log('Redis conectado com sucesso'); }); // Conecta ao servidor Redis client.connect(); // Para Redis v4+, chame connect() // Agora você pode executar comandos Redis com o client // Exemplo: await client.set('mykey', 'myvalue'); // ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23Conectando ao MariaDB / MySQL:
O ServBay suporta ambos. Usaremos o pacote
mariadb
(compatível com MySQL).Instale o cliente:
bashnpm install mariadb
1No seu código:
javascriptconst mariadb = require('mariadb'); // Cria pool de conexões const pool = mariadb.createPool({ host: 'localhost', port: 3306, // Porta padrão user: 'root', // Usuário padrão do ServBay password: 'password', // Substitua pela senha definida no ServBay database: 'servbay_socketio_app', // Nome do banco (exemplo) connectionLimit: 5 // Tamanho do pool }); // Testa a conexão pool.getConnection() .then(conn => { console.log("Conectado com sucesso ao MariaDB/MySQL"); conn.release(); // Pool pronto para queries, ex: await pool.query("SELECT 1"); // ... }) .catch(err => { console.error("Erro ao conectar ao MariaDB/MySQL:", err); });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23Atenção: Troque
password
pela senha real definida para o root no ServBay. Para produção, crie usuários próprios para o app em vez de utilizar o root.Conectando ao PostgreSQL:
Instale o cliente:
bashnpm install pg
1No seu código:
javascriptconst { Pool } = require('pg'); // Cria pool de conexões const pool = new Pool({ user: 'user', // Usuário configurado host: 'localhost', database: 'servbay_socketio_app', // Nome do banco (exemplo) password: 'password', // Senha definida no ServBay port: 5432, // Porta padrão PostgreSQL }); // Testa conexão pool.connect((err, client, done) => { if (err) { console.error('Erro ao conectar ao PostgreSQL:', err); return; } console.log('Conectado com sucesso ao PostgreSQL'); client.release(); // Pool pronto para queries, ex: pool.query('SELECT NOW()', (err, res) => { ... }); // ... });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22Atenção: Substitua
user
epassword
pelo usuário e senha configurados para o PostgreSQL no ServBay.
Com essa integração, você poderá persistir dados e enriquecer seu app Socket.io. O ServBay agiliza todo o ambiente de desenvolvimento Node.js com bancos de dados em sua máquina local.
Observações Importantes
- Conflito de portas: Certifique-se de que a porta definida para seu app Node.js (por exemplo, 8585 ou 8586) não esteja sendo usada por outro serviço. Caso haja conflito, basta alterar o valor da porta via variável
PORT
. - Configuração de sites no ServBay: Após configurar um site proxy reverso, garanta que o servidor web do ServBay (Caddy/Nginx) tenha sido reiniciado e as mudanças aplicadas.
- Proxy de WebSocket: O ServBay, por padrão, suporta WebSockets no proxy reverso. Em caso de problemas, cheque os logs do servidor web e certifique-se que a configuração de proxy está correta.
- Firewall: Assegure que o firewall do sistema não bloqueie as portas utilizadas pelo ServBay (80, 443) nem as portas dos apps Node.js.