⏱️ 예상 읽기 시간: 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 기술을 활용한 낮은 지연시간과 고품질 스트리밍으로 원격 작업, 교육, 협업의 새로운 가능성을 열어줍니다.

핵심 장점

  1. 접근성: 별도 클라이언트 없이 웹브라우저만으로 접속
  2. 성능: WebRTC P2P 연결로 최적의 성능 제공
  3. 확장성: Docker 기반으로 쉬운 배포와 관리
  4. 커스터마이징: 오픈소스로 완전한 자유도 보장

활용 분야

  • 원격 개발: 어디서든 일관된 개발 환경
  • 교육 플랫폼: 실시간 화면 공유 및 협업
  • 미디어 센터: 중앙화된 미디어 스트리밍
  • 보안 환경: 격리된 브라우징 환경

Neko를 통해 물리적 제약을 뛰어넘는 새로운 컴퓨팅 경험을 시작해보세요! 🚀


참고 자료: