Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
neko-master — Um dashboard moderno e elegante para visualização e análise de tráfego de rede. | Kitploit
Ferramentas/GitHubGitHub/foru17/neko-master
Mapeamento de RedeColeta de InformaçõesSegurança de RedePrivacidadeUtilitários e FrameworksAnálise de Logs
GitHubforu17/neko-master

neko-master

Um dashboard moderno e elegante para visualização e análise de tráfego de rede.

Ver Repositório
4.0k2544há 1 mêsRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Neko Master Logo
Neko Master

Veja seu tráfego de rede com clareza.
Monitoramento em tempo real · Auditoria de tráfego · Suporte a múltiplos gateways

English | 中文

Stars Docker Pulls Docker Version Image Size License Docker CI Architecture Docs

[!IMPORTANT] Aviso Legal

Este projeto é uma ferramenta de análise e visualização de tráfego para ambientes de gateway local.

Ele não fornece nenhum serviço de acesso à rede, assinatura de proxy ou conectividade entre redes. Todos os dados são coletados do próprio ambiente de rede do usuário.

Este projeto é open-source sob a Licença MIT. Não assumimos qualquer responsabilidade por consequências decorrentes do uso deste software. Por favor, use-o em conformidade com as leis e regulamentos aplicáveis.

Sobre o Nome

Neko (ねこ) significa gato em japonês. Pronunciado /ˈneɪkoʊ/ (NEH-ko).

Como um gato, o Neko Master observa o tráfego de rede de forma silenciosa e precisa. É um painel de análise leve projetado para ambientes de gateway modernos.

📋 Índice

  • ✨ Recursos
  • 🚀 Início Rápido
  • 🤖 Implantação do Agent
  • 📖 Primeiro Uso
  • 🔧 Resolução de Conflito de Portas
  • 🐳 Configuração do Docker
  • 🗄️ ClickHouse (Opcional)
  • 🌐 Proxy Reverso e Túnel
  • 🔐 Autenticação e Segurança
  • ❓ FAQ
  • 🏗️ Guia de Arquitetura
  • 🤝 Feedback e Problemas
  • 📁 Estrutura do Projeto
  • 🛠️ Stack Tecnológico
  • 📄 Licença

✨ Recursos

🚀 Início Rápido

Opção 1: Docker Compose (Recomendado)

O docker-compose.yml integrado ao repositório mapeia 3000/3001/3002 por padrão. Os cenários A/B abaixo são templates mínimos para implantações comuns.

Cenário A: Implantação mínima (expor apenas a porta 3000)```yaml

services: neko-master: image: foru17/neko-master:latest container_name: neko-master restart: unless-stopped ports: - "3000:3000" # Web UI volumes: - ./data:/app/data # Local MMDB (optional, files should be downloaded into ./geoip) - ./geoip:/app/data/geoip:ro environment: - NODE_ENV=production - DB_PATH=/app/data/stats.db - COOKIE_SECRET=${COOKIE_SECRET}

root@kitploit:~
> Recomendado em `.env` (mesmo diretório que `docker-compose.yml`):
> `COOKIE_SECRET=<string aleatória de pelo menos 32 bytes>` (gerar com `openssl rand -hex 32`)

> Este modo é totalmente compatível com atualizações e funciona imediatamente.
> Se o WS não estiver roteado, a aplicação recorre automaticamente ao polling HTTP.

#### Cenário B: WebSocket em tempo real (recomendado com proxy reverso)```yaml
services:
  neko-master:
    image: foru17/neko-master:latest
    container_name: neko-master
    restart: unless-stopped
    ports:
      - "3000:3000" # Web UI
      - "3002:3002" # WebSocket (for Nginx / Tunnel forwarding)
    volumes:
      - ./data:/app/data
      # Local MMDB (optional, files should be downloaded into ./geoip)
      - ./geoip:/app/data/geoip:ro
    environment:
      - NODE_ENV=production
      - DB_PATH=/app/data/stats.db
      - COOKIE_SECRET=${COOKIE_SECRET}

Em seguida, execute:```bash docker compose up -d

root@kitploit:~
Abra <http://localhost:3000> para começar.

Se você usar o arquivo Compose integrado do repositório (padrão `3000/3001/3002`), execute o mesmo comando.

### Opção 2: Docker Run```bash
# Generate a fixed cookie secret first (for session persistence)
export COOKIE_SECRET="$(openssl rand -hex 32)"

Instalação

Requisitos

  • Python 3.8+
  • pip

Configuração

root@kitploit:~
# Clone o repositório
git clone https://github.com/example/tool.git
cd tool

# Instale as dependências
pip install -r requirements.txt

Uso

root@kitploit:~
python tool.py --target example.com

Licença

