Pular para o conteúdo principal

Lab 8.5 - Exercício Extra: Criar 3 Novos Serviços Wiki.js e Testar Diferentes Formas de Pará-los

Objetivos​

Ao final deste lab, você será capaz de:

  • Dominar a criação de instâncias adicionais a partir de um template systemd (wikijs@.service)
  • Comparar vários comandos de "parada" e identificar quais funcionam corretamente (e por quê)
  • Utilizar templates systemd para gerenciar múltiplas instâncias de uma mesma aplicação
  • Identificar e parar processos Node.js de diferentes maneiras
  • Entender as diferenças entre stop, disable, kill e outros métodos de parada

Pré-requisitos​

  • Ubuntu 24.04 instalado
  • Acesso sudo/root
  • Wiki.js já instalado (pelo menos uma instância)
  • Conhecimento básico de systemd e MariaDB
  • Terminal aberto

Visão Geral​

Neste lab, você irá criar 3 novas instâncias do Wiki.js (stage, qa, demo) usando um template systemd. Em seguida, irá testar diferentes métodos para parar esses serviços e entender por que alguns funcionam e outros não.

Arquitetura das instâncias:

AmbienteConta LinuxPastaPortaBase MariaDB
stagewikijs_stage/var/www/stage.site13003wikidb_stage
qawikijs_qa/var/www/qa.site13004wikidb_qa
demowikijs_demo/var/www/demo.site13005wikidb_demo

Parte 1: Preparação do Template systemd​

Passo 1: Criar o Template systemd​

Se você ainda não tem um template, crie-o:

sudo nano /etc/systemd/system/wikijs@.service

Conteúdo do template:

[Unit]
Description=Wiki.js Instance %i
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/node server
Restart=always
User=wikijs_%i
Environment=NODE_ENV=production
WorkingDirectory=/var/www/%i.site1

[Install]
WantedBy=multi-user.target

Explicação:

  • %i é substituído pela instância (stage, qa, demo)
  • wikijs_%i vira wikijs_stage, wikijs_qa, wikijs_demo
  • /var/www/%i.site1 vira /var/www/stage.site1, etc.

Passo 2: Recarregar o systemd​

sudo systemctl daemon-reload

Parte 2: Criação das Três Novas Instâncias​

Passo 1: Criar os Usuários do Sistema​

# Criar os usuários para cada instância
sudo adduser --system --group wikijs_stage
sudo adduser --system --group wikijs_qa
sudo adduser --system --group wikijs_demo

# Permitir login com bash
sudo usermod -s /bin/bash wikijs_stage
sudo usermod -s /bin/bash wikijs_qa
sudo usermod -s /bin/bash wikijs_demo

Passo 2: Criar os Diretórios​

# Criar os diretórios para cada instância
sudo mkdir -p /var/www/stage.site1
sudo mkdir -p /var/www/qa.site1
sudo mkdir -p /var/www/demo.site1

# Definir os proprietários
sudo chown -R wikijs_stage:wikijs_stage /var/www/stage.site1
sudo chown -R wikijs_qa:wikijs_qa /var/www/qa.site1
sudo chown -R wikijs_demo:wikijs_demo /var/www/demo.site1

Passo 3: Criar os Bancos de Dados MariaDB​

# Conectar ao MariaDB
sudo mysql -u root -p

No shell do MariaDB:

-- Criar os bancos de dados
CREATE DATABASE wikidb_stage;
CREATE DATABASE wikidb_qa;
CREATE DATABASE wikidb_demo;

-- Criar os usuários
CREATE USER 'wikidb_stage_user'@'localhost' IDENTIFIED BY 'password_stage';
CREATE USER 'wikidb_qa_user'@'localhost' IDENTIFIED BY 'password_qa';
CREATE USER 'wikidb_demo_user'@'localhost' IDENTIFIED BY 'password_demo';

-- Conceder privilégios
GRANT ALL PRIVILEGES ON wikidb_stage.* TO 'wikidb_stage_user'@'localhost';
GRANT ALL PRIVILEGES ON wikidb_qa.* TO 'wikidb_qa_user'@'localhost';
GRANT ALL PRIVILEGES ON wikidb_demo.* TO 'wikidb_demo_user'@'localhost';

FLUSH PRIVILEGES;
EXIT;

Passo 4: Baixar e Instalar o Wiki.js para Cada Instância​

Para Stage (porta 3003)​

# Conectar como wikijs_stage
sudo su - wikijs_stage

# Ir para o diretório
cd /var/www/stage.site1

# Baixar o Wiki.js
wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz

# Extrair
tar xzf wiki-js.tar.gz

# Remover o arquivo compactado
rm wiki-js.tar.gz

# Copiar o arquivo de configuração
cp config.sample.yml config.yml

# Editar a configuração
nano config.yml

Configuração para stage:

port: 3003
bindIP: 0.0.0.0
db:
type: mariadb
host: localhost
port: 3306
user: wikidb_stage_user
pass: password_stage
db: wikidb_stage
ssl: false

Salve e saia. Depois:

exit

Para QA (porta 3004)​

sudo su - wikijs_qa
cd /var/www/qa.site1
wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
tar xzf wiki-js.tar.gz
rm wiki-js.tar.gz
cp config.sample.yml config.yml
nano config.yml

Configuração para qa:

port: 3004
bindIP: 0.0.0.0
db:
type: mariadb
host: localhost
port: 3306
user: wikidb_qa_user
pass: password_qa
db: wikidb_qa
ssl: false

Salve e saia. Depois:

exit

Para Demo (porta 3005)​

sudo su - wikijs_demo
cd /var/www/demo.site1
wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
tar xzf wiki-js.tar.gz
rm wiki-js.tar.gz
cp config.sample.yml config.yml
nano config.yml

Configuração para demo:

port: 3005
bindIP: 0.0.0.0
db:
type: mariadb
host: localhost
port: 3306
user: wikidb_demo_user
pass: password_demo
db: wikidb_demo
ssl: false

Salve e saia. Depois:

exit

Passo 5: Ativar e Iniciar os Serviços​

# Ativar e iniciar as três instâncias
sudo systemctl enable --now wikijs@stage
sudo systemctl enable --now wikijs@qa
sudo systemctl enable --now wikijs@demo

Passo 6: Verificação​

# Verificar o status de cada instância
sudo systemctl status wikijs@stage --no-pager
sudo systemctl status wikijs@qa --no-pager
sudo systemctl status wikijs@demo --no-pager

# Verificar se as portas estão em escuta
sudo ss -tlnp | grep -E '3003|3004|3005'

Parte 3: Identificar Processos e Portas​

Anexo 1: Comandos para Identificar Processos Node.js​

1. Exibir Todos os Processos Node com a Unidade systemd​

ps -eo pid,user,unit,cmd | grep -w node

2. Versão Compacta: PID + Linha de Comando​

pgrep -a node

3. Loop: Para Cada PID Node, Mostrar as Portas em Escuta​

for pid in $(pgrep node); do lsof -Pan -p "$pid" -i; done

4. Exibir Diretamente Todos os Sockets Node Abertos​

ss -tlnp | grep node

5. Para um PID Específico​

# Substitua 1234 pelo PID real
systemctl status --pid=1234
cat /proc/1234/cgroup | grep system.slice

Parte 4: Testar Diferentes Métodos de Parada​

Métodos de Parada para Testar​

Comando A – Parada Correta via systemd​

# Parada limpa da instância stage
sudo systemctl stop wikijs@stage

Análise: Este comando para o serviço de forma limpa via systemd. É o método recomendado.

Comando B – Erro Lógico: Desativa para o Futuro, Não Para Agora​

# Desativa o serviço mas não o para imediatamente
sudo systemctl disable wikijs@qa

Análise: Este comando desativa o serviço na inicialização, mas não para se já estiver em execução. O serviço continua rodando até o próximo reboot.

Comando C – ⚠️ Muito Arriscado: Mata Todos os Processos "wikijs"​

# Mata todos os processos chamados "wikijs"
sudo killall wikijs

Análise: Este comando é arriscado pois mata todos os processos com esse nome, sem distinção. Pode afetar outros processos não relacionados.

Comando D – Parada Indireta via Porta da Instância Demo (3005)​

# Mata o processo que está escutando na porta 3005
sudo fuser -k 3005/tcp

Análise: Este comando identifica e mata o processo que usa a porta 3005. Funciona, mas é menos limpo que o systemctl.

Comando E – Parada Forçada do QA (porta 3004) via lsof + kill -9​

# Encontra o PID que escuta na 3004 e o mata
sudo lsof -ti:3004 | xargs sudo kill -9

Análise: Este comando encontra o PID do processo que escuta na porta 3004 e o mata à força. Funciona, mas usa SIGKILL (força bruta).

Comando F – Reload ≠ Stop: Não Interrompe o Serviço​

# Recarrega a configuração mas não interrompe o serviço
sudo systemctl reload wikijs@demo

Análise: Este comando recarrega a configuração do serviço mas não o para. O serviço continua funcionando.

Apenas Respostas Corretas​

Os comandos que realmente param os serviços são:

# Comando A - Parada limpa
sudo systemctl stop wikijs@stage

# Comando D - Parada via porta
sudo fuser -k 3005/tcp

# Comando E - Parada forçada via porta
sudo lsof -ti:3004 | xargs sudo kill -9

Verificação da Parada​

# Verificar se algum serviço ainda está ativo
sudo systemctl status wikijs@stage
sudo systemctl status wikijs@qa
sudo systemctl status wikijs@demo

