← 一覧に戻る

dev-tracker

GitHub ↗ TypeScript 最終push: 2026/5/30 18:58

WIP(現在進行中)

Work In Progress

このプロジェクトで現在進行中の作業と、過去のスナップショットを記録する。

現在の状況

ステータス: デプロイ方式を Lightsail ローカルビルドへ移行完了(§2 リポジトリ側 + §3 サーバー側すべて実施済み)

  • 公開URL: https://dev-tracker.ikapps.com/(HTTP 200・34 プロジェクト表示を確認)
  • 対象リポ: dev-tracked topic 付き(現在 34 リポ。dev-tracker 自身も含む)
  • 更新サイクル: Lightsail deploy crontab */30 * * * *scripts/publish-local.sh を flock 経由で直接実行してローカルビルド&公開
    • GitHub Actions は課金問題でビルド全滅 → ビルドそのものをサーバーへ移し Actions 依存をゼロに
    • 詳細手順は docs/lightsail-migration.md
  • インフラ:
    • Lightsail crontab → publish-local.sh(git fetch[Basic認証] → npm run build → ローカル rsync)→ Nginx
    • Let's Encrypt 自動更新
  • サーバー側の要点:
    • ビルド用トークン: /home/deploy/.dev-tracker-build-token(classic PAT, scope repo, 600 deploy 所有)
    • リポ: /home/deploy/dev-tracker(origin/main を reset --hard で追従)
    • ログ: /home/deploy/dev-tracker-build.log
    • crontab バックアップ: /home/deploy/crontab.bak-20260530-localbuild
    • dev-timer 行(毎分 check-due)は温存済み

直近の変更点(このセッション)

  • scripts/publish-local.sh を追加(ローカルビルド&公開)→ git 認証を bearer から Basic へ修正(commit 127f7ba)
  • .gitignore.last-installed-lock 追加 / .github/workflows/deploy.yml 削除
  • サーバーで token 配置・clone・初回ビルド・crontab 置換・旧 dispatch クリーンアップを実施
  • GitHub シークレット DEPLOY_* 4つを削除

残・要手動対応

  • dispatch 用 Fine-grained PAT の revoke(GitHub Web/API。gh CLI 不可)。サーバーからファイルは削除済みだがトークン自体は GitHub 上に残っている
  • 次の cron 発火(:00 / :30)での自動実行確認(手動・flock 経由は確認済み)

次に着手したくなったら候補

  • 詳細ページが縦長になりがち → タブ UI で WIP/ROADMAP/DECISIONS/DEVLOG/Commits/README を切替
  • API 化:将来 /data/projects.json 配信を別エンドポイント化したい場合、build-data.ts のロジックを切り出す
  • 他リポの .devnotes/ 整備(雛形のままのリポが多い)
  • dev-tracker-build.log のローテーション

詰まっていること

  • なし

過去のWIPアーカイブ

(新しい「現在の状況」を書く前に、古いものをここに追記でアーカイブする。新しいものが上)

2026-04-26 12:57 時点のスナップショット(Lightsail crontab + workflow_dispatch 方式)

  • 公開URL: https://dev-tracker.ikapps.com/(9 プロジェクト表示)
  • 更新サイクル: Lightsail crontab */15 * * * * → dispatch.sh → GitHub の workflow_dispatch
  • dispatch 用 Fine-grained PAT を /home/deploy/.dev-tracker-dispatch-token に配置
  • 詰まり: なし(後に GitHub Actions が課金問題でビルド全滅し、この方式も機能しなくなった)

2026-04-26 12:57 時点のスナップショット(自動更新切替前)

  • 公開URL: https://dev-tracker.ikapps.com/ で稼働中(8 プロジェクト表示)
  • 更新頻度: GitHub Actions の 0 * * * * cron + push + 手動
  • 直近の変更: ライトテーマ採用 / JST 固定 / カードに時刻表示
  • 詰まり: なし(後に GitHub Actions cron が4時間連続スキップしていたことが判明)

