ubuntu xfce novnc docker (kasm image 사용) 구축하기
안녕하세요? 도정진입니다.
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://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 작동합니다.
감사합니다. 짧게 마치겠습니다.