Debian10でDockerとCaddyを使用してGUIアプリケーションにリモートアクセスする方法
著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。
序章
クラウドサービスの人気が高まっているにもかかわらず、ネイティブアプリケーションを実行する必要性は依然として存在します。
noVNCおよびTigerVNCを使用すると、 Docker コンテナー内でネイティブアプリケーションを実行し、Webブラウザーを使用してそれらにリモートでアクセスできます。 さらに、ローカルで利用できるよりも多くのシステムリソースを備えたサーバーでアプリケーションを実行できるため、大規模なアプリケーションを実行する際の柔軟性が向上します。
このチュートリアルでは、Dockerを使用して、メールクライアントである MozillaThunderbirdをコンテナ化します。 その後、セキュリティで保護し、 CaddyWebサーバーを使用してリモートアクセスを提供します。
終了すると、Webブラウザだけを使用して任意のデバイスからThunderbirdにアクセスできるようになります。 オプションで、WebDAVを使用してそこからファイルにローカルにアクセスすることもできます。 また、どこでも実行できる完全に自己完結型のDockerイメージがあります。
前提条件
このガイドを開始する前に、次のものが必要です。
- 少なくとも2GBのRAMと4GBのディスクスペースを備えた1台のDebian10サーバー。
sudo
権限を持つroot以外のユーザー。- サーバーにDockerがセットアップされました。 Debian10にDockerをインストールして使用する方法に従うことができます。
ステップ1—supervisord
構成を作成する
サーバーが実行され、Dockerがインストールされたので、アプリケーションのコンテナーの構成を開始する準備が整いました。 コンテナは複数のコンポーネントで構成されているため、プロセスマネージャを使用してそれらを起動および監視する必要があります。 ここでは、supervisordを使用します。 supervisord
は、Pythonで記述されたプロセスマネージャーであり、複雑なコンテナーを調整するためによく使用されます。
まず、コンテナ用にthunderbird
というディレクトリを作成して入力します。
- mkdir ~/thunderbird
- cd ~/thunderbird
次に、nano
またはお好みのエディターを使用して、supervisord.conf
というファイルを作成して開きます。
- nano ~/thunderbird/supervisord.conf
次に、この最初のコードブロックをsupervisord.conf
に追加します。これにより、supervisordのグローバルオプションが定義されます。
[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid
logfile=/dev/fd/1
logfile_maxbytes=0
このブロックでは、supervisord
自体を構成しています。 nodaemon
をtrue
に設定する必要があります。これは、Dockerコンテナー内でエントリポイントとして実行されるためです。 したがって、フォアグラウンドで実行し続ける必要があります。 また、pidfile
をroot以外のユーザーがアクセスできるパスに設定し(これについては後で詳しく説明します)、logfile
をstdoutに設定して、ログを表示できるようにします。
次に、supervisord.conf
に別の小さなコードブロックを追加します。 このブロックは、VNC/X11サーバーを組み合わせたTigerVNCを起動します。
...
[program:x11]
priority=0
command=/usr/bin/Xtigervnc -desktop "Thunderbird" -localhost -rfbport 5900 -SecurityTypes None -AlwaysShared -AcceptKeyEvents -AcceptPointerEvents -AcceptSetDesktopSize -SendCutText -AcceptCutText :0
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
このブロックでは、X11サーバーをセットアップしています。 X11 は、GUIアプリケーションの実行を可能にするディスプレイサーバープロトコルです。 将来的にはWaylandに置き換えられる予定ですが、リモートアクセスはまだ開発中です。
このコンテナーには、TigerVNCとその組み込みのVNCサーバーを使用しています。 これには、個別のX11サーバーとVNCサーバーを使用するよりも多くの利点があります。
- GUI描画は、中間フレームバッファ(画面のコンテンツを格納するメモリ)に対して行われるのではなく、VNCサーバーに対して直接行われるため、応答時間が短縮されます。
- 画面の自動サイズ変更。これにより、リモートアプリケーションは、クライアント(この場合はWebブラウザーウィンドウ)に合わせて自動的にサイズ変更できます。
必要に応じて、-desktop
オプションの引数をThunderbird
から任意の引数に変更できます。 サーバーは、アプリケーションへのアクセスに使用されるWebページのタイトルとして選択内容を表示します。
次に、supervisord.conf
に3番目のコードブロックを追加して、easy-novnc
を開始します。
...
[program:easy-novnc]
priority=0
command=/usr/local/bin/easy-novnc --addr :8080 --host localhost --port 5900 --no-url-password --novnc-params "resize=remote"
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
このブロックでは、 easy-novnc をセットアップします。これは、noVNCのラッパーを提供するスタンドアロンサーバーです。 このサーバーは2つの役割を果たします。 まず、接続のオプションを構成したり、デフォルトのオプションを設定したりできる簡単な接続ページを提供します。 次に、 WebSocket を介してVNCをプロキシします。これにより、通常のWebブラウザーからアクセスできるようになります。
通常、サイズ変更はクライアント側で行われます(つまり 画像スケーリング)、ただし、resize=remote
オプションを使用して、TigerVNCのリモート解像度調整を最大限に活用しています。 これにより、ローエンドのChromebookなどの低速デバイスでのレイテンシも低くなります。
注:このチュートリアルではeasy-novnc
を使用します。 必要に応じて、代わりにwebsockify
と別のWebサーバーを使用できます。 easy-novnc
の利点は、メモリ使用量と起動時間が大幅に短縮され、自己完結型であるということです。 easy-novnc
は、デフォルトのnoVNCページよりもクリーンな接続ページを提供し、このセットアップに役立つデフォルトオプション(resize=remote
など)を設定できます。
次に、次のブロックを構成に追加して、ウィンドウマネージャーであるOpenBoxを起動します。
...
[program:openbox]
priority=1
command=/usr/bin/openbox
environment=DISPLAY=:0
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
このブロックでは、軽量のX11ウィンドウマネージャーであるOpenBoxをセットアップしています。 この手順をスキップすることもできますが、この手順がないと、タイトルバーがないか、ウィンドウのサイズを変更できません。
最後に、最後のブロックをsupervisord.conf
に追加して、メインアプリケーションを起動します。
...
[program:app]
priority=1
environment=DISPLAY=:0
command=/usr/bin/thunderbird
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
この最後のブロックでは、priority
を1
に設定して、Thunderbirdが TigerVNCの後にを起動するようにします。そうしないと、競合状態が発生し、ランダムに起動できなくなります。 また、autorestart=true
を設定して、誤って閉じた場合にアプリケーションを自動的に再度開きます。 DISPLAY
環境変数は、前にセットアップしたVNCサーバーに表示するようにアプリケーションに指示します。
完成したsupervisord.conf
は次のようになります。
[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid
logfile=/dev/fd/1
logfile_maxbytes=0
[program:x11]
priority=0
command=/usr/bin/Xtigervnc -desktop "Thunderbird" -localhost -rfbport 5900 -SecurityTypes None -AlwaysShared -AcceptKeyEvents -AcceptPointerEvents -AcceptSetDesktopSize -SendCutText -AcceptCutText :0
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
[program:easy-novnc]
priority=0
command=/usr/local/bin/easy-novnc --addr :8080 --host localhost --port 5900 --no-url-password --novnc-params "resize=remote"
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
[program:openbox]
priority=1
command=/usr/bin/openbox
environment=DISPLAY=:0
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
[program:app]
priority=1
environment=DISPLAY=:0
command=/usr/bin/thunderbird
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
別のアプリケーションをコンテナ化する場合は、/usr/bin/thunderbird
をアプリケーションの実行可能ファイルへのパスに置き換えます。 それ以外の場合は、GUIのメインメニューを構成する準備ができています。
ステップ2—OpenBoxメニューの設定
プロセスマネージャが設定されたので、OpenBoxメニューを設定しましょう。 このメニューを使用すると、コンテナ内でアプリケーションを起動できます。 必要に応じて、デバッグ用の端末とプロセスモニターも含まれます。
アプリケーションのディレクトリ内で、nano
またはお気に入りのテキストエディタを使用して、menu.xml
という名前の新しいファイルを作成して開きます。
- nano ~/thunderbird/menu.xml
次に、次のコードをmenu.xml
に追加します。
<?xml version="1.0" encoding="utf-8"?>
<openbox_menu xmlns="http://openbox.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://openbox.org/ file:///usr/share/openbox/menu.xsd">
<menu id="root-menu" label="Openbox 3">
<item label="Thunderbird">
<action name="Execute">
<execute>/usr/bin/thunderbird</execute>
</action>
</item>
<item label="Terminal">
<action name="Execute">
<execute>/usr/bin/x-terminal-emulator</execute>
</action>
</item>
<item label="Htop">
<action name="Execute">
<execute>/usr/bin/x-terminal-emulator -e htop</execute>
</action>
</item>
</menu>
</openbox_menu>
このXMLファイルには、デスクトップを右クリックしたときに表示されるメニュー項目が含まれています。 各アイテムは、ラベルとアクションで構成されています。
別のアプリケーションをコンテナ化する場合は、/usr/bin/thunderbird
をアプリケーションの実行可能ファイルへのパスに置き換え、アイテムのlabel
を変更します。
ステップ3—Dockerfileを作成する
OpenBoxが構成されたので、すべてを結び付けるDockerfileを作成します。
コンテナのディレクトリにDockerfileを作成します。
- nano ~/thunderbird/Dockerfile
まず、easy-novnc
をビルドするためのコードを追加しましょう。
FROM golang:1.14-buster AS easy-novnc-build
WORKDIR /src
RUN go mod init build && \
go get github.com/geek1011/[email protected] && \
go build -o /bin/easy-novnc github.com/geek1011/easy-novnc
最初の段階では、easy-novnc
を構築しています。 これは、単純化とスペースの節約のために別の段階で行われます。最終的な画像にGoツールチェーン全体を含める必要はありません。 ビルドコマンドの@v1.1.0
に注意してください。 これにより、結果が決定論的であることが保証されます。これは、Dockerが各ステップの結果をキャッシュするため重要です。 明示的なバージョンを指定しなかった場合、Dockerはイメージが最初にビルドされたときのeasy-novnc
の最新バージョンを参照します。 さらに、CLIインターフェイスに重大な変更が加えられた場合に備えて、特定のバージョンのeasy-novnc
をダウンロードする必要があります。
次に、最終的なイメージになる2番目のステージを作成しましょう。 ここでは、ベースイメージとしてDebian 10(バスター)を使用します。 これはコンテナで実行されているため、サーバーで実行しているディストリビューションに関係なく機能することに注意してください。
次に、Dockerfile
に次のブロックを追加します。
...
FROM debian:buster
RUN apt-get update -y && \
apt-get install -y --no-install-recommends openbox tigervnc-standalone-server supervisor gosu && \
rm -rf /var/lib/apt/lists && \
mkdir -p /usr/share/desktop-directories
この手順では、Debian 10をベースイメージとしてインストールしてから、コンテナでGUIアプリケーションを実行するために最低限必要なものをインストールします。 Dockerからのキャッシュの問題を防ぐために、同じ命令の一部としてapt-get update
を実行することに注意してください。 スペースを節約するために、後でダウンロードしたパッケージリストも削除します(キャッシュされたパッケージ自体はデフォルトで削除されます)。 一部のアプリケーションは既存のディレクトリに依存しているため、/usr/share/desktop-directories
も作成しています。
別の小さなコードブロックを追加しましょう:
...
RUN apt-get update -y && \
apt-get install -y --no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip && \
rm -rf /var/lib/apt/lists
この手順では、いくつかの便利な汎用ユーティリティとパッケージをインストールします。 ここで特に興味深いのは、xdg-utils
(Linux上のデスクトップアプリケーションで使用される基本コマンドを提供する)とca-certificates
(HTTPSサイトにアクセスできるようにするルート証明書をインストールする)です。
これで、メインアプリケーションの手順を追加できます。
...
RUN apt-get update -y && \
apt-get install -y --no-install-recommends thunderbird && \
rm -rf /var/lib/apt/lists
以前と同様に、ここではアプリケーションをインストールしています。 別のアプリケーションをコンテナ化する場合は、これらのコマンドを特定のアプリのインストールに必要なコマンドに置き換えることができます。 一部のアプリケーションは、Docker内で実行するためにもう少し作業が必要になります。 たとえば、Chrome、Chromium、またはQtWebEngineを使用するアプリをインストールする場合、Docker内ではサポートされないため、コマンドライン引数--no-sandbox
を使用する必要があります。
次に、最後のいくつかのファイルをコンテナに追加するための手順の追加を開始しましょう。
...
COPY /bin/easy-novnc /usr/local/bin/
COPY menu.xml /etc/xdg/openbox/
COPY supervisord.conf /etc/
EXPOSE 8080
ここでは、前に作成した構成ファイルをイメージに追加し、最初のステージからeasy-novnc
バイナリをコピーしています。
この次のコードブロックは、データディレクトリを作成し、アプリの専用ユーザーを追加します。 一部のアプリケーションはrootとしての実行を拒否するため、これは重要です。 コンテナ内であっても、rootとしてアプリケーションを実行しないこともお勧めします。
...
RUN groupadd --gid 1000 app && \
useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && \
mkdir -p /data
VOLUME /data
ファイルの一貫したUID/GID
を確保するには、両方を1000
に明示的に設定します。 また、データディレクトリにボリュームをマウントして、再起動してもボリュームが持続するようにします。
最後に、すべてを起動するための手順を追加しましょう。
...
CMD ["sh", "-c", "chown app:app /data /dev/stdout && exec gosu app supervisord"]
デフォルトのコマンドをsupervisord
に設定すると、マネージャーはアプリケーションの実行に必要なプロセスを起動します。 この場合、ENTRYPOINT
ではなくCMD
を使用しています。 ほとんどの場合、違いはありませんが、いくつかの理由から、CMD
を使用する方がこの目的に適しています。 まず、supervisord
は、私たちに関連する引数を取りません。コンテナーに引数を指定すると、CMD
が置き換えられ、ENTRYPOINT
に追加されます。 次に、CMD
を使用すると、コンテナーに引数を渡すときにまったく異なるコマンド(/bin/sh -c
によって実行される)を提供できるため、デバッグが容易になります。
最後に、supervisord
を開始する前に、ルートとしてchown
を実行して、データボリュームでのアクセス許可の問題を防ぎ、子プロセスがstdout
を開くことができるようにする必要があります。 これは、ユーザーを切り替えるためにUSER
命令の代わりにgosu
を使用する必要があることも意味します。
完成したDockerfile
は次のようになります。
FROM golang:1.14-buster AS easy-novnc-build
WORKDIR /src
RUN go mod init build && \
go get github.com/geek1011/[email protected] && \
go build -o /bin/easy-novnc github.com/geek1011/easy-novnc
FROM debian:buster
RUN apt-get update -y && \
apt-get install -y --no-install-recommends openbox tigervnc-standalone-server supervisor gosu && \
rm -rf /var/lib/apt/lists && \
mkdir -p /usr/share/desktop-directories
RUN apt-get update -y && \
apt-get install -y --no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip && \
rm -rf /var/lib/apt/lists
RUN apt-get update -y && \
apt-get install -y --no-install-recommends thunderbird && \
rm -rf /var/lib/apt/lists
COPY /bin/easy-novnc /usr/local/bin/
COPY menu.xml /etc/xdg/openbox/
COPY supervisord.conf /etc/
EXPOSE 8080
RUN groupadd --gid 1000 app && \
useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && \
mkdir -p /data
VOLUME /data
CMD ["sh", "-c", "chown app:app /data /dev/stdout && exec gosu app supervisord"]
Dockerfile
を保存して閉じます。 これで、コンテナをビルドして実行し、GUIアプリケーションであるThunderbirdにアクセスする準備が整いました。
ステップ4—コンテナの構築と実行
次のステップは、コンテナをビルドし、起動時に実行するように設定することです。 また、再起動と更新の間でアプリケーションデータを保持するボリュームを設定します。
まず、コンテナを作成します。 ~/thunderbird
ディレクトリで次のコマンドを実行してください。
- docker build -t thunderbird .
次に、アプリのコンテナー間で共有される新しいネットワークを作成します。
- docker network create thunderbird-net
次に、アプリケーションデータを保存するボリュームを作成します。
- docker volume create thunderbird-data
最後に、それを実行し、自動的に再起動するように設定します。
- docker run --detach --restart=always --volume=thunderbird-data:/data --net=thunderbird-net --name=thunderbird-app thunderbird
必要に応じて、--name
オプションの後のthunderbird-app
を別の名前に置き換えることができます。 選択したものが何であれ、アプリケーションはコンテナ化されて実行されます。 それでは、Caddy Webサーバーを使用してサーバーを保護し、リモートで接続してみましょう。
ステップ5—キャディをセットアップする
このステップでは、認証と、オプションでWebDAVを介したリモートファイルアクセスを提供するようにCaddyWebサーバーを設定します。 簡単にするため、また既存のリバースプロキシで使用できるようにするために、別のコンテナで実行します。
新しいディレクトリを作成し、その中に移動します。
- mkdir ~/caddy
- cd ~/caddy
次に、nano
またはお好みのエディターを使用して、新しいDockerfile
を作成します。
- nano ~/caddy/Dockerfile
次に、次のディレクティブを追加します。
FROM golang:1.14-buster AS caddy-build
WORKDIR /src
RUN echo 'module caddy' > go.mod && \
echo 'require github.com/caddyserver/caddy/v2 v2.1.1' >> go.mod && \
echo 'require github.com/mholt/caddy-webdav v0.0.0-20200523051447-bc5d19941ac3' >> go.mod
RUN echo 'package main' > caddy.go && \
echo 'import caddycmd "github.com/caddyserver/caddy/v2/cmd"' >> caddy.go && \
echo 'import _ "github.com/caddyserver/caddy/v2/modules/standard"' >> caddy.go && \
echo 'import _ "github.com/mholt/caddy-webdav"' >> caddy.go && \
echo 'func main() { caddycmd.Main() }' >> caddy.go
RUN go build -o /bin/caddy .
FROM debian:buster
RUN apt-get update -y && \
apt-get install -y --no-install-recommends gosu && \
rm -rf /var/lib/apt/lists
COPY /bin/caddy /usr/local/bin/
COPY Caddyfile /etc/
EXPOSE 8080
RUN groupadd --gid 1000 app && \
useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && \
mkdir -p /data
VOLUME /data
WORKDIR /data
CMD ["sh", "-c", "chown app:app /data && exec gosu app /usr/local/bin/caddy run -adapter caddyfile -config /etc/Caddyfile"]
このDockerfileは、WebDAVプラグインを有効にしてCaddyをビルドし、ポート8080
でCaddyfile
を/etc/Caddyfile
で起動します。 ファイルを保存して閉じます。
次に、CaddyWebサーバーを構成します。 作成したディレクトリにCaddyfile
という名前のファイルを作成します。
- nano ~/caddy/Caddyfile
次に、次のコードブロックをCaddyfile
に追加します。
{
order webdav last
}
:8080 {
log
root * /data
reverse_proxy thunderbird-app:8080
handle_path /files/* {
file_server browse
}
redir /files /files/
handle /webdav/* {
webdav {
prefix /webdav
}
}
redir /webdav /webdav/
basicauth /* {
{env.APP_USERNAME} {env.APP_PASSWORD_HASH}
}
}
このCaddyfile
は、ルートディレクトリを手順4で作成したthunderbird-app
コンテナにプロキシします(Dockerはそれを正しいIPに解決します)。 また、/files
で読み取り専用のWebベースのファイルブラウザを提供し、/webdav
でWebDAVサーバーを実行して、ファイルにアクセスするためにローカルにマウントできます。 ユーザー名とパスワードは、環境変数APP_USERNAME
およびAPP_PASSWORD_HASH
から読み取られます。
次に、コンテナを作成します。
- docker build -t thunderbird-caddy .
Caddy v2では、希望するパスワードをハッシュする必要があります。 次のコマンドを実行し、mypass
を選択した強力なパスワードに置き換えることを忘れないでください。
- docker run --rm -it thunderbird-caddy caddy hash-password -plaintext 'mypass'
このコマンドは、文字列を出力します。 次のコマンドを実行する準備として、これをクリップボードにコピーします。
これで、コンテナを実行する準備が整いました。 必ずmyuser
を選択したユーザー名に置き換え、mypass-hash
を前の手順で実行したコマンドの出力に置き換えてください。 ポート(ここでは8080
)を変更して、別のポートでサーバーにアクセスすることもできます。
- docker run --detach --restart=always --volume=thunderbird-data:/data --net=thunderbird-net --name=thunderbird-web --env=APP_USERNAME="myuser" --env=APP_PASSWORD_HASH="mypass-hash" --publish=8080:8080 thunderbird-caddy
これで、アプリケーションにアクセスしてテストする準備が整いました。
ステップ6—アプリケーションのテストと管理
アプリケーションにアクセスして、機能していることを確認しましょう。
まず、Webブラウザでhttp://your_server_ip:8080
を開き、先ほど選択したクレデンシャルでログインし、接続をクリックします。
これで、アプリケーションを操作できるようになり、ブラウザウィンドウに合わせて自動的にサイズが変更されます。
黒いデスクトップを右クリックすると、端末にアクセスできるメニューが表示されます。 中クリックすると、ウィンドウのリストが表示されます。
次に、Webブラウザでhttp://your_server_ip:8080/files/
を開きます。 ファイルにアクセスできるはずです。
オプションで、WebDAVクライアントにhttp://your_server_ip:8080/webdav/
をマウントしてみることができます。 ファイルに直接アクセスして変更できるはずです。 Windowsエクスプローラーでマップネットワークドライブオプションを使用する場合は、リバースプロキシを使用してHTTPSを追加するか、HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters\BasicAuthLevel
をDWORD:2
に設定する必要があります。
いずれの場合も、ネイティブGUIアプリケーションをリモートで使用できるようになります。
結論
これで、Thunderbird用のDockerコンテナーが正常にセットアップされ、Caddyを使用して、Webブラウザーを介したコンテナーへのアクセスが構成されました。 アプリをアップグレードする必要がある場合は、コンテナーを停止し、docker rm thunderbird-app thunderbird-web
を実行し、イメージを再構築してから、上記の前の手順のdocker run
コマンドを再実行します。 データはボリュームに保存されるため、引き続き保持されます。
基本的なDockerコマンドについて詳しく知りたい場合は、このチュートリアルまたはこのチートシートをお読みください。 長期間使用する場合は、セキュリティを強化するためにHTTPS(これにはドメインが必要です)を有効にすることも検討してください。
さらに、複数のアプリケーションをデプロイする場合は、各コンテナーを手動で起動する代わりに、DockerComposeまたはKubernetesを使用することをお勧めします。 また、このチュートリアルは、サーバー上で次のような他のLinuxアプリケーションを実行するためのベースとして機能することを忘れないでください。
- Wine 、LinuxでWindowsアプリケーションを実行するための互換性レイヤー。
- GIMP 、オープンソースの画像エディタ。
- Cutter 、オープンソースのリバースエンジニアリングプラットフォーム。
この最後のオプションは、GUIアプリケーションをコンテナ化してリモートアクセスする大きな可能性を示しています。 この設定により、Cutterのようなリソースを大量に消費するツールを実行するために、ローカルで使用するよりもかなり多くの計算能力を備えたサーバーを使用できるようになります。