# バッチ設計書 6-entrypoint.sh

## 概要

本ドキュメントは、Dockerコンテナ用のnginxエントリーポイントスクリプト `entrypoint.sh` の設計仕様を記載する。

### 本バッチの処理概要

本バッチは、GhosttyのLibCドキュメントを配信するDockerコンテナのエントリーポイントスクリプトであり、nginx設定の動的生成とnginxプロセスの起動を行う。

**業務上の目的・背景**：Ghosttyは C言語バインディング用のドキュメント（LibC docs）をDockerコンテナ経由で配信している。このドキュメントサイトは、開発環境や検証環境ではクローラーによるインデックス化を防ぐためにnoindexヘッダーを付与する必要がある一方、本番環境では検索エンジンに公開する必要がある。本スクリプトは、環境変数に基づいてnginx設定を動的に生成することで、単一のDockerイメージで両方のユースケースに対応する。

**バッチの実行タイミング**：Dockerコンテナ起動時（CMD/ENTRYPOINTとして）

**主要な処理内容**：
1. ADD_NOINDEX_HEADER環境変数の値をチェック
2. 環境変数に応じたnginx設定ファイルを生成
3. nginxをフォアグラウンドで起動

**前後の処理との関連**：Dockerコンテナのビルド後、コンテナ実行時に最初に実行されるスクリプト。コンテナが停止するまでnginxプロセスが実行され続ける。

**影響範囲**：コンテナ内のnginx設定ファイル、HTTPレスポンスヘッダー

## バッチ種別

サーバー初期化 / 設定生成

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | コンテナ起動時 |
| 実行時刻 | - |
| 実行曜日 | - |
| 実行日 | - |
| トリガー | docker run / コンテナ起動 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| nginx | nginxがインストールされていること |
| /etc/nginx/conf.d/ | nginx設定ディレクトリが存在すること |
| /usr/share/nginx/html | ドキュメントファイルが配置されていること |

### 実行可否判定

- 常に実行可能（Docker ENTRYPOINTとして必ず実行される）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| ADD_NOINDEX_HEADER | 環境変数 | No | 空（false扱い） | "true"の場合noindexヘッダーを付与 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| /usr/share/nginx/html | HTML/静的ファイル | 配信対象のドキュメントファイル |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| /etc/nginx/conf.d/noindex.conf | nginx設定 | noindex有効時の設定ファイル |
| /etc/nginx/conf.d/default.conf | nginx設定 | 通常時の設定ファイル |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | noindex.conf または default.conf |
| 出力先 | /etc/nginx/conf.d/ |
| 文字コード | UTF-8 |
| 区切り文字 | - |

## 処理フロー

### 処理シーケンス

```
1. 環境変数チェック
   └─ ADD_NOINDEX_HEADER の値を確認
2. nginx設定ファイル生成（noindex有効時）
   └─ noindex.conf を生成（X-Robots-Tag: noindex, nofollow ヘッダー付き）
   └─ default.conf を削除
3. nginx設定ファイル生成（noindex無効時）
   └─ default.conf を生成（ロボットタグなし）
4. nginx起動
   └─ exec nginx -g "daemon off;" でフォアグラウンド実行
```

### フローチャート

```mermaid
flowchart TD
    A[コンテナ起動] --> B{ADD_NOINDEX_HEADER=true?}
    B -->|true| C[noindex.conf生成]
    C --> D[default.conf削除]
    D --> E[nginx起動]
    B -->|false/未設定| F[default.conf生成]
    F --> E
    E --> G[HTTPサービス開始]
```

## データベース操作仕様

### 操作別データベース影響一覧

本バッチはデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 非0 | nginx起動失敗 | 設定ファイルエラー等 | nginx設定を確認 |
| 非0 | 権限エラー | 設定ファイル書き込み権限なし | コンテナのユーザー権限を確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | - |
| リトライ対象エラー | - |

### 障害時対応

1. コンテナログを確認してエラー原因を特定
2. nginx設定のシンタックスエラーがないか確認
3. 必要に応じてコンテナを再起動

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし |
| コミットタイミング | - |
| ロールバック条件 | - |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回（起動時のみ） |
| 目標処理時間 | 1秒以内 |
| メモリ使用量上限 | 特に制限なし |

## 排他制御

単一コンテナで1プロセスとして実行されるため、排他制御は不要。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | なし | - |
| 進捗ログ | なし | - |
| 終了ログ | なし | - |
| エラーログ | nginx起動失敗時 | nginxのエラーログ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| HTTPレスポンス | 非200 | コンテナヘルスチェック |
| プロセス状態 | nginx停止 | コンテナ再起動 |

## 備考

### nginx設定の詳細

**共通設定**:
- listen 80: ポート80でHTTP接続を受付
- root /usr/share/nginx/html: ドキュメントルート
- index index.html: デフォルトインデックスファイル
- etag on: ETagによるキャッシュ制御有効
- Cache-Control: no-cache: 常に再検証を要求
- Content-Security-Policy: XSS対策のセキュリティヘッダー

**noindex有効時の追加設定**:
- X-Robots-Tag: noindex, nofollow: クローラーによるインデックス化を防止

**Content-Security-Policy設定**:
- default-src 'self': 同一オリジンからのみリソース読み込みを許可
- script-src 'self' 'unsafe-inline': インラインスクリプトを許可
- style-src 'self' 'unsafe-inline': インラインスタイルを許可
- img-src 'self' data:: 同一オリジンとdata URIの画像を許可

### execの使用理由
`exec nginx` を使用することで、シェルプロセスをnginxプロセスに置き換え、PID 1でnginxが実行される。これにより、シグナル処理が正しく行われ、コンテナの適切なシャットダウンが可能になる。