Este projeto está licenciado sob a Licença MIT - consulte o arquivo LICENSE para obter detalhes.```bash

Minimal (only 3000)

docker run -d
--name neko-master
-p 3000:3000
-v $(pwd)/data:/app/data
-e COOKIE_SECRET="$COOKIE_SECRET"
--restart unless-stopped
foru17/neko-master:latest

Real-time WS (with reverse proxy)

docker run -d
--name neko-master
-p 3000:3000
-p 3002:3002
-v $(pwd)/data:/app/data
-e COOKIE_SECRET="$COOKIE_SECRET"
--restart unless-stopped
foru17/neko-master:latest

root@kitploit:~
Abra <http://localhost:3000> para começar.

> O frontend usa `/api` de mesma origem por padrão, então a porta 3001 geralmente não é necessária externamente.
> Para WS em tempo real, seu proxy reverso/túnel precisa conseguir alcançar a porta `3002`. Caso contrário, o aplicativo recorre a polling HTTP de ~5s.

> Para `docker run`, altere as portas externas usando mapeamentos `-p` diretamente.
> Apenas se você usar acesso WS direto (sem proxy reverso) e a porta WS externa não for `3002`, passe também `-e WS_EXTERNAL_PORT=<external-ws-port>`.
>
> Modo de consulta MMDB local (opcional): monte `-v $(pwd)/geoip:/app/data/geoip:ro`,
> depois mude a fonte para Local em `Settings -> Preferences -> IP Lookup Source`.

### Opção 3: Script de Um Clique

Detecta automaticamente conflitos de porta e configura tudo:```bash
# Using curl
curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/setup.sh | bash

# Or using wget
wget -qO- https://raw.githubusercontent.com/foru17/neko-master/main/setup.sh | bash

O script irá automaticamente:

  • ✅ Baixar o docker-compose.yml
  • ✅ Verificar se as portas padrão (3000/3001/3002) estão em uso
  • ✅ Sugerir portas alternativas disponíveis
  • ✅ Criar o arquivo de configuração e iniciar o serviço

Opção 4: Código-Fonte```bash

1. Clone the repository

git clone https://github.com/foru17/neko-master.git cd neko-master

2. Install dependencies

pnpm install

3. Prepare collector env (source mode reads apps/collector/.env)

cp apps/collector/.env.example apps/collector/.env

4. Start development services

pnpm dev

root@kitploit:~
Abra <http://localhost:3000> para configurar.

> No modo source: o collector escuta em `3001/3002`, o web escuta em `3000` por padrão.
> Se você alterou `API_PORT` (não 3001), defina `API_URL` de acordo (por exemplo `API_URL=http://localhost:4001`) para que o rewrite de `/api` do web aponte para a API correta.
> `apps/collector/.env.local` tem precedência sobre `apps/collector/.env`.

## 🤖 Implantação do Agent

Use o modo Agent quando você quiser um serviço Neko Master centralizado e vários dispositivos remotos (OpenWrt, Linux, macOS) coletando dados do gateway local. O agent é executado próximo ao gateway, extrai os dados e reporta ao painel — o painel nunca se conecta diretamente ao gateway.

Tipos de gateway suportados: **Clash / Mihomo** (WebSocket em tempo real) e **Surge v5+** (polling HTTP).

### Instalação Rápida (comando gerado pela UI)

1. No dashboard, vá em `Settings → Backends`, adicione um backend `Agent`, selecione o tipo de gateway
2. Clique em **"View Agent Script"** e copie o comando de instalação de uma linha, depois execute-o no host de destino:```bash
# Clash / Mihomo gateway example
curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/apps/agent/install.sh \
  | env NEKO_SERVER='http://your-panel:3000' \
        NEKO_BACKEND_ID='1' \
        NEKO_BACKEND_TOKEN='ag_xxx' \
        NEKO_GATEWAY_TYPE='clash' \
        NEKO_GATEWAY_URL='http://127.0.0.1:9090' \
        sh

# Surge gateway example
curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/apps/agent/install.sh \
  | env NEKO_SERVER='http://your-panel:3000' \
        NEKO_BACKEND_ID='2' \
        NEKO_BACKEND_TOKEN='ag_yyy' \
        NEKO_GATEWAY_TYPE='surge' \
        NEKO_GATEWAY_URL='http://127.0.0.1:9091' \
        sh

Após a instalação, gerencie as instâncias com nekoagent:```bash nekoagent list # list all instances nekoagent status # check running state nekoagent logs # tail live logs nekoagent restart # restart nekoagent upgrade # global upgrade (CLI + binary)

root@kitploit:~
> O script detecta automaticamente uma instalação existente — se o `neko-agent` já estiver presente, ele apenas adiciona a nova instância sem baixar novamente.
> Várias instâncias podem ser executadas no mesmo host (com `NEKO_INSTANCE_NAME` diferente), cada uma apontando para um gateway diferente.

### Documentação do Agent

