リモート devcontainer 方式のシンクライアント開発環境。 ローカル (Mac) はターミナル + nvim client のみ。実際の開発はリモートサーバ上の Docker コンテナ内で行う。
[ローカル Mac] [リモートサーバ]
Terminal + nvim --remote-ui <-SSH-> Docker host
devup / devfish / devnvimserver ├── Container (owner/project)
│ ├── /workspace (volume)
│ ├── ~/dotfiles (GitHub から clone)
│ └── nvim server :6666
└── 共有 volumes (mise, nvim, fish, ghq, gh)
- macOS または Linux (Debian/Ubuntu, Arch Linux)
- リモートサーバへの SSH 鍵認証 (1Password SSH agent 推奨)
curl -fsSL https://raw.githubusercontent.com/skmtkytr/dotfiles/master/install.sh | bash以下を自動で行う:
- 最小限のパッケージインストール (git, fish, socat, tmux 等)
- dotfiles clone (
~/.ghq/github.com/skmtkytr/dotfiles) - Brewfile からパッケージ一括インストール (macOS のみ)
- シンボリックリンク展開 (
~/.config→dotfiles/config) - mise でクロスプラットフォーム CLI ツールをインストール
- fisher プラグインインストール
- macOS デフォルト設定 (Spotlight ショートカット無効化, Dock 整理)
git clone https://github.com/skmtkytr/dotfiles.git ~/.ghq/github.com/skmtkytr/dotfiles
bash ~/.ghq/github.com/skmtkytr/dotfiles/install.shCLI ツールは mise で一元管理し、Brewfile には mise で管理できないものだけを入れる。
| 管理元 | 対象 |
|---|---|
config/mise/config.toml |
クロスプラットフォーム CLI ツール (bat, eza, fd, fzf, gh, ghq, ripgrep, starship, lazygit, claude-code 等) |
config/Brewfile |
macOS 専用: システムツール (fish, neovim, tmux, docker), GUI アプリ (cask), フォント |
# mise ツールの更新
mise install
# Brewfile の適用 (macOS)
brew bundle --file=~/.config/Brewfile~/.config ディレクトリ全体を dotfiles/config へのシンボリックリンクにする。
macOS (install.sh) でもコンテナ内 (setup.sh) でも同じ方式。
~/.config → dotfiles/config/
├── tmux/tmux.conf (tmux 3.1+ 自動検出)
├── git/config (git 自動検出)
└── ...
~/.claude → ~/.config/claude
~/.ssh/agent.sock → 1Password SSH agent socket (macOS)
# ghq ディレクトリ内ならプロジェクトを自動検出
cd ~/.ghq/github.com/owner/repo
devup
# 明示的に指定
devup owner/repo
# ホストも明示的に指定
devup owner/repo --host user@server
# 新しい GitHub リポジトリを作成して起動
devup --new myproject --host user@server
# コンテナ再作成
devup owner/repo --remove-existing-container
# イメージ再ビルド (キャッシュなし)
devup owner/repo --rebuild-no-cache
# ローカルモード (カレントディレクトリ)
devup # ghq外で実行--host引数- 前回の devup で保存されたメタファイル (
~/.devcontainers/<owner>/<repo>/.devup-meta) $DEVUP_DEFAULT_HOST環境変数 または~/.config/devup/default_host
デフォルトホストを設定しておけば --host は不要:
echo "user@server" > ~/.config/devup/default_host# ghq ディレクトリ内なら自動検出
devfish
# 明示的に指定
devfish owner/repo# nvim サーバ起動 (socat プロキシ付き)
devnvimserver owner/repo
# nvim クライアント接続
nvim --server localhost:6666 --remote-ui
# 停止
devnvimserver owner/repo stopポート 6666 が使用中の場合は自動的にインクリメントされる。 表示されたポート番号で接続すること。
コンテナ内の dev サーバ (vite, next 等) にローカルブラウザからアクセスする。
# コンテナ内で bun run dev (port 5173) を起動した状態で
devport 5173 # ghq cwd 自動検出
devport 3000 owner/repo # 明示指定
# ブラウザで http://localhost:5173 にアクセス
# 停止
devport 5173 stopdev サーバは 0.0.0.0 にバインドする必要がある:
bun run dev -- --host 0.0.0.0
# または vite.config で server.host: '0.0.0.0'devexec make test # テスト実行
devexec cat src/main.rs # ファイル読み取り
devexec owner/repo npm install # プロジェクト明示指定devlsコンテナ内の ~/dotfiles を GitHub 最新に更新し、setup.sh を再実行する。
# ghq ディレクトリ内なら自動検出
devup --sync
# 明示的に指定
devup owner/repo --sync# ghq ディレクトリ内なら自動検出
devdown
# 明示的に指定
devdown owner/repo
# workspace volume は残す
devdown owner/repo --keep-volume
# 全プロジェクト削除 (確認あり)
devdown --alldevup は毎回 docker pull で最新イメージを取得する。
既存コンテナがある状態でイメージが更新された場合、黄色の警告で --remove-existing-container を促す。
fish の Tab 補完に対応。~/.devcontainers/ のメタファイルから owner/repo 候補を自動生成する。
devup <Tab> # owner/repo + オプション候補
devfish <Tab> # owner/repo 候補
devdown <Tab> # owner/repo 候補
devport <Tab> # owner/repo 候補
devexec <Tab> # owner/repo 候補devup はリモートモードで GitHub の master を clone する。
ローカルに未 push のコミットがあると、コンテナは古い設定で作られる。
この場合 devup 実行時に黄色の警告が表示される。
対応: devup 前に git push するか、起動後に devup --sync で更新する。
初回 clone 時に認証エラーが出た場合、コンテナ内で gh auth login が必要。
devfish owner/repo
gh auth login
git clone <url> /workspacegh の認証情報は devcontainer-gh-config volume に永続化されるため、
コンテナ再作成後も維持される。
ローカルとリモートで tmux が二重になる場合、F12 でローカル tmux のキーバインドを無効化できる。
全キー入力がリモートの tmux に直通する。もう一度 F12 で戻る。
ステータスバーが暗くなり [OFF] と表示されるので、どちらが操作対象か一目でわかる。
リモート tmux 内でコピーした内容は OSC 52 経由でローカルのクリップボードに転送される。 Alacritty / Ghostty は OSC 52 対応済み。
- socat >= 1.8 では SYSTEM アドレス内のコロンエスケープが必要 (自動処理済み)
- socat プロセスはターミナルを閉じても生存する (SIGHUP 耐性あり)
- PID ファイルは
~/.devcontainers/<owner>/<repo>/socat.pidに保存される
コンテナは --restart unless-stopped ポリシーで作成される。
ホスト再起動後に自動で復帰するが、devdown や docker stop での明示的停止は尊重される。
以下の volume は全コンテナで共有される。個別削除時に注意。
| Volume | マウント先 | 内容 |
|---|---|---|
devcontainer-mise-data |
~/.local/share/mise |
mise のツール・shims |
devcontainer-nvim-data |
~/.local/share/nvim |
nvim プラグイン・キャッシュ |
devcontainer-fish-data |
~/.local/share/fish |
fish プラグイン |
devcontainer-tmux-data |
~/.local/share/tmux |
tmux プラグイン (tpm) |
devcontainer-ghq |
~/.ghq |
ghq リポジトリ |
devcontainer-gh-config |
~/.gh-config |
GitHub CLI 認証情報 |
devcontainer-claude-config |
~/.claude-config |
Claude Code 認証情報 |
~/.devcontainers/<owner>/<repo>/.devup-meta にコンテナ情報が保存される。
手動でコンテナを削除した場合、devdown でメタファイルも掃除すること。
| コマンド | 説明 |
|---|---|
devup [project] |
コンテナ起動 (cwd 自動検出 or 明示指定) |
devup --new <name> -h <host> |
新規リポ作成 + 起動 |
devup [project] --sync |
コンテナ内 dotfiles 更新 |
devup [project] --remove-existing-container |
コンテナ再作成 |
devfish [project] |
コンテナ内シェル (cwd 自動検出) |
devnvimserver [project] |
nvim サーバ + socat プロキシ起動 |
devnvimserver [project] stop |
nvim サーバ停止 |
devport <port> [project] |
ポートフォワーディング (dev サーバ等) |
devport <port> stop |
ポートフォワーディング停止 |
devexec [project] <cmd...> |
コンテナ内コマンド実行 (非インタラクティブ) |
devls |
コンテナ一覧 |
devdown [project] |
コンテナ削除 (cwd 自動検出) |
devdown --all |
全コンテナ削除 |
dotfiles/
├── install.sh # ブートストラップスクリプト
├── config/ # ~/.config にシンボリックリンク
│ ├── Brewfile # macOS パッケージ (brew/cask)
│ ├── git/config # Git 設定 (XDG 自動検出)
│ ├── git/config-container # コンテナ用 Git 設定
│ ├── git/ignore # グローバル gitignore
│ ├── tmux/tmux.conf # tmux 設定 (XDG 自動検出)
│ ├── mise/config.toml # CLI ツール定義
│ ├── mise/config.devcontainer.toml # コンテナ専用ツール
│ ├── devup/default_host # デフォルトリモートホスト
│ ├── fish/ # fish shell 設定
│ │ ├── config.fish
│ │ ├── fish_plugins # fisher プラグインリスト
│ │ ├── user_functions/ # 自作関数 (fisher と分離)
│ │ ├── user_completions/ # 自作補完 (fisher と分離)
│ │ ├── completions/ # fisher 管理 (gitignore)
│ │ └── functions/ # fisher 管理 (gitignore)
│ ├── nvim-LazyVim/ # Neovim 設定 (LazyVim)
│ ├── alacritty/ # Alacritty 設定
│ ├── starship.toml # Starship プロンプト
│ └── claude/ # Claude Code 設定
│ ├── settings.json # hooks 等の設定
│ └── hooks/ # Claude Code hooks スクリプト
├── .devcontainer/
│ ├── Dockerfile # devcontainer イメージ
│ ├── devcontainer.json # ローカル用設定
│ ├── remote/devcontainer.json # リモート用設定
│ ├── setup.sh # コンテナ内セットアップ
│ └── nvim-server.sh # nvim headless 起動スクリプト
└── .github/workflows/ # CI (イメージビルド)