Arcturus 마스코트 아키 — 별을 품은 아기곰

Self-hosted mini-PaaS

우리 팀만의 작은 클라우드.

프로젝트를 zip으로 묶거나 — 명령 한 번이면 — 우리 서버에 바로 라이브. 정적 사이트와 Dockerfile 앱, 그리고 롤백·암호화된 env·팀 계정까지 기본 제공.

~/blog
$ curl -fsSL http://deploy.internal:7777/install.sh | sh
installed arcturus → ~/.local/bin
 
$ arcturus deploy
blog — packing 42 files (1.2 MB)
uploading … done, release ready in 0.4s
live at http://deploy.internal:7778/alice/blog
01

작은 팀에 정말 필요한 것들만

그 이상은 없습니다
01

🚀 정적 사이트, 몇 초 만에

디스크에서 바로 서빙해서 업로드가 끝나는 순간 라이브. .html 파일 하나만 올려도 자동으로 index가 됩니다.

02

🐳 Dockerfile 앱

zip 안에 Dockerfile이 있으면 이미지를 빌드해 컨테이너로 실행합니다. 자동 라우팅에 전용 포트까지 붙습니다.

03

⏮️ 롤백은 한 번이면 끝

앱마다 최근 5개 릴리스를 들고 있어서, 대시보드 버튼 하나나 arcturus rollback으로 이전 버전으로 돌아갑니다.

04

🔐 env는 저장 시 암호화

앱별 환경 변수를 SQLite에 AES-256-GCM으로 암호화해 보관. 저장하면 재빌드 없이 컨테이너만 다시 만들어 바로 반영됩니다.

05

🛡️ 기본부터 안전하게

앱은 별도 오리진에서 돌아서 대시보드 세션을 가로챌 수 없습니다. 컨테이너는 단단히 잠가두고, 로그인은 횟수를 제한하며, 로그아웃하면 세션이 서버에서 바로 사라집니다.

06

♻️ 재배포해도 안 끊김

대시보드와 API가 ingress 뒤에서 블루-그린으로 교체되어, 배포하는 동안에도 :7777:7778이 계속 응답합니다.

07

👥 팀을 위해

관리자가 초대 링크를 나눠주면 각자 자기 앱을 관리합니다. 앱은 viewmanage로 공유할 수 있고, manage 권한이면 그 앱에 배포까지 할 수 있습니다.

08

🌐 한국어와 영어

대시보드, API 메시지, CLI가 모두 두 언어를 지원하며 브라우저 설정이나 ARCTURUS_LANG 값을 따릅니다.

02

라우팅이 동작하는 방식

어려운 부분은 알아서

경로 프리픽스 프록시(/alice/blog)는 절대 경로로 에셋을 참조하는 앱을 깨뜨립니다. Arcturus는 세 겹의 해법을 쌓아 그냥 동작하게 만듭니다:

1

프리픽스 제거 + X-Forwarded-Prefix

base path를 설정할 수 있는 앱은 그대로 동작 — 게이트웨이가 프리픽스를 떼고 앱에게 위치를 알려줍니다.

2

Referer 폴백

/static/app.js처럼 매칭되지 않은 요청은 브라우저가 보고 있던 앱으로 다시 라우팅됩니다.

3

전용 포트

모든 컨테이너 앱은 고정 포트(30000+)를 유지 — base path 문제가 아예 없습니다. 새 컨테이너 앱은 “redirect”가 기본이라 방문자가 곧장 전용 포트로 이동합니다. 포트는 자동 할당되며, 포트 설정에서 직접 고를 수도 있습니다.

03

CLI

바이너리 하나, 런타임 불필요

게이트웨이가 인스톨러와 플랫폼별 바이너리를 직접 서빙합니다 — 우리 서버가 곧 배포 채널:

$ curl -fsSL http://<host>:7777/install.sh | sh
명령설명
arcturus login --server … --token …인증 (토큰은 Dashboard → API Tokens에서)
arcturus deploy현재 디렉터리를 zip으로 묶어 배포 (Dockerfile → 컨테이너)
arcturus apps내 앱 목록
arcturus deployments <app>배포 히스토리 (live / rollback 가능 마커)
arcturus rollback <app> <id>이전 릴리스로 복원
arcturus env <app> --set K=Venv 변수 — 컨테이너 재생성, 재빌드 없음
arcturus logs <app>컨테이너 로그 팔로우
arcturus destroy <app>앱 삭제

프로젝트별 앱 이름은 arcturus.json으로 고정: { "name": "my-app" }

04

서버에 올리기

명령 하나, 다시 실행해도 안전

클론하고 스크립트 하나 — 의존성 설치, 대시보드 빌드, pm2 기동까지 알아서. http://<host>:7777을 열면 끝.

첫 실행 시 터미널에서 admin 비밀번호를 직접 입력받습니다.

  • Bun 1.3+
  • Docker — 컨테이너 앱에만 필요
$ git clone https://github.com/chussum/arcturus.git && cd arcturus
$ bun run server:up
  ✦ install → build → start   (pm2)
  ✦ 첫 실행 시 admin 비밀번호 입력
# 선택 하드닝 (macOS) — 평문 키 → 암호화 .env.secrets + Keychain
$ bun run secrets:init
  ✦ 이후 시크릿 수정 → bun run secrets:update
  ✦ 자세히 → 가이드
05

아키텍처

Bun workspaces 모노레포
apps/api NestJS — REST API, 리버스 프록시 게이트웨이, 배포 파이프라인 (Bun 런타임)
apps/web Next.js 대시보드 — Rspack + Linaria zero-runtime CSS, FSD 아키텍처
apps/cli arcturus CLI — `bun build --compile` 단일 바이너리
packages/shared api / web / cli가 공유하는 API 계약 타입

SQLite는 Drizzle로 — 리포지토리가 port 뒤에 있어 PostgreSQL은 모듈 교체로 충분합니다. Docker는 ContainerRuntime port 뒤의 dockerode. 정적 릴리스는 버전 디렉터리, 컨테이너 릴리스는 배포별 이미지 태그로 보관됩니다.