Skip to content

インストール

console
$ curl -fsSL https://minato.1024.works/install.sh | sh

環境に合ったアーカイブを選び、公開されている .sha256 と照合し、minatominatod~/.local/bin に配置します。bash / zsh / fish のうちインストール 済みのシェルには、補完スクリプトも書き込みます。

root 権限は一切必要ありません。PATH の設定が必要な場合は、いま使っている シェルの書き方で 1 行だけ表示します。fish なら fish_add_path を示すので、 fish が受け付けない export 行を渡されることはありません。

必要なもの

コンテナランタイムDocker / OrbStack / colima のいずれか。または macOS 26 以降の Apple Container
macOS全機能に対応しています。Linux でも中核機能は動作しますが、launchd socket activation は利用できません
Rust 1.88 以降ソースからビルドする場合のみ

デスクトップアプリは任意です。追加の条件については デスクトップアプリ を参照してください。

インストールスクリプト

実行する前に中身を読んでください。install.sh は POSIX シェルで約 260 行、意外なことは何もしていません。設定は 2 つです。

MINATO_INSTALL_DIRバイナリの配置先。既定は ~/.local/bin
MINATO_NO_COMPLETIONS何か値を設定すると補完スクリプトを書き込みません
console
$ curl -fsSL https://minato.1024.works/install.sh | MINATO_INSTALL_DIR=/usr/local/bin sh

PATH の設定

配置先が PATH に入っていない場合、追加する方法を表示します。示すのは 1 つ、 いま使っているシェルの分だけです。

console
fish_add_path ~/.local/bin
console
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
. ~/.zshrc
console
# macOS は ~/.bash_profile、Linux は ~/.bashrc。ログインシェルは前者しか
# 読まず、macOS のターミナルはログインシェルとして起動します。
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bash_profile
. ~/.bash_profile
console
echo 'setenv PATH $HOME/.local/bin:$PATH' >> ~/.tcshrc
source ~/.tcshrc
console
# $nu.config-path に追記
$env.PATH = ($env.PATH | prepend '~/.local/bin')
console
# ~/.config/elvish/rc.elv に追記
set paths = ['~/.local/bin' $@paths]
console
# $PROFILE に追記
$env:PATH = "$HOME/.local/bin" + [IO.Path]::PathSeparator + $env:PATH

判定には $SHELL ではなくプロセスツリーを使います。$SHELL はログイン シェルであり、zsh でログインしてから fish を起動した時点で別のものになります。 fish で export PATH を渡されると、そのまま設定ファイルに貼られて何か月も 壊れたままになりがちです。ksh / mksh / dash も判別し、~/.profile を 案内します。

判定できなかったときは推測せず、すべてのシェルの方法を並べて表示します。

インストールされるのは nightly ビルドです。main へのマージごとに差し替え られる最新ビルドであり、リリースではありません。バージョンは付かず、内容は 予告なく変わります。

再実行すればその場で更新されます。minato update でも同じこと ができ、こちらはシェルのパイプも 2 回のダウンロードも要りません。

手動でビルド済みバイナリを取得する

スクリプトが取得するのと同じアーカイブです。

Apple Siliconminato-aarch64-apple-darwin.tar.gz
Intel Macminato-x86_64-apple-darwin.tar.gz
Linux x86_64minato-x86_64-unknown-linux-gnu.tar.gz
console
$ gh release download nightly --repo hota1024/minato \
    --pattern 'minato-aarch64-apple-darwin.tar.gz*'
$ shasum -a 256 -c minato-aarch64-apple-darwin.tar.gz.sha256
$ tar xzf minato-aarch64-apple-darwin.tar.gz
$ cd minato-aarch64-apple-darwin

macOS は未署名バイナリを隔離します

console
$ xattr -d com.apple.quarantine minato minatod

インストールスクリプトはこれを自動で実行します。署名は未解決のため、手動なら このコマンドを実行するか、ソースからビルドしてください。同じ理由でデスクトップ アプリは配布していません。未署名の .app は警告ではなく Gatekeeper に実行その ものを止められます。

ビルド

Minato はまだ crates.io に公開していないため、ビルドするにはリポジトリを クローンします。

console
$ git clone https://github.com/hota1024/minato
$ cd minato
$ cargo build --release --workspace

target/release に 2 つのバイナリが生成されます。

  • minato — 操作に使う CLI
  • minatod — CLI が通信する daemon

PATH の通ったディレクトリに配置します。

console
$ cp target/release/minato target/release/minatod ~/.local/bin/

この 2 つは同じディレクトリに置いてください。CLI は自身と同じ場所を参照して daemon を起動します。

シェル補完

インストールスクリプトを使えば書き込み済みです。手動で用意する場合、あるいは スクリプトが見つけられなかったシェル向けには次のようにします。

console
$ minato completions fish > ~/.config/fish/completions/minato.fish
console
$ mkdir -p ~/.local/share/zsh/site-functions
$ minato completions zsh > ~/.local/share/zsh/site-functions/_minato
$ echo 'fpath=(~/.local/share/zsh/site-functions $fpath)' >> ~/.zshrc
console
$ mkdir -p ~/.local/share/bash-completion/completions
$ minato completions bash > ~/.local/share/bash-completion/completions/minato

fish は追加設定なしで読み込みます。zsh はディレクトリを fpath に加える必要が あるため、1 行余分に書いています。bash は bash-completion 2.x が必要です。

elvishpowershell も指定できますが、生成器に付いてくるだけで動作確認は していません。

最新に保つ

console
$ minato update
› installing 9f3c1a2…
╭ update ──────────────────────────────────────────╮
│ installed  9f3c1a2                               │
│                                                  │
│ › the running daemon is still the previous build │
│ › replace it with minato daemon stop             │
╰──────────────────────────────────────────────────╯

update は、実行した minato が置かれているディレクトリを対象に、現在の nightly へ差し替えます。設定で指定した場所ではなく、いま動かしているものを 更新します。CLI と daemon は必ず一緒に入れ替えます。ビルドが揃っていないと、 両者のあいだのプロトコルが噛み合わなくなるからです。

新しいファイルは既存のファイルの隣に書き出してから rename で置き換えます。 実行中のバイナリは書き込めませんが、置き換えることはできます。そのため daemon が動いている状態で更新しても、再起動するまでは古いビルドが動き続けます。最後の 1 行はそのことを指しています。停止すれば launchd が新しいものを起動します。

インストールせずに確認するだけなら次のようにします。

console
$ minato update --check
╭ update ─────────────────────────╮
│ available  9f3c1a2              │
│ running    c7282b8              │
│                                 │
│ › install it with minato update │
╰─────────────────────────────────╯

自動チェック

1 日 1 回、コマンドが終わったあとに nightly の中身を GitHub へ問い合わせ、 実行中のものと違えば stderr に 1 行だけ表示します。

a newer build is available (9f3c1a2). Run `minato update`

コマンドの前ではなく後に実行するため、通信が遅くても待っている出力が遅れる ことはありません。--json のときは完全に省略されるので、エージェントが解析 するストリームに混ざることはありません。失敗しても何も言いません。GitHub に 到達できなかったチェックには、伝えるべきことがないからです。

止めるときは環境変数を設定します。

console
$ export MINATO_NO_UPDATE_CHECK=1

結果は ~/.minato/update-check.json に 24 時間キャッシュし、その間はキャッシュ から同じ 1 行を出し続けます。1 日に 1 度しか出ない警告は、たいてい見落とされる からです。

ソースからビルドしたものについては、どちらとも言いません。バイナリはビルド元の コミットを記録していますが、それが無ければ比べる相手がなく、正直に答えようが ありません。「最新です」は推測になり、「古いです」は意図して作ったビルドから 引き剥がしてしまいます。

console
$ minato --version
minato 0.1.0 (9f3c1a2)

コンテナランタイムの選択

Docker

追加の設定は不要です。Minato は Docker API を直接利用し、docker CLI を 呼び出しません。そのため CLI 自体はインストールされていなくても、API に 到達できれば動作します。Docker Desktop、OrbStack、colima のいずれでも 構いません。

console
$ minato doctor
│ …
│ ✓  container runtime  docker 29.4.0
│ …

