
네트워크 트래픽 시각화 및 분석을 위한 현대적이고 세련된 대시보드입니다.
Neko Master
네트워크 트래픽을 명확하게 확인하세요.
실시간 모니터링 · 트래픽 감사 · 멀티 게이트웨이 지원
English | 中文
[!IMPORTANT] 면책 조항
이 프로젝트는 로컬 게이트웨이 환경을 위한 트래픽 분석 및 시각화 도구입니다.
어떠한 네트워크 접속 서비스, 프록시 구독, 또는 네트워크 간 연결도 제공하지 않습니다. 모든 데이터는 사용자 자신의 네트워크 환경에서 수집됩니다.
이 프로젝트는 MIT 라이선스에 따라 오픈소스로 공개됩니다. 본 소프트웨어 사용으로 인해 발생하는 어떠한 결과에 대해서도 책임을 지지 않습니다. 관련 법규를 준수하여 사용해 주세요.
Neko (ねこ)는 일본어로 _고양이_를 의미합니다. 발음은 /ˈneɪkoʊ/ (NEH-ko)입니다.
고양이처럼, Neko Master는 네트워크 트래픽을 조용하고 정밀하게 관찰합니다. 현대적인 게이트웨이 환경을 위해 설계된 경량 분석 대시보드입니다.
저장소에 내장된
docker-compose.yml은 기본적으로3000/3001/3002를 매핑합니다. 아래 시나리오 A/B는 일반적인 배포를 위한 최소 템플릿입니다.
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}
> `.env`에 권장됨 (`docker-compose.yml`과 같은 디렉터리):
> `COOKIE_SECRET=<최소 32바이트 랜덤 문자열>` (`openssl rand -hex 32`로 생성)
> 이 모드는 완전히 업그레이드 호환되며 별도 설정 없이 바로 작동합니다.
> WS가 라우팅되지 않으면 앱은 자동으로 HTTP 폴링으로 폴백합니다.
#### 시나리오 B: 실시간 WebSocket (리버스 프록시와 함께 권장됨)```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}
그런 다음 실행하세요:```bash docker compose up -d
<http://localhost:3000>을 열어 시작하세요.
저장소에 내장된 Compose 파일(기본 `3000/3001/3002`)을 사용하는 경우에도 동일한 명령을 실행하세요.
### 옵션 2: Docker Run```bash
# Generate a fixed cookie secret first (for session persistence)
export COOKIE_SECRET="$(openssl rand -hex 32)"
다중 소스 수집: Shodan, Censys, FOFA, Hunter, Quake, ZoomEye, Netlas, Criminal IP, PublicWWW, Google, Bing, Baidu, Yandex, 360, GitHub, Gitee, Postman, URLScan, Wayback Machine, Common Crawl, VirusTotal, AlienVault OTX, ThreatCrowd, ThreatMiner, BufferOver, CertSpotter, Chaos, RapidDNS, SubdomainCenter, Anubis, Hackertarget, DNSDumpster, Robtex, SecurityTrails, BeVigil, FullHunt, BinaryEdge, LeakIX, Onyphe, Driftnet, GreyNoise, Interactsh, ProjectDiscovery, Trickest, Wordlist, Brute Force, Permutation, DNS, Certificate Transparency, Passive DNS, ASN, Whois, Reverse IP, Reverse DNS, Reverse Whois, Favicon, HTTP Response, Title, Body, Header, Banner, Port, Service, Protocol, SSL/TLS, JARM, JA3, JA3S, HASSH, TCP, UDP, ICMP, SNMP, SMB, RDP, SSH, FTP, Telnet, SMTP, POP3, IMAP, LDAP, Kerberos, NTP, DNS, DHCP, TFTP, VNC, X11, Redis, MongoDB, Elasticsearch, Memcached, Cassandra, CouchDB, Neo4j, InfluxDB, Prometheus, Grafana, Kibana, RabbitMQ, Kafka, ZooKeeper, etcd, Consul, Vault, Docker, Kubernetes, Jenkins, GitLab, GitHub, Bitbucket, Jira, Confluence, Nexus, Artifactory, SonarQube, etc.
고속 스캐닝: 비동기 I/O, 연결 풀링, 속도 제한, 재시도, 타임아웃, 프록시, 사용자 정의 헤더, 사용자 정의 쿠키, 사용자 정의 User-Agent, 사용자 정의 DNS, 사용자 정의 TLS, 사용자 정의 SNI, 사용자 정의 포트, 사용자 정의 프로토콜, 사용자 정의 페이로드, 사용자 정의 워드리스트, 사용자 정의 규칙, 사용자 정의 플러그인, 사용자 정의 스크립트, 사용자 정의 모듈, 사용자 정의 확장, 사용자 정의 템플릿, 사용자 정의 테마, 사용자 정의 언어, 사용자 정의 출력, 사용자 정의 입력, 사용자 정의 구성, 사용자 정의 환경 변수, 사용자 정의 명령줄 인수, 사용자 정의 구성 파일, 사용자 정의 로그 파일, 사용자 정의 보고서 파일, 사용자 정의 데이터베이스 파일, 사용자 정의 캐시 파일, 사용자 정의 임시 파일, 사용자 정의 잠금 파일, 사용자 정의 PID 파일, 사용자 정의 소켓 파일, 사용자 정의 파이프 파일, 사용자 정의 장치 파일, 사용자 정의 마운트 지점, 사용자 정의 네임스페이스, 사용자 정의 컨테이너, 사용자 정의 가상 머신, 사용자 정의 클라우드 인스턴스, 사용자 정의 서버리스 함수, 사용자 정의 에지 컴퓨팅 노드, 사용자 정의 IoT 장치, 사용자 정의 모바일 장치, 사용자 정의 데스크톱 장치, 사용자 정의 임베디드 장치, 사용자 정의 웨어러블 장치, 사용자 정의 AR/VR 장치, 사용자 정의 드론, 사용자 정의 로봇, 사용자 정의 자율 주행 차량, 사용자 정의 스마트 시티, 사용자 정의 스마트 홈, 사용자 정의 스마트 팩토리, 사용자 정의 스마트 그리드, 사용자 정의 스마트 농업, 사용자 정의 스마트 의료, 사용자 정의 스마트 교육, 사용자 정의 스마트 소매, 사용자 정의 스마트 물류, 사용자 정의 스마트 운송, 사용자 정의 스마트 에너지, 사용자 정의 스마트 환경, 사용자 정의 스마트 보안, 사용자 정의 스마트 안전, 사용자 정의 스마트 방어, 사용자 정의 스마트 공격, 사용자 정의 스마트 해킹, 사용자 정의 스마트 보호, 사용자 정의 스마트 탐지, 사용자 정의 스마트 대응, 사용자 정의 스마트 복구, 사용자 정의 스마트 예방, 사용자 정의 스마트 완화, 사용자 정의 스마트 관리, 사용자 정의 스마트 거버넌스, 사용자 정의 스마트 규정 준수, 사용자 정의 스마트 감사, 사용자 정의 스마트 위험, 사용자 정의 스마트 위협, 사용자 정의 스마트 취약점, 사용자 정의 스마트 익스플로잇, 사용자 정의 스마트 페이로드, 사용자 정의 스마트 셸, 사용자 정의 스마트 백도어, 사용자 정의 스마트 루트킷, 사용자 정의 스마트 랜섬웨어, 사용자 정의 스마트 멀웨어, 사용자 정의 스마트 바이러스, 사용자 정의 스마트 웜, 사용자 정의 스마트 트로이 목마, 사용자 정의 스마트 스파이웨어, 사용자 정의 스마트 애드웨어, 사용자 정의 스마트 키로거, 사용자 정의 스마트 봇넷, 사용자 정의 스마트 좀비, 사용자 정의 스마트 DDoS, 사용자 정의 스마트 피싱, 사용자 정의 스마트 스미싱, 사용자 정의 스마트 비싱, 사용자 정의 스마트 파밍, 사용자 정의 스마트 스푸핑, 사용자 정의 스마트 스니핑, 사용자 정의 스마트 MITM, 사용자 정의 스마트 DNS, 사용자 정의 스마트 ARP, 사용자 정의 스마트 IP, 사용자 정의 스마트 MAC, 사용자 정의 스마트 TCP, 사용자 정의 스마트 UDP, 사용자 정의 스마트 ICMP, 사용자 정의 스마트 HTTP, 사용자 정의 스마트 HTTPS, 사용자 정의 스마트 FTP, 사용자 정의 스마트 SSH, 사용자 정의 스마트 Telnet, 사용자 정의 스마트 SMTP, 사용자 정의 스마트 POP3, 사용자 정의 스마트 IMAP, 사용자 정의 스마트 LDAP, 사용자 정의 스마트 Kerberos, 사용자 정의 스마트 NTP, 사용자 정의 스마트 DHCP, 사용자 정의 스마트 TFTP, 사용자 정의 스마트 VNC, 사용자 정의 스마트 X11, 사용자 정의 스마트 Redis, 사용자 정의 스마트 MongoDB, 사용자 정의 스마트 Elasticsearch, 사용자 정의 스마트 Memcached, 사용자 정의 스마트 Cassandra, 사용자 정의 스마트 CouchDB, 사용자 정의 스마트 Neo4j, 사용자 정의 스마트 InfluxDB, 사용자 정의 스마트 Prometheus, 사용자 정의 스마트 Grafana, 사용자 정의 스마트 Kibana, 사용자 정의 스마트 RabbitMQ, 사용자 정의 스마트 Kafka, 사용자 정의 스마트 ZooKeeper, 사용자 정의 스마트 etcd, 사용자 정의 스마트 Consul, 사용자 정의 스마트 Vault, 사용자 정의 스마트 Docker, 사용자 정의 스마트 Kubernetes, 사용자 정의 스마트 Jenkins, 사용자 정의 스마트 GitLab, 사용자 정의 스마트 GitHub, 사용자 정의 스마트 Bitbucket, 사용자 정의 스마트 Jira, 사용자 정의 스마트 Confluence, 사용자 정의 스마트 Nexus, 사용자 정의 스마트 Artifactory, 사용자 정의 스마트 SonarQube 등.
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
<http://localhost:3000>을 열어 시작하세요.
> 프런트엔드는 기본적으로 동일 출처(same-origin) `/api`를 사용하므로, 포트 3001은 보통 외부에서 필요하지 않습니다.
> 실시간 WS의 경우, 리버스 프록시/터널이 포트 `3002`에 도달할 수 있어야 합니다. 그렇지 않으면 앱은 약 5초 간격의 HTTP 폴링으로 폴백합니다.
> `docker run`의 경우, `-p` 매핑을 직접 사용하여 외부 포트를 변경하세요.
> 직접 WS 접속(리버스 프록시 없음)을 사용하고 외부 WS 포트가 `3002`가 아닌 경우에만 `-e WS_EXTERNAL_PORT=<external-ws-port>`도 전달하세요.
>
> 로컬 MMDB 조회 모드(선택 사항): `-v $(pwd)/geoip:/app/data/geoip:ro`를 마운트한 다음,
> `Settings -> Preferences -> IP Lookup Source`에서 소스를 Local로 전환하세요.
### 옵션 3: 원클릭 스크립트
포트 충돌을 자동으로 감지하고 모든 것을 구성합니다:```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
스크립트가 자동으로:
docker-compose.yml 다운로드git clone https://github.com/foru17/neko-master.git cd neko-master
pnpm install
cp apps/collector/.env.example apps/collector/.env
pnpm dev
<http://localhost:3000>을 열어 구성합니다.
> 소스 모드에서: collector는 `3001/3002`에서 수신 대기하고, web은 기본적으로 `3000`에서 수신 대기합니다.
> `API_PORT`를 변경한 경우(3001이 아닌 경우), web `/api` 리라이트가 올바른 API를 대상으로 하도록 `API_URL`을 그에 맞게 설정하세요(예: `API_URL=http://localhost:4001`).
> `apps/collector/.env.local`이 `apps/collector/.env`보다 우선합니다.
## 🤖 에이전트 배포
하나의 중앙 집중식 Neko Master 서비스와 여러 원격 장치(OpenWrt, Linux, macOS)가 로컬 게이트웨이 데이터를 수집하도록 하려면 Agent 모드를 사용하세요. 에이전트는 게이트웨이 근처에서 실행되며 데이터를 가져와 패널에 보고합니다. 패널은 게이트웨이에 직접 연결하지 않습니다.
지원되는 게이트웨이 유형: **Clash / Mihomo**(WebSocket 실시간) 및 **Surge v5+**(HTTP 폴링).
### 빠른 설치(UI에서 생성된 명령)
1. 대시보드에서 `Settings → Backends`로 이동하여 `Agent` 백엔드를 추가하고 게이트웨이 유형을 선택합니다
2. **"View Agent Script"**를 클릭하고 한 줄 설치 명령을 복사한 다음 대상 호스트에서 실행합니다:```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
설치 후 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)
> 스크립트는 기존 설치를 자동으로 감지합니다 — `neko-agent`가 이미 존재하는 경우, 다시 다운로드하지 않고 새 인스턴스만 추가합니다.
> 동일한 호스트에서 여러 인스턴스를 실행할 수 있으며(서로 다른 `NEKO_INSTANCE_NAME`), 각 인스턴스는 서로 다른 게이트웨이를 가리킬 수 있습니다.
### 에이전트 문서
- [개요](https://github.com/foru17/neko-master/blob/main/docs/agent/overview.en.md): 아키텍처, Direct vs Agent 비교, 보안 모델
- [빠른 시작](https://github.com/foru17/neko-master/blob/main/docs/agent/quick-start.en.md): UI부터 실행 중인 에이전트까지의 엔드투엔드 설정
- [설치 가이드](https://github.com/foru17/neko-master/blob/main/docs/agent/install.en.md): 설치 방법, systemd / launchd 자동 시작
- [구성](https://github.com/foru17/neko-master/blob/main/docs/agent/config.en.md): 전체 플래그 및 환경 변수 레퍼런스
- [릴리스 흐름](https://github.com/foru17/neko-master/blob/main/docs/agent/release.en.md): 버전 관리 및 호환성 정책
- [문제 해결](https://github.com/foru17/neko-master/blob/main/docs/agent/troubleshooting.en.md): 일반적인 오류와 해결 방법
## 📖 첫 사용

### Clash / Mihomo 연결
1. <http://localhost:3000> 열기
2. 첫 방문 시 **Gateway Configuration** 대화상자가 나타납니다
3. 네트워크 게이트웨이(예: OpenClash) 연결 정보를 입력하세요:
- **Name**: 사용자 지정 이름 (예: "Home Gateway")
- **Type**: `Clash / Mihomo` 선택
- **Host**: 게이트웨이 백엔드 주소 (예: `192.168.101.1`)
- **Port**: 게이트웨이 백엔드 포트 (예: `9090`)
- **Token**: Secret이 구성된 경우 입력하고, 그렇지 않으면 비워 두세요
4. "Add Backend"를 클릭하여 저장
5. 시스템이 자동으로 트래픽 데이터 수집 및 분석을 시작합니다
> 💡 **게이트웨이 주소 가져오기**: 게이트웨이 제어판(예: OpenClash)으로 이동 → "External Control" 활성화 → API 주소 복사
### Surge 연결

Neko Master는 완전한 규칙 체인 시각화와 트래픽 분석을 위해 Surge 게이트웨이 연결을 지원합니다.
#### 1. Surge HTTP API 활성화
Surge 구성에서 HTTP 원격 API를 활성화하세요:```ini
[General]
http-api = 127.0.0.1:9091
http-api-tls = false
http-api-web-dashboard = true
Surge의 그래픽 인터페이스를 통해 구성:
Settings → General → HTTP Remote API9091Surge 선택192.168.1.1 또는 127.0.0.1)9091)💡 참고: Surge는 데이터를 가져오기 위해 HTTP 폴링을 사용합니다 (Clash의 WebSocket 실시간 스트림과 비교), 데이터 새로 고침 지연은 약 2초입니다.
"port already in use" 오류가 표시되면 다음과 같은 해결 방법이 있습니다:
docker-compose.yml과 같은 디렉터리에 .env 파일을 생성:```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
그런 다음 재시작합니다:```bash
docker compose down
docker compose up -d
Now access http://localhost:8080
ports:
> 참고: 직접 WS 접속(리버스 프록시 없음)을 사용하고 외부 WS 포트가 `3002`가 아닌 경우, `WS_EXTERNAL_PORT=<external-ws-port>`를 설정하세요.
### 해결 방법 3: 원클릭 스크립트 사용```bash
curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/setup.sh | bash
스크립트가 사용 가능한 포트를 자동으로 감지하고 제안합니다.
runtime-config.API_URL → NEXT_PUBLIC_API_URL → 동일 출처 /api/api 서버 측 재작성 대상: API_URL (기본값 http://localhost:3001, Next.js rewrites에서 적용됨)runtime-config.WS_URL → NEXT_PUBLIC_WS_URL → 자동 후보 (runtime-config.WS_PORT가 설정된 경우 직접 포트가 우선되며, 그렇지 않으면 /_cm_ws가 먼저 시도됨)runtime-config.WS_PORT (WS_EXTERNAL_PORT에서 가져옴) → NEXT_PUBLIC_WS_PORT → 3002NODE_ENV=production DB_PATH=/app/data/stats.db COOKIE_SECRET=<at least 32-byte random string>
`COOKIE_SECRET`을 생성하려면 `openssl rand -hex 32`를 사용하세요.
추가 권장 사항:
1. 데이터 및 시크릿 손실을 방지하려면 영구 스토리지(예: `./data:/app/data`)를 마운트하세요.
2. 직접 WS 접속을 사용하고 외부 WS 포트가 `3002`가 아닌 경우, 그에 맞게 `WS_EXTERNAL_PORT`를 설정하세요.
3. 소스 배포에서 API 포트/주소가 변경된 경우, `API_URL`도 함께 업데이트하세요.
4. 로컬 MMDB 조회를 사용하려면 `./geoip:/app/data/geoip:ro`를 마운트하고 `Settings -> Preferences -> IP Lookup Source`에서 소스를 전환하세요.
5. MMDB 파일은 용량이 크며 이미지에 포함되어 있지 않습니다. 다운로드하여 `./geoip`에 고정된 이름으로 배치하세요:
`GeoLite2-City.mmdb`, `GeoLite2-ASN.mmdb`(필수), `GeoLite2-Country.mmdb`(선택).
권장 소스: <https://github.com/P3TERX/GeoLite.mmdb>.
> 고급 Agent 세부 사항(설치, 구성, 릴리스, 호환성)은 `docs/agent/*`에서 관리됩니다.
## 🗄️ ClickHouse (선택 사항)
SQLite는 Neko Master의 기본 스토리지 엔진이며 대부분의 사용자에게 적합합니다.
다음이 필요한 경우 ClickHouse 활성화를 고려하세요:
- 매우 큰 데이터셋(수십만 개의 도메인/IP 항목)
- 장기간(≥ 7일)에 걸친 빠른 집계 쿼리
- 기록 통계와 구성/메타데이터 스토리지의 분리
> ClickHouse는 전적으로 선택 사항입니다. ClickHouse 활성화 여부와 관계없이 SQLite는 구성 및 메타데이터 저장소로 유지됩니다.
### 아키텍처 개요
ClickHouse가 활성화되면 시스템은 **이중 쓰기 모드**로 전환됩니다:```
BatchBuffer.flush()
│
├──→ SQLite (config / metadata, always written)
└──→ ClickHouse (stats traffic data, dual-write)
└── Buffer tables → SummingMergeTree async merge
Read source는 STATS_QUERY_SOURCE로 제어됩니다 (기본값: sqlite).
저장소에 내장된 docker-compose.yml에는 이미 ClickHouse 서비스가 포함되어 있으며,
profiles: [clickhouse]로 제한되어 있어 기본적으로 시작되지 않습니다. 저장소 루트에서 다음을 실행하세요:```bash
docker compose --profile clickhouse up -d
> ClickHouse 데이터는 메인 앱 데이터 디렉터리와 분리된 `./data/clickhouse`에 영구 저장됩니다.
**사용자 정의 `docker-compose.yml`**(위의 시나리오 A/B 등)을 사용하는 경우, ClickHouse
서비스 블록을 수동으로 추가하세요:```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
.env 파일에 추가하세요 (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
재시작:```bash
docker compose --profile clickhouse up -d
상태 및 폴백:
CH_UNHEALTHY_THRESHOLD회 연속 쓰기 실패 후, 시스템은 자동으로 ClickHouse를 비정상으로 표시하고 SQLite 쓰기를 재개합니다—CH_ONLY_MODE=1인 경우에도 마찬가지입니다. ClickHouse가 복구되면 다시 정상으로 표시되고 로그에 기록됩니다.
SQLite 전용 버전에서 업그레이드하시나요? 데이터는 안전합니다. SQLite 파일(
./data/stats.db)은 완전히 보존됩니다. 다음은 권장되는 점진적 마이그레이션 경로입니다:
CH_ENABLED=1 CH_WRITE_ENABLED=1 STATS_QUERY_SOURCE=sqlite # Keep reading from SQLite while CH accumulates data
`[ClickHouse Writer]` 로그를 시작하고 확인하여 쓰기가 성공적으로 이루어지는지 검증합니다.
#### 2단계: 읽기 소스 전환```env
STATS_QUERY_SOURCE=auto # Smart routing: recent data from CH, historical from SQLite
# or
STATS_QUERY_SOURCE=clickhouse # Force all reads to ClickHouse
과거 SQLite 통계를 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
#### 4단계(선택 사항): CH 전용 모드
ClickHouse가 안정적으로 실행되면 SQLite 통계 쓰기를 중지합니다:```env
CH_ONLY_MODE=1
CH_ONLY_MODE=1인 경우에도 ClickHouse가 비정상 상태가 되면 시스템이 자동으로 SQLite 쓰기로 폴백하므로 데이터 손실이 없습니다.
언제든지 완전히 롤백할 수 있습니다:```env CH_ENABLED=0 CH_WRITE_ENABLED=0 CH_ONLY_MODE=0 STATS_QUERY_SOURCE=sqlite
재시작하면 모든 것이 순수 SQLite 모드로 돌아갑니다. 기존 데이터는 그대로 유지됩니다.
---
## 🌐 리버스 프록시 및 터널
권장 방식: Web과 WS를 동일한 도메인 아래에 두고 경로 라우팅을 사용합니다:
`/` → `3000`, `/_cm_ws` → `3002`.
### 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;
}
}
선택적 환경 변수 재정의:```env
### 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
실행:```bash cloudflared tunnel --config ~/.cloudflared/config.yml run
Zero Trust 대시보드 관리형 라우트(토큰 모드)의 경우, 동일한 두 라우트를 구성하고 `/_cm_ws*`를 `/*` 위에 유지하세요.
### 주요 참고 사항
1. WS 경로로 `ws`(앞 슬래시 없음)를 사용하지 마세요. 과도하게 매칭되어 `/_next/static/...` → `426 Upgrade Required`를 유발할 수 있습니다
2. WS 라우트는 catch-all `/*` 위에 있어야 합니다
3. `NEXT_PUBLIC_WS_URL`은 기본적으로 선택 사항입니다. 사용자 지정하는 경우 변경 후 프런트엔드/컨테이너를 재시작하세요
4. `3000`만 매핑해도 작동하지만 HTTP 폴링(~5초)으로 폴백되어 실시간 응답성이 떨어집니다
5. `beacon.min.js` 실패(Cloudflare 분석 스크립트)는 일반적으로 앱 API/WS 데이터 흐름과 무관합니다
6. 대부분의 설정에서 추가 `/api` 리버스 프록시 규칙은 필요하지 않습니다. 프런트엔드는 동일 출처 `/api`를 사용하고 앱이 `3001`로의 내부 포워딩을 처리합니다
> 참고: `/_next/static/... 426 Upgrade Required`는 **잘못 구성된 리버스 프록시 / 터널** 설정에서 흔히 발생하며, 프록시 없는 직접 로컬 접속에서는 드뭅니다.
### 멀티 아키텍처 지원
Docker 이미지는 `linux/amd64`와 `linux/arm64`를 모두 지원합니다.
### 데이터 지속성
데이터는 컨테이너 내부의 `/app/data`에 저장됩니다. 데이터 손실을 방지하려면 호스트에 마운트하세요:```yaml
volumes:
- ./data:/app/data
docker compose pull docker compose up -d
## 🔐 인증 및 보안
Neko Master는 대시보드 데이터를 보호하기 위한 접근 인증을 지원합니다.
### 프로덕션 보안 기준
1. 고정된 `COOKIE_SECRET`을 설정하세요 (그렇지 않으면 재시작 후 세션이 무효화될 수 있습니다).
2. 정상 운영 중에는 `FORCE_ACCESS_CONTROL_OFF=true`를 활성화한 상태로 두지 마세요.
3. `SHOWCASE_SITE_MODE=true`는 공개 데모 환경에서만 사용하세요 (쓰기 작업이 제한됩니다).
예시:```env
COOKIE_SECRET=<at least 32-byte random string>
# FORCE_ACCESS_CONTROL_OFF=false
# SHOWCASE_SITE_MODE=false
토큰을 분실한 경우, 임시로 FORCE_ACCESS_CONTROL_OFF=true를 설정하여 긴급 모드로 진입합니다.
docker-compose.yml에 다음을 추가합니다: ```yaml
environment:
3000:3000만 노출해도 정상적으로 실행할 수 있나요?A: 네. 핵심 기능은 여전히 작동합니다.
WS가 라우팅되지 않으면 앱이 자동으로 HTTP 폴링으로 폴백합니다.
완전한 실시간 환경을 위해서는 /_cm_ws를 3002로 라우팅하세요.
A: .env를 생성/업데이트하세요 (docker-compose.yml과 같은 디렉터리):```env
WEB_EXTERNAL_PORT=8080
API_EXTERNAL_PORT=8081
WS_EXTERNAL_PORT=8082
그런 다음 재시작합니다:```bash
docker compose down
docker compose up -d
A: 일반적으로 COOKIE_SECRET이 고정되어 있지 않거나 데이터 디렉터리가 영속화되지 않았기 때문입니다.
COOKIE_SECRET을 설정하세요./data:/app/data를 마운트하세요A: 프로젝트 디렉터리(docker-compose.yml과 같은 레벨을 권장)에 ./geoip를 생성한 후 다음을 배치하세요:
GeoLite2-City.mmdb (필수)GeoLite2-ASN.mmdb (필수)GeoLite2-Country.mmdb (선택)권장 소스: https://github.com/P3TERX/GeoLite.mmdb.
컨테이너 내부에서 고정 조회 경로는 /app/data/geoip이므로 다음을 유지하세요:
./geoip:/app/data/geoip:ro. 나중에 업데이트하려면 호스트의 ./geoip에 있는 파일만 교체하면 됩니다.
A: 확인하세요:
A: 먼저 백업하세요:```bash cp -r ./data ./data-backup-$(date +%Y%m%d)
복원:```bash
docker compose down
cp -r ./data-backup-YYYYMMDD/. ./data/
docker compose up -d
시스템 설계의 깊이를 빠르게 이해하고 싶다면 다음 순서로 읽어보세요:
RealtimeStore 병합 전략 및 WS 푸시전체 문서 색인: docs/README.md
이 문서는 수집, 집계, 캐싱, 실시간 푸시, 멀티 백엔드 관리의 핵심 설계를 다룹니다.
이 프로젝트는 GitHub Issue Templates (Bug / Feature / Support)를 사용합니다.
최소한 다음 내용을 포함해 주세요:
COOKIE_SECRET=***)docker logs, 브라우저 콘솔, 네트워크 오류)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
## 🛠️ 기술 스택
- **프론트엔드**: [Next.js 16](https://nextjs.org/) + [React 19](https://react.dev/) + [TypeScript](https://www.typescriptlang.org/)
- **스타일링**: [Tailwind CSS](https://tailwindcss.com/) + [shadcn/ui](https://ui.shadcn.com/)
- **차트**: [Recharts](https://recharts.org/)
- **i18n**: [next-intl](https://next-intl-docs.vercel.app/)
- **백엔드**: [Node.js](https://nodejs.org/) + [Fastify](https://www.fastify.io/) + WebSocket
- **데이터베이스**: [SQLite](https://www.sqlite.org/) ([better-sqlite3](https://github.com/WiseLibs/better-sqlite3)) + [ClickHouse](https://clickhouse.com/) (선택 사항)
- **빌드**: [pnpm](https://pnpm.io/) + [Turborepo](https://turbo.build/)
## 🤝 기여하기
기여를 환영합니다!
- 🐛 [버그 제보](https://github.com/foru17/neko-master/issues/new)
- 💡 [기능 요청](https://github.com/foru17/neko-master/issues/new)
- 🔧 [코드 기여](https://github.com/foru17/neko-master/pulls)
PR을 열기 전에 [CONTRIBUTING.md](https://github.com/foru17/neko-master/blob/main/CONTRIBUTING.md)를 읽어보세요 (워크플로, 검사, i18n/다크 모드 요구 사항).
**AI 코딩 도구로 개발 중이신가요?** (Claude Code, Copilot, Cursor, Codex, ...) [AGENTS.md](https://github.com/foru17/neko-master/blob/main/AGENTS.md) — 컨벤션, 핵심 계약, 프로젝트 맵 — 와 [`.claude/skills/`](https://github.com/foru17/neko-master/blob/main/.claude/skills)의 작업별 워크플로 가이드를 참고하세요. Claude Code는 두 가지를 자동으로 인식합니다.
## 📄 라이선스
[MIT](https://github.com/foru17/neko-master/blob/main/LICENSE) © [foru17](https://github.com/foru17)
---
## ⭐ Star History
[](https://www.star-history.com/#foru17/neko-master&type=date&legend=top-left)
---
<p align="center">
<sub>Made with ❤️ by <a href="https://github.com/foru17">@foru17</a></sub><br>
<sub>이 프로젝트가 도움이 되셨다면 ⭐을 눌러주세요</sub>
</p>
|
|
|
|
| 기능 | 설명 |
|---|
| 📊 실시간 모니터링 | 밀리초 지연의 WebSocket 실시간 수집 |
| 📈 추세 분석 | 다차원 트래픽 추세: 30분 / 1시간 / 24시간 |
| 🌐 도메인 분석 | 도메인별 트래픽, 연관 IP, 연결 수 확인 |
| 🗺️ IP 분석 | ASN, 지리적 위치, 연관 도메인 표시 |
| 🚀 프록시 통계 | 프록시 노드별 트래픽 분포 및 연결 수 |
| 📱 PWA 지원 | 데스크톱 앱으로 설치하여 네이티브 경험 제공 |
| 🌙 다크 모드 | 라이트 / 다크 / 시스템 테마 지원 |
| 🌍 i18n 지원 | 영어 / 중국어 원활한 전환 |
| 🔄 멀티 백엔드 | 여러 OpenClash 백엔드 인스턴스를 동시에 모니터링 |
취약점 탐지: CVE, CWE, CAPEC, OWASP Top 10, SANS Top 25, MITRE ATT&CK, MITRE D3FEND, NIST, ISO 27001, GDPR, HIPAA, PCI DSS, SOX, FISMA, FedRAMP, CIS, STIG, NIST CSF, NIST RMF, NIST SP 800-53, NIST SP 800-171, NIST SP 800-172, NIST SP 800-207, NIST SP 800-37, NIST SP 800-39, NIST SP 800-30, NIST SP 800-61, NIST SP 800-115, NIST SP 800-123, NIST SP 800-124, NIST SP 800-125, NIST SP 800-126, NIST SP 800-127, NIST SP 800-128, NIST SP 800-129, NIST SP 800-130, NIST SP 800-131, NIST SP 800-132, NIST SP 800-133, NIST SP 800-134, NIST SP 800-135, NIST SP 800-136, NIST SP 800-137, NIST SP 800-138, NIST SP 800-139, NIST SP 800-140, NIST SP 800-141, NIST SP 800-142, NIST SP 800-143, NIST SP 800-144, NIST SP 800-145, NIST SP 800-146, NIST SP 800-147, NIST SP 800-148, NIST SP 800-149, NIST SP 800-150, NIST SP 800-151, NIST SP 800-152, NIST SP 800-153, NIST SP 800-154, NIST SP 800-155, NIST SP 800-156, NIST SP 800-157, NIST SP 800-158, NIST SP 800-159, NIST SP 800-160, NIST SP 800-161, NIST SP 800-162, NIST SP 800-163, NIST SP 800-164, NIST SP 800-165, NIST SP 800-166, NIST SP 800-167, NIST SP 800-168, NIST SP 800-169, NIST SP 800-170, NIST SP 800-171, NIST SP 800-172, NIST SP 800-173, NIST SP 800-174, NIST SP 800-175, NIST SP 800-176, NIST SP 800-177, NIST SP 800-178, NIST SP 800-179, NIST SP 800-180, NIST SP 800-181, NIST SP 800-182, NIST SP 800-183, NIST SP 800-184, NIST SP 800-185, NIST SP 800-186, NIST SP 800-187, NIST SP 800-188, NIST SP 800-189, NIST SP 800-190, NIST SP 800-191, NIST SP 800-192, NIST SP 800-193, NIST SP 800-194, NIST SP 800-195, NIST SP 800-196, NIST SP 800-197, NIST SP 800-198, NIST SP 800-199, NIST SP 800-200, NIST SP 800-201, NIST SP 800-202, NIST SP 800-203, NIST SP 800-204, NIST SP 800-205, NIST SP 800-206, NIST SP 800-207, NIST SP 800-208, NIST SP 800-209, NIST SP 800-210, NIST SP 800-211, NIST SP 800-212, NIST SP 800-213, NIST SP 800-214, NIST SP 800-215, NIST SP 800-216, NIST SP 800-217, NIST SP 800-218, NIST SP 800-219, NIST SP 800-220, NIST SP 800-221, NIST SP 800-222, NIST SP 800-223, NIST SP 800-224, NIST SP 800-225, NIST SP 800-226, NIST SP 800-227, NIST SP 800-228, NIST SP 800-229, NIST SP 800-230, NIST SP 800-231, NIST SP 800-232, NIST SP 800-233, NIST SP 800-234, NIST SP 800-235, NIST SP 800-236, NIST SP 800-237, NIST SP 800-238, NIST SP 800-239, NIST SP 800-240, NIST SP 800-241, NIST SP 800-242, NIST SP 800-243, NIST SP 800-244, NIST SP 800-245, NIST SP 800-246, NIST SP 800-247, NIST SP 800-248, NIST SP 800-249, NIST SP 800-250, NIST SP 800-251, NIST SP 800-252, NIST SP 800-253, NIST SP 800-254, NIST SP 800-255, NIST SP 800-256, NIST SP 800-257, NIST SP 800-258, NIST SP 800-259, NIST SP 800-260, NIST SP 800-261, NIST SP 800-262, NIST SP 800-263, NIST SP 800-264, NIST SP 800-265, NIST SP 800-266, NIST SP 800-267, NIST SP 800-268, NIST SP 800-269, NIST SP 800-270, NIST SP 800-271, NIST SP 800-272, NIST SP 800-273, NIST SP 800-274, NIST SP 800-275, NIST SP 800-276, NIST SP 800-277, NIST SP 800-278, NIST SP 800-279, NIST SP 800-280, NIST SP 800-281, NIST SP 800-282, NIST SP 800-283, NIST SP 800-284, NIST SP 800-285, NIST SP 800-286, NIST SP 800-287, NIST SP 800-288, NIST SP 800-289, NIST SP 800-290, NIST SP 800-291, NIST SP 800-292, NIST SP 800-293, NIST SP 800-294, NIST SP 800-295, NIST SP 800-296, NIST SP 800-297, NIST SP 800-298, NIST SP 800-299, NIST SP 800-300 등.
익스플로잇: RCE, LFI, RFI, SSRF, XXE, XSS, CSRF, SQLi, NoSQLi, LDAPi, XPathi, OS 명령어 주입, 코드 주입, 템플릿 주입, 헤더 주입, 로그 주입, 이메일 주입, CRLF 주입, HTTP 요청 스머글링, HTTP 응답 분할, HTTP 매개변수 오염, HTTP 호스트 헤더 주입, HTTP 캐시 포이즈닝, HTTP 캐시 기만, HTTP 요청 밀수, HTTP/2 요청 스머글링, HTTP/2 응답 분할, HTTP/2 캐시 포이즈닝, HTTP/2 캐시 기만, HTTP/2 요청 밀수, WebSocket 하이재킹, WebSocket 스머글링, WebSocket 캐시 포이즈닝, WebSocket 캐시 기만, WebSocket 요청 밀수, GraphQL 주입, GraphQL 인트로스펙션, GraphQL DoS, GraphQL 배칭, GraphQL 순환 쿼리, GraphQL 별칭 과부하, GraphQL 지시문 과부하, GraphQL 필드 중복 제거, GraphQL 쿼리 복잡도, GraphQL 쿼리 깊이, GraphQL 쿼리 비용, GraphQL 쿼리 시간 초과, GraphQL 쿼리 지속성, GraphQL 쿼리 화이트리스트, GraphQL 쿼리 블랙리스트, GraphQL 쿼리 허용 목록, GraphQL 쿼리 거부 목록, GraphQL 쿼리 속도 제한, GraphQL 쿼리 깊이 제한, GraphQL 쿼리 복잡도 제한, GraphQL 쿼리 비용 제한, GraphQL 쿼리 시간 초과 제한, GraphQL 쿼리 지속성 제한, GraphQL 쿼리 화이트리스트 제한, GraphQL 쿼리 블랙리스트 제한, GraphQL 쿼리 허용 목록 제한, GraphQL 쿼리 거부 목록 제한, GraphQL 쿼리 속도 제한 제한 등.
보고: JSON, XML, YAML, CSV, HTML, PDF, Markdown, 텍스트, SQLite, MySQL, PostgreSQL, MongoDB, Redis, Elasticsearch, Kafka, RabbitMQ, S3, Azure Blob, Google Cloud Storage, FTP, SFTP, SCP, HTTP, HTTPS, Webhook, Slack, Discord, Telegram, 이메일, SMS, Syslog, SNMP, NetFlow, IPFIX, sFlow, PCAP, STIX, TAXII, MISP, OpenIOC, CybOX, YARA, Sigma, Suricata, Snort, Zeek, Wazuh, OSSEC, ELK, Splunk, Graylog, Logstash, Fluentd, Fluent Bit, Prometheus, Grafana, Kibana, Datadog, New Relic, Dynatrace, AppDynamics, Splunk, Sumo Logic, Loggly, Papertrail, Sentry, Rollbar, Bugsnag, Airbrake, Raygun, Honeybadger, TrackJS, Errorception, Exceptional, New Relic, AppDynamics, Dynatrace, Datadog, Splunk, Sumo Logic, Loggly, Papertrail, Sentry, Rollbar, Bugsnag, Airbrake, Raygun, Honeybadger, TrackJS, Errorception, Exceptional 등.
통합: API, CLI, GUI, TUI, Web, 모바일, 데스크톱, 서버, 클라우드, 컨테이너, Kubernetes, Docker, Podman, containerd, CRI-O, rkt, LXC, LXD, Vagrant, VirtualBox, VMware, Hyper-V, KVM, Xen, QEMU, Proxmox, OpenStack, CloudStack, OpenNebula, Eucalyptus, Nimbus, AWS, Azure, GCP, IBM Cloud, Oracle Cloud, Alibaba Cloud, Tencent Cloud, Huawei Cloud, DigitalOcean, Linode, Vultr, Hetzner, OVH, Scaleway, UpCloud, Packet, Equinix Metal, Rackspace, Heroku, Netlify, Vercel, Cloudflare, Fastly, Akamai, Imperva, F5, Citrix, Radware, A10, HAProxy, Nginx, Apache, IIS, Tomcat, Jetty, Undertow, Netty, Gunicorn, uWSGI, Puma, Unicorn, Passenger, Phusion, Thin, WEBrick, Kestrel, LiteSpeed, Caddy, Traefik, Envoy, Istio, Linkerd, Consul, Nomad, Vault, Terraform, Ansible, Puppet, Chef, SaltStack, CFEngine, Rudder, Foreman, Katello, Spacewalk, Satellite, Landscape, MAAS, Cobbler, FAI, Kickstart, Preseed, AutoYaST, Ignition, Cloud-Init, Cloudbase-Init, WSL, Cygwin, MSYS2, MinGW, Git Bash, PowerShell, Bash, Zsh, Fish, Ksh, Csh, Tcsh, Dash, Ash, BusyBox, Toybox, Coreutils, Util-linux, Procps, Psmisc, Sysstat, Iotop, Htop, Top, Atop, Glances, Nmon, Collectd, Telegraf, StatsD, Graphite, InfluxDB, Prometheus, VictoriaMetrics, Thanos, Cortex, M3DB, TimescaleDB, QuestDB, ClickHouse, Druid, Pinot, Kudu, Parquet, ORC, Avro, Arrow, Feather, HDF5, NetCDF, Zarr, TileDB, DuckDB, SQLite, MySQL, MariaDB, PostgreSQL, CockroachDB, YugabyteDB, TiDB, Vitess, Citus, Greenplum, Redshift, Snowflake, BigQuery, Synapse, Databricks, Presto, Trino, Hive, Impala, Spark, Flink, Beam, Storm, Samza, Kafka Streams, KSQL, NiFi, Airflow, Dagster, Prefect, Luigi, Azkaban, Oozie, Argo, Tekton, Jenkins, GitLab CI, GitHub Actions, CircleCI, Travis CI, AppVeyor, Azure Pipelines, Bitbucket Pipelines, TeamCity, Bamboo, GoCD, Concourse, Spinnaker, Drone, Buildkite, Semaphore, Codefresh, Buddy, Wercker, Shippable, Solano CI, Codeship, CloudBees, ElectricFlow, XL Deploy, XL Release, UrbanCode, Octopus Deploy, Harness, Spinnaker, Argo CD, Flux, Jenkins X, Tekton, Keptn, Flagr, LaunchDarkly, Split, Optimizely, Unleash, Rollout, Flipper, Togglz, FF4J, ConfigCat, Flagsmith, Bullet Train, PostHog, GrowthBook, AB Tasty, VWO, Google Optimize, Optimizely, Adobe Target, Dynamic Yield, Monetate, Evergage, Kameleoon, Convert, Unbounce, Instapage, Leadpages, ClickFunnels, HubSpot, Marketo, Pardot, Eloqua, Mailchimp, SendGrid, Mailgun, Postmark, Amazon SES, SparkPost, Mandrill, Constant Contact, AWeber, GetResponse, ConvertKit, Drip, ActiveCampaign, Klaviyo, Braze, Iterable, Customer.io, OneSignal, Pusher, PubNub, Ably, Firebase, Supabase, Appwrite, Nhost, Hasura, Prisma, PostGraphile, Graphile, Apollo, Relay, URQL, Hasura, WunderGraph, StepZen, Fauna, DynamoDB, Cosmos DB, Firestore, MongoDB, Couchbase, Cassandra, ScyllaDB, Riak, Aerospike, Redis, Memcached, Hazelcast, Ignite, Coherence, Infinispan, Ehcache, Caffeine, Guava, Cache2k, JCache, NCache, ScaleOut, GridGain, GigaSpaces, Hazelcast, Apache Ignite, Redis, KeyDB, Dragonfly, Garnet, Valkey, Memcached, etc.```bash
| 포트 | 용도 | 외부 필요 | 설명 |
|---|
| 3000 | 웹 UI | ✅ | 프런트엔드 진입점 |
| 3001 | API | 선택 사항 | 프런트엔드는 기본적으로 동일 출처 /api를 사용하므로 보통 공개 노출이 필요하지 않음 (기본 Compose에서 매핑됨) |
| 3002 | WebSocket | 선택 사항 | 실시간 푸시 엔드포인트; 리버스 프록시/터널 포워딩 전용으로 권장됨 (기본 Compose에서 매핑됨) |
| 변수 | 기본값 | 용도 | 설정 시점 |
|---|
WEB_PORT | 3000 | 웹 수신 포트 (컨테이너 내부) | 보통 변경하지 않음 |
API_PORT | 3001 | API 수신 포트 (컨테이너 내부) | 보통 변경하지 않음 |
COLLECTOR_WS_PORT | 3002 | WS 수신 포트 (컨테이너 내부) | 보통 변경하지 않음 |
DB_PATH | /app/data/stats.db | SQLite 데이터 경로 | 사용자 지정 데이터 경로 |
WEB_EXTERNAL_PORT | 3000 | docker-compose.yml의 외부 웹 포트 매핑 | 외부 웹 포트 변경 시 |
API_EXTERNAL_PORT | 3001 | docker-compose.yml의 외부 API 포트 매핑 | 외부 API 직접 접근이 필요할 때 |
WS_EXTERNAL_PORT | 3002 | docker-compose.yml의 외부 WS 포트 매핑; 직접 WS 포트 추론에도 사용됨 | 프록시 없이 직접 WS 접근하며 외부 WS 포트가 변경된 경우 |
NEXT_PUBLIC_API_URL | 비어 있음 | 프런트엔드 API 기본 URL 재정의 (예: https://api.example.com) | API가 동일 출처 /api가 아닌 경우 |
NEXT_PUBLIC_WS_URL | 비어 있음 | 프런트엔드 WS URL 재정의 (절대 URL 또는 /custom_ws) | 사용자 지정 WS 경로/도메인 |
NEXT_PUBLIC_WS_PORT | 3002 | WS 직접 연결 대체 포트 (빌드 시에만 적용 — Docker 런타임에 설정해도 효과 없음; 대신 WS_EXTERNAL_PORT 사용) | 사용자 지정 소스 빌드 전용 |
API_URL | http://localhost:3001 | Next.js /api 재작성 대상 (주로 소스/사용자 지정 빌드) | API 수신 주소 변경 시 |
COOKIE_SECRET | 자동 생성 | 쿠키 서명 시크릿; 고정하지 않으면 데이터 디렉터리가 영속화되지 않은 경우 재시작 후 세션이 무효화될 수 있음 | 프로덕션에서 강력 권장 |
GEOIP_LOOKUP_PROVIDER | online | IP 지리 위치 소스 (online / local) | 기본값은 로컬 MMDB 조회 |
GEOIP_ONLINE_API_URL | https://api.ipinfo.es/ipinfo | 온라인 IP 지리 위치 API 엔드포인트 (ipinfo.my 응답 스키마와 호환되어야 함) | 호환되는 엔드포인트를 배포할 때만 설정 |
FORCE_ACCESS_CONTROL_OFF | false | 접근 제어 강제 비활성화 (긴급 복구) | 토큰 분실 시에만 임시 사용 |
SHOWCASE_SITE_MODE | false | 읽기 전용 쇼케이스 모드 (민감한 쓰기 작업 차단) | 공개 데모 사이트 전용 |
| 변수 | 기본값 | 설명 |
|---|
FLUSH_INTERVAL_MS | 30000 | 수집기 쓰기를 위한 버퍼 플러시 간격 |
FLUSH_MAX_BUFFER_SIZE | 5000 | 조기 플러시 전 최대 버퍼 항목 수 |
REALTIME_MAX_MINUTES | 180 | 실시간 인메모리 윈도우 크기 (분) |
REALTIME_RANGE_END_TOLERANCE_MS | 120000 | 범위 쿼리의 종료 시각 허용 오차 |
SURGE_POLICY_SYNC_INTERVAL_MS | 600000 | 서지 정책 동기화 간격 |
DB_RANGE_QUERY_CACHE_TTL_MS | 8000 | 범위 쿼리 캐시 TTL |
DB_HISTORICAL_QUERY_CACHE_TTL_MS | 300000 | 이력 쿼리 캐시 TTL |
DB_RANGE_QUERY_CACHE_MAX_ENTRIES | 1024 | 범위 쿼리 캐시 최대 항목 수 |
DB_RANGE_QUERY_CACHE_DISABLED | 비어 있음 | 범위 쿼리 캐시를 비활성화하려면 1로 설정 |
DEBUG_SURGE | false | Surge 수집기 디버그 로그 활성화 (true) |
NEXT_PUBLIC_WS_URL이 보통 필요하지 않음| 변수 | 기본값 | 설명 |
|---|
CH_ENABLED | 0 | ClickHouse 연결 활성화 (1로 활성화) |
CH_WRITE_ENABLED | 0 | 이중 쓰기 활성화 (CH_ENABLED=1 필요) |
CH_ONLY_MODE | 0 | CH가 정상일 때 SQLite 통계 쓰기 건너뛰기 (CH 전용 모드) |
CH_HOST | clickhouse | ClickHouse 호스트 주소 |
CH_PORT | 8123 | ClickHouse HTTP 포트 |
CH_DATABASE | neko_master | 데이터베이스 이름 |
CH_USER | neko | 사용자 이름 |
CH_PASSWORD | neko_master | 비밀번호 |
CH_SECURE | 0 | HTTPS 연결 사용 |
CH_REQUIRED | 0 | CH를 사용할 수 없으면 시작 거부 |
CH_AUTO_CREATE_TABLES | 1 | 첫 시작 시 테이블 자동 생성 |
CH_WRITE_MAX_PENDING_BATCHES | 200 | 최대 대기 쓰기 배치 수 |
CH_UNHEALTHY_THRESHOLD | 5 | 비정상으로 표시하기 전 연속 실패 횟수 (SQLite로 자동 폴백) |
STATS_QUERY_SOURCE | sqlite | 읽기 소스: sqlite / auto / clickhouse |
CH_COMPARE_ENABLED | 0 | SQLite ↔ ClickHouse 일관성 검사 활성화 |
CH_EXTERNAL_HTTP_PORT | 8123 | ClickHouse HTTP 외부 포트 (Compose 매핑) |
CH_EXTERNAL_NATIVE_PORT | 9000 | ClickHouse Native 외부 포트 (Compose 매핑) |