본문으로 건너뛰기

셀프호스팅 배포 플랫폼

Own Your PC,
Turn it into a Cloud Server.

No public IP required.

Git 저장소 URL 하나로 사용자 서버에 배포할 수 있습니다. 포트 포워딩과 공인 IP가 필요하지 않습니다.

  • 카드 등록 없음
  • 오픈소스
  • Docker 서버 한 대로 시작
현재 서비스 중인 컨테이너 
OPTiCS Gateway에서 내보내진 트래픽 
활성화된 서브도메인 
지금까지 설치된 Agent 

터널은 Cloudflare Tunnel이나 ngrok 같은 외부 서비스에 의존하지 않고 직접 구현했습니다. 도메인 발급과 인증서에는 Cloudflare를 사용합니다.

GitHub에서 코드 확인하기

왜 필요한가

서버는 있지만 외부에서 접근할 수 없습니다

가정에 유휴 상태로 있는 컴퓨터, 사내망 안의 장비. 성능은 충분하지만 배포하려면 매번 서버 외부의 무언가를 변경해야 했습니다.

지금까지

서버 외부 설정 변경

  • 공인 IP 구매

    매달 발생하는 비용

  • 포트포워딩

    공유기 설정과 열린 포트

  • VPN 구축

    또 하나의 운영 대상

  • 외부 터널 서비스

    외부 인프라에 대한 의존

OPTiCS

서버 내부에서 처리

  • 연결

    사용자 서버가 외부로 먼저 연결합니다. 공유기 설정은 변경하지 않습니다.

  • 배포

    Git 저장소 URL을 입력하면 클론·빌드·기동까지 진행합니다.

  • 주소

    서비스마다 HTTPS 서브도메인이 자동으로 발급됩니다.

  • 실행

    컨테이너와 데이터는 사용자 서버에 유지됩니다.

기존의 네 가지 방식은 모두 서버 외부 설정을 변경하여 문제를 해결합니다. OPTiCS는 이러한 외부 설정 변경 없이 서비스를 운영할 수 있도록 지원합니다.

이용 방법

세 단계로 서비스를 배포할 수 있습니다

설치부터 첫 서비스 실행까지, 서버 외부 설정을 준비할 필요가 없습니다.

Agent
사용자 서버에 설치되어 Docker를 관리하는 컨테이너입니다.
Agent Dashboard
사용자 서버에서 열 수 있는 모니터링 화면입니다.
Console
웹에서 사용할 수 있는 관리 화면입니다.
Hub
OPTiCS가 운영하는 중계 서버입니다.
  1. 01

    설치

    Agent를 설치할 호스트에서 스크립트를 실행합니다. Docker가 설치되어 있지 않으면 자동으로 설치됩니다.

    Agent Dashboard가 열립니다

    sh install-agent.sh

  2. 02

    페어링

    Agent Dashboard에 표시된 코드를 Console의 Workspace/Agent 화면에 입력합니다.

    워크스페이스에 “연결 대기중”으로 표시

    WORD-WORD 형식의 코드

  3. 03

    Service 배포

    Git 저장소 URL과 환경변수를 입력하고 배포를 실행합니다. 클론·빌드·컨테이너 시작은 Agent가 자동으로 처리합니다.

    Running (3/3)

    Dockerfile 또는 docker-compose 모드

코드를 입력해도 즉시 연결되지 않습니다. Agent Dashboard에 연결 요청이 표시되고, 이를 수락해야 연결이 성립합니다.

연결 방식

역방향 연결로 외부 접근을 지원합니다

일반적으로 방화벽은 수신 연결을 차단하지만, 발신 연결은 허용합니다. 이에 따라 Hub가 Agent에 연결하는 대신 Agent가 Hub로 먼저 연결합니다. 명령은 이미 수립된 연결을 역방향으로 전달합니다.

일반 배포 플랫폼과 OPTiCS의 연결 방향 비교일반적인 배포 플랫폼은 Hub가 Agent로 요청을 전송하기 때문에 NAT·방화벽에 차단됩니다. OPTiCS는 Agent가 Hub로 먼저 연결하고, 명령은 그 연결을 역방향으로 통과합니다.일반적인 배포 플랫폼HubNAT · 방화벽AgentHub가 Agent에게 요청을 전송합니다.공인 IP나 포트포워딩이 없으면 도달하지 못합니다.OPTiCSHubNAT · 방화벽Agent① 먼저 연결② 명령은 해당 연결을 역방향으로Agent가 먼저 Hub로 연결합니다.방화벽은 아웃바운드 연결을 차단하지 않습니다.
그림은 좌우로 스크롤할 수 있습니다.

터널 자체는 Cloudflare Tunnel이나 ngrok 같은 외부 서비스에 의존하지 않고 직접 구현했습니다. 연결이 외부 서비스에 종속되면 셀프호스팅의 의미가 훼손되기 때문입니다. 도메인 발급과 인증서는 Cloudflare를 사용합니다.

터널 구현
Cloudflare Tunnel 및 ngrok에 의존하지 않는 자체 구현
개방할 포트
사용자 서버에서 0개
요청 경로
공개 프록시가 Host만 읽어 중계하며, Hub API와 DB는 이 경로에 포함되지 않음
연결 구조 자세히 보기

요청 하나가 지나가는 길

Agent는 유휴 소켓을 미리 열어 풀에 확보해 둡니다. 요청이 도착하면 Hub는 라우팅 정보만 제공하고, 프록시는 풀에서 소켓 하나를 꺼내 요청 바이트를 그대로 전달합니다. 이 경로에서는 Agent에게 명령이 전달되지 않습니다.

외부 요청이 서비스 컨테이너까지 도달하는 경로브라우저 요청은 Cloudflare를 거쳐 Hub의 공개 프록시에 도착합니다. 프록시는 Hub API에 라우팅 정보만 조회한 뒤, Agent가 미리 확보해 둔 유휴 소켓으로 요청 바이트를 그대로 전달합니다. 유휴 소켓이 없을 때만 토큰을 등록하고 Agent에게 터널 개설을 요청합니다.Hub API라우팅 조회 · 캐시agent_uuid · service_port브라우저Cloudflare*.optics.run공개 프록시:10000 · Host 파싱Agent 유휴 소켓사전 확보한 풀에서 할당서비스 컨테이너host.docker.internalOPEN + 요청 바이트TCP 릴레이풀이 비어 있을 때만 (폴백)토큰으로 소켓 등록Hub가 tunnel-connect 명령Agent가 :5220에 연결토큰 매칭Hub API와 DB는 이 경로에 없습니다. 요청 본문은 공개 프록시가 TCP로 그대로 중계합니다.
그림은 좌우로 스크롤할 수 있습니다.

요약하면 — 공유기 설정을 변경하지 않아도 서비스가 외부에 공개됩니다. 서버는 계속 여러분의 소유로 남습니다.

왜 OPTiCS인가

이미 사용 중인 도구와 겹치는 지점, 갈라지는 지점

외부 터널 서비스와 셀프호스팅 PaaS는 각각 이 문제의 일부를 해결합니다. 터널은 연결을 담당하고, PaaS는 배포를 자동화합니다. 아래 표는 어느 쪽이 우월하다는 주장이 아니라, 각 접근 방식이 무엇을 대가로 지불하는지를 정리한 것입니다.

외부 터널 서비스

예: ngrok, Cloudflare Tunnel

연결 방향
역방향 (→ 공인 IP 불필요)
공인 IP · 포트 개방
불필요
내 서버에 설치하는 것
제공사 에이전트 (연결만 담당)
배포 자동화
없음 (터널만 담당, 배포는 별도 도구)
도메인 · HTTPS
제공사 서브도메인 즉시 발급 (자체 도메인은 별도 설정)
요청이 지나는 곳
제공사 인프라 경유
소스와 데이터의 위치
해당 없음 (배포 기능이 없음)
성숙도
여러 해 검증된 상용 서비스
요금
무료 티어 + 유료 등급

셀프호스팅 PaaS

예: Coolify, Dokploy

연결 방향
관리 서버를 따로 두면 정방향 (→ 접근 경로 필요)사용자 서버에 직접 설치하는 방식에는 해당하지 않습니다
공인 IP · 포트 개방
사용자 서버에 접근할 경로 필요 (공인 IP · 개방 포트 · SSH 중 하나)
내 서버에 설치하는 것
PaaS 본체 또는 데몬
배포 자동화
있음 (Git 저장소 → 빌드 → 실행)
도메인 · HTTPS
자체 도메인 연결과 인증서 발급을 지원
요청이 지나는 곳
사용자 서버로 직접 연결이를 위해 접근 경로가 미리 열려 있어야 합니다
소스와 데이터의 위치
모두 사용자 서버
성숙도
여러 해 이어진 오픈소스 프로젝트
요금
소프트웨어는 무료, 서버 비용은 별도

OPTiCS

연결 방향
역방향 (→ 공인 IP 불필요)
공인 IP · 포트 개방
불필요
내 서버에 설치하는 것
Agent 컨테이너와 Docker (배포 · 실행까지 담당)
배포 자동화
있음 (Git 저장소 → 빌드 → 실행)
도메인 · HTTPS
워크스페이스마다 서브도메인 자동 발급도메인과 인증서는 Cloudflare에 의존합니다
요청이 지나는 곳
Hub 공개 프록시 경유Host만 읽고 중계합니다. Hub API와 DB는 이 경로 밖에 있습니다
소스와 데이터의 위치
모두 사용자 서버
성숙도
준비 중인 기능이 남아 있음남은 항목은 아래 ‘현재 상태’에 모두 기재했습니다
요금
₩0Hub와 도메인은 OPTiCS에서 운영합니다. 서비스를 실행할 서버는 직접 준비해야 합니다
  • 유리한 지점
  • 감수해야 하는 대가
  • 해당 없음 · 판단 보류

터널 서비스는 연결만, PaaS는 배포만 담당합니다. OPTiCS는 공인 IP 없이 그 둘을 하나의 흐름으로 연결합니다 — 이미 사용 중인 도구를 대체하는 것이 아니라, 그 사이의 공백을 채우는 도구에 가깝습니다.

이미 공인 IP가 있는 서버를 사용 중이라면
터널 또는 PaaS로 운영할 수 있습니다.
집 PC·사내망 장비를 배포까지 한 번에
OPTiCS를 통해 이 환경을 운영할 수 있습니다.

주요 기능

배포부터 운영 관리까지 지원합니다

아래 세 가지는 서비스를 배포한 뒤 반복해서 사용하게 되는 화면입니다.

배포

저장소 주소 하나로 배포

Git 저장소 URL과 환경변수를 입력하면 클론부터 이미지 빌드, 컨테이너 기동까지 Agent가 처리합니다. 별도의 빌드 서버가 필요하지 않습니다.

  • Dockerfile·docker-compose를 선택합니다.
  • 빌드는 사용자 서버에서 수행됩니다. 소스와 이미지가 외부로 전송되지 않습니다.
  • 재배포도 동일한 버튼 하나로 수행합니다.

네트워크

서비스 도메인 자동 생성 및 등록

워크스페이스와 서비스마다 HTTPS 서브도메인이 발급됩니다. DNS 레코드는 서비스를 만들 때 생기고 지울 때 정리됩니다.

  • <서비스>.<워크스페이스>.optics.run 형태로 발급됩니다.
  • 인증서 발급과 갱신은 자동입니다.
  • 내 서버에서는 어떤 포트도 개방하지 않습니다.

운영

배포 이후의 운영 관리

Console에서 CPU와 메모리를 실시간으로 모니터링할 수 있으며, compose 프로젝트의 컨테이너를 개별적으로 시작하거나 재시작할 수 있습니다.

  • 지표는 7일 동안 보관됩니다(Agent측 저장).
  • 빌드 로그와 런타임 로그를 Console에서 실시간으로 확인합니다.
  • 서비스/컨테이너 시작 · 중지 · 재배포 · 삭제를 모두 지원합니다.

그 밖에

실시간 로그
배포 로그와 런타임 로그를 스트리밍합니다.
생명주기 전체
시작 · 중지 · 재배포 · 삭제를 모두 Console에서 수행합니다.
SSH 웹 터미널
브라우저에서 내 서버 셸에 즉시 접속합니다.
Agent 원격 업데이트
Console에서 Agent를 최신 버전으로 갱신합니다.
계정 보호
JWT 쿠키 인증에 2단계 인증(TOTP)과 이메일 인증을 적용합니다.
명령 서명
Hub와 Agent가 주고받는 명령은 HMAC으로 서명합니다.

소스도, 이미지도, 데이터베이스도 내 서버를 떠나지 않습니다.

외부에서 들어온 요청만 Hub의 공개 프록시를 경유합니다.

