M1 Mac mini(16GB RAM)を、AIエージェントが24時間動き続ける専用マシンとして構築しています。
2日間かけて途中までの設定が整ったので、ここまでの記録をまとめます。
なぜ Mac mini なのか
クラウドサーバーを借りる選択肢もありますが、月額コストがかかります。手元に M1 Mac mini があるなら、これを活用しない手はありません。
16GBのメモリとApple Siliconの省電力性能。常時稼働させても電気代は月数百円程度。自分の手元にあるマシンで、自分だけのAIエージェントが動く。この「自分のインフラを持つ」感覚が、経営者としてはしっくりきます。
今回の構築環境
| 項目 | 値 |
|---|---|
| ハードウェア | M1 Mac mini 16GB / 1TB SSD |
| OS | macOS Tahoe(26.x) |
| 有線LAN | USB LANアダプター経由(en6) |
| ルーター | 192.168.1.1 |
⚠️ Mac miniにはEthernetポートがありますが、僕の環境では2.5GBのUSB LANアダプターを使っています。ネットワークインターフェース名が環境によって異なるので、まず
networksetup -listallnetworkservicesで自分のインターフェース名を確認してください。
Day 1 — 土台づくり
macOSのクリーンセットアップから始めて、開発に必要な道具を一つずつ入れていきました。
1. Rosetta 2のインストール
M1(Apple Silicon)でIntel用アプリを動かすための互換レイヤーです。Homebrewの一部パッケージで必要になります。
softwareupdate --install-rosetta --agree-to-license
2. Homebrewのインストール
macOSのパッケージマネージャーです。開発ツールをコマンド一発で入れられるようになります。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
インストール後、画面に表示される指示に従って、PATHを通します。
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
正しくインストールされたか確認します。
brew --version
3. FileVault(ディスク暗号化)をオンにする
Mac miniが盗まれた場合に、ディスクの中身を読めないようにします。常時稼働マシンだからこそ、ここは最初にやっておきたいポイントです。
sudo fdesetup enable
実行するとリカバリーキーが表示されます。このリカバリーキーは必ず安全な場所に保存してください。 紛失するとデータを復元できなくなります。ドキドキしますが、ちゃんとメモしておけば大丈夫です。
有効化の状態を確認するには以下のコマンドです。
fdesetup status
FileVault is On.と表示されればOKです。
4. Time Machineで暗号化バックアップを設定
外付けHDD(今回は3TB HDD)を接続した状態で設定します。
⚠️ Time Machineの暗号化バックアップは、GUIから設定するのが確実です。 macOS Tahoeでは、コマンドラインからの暗号化オプション指定の挙動が変わっています。「システム設定」→「一般」→「Time Machine」から、バックアップディスクを追加する際に「バックアップを暗号化」にチェックを入れてください。
コマンドラインで設定する場合は以下の手順です。
まず、接続されているディスクを確認します。
diskutil list external
外付けHDDのボリューム名を確認したら、バックアップ先に設定します。
sudo tmutil setdestination -a /Volumes/外付けHDDのボリューム名
バックアップを有効にして開始します(初回は時間がかかります)。
sudo tmutil enable
sudo tmutil startbackup
5. Tailscale(VPN)のインストール
外出先からMac miniに安全にアクセスするためのVPNサービスです。これがあると、カフェからでも自宅のMac miniにSSH接続できるようになります。
brew install --cask tailscale
インストール後、アプリケーションフォルダからTailscaleを起動して、アカウントにサインインします。
接続状態を確認するコマンドです。
tailscale status
Mac miniのTailscale IPアドレスを確認します。100.x.x.x 形式のアドレスが表示されます。
tailscale ip -4
僕の環境では
100.103.35.79が割り当てられました。この値は環境ごとに異なります。
6. SSHの有効化と鍵認証の設定
Mac mini側:リモートログインを有効にする
sudo systemsetup -setremotelogin on
有効になったか確認します。
sudo systemsetup -getremotelogin
Remote Login: Onと表示されればOKです。
MacBook Pro側:SSH鍵を生成する
MacBook Proのターミナルで以下を実行します。
ssh-keygen -t ed25519 -C "[email protected]"
パスフレーズを聞かれます。セキュリティのため設定することをおすすめします。空Enterでスキップも可能です。
MacBook Pro側:公開鍵をMac miniに転送する
Tailscale経由で転送します。
ssh-copy-id ユーザー名@100.x.x.x
初回はパスワード認証が求められます。これ以降はパスワードなしでSSH接続できるようになります。
接続テスト
MacBook Proから以下を実行して、パスワードなしで接続できることを確認します。
ssh ユーザー名@100.x.x.x
ここまでで「安全に、どこからでもアクセスできるマシン」の土台ができました。ほっ、とひと安心。
Day 2 — 常時稼働と利便性の整備
翌朝、MacBook ProからSSH接続しようとしたら——つながらない。Operation timed out で 100% packet loss。
あっ、Mac miniがスリープしてる。
常時稼働マシンなのにスリープするとは、なんでやねん。macOSのデフォルト設定では、操作がないとスリープに入るんですよね。
7. スリープを完全に無効化する
以下のコマンドで、スリープに関する設定をすべて無効にします。-a はすべての電源状態(バッテリー・AC電源)に適用するオプションです。
sudo pmset -a sleep 0 # システムスリープ無効
sudo pmset -a disksleep 0 # ディスクスリープ無効
sudo pmset -a displaysleep 0 # ディスプレイスリープ無効
sudo pmset -a powernap 0 # Power Nap無効(スリープ中の通信を防止)
SSH接続中にスリープしないようにする設定も入れます。
sudo pmset -a ttyskeepawake 1
ネットワークアクセスで復帰する設定(Wake on LAN)を有効にします。
sudo pmset -a womp 1
設定が反映されたか確認します。
pmset -g custom
以下の値になっていればOKです。
sleep= 0disksleep= 0displaysleep= 0powernap= 0ttyskeepawake= 1womp= 1
8. 電源復帰時の自動再起動
停電後に電源が戻ったら自動で起動する設定です。
sudo pmset -a autorestart 1
フリーズ時の自動再起動も有効にします。
sudo systemsetup -setrestartfreeze on
確認コマンドです。
sudo systemsetup -getrestartpowerfailure
sudo systemsetup -getrestartfreeze
両方
Onと表示されればOKです。これで本当の意味での常時稼働になりました。
9. LAN IPアドレスの固定
DHCPだとIPアドレスが変わる可能性があるので、固定します。
まず、自分の環境のネットワークサービス名を確認します。ここが環境によって違うので要注意です。
networksetup -listallnetworkservices
僕の環境では、USB LANアダプター経由なので
USB 10/100/1G/2.5G LANと表示されました。Mac mini内蔵の場合はEthernet、Wi-Fiの場合はWi-Fiになります。以降のコマンドでは、ここで表示されたサービス名をそのまま使ってください。
IPアドレスを固定します(192.168.xxx.xxxに固定する例)。
sudo networksetup -setmanual "USB 10/100/1G/2.5G LAN" 192.168.xxx.xxx 255.255.255.0 192.168.xxx.xxx
⚠️ サービス名・IPアドレス・サブネットマスク・ルーターアドレスは、あなたのネットワーク環境に合わせて変更してください。ルーターのDHCP割り当て範囲外のアドレスを選ぶのがポイントです。
DNSサーバーも設定します。
sudo networksetup -setdnsservers "USB 10/100/1G/2.5G LAN" 192.168.1.1 8.8.8.8
設定を確認します。
networksetup -getinfo "USB 10/100/1G/2.5G LAN"
IP address: 192.168.xxx.xxxと表示されればOKです。
10. SMBファイル共有を有効にする
MacBook ProのFinderからMac miniのファイルに直接アクセスできるようにします。
⚠️ macOS Tahoeでは、GUIから有効化するのが確実です。 コマンドラインでの
launchctl loadは新しいmacOSではうまく動作しないことがあります。
設定手順(GUIで行います):
- 「システム設定」→「一般」→「共有」を開く
- 「ファイル共有」をオンにする
- 共有したいフォルダを追加(必要に応じて)
- アクセス権限を設定
MacBook ProからFinderで接続
Finderのメニューバーから「移動」→「サーバへ接続」(ショートカット:⌘K)で以下を入力します。
smb://192.168.xxx.xxx
ユーザー名とパスワードを入力して接続。Finderのサイドバーに表示されれば成功です。
11. VNC画面共有を有効にする
MacBook ProからMac miniのデスクトップを操作できるようにします。GUIでの設定変更に必要です。
設定手順(GUIで行います):
- 「システム設定」→「一般」→「共有」を開く
- 「画面共有」をオンにする
- 「アクセスを許可」を「すべてのユーザ」に設定
⚠️ ここでハマりました。 ポート5900は開いているのに「画面共有は許可されていません」と弾かれ続けたんです。
ドキドキしながら
launchctlでの再読み込み、overrides.plistの削除、VNCパスワード設定のオンオフ……色々試しましたが、全部ダメ。結局の解決策は「画面共有」を一度オフ → 数秒待つ → 再度オンにするだけでした。
なんでやねん。
macOS Tahoeでは、コマンドラインで深追いする前にGUIの再トグルを最初に試すべきだと学びました。こういう「えっ、それだけ?」という解決策、意外と多いんですよね。
MacBook ProからVNC接続
Finderのメニューバーから「移動」→「サーバへ接続」(⌘K)で以下を入力します。
vnc://192.168.xxx.xxx
または、Spotlight(⌘ + スペース)で「画面共有」と入力してアプリを直接起動し、IPアドレスを入力しても接続できます。
設定の確認まとめ
すべての設定が正しく反映されているか、まとめて確認するコマンドです。Mac miniのターミナルで実行してください。
echo "=== スリープ設定 ==="
pmset -g custom
echo ""
echo "=== 電源復帰設定 ==="
sudo systemsetup -getrestartpowerfailure
sudo systemsetup -getrestartfreeze
echo ""
echo "=== リモートログイン(SSH) ==="
sudo systemsetup -getremotelogin
echo ""
echo "=== FileVault ==="
fdesetup status
echo ""
echo "=== ネットワーク設定 ==="
# ↓ 自分のネットワークサービス名に置き換えてください
networksetup -getinfo "USB 10/100/1G/2.5G LAN"
echo ""
echo "=== Tailscale ==="
tailscale status
各項目が期待どおりの値になっていれば、常時稼働サーバーとしての基盤は完成です。
次にやること
セキュリティ強化として、ファイル共有(SMB・ポート445)と画面共有(VNC・ポート5900)を、Tailscale経由とLAN内からのアクセスのみに制限するファイアウォール設定を行います。
macOSのアプリケーションファイアウォールはGUIから有効化できますが、ポート単位の制御には pf(Packet Filter)を使います。
# 1. ルールファイルを作成
sudo tee /etc/pf.anchors/tailscale-restrict << 'EOF'
block in quick proto tcp from ! {100.64.0.0/10, 192.168.1.0/24} to any port 445
block in quick proto tcp from ! {100.64.0.0/10, 192.168.1.0/24} to any port 5900
EOF
# 2. pf.conf にアンカーを追加
sudo cp /etc/pf.conf /etc/pf.conf.backup
echo 'anchor "tailscale-restrict"' | sudo tee -a /etc/pf.conf
echo 'load anchor "tailscale-restrict" from "/etc/pf.anchors/tailscale-restrict"' | sudo tee -a /etc/pf.conf
# 3. 構文チェック → 適用 → 有効化
sudo pfctl -n -f /etc/pf.conf && echo "構文OK"
sudo pfctl -f /etc/pf.conf && sudo pfctl -e
# 4. ルールが適用されたか確認
sudo pfctl -a tailscale-restrict -s rules
100.64.0.0/10はTailscaleが使うアドレス範囲、192.168.1.0/24はLANの範囲です。これにより、外部からのSMB・VNCアクセスをブロックしつつ、Tailscale経由とLAN内からのアクセスは許可します。
その後、いよいよ本題のOpenClaw(自律型AIエージェント)のセットアップに入ります。ここからが楽しみなところです。
構築してみて思うこと
「AIを使う」というと、ChatGPTやClaudeのチャット画面を開くことを思い浮かべる方が多いのではないでしょうか。
でも、自分専用のマシンにAIの実行環境を作るというのは、それとはまったく違う体験です。
チャットで「聞く」のではなく、AIが自分のマシンで「動く」。指示を出せば、自分のファイルを読み、自分のネットワーク上で処理を実行してくれます。
中小企業の経営者にとって、クラウドに全てを預けるのではなく、自分の手元にインフラを持つ選択肢があるということ。これからの時代、大きな意味を持つと考えています。
興味のある方は、この記事のコマンドを順番に実行してみてください。お試しください。
記事は続きます。






