WSL2 を「どこからでも触れる開発環境」にする – Tailscale 自動起動 × nagi × ターミナル型AI の最強ワークフロー

みなさん、こんにちは。

「外出先からちょっとだけ WSL2 の開発環境を触りたい」と思ったことはありませんか? 従来なら SSH ポートを開けたり、リモートデスクトップの設定をしたりと、準備が意外と面倒でしたよね。

しかし最近は、Tailscalenagi(Web ターミナル) を組み合わせることで、スマホやタブレットから WSL2 を安全かつ快適に操作できる環境が爆速で作れるようになりました。

さらに、Claude CodeGitHub Copilot CLI といった最新のターミナル型 AI エージェントとの相性も抜群です。今回は、Windows 起動時にすべてが整う「最強のモバイル開発環境」の構築手順をまとめていきます。

参考
今回の構築にあたり、こちらの Zenn 記事を参考にさせていただきました。
WSL2に外部からSSH接続する方法(Tailscale + 自動起動)

 


 

前提環境

 

  • Windows 11
  • WSL2(Ubuntu)
  • Node.js 22.x以降 (WSL2にインストール済みであること)
  • Tailscale(操作側のスマホや PC にもインストール済みであること)
  • ターミナル型 AI(Copilot CLI / Claude Code / OpenClaw など)

 


 

WSL2 側の基本セットアップ

 

まずは、ベースとなる SSH サーバーと Tailscale を WSL2 内に用意します。

SSH サーバーのインストール

sudo apt update
sudo apt install -y openssh-server
sudo service ssh start

Tailscale のインストールと接続

次に、WSL2 を自分だけのプライベートネットワーク(Tailnet)に参加させます。

  • インストール実行
curl -fsSL https://tailscale.com/install.sh | sh
  • 認証して参加
sudo tailscale up
  • 表示された URL をブラウザで開き、Google や GitHub アカウントでログインすれば完了です。
  • IP アドレスの確認
tailscale ip -4
  • ここで表示される 100.x.x.x のアドレスをメモしておきましょう。

注意!
ホストの Windows 側でも Tailscale を動かしている場合、Windows の IP と WSL2 の IP は別物です。外出先からは「WSL2 側の IP」へアクセスするので混同しないようにしましょう。

 


 

systemd を有効にして「自動起動」を仕込む

 

WSL2 を「サーバー」として運用する場合、手動でサービスを立ち上げるのはスマートではありません。systemd を使って Tailscale を自動起動させましょう。

/etc/wsl.conf の編集

sudo vi /etc/wsl.conf

以下の内容を追記します。

[boot]
systemd = true

追記したら、一度 PowerShell などで wsl --shutdown を実行して再起動し、以下のコマンドでサービスを有効化します。

sudo systemctl enable tailscaled
sudo systemctl enable ssh

 


 

Windows 起動時に WSL2 自体を立ち上げる

 

systemd を設定しても、肝心の WSL2 が起動していなければ意味がありません。そこで、Windows のタスクスケジューラを利用して、バックグラウンドで WSL2 を自動起動させます。

設定のポイント

  • 全般: ユーザーがログオンしているかどうかにかかわらず実行する
  • トリガー: システムのスタートアップ時
  • 操作: プログラムの開始
  • プログラム: C:\Windows\System32\wsl.exe
  • 引数: -u root(ここが重要です)
タスクスケジューラの操作設定
タスクスケジューラの操作設定

これで、PC の電源を入れるだけで自動的に Tailscale につながった WSL2 が立ち上がります。

 


 

nagi で「スマホ対応」の Web ターミナル化

 

ここが今回の肝です。nagi は、ブラウザ経由でターミナルを操作できる UI ツールです。

スマホのブラウザからでも操作しやすく、tmux や AI エージェントの表示も崩れません。開発者のshi3z氏のリポジトリには iOS 向けのような記述もありますが、Android の Chrome 等でも問題なく動作します。

WSL2へのインストールと起動

まずはインストール用の作業フォルダを作成します。WSL2 では作業フォルダを明示的に作成しておかないと、権限周りでエラーが発生しやすいため、以下の手順をおすすめします。

mkdir ~/.npm-global
# グローバルインストールのパス設定
npm config set prefix ~/.npm-global
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

# nagi をインストール
npm install -g nagi-terminal
nagi

起動すると、アクセス用 URL(http://100.x.x.x:8765)が表示されます。Tailscale 認証がデフォルトで効いているため、同じ Tailnet 内のデバイスからのみ安全にアクセス可能です。

nagi も systemd で自動起動させる

nagi を手動で立ち上げるのは面倒(というか、忘れると致命的)なので、systemd ユニットファイルを作成してサービス化してしまいましょう。

1. nagi のフルパスを確認

systemd 内ではフルパス指定が必要なため、まずはパスを確認します。

which nagi
# 例: /home/ユーザー名/.npm-global/bin/nagi
2. ユニットファイルの作成

/etc/systemd/system/nagi.service を作成します。

sudo vi /etc/systemd/system/nagi.service

以下の内容を記述してください(YOUR_USER の部分は自分のユーザー名に、ExecStart のパスは先ほど確認したものに書き換えてください)。

[Unit]
Description=nagi web terminal
# Tailscale が立ち上がってから起動するように設定
After=network.target tailscaled.service

[Service]
# npm-global のパスを通す
Environment=PATH=/home/YOUR_USER/.npm-global/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ExecStart=/home/YOUR_USER/.npm-global/bin/nagi
WorkingDirectory=/home/YOUR_USER
Restart=always
User=YOUR_USER

[Install]
WantedBy=multi-user.target
3. サービスの有効化

作成したら、デーモンをリロードして有効化します。

sudo systemctl daemon-reload
sudo systemctl enable nagi
sudo systemctl start nagi

これで、「PCの電源を入れる」→「WSL2が起動」→「Tailscaleとnagiが自動で立ち上がる」 という完全な自動化ワークフローが完成します!

なお、ローカルでAIエージェントを使い、外出先で作業状況を確認するためにnagiを使いたい場合、AIエージェントは、必ず tmux を使って起動させましょう。そうしないと、外出先から作業を確認することができません。

# ローカルで作業開始
tmux
copilot  # または claude code など

これで、家で相談していた AI との対話の続きを、電車の中で確認・継続できます。

スマホでnagiに接続
スマホでnagiに接続

 


 

まとめ – WSL2 が「持ち歩ける開発環境」に進化する

 

今回の構成のまとめです。

  1. Tailscale:どこからでも安全に穴あけ
  2. systemd + タスクスケジューラ:完全自動起動の実現
  3. nagi:スマホブラウザを最強のターミナルに
  4. tmux:AI 作業の状態を永続化

この組み合わせにより、WSL2 は「デスクに縛られた環境」から「いつでもどこでも呼び出せる AI 執事付きの開発環境」へと進化します。

「ちょっとした空き時間に AI とコードを詰めたい」という方は、ぜひ試してみてください。

 

本日も最後までお読みいただきありがとうございました。

それでは、よい開発ライフを!

カテゴリ: 開発インフラ

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール