Web版VSCodeでRedmineのWasmを試した話


My Redmine

前田 稔です。 Web版VSCodeがDockerコンテナをWASM環境で起動、Webブラウザ内ローカルマシンとして利用可能に。拡張機能「vscode-container-wasm」登場 - Publickey を読んでブラウザ内でRedmineを動かせそうと考えました。今回のブログはその検証結果をまとめることにしました。

期待と検証結果

Rest api - Redmine の動作検証がブラウザ上で完結できれば、Redmineの動作環境を準備する手間が省けると期待していました。

検証結果としてはコマンドラインでRedmineとの対話的操作ができました。Rest api - Redmine はWasm上のネットワークインターフェース設定方法について私の理解が浅く断念しました。

bin/rails console がWeb版VSCodeで動く様子
bin/rails console がWeb版VSCodeで動く様子

コンテナイメージをWasmに変換する

事前準備としてWeb版VSCodeの拡張機能「 ktock/vscode-container-wasm 」で使用するために、コンテナイメージをWasmに変換する必要があります(Option A を選択しました)。

Dockerfile

テストデータ投入済みのRedmine環境を準備します。

FROM ruby:3.2-alpine

ENV RAILS_ENV=production
ENV RUBY_YJIT_ENABLE=1

RUN mkdir -p /redmine
RUN wget -O - https://github.com/redmine/redmine/archive/refs/tags/5.1.1.tar.gz | tar xz  --strip-components=1 -C /redmine
WORKDIR /redmine

RUN echo "production:" > config/database.yml
RUN echo "  adapter: sqlite3" >> config/database.yml
RUN echo "  database: db/redmine.sqlite3" >> config/database.yml

RUN echo "gem 'puma'" > Gemfile.local
RUN echo "gem 'tzinfo-data'" >> Gemfile.local
RUN apk add --no-cache build-base sqlite sqlite-dev
RUN gem install sqlite3 -v 1.6.9 --platform=ruby
RUN bundle config set --local without 'development test'
RUN bundle install
RUN cp /usr/local/bundle/gems/sqlite3-1.6.9/lib/sqlite3/sqlite3_native.so \
       /usr/local/bundle/gems/sqlite3-1.6.9-x86_64-linux/lib/sqlite3/3.2/
RUN bin/rails db:create db:migrate
RUN bin/rails generate_secret_token
RUN bin/rails db:fixtures:load

RUN apk add --no-cache curl jq
RUN bin/rails runner 'Setting.rest_api_enabled=1'

EXPOSE 3000

CMD ["/bin/sh"]

container2wasm

ktock/container2wasm: Container to WASM converter でコンテナイメージをWasmに変換します。次のコマンドはDebian GNU/Linux 12上で実行しています。

# cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# which c2w
/usr/local/bin/c2w

# which wasmtime
/usr/local/bin/wasmtime

次のコマンドで1GB割り当て済みのRedmineのWasmに変換します。

# docker build -t wasm-redmine .
# c2w --build-arg VM_MEMORY_SIZE_MB=1024 wasm-redmine out.wasm

念のため wasmtime を使って実行します。

# wasmtime out.wasm free -m
               total        used        free      shared  buff/cache   available
Mem:             993          26         963           0          17         966
Swap:              0           0           0

Web版VSCodeからWasmファイルにHTTP(S)でアクセスするためインターネット上にアップロードします。今回はアップロード先のファイルサイズ制限を回避するためファイルを分割します。

# split -b 24M --additional-suffix=.wasm -d out.wasm redmine-

上のコマンドで分割した redmine-00.wasm 〜 redmine-22.wasm をインターネット上にアップロードします。

Web版VSCode

github.dev または vscode.dev でWeb版VSCodeにアクセスします。URLには ?vscode-coi=on をつける必要があります。

拡張機能のインストールと設定

Web版VSCodeの拡張機能「 ktock/vscode-container-wasm 」をインストールした後は Option A 用の設定( .vscode/settings.json )を追加します。

次の設定例は redmine-00.wasmredmine-22.wasm を使用する設定例です(あくまでも設定例ですのでコンテナイメージは各自でご準備ください)。

{
  "container.imageLocation": "https://example.com/images/redmine-",
  "container.imageChunks": 23,
  "container.networkingMode": "fetch"
}

コンテナイメージの起動

いよいよWasmに変換したコンテナイメージの起動です。コマンドパレットで > Run Container On Browser を選択してしばらく待ちます。

コマンドパレットでコンテナイメージを実行する様子
コマンドパレットでコンテナイメージを実行する様子

"container.networkingMode": "fetch" を設定することでコンテナイメージ内の通信は c2w-net-proxy を通じてFetch API経由でブラウザ外と通信します。

ネットワークインターフェース設定
ネットワークインターフェース設定

私の理解としてはループバックインターフェースを設定すれば Rest api - Redmine の動作検証がブラウザで完結できるのでは?と考えていましたが、Wasm関連の知識不足のためブログ公開までに検証が間に合いませんでした。今後の課題とします。

おわりに

今回のブログではWeb版VSCodeでRedmineのWasmを試したところ、Redmineとの対話的操作ができました。従来のターミナル操作と同様に入力補完も機能しました。

入力補完の様子
入力補完の様子

今後の課題とした点については引き続き情報収集と検証をしていきます。次回のブログをお楽しみに。

【スタッフ募集中】
弊社ではAWSを活用したソリューションの企画・設計・構築・運用や、Ruby on Rails・JavaScriptフレームワークなどを使用したアプリケーション開発を行うスタッフを募集しています。採用情報の詳細
弊社での勤務に関心をお持ちの方は、知り合いの弊社社員・関係者を通じてご連絡ください。

My Redmine

こちらの記事もオススメです!
テキストでダイアグラム・チャートを書く D2を試してみる
テキストでダイアグラムやチャートを書くことができるスクリプト言語「D2」の嬉しいポイントを5つ紹介。
Freeeのファイルボックス機能を使って帳票を管理しています
2024年1月から電子帳簿保存法が完全義務化されました。仕訳ごとにファイルを添付して保管しています。
PicoRubyを使ってかにロボを制作し「第1回 Matz葉がにロボコン」に出場しました
「第1回 Matz葉がにロボコン」オープン部門に出場。プログラムをRubyで開発し、PicoRubyで動かしました。
旅行の移動をスムーズに!Googleマップと交通系ICカードの利用
Googleマップで目的地を保存し、移動中に検索する手間を省く方法を紹介します。
Rails Girls Matsue 5thのオーガナイザーをやりました
さまざまな課題を乗り越えて、無事イベントを開催。今回のイベントを通して、イベント運営の大変さを知りました。
ファーエンドテクノロジーからのお知らせ(2024/04/24更新)
入門Redmine 第6版 出版記念企画セミナー「Redmineのアクセス制御」【2024/5/30開催】
入門Redmine 第6版(2024年3月23日発売)の書籍から「Redmineのアクセス制御」について解説します。
My Redmine 初回ご契約で「入門Redmine 第6版」プレゼントのお知らせ
Redmineのクラウドサービス「My Redmine」を初めてご契約いただいたお客様にRedmine解説書「入門Redmine 第6版」を進呈いたします。
2024年度ブランドパートナーに島根県在住のモデル ユイさんを継続起用
ユイさん(モデルスタジオミューズ所属)をファーエンドテクノロジーの2024年度ブランドパートナーとして継続して起用します。
My Redmine スタンダードプランおよびAdminサポートデスクプランの料金改定のお知らせ【2024年4月ご利用分より】
2024年4月ご利用分より、My Redmine スタンダードプラン(民間企業・個人向け及び官公庁向け)とAdminサポートデスクプランの料金を改定いたします。
Redmineの最新情報をメールでお知らせする「Redmine News」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け