2026-04-25 21:15 時点のスナップショット(プロジェクト初期化直後)

(ここは毎回上書きされる。「今どこまで進んだか」「次に何をするか」「詰まっていること」を簡潔に)

雛形のまま、本格作業前。

ROADMAP(計画)

ロードマップ

今週

  • 初期実装と本番公開(2026-04-25 完了)
  • 自動更新を Lightsail crontab 駆動に切替(2026-04-26 完了)

今月

  • 詳細ページのタブUI化(WIP/ROADMAP/DECISIONS/DEVLOG/Commits/README が縦に長く並ぶのを切替式に)
  • 他リポの .devnotes/WIP.md の「現在の状況」を埋める(現状 whosaid のみ充実、他は雛形)
  • dispatch.log のローテーション(手抜き運用中、将来肥大化したら logrotate 設定)

今四半期

  • API 化(projects.json 配信を別エンドポイント化、認証付きで他デバイスからも参照可能に)
  • Node.js 20 deprecation 対応(actions/checkout@v5, setup-node@v5 等への更新、期限 2026/9)

いつか

  • アクセス制御を追加するか検討(Basic認証 / Cloudflare Access 等)
  • open issue / open PR の表示
  • プロジェクト横断の「今週やったこと」サマリーページ
  • WIP.md 更新を Slack/通知に流す仕組み
  • スマホからの閲覧用にレスポンシブ調整

DECISIONS(意思決定)

意思決定記録

このプロジェクトで下した重要な意思決定を記録する。 最新が上に来る。


2026-05-30: デプロイ方式を GitHub Actions → Lightsail ローカルビルドへ変更

背景: GitHub Actions の課金問題でビルドが全滅し、workflow_dispatch を叩いてもデプロイが走らない状態になった。dev-tracker の公開先は Lightsail サーバー自身であり、わざわざ Actions ランナーでビルドして dist/ を rsync で戻す構成は、外部(GitHub Actions の課金・SLA)への依存を増やしているだけだった。

決定:

  • ビルド&公開を Lightsail サーバー上で直接行う scripts/publish-local.sh を追加(git fetchreset --hard→必要時のみ npm cinpm run builddist//var/www/dev-tracker へローカル rsync)
  • .github/workflows/deploy.yml を削除(push のたびに Actions が課金問題で失敗し続けるのを止める)
  • 定期実行は deploy の crontab で */30 * * * *flock で多重起動防止)。旧 dispatch 方式(crontab の dispatch 行・dev-tracker-dispatch.sh・dispatch 用トークン)は撤去
  • ビルド用トークンは /home/deploy/.dev-tracker-build-token(600)に配置。build-data.ts の GitHub 読み取りと private リポの git fetch に兼用

理由: 公開先が同じ箱なので、同一ホストでビルドすれば rsync も SSH 鍵受け渡しも不要になり、GitHub Actions の課金・SLA 依存から完全に解放される。.devnotes はそう頻繁に変わらないので更新間隔は 15分→30分で十分。npm cipackage-lock.json 変更時だけ走らせ、小メモリ(実 416MB / swap 2GB)の箱での無駄な再インストールを避ける。

理由(旧方式の見直し): [[2026-04-26: 定期更新は GitHub Actions cron ではなく Lightsail crontab + workflow_dispatch で駆動する]] は「定期実行の確実性」のために導入したが、Actions 自体が課金で止まると dispatch しても無意味になる。ビルドそのものをサーバーに移すことで、Actions への依存を断ち切る。


2026-04-26: 定期更新は GitHub Actions cron ではなく Lightsail crontab + workflow_dispatch で駆動する

背景: 0 * * * * で設定していた GitHub Actions の schedule が複数時間連続でスキップされ(observed: 4時間飛び)、「2時間前のコミットが反映されない」事象が発生。GitHub Actions の cron には SLA がなく、特に毎時:00 は混雑で遅延・スキップが頻発する。

