
Un panel moderno y elegante para la visualización y el análisis del tráfico de red.
Neko Master
Ve el tráfico de tu red con claridad.
Monitoreo en tiempo real · Auditoría de tráfico · Soporte multi-gateway
English | 中文
[!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.
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.
El
docker-compose.ymlincluido en el repositorio mapea3000/3001/3002por defecto. Los escenarios A/B a continuación son plantillas mínimas para despliegues comunes.
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}
> 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
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 |
# 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
The tool can be configured using a configuration file located at ~/.kitploit/config.yaml.
# Default configuration
threads: 10
timeout: 30
user_agent: "Mozilla/5.0"
follow_redirects: true
verify_ssl: false
proxy: null
output_dir: "./reports"
We welcome contributions from the community. Please read our Contributing Guidelines before submitting a pull request.
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)This project is licensed under the MIT License - see the LICENSE file for details.
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
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
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
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:
docker-compose.ymlgit clone https://github.com/foru17/neko-master.git cd neko-master
pnpm install
cp apps/collector/.env.example apps/collector/.env
pnpm dev
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)
> 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

### 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

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:
Settings → General → HTTP Remote API9091Surge192.168.1.1 o 127.0.0.1)9091)💡 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.
Si ves el error "port already in use", aquí tienes las soluciones:
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
Luego reinicia:```bash
docker compose down
docker compose up -d
Ahora accede a http://localhost:8080
ports:
> 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.
runtime-config.API_URL → NEXT_PUBLIC_API_URL → mismo origen /api/api: API_URL (por defecto http://localhost:3001, aplicado en las reescrituras de Next.js)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)runtime-config.WS_PORT (desde WS_EXTERNAL_PORT) → NEXT_PUBLIC_WS_PORT → NODE_ENV=production DB_PATH=/app/data/stats.db COOKIE_SECRET=<at least 32-byte random string>
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).
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
> 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
Añade a tu .env (mismo directorio que docker-compose.yml):```env
CH_ENABLED=1
CH_WRITE_ENABLED=1
STATS_QUERY_SOURCE=auto
CH_HOST=clickhouse CH_PORT=8123 CH_DATABASE=neko_master CH_USER=neko CH_PASSWORD=neko_master
Reiniciar:```bash
docker compose --profile clickhouse up -d
Salud y Retorno: Después de
CH_UNHEALTHY_THRESHOLDfallos de escritura consecutivos, el sistema marca automáticamente ClickHouse como no saludable y reanuda las escrituras en SQLite—incluso cuandoCH_ONLY_MODE=1. Una vez que ClickHouse se recupera, se vuelve a marcar como saludable y se registra.
¿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:
CH_ENABLED=1 CH_WRITE_ENABLED=1 STATS_QUERY_SOURCE=sqlite # Keep reading from SQLite while CH accumulates data
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
Para mover las estadísticas históricas de SQLite a ClickHouse:```bash
./scripts/ch-migrate-docker.sh
./scripts/ch-migrate-docker.sh --append
./scripts/ch-migrate-docker.sh --from 2026-02-01T00:00:00Z --to 2026-02-20T00:00:00Z
#### 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.
Siempre puedes revertir por completo:```env CH_ENABLED=0 CH_WRITE_ENABLED=0 CH_ONLY_MODE=0 STATS_QUERY_SOURCE=sqlite
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
### 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
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
docker compose pull docker compose up -d
## 🔐 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
Si olvidaste el token, establece temporalmente FORCE_ACCESS_CONTROL_OFF=true para entrar en modo de emergencia.
docker-compose.yml: ```yaml
environment:
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.
R: Crea/actualiza .env (mismo directorio que docker-compose.yml):```env
WEB_EXTERNAL_PORT=8080
API_EXTERNAL_PORT=8081
WS_EXTERNAL_PORT=8082
Luego reinicia:```bash
docker compose down
docker compose up -d
R: Generalmente porque COOKIE_SECRET no es fijo o el directorio de datos no es persistente.
COOKIE_SECRET fijo./data:/app/dataR: Crea ./geoip en el directorio de tu proyecto (se recomienda al mismo nivel que docker-compose.yml), luego coloca:
GeoLite2-City.mmdb (requerido)GeoLite2-ASN.mmdb (requerido)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.
R: Verifica:
R: Primero haz la copia de seguridad:```bash cp -r ./data ./data-backup-$(date +%Y%m%d)
Restaurar:```bash
docker compose down
cp -r ./data-backup-YYYYMMDD/. ./data/
docker compose up -d
Si quieres comprender rápidamente la profundidad del diseño del sistema, lee en este orden:
RealtimeStore y push por WSÍ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.
Este proyecto utiliza Plantillas de Issues de GitHub (Bug / Feature / Support).
Por favor incluye al menos:
COOKIE_SECRET=***)docker logs, consola del navegador, errores de red)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
## 🛠️ 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
[](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>
|
|
|
|
| Característica | Descripción |
|---|
| 📊 Monitoreo en tiempo real | Recopilación en tiempo real vía WebSocket con latencia de milisegundos |
| 📈 Análisis de tendencias | Tendencias de tráfico multidimensionales: 30min / 1h / 24h |
| 🌐 Análisis de dominios | Ver tráfico, IPs asociadas y número de conexiones por dominio |
| 🗺️ Análisis de IP | Visualización de ASN, geolocalización y dominios asociados |
| 🚀 Estadísticas de proxy | Distribución de tráfico y número de conexiones por nodo de proxy |
| 📱 Soporte PWA | Instalar como aplicación de escritorio para una experiencia nativa |
| 🌙 Modo oscuro | Soporte de tema Claro / Oscuro / Sistema |
| 🌍 Soporte i18n | Cambio fluido entre inglés / chino |
| 🔄 Multi-Backend | Monitorear múltiples instancias de backend de OpenClash simultáneamente |
-v--verbose-w--wordlist-x--exclude| Module | Description |
|---|
sqli | SQL Injection scanner |
xss | Cross-Site Scripting scanner |
lfi | Local File Inclusion scanner |
rfi | Remote File Inclusion scanner |
ssrf | Server-Side Request Forgery scanner |
csrf | Cross-Site Request Forgery scanner |
open-redirect | Open Redirect scanner |
crlf | CRLF Injection scanner |
xxe | XML External Entity scanner |
ssti | Server-Side Template Injection scanner |
| Puerto | Propósito | Requerido externamente | Descripción |
|---|
| 3000 | Interfaz web | ✅ | Punto de entrada del frontend |
| 3001 | API | Opcional | El frontend usa /api del mismo origen por defecto; normalmente no se necesita exposición pública (el Compose por defecto lo mapea) |
| 3002 | WebSocket | Opcional | Endpoint de envío en tiempo real; recomendado solo para reenvío mediante proxy inverso/túnel (el Compose por defecto lo mapea) |
| Variable | Valor por defecto | Propósito | Cuándo configurarla |
|---|
WEB_PORT | 3000 | Puerto de escucha web (dentro del contenedor) | Normalmente sin cambios |
API_PORT | 3001 | Puerto de escucha de la API (dentro del contenedor) | Normalmente sin cambios |
COLLECTOR_WS_PORT | 3002 | Puerto de escucha de WS (dentro del contenedor) | Normalmente sin cambios |
DB_PATH | /app/data/stats.db | Ruta de datos de SQLite | Ruta de datos personalizada |
WEB_EXTERNAL_PORT | 3000 | Mapeo del puerto web externo en docker-compose.yml | Puerto web externo modificado |
API_EXTERNAL_PORT | 3001 | Mapeo del puerto de API externo en docker-compose.yml | Se necesita acceso directo a la API externa |
WS_EXTERNAL_PORT | 3002 | Mapeo del puerto WS externo en docker-compose.yml; también se usa para la inferencia del puerto WS directo | Acceso WS directo sin proxy y puerto WS externo modificado |
NEXT_PUBLIC_API_URL | vacío | Sobrescribe 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_URL | vacío | Sobrescribe la URL WS del frontend (URL absoluta o /custom_ws) | Ruta/dominio WS personalizado |
NEXT_PUBLIC_WS_PORT | 3002 | Puerto 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_URL | http://localhost:3001 | Destino de reescritura de /api de Next.js (principalmente compilaciones desde el código fuente/personalizadas) | Dirección de escucha de la API modificada |
COOKIE_SECRET | generado automáticamente | Secreto de firma de cookies; si no se fija, las sesiones pueden invalidarse tras reiniciar cuando el directorio de datos no es persistente | Muy recomendado en producción |
GEOIP_LOOKUP_PROVIDER | online | Fuente de geolocalización de IP (online / local) | Por defecto, búsqueda local en MMDB |
GEOIP_ONLINE_API_URL | https://api.ipinfo.es/ipinfo | Endpoint 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_OFF | false | Forzar la desactivación del control de acceso (recuperación de emergencia) | Solo para uso temporal cuando se pierde el token |
SHOWCASE_SITE_MODE | false | Modo de exhibición de solo lectura (bloquea operaciones de escritura sensibles) | Solo para sitios de demostración públicos |
| Variable | Valor por defecto | Descripción |
|---|
FLUSH_INTERVAL_MS | 30000 | Intervalo de vaciado del búfer para las escrituras del colector |
FLUSH_MAX_BUFFER_SIZE | 5000 | Número máximo de entradas en el búfer antes del vaciado anticipado |
REALTIME_MAX_MINUTES | 180 | Tamaño de la ventana en memoria en tiempo real (minutos) |
REALTIME_RANGE_END_TOLERANCE_MS | 120000 | Tolerancia de tiempo final para consultas de rango |
SURGE_POLICY_SYNC_INTERVAL_MS | 600000 | Intervalo de sincronización de la política de picos |
DB_RANGE_QUERY_CACHE_TTL_MS | 8000 | TTL de la caché de consultas de rango |
DB_HISTORICAL_QUERY_CACHE_TTL_MS | 300000 | TTL de la caché de consultas históricas |
DB_RANGE_QUERY_CACHE_MAX_ENTRIES | 1024 | Número máximo de entradas de la caché de consultas de rango |
DB_RANGE_QUERY_CACHE_DISABLED | vacío | Establece 1 para desactivar la caché de consultas de rango |
DEBUG_SURGE | false | Activa los registros de depuración del colector Surge (true) |
3002NEXT_PUBLIC_WS_URL normalmente no es necesario a menos que uses una ruta/dominio WS personalizado| Variable | Predeterminado | Descripción |
|---|
CH_ENABLED | 0 | Habilitar conexión a ClickHouse (1 para habilitar) |
CH_WRITE_ENABLED | 0 | Habilitar escritura dual (requiere CH_ENABLED=1) |
CH_ONLY_MODE | 0 | Cuando CH está saludable, omitir escrituras de estadísticas en SQLite (modo solo CH) |
CH_HOST | clickhouse | Dirección del host de ClickHouse |
CH_PORT | 8123 | Puerto HTTP de ClickHouse |
CH_DATABASE | neko_master | Nombre de la base de datos |
CH_USER | neko | Nombre de usuario |
CH_PASSWORD | neko_master | Contraseña |
CH_SECURE | 0 | Usar conexión HTTPS |
CH_REQUIRED | 0 | Rechazar el inicio si CH no está disponible |
CH_AUTO_CREATE_TABLES | 1 | Crear tablas automáticamente en el primer inicio |
CH_WRITE_MAX_PENDING_BATCHES | 200 | Máximo de lotes de escritura pendientes |
CH_UNHEALTHY_THRESHOLD | 5 | Fallos consecutivos antes de marcar como no saludable (retorno automático a SQLite) |
STATS_QUERY_SOURCE | sqlite | Fuente de lectura: sqlite / auto / clickhouse |
CH_COMPARE_ENABLED | 0 | Habilitar verificación de consistencia SQLite ↔ ClickHouse |
CH_EXTERNAL_HTTP_PORT | 8123 | Puerto HTTP externo de ClickHouse (mapeo de Compose) |
CH_EXTERNAL_NATIVE_PORT | 9000 | Puerto Native externo de ClickHouse (mapeo de Compose) |