App Store 日本市場のランキングデータ(無料・有料・売上上位)を毎週自動収集し、 カテゴリ別の参入難易度(ブルーオーシャンスコア)をビジュアル表示する Next.js ダッシュボード。
- App Store RSS + iTunes Lookup API でカテゴリ別トップ 25 アプリを取得
- 平均レビュー数・平均評価・有料率からブルーオーシャンスコアを算出
- SQLite にデータを蓄積(
data/research.db) - 週次 systemd timer で自動クロール(毎週日曜 03:00 JST)
- Next.js + Tailwind + Recharts によるダッシュボード UI
- Node.js 20 LTS
- Python 3.9+(
requestsパッケージ)
# 1. 依存パッケージインストール
npm install
# 2. Python 依存インストール
pip3 install requests
# 3. 初回クロール(data/research.db を生成)
python3 scripts/crawl.py free
python3 scripts/crawl.py paid
python3 scripts/crawl.py grossing
# 4. 開発サーバー起動
npm run dev
# → http://localhost:3000appstore-research/
├── app/ # Next.js App Router
│ ├── page.tsx # メインダッシュボード
│ ├── layout.tsx
│ └── api/ # API Routes(SQLite アクセス)
├── components/ # UI コンポーネント
├── lib/
│ ├── db.ts # better-sqlite3 ラッパー
│ └── score.ts # ブルーオーシャンスコア計算
├── scripts/
│ └── crawl.py # App Store クローラー
├── deploy/
│ ├── setup.sh # VPS 一発セットアップスクリプト
│ ├── nginx.conf # nginx リバースプロキシ設定
│ ├── appstore-crawl.service # systemd サービス
│ └── appstore-crawl.timer # systemd タイマー(週次)
└── data/ # SQLite DB(.gitignore 対象)
└── research.db
- ConoHa VPS(Ubuntu 24.04)
- SSH 接続済み
- Git リポジトリが GitHub 等で公開または SSH アクセス可能
# 1. VPS に SSH ログイン
ssh ubuntu@<VPS-IP>
# 2. リポジトリをクローン
git clone <your-repo-url> /var/www/appstore-research
# 3. セットアップスクリプトを実行(以後すべて自動)
cd /var/www/appstore-research && bash deploy/setup.shsetup.sh が以下を自動実行します:
| ステップ | 内容 |
|---|---|
| 1 | apt パッケージ更新(nginx, python3, curl 等) |
| 2 | nvm 経由で Node.js 20 LTS インストール |
| 3 | pm2 グローバルインストール |
| 4 | Python requests パッケージ確認 |
| 5 | npm ci で依存インストール |
| 6 | 初回クロール実行(free / paid / grossing) |
| 7 | npm run build |
| 8 | pm2 でアプリ起動 + 自動起動設定 |
| 9 | nginx 設定 + systemd timer 有効化 |
完了後、http://<VPS-IP> でダッシュボードにアクセスできます。
# タイマー一覧と次回実行時刻
sudo systemctl list-timers | grep appstore
# タイマー詳細
sudo systemctl status appstore-crawl.timer
# 直近のクロールログ
sudo journalctl -u appstore-crawl.service -n 50# タイマーを即時実行(テスト)
sudo systemctl start appstore-crawl.service
# タイマーを一時停止
sudo systemctl stop appstore-crawl.timer
# タイマーを再開
sudo systemctl start appstore-crawl.timercd /var/www/appstore-research
sqlite3 data/research.db "SELECT id, ran_at, type FROM crawl_runs ORDER BY id DESC LIMIT 10;"sqlite3 data/research.db \
"SELECT category_name, rank_type, blue_ocean_score, avg_review_count \
FROM category_stats \
WHERE run_id = (SELECT MAX(id) FROM crawl_runs) \
ORDER BY blue_ocean_score DESC;"cd /var/www/appstore-research
python3 scripts/crawl.py free
python3 scripts/crawl.py paid
python3 scripts/crawl.py grossing# pm2 状態確認
pm2 status
# pm2 ログ
pm2 logs appstore-research
# アプリ再起動
pm2 restart appstore-research
# Next.js 再ビルド後に再起動
cd /var/www/appstore-research && npm run build && pm2 restart appstore-research
# nginx 再起動
sudo systemctl reload nginx
# コード更新
cd /var/www/appstore-research
git pull
npm ci
npm run build
pm2 restart appstore-research