09-06. ケース 6: 個人 Web サービスの保守 — 本リポジトリを生きた教材として
シチュエーション
個人で運営する Web サービスがある(複数の小さいアプリ群)。 週末に少しずつ保守 したいが、久々に触ると:
- プロジェクト構造を思い出すのに 30 分
- 依存パッケージのアップデートで予期せぬ破壊
- バグ修正のために本番ログを掘り起こす苦労
- 「軽微な追加機能」のはずが半日仕事に
Before (Claude Code を使わない場合)
- 前回触ってから 3 か月、コードの記憶が薄れている
- 各アプリで使ってる技術スタック・デプロイ手順が違う
- バックアップ取り忘れて事故 → 復旧で土曜が消える
After (Claude Code を使う場合)
各アプリに CLAUDE.md が整備されている前提で:
# 毎回 Jupyter で
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv("./data/sales.csv")
df["date"] = pd.to_datetime(df["date"])
monthly = df.groupby(df["date"].dt.to_period("M"))["amount"].sum()
plt.figure(figsize=(10,4))
monthly.plot()
plt.title("Monthly Sales")
...
→ Claude が CLAUDE.md を読んで現状把握 → 影響ファイルを列挙 → 順次変更 → デプロイ手順を そのまま 実行(CLAUDE.md に書いてある)。
メタ実例: 本リポジトリ ★digitaocean_claudecode
このリポジトリ自体が Claude Code で運用されている 実例。 本セクションでは、本リポジトリの CLAUDE.md と、これまでに行われた 5 つの開発エピソードを 生きた教材 として解剖する:
エピソード 1: 「Nginx の sites-enabled は symlink ではなく独立ファイル」
- 過去に何度も踏んだ罠を CLAUDE.md の Critical Rules に明記
- 結果: 同じ罠に二度と踏まない
- 教訓: 過去の失敗を CLAUDE.md に文章化する だけで、AI も人間も助かる
エピソード 2: 共有 venv と専用 venv のジレンマ
- 4 アプリが共有 venv (
/var/www/venv) を使用 - 1 つだけ最新 SDK が必要になった (Extended Thinking 用)
- → 専用 venv に切替、CLAUDE.md に「他アプリも使うので削除厳禁」と明記
- 教訓: 依存の局所化 はトラブルの局所化に繋がる
エピソード 3: レート制限の追加
- 勉強会参加者が増えた → API コストが心配に
- Claude に相談 → SQLite テーブル + デコレータ的な helper で実装
- 1 セッション(数時間)で完成
- 教訓: 小さい改善を週末に積む ことができるのが個人 Web サービスの強み
エピソード 4: レスポンシブナビの修正
- ナビバーが日本語で縦割れ(エラー画像で報告)
- Claude が
whitespace-nowrap不足を即座に特定 - ハンバーガーメニュー追加 + ブレイクポイント再設計
- 教訓: エラー画像を Claude に見せる だけで原因特定が早い
エピソード 5: ドキュメント更新
- アプリの仕様変更後、
backup/app_CLAUDE/<app>_CLAUDE.mdを更新 - Claude に「最新の仕様で書き直して」と依頼 → 更新完了
- 教訓: ドキュメントは Claude に頼める仕事(人間が偏執的にやらなくていい)
必要な道具立て
| 機能 | 何のために |
|---|---|
| 各アプリの CLAUDE.md | 本リポジトリのものをテンプレに |
| 親リポの CLAUDE.md | アプリ間の共通ルール、SSH 接続情報 |
| Skill: deploy-checklist | デプロイ前後の確認手順を強制 |
| Hook: PreToolUse (Bash) | rm -rf / DROP TABLE を必ずブロック |
| バックアップスクリプト | 定期的に取得 |
Skill .claude/skills/deploy-checklist/SKILL.md (例)
$ cd ~/projects/data-analysis
$ claude
> ./data/sales.csv の月次推移を可視化して、外れ値があれば指摘して
ワークフロー (週末 1 時間で 1 改善)
# データ分析プロジェクト
## データの場所
- `./data/raw/` — 元データ (変更禁止)
- `./data/processed/` — 前処理済み
- `./data/output/` — 分析結果(グラフ・レポート)
## よく使うライブラリ
- pandas, numpy, matplotlib, seaborn, scikit-learn, scipy
- どれも uv 環境にインストール済み(.venv 自動 activate)
## 分析の流儀
1. **EDA は必ず最初**: shape, dtype, null 数, describe を確認
2. **可視化は必ず保存**: `data/output/<日付>-<内容>.png`
3. **異常値検出**: IQR 法 + Z-score の両方
4. **結論は 3 行**: ビジネスインパクトを優先
## 避けたいこと
- `display(df)` で巨大データを画面に出す
- グラフを表示するだけで保存しない
- 統計的根拠なしの "外れ値っぽい" 判定
注意点・限界
- 本番 DB を直接触らない: 必ずバックアップ → ステージングで試す → 本番、の順
- 無料 SSL の更新忘れ: certbot の renew は cron で自動化、Claude に聞いて設定
- CLAUDE.md が更新されないと AI が古い情報で動く: 機能追加時に CLAUDE.md も同 PR で更新する習慣
- 個人運用の限界: 本気の SLA が必要なら自前運用やめてクラウドサービスへ
応用
- 複数人で運用するチーム小サービス: CLAUDE.md は 共有ナレッジ として PR レビュー対象に
- OSS への貢献: 本ケースの逆 — OSS リポに
CLAUDE.mdを contribute する PR を出す動きも増えている - 退職時の引き継ぎ: CLAUDE.md があれば後任が即戦力に
このケース後にできるようになること
- 個人 Web サービスを "週末 1 時間" で継続成長 させられる
- 過去の失敗を 資産化(CLAUDE.md の Critical Rules)
- 「個人開発の限界」がコード量ではなく 保守性 にあると気づく
- 本リポジトリのワークフロー(
local_temp/で編集 → SCP → systemctl restart → ログ確認)を 自分のサービスに移植 できる
章のまとめ (第9章のクロージング)
| ケース | 学んだこと |
|---|---|
| s1 リポジトリキャッチアップ | 新規参加プロジェクトを 1〜2 時間で把握 |
| s2 リファクタ自動化 | 機械的反復作業を半自動化 + テスト駆動 |
| s3 PR レビュー | チーム業務に AI を組み込む |
| s4 個人ナレッジベース | 蓄積を AI 横断検索可能に |
| s5 データ分析 | 探索的分析の高速化 |
| s6 Web サービス保守 | 全機能の総合運用 + 過去の失敗を資産化 |
第9章を通じて、Claude Code は 手段 であり、目的は 読者の業務効率化と価値創出 であることを体感した。
道具立ては段階的に: 1. 最初は CLAUDE.md だけ で始める 2. 課題が明確になったら Skill / Hook を足す 3. 特化型ワークフロー が必要になったら Agent SDK で独自エージェント
→ 「自分専用の AI 相棒」が育っていく。
関連
- 本リポジトリ
CLAUDE.md(これ自体が教材) - 09-04 個人ナレッジベース —
~/notes/の運用と本ケースの「複数 CLAUDE.md」運用は思想的に同根 - 08-04 Hooks — デプロイ事故防止の Hook