設定項目のリファレンス
セルフホスト版TrayPageの環境変数・バインディングの一覧と、その意味。
セルフホスト版の設定項目の一覧です。Docker / VPSでは .env(deploy/docker/.env.example)、Cloudflareでは wrangler.jsonc の vars とsecretで設定します。
「必須」は、設定しないと起動できない、または正しく動かない項目です。
| 名前 | 必須 | 意味 |
|---|
APP_ORIGIN | 本番では必須 | アプリのURL(例: https://traypage.example.com)。共有URLやログインリンクの生成、認証の許可originに使います。Docker版は必須です |
VIEWER_ORIGIN | 本番では必須 | ページ本文を配信する閲覧用ホストのURL(例: https://view.traypage.example.com)。APP_ORIGIN とは別のホスト名にします。Docker版は必須です |
VIEWER_HOST | 任意 | 閲覧用ホストのホスト名(ポートを含む)。Cloudflareでは設定します。Docker版では未設定なら VIEWER_ORIGIN のホストを使います |
BETTER_AUTH_SECRET | 必須 | ログインのセッションの署名鍵。openssl rand -hex 32 などで作ります。変えると全員がログアウトします |
VIEWER_TICKET_SECRET | Cloudflareでは必須 | 閲覧用ホストに渡す、有効5分の署名(viewer ticket)の鍵。Docker版は未設定なら BETTER_AUTH_SECRET を使います。Cloudflareでは BETTER_AUTH_SECRET と別の値にします |
TRAYPAGE_EDITION | 任意 | self_hosted にすると、量の上限とトライアルがなく、運営者向けの機能と定期実行が無効になります。Docker版は自動で self_hosted に、Cloudflareのテンプレートも self_hosted に設定済みです。未設定や不明な値は、tray.page(SaaS)と同じ挙動になります |
TRAYPAGE_LICENSE_KEY | 任意 | Enterprise機能のライセンスキー(tp1. で始まる)。ライセンスとEnterprise機能 を参照してください |
ENVIRONMENT | 任意 | production にすると、検証用のログインを常に無効にし、ログインのレート制限を外す設定(AUTH_RATE_LIMIT)も無視します。Cloudflareのテンプレートは production に設定済みです |
| 名前 | 対象 | 意味 |
|---|
DATABASE_URL | Docker | Postgresの接続文字列(例: postgres://user:password@host:5432/db?sslmode=require)。Docker版で未設定なら、同梱のPostgresにつなぎます |
DATABASE_POOL_MAX | Docker | 接続プールの最大数。既定は10 |
POSTGRES_PASSWORD | Docker(compose) | 同梱のPostgresのパスワード。初回起動の前に決めます |
HYPERDRIVE | Cloudflare | Hyperdriveのbinding。ボタンの画面で、作成済みの設定を選びます |
テーブルは、アプリが起動時(Cloudflareは初回アクセス時)に自動で作ります。
| 名前 | 対象 | 意味 |
|---|
PAGE_BUCKET | Cloudflare | R2バケットのbinding。ボタンで自動で作られます |
S3_ENDPOINT | Docker | S3互換ストレージのエンドポイント。Docker版で未設定なら、同梱のSeaweedFSを使います |
S3_BUCKET | Docker | bucket名。既定は traypage-pages |
S3_ACCESS_KEY_ID | Docker | アクセスキーID |
S3_SECRET_ACCESS_KEY | Docker | シークレットアクセスキー |
S3_REGION | Docker | リージョン。AWS S3ならそのリージョン、R2なら auto |
S3_ADDRESSING_STYLE | Docker | path(既定)または virtual |
Cloudflareでは PAGE_BUCKET があればそれを使います。Docker版では S3_* が揃っていれば、S3互換ストレージを使います。
| 名前 | 対象 | 意味 |
|---|
EMAIL_FROM | 共通 | 送信元(例: TrayPage <noreply@example.com>) |
RESEND_API_KEY | 共通 | 旧バージョンとの互換用。設定したときだけResendで送り、EMAIL bindingやSMTPより優先されます |
SMTP_HOST | Docker | SMTPサーバーのホスト名。RESEND_API_KEY がなければSMTPで送ります(Dockerの既定の送信手段) |
SMTP_PORT | Docker | ポート。未設定なら、SMTP_SECURE が有効なら465、それ以外は587 |
SMTP_SECURE | Docker | true で最初からTLS(465番)。それ以外はSTARTTLS |
SMTP_USER / SMTP_PASSWORD | Docker | SMTPの認証情報(認証が不要なら省略) |
EMAIL | Cloudflare | Cloudflare Email Serviceのbinding。テンプレートに含まれています。bindingがあれば、これで送ります(Cloudflareの既定の送信手段。送信元ドメインの登録が必要) |
MAILPIT_URL | 開発用 | 送信手段が何も設定されていないとき、このMailpitのAPIに送ります(既定は http://localhost:8025)。同梱のcomposeでは、SMTPでMailpitに送る構成が既定です |
| 名前 | 意味 |
|---|
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET | Googleログインを使うときのOAuthクライアント。リダイレクトURIは <APP_ORIGIN>/api/auth/callback/google |
NEXT_PUBLIC_GOOGLE_AUTH | 1 にすると、ログイン画面にGoogleログインを表示します |
ログイン(メールのリンクの送信・確認、パスワード)や、AIエージェントの接続(OAuth)など、認証の操作には、接続元のIPアドレスごとの回数の上限が常にかかります。上限を超えると、しばらく(多くは1分ほど)「Too many requests」(HTTP 429)になります。回数はデータベースに記録するので、サーバーを複数台にしても合算されます。設定しなくても有効です。
| 名前 | 対象 | 意味 |
|---|
TRUSTED_CLIENT_IP_HEADER | Docker | 接続元のIPアドレスを読むヘッダー名。同梱のcompose(Caddy経由)では x-forwarded-for に設定済みで、AWSのテンプレートも同じです。X-Forwarded-For のように追記されるヘッダーは最後の値を使います。未設定なら、アプリへの接続元のアドレスを使います。Cloudflareでは設定不要です(Cloudflareが付ける接続元のIPを使います) |
- Caddyの前にさらにロードバランサやCDNを置くと、全員が同じIP(前段のIP)として数えられ、まとめて上限に当たります。その場合はCaddyfileに
trusted_proxies を設定して、前段が付けた接続元のIPを引き継がせてください(deploy/docker/README.md の「認証のレート制限」)。
- プロキシを置かずにアプリを直接公開する場合は、
TRUSTED_CLIENT_IP_HEADER を設定しないでください。ヘッダーは接続する側が自由に書けるため、上限を回避されます。
| 名前 | 意味 |
|---|
PORT | アプリのコンテナが待ち受けるポート。既定は8080。composeでは外に公開せず、Caddyだけが接続します |
HOST | 待ち受けるアドレス。既定は 0.0.0.0 |
| 名前 | 意味 |
|---|
COMPOSE_PROFILES | 起動するサービス。postgres(同梱のPostgres)、s3(同梱のSeaweedFS)、mailpit(ローカル確認用のメールの受け口)を、カンマ区切りで指定します |
TRAYPAGE_IMAGE | 使うイメージ。既定は ghcr.io/8d-inc/tray-page:latest。本番では :v1.2.3 のようにバージョンを固定します |
HTTP_PORT / HTTPS_PORT | Caddyが待ち受けるポート。本番は80と443、ローカルでは APP_ORIGIN に書いたポートと同じにします |
MAILPIT_UI_PORT | Mailpitの画面のポート。既定は8025(手元のPCにだけ公開されます) |
| 名前 | 意味 |
|---|
HYPERDRIVE | DBへの接続(必須) |
PAGE_BUCKET | ページ本文のR2バケット(必須) |
EMAIL | Email Service。メール送信用 |
BROWSER | Browser Run。見たままのPDF出力用(任意) |
REVIEW_SESSIONS | Durable Objects。レビューのリアルタイム通知用(任意) |
ASSETS | 画面の静的ファイル(テンプレートで設定済み。変更不要) |
次の項目は、tray.page(SaaS)の運営用、開発用、テスト用です。セルフホスト版では設定しないでください。
| 名前 | 用途 |
|---|
E2E_LOGIN_SECRET | 自動テスト用のログイン。ENVIRONMENT=production では常に無効 |
AUTH_RATE_LIMIT | off でログインのレート制限をなくす(開発・自動テスト用)。ENVIRONMENT=production では無視されます |
OPERATOR_EMAILS・OPERATOR_SLACK_WEBHOOK_URL・DEFAULT_TRIAL_DAYS | SaaSの運営者向け機能。セルフホスト版では無効 |
SUPPORT_EMAIL・SUPPORT_EMAILS | SaaSのお問い合わせ先 |
STORAGE_DIR | ストレージの保存先が何も設定されていないときの、ローカルのフォルダ(テスト用) |
BETTER_AUTH_URL | Docker版では APP_ORIGIN から自動で設定されます |
NEXT_PUBLIC_APP_URL | 古い設定名。代わりに APP_ORIGIN を使います |