Translator GitHub App セットアップ
UZU Translator は GitHub App の installation token (5,000 req/h) で uzuPJ/app を直接編集する。uzu-coder-bot とは別の専用 App を立てて、権限とレートを分離する。
App credential は GCP Secret Manager (uzu-shared プロジェクト) に置き、ローカル開発時は gcloud 経由で取得する (= リポジトリにも各人のローカルにも .dev.vars を残さない)。本番は wrangler secret put で 1 回投入する。Secret Manager を SoT としたハイブリッド配布の全体像は 機密情報 (secret) の管理 を参照。
1. App を作成 (初回のみ)
組織の GitHub Apps 設定 から新規作成。
| 項目 | 値 |
|---|---|
| Name | uzu-translator |
| Homepage URL | https://translator.uzu.one |
| Webhook | 無効 (Active のチェックを外す) |
| Repository permissions | Contents: Read and write、Pull requests: Read and write、Issues: Read and write |
| Where can this GitHub App be installed | Only on this account |
作成後:
- App ID をメモ
- Generate a private key で
.pemを取得 (PKCS1 形式で払い出される) - Install App で
uzuPJ/appリポジトリにインストールし、URL の末尾の Installation ID をメモ
2. PEM を PKCS8 に変換
jose (worker-api の JWT 署名で使用) は PKCS8 のみ。GitHub が払い出す PEM は PKCS1 なので変換する:
openssl pkcs8 -topk8 -nocrypt -in app.pem -out app-pkcs8.pem3. GCP Secret Manager に投入 (初回のみ)
PROJECT=uzu-shared
gcloud secrets create translator-github-app-id \
--project=$PROJECT --replication-policy=automatic
gcloud secrets create translator-github-app-installation-id \
--project=$PROJECT --replication-policy=automatic
gcloud secrets create translator-github-app-private-key \
--project=$PROJECT --replication-policy=automatic
echo -n "<App ID>" | gcloud secrets versions add translator-github-app-id \
--project=$PROJECT --data-file=-
echo -n "<Installation ID>" | gcloud secrets versions add translator-github-app-installation-id \
--project=$PROJECT --data-file=-
gcloud secrets versions add translator-github-app-private-key \
--project=$PROJECT --data-file=app-pkcs8.pem
# sally-inc.jp domain 全員に accessor 権限を付与
for s in translator-github-app-id translator-github-app-installation-id translator-github-app-private-key; do
gcloud secrets add-iam-policy-binding $s --project=$PROJECT \
--member=domain:sally-inc.jp \
--role=roles/secretmanager.secretAccessor
done4. ローカル開発
各開発者は事前に gcloud auth application-default login 済みであれば追加設定不要。
task translatortask translator:_api (zellij の api pane) が起動時に scripts/translator/gen-dev-vars.sh を呼び、Secret Manager から値を取得して worker-api/.dev.vars を生成する。.dev.vars は .gitignore 済み。
Rotation 時は GCP Secret Manager で新 version を versions add するだけ。次の task translator 起動で反映される。
5. Cloudflare Workers (本番) に投入
javascript/apps/translator/worker-api で:
wrangler secret put GITHUB_APP_ID # Secret Manager から取って貼る
wrangler secret put GITHUB_APP_PRIVATE_KEY # PKCS8 PEM 全体
wrangler secret put GITHUB_APP_INSTALLATION_ID
wrangler secret put FIREBASE_PROJECT_ID # = uzu-prdvars (公開設定: GITHUB_REPO_OWNER / GITHUB_REPO_NAME / ALLOWED_EMAIL_DOMAIN) は wrangler.toml に書かれている。
将来的に GitHub Actions の WIF 経由で Secret Manager → wrangler secret を自動同期する形にするとさらに一元化できる。v1 では手動で OK。
6. SPA 側の Firebase 公開設定
javascript/apps/translator 側は Vite の import.meta.env 経由で Firebase の API key を見る。これは web 公開設定で secret 扱いではないため、taskfiles/translator.yaml と .github/workflows/translator_{deploy,pr}.yml に直書きされている (uzutokyo 等と同じ慣行)。
7. 動作確認
api.translator.uzu.one/health が { ok: true } を返せば worker-api 起動 OK。Translator SPA にログインして、ファイル一覧が出てれば全体動作 OK。