Raspberry Pi 4B に
ただ、
OpenRouter で
要は、AIエージェントを
この
なぜ家庭用AIエージェントが欲しかったか
単なる
でも、
た
どれも
生活情報の
- 給付や助成
- 医療・福祉関連の制度
- 保育・教育関連の締切
- 自治体独自の補助金
- 住宅・省エネ補助
- 防災や自治体独自のお知らせ
知らないと
こういう
ただし、
最終構成
最終的には、
Client PC
-> Tailscale
-> SSH port forwarding
-> Raspberry Pi 4B / NixOS
-> hermes-agent.service
-> API server: 127.0.0.1:8642
-> OpenRouter
-> Docker sandbox
Hermes API は
外から
ssh -N -L 8642:127.0.0.1:8642 <rpi-host>
手元PCからは、127.0.0.1:8642 に
http://127.0.0.1:8642/v1
この
Raspberry Pi 4Bを選んだ理由
Raspberry Pi 5 も
CP
ただ、
NixOS on ARM / Raspberry Pi のYES にYES は、
一方で、C* だった。
なので
LLM 推論は
- Hermes Agentを常駐させる
- Tailscaleを張る
- 定期実行の起点にする
- memory / skills / sessionsを保存する
- Docker sandboxを起動する
- OpenRouter APIを呼ぶ
この
Pi 5 は
NixOSを選んだ理由
NixOS を
自宅サーバは、
- どのパッケージを入れたか
- どのサービスを有効化したか
- どのユーザーを作ったか
- firewallで何を開けているか
- どこに秘密情報を置いているか
NixOS なら、configuration.nix やflake.nix に
今回のnixpkgs.url とsystem.stateVersion は
nixpkgs.url
-> どのnixpkgsからパッケージを取るか
system.stateVersion
-> このマシンの状態互換性をどのNixOS導入時点として扱うか
nixos-unstable をsystem.stateVersion をunstable のように
Tailscaleにした理由
最初は
Cloudflare Tunnel は、
それでも
理由は、
一方で、
- MagicDNS
- subnet route
- exit node
- ACL
- direct / DERP
- device key expiry
この
なので
- subnet routeは使わない
- exit nodeは使わない
- accept-dns=false
- accept-routes=false
- Tailscale SSHではなく通常OpenSSH
- SSHはTailscale経由だけ許可
Hermes の8642 は、
OpenRouterにした理由
LLM 推論は
Raspberry Pi 4B 上で
候補と
まずは
model = {
provider = "openrouter";
default = "google/gemma-4-26b-a4b-it";
};
ここで
秘密情報は
Docker backendにした理由
Hermes 本体も
最終的には、
Hermes本体:
NixOS / systemd service
Hermesが実行するコマンド:
Docker sandbox
Hermes 本体は
AIエージェントに
設定の
Docker image はnikolaik/python-nodejs:python3.13-nodejs24-bookworm にした。latest タグ
services.hermes-agent = {
enable = true;
addToSystemPackages = true;
environmentFiles = [
"/etc/hermes/env"
];
environment = {
HERMES_DOCKER_BINARY = "${pkgs.docker}/bin/docker";
};
settings = {
model = {
provider = "openrouter";
default = "google/gemma-4-26b-a4b-it";
};
terminal = {
backend = "docker";
docker_image = "nikolaik/python-nodejs:python3.13-nodejs24-bookworm";
docker_mount_cwd_to_workspace = false;
docker_forward_env = [];
container_cpu = 1;
container_memory = 3072; # about 3GB
container_persistent = true;
timeout = 180;
};
};
};
セキュリティ境界
今回の
- ラズパイのSSHはTailscale経由だけ
- Hermes APIは127.0.0.1のみ
- 外部からHermesへはSSH port forwarding
- OpenRouter API keyはNix storeへ入れない
- Tailscale auth keyもNix storeへ入れない
- SSH秘密鍵は1Password側で扱う
- Hermesのコマンド実行はDocker sandbox
- Docker socketはsandboxに渡さない
- docker_forward_env = []
- CPU / memory / PID制限を入れる
特に
/var/run/docker.sock を
実際にdocker inspect で
sudo docker inspect hermes-<id> \
--format '{{json .Mounts}}'
結果と
/var/run/docker.sock なし
capability も
sudo docker inspect hermes-<id> \
--format 'Privileged={{.HostConfig.Privileged}} CapAdd={{json .HostConfig.CapAdd}} CapDrop={{json .HostConfig.CapDrop}} SecurityOpt={{json .HostConfig.SecurityOpt}}'
確認時点の
Privileged=false
CapAdd=["CAP_CHOWN","CAP_DAC_OVERRIDE","CAP_FOWNER","CAP_SETGID","CAP_SETUID"]
CapDrop=["ALL"]
SecurityOpt=["no-new-privileges"]
Privileged=false、CapDrop=["ALL"]、no-new-privileges がCAP_SYS_ADMIN やNET_ADMIN のような
リソース制限も
sudo docker inspect hermes-<id> \
--format 'Memory={{.HostConfig.Memory}} NanoCPUs={{.HostConfig.NanoCpus}} PidsLimit={{.HostConfig.PidsLimit}}'
確認時点の
Memory=3221225472
NanoCPUs=1000000000
PidsLimit=256
8GB の
ハマりポイント
成功した
systemdのPATH
通常ユーザーでは
sudo -u hermes -H sh -lc 'id; command -v docker; docker version'
一方で、
Docker executable not found in PATH or common install locations
原因は、PATH から
NixOS では、HERMES_DOCKER_BINARY で
environment = {
HERMES_DOCKER_BINARY = "${pkgs.docker}/bin/docker";
};
HERMES_HOME
もう
普通にhermes config を
Config: /home/<user>/.hermes/config.yaml
Secrets: /home/<user>/.hermes/.env
しかし、
/var/lib/hermes/.hermes/config.yaml
/var/lib/hermes/.hermes/.env
service 側のHERMES_HOME とHERMES_MANAGED を
sudo -u hermes -H env \
HERMES_HOME=/var/lib/hermes/.hermes \
HERMES_MANAGED=true \
hermes config
よく
alias hermes-system='sudo -u hermes -H env HERMES_HOME=/var/lib/hermes/.hermes HERMES_MANAGED=true hermes'
Docker backendの起動タイミング
Docker backend は、
実際に
そのdocker ps だけを
Docker backend は、
推測で答えないでください。
必ずターミナルツールを使って
`cat /etc/os-release; python --version; node --version; npm --version; uname -m`
を実行し、出力を短く報告してください。
返答と
Debian 12 (bookworm), Python 3.13系, Node 24系, npm 11系, aarch64
その
sudo docker ps -a --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}'
NAMES IMAGE STATUS
hermes-<id> nikolaik/python-nodejs:python3.13-nodejs24-bookworm Up About a minute
今後の用途
基盤は
生活・役所ウォッチャー
まず試したい
毎週月曜朝に、自治体ページや公的情報を確認し、
新規・変更・締切・対象になりそうな制度をまとめる。
た
実申請や
技術インプット3件
毎日
なので、
対象:
- NixOS
- AI Agent
- LLM
- Ruby
- Elixir
- Go
出力は
生活ブリーフィング
週次の
- 予定
- 提出物
- 買い物
- 役所・教育関連
- 健診や手続きの確認
- 手続きタスク
- 忘れると困ること
ここも、
次はHermesに何を任せ、何を任せないか
AIエージェントは、
でも、
- どこまで任せるか
- どこから人間が確認するか
- どの情報にアクセスさせるか
- コマンド実行をどこに閉じ込めるか
- 秘密情報をどう扱うか
- 継続運用できるか
今回の
Raspberry Pi 4B、NixOS、Tailscale、Hermes Agent、OpenRouter、Docker sandbox。
次は、
まずは、