Sign inSign up

raindev11/webtop

By raindev11

Updated 3 months ago

한글 입출력 및 유용한 프로그램이 사전 설치된 KasmVNC 기반의 Webtop

Image
Operating systems
6

10K+

raindev11/webtop repository overview

Webtop

linuxserver/webtop, kasmvnc + ubuntu-kde 기반으로 생성한 Web 기반의 리눅스 데스크탑 환경입니다.

국내 사용자를 위한 한국어 설정, 유용한 기본 프로그램들이 사전 설치 및 설정되어 있습니다.

Features

  • 기본 쉘 : zsh (oh-my-zsh)
  • 사전 설치 라이브러리 : bat / eza / fd / jq / ripgrep
  • 기본 폰트
  • 한국어 입력 : 지원
    • 전환키 : 한/영 키
    • 입력 불가시 왼쪽 사이드 버튼 클릭 → 설정 → IME Input Mode 선택
  • 파일 업로드/다운로드, 사운드 출력 지원
  • Docker/Docker-compose 지원
  • root 권한 지원
    • sudo 명령어로 수행
  • 다양한 아키텍처 지원 (amd64/arm64, multiarch 빌드)

Supported Architecture

amd64(x86-64) 및 arm64(aarch64) 를 지원합니다. 멀티 아키텍처 이미지로 다운로드 하는 서버에 해당되는 아키텍처로 Pull 됩니다.

Noble (24.04) 기반으로 베이스 이미지 전환은 아직 미호환 패키지가 다수 있어, 연말경 전환 검토 예정입니다.

Base imageArchitecture
Ubuntu Jammy (22.04)amd64
Ubuntu Jammy (22.04)arm64

Version Tags

모든 이미지는 Ubuntu KDE 기반입니다. latestyymmdd 형식의 태그로 빌드됩니다.

TagDescription
latestLatest build
yymmddSpecific build

Container Setup

아래 2개의 포트로 서비스됩니다.

지원되는 환경변수 옵션은 아래와 같습니다.

Optional environment variables
VariableDefaultDescription
CUSTOM_PORT3000HTTP 포트
CUSTOM_HTTPS_PORT3001HTTPS 포트
CUSTOM_USERabcHTTP Basic 인증 ID
PASSWORDHTTP Basic 인증 PW (입력 시 HTTP Basic 인증 활성화)
SUBFOLDER/Subfolder 형식으로 Reverse proxy 구성 시, 사용할 Subfolder 경로
TITLEKasmVNC Client브라우저 표시 제목
START_DOCKERtrue컨테이너 내부의 도커(Docker in Docker, DinD) 사용여부
DRINODE/dev/dri/renderD128오픈소스 드라이버 기반 GPU 사용여부, DRI3 GPU Acceleration 참고
DISABLE_IPV6falseIPv6 활성화 여부
DOCKER_MODS추가 설정 가능한 Docker mods 항목
RESET_HOMEfalse컨테이너 재시작 시 홈 디렉토리 초기화 여부
DESKTOP_ICONSfalse바탕화면에 아이콘 배치여부
TZAsia/Seoul시간대
LC_ALLko_KR.UTF-8사용 언어 (ko_KR.UTF-8 / en_US.UTF-8 등)
VIEW_ONLYfalse보기전용 모드
RESIZEremote스케일링 설정 (off / scale / remote)
ENABLE_PERF_STATSfalse성능정보 표시
ENABLE_WEBRTCfalseWebRTC 사용
ENABLE_WEBPtrueWebP 사용
ENABLE_IMEtrueIME 입력 활성화
ENABLE_HIDPIfalseHiDPI 사용
VIDEO_QUALITYhigh스트리밍 품질 프리셋 (low / medium / high / extreme / lossless)
ANTI_ALIASINGdynamic안티 앨리어싱 설정 (dynamic / on / off)
Optional run configurations
TypeVariableEssentialDescription
Option--privileged컨테이너 내부의 도커(Docker in Docker, DinD) 사용을 위해 필요
Option--security_opt seccomp:unconfined컨테이너 내부의 도커(Docker in Docker, DinD) 사용을 위해 필요
Bind Mount-v ./data:/config호스트 폴더에 기본 홈 디렉토리 연결
Bind Mount-v ./docker:/var/lib/docker호스트 폴더에 DinD 디렉토리 연결
Bind Mount-v /var/run/docker.sock:/var/run/docker.sock호스트의 도커 제어가 필요할 경우 설정
Bind Mount-v ./certificates:/usr/local/share/ca-certificates사설 인증서 등록이 필요할 경우 사용
Bind Mount-v /dev/shm:/dev/shm원활한 사용을 위해 호스트의 Shared memory 공유
Device--device /dev/dri:/dev/dri내부에서 GPU를 사용하기 위해 필요
Usage

docker-compose 기반의 샘플 코드입니다. docker cli로 사용하려면 변환 사이트를 사용하세요.

docker-compose
---
version: '3.5'

services:
  webtop:
    image: raindev11/webtop:latest
    container_name: webtop
    hostname: webtop
    restart: unless-stopped
    privileged: true
    security_opt:
      - seccomp:unconfined
    environment:
      - PUID=1000
      - PGID=1000
      - SUBFOLDER=/
      - TITLE=liveLinux
      - RESET_HOME=true
      - DESKTOP_ICONS=false
      - DISABLE_IPV6=true
      # HTTP Basic Auth 사용시 ID/PW
      #- CUSTOM_USER=abc
      #- PASSWORD=abc
    volumes:
      - './data:/config'
      - './docker:/var/lib/docker'
      # 사설 인증서 등록 필요시 사용
      - './certificates:/usr/local/share/ca-certificates'
      # 호스트 도커연동 제외
      #- '/var/run/docker.sock:/var/run/docker.sock'
      # Shared Memory는 호스트와 연동하여 사용
      - '/dev/shm:/dev/shm'
    ports:
      - 3000:3000
      - 3001:3001
    devices:
      - /dev/dri:/dev/dri
    networks:
      - private

