Skip to content

Commit 8f7db49

Browse files
authored
Merge pull request #2 from fjmrytfjsn/fix/setup
DevContainer基盤モードへの整理と起動フロー改善
2 parents ccd1e9c + f7fa46a commit 8f7db49

22 files changed

Lines changed: 962 additions & 2696 deletions

.devcontainer/Dockerfile

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,24 +49,33 @@ RUN --mount=type=cache,target=/tmp/npm-cache \
4949
npm install -g --prefer-offline @openchamber/web & \
5050
npm install -g --prefer-offline ecc-universal & \
5151
# 並列処理完了待ち
52-
wait
52+
wait && \
53+
# ECC ajv依存関係修正(既知の問題対応)
54+
ECC_DIR="$(npm root -g 2>/dev/null)/ecc-universal" && \
55+
if [ -d "$ECC_DIR" ]; then \
56+
cd "$ECC_DIR" && npm install ajv 2>/dev/null || true; \
57+
fi && \
58+
# グローバル ajv もインストール(フォールバック)
59+
npm install -g ajv 2>/dev/null || true
5360

5461
# ===== ステージ3: ユーザー環境(統合版) =====
5562
FROM dev-tools AS final
5663

5764
# VSCode ユーザー作成(条件付き - DevContainer対応)
58-
RUN if ! id "vscode" &>/dev/null; then \
65+
RUN if ! id "vscode" >/dev/null 2>&1; then \
5966
useradd -m -s /bin/bash vscode; \
6067
fi && \
6168
usermod -aG sudo vscode 2>/dev/null || true && \
6269
echo "vscode ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
63-
# 必要ディレクトリ作成
70+
# 必要ディレクトリ作成(権限エラー対策強化)
6471
mkdir -p /home/vscode/{.opencode,.config,workspace} && \
72+
mkdir -p /home/vscode/.opencode/{.agents,.agents/skills} && \
6573
# 環境変数設定を .bashrc に追加
6674
echo 'export VOLTA_HOME="/opt/volta"' >> /home/vscode/.bashrc && \
6775
echo 'export PATH="/opt/volta/bin:/opt/cargo/bin:$PATH"' >> /home/vscode/.bashrc && \
68-
# 権限設定(一括)
69-
chown -R vscode:vscode /home/vscode
76+
# 権限設定(一括・強化版)
77+
chown -R vscode:vscode /home/vscode && \
78+
chmod -R 755 /home/vscode/.opencode
7079

7180
# ===== 最終設定(変更頻度高 -> 下位レイヤー) =====
7281
WORKDIR /workspace

.devcontainer/devcontainer.json

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"enableNonRootDocker": "true"
2525
},
2626
"ghcr.io/devcontainers/features/git:1": {
27-
"ppa": true,
27+
"ppa": false,
2828
"version": "latest"
2929
}
3030
},
@@ -50,8 +50,7 @@
5050
},
5151
"forwardPorts": [
5252
3000,
53-
4095,
54-
8080
53+
4095
5554
],
5655
"portsAttributes": {
5756
"3000": {
@@ -61,16 +60,12 @@
6160
"4095": {
6261
"label": "OpenCode CLI Server",
6362
"protocol": "http"
64-
},
65-
"8080": {
66-
"label": "Development Server",
67-
"protocol": "http"
6863
}
6964
},
7065
"postCreateCommand": ".devcontainer/setup.sh",
7166
"postStartCommand": ".devcontainer/startup.sh",
7267
"postAttachCommand": {
73-
"welcome": "echo '🚀 OpenCode ECC DevContainer へようこそ!' && echo '' && echo '📋 次のステップ:' && echo ' 1️⃣ .env.template を .env にコピー' && echo ' 2️⃣ 必要に応じて .env を編集' && echo ' 3️⃣ 初回プロジェクト設定: ./.devcontainer/interactive-setup.sh' && echo '' && echo '🎨 サービスURL:' && echo ' 📍 OpenChamber: http://localhost:3000' && echo ' 🤖 OpenCode CLI: http://localhost:4095' && echo ' 📊 ダッシュボード: http://localhost:8080'"
68+
"welcome": "echo '🚀 OpenCode ECC DevContainer へようこそ!' && echo '' && echo '📋 次のステップ:' && echo ' 1️⃣ .env.template を .env にコピー' && echo ' 2️⃣ 必要に応じて ./.devcontainer/interactive-setup.sh でTailscale設定' && echo '' && echo '🎨 サービスURL:' && echo ' 📍 OpenChamber: http://localhost:3000' && echo ' 🤖 OpenCode CLI: http://localhost:4095'"
7469
},
7570
"remoteUser": "vscode",
7671
"mounts": [

.devcontainer/docker-compose.yml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
version: "3.8"
2-
31
services:
42
opencode-dev:
53
build:
@@ -8,8 +6,6 @@ services:
86
# 🚀 ビルド最適化設定
97
args:
108
- BUILDKIT_INLINE_CACHE=1
11-
cache_from:
12-
- ghcr.io/opencode-ecc-devcontainer/cache:buildcache
139
target: final
1410
# 並列ビルド有効化
1511
platforms:
@@ -54,8 +50,7 @@ services:
5450

5551
# ヘルスチェック
5652
healthcheck:
57-
test:
58-
["CMD", "curl", "-f", "http://localhost:3000/health", "||", "exit", "1"]
53+
test: ["CMD-SHELL", "curl -fsS http://localhost:3000/health || exit 1"]
5954
interval: 30s
6055
timeout: 10s
6156
retries: 5

.devcontainer/entrypoint.sh

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@
22

33
echo "🔧 OpenCode ECC DevContainer エントリーポイント"
44

5-
# Tailscale daemon 起動
6-
if [ -n "$TAILSCALE_AUTH_KEY" ]; then
7-
echo "🌐 Tailscale daemon 起動中..."
8-
sudo tailscaled --state-dir=/var/lib/tailscale --socket=/run/tailscale/tailscaled.sock &
9-
fi
5+
# tailscaled startup is centrally handled by .devcontainer/startup.sh
6+
# to keep daemon flags and lifecycle behavior consistent.
107

118
# メインプロセス実行
129
exec "$@"

.devcontainer/env-validator.sh

Lines changed: 52 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@
44

55
set -e
66

7+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8+
source "$SCRIPT_DIR/lib/common.sh"
9+
set -e
10+
11+
if [[ -d "/workspace/.devcontainer" ]]; then
12+
WORKSPACE_ROOT="/workspace"
13+
else
14+
WORKSPACE_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
15+
fi
16+
717
# カラー定義
818
RED='\033[0;31m'
919
GREEN='\033[0;32m'
@@ -13,19 +23,8 @@ CYAN='\033[0;36m'
1323
NC='\033[0m'
1424

1525
# 設定ファイルパス検出
16-
if [[ -f "/workspace/.env.template" ]]; then
17-
# DevContainer内での実行
18-
ENV_FILE="/workspace/.env"
19-
ENV_TEMPLATE="/workspace/.env.template"
20-
elif [[ -f "$(pwd)/.env.template" ]]; then
21-
# ローカルでの実行
22-
ENV_FILE="$(pwd)/.env"
23-
ENV_TEMPLATE="$(pwd)/.env.template"
24-
else
25-
# 現在ディレクトリから検索
26-
ENV_FILE=".env"
27-
ENV_TEMPLATE=".env.template"
28-
fi
26+
ENV_FILE=$(resolve_env_file)
27+
ENV_TEMPLATE=$(resolve_env_template_file)
2928

3029
echo -e "${BLUE}🔐 環境変数セキュリティチェック開始${NC}"
3130

@@ -44,53 +43,52 @@ fi
4443
# 必須環境変数チェック
4544
echo -e "${CYAN}🔍 必須環境変数をチェック中...${NC}"
4645

47-
source "$ENV_FILE"
46+
load_env_file "$ENV_FILE"
4847

4948
# Tailscale Auth Key 検証
50-
if [[ -z "$TAILSCALE_AUTH_KEY" || "$TAILSCALE_AUTH_KEY" == "your-tailscale-auth-key-here" ]]; then
51-
echo -e "${RED}TAILSCALE_AUTH_KEY が設定されていません${NC}"
49+
if ! is_valid_tailscale_key "$TAILSCALE_AUTH_KEY"; then
50+
echo -e "${YELLOW}⚠️ TAILSCALE_AUTH_KEY が未設定です(ローカルモードで利用可能)${NC}"
5251
echo ""
5352
echo -e "${YELLOW}📝 Tailscale Auth Key 設定手順:${NC}"
5453
echo " 1. https://login.tailscale.com/admin/settings/keys にアクセス"
5554
echo " 2. 'Generate auth key' をクリック"
5655
echo " 3. 'Reusable' と 'Ephemeral' をチェック"
5756
echo " 4. 生成されたキーを .env ファイルに設定"
5857
echo ""
59-
echo -e "${CYAN}今すぐ設定しますか? (y/N): ${NC}"
60-
read -r SET_AUTH_KEY
61-
62-
if [[ "$SET_AUTH_KEY" =~ ^[Yy]$ ]]; then
63-
echo -e "${CYAN}Tailscale Auth Key を入力してください:${NC}"
64-
read -s -p "🔑 Auth Key: " NEW_AUTH_KEY
65-
echo ""
66-
67-
if [[ -n "$NEW_AUTH_KEY" && "$NEW_AUTH_KEY" =~ ^tskey-auth- ]]; then
68-
# .env ファイル更新
69-
sed -i "s/TAILSCALE_AUTH_KEY=.*/TAILSCALE_AUTH_KEY=\"$NEW_AUTH_KEY\"/" "$ENV_FILE"
70-
echo -e "${GREEN}✅ Tailscale Auth Key を設定しました${NC}"
71-
TAILSCALE_AUTH_KEY="$NEW_AUTH_KEY"
58+
if is_ci_mode; then
59+
echo -e "${YELLOW}ℹ️ CIモードのため対話入力をスキップします${NC}"
60+
else
61+
echo -e "${CYAN}今すぐ設定しますか? (y/N): ${NC}"
62+
read -r SET_AUTH_KEY
63+
64+
if [[ "$SET_AUTH_KEY" =~ ^[Yy]$ ]]; then
65+
echo -e "${CYAN}Tailscale Auth Key を入力してください:${NC}"
66+
read -s -p "🔑 Auth Key: " NEW_AUTH_KEY
67+
echo ""
68+
69+
if is_valid_tailscale_key "$NEW_AUTH_KEY"; then
70+
# .env ファイル更新
71+
upsert_env_value "$ENV_FILE" "TAILSCALE_AUTH_KEY" "$NEW_AUTH_KEY"
72+
echo -e "${GREEN}✅ Tailscale Auth Key を設定しました${NC}"
73+
TAILSCALE_AUTH_KEY="$NEW_AUTH_KEY"
74+
else
75+
echo -e "${YELLOW}⚠️ 無効なAuth Keyです。後で手動で設定してください${NC}"
76+
fi
7277
else
73-
echo -e "${RED}❌ 無効なAuth Keyです。後で手動で設定してください${NC}"
78+
echo -e "${YELLOW}⚠️ 後で手動で設定してください${NC}"
7479
fi
75-
else
76-
echo -e "${YELLOW}⚠️ 後で手動で設定してください${NC}"
7780
fi
7881
fi
7982

8083
# Auth Key 形式チェック
81-
if [[ -n "$TAILSCALE_AUTH_KEY" && "$TAILSCALE_AUTH_KEY" != "your-tailscale-auth-key-here" ]]; then
82-
if [[ "$TAILSCALE_AUTH_KEY" =~ ^tskey-auth- ]]; then
84+
if [[ -n "$TAILSCALE_AUTH_KEY" ]]; then
85+
if is_valid_tailscale_key "$TAILSCALE_AUTH_KEY"; then
8386
echo -e "${GREEN}✅ Tailscale Auth Key: 正常${NC}"
84-
else
87+
elif ! is_placeholder_tailscale_key "$TAILSCALE_AUTH_KEY"; then
8588
echo -e "${YELLOW}⚠️ Auth Key の形式が正しくない可能性があります${NC}"
8689
fi
8790
fi
8891

89-
# プロジェクト名チェック
90-
if [[ -z "$PROJECT_NAME" ]]; then
91-
echo -e "${YELLOW}⚠️ PROJECT_NAME が設定されていません(オプション)${NC}"
92-
fi
93-
9492
# ECC プロファイル検証
9593
VALID_PROFILES=("minimal" "developer" "full")
9694
if [[ -n "$ECC_PROFILE" ]]; then
@@ -105,8 +103,8 @@ else
105103
fi
106104

107105
# ポート競合チェック
108-
PORTS=("$OPENCODE_PORT" "$OPENCHAMBER_PORT" "$DEV_SERVER_PORT")
109-
DEFAULT_PORTS=("4095" "3000" "8080")
106+
PORTS=("$OPENCODE_PORT" "$OPENCHAMBER_PORT")
107+
DEFAULT_PORTS=("4095" "3000")
110108

111109
for i in "${!PORTS[@]}"; do
112110
PORT=${PORTS[$i]:-${DEFAULT_PORTS[$i]}}
@@ -123,23 +121,23 @@ done
123121
echo -e "${CYAN}🔒 ファイル権限をチェック中...${NC}"
124122

125123
# .env ファイルの権限を制限(機密情報保護)
126-
chmod 600 "$ENV_FILE"
124+
ensure_env_permissions "$ENV_FILE"
127125
echo -e "${GREEN}✅ .env ファイル権限: 600 (所有者のみ読み書き)${NC}"
128126

129127
# スクリプトファイルの実行権限
130-
SCRIPTS_DIR="/workspace/scripts"
128+
SCRIPTS_DIR="$WORKSPACE_ROOT/scripts"
131129
if [[ -d "$SCRIPTS_DIR" ]]; then
132130
find "$SCRIPTS_DIR" -name "*.sh" -exec chmod +x {} \;
133131
echo -e "${GREEN}✅ スクリプト実行権限を設定しました${NC}"
134132
fi
135133

136134
# Git セキュリティチェック
137-
if [[ -f "/workspace/.gitignore" ]]; then
138-
if grep -q "\.env" "/workspace/.gitignore"; then
135+
if [[ -f "$WORKSPACE_ROOT/.gitignore" ]]; then
136+
if grep -q "\.env" "$WORKSPACE_ROOT/.gitignore"; then
139137
echo -e "${GREEN}✅ .env ファイルがGit管理対象外に設定済み${NC}"
140138
else
141139
echo -e "${YELLOW}⚠️ .env ファイルをGit管理対象外に追加します${NC}"
142-
echo ".env" >> "/workspace/.gitignore"
140+
echo ".env" >> "$WORKSPACE_ROOT/.gitignore"
143141
echo -e "${GREEN}✅ .gitignore に .env を追加しました${NC}"
144142
fi
145143
fi
@@ -150,18 +148,14 @@ echo -e "${BLUE}🔐 セキュリティチェック完了${NC}"
150148
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
151149

152150
# Auth Key 状態
153-
if [[ -n "$TAILSCALE_AUTH_KEY" && "$TAILSCALE_AUTH_KEY" != "your-tailscale-auth-key-here" ]]; then
151+
if is_valid_tailscale_key "$TAILSCALE_AUTH_KEY"; then
154152
echo -e "${GREEN}🔑 Tailscale Auth Key: 設定済み${NC}"
155153
else
156154
echo -e "${RED}🔑 Tailscale Auth Key: 未設定${NC}"
157155
fi
158156

159-
# プロジェクト情報
160-
if [[ -n "$PROJECT_NAME" ]]; then
161-
echo -e "${GREEN}📁 プロジェクト: $PROJECT_NAME${NC}"
162-
else
163-
echo -e "${YELLOW}📁 プロジェクト: 未設定${NC}"
164-
fi
157+
# 運用モード
158+
echo -e "${GREEN}🏗️ 基盤モード: 有効${NC}"
165159

166160
# ファイル保護
167161
echo -e "${GREEN}🔒 ファイル保護: 有効${NC}"
@@ -170,10 +164,8 @@ echo -e "${GREEN}🚫 Git除外設定: 有効${NC}"
170164
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
171165

172166
# 最終確認
173-
if [[ -z "$TAILSCALE_AUTH_KEY" || "$TAILSCALE_AUTH_KEY" == "your-tailscale-auth-key-here" ]]; then
174-
echo -e "${RED}⚠️ 重要: Tailscale Auth Keyが未設定です${NC}"
175-
echo -e "${CYAN}リモートアクセスを使用するには設定が必要です${NC}"
176-
exit 1
177-
else
167+
if is_valid_tailscale_key "$TAILSCALE_AUTH_KEY"; then
178168
echo -e "${GREEN}✅ セキュリティ設定完了 - 安全に使用できます${NC}"
179-
fi
169+
else
170+
echo -e "${YELLOW}✅ セキュリティ設定完了 - Tailscale未設定のためローカルモードです${NC}"
171+
fi

0 commit comments

Comments
 (0)