【Ollama OSS Server】Mac mini 上で Ollama と Docker Web アプリ群を動かし Tailscale で安全に個人リモート接続する設計と実装:2026/7/21

Docker

エグゼクティブサマリー

Mac mini を自宅や小規模オフィスの常設ノードとして使い、Ollama をネイティブで動かしつつ、複数の Web アプリは Docker で分離して運用し、外部からの個人アクセスは Tailscale に限定する構成は、2026年時点でもかなり合理的です。最大の理由は、macOS 上の Ollama は Apple GPU 向けに Metal を使え、Apple Silicon では MLX 系最適化も進んでいる一方、Docker Desktop on macOS では Ollama コンテナに GPU パススルーが使えないためです。したがって、Ollama はネイティブ、Web アプリは Dockerという分離が、性能・保守性・セキュリティのバランスが最もよい設計になります。 

Tailscale は、WireGuard ベースの暗号化トンネルを使って tailnet と呼ばれる P2P メッシュを作りますが、データプレーンを中央サーバー経由にしない点が重要です。coordination server は認証やピア発見を助ける制御プレーンであり、通常の通信データ自体は端点間の直接通信か、必要時のみ DERP リレーを通る設計です。このため、インターネットへ 80/443 や 11434 を公開しなくても、認証済みの自分の端末から安全に Mac mini へ到達できます。 

本稿の推奨実装は次のとおりです。macOS は最新セキュリティ更新を適用した対応版を使い、スリープを抑止し、Docker は Docker Desktop か Colima のいずれかを選び、Ollama はネイティブで常駐、Web アプリ群は Compose で管理、Tailscale は macOS Standalone 版を導入して MagicDNS・ACL・必要に応じて subnet routing / exit node を設定する、というものです。Tailscale の macOS Standalone 版は公式が最も推奨しており、App Store 版より制約が少なく、CLI-only 版より運用しやすいです。 

なお、どの Web アプリを載せるか、どの Ollama モデルを使うかは未指定です。本稿ではそこは未指定として扱い、実装例は Traefik + PostgreSQL + Redis + example app の汎用スタックで示します。Ollama のモデルは用途に応じて選ぶべきで、コーディング支援、一般チャット、埋め込み生成では最適モデルが異なります。Ollama はモデルの保存先を変更でき、API は既定で http://localhost:11434/api に提供されます。 

全体アーキテクチャと設計判断

Mac mini でこの用途を組むときの基本方針は、**ホスト OS が「AI ランタイム層」、Docker VM が「アプリケーション分離層」、Tailscale が「安全な到達性の層」**を担う、という分担です。Docker Desktop は macOS 上で Docker VM に CPU・メモリ・ディスクを割り当てて動作し、Colima や Podman も同様に macOS 上ではゲスト Linux VM を使います。したがって、コンテナを直接 macOS カーネル上で動かしているわけではないこと、リソース競合は host と VM の二重管理になることを前提に設計する必要があります。 

その前提で性能面を考えると、Ollama を Docker コンテナに入れる構成は macOS では移植性は高いが、Apple GPU 加速を使えないため、Mac mini の価値を十分に引き出せません。Ollama 公式 FAQ は、Docker Desktop on macOS では GPU パススルーやエミュレーションがないため GPU acceleration は使えないと明示しています。一方でネイティブ Ollama は Apple GPU を Metal で使え、Apple Silicon では MLX 系の改善が継続しているため、本気で常設 LLM ノードにするならネイティブ Ollama 一択です。 

Tailscale 側の判断も重要です。macOS では Standalone / App Store / open-source tailscaled の3系統がありますが、公式は Standalone variant を最も推奨しています。理由は、App Store 版には sandbox 起因の制約があり、CLI-only の open-source tailscaled 版は上級管理者向けで、しかも macOS では exit node を「広告する」ことはできても「利用する」側としては部分制限があるためです。自宅の Mac mini をサーバー兼ゲートウェイ兼クライアント候補として扱うなら、Standalone variant を使うのが妥当です。 

以下の図は、本稿で前提にするネットワークの流れです。

