リモート開発メインのソフトウェア開発企業のエンジニアブログです

おかねがないぼくのかんがえたさいきょうのかいはつかんきょう

目次

半導体不足でメモリやら GPU やらが高くなってます。私が使っているのは5年前に買った MBP で、当時60万円くらいしました。

そろそろ新しいのが欲しいなぁと思いつつ、Apple のサイトを見てみると14インチ、メモリ64GBで90万円くらい、メモリ128GBにすると120万円とか表示されて、とてもじゃないけど手が出ません。

現状

環境

パソコンは2台あり、前述の2021年MBP(メモリ64GB)とその前年くらいに買った Dell の Windows PC(メモリ32GB)です。どちらもメモリはそれなりにあるので、日常使いには困りません。(が、新しいのが欲しい・・・)

前の家では28インチくらいのディスプレイを繋いでたんですが、事情により今の家に引っ越す際にディスプレイは持ってこず、それ以降は惰性で外付けディスプレイは無しで仕事してます。

同時に立ち上げるアプリ・環境が多い

私の社内の立場は管理職兼開発の何でも屋という感じで、関わっているプロジェクト数は社内で一番多いです。あと、小さいですがマレーシア・フィリピンに関連会社があるので、そっちの事務作業とかもちょこちょこ発生します。

メインで使っている Mac ではデスクトップが1〜6まであり、

  1. 大きめのプロジェクトAの開発用
  2. メール、チャット、小さなプロジェクト開発用
  3. 大きめのプロジェクトBの開発用
  4. もばらぶの事務作業用
  5. マレーシアの事務作業用
  6. フィリピンの事務作業用

という使い分けです。それ以外に、Amazon Workspaces でお客様の環境に繋いで作業を行うプロジェクトもあります。

また、大きめのプロジェクトは複数レポジトリにまたがったり、1つのレポジトリでも git worktree で複数並行で作業をすることも多いですし、そもそも関わっているプロジェクトも多いので、

  • 開いているターミナルのウィンドウ数、タブ数も多い
  • 各タブで Tmux を動かして、多数のシェルが起動している

という状態でした。最近は Herdr を使い始めてウィンドウ・タブ数は若干減りましたが、それでも結構多い方だと思います。

また、ブラウザも複数プロファイルを作って使い分けていますが、ターミナル上でリンクをクリックした時に意図しないプロファイルで開いてしまって開き直す必要があったり等、地味に面倒です。

それが増え続けている

もともと同時に立ち上げるウィンドウ・プロファイルなどは多いのですが、AI によって出来る事が増えたことにより、関わるプロジェクト(主に社内プロジェクト)も増え続けています。このままデスクトップやウィンドウが増え続けると破綻しそうです。

とはいえ、頻繁に使うものは少ない

という状況なのですが、それらを常時使っているわけではなく、良く使うもの・そうでないものが分かれています。例えば、事務作業用のデスクトップやウィンドウは全く使わない日もありますし、開発プロジェクトでも、良く作業を行うものもあれば、お客様からの修正依頼が来たときだけ対応すれば良いものなどもあります。

良く使わないものを立ち上げっぱなしにしておくのは(使わない時は OS のメモリ管理で待避されているとはいえ)メモリの無駄ですし、多少は認知負荷がかかっているのも問題です。

開発用の高いパソコンを買うのは諦めて VPS と併用にした

概要とコストメリット: 月4,700円!

という事で本題です。手元のパソコンに全部置くのは止めて、たまにしか行わない作業・プロジェクトの大半を VPS に移行することにしました。

VPS は色々ありますが、海外の安い VPS でメモリが多いやつにしました。

  • メモリ48GB
  • 3年契約で$600 ≒ 95,000円 ≒ 2700円/月

という感じです。多くのプログラム・開発環境を VPS に移すことにより、手元の MBP のメモリ使用量(と私の認知負荷)を抑えられます。そして、メインの MBP は AppleCare+ の延長保証みたいなの(年25,000円くらい?)がまだ継続しているので、あと2〜3年は使い続けるつもりです。

それにより、今後動画編集とかで CPU が辛くなってきた場合も90万円とか120万円の MBP を買う必要もなくなります。どうしても新しいマシンが必要になったら、メモリを抑えて 30〜50万円くらいのものを買うか、GPU を積んだものを買おうと思います。

