アーキテクチャー
CodeCanvas は、スケーラビリティと信頼性を重視し、Kubernetes クラスターへのデプロイ向けに設計されています。Amazon EKS、Azure AKS、Google GKE などの主要なクラウドプロバイダーへのインストールを想定しています。オンプレミスインフラストラクチャのサポートも予定されています。

クラスター
典型的な CodeCanvas インストールは、CodeCanvas アプリケーションクラスターと任意の数の開発環境クラスターで構成されます。CodeCanvas クラスターは CodeCanvas アプリケーションをホストし、オプションでリレーサーバーや移動サーバーなどのコアコンポーネントもホストします。開発環境クラスターはユーザーの開発環境をホストします(ワーカーについてはこちらを参照)。
パフォーマンスを最適化し、レイテンシを最小限に抑えるには、開発環境クラスターをエンドユーザーの近くにデプロイすることをお勧めします。たとえば、インストールには単一の CodeCanvas クラスターと、異なる地理的な場所に分散された複数の開発環境クラスターが含まれる場合があります。
コアコンポーネント
CodeCanvas アプリケーション
CodeCanvas アプリケーションは、システムの中核コンポーネントです。バックエンドとして機能し、CodeCanvas を操作するためのユーザーインターフェースを提供する Web アプリケーションです。
追加コンポーネント:
データベース – CodeCanvas アプリケーションでは、PostgreSQL データベースサーバーを使用して、アプリケーションの状態、開発環境の状態、ユーザー、グループ、サービスアカウント、名前空間、個人の秘密、その他のメタデータを保存します。
オブジェクトストレージ (S3 互換) – CodeCanvas は、開発環境のログ、監査ログ、その他のデータを格納するために S3 互換のオブジェクトストレージを使用します。このストレージは、CodeCanvas アプリケーションクラスターからアクセスできる必要があります。
ブロックストレージ – 開発環境では、永続ボリュームとしてクラウドブロックストレージ(AWS EBS、Azure Disk、Google Persistent Disk など)を使用します。開発環境の実行中は、コードとユーザーデータはこれらのボリュームに保存されます。開発環境が停止すると、ボリュームは切り離されますが、データは保持されます。再起動すると、ボリュームは再接続されます。ストレージライフサイクルの詳細
ボリュームをスナップショットに変換してオブジェクトストレージに保存することで、コスト効率を高めることもできます。詳細
JetBrains Gateway または JetBrains Toolbox – エンドユーザーマシン上で実行されるクライアントアプリケーション。ユーザーはこのアプリケーションを使用してリモート開発環境を作成し、それらに接続することができます。ユーザーは、Gateway または Toolbox によって起動された JetBrains Client を介して、開発環境内の IDE と対話します。
JetBrains Gateway(または Toolbox)が開発環境に接続すると、まずその環境で実行されている IDE のバージョンを識別します。次に、互換性を確保するために対応する JetBrains Client ビルドをダウンロードし、クライアントを起動して IDE への接続を確立します。
リレーサーバー
セキュリティ上の理由から、開発環境クラスタは通常、外部からのインバウンド接続を許可しません。ユーザーマシン上の IDE クライアントと開発環境間の通信を可能にするために、CodeCanvas はリレーサーバーを使用します。リレーサーバーは、ユーザーマシン上の JetBrains Gateway(または Toolbox)と開発環境の JetBrains IDE 間の WebSocket 接続を中継する中間コンポーネントです。
低レイテンシを実現するため、リレーサーバーは開発環境クラスタの近くに配置する必要があります。デフォルト構成では、リレーサーバーは CodeCanvas アプリケーションクラスタでホストされます。複数のリージョンに開発環境を配置している場合は、各リージョンにリレーサーバーを配置する必要があるかもしれません。たとえば、各開発環境クラスタにリレーサーバーを配置できます。詳細
移動サーバー
同様のセキュリティ上の理由から、開発環境への直接 SSH 接続もネットワーク上で制限される場合があります。ユーザーマシンからの SSH 接続を可能にするために、CodeCanvas は移動サーバーを使用します。
移動サーバーは、ユーザーマシンから開発環境への SSH 接続を中継するための仲介役として機能するコンポーネントです。例: SSH クライアントまたは VS Code/Cursor リモート SSH を使用して開発環境に接続します。
低レイテンシを実現するには、踏み台サーバーを開発環境クラスタの近くに配置する必要があります。デフォルト設定では、踏み台サーバーは CodeCanvas アプリケーションクラスタでホストされます。複数のリージョンに開発環境を配置している場合は、各リージョンに踏み台サーバーをデプロイする必要がある場合があります。たとえば、各開発環境クラスタに踏み台サーバーをデプロイできます。詳細
Kubernetes オペレーター
CodeCanvas Kubernetes オペレーターは開発環境クラスター内で実行され、ワーカーインスタンス(ユーザー開発環境を実行する Kubernetes pods)のライフサイクルを管理します。オペレーターは Kubernetes API と連携して、pods を作成、監視、削除します。
外部コンポーネント
Docker レジストリ
Docker レジストリは、CodeCanvas とそのサービスの実行に必要な Docker イメージを保存するサービスです。CodeCanvas はデフォルトで、JetBrains がホストするパブリック Docker レジストリ(英語)を使用します。また、必要なイメージをプライベートレジストリに公開することもできます。
JetBrains CDN
JetBrains CDN は以下をホストします:
JetBrains IDE バージョンの JSON 記述子 – CodeCanvas によって UI で使用可能な IDE タイプとバージョンを表示するために使用されます。
JetBrains IDE (ホストおよびクライアントディストリビューション) およびプラグインのバイナリファイル – 起動時に開発環境にダウンロードされます。
CodeCanvas アプリケーションクラスターと開発環境クラスターは CDN ドメインにアクセスできる必要があります。
JetBrains CDN を使用する代わりに、独自の HTTP 共有を使用して IDE ビルドとプラグインを取得するように CodeCanvas を構成できます。
ライセンスサーバー
ライセンスサーバーは、IDE ライセンスの有効性を検証する JetBrains サービス (https://account.jetbrains.com/) です。
これはオプションのコンポーネントです。CodeCanvas は、JetBrains IDE のライセンスをユーザーのマシンに提供する方法を制御しません。詳細
(オプション)SMTP サーバー
管理します。SMTP サーバーは、ユーザーにメール通知(ウォームアップ失敗、制限アラートなど)を送信し、招待やメール確認などのユーザー管理タスクにも使用します。
Git ホスティング
管理します。CodeCanvas は Git リポジトリをホストせず、ソースコードも保存しません。代わりに、GitHub、GitLab、BitBucket などの外部 Git ホスティングサービスへの接続をサポートします。新しい開発環境が作成されると、CodeCanvas は接続されたリポジトリを Git サーバーからその環境にクローンします。
(オプション)ユーザーディレクトリ
管理します。CodeCanvas はユーザーディレクトリと統合し、ユーザー認証と認可を提供します。サポートされるプロトコルには、OIDC、LDAP、AD、SAML 2.0 などがあります。
通信エンドポイント
CodeCanvas は、次のエンドポイントを介して外部サービスと通信します。
Docker レジストリ –
https://public.registry.jetbrains.space/IDE ビルドとプラグイン用の JetBrains CDN。これらの URL は、CodeCanvas アプリケーションクラスタ、開発環境(開発環境クラスタ)、ユーザーのローカルマシンからアクセスできる必要があります。
https://marketplace.jetbrains.com/(IDE プラグイン)https://download.jetbrains.com/https://download-cdn.jetbrains.com/https://code-with-me.jetbrains.comhttps://download-cf.jetbrains.comhttps://cache-redirector.jetbrains.comhttps://data.services.jetbrains.com/products
ライセンスサーバー –
https://account.jetbrains.com/
ワーカー
CodeCanvas のワーカーは、あらゆる開発環境やウォームアップ実行に不可欠なエージェントアプリケーションです。ワーカーは CodeCanvas のバックエンドに接続し、起動予定の開発環境の定義を取得し、その起動をブートストラップします。その後、ワーカーが開発環境の状態を監視し、CodeCanvas に報告します。開発環境のブートストラッププロセスには、以下のプロセスが含まれます。
開発コンテナーなどの必要な Docker コンテナーを起動する
ユーザーデータ用の永続ディスクの設定(ワーカーストレージを参照)
IDE などの再配布可能な部分をダウンロードします。
各開発環境は、単一の「ワーカー」コンテナーを備えた pod です。ワーカーアプリケーションはこのコンテナー内で実行され、Docker デーモンを使用してネストされたコンテナー(開発コンテナーと補助サイドカーコンテナー)を起動します。このモデルは Docker-in-Docker と呼ばれます。将来的には、このアーキテクチャにより、仮想マシン上で同様の方法で開発環境を実行できるようになる予定です。
ワーカーライフサイクル
ユーザーが開発環境またはウォームアップ実行を作成またはアクティブ化します。
CodeCanvas はそれぞれのタスクをキューに追加します。
CodeCanvas は、このタスクを実行するために、ワーカーを使用して Kubernetes pod をスケジュールします。
対象の Kubernetes クラスターに利用可能なリソースがある場合、ワーカーが起動し、CodeCanvas に接続して、キューからタスクを取得して実行します。
利用可能なリソースがない場合、リソースが解放されるか、クラスターにノードが追加されるまで、開発環境は「provisioning-resources」(保留中)状態のままになります。CodeCanvas は Kubernetes ノードのライフサイクルを管理しないことに注意してください。
開発環境が停止または削除されると、ワーカーはネストされたコンテナーを終了して終了します。その後、対応する Kubernetes pod も終了し、pods が以降のタスクや並列タスクに再利用されないようにします。
ワーカーストレージ

CodeCanvas は開発環境でユーザーデータのストレージを次のように管理します。
開発環境を作成する前に、CodeCanvas はユーザーデータの永続ボリューム要求 (PVC) を作成します。
Kubernetes は PVC を取得し、関連するクラウドブロックストレージ (Amazon EBS、Azure ディスク、Google Persistent Disk など) を使用して、PVC 用の永続ボリューム (PV) を作成します。
ボリュームはワーカー pod にマウントされ、開発環境で使用されます。
開発環境が停止すると、CodeCanvas はワーカー pod からボリュームをアンマウントします。
開発環境が再起動されると、CodeCanvas はボリュームを新しいワーカー pod にマウントします。
アーキテクチャ上の決定と要件
CodeCanvas のアーキテクチャは、デプロイ先のインフラストラクチャに特定の要件と制約を課します。これらのアーキテクチャ上の決定は、CodeCanvas のパフォーマンス、信頼性、セキュリティを確保するために行われます。以下では、これらの要件の根拠について説明します。
ダイナミックボリューム (CSI 経由)
コンテナーストレージインターフェース(CSI)は、Kubernetes が外部ストレージシステムの管理と操作に使用する標準化されたインターフェースです。CodeCanvas は、CSI を介した動的なボリュームプロビジョニングを使用して、開発環境に永続的なストレージを提供します。
ダイナミックボリュームを使用すると、開発環境の再起動後もユーザーデータを保持できます。開発環境が停止すると、ボリュームはワーカー pod から切り離されますが、ボリューム上のデータはクラウドブロックストレージにそのまま残ります。開発環境が再起動すると、ボリュームは新しいワーカー pod に再接続されます。
このようなアプローチの利点は次のとおりです。
開発環境の高速再起動 – CodeCanvas は既存のボリュームをほぼ瞬時にマウントするため、ユーザーは時間のかかるデータコピー操作を必要とせずに開発環境を停止・再起動できます。一方、データが S3 のようなコールドストレージソリューションに保存されている場合、開発環境へのデータのコピーにははるかに長い時間がかかります。
データの安全性 – 開発環境の再起動中に実際にデータがコピーされないため、コピーエラーや中断によるデータ損失のリスクはありません。
CSI スナップショット
CSI スナップショットは、開発環境の起動を高速化する CodeCanvas ウォームアップ機能に不可欠です。ウォームアップ中、CodeCanvas はユーザースクリプトを実行し、新しい開発環境でプロジェクトインデックスを構築します。ウォームアップの結果、開発環境のボリュームのスナップショットが作成されます。このスナップショットは、より安価なクラウドストレージ(例: S3)に保存されます。ユーザーが新しい開発環境を作成すると、CodeCanvas はスナップショットを取得し、新しい開発環境のボリュームに復元します。
このようなアプローチの利点は次のとおりです。
スナップショットによる開発環境の高速起動 – クラウドプロバイダーは、スナップショットをボリュームに復元するための効率的なメカニズムを備えています。これは、オブジェクトストレージからデータを直接コピーしたり、同サイズの Docker イメージをダウンロードしたりするよりもはるかに高速です。たとえば、10GB のスナップショットの復元は、AWS では数秒、Google Cloud では数秒未満で完了します。一方、同サイズの Docker イメージのダウンロードには、5 – 10 分かかる場合があります。
(まだ利用できません) ウォームアップスナップショットの高速作成 – クラウドプロバイダーは増分スナップショットをサポートしているため、CodeCanvas は前回のスナップショット以降の変更のみを追加することで、さらにウォームアップスナップショットをより高速に作成します。
コスト削減 – 停止した開発環境が一定期間(例: 2 ~ 3 日間)使用されていない場合、CodeCanvas は切断されたボリュームのスナップショットを作成し、ボリュームを削除します。スナップショットはクラウドオブジェクトストレージに保存されるため、クラウドブロックストレージ内のボリュームよりも低コストです。クラウドプロバイダーやその他の要因にもよりますが、これによりボリュームの維持コストを最大 80% 削減できます。
(まだ利用できません)データのバックアップ – スナップショットはユーザーデータのバックアップメカニズムを提供します。誤ってデータを失った場合でも、ユーザーはスナップショットからボリュームを復元できます。
(まだ利用できません) ディスクのサイズ変更 – スナップショットを使用すると、データを失うことなくボリュームのサイズを変更できます。CodeCanvas は、ボリュームのスナップショットを作成し、異なるサイズの新しいボリュームを作成し、スナップショットを新しいボリュームに復元することができます。
(まだ利用できません)高可用性 – スナップショットは単一のアベイラビリティゾーン(AZ)に縛られません。単一の AZ に縛られたボリュームとは異なり、スナップショットを使用すると、1 つの AZ に障害が発生した場合でも、別の AZ で開発環境を再起動できます。
Docker-in-Docker
開発環境のライフサイクルを制御するワーカーアプリケーションは、Kubernetes pod のコンテナー内で実行されます。ワーカーは Docker デーモンを使用して、ネストされたコンテナー内で開発環境を起動します。このモデルは Docker-in-Docker と呼ばれます。

このアプローチには、Kubernetes pods 上で開発環境を直接実行するよりもいくつかの利点があります。
フルコントロール – Docker-in-Docker を使用すると、CodeCanvas は Docker デーモンを介して実行環境を直接制御できます。これにより、以下のことが可能になります。
実行時にコンテナー内部のボリュームをマウント / アンマウントする
効率的なログ管理
追加のサービスにサイドカーコンテナーを使用するなど。
永続的な状態 – Docker ボリュームは実行間の状態を保存し、ユーザーの変更を保持して効率的なキャッシュを可能にします。
カスタムイメージの要件が少ない – ユーザーが提供する開発環境用のカスタム Docker イメージには、CodeCanvas 固有の構成を含める必要はありません。
(まだ利用できません) VM サポート – Docker-in-Docker アーキテクチャは、Kubernetes と仮想マシン間で一貫したセットアップを可能にします。将来的には、CodeCanvas は Kubernetes と同様に仮想マシン(VM)上での開発環境の実行をサポートする予定です。
もちろん、Docker で Docker を使用すると、メリットだけでなく課題もあります。たとえば、環境変数を内部コンテナーに伝播するための追加構成が必要であり、内部コンテナーの正確なリソース使用メトリクスが公開されず、ワーカーを --privileged モードで実行する必要がある (以下を参照) などです。
Docker-in-Docker と特権モード
Docker-in-Docker では、ワーカーアプリケーションにホストシステムに対する追加の権限(ホストのデバイスやファイルシステムへのアクセスなど)が必要です。これらの権限を付与するために、ホストはワーカーを --privileged モードで実行します。
特権モードの代わりに、開発環境クラスターで Sysbox を設定できます。Sysbox は、特権モードを必要とせずに Docker-in-Docker を安全に実行できるコンテナーランタイムです。
関連ページ:
コンピューティングプラットフォーム
コンピューティングプラットフォームは、ユーザー開発環境を実行するために使用されるインフラストラクチャを定義します。これは、特定の Kubernetes オペレーター、移動サーバー、リレーサーバーによって管理される開発環境クラスタで構成される構成エンティティです。コンピューティングプラットフォームのコンセプトは、CodeCanvas インストールのマルチリージョン性に対応しており、これらのコンポーネントの配置はエンドユーザーエクスペリエンスにとって非常に重要です。たとえば、エンドユーザーに近いリージ...
クリーンアップポリシー
未使用のリソースが蓄積されるのを防ぐために、クリーンアップポリシーを構成できます。非アクティブな開発環境を削除する:開発環境が停止すると、対応するリソースは直ちに解放されます。これは開発環境のボリュームには適用されません。ボリュームはブロックストレージに保存され、ユーザーが開発環境を再起動すると、CodeCanvas は新しい開発環境を作成し、保存されていたボリュームをそこにマウントします。使用されていない開発環境(ボリューム)が蓄積されるのを防ぐため、非アクティブな開発環境を削除するクリーン...
ライセンスの有効化
CodeCanvas 製品ライセンス:現在、CodeCanvas ライセンスは、JetBrains のセールス部門に連絡するか、JetBrains アカウント経由で購入することで取得できます。使用量の計算方法 CodeCanvas の使用量は、1 日のアクティブユーザー数(1 日中に少なくとも 1 つの開発環境を起動したユーザー)に基づいて計算されます。1 日のユーザー数の上限は、CodeCanvas ライセンスによって決まります。ライセンスにはいつでもユーザーを追加できます。なお、ライセンスで...
概要
JetBrains CodeCanvas は、企業がソフトウェア開発を個々のユーザーマシンから開発環境に移行できるようにするソリューションです。CodeCanvas の機能(IDE バックエンドを使用したコンテナー環境の構成、実行、管理)は、リモート開発オーケストレーションと呼ばれることもあります。導入の流れ:ここから始めましょう:新規インストール社内に CodeCanvas をインストールするシステム管理者の場合は、インストールガイドを参照してください。予備設定 CodeCanvas を新規...