# インフラ設計書

## 概要

本ドキュメントは Doom Emacs プロジェクトのインフラストラクチャ構成を記載します。Doom Emacs はエンドユーザーのローカルマシン上で動作する Emacs 設定フレームワークであり、従来のサーバー/クラウドインフラを持つ Web アプリケーションとは異なります。本書では、実行環境、開発環境、CI/CD パイプライン、および外部サービス連携について説明します。

## システム構成

### 全体構成

Doom Emacs は以下の 3 つの環境で構成されます：

1. **エンドユーザー実行環境**: ユーザーのローカルマシン上で GNU Emacs と共に動作
2. **開発環境**: Nix を利用した再現可能な開発シェル環境
3. **CI/CD 環境**: GitHub Actions を利用した自動化パイプライン

### サーバー構成

本プロジェクトはローカルアプリケーションのため、従来のサーバー構成は存在しません。代わりに、以下の実行環境要件があります。

| 環境種別 | 役割 | スペック/要件 | 備考 |
| --- | --- | --- | --- |
| ユーザーローカル環境 | アプリケーション実行 | GNU Emacs 27.1-30.2、Git >= 2.23、ripgrep >= 11.0 | 主要3OS（Linux/macOS/Windows）対応 |
| Nix 開発環境 | 開発・テスト用サンドボックス | Nix パッケージマネージャー | shell.nix で定義 |
| GitHub Actions | CI/CD | GitHub ホストランナー | Ubuntu環境で実行 |

### ネットワーク構成

| 通信経路 | プロトコル | 用途 |
| --- | --- | --- |
| GitHub HTTPS | HTTPS (443) | リポジトリクローン、パッケージ取得 |
| MELPA/ELPA | HTTPS (443) | Emacs パッケージダウンロード |
| straight.el | HTTPS (443) | パッケージリポジトリ取得（Git 経由） |

## ミドルウェア

| ミドルウェア | バージョン | 用途 |
| --- | --- | --- |
| GNU Emacs | 27.1 - 30.2（推奨: 30.2） | アプリケーションランタイム |
| Git | >= 2.23 | バージョン管理、パッケージ取得 |
| ripgrep | >= 11.0 | 高速ファイル検索 |
| fd | >= 7.3.0（オプション） | ファイルインデックス性能向上 |
| Nix | 24.11 | 開発環境構築（オプション） |

## 外部サービス連携

| サービス名 | 用途 | 接続方式 |
| --- | --- | --- |
| GitHub | ソースコード管理、CI/CD、Issue管理、コミュニティ | HTTPS/Git プロトコル |
| GitHub Actions | CI パイプライン実行 | GitHub API |
| doomemacs/ci | 共有 CI ワークフロー | GitHub Actions reusable workflows |
| MELPA | Emacs パッケージレジストリ | HTTPS |
| GNU ELPA | 公式 Emacs パッケージレジストリ | HTTPS |
| nix-community/emacs-overlay | Nix 用 Emacs パッケージオーバーレイ | Git/HTTPS |
| purcell/nix-emacs-ci | CI 用 Emacs バイナリ | Git/HTTPS |
| Discord | コミュニティサポート | WebSocket/HTTPS |

## スケーリング設計

本プロジェクトはローカルアプリケーションのため、従来のサーバースケーリングは不要です。

### パフォーマンス最適化戦略

- **遅延ロード**: パッケージの遅延読み込みによる起動時間最適化
- **バイトコンパイル**: Elisp ファイルのバイトコンパイルによる実行速度向上
- **キャッシング**: パッケージ状態とビルド成果物のキャッシュ（`.local/` ディレクトリ）

## 可用性設計

### 災害復旧・ロールバック機能

| 機能 | 説明 | 実装方式 |
| --- | --- | --- |
| 設定の宣言的管理 | 再現可能な設定の定義 | init.el, packages.el による宣言的設定 |
| パッケージバージョン固定 | 特定コミットへのパッケージ固定 | straight.el の lockfile 機能 |
| 環境スナップショット | シェル環境の保存と復元 | `doom env` コマンド |
| セーフモード | 最小構成での起動 | profiles/safe-mode/ |

### 診断・自己修復機能

- `doom doctor`: システム・設定の診断
- `doom sync`: パッケージ状態の同期
- `doom upgrade`: システム更新
- `doom gc`: ガベージコレクション

## バックアップ設計

| 対象 | 方式 | 頻度 | 保持期間 |
| --- | --- | --- | --- |
| ユーザー設定 (`~/.doom.d/` または `$DOOMDIR`) | Git バージョン管理推奨 | ユーザー管理 | ユーザー管理 |
| パッケージロックファイル | straight.el lockfile | `doom sync` 実行時 | 無制限（Git履歴） |
| 環境スナップショット | `doom env` で生成 | 手動 | 上書き方式（1世代） |

## 監視設計

### ローカル診断機能

| 機能 | コマンド | 監視対象 |
| --- | --- | --- |
| システム診断 | `doom doctor` | 依存関係、設定エラー、パス設定 |
| 情報収集 | `doom info` | システム情報、Emacs バージョン、有効モジュール |
| パッケージ状態 | `doom sync --help` | パッケージのインストール状態 |

### CI 監視

| 監視項目 | トリガー | 実行頻度 |
| --- | --- | --- |
| コミットリント | push, pull_request | イベント発生時 |
| Issue トリアージ | スケジュール | 12時間ごと（cron: `0 */12 * * *`） |

## 備考

### Nix 開発環境について

`shell.nix` により、以下の機能が提供されます：

- 複数の Emacs バージョン（26.1 - 30.2、HEAD）のサポート
- CI 用軽量 Emacs ビルド（GUI なし）
- 隔離された開発環境
- 自動的な環境変数設定（`EMACSDIR`, `DOOMDIR`, `DOOMLOCALDIR`）

### 対応プラットフォーム

- Linux（主要ディストリビューション）
- macOS（GNU ツールの追加推奨）
- Windows（WSL または native）
- BSD 系 Unix

### Tree-sitter サポート

- Emacs 29.1 以上で利用可能
- Emacs 30.1 以上で大幅改善