以上より、費用を今後3年間で考えると以下のようになります。

  • (今回断念した)新規でマシマシ MBP を購入 → 90万円〜120万円 ≒ 25,000円〜33,000円/月
  • 今回の方法 → VPS 95,000円+AppleCare+ 25000円 x 3年 ≒ 17万円 ≒ 4,700円/月
  • 今回の方法+そこそこ MBP → VPS 95,000円 +30万〜50万円 ≒ 40〜60万円 ≒ 11,000円〜17,000円/月

大分値段を抑えられました。

ついでに AI 時代のセキュリティに対応してみた(大袈裟)

例えば、手元の MBP でやっているものの7割くらいを VPS に移したとしても、VPS 上で結局大量のウィンドウとかを開く方法のままでは進歩がありません。

最近は、AI で作業がどんどん自動化していってます。Claude Code のデフォルトが auto mode になってからも結構時間が経っています。AI エージェントが色んなプロジェクトのファイル・情報を見られるような状況は望ましくありません。

もちろん、Claude Code や Codex の設定であれやこれやを禁止事項に設定することは出来るのですが、それだけに依存するのは心許ないです。

前置きが長くなりましたが、今回は以下のようにしました。

  • プロジェクト毎に OS ユーザーを分ける
    • ブラウザのパスワード保存では、プロジェクトに必要なサイトのもののみを保存
    • プロジェクトで必要な Google アカウントにログイン
  • GitHub の fine-grained PAT を使い、プロジェクトのレポジトリのみにアクセス可能にする
  • Bloque でプロジェクト毎に Hub を作成し、必要な MCP サーバー・ツールのみを有効にする

これにより、以下の問題が解決できました。

  • AI エージェントが潜在的に不必要なファイルにアクセス出来てしまう
  • AI エージェントが関係無いレポジトリに書き込む(例: フォーク元レポジトリに issue を立てる、等)
  • ウェブサイトをブラウザの異なるプロファイルで開いてしまう
Moba Pro

具体的な設定方法

ここでは具体的な設定方法を説明します。実際にはスクリプトで自動化しています。

OS ユーザー作成

まずは OS ユーザーを作成します。SSH 公開鍵認証のみを使うため、パスワードは設定しません。当たり前ですが、このユーザーには sudo は許可してはいけません。

USERNAME=proj-a
adduser --disabled-password --gecos "" "$USERNAME"Code language: JavaScript (javascript)

次に、SSH 公開鍵認証のために ~/.ssh/authorized_keys に公開鍵を追加します。詳細は省略します。

後述の systemd user service を OS 起動時に起動させるため、以下のコマンドを実行します。

loginctl enable-linger "$USERNAME"Code language: JavaScript (javascript)

VNC を systemd user service として起動

手元の PC から VPS の GUI にアクセスするために VNC を起動しますが、今回は各ユーザー毎に systemd の user service として起動します。

systemd が何かは知っていても、user service を知っている人は比較的少ないでしょう。簡単に言うと、root 権限ではなく各ユーザーの権限でサービス・デーモンを動かすことが出来る仕組みです。(今回の記事とは関係ありませんが、以下の記事で systemd user service を使っています。)

Puma を systemd のユーザーサービスとして起動する – もばらぶエンジニアブログ

設定方法を説明します。まずは root 権限で /etc/systemd/user/vncserver@.service に以下のファイルを作成します。

[Unit]
Description=TigerVNC server on display :%i (Unix socket)

[Service]
Type=forking
ExecStartPre=/usr/bin/mkdir -p %h/.config/tigervnc
ExecStartPre=-/usr/bin/rm -f %h/.config/tigervnc/vnc.sock
ExecStart=/usr/bin/vncserver :%i -rfbunixpath %h/.config/tigervnc/vnc.sock -rfbport -1 -geometry 1280x1024 -depth 24
ExecStop=/usr/bin/vncserver -kill :%i
Restart=on-failure

[Install]
WantedBy=default.target
Code language: JavaScript (javascript)

ポイントとしては以下の2点です。

  • VNC は TCP では待ち受けず、ホームディレクトリ内の UNIX ソケットファイルで待ち受ける
    • VPS 上の他のユーザーが接続するのを防ぐ
  • ディスプレイ番号は可変(1, 2, 3, …)

その後、各ユーザーの権限で vncpasswd を使い VNC のパスワードを設定します。作成されるパスワードファイルは .config/tigervnc/passwd です。後は、以下のコマンドをユーザー権限で実行します。

