メインコンテンツまでスキップ

環境変数

各サービスで使用する環境変数の一覧と設定方法をまとめます。

環境変数一覧

Fly.io API(apps/api

変数名用途ProductionStaging必須
DATABASE_URLTurso 接続 URLlibsql://subseek-db-...turso.iolibsql://subseek-db-staging-...turso.io必須
DATABASE_AUTH_TOKENTurso 認証トークン(prod 用)(staging 用)必須
BETTER_AUTH_SECRETセッション署名キー(openssl rand -hex 32 で生成)(prod 用)(staging 用)必須
BETTER_AUTH_URLBetter Auth ベース URLhttps://subseek-api.fly.devhttps://subseek-api-staging.fly.dev必須
BETTER_AUTH_API_KEYBetter Auth ダッシュボード接続用 API キー(staging 用)Staging のみ
WEB_URLCORS 許可 URLhttps://subseek.cchttps://staging.subseek.cc必須
GOOGLE_CLIENT_IDGoogle OAuth クライアント ID(prod 用)(staging 用)必須
GOOGLE_CLIENT_SECRETGoogle OAuth シークレット(prod 用)(staging 用)必須
STRIPE_SECRET_KEYStripe 秘密鍵(prod 用)(staging 用テストキー)必須
STRIPE_WEBHOOK_SECRETStripe Webhook 署名シークレット(prod 用)(staging 用)必須
MEILISEARCH_HOSTMeilisearch URL(Hetzner US VM)http://<hetzner-ip>:7700http://<hetzner-ip>:7701(別ポート or 別 VM)必須
MEILISEARCH_API_KEYMeilisearch API キー(prod 用)(staging 用)必須
CLOUDFLARE_TURNSTILE_SECRET_KEYCloudflare Turnstile siteverify 用シークレット(/api/search 等のボット対策)Cloudflare ダッシュボードで発行した本番用 SecretCloudflare 公式テストキー 1x0000000000000000000000000000000AA(常に pass)必須
GOOGLE_FORM_URLお問い合わせフォーム送信先(Google Form の formResponse URL)https://docs.google.com/forms/d/e/<prod-form-id>/formResponsehttps://docs.google.com/forms/d/e/<staging-form-id>/formResponse必須

Meilisearch のホスティング: Hetzner US(Ashburn)で Docker セルフホスト。Fly.io セルフホスト・Meilisearch Cloud は廃止。詳細は 検索インフラ調査 を参照。

Cloudflare Turnstile について: /api/search および /api/contact などのボット対策に使用する。本番キーは Cloudflare ダッシュボード で発行し、ホスト名に subseek.cc を登録すれば staging.subseek.cc 含むサブドメインも自動で有効になる。Preview / ローカル開発では Cloudflare 公式の「常に pass するテストキー」を使用する(詳細は testing キー一覧)。

Google Form について: お問い合わせフォーム(#160)は DB に保存せず、バックエンド経由で Google Form の formResponse エンドポイントに URLSearchParams で POST して受信ストレージを Google Form に委ねる方式を採用している。GOOGLE_FORM_URL には Google Form の公開 URL から取得できる ...forms/d/e/<form-id>/formResponse をそのまま設定する。entry ID(各項目の entry.xxxxx)は apps/api/src/features/contact/model/google-form-entry-ids.ts にコードとして持たせる。

R2 環境変数について: Cloudflare R2 は v0.3 で Meilisearch ダンプのバックアップ保存先として導入予定(#77)。Hetzner のアカウント BAN リスクに備えるため。v0.1 時点では R2_* 環境変数は不要。

Vercel Web(apps/web

変数名用途ProductionPreview (PR)必須
NEXT_PUBLIC_API_URLAPI サーバー URLhttps://subseek-api.fly.devhttps://subseek-api-staging.fly.dev必須
NEXT_PUBLIC_APP_URLフロントエンド URLhttps://subseek.ccVERCEL_URL から自動生成(フォールバック)必須
NEXT_PUBLIC_TURNSTILE_SITE_KEYCloudflare Turnstile のサイトキー(クライアント公開)Cloudflare ダッシュボードで発行した本番用 Site Key1x00000000000000000000AA(Cloudflare 公式テストキー)必須
NEXT_PUBLIC_ADSENSE_CLIENT_IDGoogle AdSense Publisher ID(クライアント公開、広告表示用)ca-pub-2848807786857797未設定(広告非表示)任意

Preview 環境の NEXT_PUBLIC_APP_URL: Vercel が自動注入する VERCEL_URL 環境変数を使い、https://${VERCEL_URL} として動的に生成する。API は常設 Staging(subseek-api-staging)だが、Web は Vercel Preview で PR ごとに URL が変わる。

NEXT_PUBLIC_ADSENSE_CLIENT_ID について: 値は Production のみに設定する。Preview / Development には設定しないことで、未承認ドメイン(*.vercel.app、localhost)での広告表示を回避する。AdSense ポリシー上、承認済みドメイン以外で広告を表示するとアカウント停止の対象となる。値自体は公開情報(apps/web/public/ads.txt に同じ Publisher ID が記載されている)。

GitHub Actions Secrets

Secret 名用途
FLY_API_TOKENFly.io デプロイ用トークン

環境変数管理戦略

Vercel を環境変数の Single Source of Truth(単一ソース)として使用する。

Fly.io は fly secrets list で名前のみ確認可能(値は読み取れない)ため、値の紛失を防ぐために全環境変数を Vercel で一元管理する。

Vercel (環境変数)  ──vercel env pull──→  ローカル .env / .env.local
Vercel (環境変数) ──GitHub Actions──→ fly secrets import → Fly.io

環境ごとの設定先

環境設定先取得方法
ProductionVercel Production 環境変数GitHub Actions: vercel env pull --environment productionfly secrets import
StagingVercel Preview 環境変数 + Fly.io subseek-api-staging secrets常設アプリに一度設定すれば PR ごとの再設定は不要
ローカル開発Vercel Development 環境変数pnpm generate-envvercel env pull

設定方法

Fly.io(API) — Vercel 経由で注入

# Production(GitHub Actions が実行)
vercel env pull .env.production --environment production
fly secrets import -a subseek-api < .env.production

# Staging(GitHub Actions が実行)
vercel env pull .env.staging --environment preview
fly secrets import -a subseek-api-staging < .env.staging

Vercel(Web)

# Production
vercel env add NEXT_PUBLIC_API_URL production # https://subseek-api.fly.dev
vercel env add NEXT_PUBLIC_APP_URL production # https://subseek.cc

# Preview (Staging)
vercel env add NEXT_PUBLIC_API_URL preview # https://subseek-api-staging.fly.dev
vercel env add NEXT_PUBLIC_APP_URL preview # https://staging.subseek.cc

GitHub Actions

gh secret set FLY_API_TOKEN -R nito-tech/subseek
gh secret set VERCEL_TOKEN -R nito-tech/subseek
gh secret set VERCEL_ORG_ID -R nito-tech/subseek
gh secret set VERCEL_PROJECT_ID -R nito-tech/subseek

セキュリティ上の注意事項

  • NEXT_PUBLIC_ プレフィックスが付いた変数はクライアント(ブラウザ)に公開される。秘密情報を含めないこと
  • BETTER_AUTH_SECRET はセッション署名に使用するため、サーバーサイドのみで使用し、クライアントには絶対に公開しないこと
  • DATABASE_URL / DATABASE_AUTH_TOKEN には DB 認証情報が含まれるため、シークレットとして管理すること
  • .env.env.local.gitignore に含まれており、リポジトリにコミットされない

新しい環境変数を追加する手順

  1. 該当アプリの .env.example にプレースホルダーを追加
  2. ローカルの .env / .env.local に実際の値を設定
  3. Fly.io / Vercel に Production・Staging の値を設定
  4. turbo.jsonenv に変数名を追加(ビルド時に必要な場合)
  5. このドキュメントの一覧表を更新

.env.example の一覧

ファイル対象アプリ
apps/api/.env.exampleHono API サーバー
apps/web/.env.exampleNext.js フロントエンド