배포 및 구성
이전 글에서는 Logto 빠르게 시작하기의 기본 사항을 다루었습니다. 이번 글에서는 프로덕션 환경에서 Logto를 배포할 때의 모범 사례와 상세한 구성 단계를 중점적으로 다룹니다.
환경 변수
데모(docker-compose.yml)에서는 미리 생성된 환경 변수 프리셋을 사용하지만, 실제 환경에서는 반드시 본인만의 값으로 교체하고 여러 Logto 인스턴스 간에 일관성을 유지해야 합니다.
환경 변수는 직접 설정하거나, Logto 프로젝트 루트에 .env 파일을 둘 수 있습니다. Docker로 테스트할 경우, 이미지에서 생성된 .env 파일이 /etc/logto에 있으니 참고하세요.
필수 항목
DB_URLLogto 데이터베이스용 Postgres DSN.DATABASE_STATEMENT_TIMEOUT(v1.36.0+) PostgreSQLstatement_timeout(밀리초 단위). 숫자 문자열(예:5000) 또는 PgBouncer/RDS Proxy용DISABLE_TIMEOUT사용. 자세한 내용은 구성 참고.PORTLogto가 리스닝하는 포트. 기본값은3001.ENDPOINT프로덕션 환경에서 커스텀 도메인으로 URL을 지정할 수 있습니다 (예:ENDPOINT=https://logto.domain.com). 이 값은 OIDC 발급자 식별자에도 영향을 줍니다.
관리 콘솔 활성화
ADMIN_PORTLogto 관리 콘솔이 리스닝하는 포트. 기본값은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').
아웃바운드 HTTP 프록시
자체 호스팅 Logto 인스턴스가 외부 서비스(예: 소셜 커넥터 API, CAPTCHA 제공자)에 접근하기 위해 HTTP 프록시를 사용해야 한다면, 환경 프록시 지원을 활성화하고 표준 프록시 변수를 설정하세요.
예를 들어, Docker Compose 설정의 Logto 서비스에 다음 환경 변수를 추가하세요:
services:
logto:
image: ghcr.io/logto-io/logto:latest
environment:
NODE_USE_ENV_PROXY: '1'
HTTP_PROXY: http://proxy.example.com:3128
HTTPS_PROXY: http://proxy.example.com:3128
NO_PROXY: localhost,127.0.0.1,::1,postgres,.internal.example.com
NODE_USE_ENV_PROXY=1환경 프록시 지원을 활성화합니다. Node.js 22에서는 22.21.0 이상 버전이 필요합니다.HTTP_PROXYHTTP 요청용 프록시를 지정합니다.HTTPS_PROXYHTTPS 요청용 프록시를 지정합니다. 프록시 URL 자체는 HTTP 또는 HTTPS 모두 사용 가능합니다.NO_PROXY프록시를 사용하지 않고 직접 접근해야 하는 호스트 목록(쉼표로 구분). 내부 HTTP 엔드포인트를 반드시 포함하세요.
이 프록시 설정이 모든 아웃바운드 요청에 적용되는 것은 아닐 수 있습니다.
HTTPS
Node.js에서 직접 HTTPS를 제공하거나, Node.js 앞단에 HTTPS 프록시 / 로드 밸런서를 설정할 수 있습니다. 자세한 내용은 HTTPS 활성화를 참고하세요.
리버스 프록시
서버에서 리버스 프록시(예: Nginx, Apache)를 사용하려면, 3001과 3002 포트를 각각 프록시 패스 설정에서 매핑해야 합니다. Nginx를 사용하는 경우, Logto 인증 엔드포인트는 3001 포트, Logto 관리 콘솔은 3002 포트에서 동작한다고 가정하고, nginx.conf에 다음 설정을 추가하세요:
Logto가 전달된 헤더를 신뢰하도록 TRUST_PROXY_HEADER=1을 설정하세요. 퍼블릭 URL에서 비표준 포트를 유지하려면 Host와 X-Forwarded-Host 모두에 $http_host를 사용하세요.
server {
listen 443 ssl;
server_name <your_endpoint_url>; // 예: auth.your-domain.com
...
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $http_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 $scheme;
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 $http_host;
proxy_set_header X-Forwarded-Host $http_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 $scheme;
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용 Postgres 데이터베이스를 준비하세요. 데이터베이스 초기화는 Logto CLI를 사용하는 것이 강력히 권장됩니다.
npm run cli db seed -- --swe
자세한 내용은 Logto CLI를 참고하세요.
배포 환경에서 api.pwnedpasswords.com에 접근할 수 없다면, logto init 또는 npm run cli db seed에 --disable-admin-pwned-password-check를 추가하세요. 그러면 최초 관리자 가입 시 Have I Been Pwned 침해 검사에서 멈추지 않습니다. 자세한 내용은 에어갭 또는 오프라인 배포용 시드를 참고하세요.
공유 커넥터 폴더
기본적으로 Logto는 core 폴더의 루트에 connectors 폴더를 생성합니다. 공식 Docker 이미지에는 이미 공식 커넥터가 이 폴더에 포함되어 있으므로, 공식 커넥터만 사용할 경우 별도로 공유할 필요가 없습니다.
이미지에 포함되지 않은 커넥터(예: 자체 커넥터)가 필요하다면, 여러 Logto 인스턴스 간에 해당 폴더를 공유하는 것이 좋습니다. packages/core/connectors 폴더를 컨테이너에 마운트하고, npm run cli connector add -- --official 명령으로 공식 커넥터를 배포한 뒤, 동일 폴더에 자체 커넥터를 추가하세요. 이 폴더에 볼륨을 마운트하면 이미지에 포함된 커넥터가 숨겨지므로, 공식 커넥터를 다시 추가해야 하며, 이때 npm 레지스트리 접근이 필요합니다.
Kubernetes용 최소 예시 deployment는 다음과 같습니다:
apiVersion: apps/v1
kind: Deployment
metadata:
name: logto
namespace: default
spec:
selector:
matchLabels:
app: logto
template:
metadata:
labels:
app: logto
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" 작업은 환경에 맞게 직접 수행하세요.
데이터베이스 변경
커넥터와 마찬가지로, 데이터베이스 변경 작업도 단일 인스턴스에서 실행해야 합니다. 작업(Job)을 사용해 변경 스크립트를 실행할 수 있습니다.
비상호작용 환경에서 변경 작업을 실행할 때는 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
변경 명령에 대한 자세한 내용은 데이터베이스 변경을 참고하세요.