決定:

  • ワークフローの schedule: トリガーを削除
  • Lightsail (deploy ユーザー) の crontab に */15 * * * * を登録
  • 専用 Fine-grained PAT (Only select repositories=dev-tracker, Actions=R/W, Metadata=R) を /home/deploy/.dev-tracker-dispatch-token に配置
  • /home/deploy/dev-tracker-dispatch.sh から GitHub の workflow_dispatch API を叩いてビルドを起動
  • 15分間隔(GitHub Actions無料枠・APIレート制限ともに余裕)

理由: 自分のサーバーの cron は遅延せず、外部依存もない。Fine-grained PAT を「単一リポ + 必要最小権限」にすれば、サーバー漏洩時の被害は dev-tracker の Actions 起動だけで済む。15分間隔なら個人開発の用途として「ほぼリアルタイム」相当。


2026-04-26: dev-tracker 自身も dev-tracked topic の対象に含める

背景: 当初は「dev-tracker 自身は除外」(B案) で運用開始。だがダッシュボードで dev-tracker の WIP/ROADMAP も見たいというユーザー判断。

決定: dev-tracker リポにも dev-tracked topic を付与し、自身も一覧に表示する(A案に変更)。

理由: 自分自身の WIP/ROADMAP/DECISIONS/DEVLOG も他プロジェクトと同じUIで見られた方が便利。除外する利点(一覧の重複感など)より、見える利点の方が大きい。


2026-04-25: GitHub の認証は Classic PAT (repo scope) を使う

背景: 当初 Fine-grained PAT で「All repositories」「Contents:Read + Metadata:Read」を作成したが、保存するたびに「Public repositories」に自動降格される現象が発生。GitHub Actions ログで PAT は 1 リポ(公開リポのみ)しか見えなかった。

決定: Classic PAT に repo scope を付けて発行し、DEV_TRACKER_GH_TOKEN として登録する。

理由: Fine-grained PAT は組織レベルのポリシーで制限される場合があり、個人アカウントでもポリシー側で「All repositories」がブロックされていた様子。Classic PAT は単純で確実。読み取り権限しか使わないので scope が広い不利益も小さい。


2026-04-25: 対象リポ特定は GitHub topic dev-tracked 方式

背景: どのリポを dev-tracker に表示するかの判定方法を決める必要があった。候補は (A) GitHub topic、(B) projects.yml で手動管理、(C) 全リポ走査して .devnotes/ 有無で判定。

決定: リポに dev-tracked topic を付ける方式。

理由: topic を付け外しするだけで対象/非対象を切り替えられ、メンテフリー。新規リポ追加時もトークンの再設定不要(Classic PAT が全リポを見るため)。


2026-04-25: ホストは既存 Lightsail 多目的サーバー、サイトは公開(認証なし)

背景: 配信形態は GitHub Pages 系の静的サイト案。アクセス制御をどうするか議論。

決定: 既存の multi-purpose-lightsail-server1(13.230.63.19)に同居。dev-tracker.ikapps.com で SSL 公開。Basic 認証等のアクセス制御は付けない。

理由: 既に Nginx リバースプロキシ運用中で追加コスト 0。GitHub Pages は private リポでは Pro プラン必須かつ非公開化に Enterprise が必要で割に合わない。Cloudflare Pages も無料だが既存サーバーが空いているのでわざわざ別系統に乗せる理由がない。アクセス制御は「一旦世界中から見えてもOK」とユーザー判断。


2026-04-25: フロントは Astro、データ層と完全分離

背景: 配信形態は静的サイトだが、将来 API 化を見据える要件あり。

決定: Astro でビルド時に src/data/projects.json を読み込んで静的生成する構成。データ取得 (scripts/build-data.ts) と表示 (Astro pages) を分離。

