My Development Environment 2026

Published 31st December 2026

この記事では 2026 年の棚卸しとして今年の自分の開発環境を紹介します.

計算機たち

主に以下の計算機たちからなります.

  • サーバ (自宅):4x Mini PC (NucBox, 型番は非統一,概ね K6くらい)
  • サーバ (外部):AWS Lightsail (Smallest Instance)
  • クライアント:MacBook Air

今年は特に新しい計算機は買いませんでした.いまのところのわたしの用途だとこれで十分みたいです.

サーバ

全体構成

Mini PC 4台を dev, pve1, pve2, pve3 と呼びます.いずれにも Proxmox がインストールされており,次のような役割を担っています.

  • dev: 仮想マシンとして開発環境の Ubuntu が動いています.
  • pve1, pve2, pve3: Kubernetes クラスタのために使っています.

基本的に dev サーバ上の仮想マシン (以下簡単のためこれも dev サーバと呼びます) に接続して作業をし,作ったプログラムを手元の Kubernetes クラスタにデプロイして実行します.手元で収まらない計算(機械学習モデルの学習や大規模データ処理)は AWS に投げています.

これ以外にも NAS があり,容量が大きいもの(ログデータ)や長期間保存が必要なもの(研究関係のデータ)はそちらに保存しています.バックアップは AWS S3 に rustic しています.

ネットワーク

サーバを公開するまでもないアプリは Cloudflare Workers で処理しています.

ISP が CGNAT を導入しているため,外部から自宅サーバに自然に接続することができません.そのため以下の2つの方法でサーバを公開しています.

  1. AWS Lightsail (Bastion Server) + Tailscale for SSH
  2. Cloudflare Access for HTTPS

SSH でアクセスするために AWS Lightsail の最も安い IPv4 インスタンスを Bastion サーバとし,Tailscale を使って自宅クラスタに接続しています.Cloudflare Tunnel や直接 Tailscale を使うのが別案ですが,外出先でクライアントにソフトウェアをインストールできない場面があるためこうしています.

Kubernetes クラスタ

上述の通り,あまり重くない単発処理や常時実行し続けたいものを Kubernetes Cluster で実行しています.いざというときにクラスタをまるごと作り直しやすいように前提に設計しています.

物理構成

CAPI を用いて自動化しています.特に昨年から変更はありません.2年間特に大きな問題もなく走ってくれました.

  • Management Cluster: pve1 上に小さな VM (2 vCPU, 4GB RAM) を立ち上げて k3s を実行しています.cluster-api, capmox, talos-provider による標準的な構成です.

  • Workload Cluster: pve1, pve2, pve3 上に 3x Control Planes (2 vCPU, 4GB RAM, 100GB disk) と 3x Workers (10 vCPU, 20GB RAM, 700GB) が走っています.

Infrastructure as Code

昨年からの大きな変更点の1つです.昨年の時点でほぼ全ての設定を .yaml に書き起こすようにしていましたが,今年は ArgoCD を用いてこれを強制しました.環境変更には git merge が必要になっており,コードと実態のギャップは ArgoCD によって通知されます.

また,関連するクラウドサービス (AWS, Cloudflare) の設定もできるだけ OpenTofu で設定できるようにしました.コードが変更されるたびに GitLab Runner によって更新が走るようになっています.

アプリケーションたち

Kubernetes 上では個人用の便利ツール (growi, aria2, firefox, ...) から開発系まで幅広く実行しています.開発に関わるものとしては以下があります.

  • 監視系:Grafana / Prometheus / Loki / Grafana Tempo
  • ストレージバックエンド:Longhorn
  • ワークフローエンジン:Argo Workflow
  • CI/CD:GitLab Runner
  • コンテナレジストリ:registry
  • シークレット管理 (new):OpenBao + External Secret Operator
  • 自分用チャット:mattermost (new)
  • 通知系:ntfy (new)

以下概要です.

変更

  • OpenBao + External Secret Operator: IaC のためにシークレットをソフトウェア側に押しつけています.最初は Bitwarden Secrets Manager を使っていたのですが,シークレットたちに階層を持たせたかったので OpenBao をクラスタ内に導入して使うようにしました.
  • ntfy: 代表的な通知系ソフトです.apprise と比較してこちらにしました.遅延通知ができることが決め手だった気がします.
  • Mattermost: 後述.これなしでは開発できないくらいに依存しています.

試したが非変更

  • OpenObserve: Grafana Stack がリソースを食うので OpenObserve を試しました.機能そのものに大きな不満はなかったのですが,UI が洗練されていないこと・会社が Grafana を使っていることから,数ヶ月で Grafana に戻しました.
  • apprise: ntfy と比較して ntfy を選びました.理由は上述.

開発サーバ

クライアントから ssh して作業するためのマシンです.Ubuntu が走っています.最も大きな役割は kubectl で Kubernetes クラスタを管理することです.

