배포 및 구성
이전 글에서는 Logto 빠르게 시작하기의 기본 사항을 다루었습니다. 이 글에서는 프로덕션 환경에서 Logto를 배포하기 위한 모범 사례와 상세한 구성 단계에 대해 더 깊이 다룹니다.
환경 변수
데모(docker-compose.yml
)에서는 미리 생성된 환경 변수 프리셋을 사용합니다. 프로덕션 환경에서는 반드시 본인만의 값으로 교체하고, 여러 Logto 인스턴스 간에 일관성을 유지해야 합니다.
환경 변수는 직접 설정하거나, Logto 프로젝트 루트에 .env
파일을 넣어 설정할 수 있습니다. 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
가 설정되지 않은 경우, 관리 콘솔이 완전히 비활성화됩니다.
환경 변수에 대한 자세한 내용은 구성을 참고하세요.
시크릿 볼트 활성화
- 시크릿 볼트를 사용하려면,
SECRET_VAULT_KEK
에 Key Encryption Key (KEK)의 base64 인코딩 문자열을 설정해야 합니다. 이 값은 시크릿 볼트 내 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 포트, 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
이 예시에서는 빈 디렉터리를 볼륨으로 생성해 컨테이너에 마운트합니다. 그리고 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
변경 명령어에 대한 자세한 내용은 데이터베이스 변경을 참고하세요.