TrayPage Docs

設定項目のリファレンス

セルフホスト版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_SECRETCloudflareでは必須閲覧用ホストに渡す、有効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_URLDockerPostgresの接続文字列(例: postgres://user:password@host:5432/db?sslmode=require)。Docker版で未設定なら、同梱のPostgresにつなぎます
DATABASE_POOL_MAXDocker接続プールの最大数。既定は10
POSTGRES_PASSWORDDocker(compose)同梱のPostgresのパスワード。初回起動の前に決めます
HYPERDRIVECloudflareHyperdriveのbinding。ボタンの画面で、作成済みの設定を選びます

テーブルは、アプリが起動時(Cloudflareは初回アクセス時)に自動で作ります。

ページ本文のストレージ

名前対象意味
PAGE_BUCKETCloudflareR2バケットのbinding。ボタンで自動で作られます
S3_ENDPOINTDockerS3互換ストレージのエンドポイント。Docker版で未設定なら、同梱のSeaweedFSを使います
S3_BUCKETDockerbucket名。既定は traypage-pages
S3_ACCESS_KEY_IDDockerアクセスキーID
S3_SECRET_ACCESS_KEYDockerシークレットアクセスキー
S3_REGIONDockerリージョン。AWS S3ならそのリージョン、R2なら auto
S3_ADDRESSING_STYLEDockerpath(既定)または virtual

Cloudflareでは PAGE_BUCKET があればそれを使います。Docker版では S3_* が揃っていれば、S3互換ストレージを使います。

メール

名前対象意味
EMAIL_FROM共通送信元(例: TrayPage <noreply@example.com>)
RESEND_API_KEY共通旧バージョンとの互換用。設定したときだけResendで送り、EMAIL bindingやSMTPより優先されます
SMTP_HOSTDockerSMTPサーバーのホスト名。RESEND_API_KEY がなければSMTPで送ります(Dockerの既定の送信手段)
SMTP_PORTDockerポート。未設定なら、SMTP_SECURE が有効なら465、それ以外は587
SMTP_SECUREDockertrue で最初からTLS(465番)。それ以外はSTARTTLS
SMTP_USER / SMTP_PASSWORDDockerSMTPの認証情報(認証が不要なら省略)
EMAILCloudflareCloudflare Email Serviceのbinding。テンプレートに含まれています。bindingがあれば、これで送ります(Cloudflareの既定の送信手段。送信元ドメインの登録が必要)
MAILPIT_URL開発用送信手段が何も設定されていないとき、このMailpitのAPIに送ります(既定は http://localhost:8025)。同梱のcomposeでは、SMTPでMailpitに送る構成が既定です

ログイン

名前意味
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRETGoogleログインを使うときのOAuthクライアント。リダイレクトURIは <APP_ORIGIN>/api/auth/callback/google
NEXT_PUBLIC_GOOGLE_AUTH1 にすると、ログイン画面にGoogleログインを表示します

ログインのレート制限

ログイン(メールのリンクの送信・確認、パスワード)や、AIエージェントの接続(OAuth)など、認証の操作には、接続元のIPアドレスごとの回数の上限が常にかかります。上限を超えると、しばらく(多くは1分ほど)「Too many requests」(HTTP 429)になります。回数はデータベースに記録するので、サーバーを複数台にしても合算されます。設定しなくても有効です。

名前対象意味
TRUSTED_CLIENT_IP_HEADERDocker接続元の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 を設定しないでください。ヘッダーは接続する側が自由に書けるため、上限を回避されます。

サーバー(Docker)

名前意味
PORTアプリのコンテナが待ち受けるポート。既定は8080。composeでは外に公開せず、Caddyだけが接続します
HOST待ち受けるアドレス。既定は 0.0.0.0

composeの設定(Docker)

名前意味
COMPOSE_PROFILES起動するサービス。postgres(同梱のPostgres)、s3(同梱のSeaweedFS)、mailpit(ローカル確認用のメールの受け口)を、カンマ区切りで指定します
TRAYPAGE_IMAGE使うイメージ。既定は ghcr.io/8d-inc/tray-page:latest。本番では :v1.2.3 のようにバージョンを固定します
HTTP_PORT / HTTPS_PORTCaddyが待ち受けるポート。本番は80と443、ローカルでは APP_ORIGIN に書いたポートと同じにします
MAILPIT_UI_PORTMailpitの画面のポート。既定は8025(手元のPCにだけ公開されます)

Cloudflareのbinding

名前意味
HYPERDRIVEDBへの接続(必須)
PAGE_BUCKETページ本文のR2バケット(必須)
EMAILEmail Service。メール送信用
BROWSERBrowser Run。見たままのPDF出力用(任意)
REVIEW_SESSIONSDurable Objects。レビューのリアルタイム通知用(任意)
ASSETS画面の静的ファイル(テンプレートで設定済み。変更不要)

通常は設定しないもの

次の項目は、tray.page(SaaS)の運営用、開発用、テスト用です。セルフホスト版では設定しないでください。

名前用途
E2E_LOGIN_SECRET自動テスト用のログイン。ENVIRONMENT=production では常に無効
AUTH_RATE_LIMIToff でログインのレート制限をなくす(開発・自動テスト用)。ENVIRONMENT=production では無視されます
OPERATOR_EMAILS・OPERATOR_SLACK_WEBHOOK_URL・DEFAULT_TRIAL_DAYSSaaSの運営者向け機能。セルフホスト版では無効
SUPPORT_EMAIL・SUPPORT_EMAILSSaaSのお問い合わせ先
STORAGE_DIRストレージの保存先が何も設定されていないときの、ローカルのフォルダ(テスト用)
BETTER_AUTH_URLDocker版では APP_ORIGIN から自動で設定されます
NEXT_PUBLIC_APP_URL古い設定名。代わりに APP_ORIGIN を使います