Neko - 브라우저 기반 가상 데스크톱 완전 가이드
⏱️ 예상 읽기 시간: 12분
서론
Neko는 웹브라우저에서 바로 사용할 수 있는 혁신적인 가상 데스크톱 솔루션입니다. WebRTC 기술을 활용하여 낮은 지연시간과 고품질 스트리밍을 제공하며, 다중 사용자 협업부터 격리된 개발 환경까지 다양한 용도로 활용할 수 있습니다.
Neko가 특별한 이유
- 브라우저 네이티브: 별도 클라이언트 설치 없이 웹브라우저에서 바로 접속
- WebRTC 기반: 낮은 지연시간과 P2P 연결로 최적의 성능
- 다중 사용자: 실시간 협업과 화면 공유 지원
- Docker 기반: 쉬운 배포와 확장성
- 오픈소스: 완전한 커스터마이징과 자체 호스팅 가능
Neko 아키텍처 이해
시스템 구성
┌─────────────────────────────────────────┐
│ 웹 브라우저 │
│ (Chrome, Firefox, Safari) │
└─────────────┬───────────────────────────┘
│ WebRTC + WebSocket
▼
┌─────────────────────────────────────────┐
│ Neko 서버 │
│ │
│ ┌─────────────┐ ┌─────────────────┐ │
│ │ Web UI │ │ WebRTC Gateway │ │
│ │ (Vue.js) │ │ (Go Backend) │ │
│ └─────────────┘ └─────────────────┘ │
└─────────────┬───────────────────────────┘
│ X11/VNC Protocol
▼
┌─────────────────────────────────────────┐
│ 가상 데스크톱 환경 │
│ │
│ • Firefox │
│ • Chromium │
│ • VLC Player │
│ • LibreOffice │
│ • 개발 도구들 │
└─────────────────────────────────────────┘
핵심 기술
WebRTC (Web Real-Time Communication):
- P2P 연결로 서버 부하 최소화
- 음성, 비디오, 데이터 실시간 전송
- NAT 통과 및 방화벽 우회 지원
X11 forwarding:
- Linux GUI 애플리케이션 원격 실행
- 높은 호환성과 안정성
- 다양한 애플리케이션 지원
설치 및 환경 준비
1. 시스템 요구사항
서버 환경:
- Docker 및 Docker Compose
- 최소 2GB RAM (권장 4GB+)
- 1GB 이상 디스크 공간
- 인터넷 연결 (WebRTC STUN/TURN 서버)
클라이언트 환경:
- 모던 웹브라우저 (Chrome 60+, Firefox 60+, Safari 12+)
- WebRTC 지원 브라우저
- 안정적인 인터넷 연결
2. Docker Compose를 사용한 빠른 설치
# 작업 디렉토리 생성
mkdir neko-desktop && cd neko-desktop
# Docker Compose 파일 생성
cat > docker-compose.yml << 'EOF'
version: "3.8"
services:
neko:
image: m1k1o/neko:firefox
restart: unless-stopped
shm_size: "2gb"
ports:
- "8080:8080"
- "52000-52100:52000-52100/udp"
environment:
NEKO_SCREEN: "1280x720@30"
NEKO_PASSWORD: "neko"
NEKO_PASSWORD_ADMIN: "admin"
NEKO_EPR: "52000-52100"
NEKO_ICELITE: "1"
cap_add:
- SYS_ADMIN
volumes:
- ./data:/home/neko/Downloads
security_opt:
- seccomp:unconfined
EOF
# 컨테이너 시작
docker-compose up -d
# 로그 확인
docker-compose logs -f neko
접속 확인:
# 브라우저에서 http://localhost:8080 접속
# 사용자: neko / 비밀번호: neko
# 관리자: admin / 비밀번호: admin
3. 다양한 애플리케이션별 이미지
# Firefox 브라우저
docker run -d \
--name neko-firefox \
-p 8080:8080 \
-p 52000-52100:52000-52100/udp \
--shm-size=2g \
-e NEKO_SCREEN=1920x1080@30 \
-e NEKO_PASSWORD=neko \
-e NEKO_PASSWORD_ADMIN=admin \
m1k1o/neko:firefox
# Google Chrome/Chromium
docker run -d \
--name neko-chromium \
-p 8081:8080 \
-p 52100-52200:52000-52100/udp \
--shm-size=2g \
-e NEKO_SCREEN=1920x1080@30 \
-e NEKO_PASSWORD=neko \
-e NEKO_PASSWORD_ADMIN=admin \
m1k1o/neko:chromium
# VLC 미디어 플레이어
docker run -d \
--name neko-vlc \
-p 8082:8080 \
-p 52200-52300:52000-52100/udp \
--shm-size=2g \
-e NEKO_SCREEN=1920x1080@30 \
-e NEKO_PASSWORD=neko \
-e NEKO_PASSWORD_ADMIN=admin \
m1k1o/neko:vlc
# 전체 데스크톱 환경 (XFCE)
docker run -d \
--name neko-desktop \
-p 8083:8080 \
-p 52300-52400:52000-52100/udp \
--shm-size=2g \
-e NEKO_SCREEN=1920x1080@30 \
-e NEKO_PASSWORD=neko \
-e NEKO_PASSWORD_ADMIN=admin \
m1k1o/neko:xfce
고급 설정 및 커스터마이징
1. 환경 변수 완전 가이드
# docker-compose.yml 고급 설정
version: "3.8"
services:
neko:
image: m1k1o/neko:firefox
restart: unless-stopped
shm_size: "4gb" # 성능 향상을 위한 공유 메모리 증가
ports:
- "8080:8080"
- "52000-52100:52000-52100/udp"
environment:
# 화면 설정
NEKO_SCREEN: "1920x1080@60" # 해상도와 프레임레이트
NEKO_DISPLAY: ":99.0" # X11 디스플레이 번호
# 인증 설정
NEKO_PASSWORD: "강력한패스워드123!"
NEKO_PASSWORD_ADMIN: "관리자패스워드456!"
NEKO_LOCKS: "control login" # 잠금 기능 활성화
# 네트워크 설정
NEKO_BIND: "0.0.0.0:8080" # 바인딩 주소
NEKO_EPR: "52000-52100" # UDP 포트 범위
NEKO_ICELITE: "1" # ICE Lite 모드 (NAT 환경)
# WebRTC 설정
NEKO_TCPMUX: "8085" # TCP 멀티플렉서 포트
NEKO_UDPMUX: "8086" # UDP 멀티플렉서 포트
# 성능 최적화
NEKO_MAX_FPS: "60" # 최대 FPS
NEKO_VIDEO_CODEC: "VP8" # 비디오 코덱 (VP8, VP9, H264)
NEKO_AUDIO_CODEC: "OPUS" # 오디오 코덱
# 파일 시스템
NEKO_FILE_TRANSFER_ENABLED: "true" # 파일 전송 활성화
NEKO_FILE_TRANSFER_PATH: "/home/neko/Downloads"
cap_add:
- SYS_ADMIN
volumes:
- ./downloads:/home/neko/Downloads
- ./config:/etc/neko
security_opt:
- seccomp:unconfined
deploy:
resources:
limits:
memory: 4G
cpus: "2.0"
2. SSL/HTTPS 설정
# Nginx 리버스 프록시 설정
cat > nginx.conf << 'EOF'
upstream neko {
server 127.0.0.1:8080;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /path/to/ssl/cert.pem;
ssl_certificate_key /path/to/ssl/key.pem;
location / {
proxy_pass http://neko;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
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;
# WebRTC 지원
proxy_set_header Sec-WebSocket-Extensions $http_sec_websocket_extensions;
proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key;
proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 86400;
}
}
EOF
# Docker Compose에 Nginx 추가
cat >> docker-compose.yml << 'EOF'
nginx:
image: nginx:alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./ssl:/etc/ssl/private
depends_on:
- neko
EOF
3. 커스텀 이미지 생성
# Dockerfile - 개발 환경용 커스텀 이미지
FROM m1k1o/neko:base
# 필수 패키지 설치
RUN apt-get update && apt-get install -y \
firefox \
chromium-browser \
code \
git \
nodejs \
npm \
python3 \
python3-pip \
vim \
curl \
wget \
&& rm -rf /var/lib/apt/lists/*
# Visual Studio Code 설정
RUN wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg \
&& install -o root -g root -m 644 packages.microsoft.gpg /etc/apt/trusted.gpg.d/ \
&& echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/trusted.gpg.d/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list \
&& apt-get update \
&& apt-get install -y code
# Node.js 최신 버전 설치
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - \
&& apt-get install -y nodejs
# Python 개발 도구
RUN pip3 install jupyter lab pandas numpy matplotlib
# 사용자 환경 설정
RUN echo 'export PATH=$PATH:/usr/bin' >> /home/neko/.bashrc \
&& echo 'alias ll="ls -la"' >> /home/neko/.bashrc
# 기본 애플리케이션을 VSCode로 설정
ENV NEKO_APP="code"
ENV NEKO_APP_ARGS="--no-sandbox --disable-dev-shm-usage"
# 빌드 및 실행
# docker build -t neko-dev .
# docker run -d -p 8080:8080 -p 52000-52100:52000-52100/udp neko-dev
실제 활용 사례
1. 원격 개발 환경
# 개발자를 위한 완전한 환경 설정
cat > docker-compose-dev.yml << 'EOF'
version: "3.8"
services:
neko-dev:
build: .
restart: unless-stopped
shm_size: "4gb"
ports:
- "8080:8080"
- "52000-52100:52000-52100/udp"
- "3000:3000" # React 개발 서버
- "8000:8000" # Python 서버
- "5000:5000" # Flask 서버
environment:
NEKO_SCREEN: "1920x1080@60"
NEKO_PASSWORD: "dev2024!"
NEKO_PASSWORD_ADMIN: "admin2024!"
NEKO_APP: "code"
NEKO_APP_ARGS: "--no-sandbox --disable-dev-shm-usage /workspace"
cap_add:
- SYS_ADMIN
volumes:
- ./workspace:/workspace
- ./config:/home/neko/.config
- /var/run/docker.sock:/var/run/docker.sock # Docker-in-Docker
security_opt:
- seccomp:unconfined
networks:
- dev-network
networks:
dev-network:
driver: bridge
EOF
# 실행
docker-compose -f docker-compose-dev.yml up -d
사용 시나리오:
- 원격 코딩: 어디서든 브라우저로 개발 환경 접속
- 팀 협업: 실시간 코드 리뷰 및 페어 프로그래밍
- 교육: 학생들에게 일관된 개발 환경 제공
- 데모: 클라이언트에게 실시간 프로젝트 시연
2. 미디어 센터
# VLC 기반 미디어 스트리밍 서버
cat > docker-compose-media.yml << 'EOF'
version: "3.8"
services:
neko-media:
image: m1k1o/neko:vlc
restart: unless-stopped
shm_size: "2gb"
ports:
- "8080:8080"
- "52000-52100:52000-52100/udp"
environment:
NEKO_SCREEN: "1920x1080@30"
NEKO_PASSWORD: "media123"
NEKO_PASSWORD_ADMIN: "admin123"
NEKO_FILE_TRANSFER_ENABLED: "true"
volumes:
- ./media:/media:ro # 미디어 파일 (읽기 전용)
- ./downloads:/home/neko/Downloads
cap_add:
- SYS_ADMIN
security_opt:
- seccomp:unconfined
EOF
# 실행
docker-compose -f docker-compose-media.yml up -d
활용 방법:
- 가족 미디어 서버: 집 어디서든 미디어 시청
- 원격 미디어 접근: 외출 시에도 집의 미디어 라이브러리 접근
- 협업 시청: 친구들과 함께 영화 시청 (화면 공유)
3. 교육 및 트레이닝
# 교육용 브라우저 환경
cat > docker-compose-education.yml << 'EOF'
version: "3.8"
services:
neko-teacher:
image: m1k1o/neko:firefox
restart: unless-stopped
shm_size: "2gb"
ports:
- "8080:8080"
- "52000-52100:52000-52100/udp"
environment:
NEKO_SCREEN: "1280x720@30"
NEKO_PASSWORD: "student"
NEKO_PASSWORD_ADMIN: "teacher"
NEKO_LOCKS: "control" # 학생들은 관찰만 가능
volumes:
- ./lessons:/home/neko/Documents
cap_add:
- SYS_ADMIN
security_opt:
- seccomp:unconfined
neko-lab:
image: m1k1o/neko:xfce
restart: unless-stopped
shm_size: "2gb"
ports:
- "8081:8080"
- "52100-52200:52000-52100/udp"
environment:
NEKO_SCREEN: "1280x720@30"
NEKO_PASSWORD: "lab"
NEKO_PASSWORD_ADMIN: "instructor"
volumes:
- ./lab-materials:/home/neko/Desktop
cap_add:
- SYS_ADMIN
security_opt:
- seccomp:unconfined
EOF
다중 사용자 관리
1. 사용자 권한 시스템
// config/users.json
{
"users": [
{
"username": "admin",
"password": "admin123",
"permissions": {
"control": true,
"admin": true,
"host": true,
"login": true
}
},
{
"username": "presenter",
"password": "present123",
"permissions": {
"control": true,
"admin": false,
"host": true,
"login": true
}
},
{
"username": "viewer",
"password": "view123",
"permissions": {
"control": false,
"admin": false,
"host": false,
"login": true
}
}
]
}
2. 세션 관리 스크립트
#!/bin/bash
# manage-sessions.sh
# 현재 활성 세션 확인
check_sessions() {
echo "🔍 현재 활성 세션:"
docker exec neko-main curl -s http://localhost:8080/api/sessions | jq '.'
}
# 특정 사용자 세션 종료
kick_user() {
local username=$1
if [ -z "$username" ]; then
echo "❌ 사용자명을 입력하세요"
return 1
fi
echo "👋 사용자 '$username' 세션 종료 중..."
docker exec neko-main curl -X DELETE "http://localhost:8080/api/sessions/$username"
}
# 모든 세션 종료
kick_all() {
echo "🧹 모든 세션 종료 중..."
docker exec neko-main curl -X DELETE "http://localhost:8080/api/sessions"
}
# 사용법 출력
usage() {
echo "사용법: $0 [command] [options]"
echo "Commands:"
echo " sessions - 현재 활성 세션 조회"
echo " kick <username> - 특정 사용자 세션 종료"
echo " kick-all - 모든 세션 종료"
}
# 메인 로직
case $1 in
sessions)
check_sessions
;;
kick)
kick_user $2
;;
kick-all)
kick_all
;;
*)
usage
;;
esac
성능 최적화
1. 네트워크 최적화
# 네트워크 대역폭 제한
docker run -d \
--name neko-optimized \
-p 8080:8080 \
-p 52000-52100:52000-52100/udp \
--shm-size=2g \
-e NEKO_SCREEN=1280x720@30 \ # 해상도 최적화
-e NEKO_MAX_FPS=30 \ # FPS 제한
-e NEKO_VIDEO_BITRATE=2000 \ # 비트레이트 제한 (kbps)
-e NEKO_AUDIO_BITRATE=128 \ # 오디오 비트레이트 (kbps)
-e NEKO_VIDEO_CODEC=VP8 \ # 효율적인 코덱
m1k1o/neko:firefox
# 품질 vs 성능 설정
# 고품질 (높은 대역폭 필요):
NEKO_SCREEN="1920x1080@60"
NEKO_VIDEO_BITRATE=5000
NEKO_VIDEO_CODEC=H264
# 저대역폭 최적화:
NEKO_SCREEN="1280x720@24"
NEKO_VIDEO_BITRATE=1000
NEKO_VIDEO_CODEC=VP8
2. 하드웨어 가속
# GPU 가속 활성화 (NVIDIA)
docker run -d \
--name neko-gpu \
--gpus all \
-p 8080:8080 \
-p 52000-52100:52000-52100/udp \
--shm-size=2g \
-e NEKO_SCREEN=1920x1080@60 \
-e NEKO_VIDEO_CODEC=H264_NVENC \ # NVIDIA 하드웨어 인코딩
-e NEKO_HWACCEL=vaapi \ # 하드웨어 가속
m1k1o/neko:firefox
# Intel QSV 하드웨어 가속
docker run -d \
--name neko-intel \
--device /dev/dri \
-p 8080:8080 \
-p 52000-52100:52000-52100/udp \
--shm-size=2g \
-e NEKO_HWACCEL=qsv \
-e NEKO_VIDEO_CODEC=H264_QSV \
m1k1o/neko:firefox
3. 모니터링 및 로깅
# Prometheus 메트릭 활성화
cat > docker-compose-monitoring.yml << 'EOF'
version: "3.8"
services:
neko:
image: m1k1o/neko:firefox
restart: unless-stopped
shm_size: "2gb"
ports:
- "8080:8080"
- "52000-52100:52000-52100/udp"
environment:
NEKO_PROMETHEUS: "true"
NEKO_PROMETHEUS_BIND: "0.0.0.0:8090"
cap_add:
- SYS_ADMIN
security_opt:
- seccomp:unconfined
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana-storage:/var/lib/grafana
volumes:
grafana-storage:
EOF
# Prometheus 설정
cat > prometheus.yml << 'EOF'
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'neko'
static_configs:
- targets: ['neko:8090']
EOF
보안 및 접근 제어
1. 방화벽 설정
# UFW 방화벽 규칙
sudo ufw allow 8080/tcp # HTTP/WebSocket
sudo ufw allow 52000:52100/udp # WebRTC UDP
# 특정 IP만 허용
sudo ufw allow from 192.168.1.0/24 to any port 8080
sudo ufw allow from 10.0.0.0/8 to any port 8080
# 방화벽 활성화
sudo ufw enable
2. 인증 강화
# OAuth2 프록시를 통한 인증
cat > docker-compose-auth.yml << 'EOF'
version: "3.8"
services:
oauth2-proxy:
image: quay.io/oauth2-proxy/oauth2-proxy:latest
command:
- --provider=github
- --email-domain=*
- --upstream=http://neko:8080
- --http-address=0.0.0.0:4180
- --cookie-secret=your-cookie-secret
- --client-id=your-github-client-id
- --client-secret=your-github-client-secret
ports:
- "4180:4180"
depends_on:
- neko
neko:
image: m1k1o/neko:firefox
restart: unless-stopped
shm_size: "2gb"
expose:
- "8080"
ports:
- "52000-52100:52000-52100/udp"
environment:
NEKO_BIND: "0.0.0.0:8080"
NEKO_PASSWORD: "internal"
NEKO_PASSWORD_ADMIN: "admin"
cap_add:
- SYS_ADMIN
security_opt:
- seccomp:unconfined
EOF
3. 네트워크 격리
# Docker 네트워크 격리
docker network create --driver bridge neko-isolated
# 격리된 환경에서 실행
docker run -d \
--name neko-secure \
--network neko-isolated \
-p 127.0.0.1:8080:8080 \ # 로컬호스트만 바인딩
-p 52000-52100:52000-52100/udp \
--shm-size=2g \
-e NEKO_SCREEN=1280x720@30 \
m1k1o/neko:firefox
# 리버스 프록시를 통해서만 접근 허용
docker run -d \
--name neko-proxy \
--network neko-isolated \
-p 80:80 \
-p 443:443 \
nginx:alpine
문제 해결
일반적인 문제들
WebRTC 연결 실패:
# STUN/TURN 서버 설정 확인
docker logs neko-container | grep -i "ice\|stun\|turn"
# 방화벽 포트 확인
sudo netstat -tulpn | grep -E "(8080|52000)"
# NAT 환경에서의 설정
-e NEKO_ICESERVERS="[{\"urls\":[\"stun:stun.l.google.com:19302\"]}]"
성능 문제:
# 리소스 사용량 확인
docker stats neko-container
# 공유 메모리 증가
--shm-size=4g
# CPU/메모리 제한 해제
docker run --memory=4g --cpus="2.0" ...
오디오 문제:
# 오디오 장치 확인
docker exec neko-container aplay -l
# PulseAudio 설정
-v /run/user/1000/pulse:/run/user/1000/pulse
-e PULSE_UNIX_PATH=/run/user/1000/pulse/native
디버깅 도구
# 상세 로그 활성화
-e NEKO_DEBUG=true
-e NEKO_LOGS=debug
# 네트워크 연결 테스트
docker exec neko-container netstat -tulpn
docker exec neko-container ss -tulpn
# WebRTC 통계 확인
# 브라우저 개발자 도구에서
// WebRTC 연결 상태 확인
navigator.mediaDevices.getUserMedia({video: true, audio: true})
.then(stream => console.log('Media access OK'))
.catch(err => console.error('Media access failed:', err));
결론
Neko는 브라우저만으로 완전한 가상 데스크톱을 제공하는 혁신적인 솔루션입니다. WebRTC 기술을 활용한 낮은 지연시간과 고품질 스트리밍으로 원격 작업, 교육, 협업의 새로운 가능성을 열어줍니다.
핵심 장점
- 접근성: 별도 클라이언트 없이 웹브라우저만으로 접속
- 성능: WebRTC P2P 연결로 최적의 성능 제공
- 확장성: Docker 기반으로 쉬운 배포와 관리
- 커스터마이징: 오픈소스로 완전한 자유도 보장
활용 분야
- 원격 개발: 어디서든 일관된 개발 환경
- 교육 플랫폼: 실시간 화면 공유 및 협업
- 미디어 센터: 중앙화된 미디어 스트리밍
- 보안 환경: 격리된 브라우징 환경
Neko를 통해 물리적 제약을 뛰어넘는 새로운 컴퓨팅 경험을 시작해보세요! 🚀
참고 자료: