環境変数

デプロイ時にアプリの環境変数がGitHub secretからRailwayに流れる仕組み。

アプリはランタイムでRailwayからprocess.env.Xで環境変数を読みます。しかしアプリのコード、GitHubリポジトリ、Railwayサービスは3つの別の場所です — そこで厄介なのが「GitHubに保存したシークレットがどうやってRailwayに届くのか」という問題です。このページではそのパイプラインを説明します。

3つの場所

場所何が入っているか
GitHub → Settings → Secrets and variablesソースオブトゥルース。機密値はsecrets、非機密設定はvars
apps/<app>/deploy.config.yml「Railway変数XはGitHubキーYから値を取る」というマッピング。
Railwayサービス環境ランタイムでprocess.env.Xが実際に読む場所。

デプロイワークフローが3つの橋渡しをします。

マッピングファイル

各アプリのdeploy.config.ymlにはsecrets:ブロックがあります。左側がランタイムでアプリが見る変数名、右側がGitHubキー名です:

apps/training-tracker/deploy.config.ymlyaml
serviceId: "training-tracker"
rootDir: "apps/training-tracker"
secrets:
SLACK_BOT_TOKEN: "TRAINING_TRACKER_SLACK_BOT_TOKEN"
SLACK_WEBHOOK_URL: "TRAINING_TRACKER_SLACK_WEBHOOK_URL"
SLACK_CHANNEL: "TRAINING_TRACKER_SLACK_CHANNEL"
SLACK_SIGNING_SECRET: "TRAINING_TRACKER_SLACK_SIGNING_SECRET"

ランタイムで、training-trackerアプリのprocess.env.SLACK_BOT_TOKENはGitHubにTRAINING_TRACKER_SLACK_BOT_TOKENとして保存された値を読みます。

アプリごとのワークフローが値を渡す

各アプリのステージング/本番ワークフローが、GitHubの値を再利用可能なデプロイワークフローに転送します:

.github/workflows/deploy-app-training-tracker-production.yml(抜粋)yaml
secrets:
SLACK_BOT_TOKEN: ${{ secrets.TRAINING_TRACKER_SLACK_BOT_TOKEN }}
SLACK_WEBHOOK_URL: ${{ vars.TRAINING_TRACKER_SLACK_WEBHOOK_URL }}
  • 機密値には${{ secrets.X }}を使います。
  • 非機密設定(チャンネル名、フィーチャーフラグなど)には${{ vars.X }}を使います。

命名パターン

30以上のアプリをまたいでGitHub変数が衝突しないように、アプリ名のsnake_caseプレフィックスを付けます:

{APP_NAME_SNAKE}_{VAR_NAME}

例: BREAKFAST_TRACKER_SLACK_WEBHOOK_URL, RECRUIT_ASHBY_API_KEY, STAFF_MEAL_TRACKER_OPENAI_API_KEY

命名規則も参照。

新しい変数を追加するチェックリスト

  1. GitHubキーを正しい環境(stagingまたはproduction)にsecretまたはvarとして追加。
  2. apps/<your-app>/deploy.config.ymlsecrets:にマッピングを追加。
  3. deploy-app-<app>-staging.ymldeploy-app-<app>-production.ymlの両方で値を転送。
  4. デプロイを起動し、Railwayサービス環境に変数が現れることを確認。

自動注入される変数(マッピング不要)

以下は宣言不要です — プラットフォームが提供します:

  • DATABASE_URL — 環境のデータベースサービスから。
  • AUTH_UI_URL — 非認証サービスすべてに。
  • BUCKET_* — 共有Railwayバケットのストレージ認証情報。ファイルストレージでバケット作成とGitHubキー(BUCKET_ENDPOINTBUCKET_ACCESS_KEY_IDBUCKET_SECRET_ACCESS_KEYBUCKET_NAMEBUCKET_REGION)の設定方法を参照。

Claudeに聞く

アプリに新しいシークレットを追加
Claudeプロンプト
meal-plannerアプリのランタイムで新しい環境変数 OPENAI_API_KEY が必要です。以下を案内してください: (1) どのGitHubキー名を使うか、(2) deploy.config.yml のマッピング、(3) deploy-app-meal-planner-staging.yml と deploy-app-meal-planner-production.yml に追加する内容。モノレポの命名規則に従ってください。

トラブルシューティング

症状通常の原因
Railwayに変数が出ない正しい環境にGitHubキーが設定されていない、またはワークフローが転送を忘れている。
値が空値がsecrets.Xにあるのにvars.Xを参照している(またはその逆)。
Railwayの変数名が間違っているdeploy.config.ymlの左側が間違っている — そこがRailwayキー名。

GitHub secretの追加方法が分からない場合は、進める前に開発者に相談してください。

クイズ

Quiz

deploy.config.ymlに`OPENAI_API_KEY: MEAL_PLANNER_OPENAI_API_KEY`を追加してpushしました。デプロイは走りましたが、ランタイムで`process.env.OPENAI_API_KEY`がまだ`undefined`です。何を見落としましたか?