Apple Container

macOS 26 以降と、サービスの起動が必要です。

console
$ container system start

minato.toml で指定します。

toml
[runtime]
default = "apple"

選択する前に把握しておくべき制約が 2 点あります。 ランタイム を参照してください。

daemon の起動

console
$ minato daemon start
╭ minatod ───────────────────────────────╮
│ running                                │
│                                        │
│ version   0.1.0                        │
│ protocol  1                            │
│ runtime   docker 29.4.0                │
│ uptime    0s                           │
│ socket    ~/.minato/minatod.sock       │
╰────────────────────────────────────────╯

通常は手動で実行する必要はありません。いずれのコマンドも、daemon が停止して いれば自動的に起動します。プロキシ、DNS、アイドル判定を担当するため、 常駐プロセスとして動作します。

管理者権限が必要な設定

https://web.myapp.localhost にポート番号なしでアクセスするには、3 つの設定に 管理者権限が必要です。設定は初回の 1 度だけです。

console
$ minato setup
╭ setup ─────────────────────────────────────────────────────────────────────────╮
│ the URLs need the following. It requires root, so read each command first.     │
│                                                                                │
│ 1. let launchd hold 80/443/53 (the daemon itself stays non-root)               │
│    generated plist: ~/.minato/dev.minato.daemon.plist                          │
│    sudo cp ~/.minato/dev.minato.daemon.plist /Library/LaunchDaemons/…          │
│                                                                                │
│ 2. point *.localhost at Minato's DNS                                           │
│    sudo mkdir -p /etc/resolver && printf 'nameserver 127.0.0.1\n' | sudo tee … │
│                                                                                │
│ 3. trust the local CA, so HTTPS stops warning                                  │
│    sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/…      │
│                                                                                │
│ › afterwards run minato daemon stop                                            │
│   launchd starts it again, with the new settings                               │
│                                                                                │
│ to undo:                                                                       │
│   sudo launchctl bootout system/dev.minato.daemon                              │
╰────────────────────────────────────────────────────────────────────────────────╯

minato setup はコマンドを表示するだけで、実行はしません。 自動で sudo を実行すると、エージェントはパスワード入力待ちで停止し、利用者から見れば 黙って権限昇格が行われたことになります。内容を確認したうえで、手動で実行して ください。

実行後は次のようにします。

console
$ minato daemon stop   # launchd が起動し直し、標準ポートを確保します
$ minato doctor

設定を省略する場合

この設定は必須ではありません。非特権ポートを指定すれば、URL にポート番号が 付く点を除いてすべて動作します。

console
$ export MINATO_HTTP_PORT=8080 MINATO_HTTPS_PORT=8443 MINATO_DNS_PORT=15353
$ minato daemon start

ただし *.localhost を解決させるには /etc/resolver の設定が必要です。 これは Minato ではなく macOS 側の仕様です。minato doctor が、指定した ポートを含んだコマンドをそのまま出力します。

動作確認

console
$ minato doctor

以外の行には、必ず対処方法が併記されます。ここに問題が残ったまま先に 進まないでください。後から発生する原因の分かりにくい不具合は、多くの場合 ここに起因します。

ファイルの配置場所

MINATO_HOME(既定値 ~/.minato)に、daemon のソケット、状態ファイル、 ログ、ローカル CA、生成されたトンネル設定が保存されます。

Unix ソケットのパスは約 100 バイトまでという制限があるため、MINATO_HOME に 深い階層のディレクトリは指定できません。Minato は起動時にこれを検証し、 原因の分かりにくいエラーで失敗する代わりに、その旨を明示します。

アンインストール

console
$ minato uninstall

見つかったもの——コンテナ、daemon の状態、バイナリ、補完、root が必要な手順 ——を一覧で示し、削除する前に確認します。--dry-run は一覧を出して終了し、 --yes は確認を省略します。端末がない環境では --yes が必須です。

worktree はそのまま残します。 何が残るか分かるように一覧には表示します。 削除するなら minato rm です。

削除対象の詳細と、root が必要な手順の扱いは CLI リファレンスにあります。

Released under the MIT License.