# 自分のサーバーや VM を接続する

> 自分で管理する Linux サーバーや VM に endue Computer をインストールし、エージェントが endue クラウドではなくそこでファイルを保存し、プログラムを実行できるようにします。

自分の Linux サーバーや VM を、エージェントの **endue Computer** として使わせることができます。そのマシンでインストールコマンドを1つ実行すれば、それ以降、エージェントのファイルとプログラムはそこに置かれます。

## 使いどころ

そのマシンにしかないものが作業に必要なときに、自分のサーバーを使います。社内ネットワークへのアクセス、インストール済みのツールやデータ、既定より多くの CPU やディスク、自分で選んだリージョンにあるマシンなどです。自分で管理している Linux マシンであれば、Vultr の VPS、AWS の EC2 インスタンス、オンプレミスのサーバーなど、何でも使えます。

どれにも当てはまらなければ、このページは必要ありません。エージェントは、初めて必要になったときに endue クラウド上の endue Computer を自動的に使えるようになります。[デバイス](/ja/docs/build/devices/)を参照してください。

## 必要なもの

- x86_64 または aarch64 の Linux。プログラムは単一の静的バイナリなので、ディストリビューションは問いません。
- systemd。
- `sudo` による root 権限。
- 外向きのインターネット接続。endue Computer は安全な WebSocket で endue に接続しに行くため、受信用のポートを開ける必要はありません。

## インストール

<Steps>

1. **左サイドバーからリソース › デバイスを開き**、endue Computer グループの**自分のデバイス・サーバーにインストール**を選びます。

   [エージェントビルダー](/ja/docs/build/agent-builder/)で1つのエージェントのページを開いている場合は、**リソース › デバイス › 自分のサーバーを接続**で、そのエージェントに対して同じ操作ができます。