WireGuard P2P
または DERP relay認証・鍵配布・ピア発見認証・鍵配布・ピア発見直接通信不可時のみ中継直接通信不可時のみ中継自分のノートPC / iPhone
Tailscale clientMac mini macOSネイティブ Ollama
localhost:11434Docker VMTraefik / NginxWeb AppPostgreSQLRedisTailscale coordination serverDERPShow code

この構成のポイントは、coordination server は通信データを中継せず、制御プレーンだけを担当すること、できる限り P2P 直結し、直結できない場合にだけ DERP を使うことです。Tailscale は WireGuard ベースの暗号化 P2P を作り、tailnet を形成します。DERP は NAT 越えやフォールバック用の安全なリレーで、遅延やスループットの面では通常、直結より不利です。 

macOS の前提条件と Ollama・Docker スタックの構築

まず OS 前提です。Tailscale の現行クライアントは macOS Monterey 12.0 以降を要求し、Ollama の macOS ダウンロードページは macOS 14 Sonoma 以降を要求しています。Docker Desktop は 現行の macOS とその2つ前のメジャー版をサポートします。したがって、この3者を同時に満たす現実的な下限は macOS 14 以降で、実運用では Apple の最新セキュリティアップデートが当たる版を推奨します。 

macOS サーバー用途では、自動スリープ抑止ネットワークアクセスでの復帰が重要です。Apple はデスクトップ Mac の Energy 設定で、“Prevent automatic sleeping when the display is off” と “Wake for network access” を設定できると案内しています。ヘッドレス運用の Mac mini でこれを無効のままにすると、Tailscale 以前にホスト自体が眠ってしまい、遠隔到達性が不安定になります。 

最低限の前提セットアップ例は次のとおりです。xcode-select --install は Command Line Tools を入れるための定番で、Apple Silicon 上のビルド周辺や Homebrew 利用でほぼ必須です。Ollama の開発ドキュメントでも、macOS では Clang を使い、MLX Metal を使う場合は Xcode と Metal toolchain が必要だとしています。 

bashCopy# Command Line Tools
xcode-select --install

# Homebrew(未導入なら)
# 公式インストールスクリプトを使用
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 確認
brew --version
sw_vers
uname -m

Docker ランタイムの選択は、互換性と GUI を取るなら Docker Desktop、軽量性と OSS を優先するなら Colima、rootless / daemonless 的な思想を優先するなら Podmanという整理になります。Docker Desktop は Compose 同梱・互換性最優先で最も無難ですが、企業での商用利用にはライセンス条件があります。Colima は MIT ライセンスで、Apple Silicon と Intel macOS をサポートし、デフォルトで Docker ランタイムを使い、ポート転送やボリュームマウントも扱えます。Podman は Apache 2.0 で、macOS では Podman machine として VM を管理します。 

Docker Desktop を使う場合は公式の DMG 導入がもっとも確実です。Docker Desktop on Mac は 4GB 以上の RAM を要求し、CPU・メモリ・ディスク上限は Settings の Resources で調整できます。メモリ割当の既定はホストの 50% で、マルチコンテナ構成が重いときは増やすよう Docker 公式も案内しています。 

bashCopy# Docker Desktop の公式 CLI インストール例
sudo hdiutil attach Docker.dmg
sudo /Volumes/Docker/Docker.app/Contents/MacOS/install
sudo hdiutil detach /Volumes/Docker

# 動作確認
docker version
docker compose version

Colima を使う場合は、次のような導入が現実的です。Colima はデフォルト VM が 2CPU / 2GiB / 100GiB なので、Ollama をネイティブに寄せる本稿の構成でも、Web アプリが DB を含むなら 4CPU / 8–16GiB / 100GiB 以上へ増やすほうが安定します。 

bashCopybrew install colima docker
colima start --cpu 4 --memory 16 --disk 160
docker context list
docker ps

Podman を使う場合は、公式は macOS でインストーラ利用を推奨し、Homebrew 版は community-maintained である点に注意を促しています。Podman は Docker API client を受けられるため、既存の Docker ベースツールとの互換性もありますが、Compose 周りや既存ドキュメント量では Docker Desktop / Colima のほうが扱いやすい場面が多いです。 