マシンとしてのカスタマイズは控えめなので特に面白くはないと思います.以下が代表的なツールです.

  • nix/home-manager
  • nix/flake
  • zsh
  • Modern CLI stack (fzf, rg, ...)
  • neovim
  • duckdb
  • Claude Code

以下昨年との差分です.

更新

  • nix: 最も大きな変更点です.元々 Makefile を使って再インストール時の手間を最小化するようにしていましたが,これを nix/home-manager に移行しました.再インストールは bootstrap.sh で nix 周りのツールをインストールしたのち home-manager switch するだけになりました.また,各プロジェクトの環境管理も nix/flake を使うようになりました.devbox などは使っていません.
  • mise: nix の導入によって不要になりました.特に mise そのものに不満があったわけではないですが,nix/flake にも不満がないのでツールの一貫性を重視して nix/flake に寄せています.
  • neovim: nixvim で環境を管理するようになりました.これまで lazy を使っていてしばしば update error を観測していたのですが,nixvim にしてからはそのようなエラーは観測していません.
  • Claude Code: さらに依存するようになりました.ただ,Mattermost 経由で使うようになったので,直接 claude コマンドを叩くことはあまりありません.
  • OpenCommit: 直接 Claude に git commit させるようになりました.

クライアント Mac

本体

先述の通り基本的に作業は開発サーバに SSH して行うので,手元のマシンは扱いやすいものならなんでもよいという基準で選んでいます.

ソフトウェアたち

  • nix/home-manager, nix/darwin
  • Alacritty
  • Vivaldi

更新

  • nix/home-manager, nix/darwin: 開発サーバと同じく環境を nix 系で管理するようにしました.home-manager の部分は開発サーバと共有されており,GUI に関わる部分を darwin で設定している感じです.
  • iTerm2 -> Alacritty: ターミナルエミュレータを更新しました.iTerm2 を使っていた理由が tmux -CC とのインテグレーションだったのですが,tmux を直接使う方が便利なことが多かったので,できるだけシンプルなターミナルエミュレータとして Alacritty を選びました.
  • VSCode: 大きな変化です.Claude Code にコードを書かせる機会が増えたので IDE の必要性が激減しました.残ったのは局所的な編集くらいで,これは neovim + LSP で十分と感じています.
  • Postman Yaak (updated): API クライアントです.これまでデファクトという理由で Postman を使っていましたが,この手のソフトウェアが login を要求するのが気持ち悪かったので Yaak にしました.
  • Mattermost: 実質的に Claude Code 用 GUI です.

試したけど不採用

  • WizTerm, Ghostty, ...: 不安定でした.

現状維持

  • Vivaldi: ブラウザです.昨年に Zen から移行して,まだ特に不満は出ていません.
  • Raycast: ローンチャです.Command + Space の drop-in replacement であり,今のところクリップボード履歴,ウインドウ位置調整,スリープ抑止くらいしか使っていません.

その他

AI依存開発 with Mattermost (new)

Claude Code を主要な開発用 AI として使っています.複数のプロジェクトを管理するために当初は各ディレクトリで claude --resume していたのですが,これにはいくつか不満がありました.

  1. 複数のディレクトリにまたがるプロジェクトを扱いづらい
  2. 同じディレクトリ下に複数のプロジェクトを持ちづらい
  3. どのプロジェクトで何をどこまでやったかを把握しづらい

特に 3 がわたしにとって重かったので,これを軽減することを考えて https://gitlab.com/tmaehara/mattermost-channels-multiplexer を作りました.やっていることは Mattermost の channelId に応じた tmux session を作って claude を立ち上げるだけですが,思ったよりも体験がよく,複数人とチャットするのと同程度までコンテキストスイッチの負担を下げられています.

プログラム言語選定 (updated)

相変わらず Rust, Python, TypeScript を使っています(+ 業務で Java).昨年の利用頻度は 6:3:1 くらいだったのですが,今年は TypeScript の頻度が増えて Python の頻度が減った結果 6:1:3 くらいになって Python と TypeScript が逆転しました.これは以下の2つの理由によります.

  1. 機械学習モデルを LLM/Rust で実装するようになった.わたしの Python の主要なユースケースは機械学習モデルの実装でしたが,重いモデル(バッチ処理など)は LLM API に置き換えられ,軽いモデル(ボトルネックが ML 部分以外)は Rust (Burn) で全部実装するようになったため,残ったユースケースが激減しました.
  2. フロントエンド開発を Leptos (Rust) から SolidJS (TypeScript) に切り替えた.Leptos は Rust のウェブフロントエンドフレームワークです.どうせフロントエンドは専門ではないからと趣味でフレームワークを選んできたのですが,JavaScript しかサポートしない外部サービスが結構あり,結局 JS を書かないといけないんだったら諦めてそっちに慣れていこう,ということで移行しました.