2. **エージェントを選び**、必要に応じて一覧に表示するデバイス名（例：`build-server-01`）を入力します。**インストールコマンドを作成**を選びます。

   エージェントがすでに endue クラウド上の endue Computer を持っている場合は、先にそれとその中のファイルを削除するかどうかを確認されます。キャンセルすれば何も変わりません。[エージェントの endue クラウド Computer を置き換える](/ja/docs/build/devices/#エージェントの-endue-クラウド-computer-を自分のサーバーに置き換える)を参照してください。

3. **コマンドをコピーして、サーバーで実行します**。コマンドは次のような形です。

   ```sh
   curl -fsSL https://download.endue.ai/computer/install.sh | sudo sh -s -- \
     --endpoint <endpoint> --token <token> --instance <agent-id>
   ```

   コマンドには、このエージェント用の接続トークンが含まれています。表示されるのは一度だけです。コピーする前にウィンドウを閉じてしまった場合は、新しいコマンドを作成します。

4. **接続済みになるまで待ちます**。コマンドが完了して数秒後に、ダイアログとデバイス一覧が**接続済み**に変わります。

</Steps>

<Aside type="caution" title="コマンドは確認なしで実行されます">
  自分のサーバー上では、エージェントはファイルの書き込みやプログラムの実行のたびに承認を求めません。エージェントを制限するのは、インストール時に設定した内容です。つまり、専用ユーザー、実行を許可するプログラムの一覧、ネットワークアクセス、そして後述のプロファイルです。エージェント専用のサーバーか VM を使い、`--allow-exec` には必要なものだけを指定してください。
</Aside>

## インストーラーの処理内容

1. アーキテクチャを判別して endue Computer をダウンロードし、SHA-256 チェックサムを検証します。チェックサムが一致しない場合は、何もインストールしません。
2. カーネルがどの[プロファイル](#プロファイル)に対応しているかを確認します。
3. ログインできないシステムユーザー `endue` を作成します。
4. エージェント用に、次のものを作成します。

   | パス | 所有者とモード | 内容 |
   | --- | --- | --- |
   | `/etc/endue-computer/<agent-id>.env` | root, `0600` | 接続先のアドレス、トークン、選んだ設定 |
   | `/var/lib/endue-computer/<agent-id>/workspace` | `endue` | エージェントの[ワークスペース](/ja/docs/build/workspace/)（エージェントが作業するフォルダー） |
   | `/var/lib/endue-computer/<agent-id>/state` | `endue` | ワークスペースの外に置かれる、チェックポイントと保存済みのファイル |

5. エージェント用の systemd サービス `endue-computer@<agent-id>` を有効化して起動し、接続できたかどうかを報告します。

## エージェントにできることを決める

インストールコマンドの末尾に、オプションを追加します。

```sh
curl -fsSL https://download.endue.ai/computer/install.sh | sudo sh -s -- \
  --endpoint <endpoint> --token <token> --instance <agent-id> \
  --allow-exec git,python3 --no-network
```

| オプション | 既定値 | 効果 |
| --- | --- | --- |
| `--allow-exec <list>` | `git,node,npm,npx,python3,pip3,curl` | エージェントが実行できるプログラム。パスを付けずに、カンマ区切りで指定します。`--allow-exec ""` を指定すると、プログラムの実行を完全に無効にします。 |
| `--no-network` | ネットワークを許可 | エージェントが実行するプログラムは、ネットワークを使えません。 |
| `--no-delete` | 削除を許可 | エージェントは、ワークスペース内のファイルを削除できません。git や npm などのツールはロックファイルや一時ファイルを削除するため、`sandboxed` プロファイルでは失敗します。 |
| `--profile auto\|sandboxed\|managed` | `auto` | 使用する[プロファイル](#プロファイル)。 |

一覧にあってもサーバーにインストールされていないプログラムは、インストール時に報告されます。エージェントがそのプログラムを実行しようとすると、「インストールされていません」という結果が返ります。

プログラムを許可しても、そのプログラムでできることが制限されるわけではありません。`node` や `python3` を許可すると、エージェントはプロファイルの範囲内で、それらが実行できるあらゆるコードを実行できます。

## プロファイル

| プロファイル | 条件 | エージェントが実行するプログラムにできないこと |
| --- | --- | --- |
| `sandboxed` | Linux 6.12以降（Landlock ABI 6） | ワークスペースフォルダーの外にあるファイルの読み書き。`managed` の制限もすべて適用されます。 |
| `managed` | それ以外のカーネル。Ubuntu 22.04（5.15）や Ubuntu 24.04 の GA カーネル（6.8）など | root になることや、権限の取得。systemd が `/home`、`/root`、ほかのエージェントのフォルダーを隠し、それ以外のシステムを読み取り専用にします。ファイルシステムのサンドボックスはないため、プログラムは `endue` ユーザーが読めるファイルなら、どれでも読めます。 |

`auto` は、カーネルが対応していれば `sandboxed` を選び、対応していなければ通知を出したうえで `managed` にフォールバックします。対応していないカーネルで `sandboxed` を指定すると、インストーラーはインストールせずに終了します。`managed` は、エージェント専用のサーバーか VM でのみ使ってください。

## 同じサーバーに別のエージェントを追加する

1台のサーバーを、複数のエージェントで使えます。**リソース › デバイス**でサーバーの行のメニューを開いて**エージェントを追加**を選び、エージェントを選んだら、新しいコマンドを同じサーバーで実行します。

エージェントごとに専用のサービス、設定ファイル、フォルダーが作られ、プログラムと `endue` ユーザーは共有されます。`managed` プロファイルで、各エージェントがほかのエージェントのフォルダーに入れないようにしているのは systemd です。

## 起動・停止とログ

`<agent-id>` は、コマンドの `--instance` の後ろにある値に置き換えます。

```sh
sudo systemctl status endue-computer@<agent-id>    # 実行中かどうか
sudo systemctl start endue-computer@<agent-id>     # 起動
sudo systemctl stop endue-computer@<agent-id>      # 停止
sudo journalctl -u endue-computer@<agent-id> -f    # ログを追う
```

サービスが停止している間、デバイスは**オフ**と表示され、エージェントは起動するよう知らせます。endue が代わりにクラウドの Computer を作成することはありません。

## 再インストール

同じ `--instance` でインストールコマンドをもう一度実行すると、トークンを含む設定が置き換えられ、サービスが再起動されます。

エージェントのサーバーが接続されている間は、新しいコマンドを作成できません。先にサーバーでサービスを停止してから、コマンドを作成し直します。

## アンインストール

```sh
curl -fsSL https://download.endue.ai/computer/install.sh | sudo sh -s -- \
  --uninstall --instance <agent-id>
```

このコマンドは、エージェントのサービスを停止して無効化し、設定ファイルを削除します。ワークスペースと state のフォルダーは、`--purge` を付けない限り残ります。`--instance` を指定しない場合は、サーバー上のすべてのエージェントが削除されます。エージェントが1つも残らなければ、プログラムとサービス定義も削除されます。

サーバーでアンインストールしても endue からデバイスは削除されず、endue で削除してもサーバーからアンインストールされるわけではありません。ここでのアンインストールと、デバイスの行メニューでそのエージェントを**外す**操作の両方を行ってください。[デバイスを削除する](/ja/docs/build/devices/#デバイスを削除する)を参照してください。

## 制限事項

- 対応しているのは、x86_64 または aarch64 の Linux のみです。macOS 版と Windows 版はまだありません。
- endue Computer は、エージェントごとに1台です。自分のサーバーにいるエージェントが endue クラウド上にも持つことはできません。また、すでに別のサーバーにいるエージェントは、先にそちらから外す必要があります。
- endue は、自分のサーバーやサービスを起動できません。どちらかが停止している場合、エージェントはそれなしで作業します。
- エージェントがサーバー上のツールを使えるのは、サービスが接続されている間だけです。エージェントがバックグラウンドで起動したプログラムは、サービスが停止すると一緒に停止します。
- 一部のコンテナなど systemd がない環境では、`--no-systemd` を付けます。インストーラーはファイルを配置し、endue Computer を自分で起動するためのコマンドを表示します。この場合、前述の systemd による保護は適用されません。
- サービスが `status=226/NAMESPACE` で起動に失敗する場合、そのマシンではマウント名前空間を作成できません。これは一部の LXC や OpenVZ のコンテナで起こります。完全な VM を使うか、`--no-systemd` を付けます。

## 関連項目

<CardGrid>
  <LinkCard
    title="デバイス"
    href="/ja/docs/build/devices/"
    description="各デバイス製品、ユーザーデバイスとエージェントデバイス、そして削除の方法。"
  />
  <LinkCard
    title="ワークスペース"
    href="/ja/docs/build/workspace/"
    description="エージェントが作業するフォルダーと、その中身の確認方法。"
  />
  <LinkCard
    title="セキュリティと権限"
    href="/ja/docs/account/security/"
    description="エージェントがアクセスできるものと、できないもの。"
  />
</CardGrid>