# ユーザーID毎に個別のディスプレイ番号を割り当てる(UIDは1001以上の前提)
display=$((uid - 1000))
systemctl --user daemon-reload
systemctl --user enable --now "vncserver@${display}"Code language: PHP (php)

画面のオートロック、スクリーンセーバーを無効化

OS ユーザー作成時にパスワードは無効化しているので、画面のオートロック・スクリーンセーバーなどが起動してしまうと、それを解除出来ません。そのため、それらを無効化する必要があります。具体的には、各ユーザー毎に以下のファイルを作成します。

~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-screensaver.xml

<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfce4-screensaver" version="1.0">
  <property name="saver" type="empty">
    <property name="enabled" type="bool" value="false"/>
    <property name="idle-activation" type="empty">
      <property name="enabled" type="bool" value="false"/>
    </property>
  </property>
  <property name="lock" type="empty">
    <property name="enabled" type="bool" value="false"/>
    <property name="saver-activation" type="empty">
      <property name="enabled" type="bool" value="false"/>
    </property>
  </property>
</channel>Code language: HTML, XML (xml)

~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml

<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfce4-power-manager" version="1.0">
  <property name="xfce4-power-manager" type="empty">
    <property name="dpms-enabled" type="bool" value="false"/>
    <property name="blank-on-ac" type="int" value="0"/>
    <property name="blank-on-battery" type="int" value="0"/>
    <property name="dpms-on-ac-sleep" type="uint" value="0"/>
    <property name="dpms-on-ac-off" type="uint" value="0"/>
    <property name="dpms-on-battery-sleep" type="uint" value="0"/>
    <property name="dpms-on-battery-off" type="uint" value="0"/>
    <property name="lock-screen-suspend-hibernate" type="bool" value="false"/>
  </property>
</channel>Code language: HTML, XML (xml)

~/.config/autostart/disable-screen-blank.desktop

[Desktop Entry]
Type=Application
Name=Disable screen blanking
Exec=sh -c "xset s off; xset s noblank; xset -dpms"
X-GNOME-Autostart-enabled=trueCode language: JavaScript (javascript)

GitHub の fine-grained PAT の作成・設定

せっかくプロジェクト毎に OS ユーザーを分けても、各ユーザーに自分の GitHub 権限を全て与えてしまっては羊頭狗肉です。各ユーザーに対してプロジェクトに必要なレポジトリーの権限のみを与えるために、各ユーザー毎に GitHub の fine-grained PAT を作成します。作成は GitHub の画面上からしか出来ません。

作成した PAT を GH_TOKEN 環境変数にセットすると、GitHub CLI (gh コマンド)ではそれを使ってくれます。

export GH_TOKEN=github_pat_1234567890......Code language: JavaScript (javascript)

通常の git コマンドでもこのトークンを使いたい場合には以下のコマンドを実行します。これは1度実行するだけで良いです。

gh auth setup-git

これで AI エージェントが勝手に関係無いレポジトリに書き込みにいったりするのを防げます。

なお、 git clone の際には、以下の通り HTTPS を使ってください。

git clone https://github.com/yamada/example-project.git # OK
git clone git@github.com:yamada/example-project.git # ダメCode language: PHP (php)

ローカルでの SSH 設定

ローカルの ~/.ssh/config に、VPS 上の1ユーザー毎に以下のエントリーを追加します。

Host dev-proj-a
    HostName dev.example.com
    User proj-a
    LocalForward 127.0.0.1:5901 /home/proj-a/.config/tigervnc/vnc.sock
    ServerAliveInterval 60

ポート番号の 5901 はユーザー毎に異なります。

  • VPS のユーザー ID 1001 = ディスプレイ番号1 = VNC のポート番号 5901
  • VPS のユーザー ID 1002 = ディスプレイ番号2 = VNC のポート番号 5902
  • :

という仕組みです。

使い方

基本

以下のコマンドで SSH 接続すると、SSH ポートフォワードでローカルのポートが VPS の vnc.sock に繋がります。

ssh dev-proj-a

後は、VNC で localhost:5901 を指定すると、VPS の画面が開きます。VNC クライアントは、最初は macOS 標準の画面共有(?)を使っていたのですが、TigerVNC クライアントに切り替えました。

VNC は Windows のリモートデスクトップなどと同じ感じでセッションが保存されるので、作業のキリが良いところで VNC クライアントを閉じて、また次回開けば作業が再開できます。

プロジェクトによっては GUI が必要無いものもあるので、その場合は VNC は使わずに SSH 経由でターミナルのみで作業しています。

一時的に広めの権限、他のプロジェクトのファイルを使いたいとき

一時的に、他の Google アカウントのファイルだったり、Dropbox のファイルを使いたいときがあるかもしれません。その場合はブラウザーのシークレットウィンドウでそれらのサービスにログインしてファイルを取得します。

Git の場合は、以下の通り ssh -A で接続すると、VPS 上でローカルの SSH 認証情報が使えます。

ssh -A dev-proj-a

この状態で以下のコマンドを実行すると、SSH 鍵での認証となり、自分に権限が与えられている全てのレポジトリーにアクセス出来ます。

# (PAT ではなく)SSH 鍵で GitHub にアクセス
git clone git@github.com:yamada/example-project.gitCode language: PHP (php)

引き続きローカルで行う作業

以下の作業は引き続きローカルで作業を行おうと思います。

  • チャット・メールの確認
  • 多くのレポジトリー、共有ドライブなどへのアクセスが必要なプロジェクト
  • 操作感がキビキビしていて欲しいもの
    • 日本語での文書入力
    • 動画の手動編集
  • 1日のうち多くの時間を使うプロジェクト

その他、感想等

ブラウザの処理はもっさりする

VPS の場所にもよると思いますが、ネットワークのレイテンシーもあるため、ブラウザーの処理などはもっさりしています。UI の細かいチェックが必要な開発作業などには向かないです。

また、Claude Code から Playwright を使ってブラウザー操作が必要な作業の自動処理を行っていますが、ローカルだと問題無く動作したものが VPS 上だと上手く動かなかったものもあるので、AI に直してもらいました。

X2Go というのも試してみたが上手くいかなかった

VNC + SSH ポートフォワードというのは過去にもやったことがあるので、違うものを試すということで、最初は X2Go というのを使ってみました。結論としては SSH 公開鍵認証のみでの接続を上手く動作させられませんでした。また、Mac の X2Go client は Rosetta 2が必要なのですが、近い将来 Rosetta 2は廃止されるので、それも X2Go を諦めた理由です。

Google のログインで弾かれる事がある

海外にある VPS で動いている Linux からアクセスする事になるので、最初は Google Workspace のログインで弾かれました。最初は日本国内のサーバーに proxy サーバーを立てたり色々試したのですがどれも上手くいきませんでした。

結論ですが、回避方法としては、Google Workspace のアカウント管理画面で、10分間セキュリティチェックを無効化する、みたいなボタンがあるので、それを押してからログインします。

国内の VPS は高い・・・

日本の会社と海外の会社で同じくらいのサービス・価格だったり、少しだけ日本の会社が高いくらいであれば、私は応援の意味も込めて日本の会社のサービスを使うことが多いのですが、メモリ容量の大きい VPS の場合、国内ベンダーは比較対象になりませんでした。

私が今回借りたのはメモリ48GBで月額換算3,000円未満です。

さくらの VPS だと、石狩リージョンでメモリ8GBのものが月額換算で6,454円/月です。

クラウド連携・拡張性を備えた安心・安全な環境|さくらのVPS

XServer は8GBで月額換算3,850円/月、32GBで22,220円/月、です。

料金一覧 | 高性能で安定したVPS環境 | XServer VPS

他も似たようなものです。

もちろん、土地代、電気代等が違うのは理解していますが、もうちょい頑張って欲しいです。

そもそも、メモリ1GBとかの VPS だと、OS のアップグレードも厳しいです。512MBは論外でしょう。

System requirements – Ubuntu Server documentation

まとめ

メインで使っている開発マシンが5年前の MBP なので新しいのが欲しいのですが、メモリ価格高騰でとてもじゃないですが手が出ません。そのため、海外格安 VPS でメモリ多めのものを借りて、たまにしか行わない作業・プロジェクトに関連するファイルなどをその VPS に逃がすことで、手元の MBP を延命させる方針にしました。

最近では AI に任せる作業が増えているため、プロジェクト毎に OS ユーザーと権限を絞った GitHub PAT を作成し、AI が余計な事をしても影響が最小限になるようにしています。

← 前の投稿

次の投稿 →

AI + Sveltia CMS でまとめサイトを作る一つの方法

コメントを残す