구조

코드가 서비스가 되기까지

Hub와 Agent 사이에 NAT가 있어도 Agent가 먼저 연결하므로 경계를 개방할 필요가 없습니다.

코드가 배포되어 공개 서비스가 되기까지의 전체 구조개발자가 Console에 저장소 URL을 입력하면 Hub가 Agent에게 명령을 전달하고, Agent는 저장소를 클론해 이미지를 빌드한 뒤 컨테이너를 기동합니다. 방문자의 요청은 Cloudflare와 Hub의 공개 프록시를 거쳐 Agent가 개설한 터널을 통해 해당 컨테이너에 도달합니다. Hub와 프록시는 관리형이며, Agent와 컨테이너는 NAT 뒤 사용자의 서버에 있습니다.NAT · 방화벽OPTiCS가 운영하는 영역내 서버Git 저장소github.com개발자Console에서 URL 입력OPTiCS-Hub명령 중계OPTiCS-AgentDocker 생명주기서비스 컨테이너app · mysql · redis방문자브라우저Cloudflare*.optics.run공개 프록시:1000012345
그림은 좌우로 스크롤할 수 있습니다.
  1. 1개발자가 Console에 저장소 URL과 환경변수를 입력합니다.
  2. 2Hub는 Agent가 미리 확립해 둔 연결을 통해 배포 명령을 전달합니다.
  3. 3Agent가 저장소를 클론하고 이미지를 빌드합니다. 아웃바운드 연결이므로 방화벽을 그대로 통과합니다.
  4. 4컨테이너가 내 서버에서 기동합니다.
  5. 5방문자의 요청은 Cloudflare와 공개 프록시를 거쳐, Agent가 개설한 터널을 통해 해당 컨테이너에 도달합니다.

요약하면 — 내 서버에 설치되는 것은 Agent와 Agent Dashboard, 두 컨테이너뿐입니다. 나머지는 저희 쪽에서 동작합니다.

모든 기능을 무료로 이용할 수 있습니다

연산과 저장은 사용자 서버에서 수행됩니다. OPTiCS는 해당 서버의 연결을 지원합니다.

  • HTTPS 도메인 3개
  • 서비스 배포 무제한
  • Agent 무제한
  • 카드 등록 없음

시작하기

설치는 한 줄입니다

내 서버에서 실행합니다. Docker가 설치되어 있지 않으면 설치 스크립트가 함께 설치합니다.

스크립트는 이 순서로 동작합니다

  1. 1.OS·배포판을 확인하고, Docker·Compose가 없으면 설치 여부를 먼저 확인합니다(동의한 경우에만 sudo를 사용합니다)
  2. 2.Agent 저장소에서 docker-compose.yml과 .env.example 두 파일만 내려받습니다 — 소스를 클론하거나 빌드하지 않으며, 실행되는 이미지는 GHCR에 게시된 것을 그대로 사용합니다
  3. 3.웹 SSH 터미널 사용 여부를 확인하고, 동의한 경우에만 sshd를 설정하고 전용 키를 생성합니다
  4. 4.포트 충돌을 확인한 뒤 이미지를 내려받아 컨테이너를 기동합니다
$curl -fsSL http://github.com/OPTiCS-Organization/OPTiCS-Infra/raw/main/linux/install-agent.sh -o install-agent.sh && sh install-agent.sh

제거

$curl -fsSL http://github.com/OPTiCS-Organization/OPTiCS-Infra/raw/main/linux/uninstall-agent.sh -o uninstall-agent.sh && sh uninstall-agent.sh

설치가 완료되면 화면에 연결 코드가 출력됩니다. 해당 코드를 Console에 입력하십시오.

자주 묻는 기술 질문

Hub에 장애가 발생하면 서비스도 함께 중단되나요?

이미 실행 중인 서비스는 중단되지 않습니다. 컨테이너는 사용자 서버에서 Docker 데몬이 직접 실행하며, Agent 코드 어디에도 Hub와의 연결이 끊어졌다고 컨테이너를 중단하는 로직이 없습니다. 컨테이너의 포트도 Docker가 호스트에 직접 바인딩하므로, 서버 로컬 IP로 직접 접근하는 경우에도 영향을 받지 않습니다. 다만 <서비스>.<워크스페이스>.optics.run 같은 공개 주소로 들어오는 요청은 Hub의 공개 프록시를 반드시 거치므로, 이 경로는 Hub에 장애가 발생하면 함께 중단됩니다. 배포·시작·중지 같은 새 명령도 Hub API를 경유하므로, Hub가 복구될 때까지는 처리되지 않습니다.

