Published on

koyeb server: 백엔드 개발자를 위한 배포 플랫폼 정리

Authors
  • avatar
    Name
    Indo Yoon
    Twitter

koyeb server는 서버 인스턴스를 직접 만들고 관리하는 대신, 컨테이너 이미지나 Git 저장소를 연결하면 빌드와 배포, 라우팅, 스케일링, 로그 수집까지 플랫폼이 처리해 주는 서버리스 컨테이너 플랫폼입니다. 백엔드 개발자는 OS 패치나 로드밸런서 설정 대신 애플리케이션 코드, 환경 변수, 헬스 체크 경로에 집중할 수 있어요. 다만 로컬 디스크에 상태를 저장하는 구조라면 그대로 옮기기 어렵기 때문에 설계를 먼저 점검해야 합니다.

한눈에 보기

Koyeb을 이해할 때는 몇 가지 개념만 잡으면 충분합니다.

  • Service: 하나의 애플리케이션 단위입니다. 컨테이너 이미지, 실행 명령, 포트, 환경 변수, 스케일링 정책이 여기에 묶입니다.
  • Instance: 서비스가 실제로 실행되는 컴퓨팅 단위입니다. CPU와 메모리 조합을 유형으로 고르고, 필요하면 GPU 유형도 선택할 수 있습니다.
  • Deployment: 배포 한 번의 결과물입니다. 새 이미지나 새 커밋을 올리면 새 Deployment가 만들어지고, 헬스 체크를 통과한 뒤 트래픽이 옮겨가는 방식으로 무중단에 가깝게 교체됩니다.
  • Region: 서비스가 실행될 지리적 위치입니다. 사용자와 가까운 곳, 혹은 데이터가 머물러야 하는 곳을 기준으로 고릅니다.
  • Scale-to-zero: 트래픽이 없을 때 인스턴스를 내려 비용을 줄이는 동작입니다. 대신 첫 요청에서 기동 시간이 붙습니다.
  • Managed Database: Koyeb이 제공하는 관리형 PostgreSQL 같은 데이터베이스를 서비스와 함께 붙일 수 있습니다.

중요한 점은 이 플랫폼이 "서버를 빌려주는" 모델이 아니라 "컨테이너를 실행해 주는" 모델이라는 사실입니다. 그래서 SSH로 들어가 패키지를 설치하거나 cron을 직접 등록하는 방식은 전제가 달라집니다. 주기 작업은 애플리케이션 내부 스케줄러나 외부 스케줄러 호출로 옮기는 편이 자연스럽습니다.

구성 요소 비교 표

항목무엇을 정하는가백엔드 관점에서 확인할 점
Service실행할 이미지, 포트, 실행 명령애플리케이션이 플랫폼이 주입하는 포트 환경 변수를 실제로 바인딩하는지 확인해야 합니다
Instance 유형CPU와 메모리 조합빌드가 아니라 런타임 기준으로 산정하고, 메모리 여유를 남겨야 합니다
Scaling최소·최대 인스턴스 수최소를 비워 두면 유휴 시 내려가고, 첫 요청 지연이 생깁니다
Region실행 위치데이터 저장 위치와 지연 시간 요구사항을 함께 봐야 합니다
Health check정상 판정 기준인증이 필요 없는 경량 엔드포인트를 따로 두는 편이 안전합니다
Volume영속 디스크세션, 업로드 파일, SQLite 같은 로컬 상태가 있는지 먼저 점검합니다
Environment설정과 시크릿민감한 값을 이미지에 굽지 않고 런타임 주입으로 처리해야 합니다
Logs관측표준 출력으로 남기는 구조여야 수집이 됩니다

표에서 가장 자주 문제가 되는 줄은 Health check와 Volume입니다. 로컬 파일 시스템은 재배포나 재시작 시 초기화되는 것으로 가정해야 하고, 헬스 체크 경로가 DB 커넥션까지 확인하면 DB가 흔들릴 때 서비스 전체가 재시작 루프에 빠질 수 있습니다.

단계별 배포 방법

1. 애플리케이션을 컨테이너 친화적으로 정리합니다

가장 먼저 할 일은 코드가 아니라 실행 방식 정리입니다. 외부에서 접근 가능한 주소에 바인딩해야 하고, 수신 포트는 하드코딩 대신 환경 변수에서 읽는 구조가 좋습니다. Koyeb은 서비스에 설정된 포트를 환경 변수로 전달하므로, 코드에서 그 값을 읽어 바인딩하면 대시보드에서 포트를 바꿔도 애플리케이션이 따라옵니다. 로그는 파일이 아니라 표준 출력과 표준 에러로 남겨야 수집됩니다.

