部署與配置
在上一篇文章中,我們介紹了快速開始使用 Logto的基礎知識。本篇文章將深入探討,重點介紹在生產環境中部署 Logto 的最佳實踐和詳細配置步驟。
環境變數
我們在示範中使用了一組預設的環境變數(docker-compose.yml
),你應該用自己的變數替換並在多個 Logto 實例中保持一致。
你可以直接設置環境變數或將 .env
文件放在 Logto 專案的根目錄中。如果你使用 Docker 進行測試,請查看映像生成的 .env
文件位於 /etc/logto
。
基本要素
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
,將完全禁用管理控制台。
有關環境變數的更多詳細資訊,請參閱配置。
HTTPS
你可以使用 Node.js 直接提供 HTTPS 服務,或在 Node.js 前設置 HTTPS 代理 / 負載平衡器。詳情請參閱啟用 HTTPS。
反向代理
如果你想在伺服器上使用反向代理,例如 Nginx 或 Apache,你需要在代理傳遞設置中分別映射 3001 和 3002 端口。假設你使用 Nginx,Logto 驗證端點運行在 3001 端口,Logto 管理控制台運行在 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,則需要採取一些額外步驟。
共享連接器資料夾
預設情況下,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
在此範例中,我們創建了一個空目錄作為卷並掛載到容器中。然後我們在初始化容器中運行 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
有關變更命令的詳細資訊,請參閱資料庫變更。