networks:
  private:
    name: private
Reverse proxy (NPM/NGiNX)
  • Reverse proxy 구간은 비 암호화(3000) 설정 기준
  • NPM의 경우 Advanced → Custom Nginx Configuration 항목에서 설정
  • proxy_pass http://webtop:3000; 은 Nginx/NPM이 동일 네트워크로 연결된 겅우이며, 동일 네트워크가 아닌 경우 proxy_pass http://127.0.0.1:(호스트 매핑포트); 로 변경하여 적용 필요
location / {
  proxy_http_version      1.1;
  proxy_set_header        Host $host;
  proxy_set_header        Upgrade $http_upgrade;
  proxy_set_header        Connection "upgrade";
  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;
  proxy_set_header        Cookie "";
  proxy_read_timeout      3600s;
  proxy_send_timeout      3600s;
  add_header              'Access-Control-Allow-Origin' '*' always;
  add_header              'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
  add_header              'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since';
  add_header              'Access-Control-Allow-Credentials' 'true';
  add_header              'Cross-Origin-Embedder-Policy' 'require-corp';
  add_header              'Cross-Origin-Opener-Policy' 'same-origin';
  add_header              'Cross-Origin-Resource-Policy' 'same-site';
  proxy_pass               http://webtop:3000;
  proxy_buffering          off;
}

location /websockify {
  proxy_http_version      1.1;
  proxy_set_header        Host $host;
  proxy_set_header        Upgrade $http_upgrade;
  proxy_set_header        Connection "upgrade";
  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;
  proxy_set_header        Cookie "";
  proxy_read_timeout      3600s;
  proxy_send_timeout      3600s;
  add_header              'Access-Control-Allow-Origin' '*' always;
  add_header              'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
  add_header              'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since';
  add_header              'Access-Control-Allow-Credentials' 'true';
  add_header              'Cross-Origin-Embedder-Policy' 'require-corp';
  add_header              'Cross-Origin-Opener-Policy' 'same-origin';
  add_header              'Cross-Origin-Resource-Policy' 'same-site';
  proxy_pass               http://webtop:3000;
  proxy_buffering          off;
}

Preinstalled GUI Applications

항목명칭초기설정 내용
브라우저Brave한글 언어팩 적용, 우클릭 차단 확장 사전설치
텍스트 편집기VSCode한글 언어팩 적용
Docker, Indent-rainbow, Typora 확장 사전설치
오피스LibreOfficeStopBegging 확장 사전설치
원격접속Remmina기본 설정
가상화Docker/compose
네트워크Wireshark기본 설정
파일 탐색기Double Commander기본 설정
압축Ark
동영상 뷰어VLC기본 설정
이미지 뷰어Gwenview기본 설정
화면 녹화OBS Studio기본 설정
화면 캡쳐Spetacle

Update periods

보안 및 어플리케이션 정기 업데이트는 업데이트는 매주 일요일 새벽 3시에 진행됩니다.

비정기 업데이트는 수시로 진행될 수 있습니다.

Versions

  • 24.07.28 : 컴포지터 비활성화 → 활성화로 변경 (Brave 브라우저 내 우클릭 메뉴 등, 사각박스 문제 수정)
  • 24.05.26 : exa → eza로 변경
  • 24.03.24 : 폰트 기본설정 변경 (서브픽셀 렌더링: RGB, 힌팅: 완전히)
  • 24.03.18 : Brave 브라우저 초기 실행 오류 수정
  • 24.03.18 : UID/GID가 1000:1000이 아닐 경우 정상 부팅되지 않는 문제 수정
  • 24.03.18 : 기본 한글폰트 변경(Noto → D2Coding → Noto CJK), 폰트 기본 우선순위 변경 (최우선 → 후순위)
  • 24.03.17 : Pretendard 폰트 제외
  • 24.03.03 : 베이스 이미지에 적용된 내용 반영 (변경된 옵션 등)
  • 23.10.29 : KasmVNC 초기 설정을 환경변수로 설정 가능하도록 변경
  • 23.10.22 : KasmVNC 초기 설정 변경 (WebP 압축 활성화, IME 입력 활성화, 기본 스트리밍 품질 프리셋 높음 설정)
  • 23.09.17 : python pip 추가
  • 23.07.23 : LibreOffice의 툴바 아이콘들이 보이지 않는 문제 수정
  • 23.07.23 : VSCode 실행 시 KDE Wallet 창 제거
  • 23.07.23 : Terminal 실행 시 oh-my-zsh 업데이트 프롬프트 제거
  • 23.06.10 : RESET_HOME 설정 추가, DESKTOP_ICONS 값을 1/0 에서 true/false 로 변경
  • 23.06.09 : SUBFOLDER 설정관련 버그 수정, 인증서 설치로직 추가
  • 23.06.06 : 최초 업로드

Tag summary

Content type

Image

Digest

sha256:f74bc1d89

Size

1.8 GB

Last updated

3 months ago

docker pull raindev11/webtop