서버/리눅스 서버

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

ㅋㅋ잠자 2022. 10. 24. 19:20
반응형

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

 

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 작동합니다.

 

 

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

반응형