Created
April 4, 2026 17:08
-
-
Save LuckOfWise/7cf3a3d88d6fe3165aa4b17f878c620a to your computer and use it in GitHub Desktop.
SonicGarden Rails プロジェクト初期セットアップスクリプト(rails new 後に実行)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| # script/setup_project | |
| # | |
| # rails new 後に実行するプロジェクト初期セットアップスクリプト。 | |
| # 使い方: bash script/setup_project | |
| # | |
| # 前提: | |
| # - rails new が完了していること | |
| # - リファレンスプロジェクト(vote 等)が ghq 管理下にあること | |
| # - ghq コマンドが使えること(なければ REFERENCE_PROJECT を直接指定) | |
| set -euo pipefail | |
| # ── 設定 ────────────────────────────────────────────────────────────────────── | |
| # リファレンスプロジェクト(Claude設定・doc/agent をコピーする元) | |
| REFERENCE_ORG="SonicGarden" | |
| REFERENCE_REPO="vote" | |
| REFERENCE_PROJECT="${REFERENCE_PROJECT:-$(ghq root)/github.com/${REFERENCE_ORG}/${REFERENCE_REPO}}" | |
| # カラー出力 | |
| RED='\033[0;31m' | |
| GREEN='\033[0;32m' | |
| YELLOW='\033[1;33m' | |
| BLUE='\033[0;34m' | |
| BOLD='\033[1m' | |
| NC='\033[0m' | |
| # ── ヘルパー ─────────────────────────────────────────────────────────────────── | |
| info() { echo -e "${BLUE}[INFO]${NC} $*"; } | |
| success() { echo -e "${GREEN}[OK]${NC} $*"; } | |
| warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } | |
| error() { echo -e "${RED}[ERROR]${NC} $*"; exit 1; } | |
| step() { echo -e "\n${BOLD}▶ $*${NC}"; } | |
| ask() { echo -e "${YELLOW}?${NC} $1"; read -r -p " > " "$2"; } | |
| # ── 事前チェック ─────────────────────────────────────────────────────────────── | |
| step "事前チェック" | |
| [[ -f "Gemfile" ]] || error "Gemfile が見つかりません。Rails プロジェクトのルートで実行してください。" | |
| [[ -d "$REFERENCE_PROJECT" ]] || error "リファレンスプロジェクトが見つかりません: $REFERENCE_PROJECT\n REFERENCE_PROJECT 環境変数で場所を指定してください。" | |
| success "チェック完了" | |
| # ── プロジェクト情報を収集 ─────────────────────────────────────────────────── | |
| step "プロジェクト情報の収集" | |
| PROJECT_NAME=$(basename "$(pwd)") | |
| echo "" | |
| echo " プロジェクト名: ${BOLD}${PROJECT_NAME}${NC}" | |
| echo "" | |
| ask "DB ユーザー名 (例: sg_app_${PROJECT_NAME}):" DB_USERNAME | |
| DB_USERNAME="${DB_USERNAME:-sg_app_${PROJECT_NAME}}" | |
| ask "本番 DB ホスト (例: kamaly-production.clskag008xxi.ap-northeast-1.rds.amazonaws.com):" DB_HOST | |
| ask "S3 バケット名 (例: sg-cloud-${PROJECT_NAME}-strg):" S3_BUCKET | |
| S3_BUCKET="${S3_BUCKET:-sg-cloud-${PROJECT_NAME}-strg}" | |
| echo "" | |
| info "設定内容:" | |
| echo " DB_USERNAME: $DB_USERNAME" | |
| echo " DB_HOST: $DB_HOST" | |
| echo " S3_BUCKET: $S3_BUCKET" | |
| echo "" | |
| ask "この内容で続行しますか? [y/N]" CONFIRM | |
| [[ "$CONFIRM" =~ ^[Yy]$ ]] || { warn "中止しました"; exit 0; } | |
| # ── 1. .gitignore ────────────────────────────────────────────────────────────── | |
| step ".gitignore に .idea/ を追加" | |
| if grep -q "\.idea/" .gitignore 2>/dev/null; then | |
| warn ".idea/ はすでに .gitignore に含まれています" | |
| else | |
| echo "" >> .gitignore | |
| echo ".idea/" >> .gitignore | |
| success ".idea/ を追加しました" | |
| fi | |
| # ── 2. Gemfile ───────────────────────────────────────────────────────────────── | |
| step "Gemfile に aws-sdk-s3 を追加" | |
| if grep -q "aws-sdk-s3" Gemfile; then | |
| warn "aws-sdk-s3 はすでに Gemfile に含まれています" | |
| else | |
| # image_processing の後に挿入 | |
| if grep -q "image_processing" Gemfile; then | |
| sed -i '' '/gem "image_processing"/a\ | |
| gem "aws-sdk-s3", require: false' Gemfile | |
| else | |
| echo 'gem "aws-sdk-s3", require: false' >> Gemfile | |
| fi | |
| success "aws-sdk-s3 を追加しました" | |
| fi | |
| # ── 3. config/storage.yml ───────────────────────────────────────────────────── | |
| step "config/storage.yml を S3 設定に更新" | |
| cat > config/storage.yml << YAML | |
| test: | |
| service: Disk | |
| root: <%= Rails.root.join("tmp/storage") %> | |
| local: | |
| service: Disk | |
| root: <%= Rails.root.join("storage") %> | |
| amazon: | |
| service: S3 | |
| access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> | |
| secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> | |
| region: ap-northeast-1 | |
| bucket: ${S3_BUCKET} | |
| YAML | |
| success "storage.yml を更新しました (bucket: ${S3_BUCKET})" | |
| # ── 4. config/environments/production.rb ────────────────────────────────────── | |
| step "config/environments/production.rb を更新" | |
| if grep -q "service = :amazon" config/environments/production.rb; then | |
| warn "すでに S3 設定が含まれています" | |
| else | |
| sed -i '' \ | |
| 's/config\.active_storage\.service = :local/config.active_storage.service = :amazon\n config.active_storage.resolve_model_to_route = :rails_storage_proxy/' \ | |
| config/environments/production.rb | |
| success "production.rb を更新しました" | |
| fi | |
| # ── 5. config/database.yml ──────────────────────────────────────────────────── | |
| step "config/database.yml を更新" | |
| # production セクションを置換 | |
| python3 - <<PYTHON | |
| import re | |
| with open('config/database.yml', 'r') as f: | |
| content = f.read() | |
| production_block = """production: | |
| primary: &primary_production | |
| <<: *default | |
| host: <%= ENV["DATABASE_HOST"] %> | |
| database: <%= ENV["DATABASE_NAME"] %> | |
| username: ${DB_USERNAME} | |
| password: <%= Rails.application.credentials.dig(:database, :password) %> | |
| cache: | |
| <<: *primary_production | |
| database: ${DB_USERNAME}_cache | |
| migrations_paths: db/cache_migrate | |
| queue: | |
| <<: *primary_production | |
| database: ${DB_USERNAME}_queue | |
| migrations_paths: db/queue_migrate | |
| """ | |
| # production: 以降を置換 | |
| content = re.sub(r'production:.*', production_block, content, flags=re.DOTALL) | |
| with open('config/database.yml', 'w') as f: | |
| f.write(content) | |
| PYTHON | |
| success "database.yml を更新しました" | |
| # ── 6. config/deploy.yml ────────────────────────────────────────────────────── | |
| step "config/deploy.yml に DB 環境変数を追加" | |
| if grep -q "DATABASE_HOST" config/deploy.yml; then | |
| warn "DATABASE_HOST はすでに deploy.yml に含まれています" | |
| else | |
| sed -i '' \ | |
| "/clear:/a\\ | |
| DATABASE_HOST: ${DB_HOST}\\ | |
| DATABASE_NAME: ${DB_USERNAME}" \ | |
| config/deploy.yml | |
| success "deploy.yml を更新しました" | |
| fi | |
| # ── 7. Claude Code 設定のコピー ──────────────────────────────────────────────── | |
| step "Claude Code 設定をリファレンスプロジェクトからコピー" | |
| mkdir -p .claude/agents .claude/commands | |
| # agents | |
| rsync -a --exclude="*.local.*" "${REFERENCE_PROJECT}/.claude/agents/" .claude/agents/ | |
| success ".claude/agents/ をコピーしました" | |
| # commands | |
| rsync -a "${REFERENCE_PROJECT}/.claude/commands/" .claude/commands/ | |
| success ".claude/commands/ をコピーしました" | |
| # doc/agent | |
| mkdir -p doc/agent | |
| rsync -a "${REFERENCE_PROJECT}/doc/agent/" doc/agent/ | |
| success "doc/agent/ をコピーしました" | |
| # ── 8. bundle install ───────────────────────────────────────────────────────── | |
| step "bundle install" | |
| bundle install | |
| success "bundle install 完了" | |
| # ── 完了メッセージ ───────────────────────────────────────────────────────────── | |
| echo "" | |
| echo -e "${GREEN}${BOLD}✓ セットアップ完了!${NC}" | |
| echo "" | |
| echo " 残りの手順:" | |
| echo "" | |
| echo " 1. Claude Code で apply-rules スキルを実行:" | |
| echo " ${BOLD}/apply-rules${NC}" | |
| echo "" | |
| echo " 2. credentials に以下を設定:" | |
| echo " ${BOLD}bin/rails credentials:edit${NC}" | |
| echo " database:" | |
| echo " password: ..." | |
| echo " aws:" | |
| echo " access_key_id: ..." | |
| echo " secret_access_key: ..." | |
| echo "" | |
| echo " 3. コミット:" | |
| echo " ${BOLD}git add -A && git commit -m '環境構築'${NC}" | |
| echo "" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment