Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
"ghcr.io/devcontainers/features/git:1": {
"ppa": false,
"version": "latest"
},
"ghcr.io/devcontainers/features/github-cli:1": {
"version": "latest"
}
},
"customizations": {
Expand Down Expand Up @@ -73,7 +76,6 @@
},
"mounts": [
"source=${localEnv:HOME}/.ssh,target=/home/vscode/.ssh,type=bind,readonly",
"source=opencode-data,target=/home/vscode/.opencode,type=volume",
"source=tailscale-state,target=/var/lib/tailscale,type=volume"
]
}
10 changes: 7 additions & 3 deletions .devcontainer/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,13 @@ services:
# ボリューム
volumes:
- ../:/workspace:cached
- opencode-data:/home/vscode/.opencode
# エージェント設定
- ../.devcontainer/data/opencode:/home/vscode/.opencode
# OpenCode セッションデータ
- ../.devcontainer/data/opencode-storage:/home/vscode/.local/share/opencode
# ECC データベース
- ../.devcontainer/data/claude:/home/vscode/.claude
# Tailscale
- tailscale-state:/var/lib/tailscale
- tailscale-run:/run/tailscale
- /var/run/docker.sock:/var/run/docker-host.sock
Expand All @@ -57,8 +63,6 @@ services:
start_period: 60s

volumes:
opencode-data:
driver: local
tailscale-state:
driver: local
tailscale-run:
Expand Down
9 changes: 8 additions & 1 deletion .devcontainer/setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,12 @@ if [ ${#INSTALL_PIDS[@]} -gt 0 ]; then
done
fi

# bind mount 環境では /home/vscode/.local や ~/.opencode が root 所有になるため先に補正
echo "🔒 ホーム配下ディレクトリ権限を初期化中..."
sudo mkdir -p /home/vscode/.local /home/vscode/.local/bin /home/vscode/.opencode 2>/dev/null || true
sudo chown -R vscode:vscode /home/vscode/.local /home/vscode/.opencode 2>/dev/null || \
chown -R vscode:vscode /home/vscode/.local /home/vscode/.opencode 2>/dev/null || true

# Pythonツール管理用 uv の準備
if ! command -v uv &> /dev/null; then
echo "🐍 uv をインストール中..."
Expand All @@ -109,7 +115,8 @@ echo " ECC設定を適用中..."

# .opencode ディレクトリ権限修正(EACCES エラー対策)
echo " 🔒 .opencode ディレクトリ権限設定中..."
mkdir -p ~/.opencode ~/.opencode/.agents ~/.opencode/.agents/skills
sudo mkdir -p ~/.opencode ~/.opencode/.agents ~/.opencode/.agents/skills 2>/dev/null || \
mkdir -p ~/.opencode ~/.opencode/.agents ~/.opencode/.agents/skills
sudo chown -R vscode:vscode ~/.opencode 2>/dev/null || chown -R vscode:vscode ~/.opencode 2>/dev/null || true
chmod -R 755 ~/.opencode 2>/dev/null || true

Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ temp/
# Docker関連
.docker/
.devcontainer/.setup-complete
.devcontainer/data/
!.devcontainer/data/.gitkeep

# Tailscale状態(セキュリティ)
*.key
Expand Down
193 changes: 193 additions & 0 deletions docs/SESSION_DATA_PERSISTENCE_COMPLETE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
# ✅ セッションデータ永続化の完全修正レポート

## 📋 最終成果

### ✅ 全3つのデータディレクトリが永続化されました

| ディレクトリ | 用途 | マウント先 | サイズ |
|------------|------|-----------|--------|
| `.opencode/` | エージェント設定 | `/home/vscode/.opencode` | 308KB |
| `opencode-storage/` | **セッションデータ** | `/home/vscode/.local/share/opencode` | **1.76MB** |
| `claude/` | **ECCデータベース** | `/home/vscode/.claude` | **118KB** |

## 🔍 問題の経緯

### 初回問題(修正済み)
- **症状**: `.devcontainer/data/opencode`をマウントしたがリビルド後にセッション保持されない
- **原因**: 古いDocker volume `opencode-data`がバインドマウントを上書き
- **対応**: 古いボリュームを削除してバインドマウントを有効化

### 第2の問題(本日発見・修正)
- **症状**: DevContainerで開いてもセッション情報が読み込まれない
- **原因**: **エージェント設定とセッションデータは別の場所に保存される**
- `.opencode/` → エージェント設定のみ(正しくマウント済み)
- `.local/share/opencode/` → **セッションデータ**(マウントされていなかった❌)
- `.claude/` → **ECCデータベース**(マウントされていなかった❌)

## 🛠️ 実施した修正

### 1. docker-compose.yml にマウント追加

```yaml
volumes:
- ../:/workspace:cached
# エージェント設定
- ../.devcontainer/data/opencode:/home/vscode/.opencode
# OpenCode セッションデータ(追加✅)
- ../.devcontainer/data/opencode-storage:/home/vscode/.local/share/opencode
# ECC データベース(追加✅)
- ../.devcontainer/data/claude:/home/vscode/.claude
# Tailscale
- tailscale-state:/var/lib/tailscale
- tailscale-run:/run/tailscale
- /var/run/docker.sock:/var/run/docker-host.sock
```

### 2. 既存データの移行

```bash
# 現在実行中のコンテナからデータをコピー
docker cp opencode-ecc-dev:/home/vscode/.local/share/opencode/. \
.devcontainer/data/opencode-storage/

docker cp opencode-ecc-dev:/home/vscode/.claude/. \
.devcontainer/data/claude/

# コンテナ再起動
docker stop opencode-ecc-dev && docker rm opencode-ecc-dev
docker compose -f .devcontainer/docker-compose.yml up -d
```

## ✅ 検証結果

### マウント状態(全てbind)
```json
[
{
"Source": ".../data/opencode",
"Destination": "/home/vscode/.opencode",
"Type": "bind" ✅
},
{
"Source": ".../data/opencode-storage",
"Destination": "/home/vscode/.local/share/opencode",
"Type": "bind" ✅
},
{
"Source": ".../data/claude",
"Destination": "/home/vscode/.claude",
"Type": "bind" ✅
}
]
```

### データ同期テスト
- ✅ コンテナ内でファイル作成 → ホスト側に即座に反映
- ✅ ホスト側でファイル作成 → コンテナ内で即座に確認可能
- ✅ データベースファイル(opencode.db)が正しく同期

### セッションデータの内容
- ✅ `opencode.db` (144KB) - セッション履歴、設定
- ✅ `auth.json` - 認証情報
- ✅ `storage/` - セッション差分、スナップショット
- ✅ `log/` - ログファイル
- ✅ `snapshot/` - スナップショットデータ

### ECCデータの内容
- ✅ `ecc/state.db` - ECCステータス、スキル実行履歴
- ✅ `homunculus/` - Homunculus データ

## 🎯 期待される動作

### リビルド前
1. OpenCodeでセッション作業
2. チャット履歴、エージェント実行結果が保存される
3. データは以下に保存:
- エージェント設定: `.devcontainer/data/opencode/`
- **セッション**: `.devcontainer/data/opencode-storage/`
- **ECC DB**: `.devcontainer/data/claude/`

### リビルド後
1. ✅ エージェント設定が読み込まれる
2. ✅ **セッション履歴が保持される**(NEW!)
3. ✅ **チャット内容が継続**(NEW!)
4. ✅ **ECCステータスが維持される**(NEW!)
5. ✅ 作業の続きから再開可能

### バックアップ
- ホスト側でデータを直接確認・バックアップ可能
- `.devcontainer/data/` ディレクトリ全体をバックアップすれば完全保存
- Git管理対象外(.gitignore設定済み)

## 📂 ディレクトリ構造

```
.devcontainer/data/
├── opencode/ # エージェント設定
│ ├── agents/
│ ├── commands/
│ ├── AGENTS.md
│ └── ecc-install-state.json
├── opencode-storage/ # セッションデータ(NEW✅)
│ ├── opencode.db # メインDB
│ ├── opencode.db-wal # WALログ
│ ├── auth.json # 認証
│ ├── storage/ # セッション差分
│ ├── snapshot/ # スナップショット
│ └── log/ # ログ
├── claude/ # ECCデータ(NEW✅)
│ ├── ecc/
│ │ └── state.db # ECCステータス
│ └── homunculus/ # Homunculus
└── opencode-backup/ # バックアップ
```

## 🔐 .gitignore 設定

```gitignore
# DevContainer データ(個人セッション)
.devcontainer/data/opencode/*
!.devcontainer/data/opencode/.gitkeep
.devcontainer/data/opencode-storage/*
!.devcontainer/data/opencode-storage/.gitkeep
.devcontainer/data/claude/*
!.devcontainer/data/claude/.gitkeep
.devcontainer/data/opencode-backup/
```

## 📝 注意事項

### データベースファイル
- `opencode.db-wal` と `opencode.db-shm` は SQLite のWALモード用
- これらもホスト側に同期されるため、データの一貫性が保たれる
- コンテナ停止時に自動でマージされる

### 権限
- コンテナ内では `vscode:vscode` ユーザー
- ホスト側では作成したユーザー(例: `fjsn:fjsn`)
- バインドマウントなので、どちらからでも読み書き可能

### パフォーマンス
- バインドマウントは `:cached` オプション不要(設定も可能)
- データベースファイルのI/Oが多い場合は注意
- 現状のサイズ(~2MB)なら問題なし

## 🎉 まとめ

### 修正前の問題
❌ エージェント設定のみ保持(308KB)
❌ セッション履歴が失われる
❌ リビルドのたびに初期状態に戻る

### 修正後の状態
✅ **全てのデータが永続化**(合計 ~2.2MB)
✅ **セッション履歴が完全に保持**
✅ **リビルド後も作業を継続可能**
✅ **ホスト側でバックアップ可能**
✅ **複数コンテナ間でデータ共有可能**(同じマウント先を使用)

---

**修正日**: 2026年4月7日
**対象**: OpenCode + OpenChamber + ECC DevContainer
**結果**: ✅ セッションデータ永続化の完全実装
Loading
Loading