2021-05-24 更新: 至 guacamole-1.3.0,因為 Gentoo Linux 的 SSH 升級,guacamole-0.9.14 無法連接。
緣起
有些解決方案,一直都在,但等到某一天,心血來潮,在 Google 用各種關鍵字搜尋,才發現它的存在。
在外面,要連回辦公室的 private IP 的電腦的遠端桌面,真的是很麻煩的事。曾用過自己架的 VPN,但因為內網的設定,只能連上某些 IP 的機器。很多人使用 TeamViewer,但我的網路很快,要繞道 TeamViewer 的伺服器,用起來就變得卡卡的。
想要模仿 TeamViewer,自己架個機器當跳板。在 Google 努力的搜尋,然後,不小心就找到 Guacamole。繼續搜尋安裝和使用的方法,說明,看起來複雜又難理解,要安裝的東西,有 Java,Tomcat,資料庫,... 一堆東西,真是嚇人。
繼續搜尋使用 docker 的 solution,找到 docker-compose.yml。然後,幾分鐘後就看到結果了。先試其中一種作法,但有點不成功,資料庫不能存資料。再另外找其他作法 (guacamole-docker-compose),它裡面有 Nginx,我把這部分砍掉,用現有的 Apache 當反向代理。這個作法,後端是使用 pgsql。
跑起來後,網站的根目錄是 Tomcat 網頁,進入的連結是 http://localhost:32771/guacamole。
預設的 username 是 guacadmin,password 為 guacadmin。進入後,記得先把帳號和密碼改掉。嗯,感謝 docker,讓一切變得簡單了。
我用的 docker-compose.yml 如下。
version: '2.0'
# networks
# create a network 'guacnetwork_compose' in mode 'bridged'
networks:
guacnetwork_compose:
driver: bridge
# services
services:
# guacd
guacd:
container_name: guacamole-guacd
build:
context: ./
dockerfile: guacd.dockerfile
networks:
guacnetwork_compose:
restart: always
volumes:
- ../work/drive:/drive:rw
- ../work/record:/record:rw
# old guacd for connecting Windows Server 2003
guacd-0.9.14:
container_name: guacamole-guacd-0.9.14
image:
guacamole/guacd:0.9.14
networks:
guacnetwork_compose:
restart: always
volumes:
- ../work/drive-0.9.14:/drive:rw
- ../work/record-0.9.14:/record:rw
# postgres
postgres:
container_name: guacamole-pgsql
environment:
PGDATA: /var/lib/postgresql/data
POSTGRES_DB: guacamole_db
POSTGRES_PASSWORD: SetYourPasswordHere
POSTGRES_USER: guacamole_user
image: postgres:10.4
networks:
guacnetwork_compose:
restart: always
volumes:
- ../work/init_db:/docker-entrypoint-initdb.d:ro
- ../work/pg_data:/var/lib/postgresql/data:rw
# guacamole
guacamole:
container_name: guacamole-guacamole
depends_on:
- guacd
- guacd-0.9.14
- postgres
environment:
GUACD_HOSTNAME: guacd
POSTGRES_DATABASE: guacamole_db
POSTGRES_HOSTNAME: postgres
POSTGRES_PASSWORD: X8rNuCrtQfFzpMqrXxHLBXv3
POSTGRES_USER: guacamole_user
image: guacamole/guacamole:1.3.0
links:
- guacd
- guacd-0.9.14
networks:
guacnetwork_compose:
ports:
- 32771:8080/tcp
restart: always
使用的 image 要指定版本,不然在遷移系統時,可能下載的 image 版本不一樣,可能就跑不起來了。上面安裝兩個 guacd,要連舊版的 Windows Server 2003 時,將 Guacamole Proxy Parameters (guacd) 的 Hostname 設定為 guacd-0.9.14。
另外,為了在 SSH connection 中顯示中文字,在 guacd image 安裝中文字型, guacd.dockerfile 如下。新版的 guacamole/guacd:1.3.0 是用 Debian 的安裝指令。
FROM guacamole/guacd:1.3.0
# 安裝中文字型,可以在 SSH connection 中,顯示中文
# 必須要同時裝兩種字型
USER root
RUN apt-get update \
&& apt-get -y install fonts-noto-cjk fonts-noto-cjk-extra \
&& apt-get -y clean
舊的 guacamole/guacd:0.9.14 是用 CentOS 的安裝指令。因為只是要用舊版的 guacd 來連接 Windows Server 2003,所以不需要裝中文字型,下面的 dockerfile 留作參考。FROM guacamole/guacd:0.9.14
# 安裝中文字型,可以在 SSH connection 中,顯示中文
# 必須要同時裝兩種字型
RUN yum -y install google-noto-sans-cjk-fonts google-noto-cjk-fonts && \
yum clean all
在目錄的規劃,把 docker 的設定檔放在 docker 目錄下,volume 則放在 work 目錄下,不然因為執行權限,有些 volume 的目錄無法用個人身分讀取,必須用 root 的身份才能建立 image。執行 docker-compose build 就可以 build image 了。使用之前,要執行 prepare.sh,建立 init/initdb.sql,在第一次使用時,會檢查若尚未建立 db,用來 initialize db。prepare.sh 的內容如下
#!/bin/sh
#
echo "Preparing folder init and creating ./init/initdb.sql"
mkdir ./init >/dev/null 2>&1
chmod -R +x -- ./init
docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --postgres > ./init/initdb.sql
echo "done"
為了安裝中文,先進入 guacamole,好像是 Debian 系統。但根據 Guacamole ssh font 的討論,應該是在 guacd 加上字型。guacd 是 CentOS,透過指令 docker exec -it guacd_compose bash 進入 container# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
-- 列出可用的 Mono CJK 字型
# fc-list | grep 'Noto.*Mono.*CJK.*TC'
/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc: Noto Sans Mono CJK TC,Noto Sans Mono CJK TC Regular:style=Regular
/usr/share/fonts/google-noto-cjk/NotoSansCJK-Bold.ttc: Noto Sans Mono CJK TC,Noto Sans Mono CJK TC Bold:style=Bold,Regular