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

日本語化

参考にしたサイトでは Dockerfileapt-get を使ってインストールしていましたが、 DOCKER_MODS=linuxserver/mods:universal-package-install という公式の方法でインストールできました。 INSTALL_PACKAGES の指定は | 区切りで複数パッケージのインストールができました。

公式サイトの例にある latest は alpine なので font-noto-cjk ですが、 Debian や Ubuntu だと fonts-noto-cjkfontss がつくので、 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' のように普段のブラウザーとは分離しています。

再接続でリサイズすると落ちることがあったので、念のためにサイズも固定しています。

3001https 接続の方はまだ試していません。

KasmVNC での操作

左にメニューが隠れていて、それを開いてクリップボードの操作などができました。

メニューを開いているときに上にスピーカーの共有などのスイッチもあったので、 それをオンにしてリモートで YouTube などで音声を再生すると、ちゃんと聞こえました。

ブラウザーを閉じる前にメニューから切断をしておくと、今のところ再接続で落ちていません。

仕組みをちょっと深堀り

複数ディストリビューション共通で systemd ではなく s6 を使っているようでした。

例にあった DOCKER_MODS の指定は linuxserver/docker-mods が関係しているようで、 linuxserver/mods:universal-package-installuniversal-package-install ブランチ にありました。

INSTALL_PIP_PACKAGES にも対応しているようなので、 それでインストールできる環境の構築は compose.yaml だけで完結できそうです。

他の DOCKER_MODSlinuxserver/docker-mods などから探すと便利そうです。

DOCKER_MODS の複数指定は INSTALL_PACKAGES と同じように | 区切りのようです。

まとめ

docker-webtop でリモートでのブラウザーの開きっぱなしが実現できました。

Webtop 2.0 - The year of the Linux desktop によると docker-vscodium などの他のアプリ用のイメージも用意されているようなので、 用途にあうものがあれば簡単に使えそうです。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published