デプロイと構成
前回の記事では、Logto のクイックスタート の基本について説明しました。この記事ではさらに深く掘り下げ、本番環境で Logto をデプロイするためのベストプラクティスや詳細な構成手順に焦点を当てます。
環境変数
デモ(docker-compose.yml
)では生成された環境変数のプリセットを使用していますが、本番環境では独自の値に置き換え、複数の Logto インスタンス間で一貫性を保つ必要があります。
環境変数は直接設定するか、Logto プロジェクトのルートに .env
ファイルを配置できます。Docker でテストする場合は、イメージ内の /etc/logto
に生成された .env
を確認してください。
必須項目
DB_URL
Logto データベース用の Postgres DSN。PORT
Logto がリッスンするポート。デフォルトは3001
。ENDPOINT
本番環境用にカスタムドメインの URL を指定できます(例:ENDPOINT=https://logto.domain.com
)。これは OIDC 発行者識別子 の値にも影響します。
管理コンソールの有効化
ADMIN_PORT
Logto 管理コンソールがリッスンするポート。デフォルトは3002
。ADMIN_ENDPOINT
本番環境用にカスタムドメインの URL を指定できます(例:ADMIN_ENDPOINT=https://admin.domain.com
)。これは管理コンソールのリダイレクト URI の値にも影響します。
管理コンソールの無効化
ADMIN_DISABLE_LOCALHOST
1
またはtrue
に設定すると管理コンソール用のポートを閉じます。ADMIN_ENDPOINT
が未設定の場合、管理コンソールが完全に無効化されます。
環境変数の詳細については 構成 を参照してください。
Secret Vault の有効化
- Secret Vault を利用するには、
SECRET_VAULT_KEK
に Key Encryption Key (KEK) の base64 エンコード文字列を設定する必要があります。これは Secret Vault 内の Data Encryption Key (DEK) を暗号化するために使用されます。AES-256(32 バイト)を推奨します。例:crypto.randomBytes(32).toString('base64')
。
HTTPS
Node.js で直接 HTTPS を提供するか、Node.js の前段に HTTPS プロキシ / バランサーを設定できます。詳細は HTTPS の有効化 を参照してください。
リバースプロキシ
サーバーでリバースプロキシ(Nginx や Apache など)を使用する場合、プロキシパス設定で 3001 および 3002 ポートを個別にマッピングする必要があります。Nginx を使用し、Logto 認証エンドポイントが 3001 ポート、管理コンソールが 3002 ポートで動作している場合、nginx.conf に次の設定を追加します:
server {
listen 443 ssl;
server_name <your_endpoint_url>; // 例:auth.your-domain.com
...
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://127.0.0.1:3001;
}
ssl_certificate <path-to-your-certificate-for-auth-endpoint>;
ssl_certificate_key <path-to-your-certificate-key-for-auth-endpoint>
...
}
次に、管理コンソール用にも同様の設定を追加します:
server {
listen 443 ssl;
server_name <your_admin_endpoint_url>; // 例:admin.your-domain.com
...
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://127.0.0.1:3002;
}
ssl_certificate <path-to-your-certificate-for-admin-endpoint>;
ssl_certificate_key <path-to-your-certificate-key-for-admin-endpoint>
...
}
Nginx の設定をリロードして最新の変更を反映させます:
nginx -s reload
これで準備完了です。ブラウザで https://admin.your-domain.com
にアクセスすると、Logto のウェルカムページが表示されます。
コンテナ化
本番環境では、Docker を利用して Logto をコンテナ化できます。プロジェクトのルートディレクトリに Dockerfile があります。複数の Logto インスタンスを実行したい場合(例:Kubernetes クラスターにデプロイする場合)、追加の手順が必要です。
コネクターフォルダーの共有
デフォルトでは、Logto は core
フォルダーのルートディレクトリに connectors
フォルダーを作成します。複数の Logto インスタンス間でこのフォルダーを共有することを推奨します。packages/core/connectors
フォルダーをコンテナにマウントし、npm run cli connector add -- --official
を実行してコネクターをデプロイしてください。
Kubernetes 用の最小限の deployment
例は以下の通りです:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: logto
namespace: default
spec:
template:
spec:
volumes:
- name: connectors
emptyDir: {}
initContainers:
- image: ghcr.io/logto-io/logto
command:
- /bin/sh
args:
- '-c'
- 'npm run cli connector add -- --official'
name: init
volumeMounts:
- name: connectors
mountPath: /etc/logto/packages/core/connectors
containers:
- image: ghcr.io/logto-io/logto
name: logto
volumeMounts:
- name: connectors
mountPath: /etc/logto/packages/core/connectors
この例では、空のディレクトリをボリュームとして作成し、それをコンテナにマウントします。次に、init コンテナで npm run cli connector add -- --official
を実行してコネクターをダウンロードします。最終的に、すべてのコンテナが公式コネクターが入った同じコネクターフォルダーを共有します。
これはサンプル yaml です。Logto を動作させるには、環境変数を適切に設定する必要があります。
本番環境では、「empty dir」ボリュームを永続ボリュームに置き換えたり、「init」ジョブを独自の方法で実行したりできます。ご自身の運用に合わせて調整してください。
データベース変更
コネクターと同様に、データベースの変更も単一インスタンスで実行する必要があります。ジョブを使って変更スクリプトを実行できます。
非対話型で変更を実行する場合は CI=true
環境変数が必要です。
apiVersion: batch/v1
kind: Job
metadata:
name: alteration
spec:
template:
spec:
containers:
- name: alteration
image: ghcr.io/logto-io/logto
imagePullPolicy: Always
env:
- name: CI
value: 'true'
- name: DB_URL
value: postgresql://user:password@localhost:5432/logto
command:
- /bin/sh
args:
- '-c'
- 'npm run alteration deploy latest'
restartPolicy: Never
変更コマンドの詳細については データベース変更 を参照してください。