Ollama は ネイティブ導入を推奨します。公式 macOS ドキュメントでは、ollama.dmg をマウントしてアプリを Applications に入れ、初回起動時に CLI が PATH に無ければ /usr/local/bin へのリンク作成を促す、とされています。モデル保存は既定で ~/.ollama/models で、数十〜数百 GB に達しうるため、Mac mini の内蔵 SSD 容量を先に決めることが大切です。保存先を変えたい場合は OLLAMA_MODELS が使えます。 

bashCopy# ネイティブ Ollama 導入後の基本確認
ollama serve
ollama pull gemma4
ollama ls
ollama ps

# API 動作確認
curl http://localhost:11434/api/generate -d '{
  "model": "gemma4",
  "prompt": "Ping"
}'

Ollama は既定では 127.0.0.1:11434 にバインドします。LAN や Tailscale 経由で直接 API を受けたいなら OLLAMA_HOST を変更しますが、その瞬間に攻撃面も広がるので、個人用途ではまず localhost のまま始め、必要時のみ Nginx などのリバースプロキシを前段に置くのが安全です。またブラウザ拡張や Web UI から CORS が必要なときは OLLAMA_ORIGINS を調整します。Ollama の FAQ は、Nginx を通した公開の例も示しています。 

ネイティブ Ollama の launchd 常駐例

macOS の常駐ジョブ管理は launchd / launchctl が基本です。Apple も launchd を使ってスクリプトやデーモンを管理する方法を案内しています。Ollama 側は ollama serve でサーバーを起動し、環境変数で OLLAMA_HOST や OLLAMA_MODELS を設定できます。これを組み合わせると、ログイン後に自動起動する LaunchAgent、あるいは上級者向けに LaunchDaemon 化が可能です。 

以下はユーザーコンテキストで動かす LaunchAgent の例です。headless 機として安定させたいなら、Mac mini を常時ログイン状態にするか、CLI-only 版やより厳密な daemons 設計へ寄せます。これは Apple と Ollama の仕様に基づく実装例です。

xmlCopy<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>com.example.ollama</string>

    <key>ProgramArguments</key>
    <array>
      <string>/Applications/Ollama.app/Contents/Resources/ollama</string>
      <string>serve</string>
    </array>

    <key>EnvironmentVariables</key>
    <dict>
      <key>OLLAMA_HOST</key>
      <string>127.0.0.1:11434</string>
      <key>OLLAMA_MODELS</key>
      <string>/Users/youruser/External/ollama-models</string>
      <key>OLLAMA_KEEP_ALIVE</key>
      <string>30m</string>
      <key>OLLAMA_NO_CLOUD</key>
      <string>1</string>
    </dict>

    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>

    <key>StandardOutPath</key>
    <string>/Users/youruser/Library/Logs/ollama.stdout.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/youruser/Library/Logs/ollama.stderr.log</string>
  </dict>
</plist>
bashCopymkdir -p ~/Library/LaunchAgents
cp com.example.ollama.plist ~/Library/LaunchAgents/
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.ollama.plist
launchctl enable gui/$(id -u)/com.example.ollama
launchctl kickstart -k gui/$(id -u)/com.example.ollama

Docker Web アプリ群の Compose 例

Docker Compose は services / networks / volumes をまとめて宣言でき、Docker Desktop には Compose が同梱されます。本稿では Web アプリ種別が未指定なので、Traefik + PostgreSQL + Redis + example app の汎用的なスタックで示します。ここでは DB/Redis を外部公開せず、公開面は reverse proxy のみという原則を取ります。 