설치 스크립트는 정확히 무엇을 하나요?

OS와 배포판을 확인하고, Docker·Docker Compose가 없으면 설치 여부를 먼저 확인합니다(동의한 경우에만 sudo로 설치를 진행합니다). 그다음 Agent 저장소에서 docker-compose.yml과 .env.example 두 파일만 내려받습니다 — 소스를 클론하거나 빌드하지 않으며, 실제로 기동되는 이미지는 GHCR에 게시된 것입니다. 웹 SSH 터미널 사용 여부를 확인하고 동의하면 sshd를 설정하고 전용 키를 만들어 등록합니다. 포트(기본 5230/5240) 충돌을 확인한 뒤 이미지를 내려받아 컨테이너를 기동하는 것으로 완료됩니다. 아래 설치 섹션에 스크립트 원문 링크가 있습니다.

코드와 데이터는 어디에 저장되나요?

소스 코드, 빌드 이미지, 실행 중인 컨테이너 및 데이터베이스는 모두 사용자 서버(Agent)에 저장됩니다. Hub가 보관하는 정보는 계정 정보와 워크스페이스·서비스 설정 등의 메타데이터입니다. 다만 외부 방문자가 서비스에 접속할 때 전송하는 요청 바이트 자체는 Hub의 Gateway를 거쳐 서버로 중계됩니다 — Gateway는 요청을 전달할 뿐 내용을 로깅하거나 저장하지 않습니다.

어떤 서버가 있어야 하나요?

Docker(와 Compose)가 동작할 수 있는 서버면 충분합니다. 별도로 정해 둔 최소 사양은 없습니다. 공인 IP나 포트포워딩도 필요하지 않습니다. Agent가 사용자 서버에서 먼저 Hub로 연결하므로 NAT 환경에서도 사용할 수 있습니다.

HTTPS 인증서는 어떻게 관리되나요?

직접 발급하거나 갱신하지 않습니다. 서브도메인 발급과 인증서 모두 Cloudflare를 사용합니다. Hub가 워크스페이스·서비스 서브도메인의 DNS 레코드를 Cloudflare에 등록하면, 그 앞단에서 Cloudflare가 TLS를 처리합니다.

Agent는 내 서버에서 어디까지 권한을 갖나요?

Agent 컨테이너에는 호스트의 Docker 소켓(/var/run/docker.sock)이 그대로 마운트됩니다. 배포·시작·중지· 재배포 같은 정상 기능이 이 권한으로 동작하지만, 반대로 Agent 컨테이너가 침해되면 호스트의 Docker 전체를 조작할 수 있다는 의미이기도 합니다. 설치 시 웹 SSH 터미널을 활성화했다면 전용 SSH 키도 컨테이너에 추가로 마운트됩니다. 신뢰할 수 있는 서버에만 설치해야 합니다.

현재 상태

어디까지 구현했고, 무엇이 남았는지

동작합니다

9
  • Agent 설치와 코드 기반 페어링
  • 서비스 배포 · 시작 · 중지 · 재배포 · 삭제
  • 컨테이너 단위 시작 · 중지 · 재시작
  • 실시간 배포/런타임 로그 스트리밍
  • CPU · 메모리 모니터링 (7일 보존)
  • 워크스페이스 · 서비스 서브도메인
  • SSH 웹 터미널
  • Agent 원격 업데이트
  • 2단계 인증(TOTP) · 이메일 인증

준비 중입니다

5

Console 화면

  • Dashboard · Overview 페이지
  • Users · Activity 페이지

명령·스크립트

  • 배포 중단(ABORT) 명령
  • Windows용 제거 스크립트

팀 기능

  • 팀 구성원 초대 · 권한

완료 시기는 약속하지 않습니다. 진행 상황은 GitHub에서 확인할 수 있습니다.

Your hardware is already
powerful enough.

Turn it into your cloud.

빌린 서버
없음
공인 IP
필요 없음
하드웨어와 데이터
전부 사용자 소유

오픈소스 · 셀프호스팅