跳到主要内容

部署和配置

在上一篇文章中,我们介绍了快速开始使用 Logto的基础知识。本文将深入探讨在生产环境中部署 Logto 的最佳实践和详细配置步骤。

环境变量

我们在演示中使用了生成的环境变量预设 (docker-compose.yml),你应该用自己的变量替换它们,并在多个 Logto 实例中保持一致。

你可以直接设置环境变量,或者将 .env 文件放在 Logto 项目的根目录中。如果你使用 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 设置为 1true 以关闭管理控制台的端口。如果未设置 ADMIN_ENDPOINT,它将完全禁用管理控制台。

有关环境变量的更多详细信息,请参阅配置

HTTPS

你可以使用 Node.js 直接提供 HTTPS 服务,或者在 Node.js 前设置 HTTPS 代理 / 负载均衡器。有关详细信息,请参阅启用 HTTPS

反向代理

如果你想在服务器上使用反向代理,例如 Nginx 或 Apache,你需要在代理传递设置中分别映射 3001 和 3002 端口。假设你使用 Nginx,Logto 认证 (Authentication) 端点运行在端口 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,你需要正确设置环境变量。

对于生产环境,你可以将“空目录”卷替换为持久卷,并以自己的方式完成“初始化”任务,你知道自己在做什么!

数据库变更

与连接器类似,数据库变更需要在单个实例中运行。你可以使用一个作业来运行变更脚本。

在非交互式运行变更时,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

有关变更命令的详细信息,请参阅数据库变更