yamlCopyservices:
  traefik:
    image: traefik:v3.1
    command:
      - --api.dashboard=false
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - edge
      - appnet
    restart: unless-stopped

  postgres:
    image: postgres:16
    environment:
      POSTGRES_DB: appdb
      POSTGRES_USER: appuser
      POSTGRES_PASSWORD: change-this
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - appnet
    restart: unless-stopped

  redis:
    image: redis:7
    command: ["redis-server", "--appendonly", "yes"]
    volumes:
      - redisdata:/data
    networks:
      - appnet
    restart: unless-stopped

  example-app:
    image: ghcr.io/example/example-app:latest
    environment:
      APP_PORT: "8080"
      DATABASE_URL: postgresql://appuser:change-this@postgres:5432/appdb
      REDIS_URL: redis://redis:6379/0
      OLLAMA_BASE_URL: http://macmini.example.ts.net:11434
    user: "1000:1000"
    labels:
      - traefik.enable=true
      - traefik.http.routers.example.rule=Host(`macmini.example.ts.net`) && PathPrefix(`/app`)
      - traefik.http.routers.example.entrypoints=websecure
      - traefik.http.services.example.loadbalancer.server.port=8080
    depends_on:
      - postgres
      - redis
    networks:
      - appnet
    restart: unless-stopped

volumes:
  pgdata:
  redisdata:

networks:
  edge:
  appnet:
    internal: true
bashCopymkdir -p ~/srv/stack
cd ~/srv/stack
docker compose up -d
docker compose ps
docker compose logs -f

この例で重要なのは、PostgreSQL と Redis は appnet の内部ネットワークに閉じ込め、ホスト側へポートを出していないこと、Traefik だけが 80/443 を受けること、そして アプリコンテナは非 root UID で動かすことです。Docker Desktop on Mac は unprivileged user で動き、管理者権限が必要なのは symlink 作成や 1024 未満ポート bind など限定的ですが、コンテナ内 root は host root ではないとはいえ、VM 内では強い権限を持つため、アプリコンテナを非 root で設計する価値は依然として高いです。 

Ollama を直接リバースプロキシしたい場合は、Ollama FAQ の Nginx 例をベースに、ローカルホスト向けの単純な proxy を置けます。以下は実装例です。Tailscale 専用運用なら、公開 DNS を使わず MagicDNS 名やプライベート DNS 名に置き換えるのが自然です。 

