본문으로 건너뛰기
runlot
셀프 호스팅요구 사항

요구 사항

첫 패키지를 설치하기 전에 자체 호스팅 설치에서 준비해야 할 것: 머신, PostgreSQL 18, S3 호환 저장소, DNS, 인증서.

머신

evalsingleha
머신124개 이상
Control plane4 vCPU, 8 GB RAM, 50 GB 디스크동일동일
데이터 노드control plane과 공유상주 프로젝트당 RAM 200 MB에 여유분을 더한 값, 로컬 NVMe동일, 노드 한 대분의 여유 용량 포함
운영 체제Ubuntu 24.04, Debian 12, RHEL 9 또는 10, Rocky 9 또는 10 (x86-64)동일동일

데이터 노드에는 glibc 2.38 이상이 필요합니다. Ubuntu 24.04, Debian 13, RHEL 10은 이를 갖추고 있으며 RHEL 9는 그렇지 않습니다. control plane은 RHEL 9에서 실행되며, RHEL 9의 노드는 아무것도 변경되기 전에 설치 전 점검에서 거부됩니다.

노드 하나에는 대기 중이든 실행 중이든 최대 64개의 프로젝트를 담을 수 있습니다. 상한은 하드웨어가 아니라 슬롯 대역입니다. 모든 프로젝트가 노드에서 고정된 포트 쌍을 갖기 때문입니다. 노드 설정의 RUNLOT_MAX_SLOT으로 상한을 올릴 수 있으며, control plane과 모든 노드에서 같은 값으로 첫 설치 전에 설정해야 합니다.

노드가 복구되는 데 걸리는 시간

데이터 노드가 유실되면 그 노드의 모든 프로젝트가 오브젝트 저장소에서 교체 노드로 복원됩니다. 코어 16개, 62 GB 노드에서 모든 프로젝트를 내린 뒤 한꺼번에 요청했을 때의 측정 결과입니다:

프로젝트모두 복구되어 응답하기까지
5031초
10056초

곡선은 15초의 하한 위에 프로젝트당 약 0.5초가 더해지는 형태입니다. 이 프로젝트들은 각각 10 MB였으며, 500 MB를 담은 프로젝트는 복원에 더 오래 걸리고, 느린 회선 너머의 오브젝트 저장소는 그만큼 시간이 더해집니다.

PostgreSQL 18

control plane은 직접 운영하는 PostgreSQL에 메타데이터를 보관합니다. 다음이 필요합니다:

  • 버전 18. 마이그레이션은 16부터 존재하는 CREATEROLE 의미 체계를 사용하며, 제품은 18에서 테스트됩니다.
  • CREATEROLE을 가진 role과 빈 데이터베이스의 소유권. 설치 프로그램이 그 안에 role 세 개를 더 만들고 자신을 그 role의 멤버로 추가합니다.
  • control plane에서의 접근 가능성. 데이터 노드는 여기에 연결하지 않습니다.
CREATE ROLE runlot LOGIN CREATEROLE PASSWORD '…';
CREATE DATABASE runlot_meta OWNER runlot;

runlot-admin preflight cp는 설치가 무언가를 변경하기 전에 버전, role, 권한을 확인합니다.

PostgreSQL이 자동 장애 조치를 수행한다면 먼저 운영: 메타데이터 데이터베이스가 복원된 경우를 읽으세요. control plane은 시간상 과거로 되돌아간 데이터베이스를 감지하고, 운영자가 새 상태를 확인할 때까지 lease 발급을 중단합니다.

S3 호환 오브젝트 저장소

백업, 업로드된 파일, Git 백업, 배포 번들은 직접 운영하는 스토어의 버킷 하나로 들어갑니다. MinIO, Ceph RGW, 클라우드 S3 중 무엇이든 됩니다. 컨트롤 플레인과 모든 노드에 다음이 필요합니다.

  • 엔드포인트, 버킷, 그리고 해당 버킷 안에서 목록 조회, 가져오기, 쓰기, 삭제를 할 수 있는 액세스 키 쌍입니다.
  • 스토어가 버킷을 가상 호스트로 제공하지 않는 경우(MinIO는 기본값) 경로 방식 주소 지정이 필요합니다.

설치 전에 두 머신 모두 접근 가능 여부와 PutObject 동작 여부를 확인합니다.

DNS

이름은 네 개이며, 문제가 되기 쉬운 사실이 두 가지 있습니다.

이름가리키는 대상제공 내용
runlot.acme.example컨트롤 플레인(TLS 종단 장치 뒤)대시보드, API, 운영 콘솔
git.acme.example컨트롤 플레인HTTPS와 SSH를 통한 Git
*.apps.acme.example데이터 노드배포된 모든 앱
*.wire.acme.example데이터 노드, 포트 5433psql 연결
  • *.wire는 *.apps와 별개의 와일드카드입니다. 와일드카드 인증서는 레이블 하나만 포함하므로 *.wire.acme.example은 자체 레코드와 자체 인증서가 있어야 합니다.
  • 포트 5433은 종단 없이 노드에 도달해야 합니다. wire 프런트는 PostgreSQL 시작 패킷의 TLS 서버 이름으로 연결을 라우팅합니다. 그 앞에서 TLS를 종단하는 프록시가 있으면 모든 연결이 끊어집니다. HTTP는 리버스 프록시를 거쳐도 되지만 5433은 거치면 안 됩니다.

인증서

설치 환경에서는 인증서를 발급하지 않습니다. 다음을 직접 준비하세요.

  • 대시보드와 Git 이름용 인증서로, 컨트롤 플레인 앞의 TLS 종단 장치에 설치합니다.
  • *.apps.acme.example용 인증서와 *.wire.acme.example용 인증서를 각 데이터 노드에 설치합니다. node-front는 SIGHUP 시 파일을 다시 읽으므로, 갱신은 파일 교체와 systemctl reload 한 번으로 끝납니다.

사용자가 프로젝트에 연결하는 커스텀 도메인은 CNAME과 직접 준비한 인증서로 구성됩니다. 이 모드에서는 대시보드 안내에도 그렇게 표시됩니다.

포트

포트위치개방 대상
8080컨트롤 플레인TLS 종단 장치
8081, 8082컨트롤 플레인데이터 노드(프라이빗 네트워크)
9105컨트롤 플레인데이터 노드
80, 443데이터 노드인터넷 또는 리버스 프록시
5433데이터 노드psql이 접속하는 모든 위치
9100, 9103, 9106데이터 노드컨트롤 플레인과 다른 노드(프라이빗 네트워크)
22데이터 노드runlot-admin upgrade를 위한 컨트롤 플레인

컨트롤 플레인과 노드는 프라이빗 네트워크로 통신합니다. 노드는 백엔드를 공개 주소에 바인딩하지 않습니다.

이 페이지의 목차