2. Dockerfile 또는 빌드팩 방식을 고릅니다

저장소에 Dockerfile이 있으면 그 정의를 그대로 씁니다. 없으면 플랫폼이 언어를 감지해 빌드팩으로 빌드합니다. 백엔드에서는 Dockerfile 쪽이 재현성이 높습니다. 멀티 스테이지로 빌드 산출물만 남기고, 실행 계정을 루트가 아닌 일반 사용자로 두고, 헬스 체크에 쓸 경로를 미리 만들어 두면 운영이 편해집니다. 이미지 크기를 줄이는 것은 배포 시간과 콜드 스타트 양쪽에 도움이 됩니다.

3. Koyeb에 연결하고 서비스를 만듭니다

대시보드에서 GitHub 저장소를 연동하거나, 레지스트리에 올린 이미지 주소를 지정합니다. Git 연동을 쓰면 특정 브랜치에 푸시할 때마다 자동 배포가 걸리므로, 운영 브랜치와 개발 브랜치를 분리해 두는 것이 안전합니다. CLI를 쓰는 경우에는 로그인 후 서비스 생성과 배포를 명령으로 처리할 수 있고, 같은 설정을 코드로 관리하고 싶다면 API나 CLI를 파이프라인에 넣는 편이 낫습니다.

4. 환경 변수와 시크릿을 넣습니다

DB 접속 정보, 외부 API 키, 세션 시크릿은 모두 런타임 주입으로 처리합니다. 이미지에 넣으면 레지스트리에 그대로 남습니다. 환경별로 값을 다르게 가져가야 한다면 서비스나 앱 단위로 분리하고, 같은 이름의 변수를 여러 곳에 중복 정의하지 않도록 정리해야 합니다. 배포 후에는 값이 실제로 주입됐는지 로그가 아니라 설정 화면에서 확인하는 습관이 좋습니다.

5. 리전, 인스턴스, 스케일링을 정합니다

리전은 사용자 위치와 데이터 규제를 함께 보고 정합니다. 인스턴스 유형은 평시 부하가 아니라 최대 부하와 메모리 사용량을 기준으로 잡고, 언어 런타임 자체가 쓰는 메모리를 감안해 여유를 둡니다. 스케일링은 최소와 최대를 모두 지정하는 형태가 일반적입니다. 최소를 비워 두면 유휴 시 내려가 비용이 줄지만 첫 요청이 느려지고, 최소를 유지하면 응답은 안정적이지만 비용이 상시로 발생합니다.

6. 배포하고 헬스 체크와 로그를 확인합니다

배포가 시작되면 빌드 로그, 배포 로그, 런타임 로그를 순서대로 봅니다. 헬스 체크가 통과하지 못하면 새 Deployment로 트래픽이 넘어가지 않으므로, 실패 원인은 대부분 포트 바인딩, 시작 시간 초과, 헬스 경로 오타입니다. 배포 후에는 공개 주소로 실제 요청을 보내 응답 코드와 지연을 확인하고, 롤백이 필요할 때를 대비해 이전 배포를 남겨 두는 방식으로 운영합니다.

7. 도메인과 TLS를 연결합니다

기본 주소가 동작하면 커스텀 도메인을 붙입니다. 인증서 발급과 갱신은 플랫폼이 처리하는 경우가 많으므로, DNS에 어떤 레코드를 넣어야 하는지만 문서에서 확인하면 됩니다. 서브도메인을 서비스별로 나눠 쓰면 스테이징과 운영을 분리하기 쉽습니다.

상황별 선택 기준

사이드 프로젝트나 초기 API라면 scale-to-zero를 켜 두는 구성이 부담이 적습니다. 트래픽이 없는 시간이 길수록 이득이 크고, 대신 첫 요청 지연을 감수하면 됩니다.

상시 트래픽이 있는 서비스라면 최소 인스턴스를 유지하는 편이 좋습니다. 콜드 스타트가 사용자 경험에 직접 영향을 주고, 헬스 체크와 커넥션 풀 워밍이 필요한 경우에는 특히 그렇습니다.

상태를 저장하는 서비스라면 볼륨을 붙이거나 외부 관리형 DB로 옮깁니다. 세션을 로컬 메모리에 두는 구조라면 인스턴스가 여러 개로 늘어나는 순간 깨지므로, 세션 저장소를 따로 두는 설계가 먼저입니다.

배치 작업이나 학습 추론처럼 GPU가 필요한 경우에는 GPU 인스턴스 유형을 검토합니다. 이때는 모델 파일을 이미지에 넣을지, 시작할 때 내려받을지에 따라 기동 시간이 크게 달라집니다.

이미 쿠버네티스를 운영 중인 조직이라면 Koyeb은 대체재라기보다 소규모 서비스나 실험용 배포처로 두는 편이 현실적입니다. 클러스터 운영 인력을 줄이고 싶은 팀에는 진입 장벽이 낮습니다.

주의할 점

  • 로컬 디스크는 영속적이지 않다고 가정합니다. 업로드 파일, SQLite, 캐시 파일을 그대로 두면 재배포 때 사라집니다.
  • scale-to-zero는 지연과 맞바꾸는 선택입니다. 외부 결제 콜백이나 웹훅을 받는 서비스는 첫 요청 지연을 고려해야 합니다.
  • 헬스 체크 경로는 가볍게 유지합니다. DB와 외부 API까지 확인하는 헬스 체크는 장애를 증폭시킵니다.
  • 시크릿을 이미지에 굽지 않습니다. 빌드 인자로 넣은 값도 이미지 레이어에 남을 수 있습니다.
  • 마이그레이션 시점을 분리합니다. 여러 인스턴스가 동시에 스키마를 바꾸면 충돌하므로, 배포와 마이그레이션을 별도 단계로 두는 편이 안전합니다.
  • 비용 구조를 미리 확인합니다. 인스턴스 실행 시간과 대역폭, 볼륨, 관리형 DB가 각각 과금되므로 요금 페이지에서 항목별로 확인해야 합니다.
  • 리전과 데이터 위치를 함께 봅니다. 개인정보를 다룬다면 저장 위치가 요구사항을 만족하는지 먼저 확인합니다.

자주 묻는 질문

Koyeb server는 무료로 시작할 수 있나요?

공식 사이트에서 무료로 시작할 수 있는 옵션을 안내하고 있으며, 조건과 한도는 시점에 따라 달라질 수 있어요. 정확한 범위는 요금 페이지에서 확인하는 것이 안전합니다. 무료 옵션은 보통 유휴 시 내려가는 동작과 함께 제공되므로, 상시 응답이 필요한 서비스라면 유료 구성을 함께 검토해야 합니다.

Docker 없이도 배포할 수 있나요?

가능합니다. 저장소에 Dockerfile이 없으면 플랫폼이 언어를 감지해 빌드팩으로 빌드합니다. 다만 시스템 패키지나 네이티브 의존성이 필요한 백엔드라면 Dockerfile로 빌드 환경을 고정하는 편이 재현성과 디버깅 측면에서 유리합니다.

데이터베이스는 어떻게 연결하나요?

외부에 있는 관리형 DB의 접속 정보를 환경 변수로 주입하는 방식이 기본입니다. Koyeb이 제공하는 관리형 PostgreSQL을 함께 생성해 연결할 수도 있습니다. 어느 쪽이든 커넥션 수를 인스턴스 수와 함께 계산해야 하며, 스케일링으로 인스턴스가 늘어나면 총 커넥션도 함께 늘어난다는 점을 기억해야 합니다.

scale-to-zero를 끄려면 어떻게 하나요?

서비스의 스케일링 설정에서 최소 인스턴스를 유지하도록 두면 유휴 시에도 내려가지 않습니다. 대신 실행 시간에 대한 비용이 계속 발생합니다. 웹훅 수신이나 실시간 연결처럼 첫 요청 지연이 치명적인 경로가 있다면 이 설정을 먼저 확인하는 것이 좋습니다.

기존 서버에서 옮길 때 가장 많이 깨지는 부분은 무엇인가요?

로컬 파일 시스템에 의존하는 코드와, 서버에 직접 설치한 패키지나 cron 작업입니다. 컨테이너 안에서 모든 의존성이 선언적으로 재현되도록 정리하고, 주기 작업은 애플리케이션 스케줄러나 외부 호출로 옮기면 대부분의 문제가 해소됩니다.

출처

배포 플랫폼을 옮길 때는 애플리케이션 코드보다 운영 절차가 먼저 흔들리기 마련입니다. 컨테이너 이미지 빌드와 롤백 절차를 정리해 둔 Docker 이미지 배포 체크리스트 글과 함께 읽으면, Koyeb server로 옮긴 뒤에 무엇을 점검해야 하는지 흐름이 잡힐 거예요.