- [Visão Geral](https://github.com/foru17/neko-master/blob/main/docs/agent/overview.en.md): arquitetura, comparação entre Direct e Agent, modelo de segurança
- [Início Rápido](https://github.com/foru17/neko-master/blob/main/docs/agent/quick-start.en.md): configuração ponta a ponta, da UI ao agent em execução
- [Guia de Instalação](https://github.com/foru17/neko-master/blob/main/docs/agent/install.en.md): métodos de instalação, inicialização automática com systemd / launchd
- [Configuração](https://github.com/foru17/neko-master/blob/main/docs/agent/config.en.md): referência completa de flags e variáveis de ambiente
- [Fluxo de Release](https://github.com/foru17/neko-master/blob/main/docs/agent/release.en.md): política de versionamento e compatibilidade
- [Solução de Problemas](https://github.com/foru17/neko-master/blob/main/docs/agent/troubleshooting.en.md): erros comuns e correções

## 📖 Primeiro Uso

![Primeiro Uso](https://assets.kitploit.com/production/public/readmes/55481/574559c63ee5ba0aa6edfe15b7b451eeb203754122a3fa5c422f8342d2437879/55102606ffce9740febe5ee0afcdeb22ab67516f8219f7cf8dd6d0798ede4f45-display-v1.webp)

### Conectar Clash / Mihomo

1. Abra <http://localhost:3000>
2. A caixa de diálogo **Gateway Configuration** aparecerá na primeira visita
3. Preencha as informações de conexão do seu gateway de rede (por exemplo, OpenClash):
   - **Name**: Nome personalizado (por exemplo, "Home Gateway")
   - **Type**: Selecione `Clash / Mihomo`
   - **Host**: Endereço do backend do gateway (por exemplo, `192.168.101.1`)
   - **Port**: Porta do backend do gateway (por exemplo, `9090`)
   - **Token**: Preencha se o Secret estiver configurado, caso contrário deixe vazio
4. Clique em "Add Backend" para salvar
5. O sistema começará automaticamente a coletar e analisar dados de tráfego

> 💡 **Obter Endereço do Gateway**: Vá ao painel de controle do seu gateway (por exemplo, OpenClash) → Ative "External Control" → Copie o endereço da API

### Conectar Surge

![Configuração da API HTTP do Surge](https://assets.kitploit.com/production/public/readmes/55481/9cc7414a5acad5b6c3f5fadccd072b50f0b552b305ff5003024a3d1304bb9ec4/bae0f4f4debf30de5fdf5331b6befad02135ba827c5812c1e4fdf33614c3aede-display-v1.webp)

O Neko Master suporta a conexão com gateways Surge para visualização completa da cadeia de regras e análise de tráfego.

#### 1. Ativar a API HTTP do Surge

Ative a API remota HTTP na sua configuração do Surge:```ini
[General]
http-api = 127.0.0.1:9091
http-api-tls = false
http-api-web-dashboard = true

Ou configure através da interface gráfica do Surge:

  • HTTP Remote API: Settings → General → HTTP Remote API
  • Port: Padrão 9091
  • Authentication: Recomendado definir uma palavra-passe para maior segurança

2. Adicionar Backend Surge no Neko Master

  1. Abra a caixa de diálogo de definições do Neko Master
  2. Clique em "Add Backend"
  3. Preencha as informações de ligação:
    • Name: Nome personalizado (por exemplo, "Surge Home")
    • Type: Selecione Surge
    • Host: Endereço IP onde o Surge está a ser executado (por exemplo, 192.168.1.1 ou 127.0.0.1)
    • Port: Porta da HTTP API (padrão 9091)
    • Token: Palavra-passe da HTTP API (se configurada)
  4. Clique em "Test Connection" para verificar a configuração
  5. Guarde a configuração

💡 Nota: O Surge utiliza polling HTTP para obter dados (em comparação com o stream em tempo real via WebSocket do Clash), com um atraso de atualização de dados de aproximadamente 2 segundos.

🔧 Resolução de Conflitos de Portas

Se vir o erro "port already in use", aqui estão as soluções:

Solução 1: Utilizar o Ficheiro .env

Crie um ficheiro .env no mesmo diretório que o docker-compose.yml:```env WEB_EXTERNAL_PORT=8080 # Change Web UI port API_EXTERNAL_PORT=8081 # Change API port WS_EXTERNAL_PORT=8082 # Change WebSocket external port (only for direct access) COOKIE_SECRET=your-long-random-secret # Strongly recommended to keep fixed

root@kitploit:~
Em seguida, reinicie:```bash
docker compose down
docker compose up -d

Agora acesse http://localhost:8080

Solução 2: Modificar diretamente o docker-compose.yml```yaml

ports:

  • "8080:3000" # External 8080 → Internal 3000
  • "8082:3002" # External 8082 → Internal 3002 (for proxy/tunnel WS forwarding)
root@kitploit:~
> Nota: se você usar acesso WS direto (sem proxy reverso) e a porta WS externa não for `3002`, defina `WS_EXTERNAL_PORT=<external-ws-port>`.

### Solução 3: Usar Script de Um Clique```bash
curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/setup.sh | bash

O script detectará e sugerirá automaticamente as portas disponíveis.

🐳 Configuração do Docker

Portas

Variáveis de Ambiente (Implantação)

Variáveis de Ajuste Avançado (Opcional)

Prioridade de Resolução de API / WS

  1. Base do cliente da API: runtime-config.API_URL → NEXT_PUBLIC_API_URL → /api de mesma origem
  2. Alvo de reescrita do lado do servidor de /api: API_URL (padrão http://localhost:3001, aplicado nas reescritas do Next.js)
  3. URL do WS: runtime-config.WS_URL → NEXT_PUBLIC_WS_URL → candidatos automáticos (quando runtime-config.WS_PORT está definido, a porta direta é preferida; caso contrário, /_cm_ws é tentado primeiro)
  4. Porta do WS: runtime-config.WS_PORT (de WS_EXTERNAL_PORT) → NEXT_PUBLIC_WS_PORT →

Linha de Base do Ambiente de Produção (Recomendado)```env

NODE_ENV=production DB_PATH=/app/data/stats.db COOKIE_SECRET=<at least 32-byte random string>

Optional: default to local MMDB lookup

GEOIP_LOOKUP_PROVIDER=local

Keep false in normal operation

FORCE_ACCESS_CONTROL_OFF=false

root@kitploit:~
Use `openssl rand -hex 32` para gerar `COOKIE_SECRET`.

Recomendações adicionais:

1. Monte armazenamento persistente (por exemplo `./data:/app/data`) para evitar perda de dados e segredos.
2. Se usar acesso WS direto e a porta WS externa não for `3002`, defina `WS_EXTERNAL_PORT` de acordo.
3. Se a porta/endereço da API mudar na implantação de origem, atualize `API_URL` também.
4. Para consulta MMDB local, monte `./geoip:/app/data/geoip:ro` e altere a origem em `Settings -> Preferences -> IP Lookup Source`.
5. Os arquivos MMDB são grandes e não estão incluídos na imagem. Baixe-os e coloque-os em `./geoip` com nomes fixos:
   `GeoLite2-City.mmdb`, `GeoLite2-ASN.mmdb` (obrigatório) e `GeoLite2-Country.mmdb` (opcional).
   Fonte recomendada: <https://github.com/P3TERX/GeoLite.mmdb>.

> Detalhes avançados do Agent (instalação, configuração, release, compatibilidade) são mantidos em `docs/agent/*`.

## 🗄️ ClickHouse (Opcional)

SQLite é o mecanismo de armazenamento padrão do Neko Master e funciona bem para a maioria dos usuários.
Considere habilitar o ClickHouse se você precisar de:

- Conjuntos de dados muito grandes (centenas de milhares de entradas de domínio/IP)
- Consultas de agregação rápidas em longos intervalos de tempo (≥ 7 dias)
- Separação de estatísticas históricas do armazenamento de configuração/metadados

> O ClickHouse é totalmente opcional. O SQLite permanece como armazenamento de configuração e metadados independentemente de o ClickHouse estar habilitado.

### Visão Geral da Arquitetura

Quando o ClickHouse está habilitado, o sistema entra em **modo de escrita dupla**:```
BatchBuffer.flush()
    │
    ├──→ SQLite (config / metadata, always written)
    └──→ ClickHouse (stats traffic data, dual-write)
           └── Buffer tables → SummingMergeTree async merge

A leitura da fonte é controlada por STATS_QUERY_SOURCE (padrão: sqlite).

Ativando o ClickHouse (Docker)

Passo 1: Iniciar o contêiner ClickHouse

O docker-compose.yml integrado ao repositório já inclui um serviço ClickHouse, controlado por profiles: [clickhouse] para que não seja iniciado por padrão. A partir da raiz do repositório, execute:```bash docker compose --profile clickhouse up -d

root@kitploit:~
> Os dados do ClickHouse são persistidos em `./data/clickhouse`, separadamente do diretório de dados principal da aplicação.

Se você usar um **`docker-compose.yml` personalizado** (como o Cenário A/B acima), adicione o
bloco de serviço do ClickHouse manualmente:```yaml
services:
  neko-master:
    # ... your existing config ...
    environment:
      # append to existing environment section:
      - CH_ENABLED=${CH_ENABLED:-0}
      - CH_HOST=${CH_HOST:-clickhouse}
      - CH_PORT=${CH_PORT:-8123}
      - CH_DATABASE=${CH_DATABASE:-neko_master}
      - CH_USER=${CH_USER:-neko}
      - CH_PASSWORD=${CH_PASSWORD:-neko_master}
      - CH_WRITE_ENABLED=${CH_WRITE_ENABLED:-0}
      - STATS_QUERY_SOURCE=${STATS_QUERY_SOURCE:-sqlite}
    networks:
      - neko-master-network

  clickhouse:
    image: clickhouse/clickhouse-server:24.8
    container_name: neko-master-clickhouse
    restart: unless-stopped
    profiles: ["clickhouse"]
    ports:
      - "${CH_EXTERNAL_HTTP_PORT:-8123}:8123"
      - "${CH_EXTERNAL_NATIVE_PORT:-9000}:9000"
    volumes:
      - ./data/clickhouse:/var/lib/clickhouse
    environment:
      - CLICKHOUSE_DB=${CH_DATABASE:-neko_master}
      - CLICKHOUSE_USER=${CH_USER:-neko}
      - CLICKHOUSE_PASSWORD=${CH_PASSWORD:-neko_master}
      - CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1
    networks:
      - neko-master-network
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider http://127.0.0.1:8123/ping || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

networks:
  neko-master-network:
    driver: bridge

Passo 2: Configurar variáveis de ambiente

Adicione ao seu .env (mesmo diretório que docker-compose.yml):```env

Enable ClickHouse connection

CH_ENABLED=1

Enable dual-write

CH_WRITE_ENABLED=1

Read source: sqlite (default) / auto (smart routing) / clickhouse (force)

STATS_QUERY_SOURCE=auto

ClickHouse connection (defaults match docker-compose.yml, no change needed)

CH_HOST=clickhouse CH_PORT=8123 CH_DATABASE=neko_master CH_USER=neko CH_PASSWORD=neko_master

root@kitploit:~
Reiniciar:```bash
docker compose --profile clickhouse up -d

Variáveis de Ambiente do ClickHouse

Saúde e Fallback: Após CH_UNHEALTHY_THRESHOLD falhas de escrita consecutivas, o sistema marca automaticamente o ClickHouse como não saudável e retoma as escritas no SQLite — mesmo quando CH_ONLY_MODE=1. Assim que o ClickHouse se recupera, ele é marcado novamente como saudável e isso é registrado.

Guia de Migração para Usuários Existentes

Atualizando de uma versão apenas SQLite? Seus dados estão seguros. O arquivo SQLite (./data/stats.db) é totalmente preservado. Aqui está o caminho de migração gradual recomendado:

Fase 1: Escrita dupla (período de observação, ponto de partida recomendado)```env

CH_ENABLED=1 CH_WRITE_ENABLED=1 STATS_QUERY_SOURCE=sqlite # Keep reading from SQLite while CH accumulates data

root@kitploit:~
Inicie e observe os logs do `[ClickHouse Writer]` para confirmar gravações bem-sucedidas.

#### Fase 2: Alternar a fonte de leitura```env
STATS_QUERY_SOURCE=auto        # Smart routing: recent data from CH, historical from SQLite
# or
STATS_QUERY_SOURCE=clickhouse  # Force all reads to ClickHouse

Fase 3 (opcional): Migrar dados históricos

Para mover estatísticas históricas do SQLite para o ClickHouse:```bash

Standard migration (truncate CH then re-import, with consistency check)

./scripts/ch-migrate-docker.sh

Append mode (keep existing CH data, incremental import)

./scripts/ch-migrate-docker.sh --append

Specific time window

./scripts/ch-migrate-docker.sh --from 2026-02-01T00:00:00Z --to 2026-02-20T00:00:00Z

root@kitploit:~
#### Fase 4 (opcional): modo somente CH

Depois que o ClickHouse estiver em execução estável, interrompa as gravações de estatísticas no SQLite:```env
CH_ONLY_MODE=1

Mesmo com CH_ONLY_MODE=1, se o ClickHouse ficar indisponível, o sistema recorre automaticamente a escritas no SQLite — sem perda de dados.

Reverter para apenas SQLite

Pode sempre reverter completamente:```env CH_ENABLED=0 CH_WRITE_ENABLED=0 CH_ONLY_MODE=0 STATS_QUERY_SOURCE=sqlite

root@kitploit:~
Reinicie e tudo retorna ao modo SQLite puro. Os dados históricos permanecem intactos.

---

## 🌐 Proxy Reverso e Túnel

Abordagem recomendada: manter Web e WS sob o mesmo domínio, com roteamento por caminho:
`/` → `3000`, `/_cm_ws` → `3002`.

### Exemplo Padrão do Nginx```nginx
server {
  listen 443 ssl http2;
  server_name neko.example.com;

  location / {
    proxy_pass http://<neko-master-host>:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }

  location ^~ /_cm_ws {
    proxy_pass http://<neko-master-host>:3002;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_read_timeout 86400;
    proxy_send_timeout 86400;
    proxy_buffering off;
  }
}

Substituição opcional por variável de ambiente:```env

Not required by default (already /_cm_ws)

NEXT_PUBLIC_WS_URL=/custom_ws

root@kitploit:~
### Exemplo Padrão do Cloudflare Tunnel

`~/.cloudflared/config.yml`:```yaml
tunnel: <your-tunnel-name-or-id>
credentials-file: /path/to/<credentials>.json

ingress:
  - hostname: neko.example.com
    path: /_cm_ws*
    service: http://localhost:3002
  - hostname: neko.example.com
    path: /*
    service: http://localhost:3000
  - service: http_status:404

Executar:```bash cloudflared tunnel --config ~/.cloudflared/config.yml run

root@kitploit:~
Para rotas gerenciadas pelo painel Zero Trust (modo token), configure as mesmas duas rotas e mantenha `/_cm_ws*` acima de `/*`.

### Notas Importantes

1. Não use `ws` (sem barra inicial) como caminho WS; ele pode fazer overmatch e causar `/_next/static/...` → `426 Upgrade Required`
2. A rota WS deve estar acima do catch-all `/*`
3. `NEXT_PUBLIC_WS_URL` é opcional por padrão; se personalizado, reinicie o frontend/container após as alterações
4. Mapear apenas `3000` ainda funciona, mas recorre a HTTP polling (~5s), com menor responsividade em tempo real
5. Falhas do `beacon.min.js` (script de analytics do Cloudflare) normalmente não estão relacionadas ao fluxo de dados da API/WS do app
6. Nenhuma regra extra de reverse-proxy `/api` é necessária na maioria das configurações; o frontend usa `/api` na mesma origem e o app lida com o encaminhamento interno para `3001`

> Nota: `/_next/static/... 426 Upgrade Required` é comum em configurações de **reverse proxy / tunnel mal configurados**; é incomum em acesso local direto sem proxy.

### Suporte Multi-Arquitetura

As imagens Docker suportam tanto `linux/amd64` quanto `linux/arm64`.

### Persistência de Dados

Os dados são armazenados em `/app/data` dentro do container. Monte-o no host para evitar perda de dados:```yaml
volumes:
  - ./data:/app/data

Atualizar para a Versão Mais Recente```bash

Pull the latest image and restart

docker compose pull docker compose up -d

root@kitploit:~
## 🔐 Autenticação e Segurança

O Neko Master suporta autenticação de acesso para proteger os dados do dashboard.

### Linha de Base de Segurança para Produção

1. Defina um `COOKIE_SECRET` fixo (caso contrário, as sessões podem ser invalidadas após a reinicialização).
2. Não mantenha `FORCE_ACCESS_CONTROL_OFF=true` ativado em operação normal.
3. Use `SHOWCASE_SITE_MODE=true` apenas para ambientes de demonstração públicos (as operações de escrita são restringidas).

Exemplo:```env
COOKIE_SECRET=<at least 32-byte random string>
# FORCE_ACCESS_CONTROL_OFF=false
# SHOWCASE_SITE_MODE=false

Ativar / Desativar Autenticação

  1. Abra o dashboard e clique em "Settings" na barra lateral inferior esquerda.
  2. Vá para a aba "Security".
  3. Ative/desative o controle de acesso e defina seu token.

Token Esquecido (Redefinição de Emergência)

Se você esqueceu o token, defina temporariamente FORCE_ACCESS_CONTROL_OFF=true para entrar no modo de emergência.

Docker Compose

  1. Adicione ao docker-compose.yml: ```yaml environment:
    • FORCE_ACCESS_CONTROL_OFF=true
    root@kitploit:~
  2. Reiniciar: ```bash docker compose up -d
    root@kitploit:~
  3. Abra o dashboard e redefina o token em "Settings -> Security".
  4. Remova esta variável de ambiente imediatamente após a redefinição, depois reinicie novamente.

Docker CLI

  1. Pare e remova o contêiner: ```bash docker stop neko-master docker rm neko-master
    root@kitploit:~
  2. Execute novamente com a flag de emergência: ```bash docker run -d
    --name neko-master
    -p 3000:3000
    -v $(pwd)/data:/app/data
    -e FORCE_ACCESS_CONTROL_OFF=true
    foru17/neko-master:latest
    root@kitploit:~
  3. Redefina o token e, em seguida, remova esta flag e reinicie normalmente.

❓ FAQ

P: Posso executar normalmente expondo apenas 3000:3000?

R: Sim. As funcionalidades principais continuam a funcionar. Se o WS não estiver roteado, a aplicação recorre automaticamente ao polling HTTP. Para uma experiência em tempo real completa, roteie /_cm_ws para 3002.

P: Conflito de portas ou inacessível após alterações de portas?

R: Crie/atualize o .env (no mesmo diretório que o docker-compose.yml):```env WEB_EXTERNAL_PORT=8080 API_EXTERNAL_PORT=8081 WS_EXTERNAL_PORT=8082

root@kitploit:~
Em seguida, reinicie:```bash
docker compose down
docker compose up -d

P: Por que o login/sessão desaparece após reiniciar?

R: Normalmente porque COOKIE_SECRET não é fixo ou o diretório de dados não é persistido.

  1. Defina um COOKIE_SECRET fixo
  2. Monte ./data:/app/data

P: Quais arquivos são necessários para a consulta local de MMDB?

R: Crie ./geoip no diretório do seu projeto (recomenda-se no mesmo nível de docker-compose.yml), depois coloque:

  1. GeoLite2-City.mmdb (obrigatório)
  2. GeoLite2-ASN.mmdb (obrigatório)
  3. GeoLite2-Country.mmdb (opcional)

Fonte recomendada: https://github.com/P3TERX/GeoLite.mmdb. Dentro do container, o caminho de consulta fixo é /app/data/geoip, então mantenha: ./geoip:/app/data/geoip:ro. Para atualizar depois, basta substituir os arquivos no host ./geoip.

P: Falha ao conectar OpenClash / gateway?

R: Verifique:

  1. O controle externo está habilitado no lado do gateway
  2. Host/porta estão corretos
  3. Token/Secret estão corretos (se configurado)
  4. A rede do container consegue alcançar o gateway

P: Como fazer backup e restaurar dados?

R: Faça backup primeiro:```bash cp -r ./data ./data-backup-$(date +%Y%m%d)

root@kitploit:~
Restaurar:```bash
docker compose down
cp -r ./data-backup-YYYYMMDD/. ./data/
docker compose up -d

🏗️ Guia de Arquitetura

Se você quer entender rapidamente a profundidade do design do sistema, leia nesta ordem:

  1. Diagrama de Arquitetura do Sistema: camadas ponta a ponta e responsabilidades dos módulos → docs/architecture.en.md
  2. Fluxo de Dados: pipelines de coleta e agregação do Clash / Surge
  3. Modelo de Dados e Armazenamento: esquema SQLite, tabelas ClickHouse Buffer, política de retenção
  4. Design do Canal em Tempo Real: estratégia de merge do RealtimeStore e push via WS
  5. Módulo ClickHouse: arquitetura de escrita dupla, fallback de saúde, roteamento de leitura

Índice completo da documentação: docs/README.md

Esta documentação cobre o design central de coleta, agregação, cache, push em tempo real e gerenciamento multi-backend.

🤝 Feedback e Problemas

Este projeto usa GitHub Issue Templates (Bug / Feature / Support).

Por favor, inclua pelo menos:

  1. Método de implantação (Compose / Docker Run / Source)
  2. Informações de versão (tag da imagem ou commit)
  3. Variáveis de ambiente principais (mascaradas, ex.: COOKIE_SECRET=***)
  4. Passos de reprodução e comportamento esperado vs. real
  5. Logs principais (docker logs, console do navegador, erros de rede)

📁 Estrutura do Projeto```

neko-master/ ├── docker-compose.yml # Docker Compose config ├── Dockerfile # Docker image build ├── setup.sh # One-click setup script ├── docker-start.sh # Docker container startup script ├── start.sh # Source code dev startup script ├── docs/ # Documentation (see docs/README.md) │ ├── README.md # Documentation index (English default) │ ├── README.zh.md # Documentation index (Chinese) │ ├── README.en.md # Documentation index (English mirror) │ ├── architecture.md # System architecture (Chinese) │ ├── architecture.en.md # System architecture (English) │ ├── release-checklist.md │ ├── agent/ # Agent docs (bilingual) │ │ ├── overview.md / overview.en.md │ │ ├── quick-start.md / quick-start.en.md │ │ ├── install.md / install.en.md │ │ ├── config.md / config.en.md │ │ ├── release.md / release.en.md │ │ └── troubleshooting.md / troubleshooting.en.md │ ├── research/ # Research reports │ └── dev/ # Internal development docs ├── assets/ # Screenshots and icons ├── apps/ │ ├── collector/ # Data collection service (Node.js + WebSocket) │ ├── agent/ # Agent daemon (Go) │ └── web/ # Next.js frontend app └── packages/ └── shared/ # Shared types and utilities

root@kitploit:~
## 🛠️ Stack Tecnológico

- **Frontend**: [Next.js 16](https://nextjs.org/) + [React 19](https://react.dev/) + [TypeScript](https://www.typescriptlang.org/)
- **Estilização**: [Tailwind CSS](https://tailwindcss.com/) + [shadcn/ui](https://ui.shadcn.com/)
- **Gráficos**: [Recharts](https://recharts.org/)
- **i18n**: [next-intl](https://next-intl-docs.vercel.app/)
- **Backend**: [Node.js](https://nodejs.org/) + [Fastify](https://www.fastify.io/) + WebSocket
- **Banco de Dados**: [SQLite](https://www.sqlite.org/) ([better-sqlite3](https://github.com/WiseLibs/better-sqlite3)) + [ClickHouse](https://clickhouse.com/) (opcional)
- **Build**: [pnpm](https://pnpm.io/) + [Turborepo](https://turbo.build/)

## 🤝 Contribuindo

Contribuições são bem-vindas!

- 🐛 [Reportar Bug](https://github.com/foru17/neko-master/issues/new)
- 💡 [Solicitar Funcionalidade](https://github.com/foru17/neko-master/issues/new)
- 🔧 [Contribuir com Código](https://github.com/foru17/neko-master/pulls)

Antes de abrir um PR, leia o [CONTRIBUTING.md](https://github.com/foru17/neko-master/blob/main/CONTRIBUTING.md) (fluxo de trabalho, verificações, requisitos de i18n/modo escuro).

**Desenvolvendo com uma ferramenta de codificação com IA?** (Claude Code, Copilot, Cursor, Codex, ...) Aponte-a para [AGENTS.md](https://github.com/foru17/neko-master/blob/main/AGENTS.md) — convenções, contratos principais e o mapa do projeto — além dos guias de fluxo de trabalho específicos por tarefa em [`.claude/skills/`](https://github.com/foru17/neko-master/blob/main/.claude/skills). O Claude Code captura ambos automaticamente.

## 📄 Licença

[MIT](https://github.com/foru17/neko-master/blob/main/LICENSE) © [foru17](https://github.com/foru17)

---

## ⭐ Histórico de Estrelas

[![Star History Chart](https://api.star-history.com/svg?repos=foru17/neko-master&type=date&legend=top-left)](https://www.star-history.com/#foru17/neko-master&type=date&legend=top-left)

---

<p align="center">
  <sub>Feito com ❤️ por <a href="https://github.com/foru17">@foru17</a></sub><br>
  <sub>Se este projeto te ajuda, considere dar uma ⭐</sub>
</p>
Baixar ferramenta
Neko Master Preview (Light 1) Neko Master Preview (Light 2)
Neko Master Preview (Dark 1) Neko Master Preview (Dark 2)
RecursoDescrição
📊 Monitoramento em Tempo RealColeta em tempo real via WebSocket com latência em milissegundos
📈 Análise de TendênciasTendências de tráfego multidimensionais: 30min / 1h / 24h
🌐 Análise de DomíniosVisualize tráfego, IPs associados e contagem de conexões por domínio
🗺️ Análise de IPExibição de ASN, geolocalização e domínios associados
🚀 Estatísticas de ProxyDistribuição de tráfego e contagem de conexões por nó de proxy
📱 Suporte a PWAInstale como aplicativo de desktop para uma experiência nativa
🌙 Modo EscuroSuporte a tema Claro / Escuro / Sistema
🌍 Suporte a i18nAlternância perfeita entre Inglês / Chinês
🔄 Multi-BackendMonitore múltiplas instâncias de backend OpenClash simultaneamente
PortaFinalidadeExterno ObrigatórioDescrição
3000Interface Web✅Ponto de entrada do frontend
3001APIOpcionalO frontend usa /api de mesma origem por padrão; geralmente não é necessária exposição pública (o Compose padrão a mapeia)
3002WebSocketOpcionalEndpoint de push em tempo real; recomendado apenas para encaminhamento via proxy reverso/túnel (o Compose padrão o mapeia)
VariávelPadrãoFinalidadeQuando definir
WEB_PORT3000Porta de escuta da Web (dentro do contêiner)Geralmente inalterada
API_PORT3001Porta de escuta da API (dentro do contêiner)Geralmente inalterada
COLLECTOR_WS_PORT3002Porta de escuta do WS (dentro do contêiner)Geralmente inalterada
DB_PATH/app/data/stats.dbCaminho dos dados SQLiteCaminho de dados personalizado
WEB_EXTERNAL_PORT3000Mapeamento da porta web externa em docker-compose.ymlPorta web externa alterada
API_EXTERNAL_PORT3001Mapeamento da porta da API externa em docker-compose.ymlAcesso direto à API externa necessário
WS_EXTERNAL_PORT3002Mapeamento da porta WS externa em docker-compose.yml; também usado para inferência direta da porta WSAcesso direto ao WS sem proxy e porta WS externa alterada
NEXT_PUBLIC_API_URLvazioSubstituir a URL base da API do frontend (ex.: https://api.example.com)A API não é /api de mesma origem
NEXT_PUBLIC_WS_URLvazioSubstituir a URL do WS do frontend (URL absoluta ou /custom_ws)Caminho/domínio WS personalizado
NEXT_PUBLIC_WS_PORT3002Porta de fallback para conexão direta ao WS (somente em tempo de build — defini-la em tempo de execução do Docker não tem efeito; use WS_EXTERNAL_PORT em vez disso)Apenas para builds de código-fonte personalizados
API_URLhttp://localhost:3001Alvo de reescrita de /api do Next.js (principalmente builds de código-fonte/personalizados)Endereço de escuta da API alterado
COOKIE_SECRETgerado automaticamenteSegredo de assinatura de cookies; se não for fixado, as sessões podem ser invalidadas após reinício quando o diretório de dados não é persistidoFortemente recomendado em produção
GEOIP_LOOKUP_PROVIDERonlineFonte de geolocalização de IP (online / local)Padrão para consulta local em MMDB
GEOIP_ONLINE_API_URLhttps://api.ipinfo.es/ipinfoEndpoint da API online de geolocalização de IP (deve ser compatível com o esquema de resposta de ipinfo.my)Defina apenas quando você implantar um endpoint compatível
FORCE_ACCESS_CONTROL_OFFfalseForçar a desativação do controle de acesso (recuperação de emergência)Uso temporário apenas quando o token for perdido
SHOWCASE_SITE_MODEfalseModo vitrine somente leitura (bloqueia operações de escrita sensíveis)Apenas para sites de demonstração públicos
VariávelPadrãoDescrição
FLUSH_INTERVAL_MS30000Intervalo de descarga do buffer para gravações do coletor
FLUSH_MAX_BUFFER_SIZE5000Número máximo de entradas no buffer antes da descarga antecipada
REALTIME_MAX_MINUTES180Tamanho da janela em memória em tempo real (minutos)
REALTIME_RANGE_END_TOLERANCE_MS120000Tolerância de horário final para consultas de intervalo
SURGE_POLICY_SYNC_INTERVAL_MS600000Intervalo de sincronização da política de Surge
DB_RANGE_QUERY_CACHE_TTL_MS8000TTL do cache de consultas de intervalo
DB_HISTORICAL_QUERY_CACHE_TTL_MS300000TTL do cache de consultas históricas
DB_RANGE_QUERY_CACHE_MAX_ENTRIES1024Número máximo de entradas no cache de consultas de intervalo
DB_RANGE_QUERY_CACHE_DISABLEDvazioDefina 1 para desativar o cache de consultas de intervalo
DEBUG_SURGEfalseAtivar logs de depuração do coletor Surge (true)
3002
  • Em implantações normais, NEXT_PUBLIC_WS_URL geralmente é desnecessário, a menos que você use um caminho/domínio WS personalizado
  • VariávelPadrãoDescrição
    CH_ENABLED0Ativa a conexão com o ClickHouse (1 para ativar)
    CH_WRITE_ENABLED0Ativa a escrita dupla (requer CH_ENABLED=1)
    CH_ONLY_MODE0Quando o CH está saudável, ignora as escritas de estatísticas no SQLite (modo apenas CH)
    CH_HOSTclickhouseEndereço do host do ClickHouse
    CH_PORT8123Porta HTTP do ClickHouse
    CH_DATABASEneko_masterNome do banco de dados
    CH_USERnekoNome de usuário
    CH_PASSWORDneko_masterSenha
    CH_SECURE0Usar conexão HTTPS
    CH_REQUIRED0Recusar a inicialização se o CH estiver indisponível
    CH_AUTO_CREATE_TABLES1Criar tabelas automaticamente na primeira inicialização
    CH_WRITE_MAX_PENDING_BATCHES200Máximo de lotes de escrita pendentes
    CH_UNHEALTHY_THRESHOLD5Falhas consecutivas antes de marcar como não saudável (fallback automático para SQLite)
    STATS_QUERY_SOURCEsqliteFonte de leitura: sqlite / auto / clickhouse
    CH_COMPARE_ENABLED0Ativa a verificação de consistência SQLite ↔ ClickHouse
    CH_EXTERNAL_HTTP_PORT8123Porta HTTP externa do ClickHouse (mapeamento do Compose)
    CH_EXTERNAL_NATIVE_PORT9000Porta Native externa do ClickHouse (mapeamento do Compose)