macOS / Ubuntu / Debian / Windows 向けの dotfiles リポジトリ。chezmoi で管理する。 機微な設定(一部の SSH ホスト定義・業務用 Git 設定・IME 辞書など)は age で暗号化してリポジトリに載せているため、公開しても安全な構成になっている。
.chezmoiroot = home のため、chezmoi の source root は home/。
セットアップには curl と git が必要。curl は chezmoi インストーラの取得に必須で、git はリポジトリの clone と autoCommit / autoPush の運用に使用する。
curl は標準搭載されている。git は Xcode Command Line Tools に含まれるため、未インストールの場合のみ以下を実行する(後続の Setup でも xcode-select --install は自動実行されるが、事前に入れておくと確実)。
xcode-select --install最小構成では curl / git ともに未インストールのことがあるため、先に導入する。
sudo apt update
sudo apt install -y curl gitgit が必要。Windows 向けスクリプトは既定搭載の Windows PowerShell 5.1 で動作するため、pwsh (PowerShell 7) の別途インストールは不要。git が無ければ winget で導入する。
winget install --id Git.Git --exact --source winget導入後は新しい PowerShell を開き直してから Setup に進む。
winget 自体は前提条件ではない。winget が無い環境 (Windows Server 2022 / Windows Sandbox など Microsoft Store 非搭載の環境) では、セットアップスクリプトが GitHub リリースの App Installer パッケージ (依存 + ライセンス XML 込み) から winget を自動導入する (install/windows/winget.ps1)。ただし Windows Server 2019 以前は winget 非対応。その場合や、上記の git 導入時点で winget が無い場合は、Git for Windows のインストーラーで git を導入する。
一部の設定ファイルは age で暗号化され、encrypted_*.age としてリポジトリに含まれている。
| 暗号化ファイル | 展開先 | 内容 |
|---|---|---|
home/dot_ssh/encrypted_config.local.age |
~/.ssh/config.local |
非公開の SSH ホスト定義(~/.ssh/config から Include される) |
home/encrypted_dot_gitconfig.technoface.gitlab.age |
~/.gitconfig.technoface.gitlab |
業務用 Git 設定 |
home/encrypted_dot_gitconfig.sakanaai.github.age |
~/.gitconfig.sakanaai.github |
業務用 Git 設定 |
settings/common/encrypted_google.ime.txt.age |
(手動インポート用) | Google 日本語入力のユーザー辞書 |
settings/macos/btt/encrypted_licence.txt.age |
(実行時に復号) | BetterTouchTool ライセンス |
復号には age 秘密鍵が必要。公開鍵 (recipient) は home/.chezmoi.toml.tmpl に記載してリポジトリに載せているが、秘密鍵はリポジトリに含めない。
新しいマシンでこれらを展開するには、chezmoi apply の起動前に秘密鍵を配置する。
ただし初回 macOS セットアップでは 1Password / op / fnox がまだ無いことがあるため、初回 apply は鍵なしで実行し、その後にこれらのツールをインストールする必要がある。
.chezmoiignore が鍵の有無を判定し、chezmoi 管理対象の復号できない暗号化ファイルをスキップする。
秘密鍵が無い環境(コンテナ・鍵未配置の初回など)でも chezmoi apply は失敗しない。該当設定が展開されないだけで、他の設定は通常通り展開される。
1Password 導入・認証後、鍵を配置するマシン (新マシン) 側で実行:
mkdir -p ~/.config/chezmoi
op read --out-file ~/.config/chezmoi/key.txt --file-mode 0600 'op://Private/age-identity/password'その後、fnox が API key を環境変数として注入した状態で chezmoi apply --init を再実行する。
--init は home/.chezmoi.toml.tmpl から ~/.config/chezmoi/chezmoi.toml を再生成し、fnox が注入した API key を data.apiKeys に反映するために必要。
fnox --config "$HOME/.local/share/chezmoi/fnox.toml" exec -- chezmoi apply --initなお、一度上記の手順を実行した後は、secrets に変更がない限り、通常の chezmoi apply を実行するだけで良い。
API キーは対話入力せず、上記の fnox exec が fnox.toml の secrets を復号して環境変数に注入し、home/.chezmoi.toml.tmpl がそれを data.apiKeys に反映する。未注入の環境変数は空文字で展開されるため、鍵未配置の初回 bootstrap では空のまま進み、1Password 認証後に上記の手順を再実行することで実値に更新される。
data.apiKeys が生成されるのは、コーディングエージェント設定を管理する環境(macOS / Linux で skip_cli_tools=false、または Windows で skip_windows_extras=false)のみ。
| 環境変数 | データキー | 説明 |
|---|---|---|
GEMINI_API_KEY |
apiKeys.gemini |
Google AI Studio で発行。Antigravity CLI / nano-banana MCP 等で使用 |
GOOGLE_MAP_API_KEY |
apiKeys.googleMaps |
Google Cloud Console で発行。maps-grounding-lite MCP で使用 |
FUGU_API_KEY |
apiKeys.fugu |
Codex の Sakana プロバイダで使用 |
FUGU_PAYG_API_KEY |
apiKeys.fuguCyber |
Codex の fugu-cyber プロファイル (Sakana PAYG プロバイダ) で使用 |
OPENROUTER_API_KEY |
apiKeys.openRouter |
Codex / Claude Code の OpenRouter プロバイダで使用 |
API キーは fnox.toml では age 暗号文として管理され、ローカルの ~/.config/chezmoi/chezmoi.toml に data.apiKeys として平文展開される(リポジトリには入らない)。
公開リポジトリなので HTTPS なら認証不要でどのマシンからでも clone できる。初回セットアップにはこちらを推奨。
sh -c "$(curl -fsSL get.chezmoi.io)" -- -b "$HOME/.local/bin" init --apply --depth=1 https://github.com/msageha/dotfiles.gitWindows (Windows PowerShell 5.1) の場合:
iex "&{$(irm 'https://get.chezmoi.io/ps1')} -b '$HOME\.local\bin'"
$env:Path = "$HOME\.local\bin;$env:Path"
chezmoi init --apply --depth=1 https://github.com/msageha/dotfiles.gitchezmoi が実行するセットアップスクリプトは -ExecutionPolicy Bypass 付きで起動されるため、実行ポリシーが既定の Restricted のままでも動作する。install/windows/*.ps1 を手動で実行したい場合のみ Set-ExecutionPolicy -Scope CurrentUser RemoteSigned が必要になることがある。
SSH URL (git@github.com:msageha/dotfiles.git) も利用できるが、その場合はそのマシンに GitHub 登録済みの SSH 鍵が既に必要(未設定の初回マシンでは clone に失敗する)。autoCommit / autoPush で push し返すオーナー環境では、鍵を配置してから remote を SSH に切り替えると push が楽になる。
git -C ~/.local/share/chezmoi remote set-url origin git@github.com:msageha/dotfiles.gitコンテナや他人のマシンなど、chezmoi の source (~/.local/share/chezmoi) や設定を残したくない環境では --one-shot を使う。適用後に source ディレクトリ・設定 (~/.config/chezmoi)・インストールした chezmoi バイナリまで自動で削除する(実質 --apply --depth 1 --force --purge --purge-binary 相当)。
sh -c "$(curl -fsSL get.chezmoi.io)" -- init --one-shot https://github.com/msageha/dotfiles.git注意点:
--one-shotは--forceを含むため、通常は対話的に聞かれる項目(computer_nameなど)が確認されずデフォルト値で進む。値を指定したい場合はこの方式ではなく通常のinit --applyを使う。- 暗号化ファイルを展開したい場合は、one-shot でも事前に age 秘密鍵の配置が必要(未配置なら該当ファイルは自動スキップされる)。
chezmoi init --apply の実行時に以下が対話的に聞かれる(~/.config/chezmoi/chezmoi.toml に保存され、2 回目以降はスキップされる)。設定を変更したい場合は chezmoi init を再実行するか、~/.config/chezmoi/chezmoi.toml を直接編集する。
| プロンプト | データキー | 説明 |
|---|---|---|
computer_name |
computer_name |
macOS のコンピュータ名 |
| プロンプト | データキー | 説明 |
|---|---|---|
Skip CLI tool installation ...? |
skip_cli_tools |
CLI ツール(各種ユーティリティ・chezmoi・docker・gh 等)とコーディングエージェント設定をスキップするかどうか(デフォルト: true) |
Skip GUI tool installation? |
skip_gui_tools |
GUI 系パッケージ(macOS は cask)・フォント・システム設定等のインストールをスキップするかどうか(デフォルト: true)。skip_cli_tools=true のときは質問されず true になる |
| プロンプト | データキー | 説明 |
|---|---|---|
Skip coding agent / GUI apps / system settings setup? |
skip_windows_extras |
コーディングエージェント CLI・GUI アプリ (Chrome 等)・システム設定 (エクスプローラー/壁紙/タスクバー等) をまとめてスキップするかどうか(デフォルト true)。false にするとコーディングエージェント設定も展開される |
開発環境イメージをローカルでビルドできる(ベース OS / ツール構成別の 7 バリアント)。イメージ名は既定で msageha/dotfiles:<tag>(DOCKER_REPOSITORY で上書き可)。
make build-ubuntu # 標準構成 (Ubuntu + CLI)
docker container run -it msageha/dotfiles:ubuntu| ターゲット | タグ | 構成 |
|---|---|---|
make build-ubuntu-min |
ubuntu-min |
Ubuntu / 最小 (CLI ツールも省く) |
make build-ubuntu |
ubuntu |
Ubuntu / CLI |
make build-debian-min |
debian-min |
Debian / 最小 |
make build-debian |
debian |
Debian / CLI |
make build-debian-slim-min |
debian-slim-min |
Debian slim / 最小 |
make build-alpine |
alpine |
Alpine / 最小 |
make build-ubuntu-gpu |
ubuntu-gpu |
Ubuntu + CUDA + CLI (amd64 のみ) |
マルチアーキ (amd64/arm64) ビルドと registry への push は make build-multi-platform / make push。CI では cloudbuild.yaml が Artifact Registry へ push する。
ビルドコンテキストには機微な平文(例: 復号した IME 辞書)が入らないよう .dockerignore で除外している。暗号化済み *.age は ciphertext のため同梱されても安全。
設定から、変更するキーの組み合わせを以下のように入れ替える。
- Caps Lock → Control
- Option (Alt) → Command
- Command → Option
age 秘密鍵を配置済みの環境で、暗号化ファイルを編集・再暗号化する。
home/ 配下(chezmoi 管理対象)のファイルは chezmoi が透過的に復号/再暗号化する。
chezmoi edit ~/.ssh/config.local # 復号して編集 → 保存時に再暗号化
chezmoi decrypt <source>/encrypted_foo.age # 標準出力へ復号settings/ 配下(chezmoi 管理外)は Make ターゲットを使う。
make decrypt_google_ime # encrypted_google.ime.txt.age → settings/common/google.ime.txt (平文, gitignore 済み)
make encrypt_google_ime # 平文を編集後に再暗号化このリポジトリ自体の lint/format/テストに使うツール (prek / hadolint / actionlint / bats / dprint) は mise でバージョン管理している (mise.toml)。home/dot_config/mise/config.toml.tmpl はマシンに展開されるユーザー環境向けの mise 設定で、これとは別物。
mise trust # 初回のみ: リポジトリ直下の mise.toml を信頼する
mise install # ツールを導入し、git hook (pre-commit) を自動登録するmake pre-commit # prek run --all-files
make test # bats -r tests/
make dry_run # chezmoi apply --dry-run --verbose --force依存関係 (GitHub Actions・mise.toml のツール・ベースイメージ等) の更新は Renovate (renovate.json) が自動 PR を作成する。
.
├── home/ # chezmoi 管理対象の dotfiles (source root)
│ ├── .chezmoi.toml.tmpl # 初期設定テンプレート (プロンプト・age recipient)
│ ├── .chezmoiignore # 鍵の有無で暗号化ファイルの適用を制御
│ ├── .chezmoiscripts/ # chezmoi ライフサイクルスクリプト
│ ├── dot_alias.tmpl # シェルエイリアス
│ ├── dot_gitconfig.tmpl # Git 設定 (業務用は暗号化した include を条件付きで参照)
│ ├── dot_gitconfig.github # 個人 GitHub 用 Git 設定
│ ├── dot_ssh/
│ │ ├── config.tmpl # 公開可の SSH 設定 (~/.ssh/config.local を Include)
│ │ └── encrypted_config.local.age # 非公開ホスト定義 (age 暗号化)
│ ├── encrypted_dot_gitconfig.*.age # 業務用 Git 設定 (age 暗号化)
│ ├── dot_claude/ # Claude Code 設定 (CLAUDE.md, settings, skills, rules)
│ ├── dot_codex/ # OpenAI Codex 設定
│ ├── dot_gemini/ # Antigravity (Gemini) 設定
│ ├── modify_private_dot_claude.json # ~/.claude.json を管理 (マシンローカル状態のみ温存)
│ └── dot_config/ # fish / ghostty / mise / starship 等
├── install/ # インストールスクリプト
│ ├── common/ # 共通 (mise, fonts, fisher, completions 等)
│ ├── macos/ # macOS (brew, xcode, system/app settings)
│ ├── debian/ ubuntu/ alpine/ # Linux 系
│ └── windows/ # Windows (winget ブートストラップ・コーディングエージェント・GUI アプリ・Starship 等・システム設定、.chezmoiscripts から実行)
├── settings/ # アプリ設定 (chezmoi 管理外, スクリプトが参照)
│ ├── common/ # ghostty / vscode / IME 辞書(暗号化)
│ └── macos/ # Raycast / BetterTouchTool(preset・ライセンス暗号化)
├── tests/ # BATS テスト (files / install)
├── docker/ # イメージ定義 (Dockerfile.debian / Dockerfile.alpine)
├── .github/workflows/ # CI (prek, bats, chezmoi dry-run, secret scan)
├── cloudbuild.yaml # Cloud Build (マルチアーキ build & push)
├── Makefile # ビルド / テスト / 暗号化ユーティリティ
├── mise.toml / mise.lock # 開発ツール (prek/hadolint/actionlint/bats/dprint) のバージョン管理
├── renovate.json # 依存関係の自動更新設定
├── .pre-commit-config.yaml # Lint/Format 設定 (prek で実行)
├── dprint.json # json/yaml/markdown/toml のフォーマット設定 (dprint)
└── _typos.toml # typos 設定 (*.age を除外)