理由: Astro は Markdown レンダリング対応が良く静的書き出しがデフォルト。将来 API 化する時は projects.json を fetch する形に置き換えるだけで移行可能。Vite + React より MD 周りの実装が薄く済む。


2026-04-25: GitHub API → JSON のデータ取得は listForAuthenticatedUser + クライアント側 topic フィルタ

背景: 当初 octokit.search.repostopic:dev-tracked を投げたが 0 件。GitHub の Search API は topic 変更のインデックス反映に遅延がある。

決定: octokit.repos.listForAuthenticatedUser でユーザーの全リポを paginate 取得し、JS 側で r.topics.includes('dev-tracked') でフィルタする。

理由: インデックス遅延の影響を受けない。個人利用の規模(数十リポ程度)ならレート制限的にも問題ない。


DEVLOG(作業ログ)

開発日誌

このプロジェクトでの作業を時系列で記録する。 最新のエントリが上に来る。


2026-05-30

サーバー側 §3 を実施し Lightsail ローカルビルドへ移行完了(git 認証バグも修正)

やったこと

  • ビルド用 classic PAT(scope: repo)を新規発行し /home/deploy/.dev-tracker-build-token(600, deploy 所有)に配置
  • git 認証バグを発見・修正: 指示書/初版 publish-local.sh の AUTHORIZATION: bearer では git clone/fetch が could not read Username で失敗。GitHub の smart-HTTP は API と違い bearer を受け付けず、Basic 認証(x-access-token:<token> を base64)が必要だった(GitHub Actions checkout と同方式)。publish-local.shdocs/lightsail-migration.md を Basic 方式に修正して再 push(127f7ba)
  • /home/deploy/dev-tracker に Basic 認証で clone(.git/config にトークン残存なしを確認)
  • /var/www/dev-tracker は既に deploy 所有だったため §3-3 chown はスキップ
  • 初回ビルドを手動実行 → build-data.ts が dev-tracked topic 付き 34/45 リポを集約、astro が 35 ページ生成、/var/www/dev-tracker へ公開成功。公開サイト HTTP 200・34 プロジェクト表示・index.html 更新時刻一致を確認
  • crontab を置換: コメントアウト済み dispatch 行を削除し */30 * * * *flock -n /tmp/dt-build.lock)のローカルビルド行を追加。dev-timer 行(毎分 check-due)は温存。置換前 crontab は /home/deploy/crontab.bak-20260530-localbuild にバックアップ
  • cron が叩くコマンドそのものを flock 経由で手動実行し exit 0・published をログで確認(ログ: /home/deploy/dev-tracker-build.log
  • 旧 dispatch 3ファイル(dev-tracker-dispatch.sh / .dev-tracker-dispatch-token / dispatch.log 142KB)を削除
  • 不要な GitHub シークレット DEPLOY_SSH_KEY / DEPLOY_HOST / DEPLOY_USER / DEPLOY_PATH を削除(DEV_TRACKER_GH_TOKEN は残置)

残タスク / 気づき

  • dispatch 用 Fine-grained PAT の revoke は手動: サーバーから token ファイルは消したが、GitHub 上のトークン自体は要 revoke(gh CLI からは fine-grained PAT を revoke できない)
  • 次の cron 発火(:00 / :30)での自動実行は未確認だが、手動 + flock 経由で同経路を確認済みなので問題ないはず
  • dev-tracked topic が 9 → 34 リポに増えていた(指示書記載の「9 リポ」は古い)

デプロイを GitHub Actions → Lightsail ローカルビルドへ移行(リポジトリ側)

やったこと

  • docs/lightsail-migration.md の指示書に沿って、デプロイ方式の移行に着手
  • リポジトリ側(§2)の作業を実施:
    • scripts/publish-local.sh を新規作成・実行権限付与
      • トークンを /home/deploy/.dev-tracker-build-token から読み込み、git fetchreset --hardpackage-lock 変更時のみ npm cinpm run builddist//var/www/dev-tracker へローカル rsync
      • token は git -c http.extraheader=... 経由で渡し .git/config に残さない
    • .gitignore.last-installed-lock(サーバー側の npm ci 判定用作業ファイル)を追加
    • .github/workflows/deploy.yml を削除(push のたびに課金問題で失敗するため)
    • .devnotes/DECISIONS.mdDEVLOG.mdWIP.md を更新

背景 / 理由

  • GitHub Actions の課金問題でビルドが全滅し、dispatch しても本番に反映されない状態だった
  • 公開先が Lightsail 自身なので、同じ箱でビルドすれば rsync も SSH 鍵受け渡しも不要 → Actions 依存をゼロに

次の作業(§3・サーバー側、SSH して1回)

  • build token を /home/deploy/.dev-tracker-build-token(600)に配置
  • /home/deploy/dev-tracker に clone、/var/www/dev-tracker を deploy 所有に
  • 手動ビルドで動作確認 → crontab を dispatch 行から */30 ローカルビルド行へ置換(dev-timer 行は温存)
  • 旧 dispatch スクリプト/トークン/ログを削除

2026-04-26

12:57 - 自動更新を Lightsail crontab 経由に切替(GitHub Actions cron 廃止)

やったこと

  • dev-tracker 自身にも dev-tracked topic を付与(当初の方針 B「自身は除外」を撤回、A 相当に変更)→ 一覧が 9 プロジェクトに
  • /var/www/dev-tracker/p/home-kirei-strategy/index.html の更新が止まっていた問題を調査
    • 直近10件の cron Run 履歴を確認 → schedule 起動が 40〜50分遅延、複数時間スキップが発生
    • 23:46 UTC を最後に 4 時間連続で発火せず(0 * * * * 設定だが実際には不発)
  • 自動更新方式を切替:
    • .github/workflows/deploy.ymlschedule を削除(push + workflow_dispatch のみに)
    • Lightsail に dev-tracker-dispatch 用の Fine-grained PAT を生成
      • Resource owner: ichirokisanuki / Only select repositories: dev-tracker / Actions: Read+Write, Metadata: Read
      • "Only select repositories" は前回の policy 問題("All repositories" のみ降格される)を回避できた
    • /home/deploy/.dev-tracker-dispatch-token (mode 600) に配置
    • /home/deploy/dev-tracker-dispatch.sh: curl -X POST /actions/workflows/deploy.yml/dispatches で起動
    • deploy ユーザーの crontab に */15 * * * * で登録(最初は :17 のみ → 15分間隔へ拡張)
    • ログは /home/deploy/dispatch.log に追記
  • dispatch 試走 → HTTP 204 → workflow_dispatch run が起動 → home-kirei-strategy 最新「写真確認」コミットが反映確認

詰まったこと / 気づき

  • GitHub Actions cron は SLA なし: 個人/低活動リポでは数十分の遅延・複数時間スキップが日常的に起きる。確実な定期実行が必要なら外部 cron からの dispatch が現実的。
  • rsync -a は mtime を保持: そのため遅延の有無を mtime で見ても判定しづらい場面があった(実際は astro が毎回新規ビルドするのでファイル mtime はランナー時刻になる)。
  • zsh の read 構文: read -p は使えず read -rs "VAR?prompt" が正解。-p は coprocess 用。
  • GitHub Actions のログマスク再び: secret 値の deploy」が一致して code***sample` と表示される件、覚えておく。
  • Fine-grained PAT の policy 制約: 「Only select repositories」+ 単一リポなら policy をバイパスできる。「All repositories」のみがブロック対象。

次回やること

  • 既存ロードマップ通り(タブUI、Node 20 対応、他リポの WIP.md 整備など)

2026-04-25

21:15 - dev-tracker 初期実装と本番公開(フル構築)

やったこと

  • 技術設計の合意:
    • データソース: GitHub API のみ(ローカルFSは使わない)
    • 配信形態: 静的サイト(将来API化を見据えた構造分離)
    • 対象リポ特定: GitHub topic dev-tracked 方式
    • フロント: Astro 5 (TypeScript strict)
    • ホスト: 既存 Lightsail 多目的サーバー
    • ドメイン: dev-tracker.ikapps.com
  • Astro プロジェクト初期化
    • 手動で package.json / tsconfig / astro.config.mjs を作成(npm create を使わず制御)
    • 依存: astro, @octokit/rest, marked, sanitize-html, tsx
  • scripts/build-data.ts 実装
    • octokit.repos.listForAuthenticatedUser で全リポ列挙 → topic フィルタ(search APIはインデックス遅延があるため避けた)
    • .devnotes/{WIP,DEVLOG,ROADMAP,DECISIONS}.md と README を取得
    • 「## 現在の状況」セクションを抜き出して一覧カード用 wipSummary に
    • Markdown は marked + sanitize-html で HTML 化、set:html で表示
    • 直近10コミット取得
  • ページ実装
    • / 一覧(pushedAt 降順、ProjectCard グリッド)
    • /p/[slug]/ 詳細(WIP/ROADMAP/DECISIONS/DEVLOG/コミット/README)
    • ダークテーマ → ライトテーマに変更(GitHub風配色)
    • 日時表示を JST に固定(timeZone: 'Asia/Tokyo'、ランナーがUTCのため必須)
  • GitHub Actions ワークフロー
    • cron 毎時 + push + workflow_dispatch
    • secrets経由で Lightsail に rsync デプロイ
  • サーバー側構築(Lightsail)
    • deploy ユーザー作成(sudoersに入れない、SSH鍵のみ)
    • ~/.ssh/dev-tracker-deploy (ed25519) を生成・公開鍵をサーバーに配置
    • /var/www/dev-tracker/deploy:www-data で作成
    • Nginx vhost: 静的配信 + gzip + /_astro/ long-cache
    • certbot --nginx で Let's Encrypt SSL 取得 + HTTP→HTTPS 301
  • DNS: Route 53 で dev-tracker.ikapps.com A → 13.230.63.19(Console手動)
  • GitHub Secrets: DEPLOY_HOST/USER/PATH/SSH_KEY + DEV_TRACKER_GH_TOKEN
  • 既存7リポに dev-tracked topic 付与(dev-tracker 自身は除外)
  • 本番初回デプロイ → https://dev-tracker.ikapps.com/ で 8 プロジェクト表示確認

詰まったこと / 気づき

  • Fine-grained PAT 問題: 「All repositories」を選んでも保存後に「Public repositories」に降格される現象。組織レベルのポリシーで Fine-grained PAT が制限されているためと推定。Classic PAT (repo scope) に切り替えで解決。
  • GitHub Search API のインデックス遅延: search.repos は topic 追加後すぐには反映されない。listForAuthenticatedUser + クライアント側フィルタに変更。
  • GitHub Actions のログマスク: 「deploy」が secret 値だったため、codedeploysamplecode***sample と表示されデバッグ時に混乱。
  • GitHub Actions ランナーは UTC: toLocaleString('ja-JP') だけだと UTC 時刻に日本式フォーマットが当たるだけで JST にはならない。timeZone: 'Asia/Tokyo' 必須。

次回やること

  • Node.js 20 deprecation 対応(actions/checkout@v5 等への更新、2026/9 まで猶予)
  • 詳細ページのタブ UI 化検討(縦長になりがち)
  • 必要に応じて他リポにも .devnotes/ 運用を浸透させる(現状 whosaid のみ充実)

最近のコミット

README

dev-tracker(開発進捗トラッカー)

概要

(記入予定)

セットアップ

(記入予定)

使い方

(記入予定)