# Ver se as portas ainda estão em escuta
sudo ss -tlnp | grep node

# Verificar os processos Node.js
ps aux | grep node

Parte 5: Extensão (Opcional)​

Reiniciar Limpa Todas as Instâncias​

# Reiniciar todas as instâncias em um comando
sudo systemctl restart wikijs@{stage,qa,demo}

Ver Todos os Ports Node.js Ativos no Momento​

# Ver todas as portas Node.js em escuta
sudo lsof -iTCP -sTCP:LISTEN | grep node

Verificar se Todas as Portas Foram Liberadas Após Parada​

# Parar todas as instâncias
sudo systemctl stop wikijs@{stage,qa,demo}

# Verificar se as portas estão livres
sudo ss -tlnp | egrep '3003|3004|3005'

Anexo 2: Comandos Úteis para Gerenciamento de Serviços​

1. Ver Todos os Ports Ativos e Processos Relacionados​

ComandoComentário / Objetivo
sudo ss -tulnMostra as portas TCP/UDP abertas (escuta), sem resolução DNS (rápido).
sudo lsof -i -P -nMostra todas as portas e os programas que as utilizam.
sudo lsof -i -P -n | grep nodeFiltra para ver apenas processos Node.js.
sudo netstat -tulnpComando antigo equivalente ao ss, também mostra os PIDs.
sudo apt install net-toolsInstala o netstat (necessário no Ubuntu moderno).
ps aux | grep nodeLista todos os processos contendo "node".
sudo lsof -i :3000Mostra o processo que escuta especificamente na porta 3000.
sudo apt install nmapInstala o nmap, um scanner de portas.
sudo nmap -sT -O localhostEscaneia as portas TCP abertas na máquina local.

2. Gerenciamento de Serviços Node.js com systemd​

ComandoComentário / Objetivo
systemctl | grep nodeBusca serviços contendo "node".
systemctl list-units --type=serviceLista todos os serviços em execução.
ls /etc/systemd/system/Lista arquivos .service instalados manualmente.
sudo systemctl stop nome-do-serviçoPara um serviço de forma limpa (ex: wikijs.service).
sudo systemctl disable nome-do-serviçoImpede que o serviço inicie no próximo boot.
sudo rm /etc/systemd/system/nome-do-serviço.serviceRemove o arquivo do serviço.
sudo systemctl daemon-reexecRecarrega completamente o systemd.
sudo systemctl daemon-reloadRecarrega os arquivos .service.
systemctl list-units --type=service | grep -i nodeLista serviços Node.js (case-insensitive).
systemctl list-units --type=service | grep 3100Busca serviços associados à porta 3100.
sudo systemctl reset-failedReseta o estado de serviços com falha.

3. Parada Manual de um Processo (se não for um serviço)​

ComandoComentário / Objetivo
sudo kill 1064738Tenta matar o processo (PID 1064738) de forma limpa.
sudo kill -9 1064738Mata o processo à força (SIGKILL).
ps -fp 1072723Mostra detalhes do processo 1072723 (formato estendido).
sudo ls -l /proc/1072723/exeMostra o binário real executado pelo processo.
sudo cat /proc/1072723/cmdline | tr '\0' ' 'Mostra o comando exato que iniciou o processo.

4. Detecção e Parada de Processos Gerenciados pelo PM2​

ComandoComentário / Objetivo
which pm2Verifica se o pm2 está instalado.
pm2 listLista as aplicações gerenciadas pelo PM2.
pm2 stop allPara todas as aplicações PM2.
pm2 delete allRemove todas as referências às aplicações.
pm2 unstartupDesativa o auto start do PM2 no boot.

5. Remoção Completa de um Serviço systemd​

ComandoComentário / Objetivo
ls /etc/systemd/system/ | grep -i wikiFiltra arquivos .service relacionados a "wiki".
sudo systemctl stop wikijs.servicePara o serviço antes de remover.
sudo systemctl disable wikijs.serviceDesativa o serviço.
sudo rm /etc/systemd/system/wikijs.serviceRemove o arquivo do serviço.
sudo systemctl daemon-reloadRecarrega a configuração do systemd.
sudo systemctl reset-failedReseta erros do systemd.
systemctl list-units --type=service | grep wikiVerifica se o serviço sumiu.
systemctl status wikijs.serviceVerifica se o serviço ainda existe.
ls -l /etc/systemd/system/Lista completa para checagem manual.
grep -r ExecStart /etc/systemd/system/Busca linhas de inicialização em todos os serviços.

Anexo 3: Lista Completa de Comandos​

Comandos para Ver Ports​

sudo ss -tuln
sudo lsof -i -P -n
sudo lsof -i -P -n | grep node
sudo netstat -tulnp
sudo apt install net-tools
ps aux | grep node
sudo lsof -i :3000
sudo apt install nmap
sudo nmap -sT -O localhost

Comandos systemd​

systemctl | grep node
systemctl list-units --type=service
ls /etc/systemd/system/
sudo systemctl stop nom-du-service
sudo systemctl stop wikijs.service
sudo systemctl disable nom-du-service
sudo rm /etc/systemd/system/nom-du-service.service
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
systemctl | grep 3100
systemctl | grep node
sudo systemctl stop wikijs.service

Comandos kill​

sudo kill 1064738
sudo kill -9 1064738
sudo ss -tuln | grep 3100
sudo lsof -i :3100

Comandos PM2​

which pm2 && pm2 list
pm2 stop all
pm2 delete all
pm2 unstartup

Comandos de Diagnóstico​

sudo systemctl list-units --type=service | grep -i node
ps aux | grep node
ps -fp 1072723
sudo ls -l /proc/1072723/exe
sudo cat /proc/1072723/cmdline | tr '\0' ' '
ls /etc/systemd/system/ | grep -i wiki
ls /lib/systemd/system/ | grep -i wiki
grep -r 3100 /etc/systemd/system/

Comandos de Remoção​

sudo systemctl stop nom.service
sudo systemctl disable nom.service
sudo systemctl daemon-reload
sudo systemctl reset-failed
ls /etc/systemd/system/
ls /etc/systemd/system/ | grep -i wiki
sudo systemctl stop wikijs.service
sudo systemctl disable wikijs.service
sudo rm /etc/systemd/system/wikijs.service
sudo systemctl daemon-reload
sudo systemctl reset-failed
systemctl list-units --type=service | grep wiki
systemctl status wikijs.service
ls -l /etc/systemd/system/
grep -r ExecStart /etc/systemd/system/

Exercícios Práticos​

Exercício 1: Criar e Iniciar as 3 Instâncias​

  1. Crie as 3 instâncias (stage, qa, demo) seguindo os passos acima
  2. Verifique que todas as instâncias estão ativas
  3. Verifique que as portas 3003, 3004, 3005 estão em escuta

Exercício 2: Testar os Métodos de Parada​

Para cada método de parada (A, B, C, D, E, F):

  1. Reinicie primeiro a instância em questão
  2. Execute o comando de parada
  3. Verifique se o serviço realmente parou
  4. Documente o resultado em uma tabela

Exercício 3: Comparação dos Métodos​

Crie uma tabela comparativa:

MétodoComandoFunciona?Por quê?Recomendado?
Asystemctl stop???
Bsystemctl disable???
Ckillall wikijs???
Dfuser -k port/tcp???
Elsof -ti:port | xargs kill -9???
Fsystemctl reload???

Perguntas de Reflexão​

  1. Por que systemctl disable não para um serviço que já está em execução?

    • Explique a diferença entre stop e disable
  2. Quais são os riscos de usar killall para parar serviços?

    • Dê um exemplo de cenário onde isso pode causar problemas
  3. Por que systemctl reload não interrompe o serviço?

    • Explique a diferença entre reload e restart
  4. Qual a diferença entre kill e kill -9?

    • Em quais casos você usaria cada um desses comandos?
  5. Por que usar um template systemd (wikijs@.service) ao invés de criar 3 arquivos de serviço separados?

    • Quais são as vantagens e desvantagens de cada abordagem?

Resumo dos Métodos de Parada​

Métodos Recomendados ✅​

  1. systemctl stop wikijs@instance - Parada limpa via systemd
  2. fuser -k port/tcp - Parada via porta (funciona, mas menos limpo)
  3. lsof -ti:port \| xargs kill -9 - Parada forçada (último recurso)

Métodos a Evitar ❌​

  1. systemctl disable - Não para, apenas desativa na inicialização
  2. systemctl reload - Recarrega a config, mas não interrompe
  3. killall wikijs - Muito arriscado, pode afetar outros processos

Verificação Final​

Verifique se você conseguiu:

  • Criar o template systemd wikijs@.service
  • Criar os 3 usuários do sistema (wikijs_stage, wikijs_qa, wikijs_demo)
  • Criar os 3 diretórios e instalar o Wiki.js em cada um
  • Criar os 3 bancos de dados MariaDB
  • Configurar os arquivos config.yml com as portas corretas
  • Ativar e iniciar as 3 instâncias
  • Verificar que as portas 3003, 3004, 3005 estão em escuta
  • Testar todos os métodos de parada
  • Entender por que alguns métodos funcionam e outros não
  • Responder às perguntas de reflexão

Próximos Passos​

  • Lab 8.1: Gerenciamento de Serviços systemd (revisão)
  • Lab 8.2: Serviços Personalizados (aprofundamento)
  • TP 2: Reverse Proxy NGINX (para expor as instâncias via reverse proxy)

Lab criado em: Dezembro 2024