Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
neko-master — Un panel moderno y elegante para la visualización y el análisis del tráfico de red. | Kitploit
Herramientas/GitHubGitHub/foru17/neko-master
Mapeo de RedesRecopilación de InformaciónSeguridad de RedesPrivacidadUtilidades y FrameworksAnálisis de Registros
GitHubforu17/neko-master

neko-master

Un panel moderno y elegante para la visualización y el análisis del tráfico de red.

Ver Repositorio
4.0k2544hace 1 mesRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Neko Master Logo
Neko Master

Ve el tráfico de tu red con claridad.
Monitoreo en tiempo real · Auditoría de tráfico · Soporte multi-gateway

English | 中文

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

[!IMPORTANT] Aviso legal

Este proyecto es una herramienta de análisis y visualización de tráfico para entornos de gateway locales.

No proporciona ningún servicio de acceso a red, suscripción de proxy ni conectividad entre redes. Todos los datos se recopilan del propio entorno de red del usuario.

Este proyecto es de código abierto bajo la Licencia MIT. No asumimos ninguna responsabilidad por las consecuencias derivadas del uso de este software. Por favor, úsalo cumpliendo con las leyes y regulaciones aplicables.

Acerca del nombre

Neko (ねこ) significa gato en japonés. Se pronuncia /ˈneɪkoʊ/ (NEH-ko).

Como un gato, Neko Master observa el tráfico de red de forma silenciosa y precisa. Es un panel de análisis ligero diseñado para entornos de gateway modernos.

📋 Tabla de contenidos

  • ✨ Características
  • 🚀 Inicio rápido
  • 🤖 Despliegue del Agent
  • 📖 Primer uso
  • 🔧 Resolución de conflictos de puertos
  • 🐳 Configuración de Docker
  • 🗄️ ClickHouse (Opcional)
  • 🌐 Proxy inverso y túnel
  • 🔐 Autenticación y seguridad
  • ❓ Preguntas frecuentes
  • 🏗️ Guía de arquitectura
  • 🤝 Comentarios e incidencias
  • 📁 Estructura del proyecto
  • 🛠️ Stack tecnológico
  • 📄 Licencia

✨ Características

🚀 Inicio rápido

Opción 1: Docker Compose (Recomendado)

El docker-compose.yml incluido en el repositorio mapea 3000/3001/3002 por defecto. Los escenarios A/B a continuación son plantillas mínimas para despliegues comunes.

Escenario A: Despliegue mínimo (solo exponer 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 en `.env` (mismo directorio que `docker-compose.yml`):
> `COOKIE_SECRET=<cadena aleatoria de al menos 32 bytes>` (generar con `openssl rand -hex 32`)

> Este modo es totalmente compatible con actualizaciones y funciona sin configuración adicional.
> Si WS no está enrutado, la aplicación recurre automáticamente a HTTP polling.

#### Escenario B: WebSocket en tiempo real (recomendado con proxy inverso)```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}

Luego ejecuta:```bash docker compose up -d

root@kitploit:~
Abre <http://localhost:3000> para comenzar.

Si utilizas el archivo Compose integrado del repositorio (por defecto `3000/3001/3002`), ejecuta el mismo comando.

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

| -l | --list | List all available modules | | -m | --module | Specify a module to use | | -o | --output | Output file path | | -p | --proxy | Proxy URL | | -r | --report | Generate a report | | -s | --silent | Silent mode | | -t | --threads | Number of threads | | -u | --url | Target URL | | | | Verbose output | | | | Wordlist file path | | | | Exclude modules |

Examples

root@kitploit:~
# Basic scan
python3 kitploit.py -u https://example.com

# Scan with specific modules
python3 kitploit.py -u https://example.com -m sqli,xss

# Scan with proxy
python3 kitploit.py -u https://example.com -p http://127.0.0.1:8080

# Generate report
python3 kitploit.py -u https://example.com -r report.html

Modules

Configuration

The tool can be configured using a configuration file located at ~/.kitploit/config.yaml.

root@kitploit:~
# Default configuration
threads: 10
timeout: 30
user_agent: "Mozilla/5.0"
follow_redirects: true
verify_ssl: false
proxy: null
output_dir: "./reports"

Contributing

We welcome contributions from the community. Please read our Contributing Guidelines before submitting a pull request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Disclaimer

This tool is intended for educational and ethical testing purposes only. The authors are not responsible for any misuse or damage caused by this program. Always obtain proper authorization before testing any system.```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:~
Abre <http://localhost:3000> para empezar.

> El frontend usa `/api` del mismo origen por defecto, por lo que el puerto 3001 normalmente no es necesario externamente.
> Para WS en tiempo real, tu proxy inverso/túnel debe poder alcanzar el puerto `3002`. Si no, la aplicación recurre a sondeo HTTP de ~5s.

> Para `docker run`, cambia los puertos externos usando mapeos `-p` directamente.
> Solo si usas acceso directo a WS (sin proxy inverso) y el puerto WS externo no es `3002`, pasa también `-e WS_EXTERNAL_PORT=<external-ws-port>`.
>
> Modo de búsqueda local de MMDB (opcional): monta `-v $(pwd)/geoip:/app/data/geoip:ro`,
> luego cambia la fuente a Local en `Settings -> Preferences -> IP Lookup Source`.

### Opción 3: Script de un solo clic

Detecta automáticamente conflictos de puertos y configura todo:```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

El script hará automáticamente lo siguiente:

  • ✅ Descargar docker-compose.yml
  • ✅ Comprobar si los puertos predeterminados (3000/3001/3002) están en uso
  • ✅ Sugerir puertos alternativos disponibles
  • ✅ Crear el archivo de configuración e iniciar el servicio

Opción 4: Código fuente```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:~
Abre <http://localhost:3000> para configurar.

> En modo fuente: el colector escucha en `3001/3002`, la web escucha en `3000` por defecto.
> Si cambiaste `API_PORT` (no 3001), configura `API_URL` en consecuencia (por ejemplo `API_URL=http://localhost:4001`) para que la reescritura de `/api` de la web apunte a la API correcta.
> `apps/collector/.env.local` tiene prioridad sobre `apps/collector/.env`.

## 🤖 Despliegue del Agente

Usa el modo Agente cuando quieras un servicio Neko Master centralizado y múltiples dispositivos remotos (OpenWrt, Linux, macOS) recopilando datos del gateway local. El agente se ejecuta cerca del gateway, extrae datos y los reporta al panel — el panel nunca se conecta directamente al gateway.

Tipos de gateway soportados: **Clash / Mihomo** (WebSocket en tiempo real) y **Surge v5+** (sondeo HTTP).

### Instalación Rápida (comando generado por la UI)

1. En el panel, ve a `Settings → Backends`, añade un backend `Agent`, selecciona el tipo de gateway
2. Haz clic en **"View Agent Script"** y copia el comando de instalación de una línea, luego ejecútalo en el 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

Después de la instalación, gestione las instancias con 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:~
> El script detecta automáticamente una instalación existente — si `neko-agent` ya está presente, solo añade la nueva instancia sin volver a descargarlo.
> Se pueden ejecutar múltiples instancias en el mismo host (con diferente `NEKO_INSTANCE_NAME`), cada una apuntando a un gateway distinto.

### Documentación del Agent

- [Overview](https://github.com/foru17/neko-master/blob/main/docs/agent/overview.en.md): arquitectura, comparación Direct vs Agent, modelo de seguridad
- [Quick Start](https://github.com/foru17/neko-master/blob/main/docs/agent/quick-start.en.md): configuración de extremo a extremo desde la UI hasta el agent en ejecución
- [Install Guide](https://github.com/foru17/neko-master/blob/main/docs/agent/install.en.md): métodos de instalación, autoarranque con systemd / launchd
- [Configuration](https://github.com/foru17/neko-master/blob/main/docs/agent/config.en.md): referencia completa de flags y variables de entorno
- [Release Flow](https://github.com/foru17/neko-master/blob/main/docs/agent/release.en.md): política de versionado y compatibilidad
- [Troubleshooting](https://github.com/foru17/neko-master/blob/main/docs/agent/troubleshooting.en.md): errores comunes y soluciones

## 📖 Primer uso

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

### Conectar Clash / Mihomo

1. Abre <http://localhost:3000>
2. El diálogo **Gateway Configuration** aparecerá en la primera visita
3. Rellena la información de conexión de tu gateway de red (p. ej., OpenClash):
   - **Name**: Nombre personalizado (p. ej., "Home Gateway")
   - **Type**: Selecciona `Clash / Mihomo`
   - **Host**: Dirección del backend del gateway (p. ej., `192.168.101.1`)
   - **Port**: Puerto del backend del gateway (p. ej., `9090`)
   - **Token**: Rellénalo si hay un Secret configurado; de lo contrario, déjalo vacío
4. Haz clic en "Add Backend" para guardar
5. El sistema comenzará automáticamente a recopilar y analizar los datos de tráfico

> 💡 **Obtener la dirección del gateway**: Ve al panel de control de tu gateway (p. ej., OpenClash) → Activa "External Control" → Copia la dirección de la API

### Conectar Surge

![Surge HTTP API Configuration](https://assets.kitploit.com/production/public/readmes/55481/9cc7414a5acad5b6c3f5fadccd072b50f0b552b305ff5003024a3d1304bb9ec4/bae0f4f4debf30de5fdf5331b6befad02135ba827c5812c1e4fdf33614c3aede-display-v1.webp)

Neko Master admite la conexión a gateways Surge para la visualización completa de la cadena de reglas y el análisis de tráfico.

#### 1. Activar la API HTTP de Surge

Activa la API remota HTTP en tu configuración de Surge:```ini
[General]
http-api = 127.0.0.1:9091
http-api-tls = false
http-api-web-dashboard = true

Configurar mediante la interfaz gráfica de Surge:

  • HTTP Remote API: Settings → General → HTTP Remote API
  • Puerto: Predeterminado 9091
  • Autenticación: Se recomienda establecer una contraseña para mayor seguridad

2. Añadir el backend de Surge en Neko Master

  1. Abrir el diálogo de configuración de Neko Master
  2. Hacer clic en "Add Backend"
  3. Rellenar la información de conexión:
    • Nombre: Nombre personalizado (p. ej., "Surge Home")
    • Tipo: Seleccionar Surge
    • Host: Dirección IP donde se ejecuta Surge (p. ej., 192.168.1.1 o 127.0.0.1)
    • Puerto: Puerto de la HTTP API (predeterminado 9091)
    • Token: Contraseña de la HTTP API (si está configurada)
  4. Hacer clic en "Test Connection" para verificar la configuración
  5. Guardar la configuración

💡 Nota: Surge utiliza sondeo HTTP para obtener datos (en comparación con el flujo en tiempo real por WebSocket de Clash), con un retraso de actualización de datos de aproximadamente 2 segundos.

🔧 Resolución de conflictos de puertos

Si ves el error "port already in use", aquí tienes las soluciones:

Solución 1: Usar un archivo .env

Crea un archivo .env en el mismo directorio que 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:~
Luego reinicia:```bash
docker compose down
docker compose up -d

Ahora accede a http://localhost:8080

Solución 2: Modificar directamente 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: si usas acceso directo por WS (sin proxy inverso) y el puerto WS externo no es `3002`, establece `WS_EXTERNAL_PORT=<external-ws-port>`.

### Solución 3: Usar el script de un solo clic```bash
curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/setup.sh | bash

El script detectará y sugerirá automáticamente los puertos disponibles.

🐳 Configuración de Docker

Puertos

Variables de entorno (Despliegue)

Variables de ajuste avanzado (Opcionales)

Prioridad de resolución de API / WS

  1. Base del cliente de API: runtime-config.API_URL → NEXT_PUBLIC_API_URL → mismo origen /api
  2. Destino de reescritura del lado del servidor de /api: API_URL (por defecto http://localhost:3001, aplicado en las reescrituras de Next.js)
  3. URL de WS: runtime-config.WS_URL → NEXT_PUBLIC_WS_URL → candidatos automáticos (cuando se establece runtime-config.WS_PORT, se prefiere el puerto directo; de lo contrario, se prueba primero /_cm_ws)
  4. Puerto de WS: runtime-config.WS_PORT (desde WS_EXTERNAL_PORT) → NEXT_PUBLIC_WS_PORT →

Línea base del entorno de producción (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:~
Utilice `openssl rand -hex 32` para generar `COOKIE_SECRET`.

Recomendaciones adicionales:

1. Monte almacenamiento persistente (por ejemplo `./data:/app/data`) para evitar la pérdida de datos y secretos.
2. Si utiliza acceso WS directo y el puerto WS externo no es `3002`, configure `WS_EXTERNAL_PORT` en consecuencia.
3. Si el puerto/dirección de la API cambia en el despliegue de origen, actualice `API_URL` también.
4. Para la búsqueda local de MMDB, monte `./geoip:/app/data/geoip:ro` y cambie la fuente en `Settings -> Preferences -> IP Lookup Source`.
5. Los archivos MMDB son grandes y no están incluidos en la imagen. Descárguelos y colóquelos en `./geoip` con nombres fijos:
   `GeoLite2-City.mmdb`, `GeoLite2-ASN.mmdb` (obligatorio), y `GeoLite2-Country.mmdb` (opcional).
   Fuente recomendada: <https://github.com/P3TERX/GeoLite.mmdb>.

> Los detalles avanzados del Agent (instalación, configuración, lanzamiento, compatibilidad) se mantienen en `docs/agent/*`.

## 🗄️ ClickHouse (Opcional)

SQLite es el motor de almacenamiento predeterminado de Neko Master y funciona bien para la mayoría de los usuarios.
Considere habilitar ClickHouse si necesita:

- Conjuntos de datos muy grandes (cientos de miles de entradas de dominio/IP)
- Consultas de agregación rápidas sobre rangos de tiempo largos (≥ 7 días)
- Separación de estadísticas históricas del almacenamiento de configuración/metadatos

> ClickHouse es completamente opcional. SQLite permanece como el almacén de configuración y metadatos independientemente de si ClickHouse está habilitado.

### Descripción general de la arquitectura

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

La lectura de la fuente está controlada por STATS_QUERY_SOURCE (por defecto: sqlite).

Habilitar ClickHouse (Docker)

Paso 1: Iniciar el contenedor de ClickHouse

El archivo docker-compose.yml integrado en el repositorio ya incluye un servicio de ClickHouse, condicionado por profiles: [clickhouse] para que no se inicie por defecto. Desde la raíz del repositorio, ejecuta:```bash docker compose --profile clickhouse up -d

root@kitploit:~
> Los datos de ClickHouse se persisten en `./data/clickhouse`, separados del directorio de datos principal de la aplicación.

Si utilizas un **`docker-compose.yml` personalizado** (como el Escenario A/B anterior), añade el
bloque de servicio de 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

Paso 2: Configurar variables de entorno

Añade a tu .env (mismo directorio 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

Variables de Entorno de ClickHouse

Salud y Retorno: Después de CH_UNHEALTHY_THRESHOLD fallos de escritura consecutivos, el sistema marca automáticamente ClickHouse como no saludable y reanuda las escrituras en SQLite—incluso cuando CH_ONLY_MODE=1. Una vez que ClickHouse se recupera, se vuelve a marcar como saludable y se registra.

Guía de Migración para Usuarios Existentes

¿Actualizando desde una versión solo SQLite? Tus datos están seguros. El archivo SQLite (./data/stats.db) se conserva completamente. Aquí está la ruta de migración gradual recomendada:

Fase 1: Escritura dual (período de observación, punto 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 y observe los registros de `[ClickHouse Writer]` para confirmar escrituras exitosas.

#### Fase 2: Cambiar la fuente de lectura```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 datos históricos

Para mover las estadísticas históricas de SQLite a 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 solo CH

Una vez que ClickHouse esté funcionando de forma estable, detén las escrituras de estadísticas en SQLite:```env
CH_ONLY_MODE=1

Incluso con CH_ONLY_MODE=1, si ClickHouse deja de estar saludable, el sistema recurre automáticamente a escrituras en SQLite—sin pérdida de datos.

Revertir a solo SQLite

Siempre puedes revertir por completo:```env CH_ENABLED=0 CH_WRITE_ENABLED=0 CH_ONLY_MODE=0 STATS_QUERY_SOURCE=sqlite

root@kitploit:~
Reinicia y todo vuelve al modo SQLite puro. Los datos históricos permanecen intactos.

---

## 🌐 Proxy Inverso y Túnel

Enfoque recomendado: mantener Web y WS bajo el mismo dominio, con enrutamiento por ruta:
`/` → `3000`, `/_cm_ws` → `3002`.

### Ejemplo Estándar de 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;
  }
}

Anulación opcional de env:```env

Not required by default (already /_cm_ws)

NEXT_PUBLIC_WS_URL=/custom_ws

root@kitploit:~
### Ejemplo estándar de 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

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

root@kitploit:~
Para rutas gestionadas por el panel de Zero Trust (modo token), configure las mismas dos rutas y mantenga `/_cm_ws*` por encima de `/*`.

### Notas clave

1. No use `ws` (sin barra inicial) como ruta WS; puede coincidir en exceso y provocar `/_next/static/...` → `426 Upgrade Required`
2. La ruta WS debe estar por encima del catch-all `/*`
3. `NEXT_PUBLIC_WS_URL` es opcional por defecto; si se personaliza, reinicie el frontend/contenedor tras los cambios
4. Mapear solo `3000` sigue funcionando, pero recurre a HTTP polling (~5s), con menor capacidad de respuesta en tiempo real
5. Los fallos de `beacon.min.js` (script de analítica de Cloudflare) normalmente no están relacionados con el flujo de datos de la API/WS de la aplicación
6. No se requiere una regla adicional de reverse-proxy `/api` en la mayoría de configuraciones; el frontend usa `/api` del mismo origen y la aplicación gestiona el reenvío interno a `3001`

> Nota: `/_next/static/... 426 Upgrade Required` es común en configuraciones de **reverse proxy / túnel mal configurados**; es poco común en acceso local directo sin proxy.

### Soporte multiarquitectura

Las imágenes Docker soportan tanto `linux/amd64` como `linux/arm64`.

### Persistencia de datos

Los datos se almacenan en `/app/data` dentro del contenedor. Móntelo en el host para evitar la pérdida de datos:```yaml
volumes:
  - ./data:/app/data

Actualizar a la última versión```bash

Pull the latest image and restart

docker compose pull docker compose up -d

root@kitploit:~
## 🔐 Autenticación y seguridad

Neko Master admite autenticación de acceso para proteger los datos del panel.

### Línea base de seguridad en producción

1. Establezca un `COOKIE_SECRET` fijo (de lo contrario, las sesiones pueden invalidarse tras un reinicio).
2. No mantenga `FORCE_ACCESS_CONTROL_OFF=true` habilitado durante la operación normal.
3. Use `SHOWCASE_SITE_MODE=true` solo para entornos de demostración públicos (las operaciones de escritura están restringidas).

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

Habilitar / Deshabilitar autenticación

  1. Abre el panel de control y haz clic en "Settings" en la barra lateral inferior izquierda.
  2. Ve a la pestaña "Security".
  3. Habilita/deshabilita el control de acceso y establece tu token.

Token olvidado (restablecimiento de emergencia)

Si olvidaste el token, establece temporalmente FORCE_ACCESS_CONTROL_OFF=true para entrar en modo de emergencia.

Docker Compose

  1. Añade a docker-compose.yml: ```yaml environment:
    • FORCE_ACCESS_CONTROL_OFF=true
    root@kitploit:~
  2. Reiniciar: ```bash docker compose up -d
    root@kitploit:~
  3. Abre el panel de control y restablece el token en "Settings -> Security".
  4. Elimina esta variable de entorno inmediatamente después de restablecer, luego reinicia de nuevo.

Docker CLI

  1. Detén y elimina el contenedor: ```bash docker stop neko-master docker rm neko-master
    root@kitploit:~
  2. Vuelva a ejecutar con la marca de emergencia: ```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. Restablece el token, luego elimina esta bandera y reinicia normalmente.

❓ Preguntas frecuentes

P: ¿Puedo ejecutar normalmente con solo 3000:3000 expuesto?

R: Sí. Las funciones principales siguen funcionando. Si WS no está enrutado, la aplicación recurre automáticamente a HTTP polling. Para una experiencia en tiempo real completa, enruta /_cm_ws a 3002.

P: ¿Conflicto de puertos o inaccesible tras cambios de puerto?

R: Crea/actualiza .env (mismo directorio que docker-compose.yml):```env WEB_EXTERNAL_PORT=8080 API_EXTERNAL_PORT=8081 WS_EXTERNAL_PORT=8082

root@kitploit:~
Luego reinicia:```bash
docker compose down
docker compose up -d

P: ¿Por qué desaparece el inicio de sesión/sesión después de reiniciar?

R: Generalmente porque COOKIE_SECRET no es fijo o el directorio de datos no es persistente.

  1. Establece un COOKIE_SECRET fijo
  2. Monta ./data:/app/data

P: ¿Qué archivos se requieren para la búsqueda local de MMDB?

R: Crea ./geoip en el directorio de tu proyecto (se recomienda al mismo nivel que docker-compose.yml), luego coloca:

  1. GeoLite2-City.mmdb (requerido)
  2. GeoLite2-ASN.mmdb (requerido)
  3. GeoLite2-Country.mmdb (opcional)

Fuente recomendada: https://github.com/P3TERX/GeoLite.mmdb. Dentro del contenedor, la ruta de búsqueda fija es /app/data/geoip, así que mantén: ./geoip:/app/data/geoip:ro. Para actualizar más tarde, simplemente reemplaza los archivos en el host ./geoip.

P: ¿Fallo al conectar OpenClash / gateway?

R: Verifica:

  1. El control externo está habilitado en el lado del gateway
  2. El host/puerto es correcto
  3. El Token/Secret es correcto (si está configurado)
  4. La red del contenedor puede alcanzar el gateway

P: ¿Cómo hacer copia de seguridad y restaurar datos?

R: Primero haz la copia de seguridad:```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

🏗️ Guía de Arquitectura

Si quieres comprender rápidamente la profundidad del diseño del sistema, lee en este orden:

  1. Diagrama de Arquitectura del Sistema: capas de extremo a extremo y responsabilidades de los módulos → docs/architecture.en.md
  2. Flujo de Datos: pipelines de recolección y agregación de Clash / Surge
  3. Modelo de Datos y Almacenamiento: esquema de SQLite, tablas ClickHouse Buffer, política de retención
  4. Diseño del Canal en Tiempo Real: estrategia de fusión de RealtimeStore y push por WS
  5. Módulo ClickHouse: arquitectura de doble escritura, fallback de salud, enrutamiento de lectura

Índice completo de documentación: docs/README.md

Esta documentación cubre el diseño central de recolección, agregación, caché, push en tiempo real y gestión multi-backend.

🤝 Comentarios y Problemas

Este proyecto utiliza Plantillas de Issues de GitHub (Bug / Feature / Support).

Por favor incluye al menos:

  1. Método de despliegue (Compose / Docker Run / Source)
  2. Información de versión (etiqueta de imagen o commit)
  3. Variables de entorno clave (enmascaradas, p. ej. COOKIE_SECRET=***)
  4. Pasos de reproducción y comportamiento esperado vs real
  5. Logs clave (docker logs, consola del navegador, errores de red)

📁 Estructura del Proyecto```

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/)
- **Estilos**: [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
- **Base de datos**: [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/)

## 🤝 Contribuir

¡Las contribuciones son bienvenidas!

- 🐛 [Reportar un error](https://github.com/foru17/neko-master/issues/new)
- 💡 [Solicitar una funcionalidad](https://github.com/foru17/neko-master/issues/new)
- 🔧 [Contribuir con código](https://github.com/foru17/neko-master/pulls)

Antes de abrir un PR, lee [CONTRIBUTING.md](https://github.com/foru17/neko-master/blob/main/CONTRIBUTING.md) (flujo de trabajo, comprobaciones, requisitos de i18n/modo oscuro).

**¿Desarrollas con una herramienta de codificación con IA?** (Claude Code, Copilot, Cursor, Codex, ...) Apúntala a [AGENTS.md](https://github.com/foru17/neko-master/blob/main/AGENTS.md) — convenciones, contratos clave y el mapa del proyecto — además de las guías de flujo de trabajo específicas por tarea en [`.claude/skills/`](https://github.com/foru17/neko-master/blob/main/.claude/skills). Claude Code detecta ambos automáticamente.

## 📄 Licencia

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

---

## ⭐ Historial de estrellas

[![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>Hecho con ❤️ por <a href="https://github.com/foru17">@foru17</a></sub><br>
  <sub>Si este proyecto te ayuda, considera darle una ⭐</sub>
</p>
Descargar herramienta
Neko Master Preview (Light 1) Neko Master Preview (Light 2)
Neko Master Preview (Dark 1) Neko Master Preview (Dark 2)
CaracterísticaDescripción
📊 Monitoreo en tiempo realRecopilación en tiempo real vía WebSocket con latencia de milisegundos
📈 Análisis de tendenciasTendencias de tráfico multidimensionales: 30min / 1h / 24h
🌐 Análisis de dominiosVer tráfico, IPs asociadas y número de conexiones por dominio
🗺️ Análisis de IPVisualización de ASN, geolocalización y dominios asociados
🚀 Estadísticas de proxyDistribución de tráfico y número de conexiones por nodo de proxy
📱 Soporte PWAInstalar como aplicación de escritorio para una experiencia nativa
🌙 Modo oscuroSoporte de tema Claro / Oscuro / Sistema
🌍 Soporte i18nCambio fluido entre inglés / chino
🔄 Multi-BackendMonitorear múltiples instancias de backend de OpenClash simultáneamente
-v
--verbose
-w
--wordlist
-x
--exclude
ModuleDescription
sqliSQL Injection scanner
xssCross-Site Scripting scanner
lfiLocal File Inclusion scanner
rfiRemote File Inclusion scanner
ssrfServer-Side Request Forgery scanner
csrfCross-Site Request Forgery scanner
open-redirectOpen Redirect scanner
crlfCRLF Injection scanner
xxeXML External Entity scanner
sstiServer-Side Template Injection scanner
PuertoPropósitoRequerido externamenteDescripción
3000Interfaz web✅Punto de entrada del frontend
3001APIOpcionalEl frontend usa /api del mismo origen por defecto; normalmente no se necesita exposición pública (el Compose por defecto lo mapea)
3002WebSocketOpcionalEndpoint de envío en tiempo real; recomendado solo para reenvío mediante proxy inverso/túnel (el Compose por defecto lo mapea)
VariableValor por defectoPropósitoCuándo configurarla
WEB_PORT3000Puerto de escucha web (dentro del contenedor)Normalmente sin cambios
API_PORT3001Puerto de escucha de la API (dentro del contenedor)Normalmente sin cambios
COLLECTOR_WS_PORT3002Puerto de escucha de WS (dentro del contenedor)Normalmente sin cambios
DB_PATH/app/data/stats.dbRuta de datos de SQLiteRuta de datos personalizada
WEB_EXTERNAL_PORT3000Mapeo del puerto web externo en docker-compose.ymlPuerto web externo modificado
API_EXTERNAL_PORT3001Mapeo del puerto de API externo en docker-compose.ymlSe necesita acceso directo a la API externa
WS_EXTERNAL_PORT3002Mapeo del puerto WS externo en docker-compose.yml; también se usa para la inferencia del puerto WS directoAcceso WS directo sin proxy y puerto WS externo modificado
NEXT_PUBLIC_API_URLvacíoSobrescribe la URL base de la API del frontend (p. ej. https://api.example.com)La API no está en el mismo origen /api
NEXT_PUBLIC_WS_URLvacíoSobrescribe la URL WS del frontend (URL absoluta o /custom_ws)Ruta/dominio WS personalizado
NEXT_PUBLIC_WS_PORT3002Puerto de respaldo para conexión WS directa (solo en tiempo de compilación — configurarlo en tiempo de ejecución de Docker no tiene efecto; usa WS_EXTERNAL_PORT en su lugar)Solo para compilaciones personalizadas desde el código fuente
API_URLhttp://localhost:3001Destino de reescritura de /api de Next.js (principalmente compilaciones desde el código fuente/personalizadas)Dirección de escucha de la API modificada
COOKIE_SECRETgenerado automáticamenteSecreto de firma de cookies; si no se fija, las sesiones pueden invalidarse tras reiniciar cuando el directorio de datos no es persistenteMuy recomendado en producción
GEOIP_LOOKUP_PROVIDERonlineFuente de geolocalización de IP (online / local)Por defecto, búsqueda local en MMDB
GEOIP_ONLINE_API_URLhttps://api.ipinfo.es/ipinfoEndpoint de la API de geolocalización de IP en línea (debe ser compatible con el esquema de respuesta de ipinfo.my)Configúralo solo cuando despliegues un endpoint compatible
FORCE_ACCESS_CONTROL_OFFfalseForzar la desactivación del control de acceso (recuperación de emergencia)Solo para uso temporal cuando se pierde el token
SHOWCASE_SITE_MODEfalseModo de exhibición de solo lectura (bloquea operaciones de escritura sensibles)Solo para sitios de demostración públicos
VariableValor por defectoDescripción
FLUSH_INTERVAL_MS30000Intervalo de vaciado del búfer para las escrituras del colector
FLUSH_MAX_BUFFER_SIZE5000Número máximo de entradas en el búfer antes del vaciado anticipado
REALTIME_MAX_MINUTES180Tamaño de la ventana en memoria en tiempo real (minutos)
REALTIME_RANGE_END_TOLERANCE_MS120000Tolerancia de tiempo final para consultas de rango
SURGE_POLICY_SYNC_INTERVAL_MS600000Intervalo de sincronización de la política de picos
DB_RANGE_QUERY_CACHE_TTL_MS8000TTL de la caché de consultas de rango
DB_HISTORICAL_QUERY_CACHE_TTL_MS300000TTL de la caché de consultas históricas
DB_RANGE_QUERY_CACHE_MAX_ENTRIES1024Número máximo de entradas de la caché de consultas de rango
DB_RANGE_QUERY_CACHE_DISABLEDvacíoEstablece 1 para desactivar la caché de consultas de rango
DEBUG_SURGEfalseActiva los registros de depuración del colector Surge (true)
3002
  • En despliegues normales, NEXT_PUBLIC_WS_URL normalmente no es necesario a menos que uses una ruta/dominio WS personalizado
  • VariablePredeterminadoDescripción
    CH_ENABLED0Habilitar conexión a ClickHouse (1 para habilitar)
    CH_WRITE_ENABLED0Habilitar escritura dual (requiere CH_ENABLED=1)
    CH_ONLY_MODE0Cuando CH está saludable, omitir escrituras de estadísticas en SQLite (modo solo CH)
    CH_HOSTclickhouseDirección del host de ClickHouse
    CH_PORT8123Puerto HTTP de ClickHouse
    CH_DATABASEneko_masterNombre de la base de datos
    CH_USERnekoNombre de usuario
    CH_PASSWORDneko_masterContraseña
    CH_SECURE0Usar conexión HTTPS
    CH_REQUIRED0Rechazar el inicio si CH no está disponible
    CH_AUTO_CREATE_TABLES1Crear tablas automáticamente en el primer inicio
    CH_WRITE_MAX_PENDING_BATCHES200Máximo de lotes de escritura pendientes
    CH_UNHEALTHY_THRESHOLD5Fallos consecutivos antes de marcar como no saludable (retorno automático a SQLite)
    STATS_QUERY_SOURCEsqliteFuente de lectura: sqlite / auto / clickhouse
    CH_COMPARE_ENABLED0Habilitar verificación de consistencia SQLite ↔ ClickHouse
    CH_EXTERNAL_HTTP_PORT8123Puerto HTTP externo de ClickHouse (mapeo de Compose)
    CH_EXTERNAL_NATIVE_PORT9000Puerto Native externo de ClickHouse (mapeo de Compose)