nginxCopyserver {
    listen 8081;
    server_name macmini.example.ts.net;

    location / {
        proxy_pass http://127.0.0.1:11434;
        proxy_set_header Host 127.0.0.1:11434;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

macOS 固有のポート・ファイアウォール注意点

macOS の組み込み Firewall は、不要な受信接続を防ぐためのアプリケーションファイアウォールです。設定は System Settings → Network → Firewall から行え、個別アプリやサービスごとに allow / block を設定できます。したがって、最低限 Tailscale、Docker Desktop、必要なら Nginx / Traefik 相当の受信アプリを明示的に確認してください。 

この構成での推奨ポート方針は次のようになります。80/443 は reverse proxy 用、11434 は必要時のみ、5432 と 6379 は外部公開しないというものです。Tailscale 自体は NAT 越えと DERP を使うため、通常は自宅ルーターでの追加ポートフォワードを不要にできます。つまり、ルーター開放より Tailscale 認証済みオーバーレイを優先するのが本稿の前提です。 

Tailscale の原理と macOS でのセットアップ

Tailscale の中核は WireGuard ベースの暗号化 P2P 接続です。WireGuard 自体は L3 トンネルで、公開鍵とトンネル内アドレスを結びつける発想を持ち、単純で監査しやすい設計を目指しています。Tailscale はその上に、認証、ピア探索、ポリシー、鍵管理、リレー、DNS を載せた形だと理解すると整理しやすいです。 

Tailscale では、coordination server がユーザー認証と端末の公開鍵登録、ピア発見を担い、データトラフィック自体はそこを通らないのがポイントです。端末ごとに node key が生成され、その公開鍵が control plane に送られ、認証後に「このデバイス」「このユーザー」と結びつけられます。つまり、**Tailscale は“IP ベースの VPN”というより、“アイデンティティで制御する暗号化オーバーレイ”**として理解するほうが実態に近いです。 

NAT 越えは、まず 直接接続を試み、無理なら DERP を使います。DERP は Designated Encrypted Relay for Packets で、接続確立の支援直結不可時のフォールバック中継の二役を持ちます。DERP でも中継されるのは暗号化済み WireGuard パケットで、Tailscale は DERP サーバーが中身を見られないと説明しています。ただし性能は通常、直結より不利です。だから運用時は tailscale status で active; direct か relay かを確認し、tailscale netcheck で UDP 到達性と最寄り DERP を見るのが基本になります。 

ACL は deny-by-default の方向性で、誰がどの端末・ポートへ行けるかを huJSON 形式で定義します。exit node はここが少し癖があり、exit node 装置そのものに到達できても、それだけでは “internet gateway として使う権限” にはならず、autogroup:internet 向けのルールが必要です。これは Tailscale 運用で非常に詰まりやすい点です。 

macOS への Tailscale 導入

macOS では Tailscale Standalone 版を推奨します。現行版は Monterey 12.0 以降が必要で、パッケージサーバー版、Mac App Store 版、CLI-only 版の3方式があります。サーバー寄りの利用では、Apple ID 不要、機能制約が少ない、更新制御しやすいという理由で Standalone が最有力です。 

bashCopy# インストール後の基本確認
tailscale version
tailscale ip -4
tailscale status

インタラクティブ認証は GUI からでも CLI からでもできます。CLI を使うなら、まず通常の tailscale up でブラウザ認証を通し、その後 tailscale set で設定を足していく形が安全です。auth key を使う自動認証も可能で、auth key はそれを作ったユーザーとしてデバイスを登録するので、タグ併用の有無でアイデンティティの扱いが変わります。使い捨ての one-off キーは自動プロビジョニングに向いています。 

bashCopy# まずは対話的に参加
tailscale up

# 参加後に状態確認
tailscale ip -4
tailscale status
tailscale netcheck
bashCopy# auth key を使う非対話セットアップ例
# 実運用ではキーを shell history に残さないこと
tailscale up \
  --auth-key=tskey-auth-xxxxxxxxxxxxxxxx \
  --hostname=macmini-ollama \
  --accept-dns=true

device keys と ACL の実用設定

node key はデバイス認証の核で、control plane に公開鍵が渡され、認証後にユーザーとデバイスへ関連付けられます。ここでの実務上のポイントは、端末ごとの人間ユーザー権限と、サーバー役のタグ付き端末権限を混ぜないことです。Mac mini をサーバー役として扱うなら、タグで役割を切り、ACL は人間ユーザー → タグ付きサーバー の向きで組むほうが読みやすくなります。 

以下は、個人 tailnet で Mac mini を tag:macmini として扱い、管理ユーザーだけが広くアクセスでき、exit node 利用も明示的に許可するサンプル ACL です。これは ACL / tags / tests / autogroup:internet の考え方を組み合わせた実践例です。実際には管理画面のポリシー検証で調整してください。 

jsonCopy{
  "groups": {
    "group:admin": ["unikarei@gmail.com"]
  },

  "tagOwners": {
    "tag:macmini": ["group:admin"],
    "tag:web": ["group:admin"]
  },

  "acls": [
    {
      "action": "accept",
      "src": ["group:admin"],
      "dst": ["tag:macmini:*", "tag:web:*"]
    },
    {
      "action": "accept",
      "src": ["group:admin"],
      "dst": ["autogroup:internet:*"]
    }
  ],

  "tests": [
    {
      "src": "unikarei@gmail.com",
      "accept": ["tag:web:443", "tag:macmini:11434", "autogroup:internet:443"]
    }
  ]
}

subnet routing と exit node の設定

subnet router は、Tailscale クライアントが入らない LAN 内機器へ橋渡しする機能です。たとえば Mac mini の背後に NAS やプリンタや別サブネットの DB がある場合に有効です。CLI では --advertise-routes= を使い、管理画面でその route を承認します。macOS クライアントは Standalone / App Store 版ともに accept-routes が既定で有効なので、他端末側で route を受けてしまう前提で設計してください。重複サブネットがある環境では注意が必要です。 

bashCopy# 例: 自宅 LAN 192.168.10.0/24 を広告
tailscale set --advertise-routes=192.168.10.0/24

# 状態確認
tailscale status

exit node は、端末のデフォルトルート 0.0.0.0/0 / ::/0 を Mac mini 経由にする機能です。パブリック Wi‑Fi 上での全通信保護や、自宅側出口 IP でのアクセス、個人プライバシー向上に有効です。利用者端末側は明示 opt-in、出口側端末は明示 advertise、さらに管理者承認が必要です。 

bashCopy# Mac mini を exit node として広告
tailscale set --advertise-exit-node

# 他端末から一覧確認
tailscale exit-node list

# 他端末から使用
tailscale set --exit-node=macmini-ollama --exit-node-allow-lan-access=true

# 解除
tailscale set --exit-node=

MagicDNS と DNS 設定

MagicDNS を有効にすると、tailnet 内の各端末へ machine.tailnet.ts.net 形式の FQDN が付き、検索ドメインも入るので短い機械名でも到達できるようになります。Tailscale の DNS 解決は Quad100 (100.100.100.100) をローカル stub resolver として使い、MagicDNS の名前をローカル解決しつつ、必要な問い合わせを上流へ転送します。Quad100 自体はローカルで動作し、その DNS resolver はローカルでログを持ちませんが、転送先 nameserver ではログされうる点がプライバシー観点で重要です。 

bashCopy# IP と名前の整合確認
tailscale ip -4
ping macmini-ollama
ping macmini-ollama.<your-tailnet>.ts.net

セキュリティ、プライバシー、バックアップ、保守

この構成のセキュリティの要点は、公開インターネットにサービスを直接出さないことです。Tailscale は認証済み端末だけを private network に参加させ、ACL で到達性を絞れますが、アプリ側の攻撃面が消えるわけではありません。だから、DB/Redis は internal network に閉じる、reverse proxy だけを入口にする、Ollama は最初は localhost バインドのまま始める、コンテナは非 root で動かすという原則が重要です。Docker Desktop on Mac は unprivileged user 設計ですが、だからといってコンテナ内権限を雑にしてよいわけではありません。 

秘密情報の扱いでは、DB パスワードや API キーを Compose YAML に直書きせず、少なくとも .env か外部 secret 管理に寄せるべきです。加えて、docker compose logs やアプリログに機密が出ないようにする必要があります。Tailscale 側もログには注意が必要で、各 Tailscale agent は中央ログサーバーへログを送信し、configuration audit logs は全プランで有効、直近 90 日保持です。一方、network flow logs は接続メタデータを扱うが、トラフィックの実データ内容は記録しないとされています。 

プライバシー面では、Ollama はローカル実行時にはプロンプトや応答を Ollama 側が見ないと FAQ で説明しています。ただし cloud-hosted models を使う場合は別扱いです。完全ローカルを優先するなら、OLLAMA_NO_CLOUD=1 か server.json の disable_ollama_cloud を有効にして cloud 機能を切るのが安全です。 

バックアップは、DB・コンテナイメージ・ボリューム・Ollama モデルを別々に考える必要があります。Docker 公式は、コンテナイメージは docker push または docker image save、volume データは別途バックアップ、Docker Desktop 全体が壊れた場合は macOS では Docker.raw を退避するやり方を案内しています。Ollama 側はモデル保存先が ~/.ollama/models か OLLAMA_MODELS で明示されるため、そこを file-level backup すればよいです。 

bashCopy# PostgreSQL ダンプ
docker compose exec -T postgres pg_dump -U appuser appdb | gzip > backup/appdb-$(date +%F).sql.gz

# イメージ退避
docker image save -o backup/stack-images-$(date +%F).tar traefik:v3.1 postgres:16 redis:7

# Ollama モデル退避
rsync -aH --delete ~/.ollama/models/ /Volumes/backup/ollama-models/

# Docker Desktop VM 全体のバックアップ対象
# ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw

保守は、macOS 更新、Docker 更新、イメージ更新、Tailscale 更新、Ollama 更新、モデル見直しを分けて実施するのがよいです。特に Docker Desktop は 2025–2026 にかけてセキュリティ更新が複数出ているため、古い版を放置すべきではありません。Tailscale Standalone 版は App Store 審査待ちがなく更新しやすく、公式もその点を利点として挙げています。 

メリットとデメリットの比較

項目説明影響度対策
Ollama をネイティブ化Apple GPU の Metal 利用が可能で、Docker Desktop on macOS の GPU 非対応を回避できる。 Ollama はホスト、Web アプリは Docker に分離する。
Docker Desktop の利便性Compose 同梱で最も互換性が高いが、商用利用は条件付きで有償になりうる。 個人用途なら無償範囲を確認。組織用途なら Colima / Podman も検討。
Colima / Podman の OSS 性Colima は MIT、Podman は Apache 2.0 で、macOS ではどちらも VM ベース。 GUI より OSS 優先なら有力。ただし互換性検証を先に行う。
Tailscale の DERP フォールバック直結できない環境でも到達性は高いが、DERP は通常 direct より遅い。 tailscale netcheck と tailscale status で relay 率を監視し、睡眠・NAT・UDP を見直す。
macOS スリープ自動スリープのままだと常設サーバーとして不安定になる。 “Prevent automatic sleeping …” と “Wake for network access” を有効化。
ログとプライバシーTailscale は中央ログ基盤を持ち、設定監査ログは常時有効。Ollama はローカル実行時にはデータを見ないが cloud 機能は別。 Tailscale のログ方針を理解し、Ollama は OLLAMA_NO_CLOUD=1 を検討。
モデル容量の肥大化Ollama モデルは数十〜数百 GB になりうる。 OLLAMA_MODELS で外部 SSD へ逃がし、容量監視を入れる。
exit node 利用時の誤解exit node デバイスへ到達できるだけでは利用権にならず、autogroup:internet が必要。 ACL / grant に autogroup:internet を明示する。
組み込み Firewall の限界macOS Firewall はアプリベースなので、公開面の最小化を別途意識すべき。 ルーターのポート開放をしない。DB/Redis 非公開、proxy 前段化を徹底。

よくある障害と切り分け

つながるが遅い、あるいは Mac mini が見えたり見えなかったりする場合、最初に疑うべきはスリープと DERP 依存です。tailscale status の 5 列目に direct / relay / peer-relay が出るので、relay になっているかを確認します。続いて tailscale netcheck を実行し、UDP が false になっていないか、Nearest DERP がどこか、NAT 特性が厳しくないかを見ます。UDP 不可だと直結は難しくなります。macOS では GUI ビルドのログを Console.app で Tailscale / IPNExtension で追えます。 

subnet route を入れたら一部 LAN が変になった場合は、macOS が route を既定受理する点と、longest prefix match による経路優先を疑います。Tailscale は Windows / macOS で route を既定で受諾するため、ローカル LAN と広告サブネットが競合すると、意図しない側へ振れることがあります。この場合は、より狭い CIDR へ切る、accept-routes を見直す、重複サブネット設計を避ける、が基本です。 

Docker スタックは動くのにアプリが遅い / volume mount が重い場合は、Docker Desktop のリソース設定を見てください。CPU・メモリ・ディスク上限は調整可能で、Docker 公式も multi-container workloads で遅いならメモリや disk image space を増やすよう案内しています。bind mount 性能も file sharing 実装に影響され、macOS では VirtioFS が高速化の中心です。 

Ollama がモデルを読めない / pull に失敗する / ディスク不足になるときは、まず ollama ls と ollama ps で状態確認し、モデル保存先を OLLAMA_MODELS に変えている場合は権限と実パスを確認します。プロキシ環境では HTTPS_PROXY を使い、HTTP_PROXY は接続を壊す可能性があるため避ける、というのが Ollama FAQ の指針です。モデル保存先は macOS では ~/.ollama/models が既定です。 

exit node を有効にしたのに使えない場合は、かなりの確率でポリシーです。tailscale exit-node list に候補が見えていても、カスタム ACL / grants に autogroup:internet が無いと gateway としては使えません。また、LAN も同時利用したいなら --exit-node-allow-lan-access を忘れないでください。 

最後に、“CLI-only だから軽そう” という理由だけで macOS の open-source tailscaled 版を選ぶのは要注意です。公式比較では、これは経験ある管理者向けで、GUI 連携がなく、macOS では exit node 利用や一部機能に制約があります。普段使いと常設サーバーの両方を 1 台で回すなら、Standalone 版 + CLI 併用がいちばん事故が少ないで

コメント

タイトルとURLをコピーしました