본문 바로가기
서버/리눅스 서버

ubuntu xfce novnc docker (kasm image 사용) 구축하기

by ㅋㅋ잠자 2022. 10. 24.
반응형

안녕하세요? 도정진입니다.

 

web 으로 원격 데스크톱 환경을 꾸리려다 보니 여러가지 솔루션이 있었는데요. 찾아보니 아래의 솔루션들이 있었습니다.

 

1. guacamole

이 솔루션은 블로그에 많이 소개가 되었는데요. 설치가 쉽지 않아서 잘 사용하지 않고 있습니다.

https://blog.djjproject.com/794

 

2. guacamole-lite --> webtop

이 솔루션도 guacd + guacamole nodejs client 를 사용해서 동작하는 데스크탑입니다.

물론 잘 동작되나, 실제로 응답성은 3번이 빨라서 3번으로 정착하게 되었습니다.

https://docs.linuxserver.io/images/docker-webtop

이 컨테이너를 사용하면 소리도 나옵니다만, 없는것과 거의 비슷합니다. guacamole 의 rdp 는 스크롤성? 이 별로라서 잘 사용하지 않는 편입니다.

 

3. kasm (ubuntu + lxde or xfce4 + novnc)

찾아보면 많은 컨테이너들이 있습니다만, 관리가 되는 것 중에 kasm 서비스가 있는데요. 컨테이너의 경우 오케스트레이션을 통해 중앙 관리를 하는 부분입니다만,

 

실제로, 이미지는 그냥 공개가 되고 있어서 이미지만 활용이 가능하였습니다.

https://www.kasmweb.com/

 

잘 활용하면 엔터프라이즈에서도 활용이 가능해 보입니다.

 

컨테이너 이미지는 아래와 같습니다.

https://github.com/kasmtech/workspaces-core-images

https://github.com/kasmtech/workspaces-images

 

1. 일단은 설치를!

테스트로 한번 돌려보기 위해서 아래와 같이 run 만 해봅니다.

root@debian:~/workspaces-core-images# docker run --rm -it --shm-size=512m -p 6901:6901 -e VNC_PW='12345' kasmweb/desktop:1.11.0

실행을 하면 6901 포트로 웹으로 접속하게 되면 아래와 같이 noVNC가 열리면서 데스크톱 사용이 가능합니다.

기본 아이디 : kasm_user

기본 비번 : VNC_PW 의 환경변수 값 (12345)

 

2. root 계정의 비번 설정

일단 1섹션으로 쓸만하다고 생각이 들었으면 컨테이너를 백그라운드로 올려줍니다.

root@debian:~/workspaces-core-images# docker run -d --restart=unless-stopped --name ubuntu-kasm --shm-size=2G --device /dev/dri:/dev/dri -p 6901:6901 -e VNC_PW='12345' -e MAX_FRAME_RATE=60 ubuntu-kasm

루트 권한으로 작업할 일이 생깁니다. 따라서 아래처럼 컨테이너를 접속하여 해결해 줍니다.

일단은 일반적으로 exec 하면 su 하면 비밀번호를 물어보기 때문에 --user 를 꼭 지정하여 exec 하시길 바랍니다.

root@debian:~# docker exec -it --user root ubuntu-kasm bash
default:~$
default:~$ su
root@139ab3457d30:/home/kasm-user# passwd root
New password:
Retype new password:
passwd: password updated successfully

 

3. 웹 UI 기본 아이디 수정 및 비번 지정

물론 컨테이너 생성 시, VNC_PW 로 지정을 했습니다만, 아래의 파일을 수정하여 계정을 변경합니다.

우분투 시스템의 계정의 kasm-user 를 그대로 사용하기로 했습니다.

root@139ab3457d30:/home/kasm-user# cd ~
root@139ab3457d30:~# vi /dockerstartup/vnc_startup.sh

일단 비밀번호는 상단에서 수정이 가능합니다.

 10 # switch passwords to local variables
 11 tmpval=$VNC_VIEW_ONLY_PW
 12 unset VNC_VIEW_ONLY_PW
 13 VNC_VIEW_ONLY_PW="password486"
 14 tmpval=$VNC_PW
 15 unset VNC_PW
 16 VNC_PW="password486"
 17 BUILD_ARCH=$(uname -p)

VNC_VIEW_ONLY 도 비번이 필요함으로 수정합니다.

그리고 계정명은 kasm_user 로 검색하시면 몇가지가 나오는데요. 오디오서버와 파일 업다운 기능이 추가적으로 들어있으나 사용하지 않기 때문에 아래의 부분만 수정합니다.

212 VNC_PW_HASH=$(python3 -c "import crypt; print(crypt.crypt('${VNC_PW}', '\$5\$kasm\$'));")
213 VNC_VIEW_PW_HASH=$(python3 -c "import crypt; print(crypt.crypt('${VNC_VIEW_ONLY_PW}', '\$5\$ka    sm\$'));")
214 echo "kasm_user:${VNC_PW_HASH}:ow" > $PASSWD_PATH
215 echo "kasm_viewer:${VNC_VIEW_PW_HASH}:" >> $PASSWD_PATH
216 chmod 600 $PASSWD_PATH
217

위의 kasm_user / kasm_viewer 를 수정하시면 됩니다.

파이썬 스크립트로 hash 값을 구해 넣는 작업으로 보이네요.

 

4. 한글입력기 설정

일단은 한글 입력기로 uim / uim-byeoru 를 사용할 예정입니다.

이게 지금 systemd 가 돌아가는 환경이 아니기 때문에 약간 야매로 할 필요가 있습니다.

일단 패키지 설치합니다.

root@139ab3457d30:~# apt update && apt install uim uim-byeoru

그리고 kasm vnc UI 로 이동하여 터미널을 열어줍니다.

uim-pref-gtk 라고 입력하면 벼루 설정창이 열립니다.

벼루 입력기를  선택합니다.

그리고 글로발 키 바인딩 1로 이동합니다.

글로벌 ON / OFF 를 지웁니다.

지우는 것은 아래와 같이 하시면 됩니다.

그리고 벼루 키 바인딩 1로 이동하여 ON / OFF 를 지정해줍니다.

noVNC 의 경우 한글키가 정상적으로 먹기 때문에 한글로 설정이 가능합니다.

Apply 눌러주고 OK 누릅니다.

다음으로 로그인 시, 자동실행할 수 있도록 bashrc 에 아래와 같이 내용을 추가합니다.

default:~$ cat ~/.bashrc
source $STARTUPDIR/generate_container_user

export XIM=uim
export XMODIFIERS=@im=uim
export UIM_CANDWIN_PROG=uim-candwin-gtk
export GTK_IM_MODULE=uim
export QT_IM_MODULE=uim
#
if [ $SHLVL -eq 1 ]; then
        uim-xim &
fi

그리고 컨테이너를 한번 재시작합니다.

root@debian:~# docker restart ubuntu-kasm
ubuntu-kasm

그러면 아래와 같이 한글 입력이 가능합니다.

그리고 로케일은 영어로 그대로 두기로 했습니다.

우분투나 데비안 리눅스 특성 상, 구글 검색하려면 영어로 나오는게 편리합니다..

 

5. nginx 프록시

Nginx Proxy Manager 를 통해서 설정하면, 이상하게도 Basic Auth 창이 뜸에도 불구하고 아래의 로그가 남으면서 로그인이 안되는 경우가 있습니다.

 2022-10-24 12:15:29,896 [INFO] websocket 198: 172.17.0.1 192.168.0.1 - "GET / HTTP/1.1" 401 73
 2022-10-24 12:16:09,565 [INFO] websocket 199: got client connection from 172.17.0.1
 2022-10-24 12:16:09,570 [INFO] websocket 199: Authentication attempt failed, BasicAuth required, but client didn't send any

UI 설정으로는 되지 않는것 같습니다. 그래서 커스텀 설정을 아래와 같이 추가했습니다.

NPM도 docker 컨테이너 내부에 있음으로 통신을 하려면 172.17.0.1:6901 을 사용해야합니다.

location / {
    proxy_set_header Authorization $http_authorization;
    proxy_pass_header  Authorization;
    proxy_pass https://172.17.0.1:6901;
}

location /websockify {
    proxy_pass https://172.17.0.1:6901/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;
}

웹소켓이 있기 때문에 http version 1.1 / Upgrade 및 Connection 헤더가 설정되어야 합니다.

 

아래와 같이 정상적으로 도메인 연동 및 SSL 작동합니다.

 

 

감사합니다. 짧게 마치겠습니다.

반응형

댓글