dev-tracker
WIP(現在進行中)
Work In Progress
このプロジェクトで現在進行中の作業と、過去のスナップショットを記録する。
現在の状況
ステータス: デプロイ方式を Lightsail ローカルビルドへ移行完了(§2 リポジトリ側 + §3 サーバー側すべて実施済み)
- 公開URL: https://dev-tracker.ikapps.com/(HTTP 200・34 プロジェクト表示を確認)
- 対象リポ:
dev-trackedtopic 付き(現在 34 リポ。dev-tracker 自身も含む) - 更新サイクル: Lightsail
deploycrontab*/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 fetch→reset --hard→必要時のみnpm ci→npm run build→dist/を/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 ci は package-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_dispatchAPI を叩いてビルドを起動- 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.repos で topic: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.shとdocs/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.log142KB)を削除 - 不要な 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 fetch→reset --hard→package-lock変更時のみnpm ci→npm run build→dist/を/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.md・DEVLOG.md・WIP.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-trackedtopic を付与(当初の方針 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.ymlのscheduleを削除(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.comA → 13.230.63.19(Console手動) - GitHub Secrets:
DEPLOY_HOST/USER/PATH/SSH_KEY+DEV_TRACKER_GH_TOKEN - 既存7リポに
dev-trackedtopic 付与(dev-tracker 自身は除外) - 本番初回デプロイ → https://dev-tracker.ikapps.com/ で 8 プロジェクト表示確認
詰まったこと / 気づき
- Fine-grained PAT 問題: 「All repositories」を選んでも保存後に「Public repositories」に降格される現象。組織レベルのポリシーで Fine-grained PAT が制限されているためと推定。Classic PAT (
reposcope) に切り替えで解決。 - GitHub Search API のインデックス遅延:
search.reposは topic 追加後すぐには反映されない。listForAuthenticatedUser+ クライアント側フィルタに変更。 - GitHub Actions のログマスク: 「deploy」が secret 値だったため、
codedeploysampleがcode***sampleと表示されデバッグ時に混乱。 - GitHub Actions ランナーは UTC:
toLocaleString('ja-JP')だけだと UTC 時刻に日本式フォーマットが当たるだけで JST にはならない。timeZone: 'Asia/Tokyo'必須。
次回やること
- Node.js 20 deprecation 対応(actions/checkout@v5 等への更新、2026/9 まで猶予)
- 詳細ページのタブ UI 化検討(縦長になりがち)
- 必要に応じて他リポにも
.devnotes/運用を浸透させる(現状 whosaid のみ充実)
最近のコミット
- e569b5f .devnotes を更新(Lightsail ローカルビルドへの移行完了) 2026/5/30
- 127f7ba publish-local.sh の git 認証を bearer から Basic へ修正 2026/5/30
- 3818735 デプロイを GitHub Actions から Lightsail ローカルビルドへ移行(リポジトリ側) 2026/5/30
- 76fef5c .devnotes を更新(自動更新を Lightsail crontab 駆動に切替したセッション分) 2026/4/26
- e14d2aa GitHub Actions cron を無効化(Lightsail crontab からの dispatch に切替) 2026/4/26
- 6c6a52f .devnotes を更新(dev-tracker 初期実装と本番公開のセッション分) 2026/4/25
- 1df583f ライトテーマに変更 2026/4/25
- 05d877b 日付表示を日本時間 (Asia/Tokyo) に固定 2026/4/25
- 3fd79b1 プロジェクトカードの更新日時に時刻も表示 2026/4/25
- b252920 デバッグログを削除(全リポ名を平文で出すのを防止) 2026/4/25
README
dev-tracker(開発進捗トラッカー)
概要
(記入予定)
セットアップ
(記入予定)
使い方
(記入予定)