이 페이지와 원하는 AI 어시스턴트를 사용하여 문서를 요약합니다
이 페이지의 콘텐츠는 AI를 사용하여 번역되었습니다.
영어 원본 내용의 최신 버전을 보기If you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Intlayer 자체 호스팅
Intlayer는 Intlayer Cloud 계정 없이도 자체 인프라에서 완전히 실행될 수 있습니다. 단일 명령으로 프로덕션 준비 스택을 부팅합니다:
코드를 클립보드에 복사
curl -fsSL https://intlayer.org/install.sh | sh설치 프로그램은 docker-compose.yml 및 .env 파일을 다운로드하고, 필요한 비밀을 자동으로 생성하며, docker compose up -d 명령으로 모든 컨테이너를 시작합니다.
목차
아키텍처
코드를 클립보드에 복사
┌─────────────────────────────┐ 브라우저 ──────▶ │ 앱 (TanStack Start) :3000│ ──┐ └─────────────────────────────┘ │ VITE_BACKEND_URL ┌─────────────────────────────┐ │ │ 백엔드 (Fastify/Bun) :3100│ ◀─┘ └──────────────┬──────────────┘ ┌──────────┬─────────┼──────────┬───────────┐ ▼ ▼ ▼ ▼ ▼ mongo:27017 redis:6379 minio:9000 mailpit:1025 Chromium (1-노드 RS) (S3 API) (SMTP) (이미지 내) minio:9001 mailpit:8025 (콘솔) (웹 UI)Chromium (Puppeteer 스크린샷 생성에 사용됨)은 백엔드 이미지 내부에 번들로 제공되므로 별도의 컨테이너가 필요하지 않습니다.
사전 요구 사항
- Docker ≥ 24 및 Docker Compose ≥ v2. 둘 중 하나라도 없으면 설치 프로그램이 설치 링크를 출력하고 종료됩니다.
- 호스트에서 포트
3000,3100,8025,9000,9001이 사용 가능해야 합니다. - Linux 또는 macOS 호스트 (또는 Windows의 WSL2).
빠른 시작
코드를 클립보드에 복사
curl -fsSL https://intlayer.org/install.sh | sh설치 프로그램의 기능:
docker및docker compose가 설치되어 있는지 확인합니다.docker-compose.yml및.env.example을./intlayer/디렉토리에 다운로드합니다..env파일이 없으면 예제 파일을 복사하고openssl rand를 통해BETTER_AUTH_SECRET,S3_ACCESS_KEY_ID,S3_SECRET_ACCESS_KEY에 대한 임의의 비밀을 생성합니다.docker compose pull+docker compose up -d를 실행합니다.- 다음 URL을 출력합니다: 대시보드
:3000, API:3100, 이메일 UI:8025, MinIO 콘솔:9001.
스택이 실행되면 http://localhost:3000을 열고 첫 번째 계정을 생성하세요.
서비스
테이블을 모달로 열어 모든 데이터를 명확하게 확인
| 서비스 | 이미지 | 호스트 포트 | 목적 |
|---|---|---|---|
| 앱 | apps/app/Dockerfile에서 빌드 | 3000 | TanStack Start 대시보드 (CMS UI) |
| 백엔드 | apps/backend/Dockerfile에서 빌드 | 3100 | Fastify REST API (/health 엔드포인트) |
| mongo | mongo:7 | 내부 | 단일 노드 복제본 세트 (rs0) |
| redis | redis:7-alpine | 내부 | 작업 큐 (BullMQ) 및 캐싱 (ioredis) |
| minio | minio/minio | 9000 (S3), 9001 (콘솔) | 아바타 및 스크린샷을 위한 S3 호환 객체 스토리지 |
| mailpit | axllent/mailpit | 1025 (SMTP), 8025 (웹 UI) | 로컬 트랜잭션 이메일 싱크 |
내부 포트(mongo, redis)는 기본적으로 호스트에 노출되지 않습니다.
MinIO 포트9000은 브라우저에서 접근할 수 있어야 합니다. 업로드된 자산(아바타, 스크린샷)은S3_PUBLIC_URL=http://localhost:9000/intlayer에서 직접 로드되기 때문입니다.
환경 변수
설치 프로그램은 즉시 사용할 수 있는 .env 파일을 생성합니다. 아래 표는 모든 변수를 설명합니다.
필수 (자동 생성 또는 프롬프트)
테이블을 모달로 열어 모든 데이터를 명확하게 확인
| 변수 | 예시 | 설명 |
|---|---|---|
NODE_ENV | production | 런타임 환경 |
PORT | 3100 | 백엔드 리스닝 포트 |
BACKEND_URL | http://localhost:3100 | 백엔드 API의 공개 URL |
APP_URL | http://localhost:3000 | 대시보드의 공개 URL |
DOMAIN | localhost | 쿠키 도메인 |
MONGODB_URI | mongodb://mongo:27017/intlayer?replicaSet=rs0 | 전체 MongoDB 연결 URI |
REDIS_URL | redis://redis:6379 | Redis 연결 URL |
BETTER_AUTH_SECRET | (생성됨) | 세션 서명을 위한 32바이트 비밀 키 |
MAIL_PROVIDER | smtp | 메일 전송 방식: smtp 또는 resend |
MAIL_SMTP_HOST | mailpit | SMTP 호스트명 (Mailpit 컨테이너 이름) |
MAIL_SMTP_PORT | 1025 | SMTP 포트 |
MAIL_FROM | Intlayer <no-reply@localhost> | 발신자 주소 |
S3_ENDPOINT | http://minio:9000 | S3 호환 엔드포인트 |
S3_PUBLIC_URL | http://localhost:9000/intlayer | 브라우저 자산 로딩을 위한 공개 URL |
S3_BUCKET_NAME | intlayer | 버킷 이름 |
S3_ACCESS_KEY_ID | (생성됨) | MinIO 접근 키 |
S3_SECRET_ACCESS_KEY | (생성됨) | MinIO 비밀 키 |
VITE_BACKEND_URL | http://localhost:3100 | 빌드 시 대시보드에 내장되는 백엔드 URL |
VITE_DOMAIN | localhost | 빌드 시 대시보드에 내장되는 도메인 |
선택 사항 (누락 시 기능이 점진적으로 저하됨)
테이블을 모달로 열어 모든 데이터를 명확하게 확인
| 변수 | 기능 |
|---|---|
OPENAI_API_KEY | AI 기반 번역 및 콘텐츠 감사 |
STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_* | 결제 및 구독 관리 |
RESEND_API_KEY | Resend를 통한 트랜잭션 이메일 (설정 시 Mailpit 재정의) |
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET | GitHub OAuth 로그인 |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET | Google OAuth 로그인 |
GITLAB_CLIENT_ID, GITLAB_CLIENT_SECRET | GitLab OAuth 로그인 |
MICROSOFT_CLIENT_ID, MICROSOFT_CLIENT_SECRET | Microsoft OAuth 로그인 |
LINKEDIN_CLIENT_ID, LINKEDIN_CLIENT_SECRET | LinkedIn OAuth 로그인 |
ATLASSIAN_CLIENT_ID, ATLASSIAN_CLIENT_SECRET | Atlassian OAuth 로그인 |
Intlayer 프로젝트 연결하기
스택이 실행되면 프로젝트가 intlayer.org 대신 자체 호스팅된 백엔드 및 대시보드를 가리키도록 설정하세요.
프로젝트 설정
코드를 클립보드에 복사
import type { IntlayerConfig } from "intlayer";
const config: IntlayerConfig = {
editor: {
clientId: process.env.INTLAYER_CLIENT_ID,
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
/**
* 자체 호스팅 CMS 대시보드의 URL.
* 기본값: https://app.intlayer.org
*/
cmsURL: process.env.INTLAYER_CMS_URL, // 예: http://localhost:3000
/**
* 자체 호스팅 백엔드 API의 URL.
* 기본값: https://back.intlayer.org
*/
backendURL: process.env.INTLAYER_BACKEND_URL, // 예: http://localhost:3100
},
};
export default config;프로젝트의 .env 파일에 환경 변수를 설정하세요:
코드를 클립보드에 복사
INTLAYER_CMS_URL=http://localhost:3000INTLAYER_BACKEND_URL=http://localhost:3100INTLAYER_CLIENT_ID=<your-client-id>INTLAYER_CLIENT_SECRET=<your-client-secret>http://localhost:3000/projects의 자체 호스팅 대시보드 프로젝트 → 접근 키에서 접근 자격 증명을 생성하세요.
@intlayer/api SDK
@intlayer/api SDK를 프로그래밍 방식으로 사용할 때, backendURL을 명시적으로 전달하세요:
코드를 클립보드에 복사
import { createIntlayerCMS } from "@intlayer/api";import { dictionaryEndpoint } from "@intlayer/api/dictionary";const cms = createIntlayerCMS({ editor: { clientId: process.env.INTLAYER_CLIENT_ID, clientSecret: process.env.INTLAYER_CLIENT_SECRET, backendURL: process.env.INTLAYER_BACKEND_URL, // http://localhost:3100 },});const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();업그레이드
기존 배포에서 설치 프로그램을 다시 실행하면 롤링 업그레이드가 수행됩니다:
코드를 클립보드에 복사
curl -fsSL https://intlayer.org/install.sh | sh이는 최신 이미지를 가져오고 docker compose pull && docker compose up -d를 사용하여 컨테이너를 다시 시작합니다. 기존 볼륨(mongo-data, redis-data, minio-data)은 보존되므로 데이터 손실이 없습니다.
./intlayer/ 디렉토리 내부에서 수동으로 업그레이드하려면:
코드를 클립보드에 복사
docker compose pulldocker compose up -d백업 및 복원
모든 영구 데이터는 세 개의 명명된 Docker 볼륨에 저장됩니다.
백업
코드를 클립보드에 복사
docker run --rm \ -v intlayer_mongo-data:/data \ -v "$(pwd)":/backup \ busybox tar czf /backup/mongo-data.tar.gz /datadocker run --rm \ -v intlayer_redis-data:/data \ -v "$(pwd)":/backup \ busybox tar czf /backup/redis-data.tar.gz /datadocker run --rm \ -v intlayer_minio-data:/data \ -v "$(pwd)":/backup \ busybox tar czf /backup/minio-data.tar.gz /data복원
코드를 클립보드에 복사
docker run --rm \ -v intlayer_mongo-data:/data \ -v "$(pwd)":/backup \ busybox tar xzf /backup/mongo-data.tar.gz -C /# redis-data 및 minio-data에 대해서도 반복합니다.리버스 프록시 사용 (Nginx / Caddy)
프로덕션 배포의 경우, 앱 및 백엔드 컨테이너를 직접 노출하는 대신 리버스 프록시를 앞에 배치하세요.
Nginx 예시
코드를 클립보드에 복사
server { listen 80; server_name cms.example.com; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }}server { listen 80; server_name api.example.com; location / { proxy_pass http://localhost:3100; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }}공개 도메인과 일치하도록 다음 .env 변수를 업데이트하세요:
코드를 클립보드에 복사
BACKEND_URL=https://api.example.comAPP_URL=https://cms.example.comDOMAIN=example.comVITE_BACKEND_URL=https://api.example.comVITE_DOMAIN=example.comVITE_*변수는 빌드 시 대시보드 이미지에 내장됩니다. 이미지가 빌드된 후 이를 변경하는 경우,app이미지를 다시 빌드(docker compose build app)하거나 런타임 구성 주입을 사용해야 합니다.
문제 해결
첫 시작 시 백엔드 충돌 반복
백엔드가 시작되기 전에 MongoDB와 Redis가 정상 상태여야 합니다. compose 파일은 condition: service_healthy와 함께 depends_on을 사용합니다. 백엔드 재시작이 반복적으로 발생하면 mongo 및 redis 헬스체크가 통과하는지 확인하세요:
코드를 클립보드에 복사
docker compose psdocker compose logs mongodocker compose logs redis대시보드가 API에 연결할 수 없음
VITE_BACKEND_URL이 브라우저에서 백엔드에 접근 가능한 URL(Docker 네트워크가 아님)과 일치하는지 확인하세요. 백엔드 포트를 변경했거나 리버스 프록시를 추가했다면, 대시보드 이미지를 다시 빌드해야 합니다:
코드를 클립보드에 복사
docker compose build appdocker compose up -d app이메일이 전송되지 않음
기본적으로 모든 발신 이메일은 Mailpit에 의해 캡처됩니다. http://localhost:8025를 열어 전송된 메시지를 확인하세요. 실제 이메일을 보내려면 .env 파일에 MAIL_PROVIDER=resend 및 RESEND_API_KEY=<your-key>를 설정한 다음 백엔드를 다시 시작하세요:
코드를 클립보드에 복사
docker compose restart backendMinIO 버킷 누락
minio-init 일회성 서비스가 실행되지 않았거나(또는 MinIO가 준비되기 전에 실행된 경우), 수동으로 버킷을 생성하세요:
코드를 클립보드에 복사
docker compose run --rm minio-init