Skip to content

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 設定 から新規作成。

項目値
Nameuzu-translator
Homepage URLhttps://translator.uzu.one
Webhook無効 (Active のチェックを外す)
Repository permissionsContents: Read and write、Pull requests: Read and write、Issues: Read and write
Where can this GitHub App be installedOnly 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 なので変換する:

bash
openssl pkcs8 -topk8 -nocrypt -in app.pem -out app-pkcs8.pem

3. GCP Secret Manager に投入 (初回のみ) ​

bash
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
done

4. ローカル開発 ​

各開発者は事前に gcloud auth application-default login 済みであれば追加設定不要。

bash
task translator

task 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 で:

bash
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-prd

vars (公開設定: 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。