linuxserver/docker-webtop を使って VPS 上でブラウザーを開きっぱなしにする環境ができたので、そのメモです。
やりたかったこと
VPS 上でブラウザーを動かして、Cookie Clicker のように開きっぱなしにして放置しておくと良いものに使いたい、と思っていました。
失敗案
libvirt
で VNC を有効にして WireGuard 経由で接続するという案もあって、 環境構築はうまくいったのですが、 ConoHa VPS の環境で KVM が有効にできなくて遅すぎて実用になりませんでした。
方法としては virsh edit
で <video>
の上に以下のように追記するか、 virt-xml $name --add-device --graphics "vnc,port=5900,listen=$(ip -br addr show dev wg0 | awk '{sub("/.*","");print $3}'),keymap=ja,passwd=1234"
のように virt-xml
で追加すればうまくいきました。
<graphics type='vnc' port='5900' autoport='no' listen='2001:db8:a987:6543::c0' keymap='ja' passwd='1234'>
<listen type='address' address='2001:db8:a987:6543::c0'/>
</graphics>
変更しなくても動くかもしれませんが、なんとなく遅そうな気がしたので、 <model type='cirrus' vram='16384' heads='1' primary='yes'/>
は適当に <model type='virtio' vram='65536' heads='1' primary='yes'/>
に変更しました。 qxl
は指定する属性が違っているようで単純な置き換えは難しそうだったので、 virtio
を試しました。
前述のように KVM が使えなくて遅すぎたので、この変更の影響がどのくらいあったのかはわかりませんでした。
webtop とは?
GUIと日本語環境が使えるお手軽Docker環境の使い方 で GUI 環境を Docker で簡単に使う方法として紹介されていました。
linuxserver/docker-webtop: Ubuntu, Alpine, Arch, and Fedora based Webtop images, Linux in a web browser supporting popular desktop environments. を見るとわかるように、いくつかのディストリビューションとデスクトップ環境が用意されています。
その中で KasmVNC のサーバーも一緒に動いていて、それをブラウザーで開いてリモートから使える、という仕組みになっているようです。
検索するときに webtop だけだと他のものもひっかかるので、「docker webtop」や「linuxserver webtop」で検索すると良さそうです。
最終的な compose.yaml の例
最終的にはこのような compose.yaml
で動かしています。 初回起動の処理は時間がかかるのと、失敗することがあるようなので、接続してみてうまく初期設定されていないようなら、 ./data
も含めて消して作りなおすのが良さそうです。
---
services:
webtop:
image: lscr.io/linuxserver/webtop:ubuntu-kde
container_name: webtop
security_opt:
- seccomp:unconfined #optional
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Tokyo
- SUBFOLDER=/ #optional
- TITLE=Webtop #optional
- DOCKER_MODS=linuxserver/mods:universal-package-install
- INSTALL_PACKAGES=etckeeper|fonts-takao|bash-completion
- LC_ALL=ja_JP.UTF-8
volumes:
- ./data:/config
- /var/run/docker.sock:/var/run/docker.sock #optional
ports:
- "[2001:db8:a987:6543::c0]:3000:3000"
# - 3001:3001
# devices:
# - /dev/dri:/dev/dri #optional
shm_size: "1gb" #optional
restart: unless-stopped
日本語化
参考にしたサイトでは Dockerfile で apt-get
を使ってインストールしていましたが、 DOCKER_MODS=linuxserver/mods:universal-package-install
という公式の方法でインストールできました。 INSTALL_PACKAGES
の指定は |
区切りで複数パッケージのインストールができました。
公式サイトの例にある latest は alpine なので font-noto-cjk
ですが、 Debian や Ubuntu だと fonts-noto-cjk
と fonts
の s
がつくので、 image:
だけ変えても ubuntu だとフォントがインストールされなくて、 しばらく悩んでいました。
---
services:
webtop:
image: lscr.io/linuxserver/webtop:latest
container_name: webtop
security_opt:
- seccomp:unconfined #optional
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Tokyo
- SUBFOLDER=/ #optional
- TITLE=Webtop #optional
- DOCKER_MODS=linuxserver/mods:universal-package-install
- INSTALL_PACKAGES=font-noto-cjk|font-ipa
- LC_ALL=ja_JP.UTF-8
volumes:
- ./data:/config
- /var/run/docker.sock:/var/run/docker.sock #optional
ports:
- "[2001:db8:a987:6543::c0]:3000:3000"
# - 3001:3001
# devices:
# - /dev/dri:/dev/dri #optional
shm_size: "1gb" #optional
restart: unless-stopped
volumes
volumes で共有している ./data
にホームディレクトリの内容があるので、適当にホスト側との共有に使えそうです。
ports
例のまま 3000:3000
だけで起動してしまうと VPS の外からも丸見えになってしまったので、 WireGuard で使っている IPv6 アドレスに制限しています。
ブラウザーで開くのは open -na "Google Chrome" --args --user-data-dir="$HOME/tmp/chrome-user-data" --window-size=1280,1024 'http://[2001:db8:a987:6543::c0]:3000'
のように普段のブラウザーとは分離しています。
再接続でリサイズすると落ちることがあったので、念のためにサイズも固定しています。
3001
の https
接続の方はまだ試していません。
KasmVNC での操作
左にメニューが隠れていて、それを開いてクリップボードの操作などができました。
メニューを開いているときに上にスピーカーの共有などのスイッチもあったので、 それをオンにしてリモートで YouTube などで音声を再生すると、ちゃんと聞こえました。
ブラウザーを閉じる前にメニューから切断をしておくと、今のところ再接続で落ちていません。
仕組みをちょっと深堀り
複数ディストリビューション共通で systemd ではなく s6 を使っているようでした。
例にあった DOCKER_MODS
の指定は linuxserver/docker-mods が関係しているようで、 linuxserver/mods:universal-package-install
は universal-package-install ブランチ にありました。
INSTALL_PIP_PACKAGES
にも対応しているようなので、 それでインストールできる環境の構築は compose.yaml
だけで完結できそうです。
他の DOCKER_MODS
も linuxserver/docker-mods などから探すと便利そうです。
DOCKER_MODS
の複数指定は INSTALL_PACKAGES
と同じように |
区切りのようです。
まとめ
docker-webtop
でリモートでのブラウザーの開きっぱなしが実現できました。
Webtop 2.0 - The year of the Linux desktop によると docker-vscodium などの他のアプリ用のイメージも用意されているようなので、 用途にあうものがあれば簡単に使えそうです。