Skip to content

Instantly share code, notes, and snippets.

@LuckOfWise
Created April 4, 2026 17:08
Show Gist options
  • Select an option

  • Save LuckOfWise/7cf3a3d88d6fe3165aa4b17f878c620a to your computer and use it in GitHub Desktop.

Select an option

Save LuckOfWise/7cf3a3d88d6fe3165aa4b17f878c620a to your computer and use it in GitHub Desktop.
SonicGarden Rails プロジェクト初期セットアップスクリプト(rails new 後に実行)
#!/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