AI로 PoC를 많이 하다 보면, 여러 Cloud 기능을 쓰게 되는데 요즘은 Supabase와 Vecel을 많이 쓰게 되는 것 같다. Supabase는 개발자가 백엔드 인프라를 직접 구축하는 수고를 덜어주는 오픈소스 서비스형 백엔드(Backend as a Service, BaaS) 플랫폼이다. 'Firebase의 오픈소스 대안'으로 불리며, 다음과 같은 핵심 기능을 제공한다

  • Database (PostgreSQL): 모든 프로젝트에는 전용 PostgreSQL 데이터베이스가 제공되며, SQL을 직접 작성하거나 편리한 대시보드를 통해 데이터를 관리할 수 있습니다.
  • Authentication: 이메일, 비밀번호 기반 로그인뿐만 아니라 Google, GitHub 등을 이용한 소셜 로그인(OAuth) 기능을 쉽게 연동할 수 있습니다.
  • Storage: 이미지, 비디오, 문서와 같은 대용량 미디어 파일을 저장하고 관리할 수 있는 환경을 제공합니다.

이 기능을 Web에서 Free 플랜으로 사용하면 프로젝트를 2개까지 사용가능하다. 다행히, Supabase를 Mini PC에서 사용할 수 있어 여기서 설정해 보자.

구분 Supabase Cloud (무료) Mini PC Self-hosting
비용 용량/트래픽 초과 시 과금 0원 (전기세 제외)
데이터 용량 보통 500MB 제한 내 SSD 용량 전체
동시 접속자 제한 있음 하드웨어 사양만큼 무제한
데이터 주권 외부 서버에 저장 내 미니 PC에 저장

1. 기본 가정 및 공통 인프라 설정 (0단계)

본격적인 설치 전, 서버의 기초 뼈대를 잡는다. 이 설정은 한 번만 수행하면 된된다.

  • Linux OS: Ubuntu 24.04 등 안정적인 배포판 권장.
  • Docker 환경: docker-ce, docker-compose-plugin 설치 완료.
  • 보안 (VPN & UFW):
    • VPN: 내부망 접속을 위한 안전한 통로 확보 (ipTIME VPN 등).
    • UFW: 기본 방화벽 활성화 및 기본 포트 허용 (sudo ufw allow ssh, sudo ufw enable).
  • 주소 (DDNS): 외부 접속용 고정 주소 확보 (예: my-home.iptime.org).

2. 첫 번째 Supabase 프로젝트 구축 (Project A)

웹에서 '프로젝트 하나'를 만드는 것과 동일한 과정이이다.

1) 파일 준비 및 기본 설정

여기서 DDNS와 supabase의 port는 다르게 하면 된다.

# 프로젝트 A 전용 폴더 생성
mkdir -p ~/supabase/project-a && cd ~/supabase/project-a
git clone --depth 1 https://github.com/supabase/supabase .
cd docker
cp .env.example .env

2) .env 디테일 수정

  • URL 설정:
    • API_EXTERNAL_URL=http://my-home.iptime.org:8000
    • GOTRUE_EXTERNAL_URL=http://my-home.iptime.org:8000
  • 보안 키: JWT_SECRET, ANON_KEY, SERVICE_ROLE_KEY를 고유한 문자열로 변경.
  • DB 암호: POSTGRES_PASSWORD를 강력한 비밀번호로 변경.

experimental이기는 하지만, 다음 명령을 사용하면 바로 .env의 주요 값을 생성해서 업데이트 해주는 명령도 있다.

sh ./utils/generate-keys.sh

3) 서비스 기동 및 포트 개방

  • Docker 실행: docker compose up -d
  • UFW 허용: sudo ufw allow 8000/tcp
  • 포트 포워딩 (공유기): 외부 8000 -> 미니 PC 8000 (TCP) 설정 추가.

3. 두 번째 Supabase 프로젝트 추가 (Project B)

동일한 장비에서 완전히 분리된 별도의 프로젝트를 운영한다.

1) 인스턴스 격리 복제

# 프로젝트 B 전용 폴더 생성 (데이터와 설정의 완전한 분리)
mkdir -p ~/supabase/project-b && cd ~/supabase/project-b
git clone --depth 1 https://github.com/supabase/supabase .
cd docker
cp .env.example .env

2) 충돌 방지를 위한 디테일 수정

  • 포트 차별화: 중복을 피하기 위해 다른 포트(e.g. 8001) 를 사용한다.
    • .envKONG_HTTP_PORT=8001 수정.
    • 모든 외부 URL 끝을 :8001로 변경 (예: http://my-home.iptime.org:8001).
  • 프로젝트 이름 지정: docker-compose.yml 파일 최상단에 name: supabase-b 추가.
    • 이렇게 해야 컨테이너 이름(예: supabase-b-db)이 첫 번째 프로젝트와 겹치지 않는다.

3) 서비스 기동 및 포트 개방

  • Docker 실행: docker compose up -d
  • UFW 허용: sudo ufw allow 8001/tcp
  • 포트 포워딩 (공유기): 외부 8001 -> 미니 PC 8001 (TCP) 설정 추가.

🔒 4. 마무리 및 통합 관리

두 인스턴스가 독립적으로 운영되는 상태에서의 관리 포인트입니다.

  • 상태 모니터링:
    • docker compose -p supabase-a ps: 첫 번째 프로젝트 상태 확인.
    • docker compose -p supabase-b ps: 두 번째 프로젝트 상태 확인.
  • 로그 관리: 특정 프로젝트의 에러 확인 시 -p 옵션 사용 (docker compose -p supabase-b logs -f realtime).
  • 리소스 배분: 미니 PC의 사양에 따라 docker stats로 메모리 점유율을 확인하며 운영하자.

핵심 요약

  1. 하나의 인스턴스 = 하나의 프로젝트: 폴더별로 docker-compose를 실행하여 독립적인 환경을 구축한다.
  2. 포트 포워딩은 건별로: 인스턴스마다 사용하는 KONG_HTTP_PORT가 다르므로, 공유기 설정도 그에 맞춰 하나씩 추가해야 한다.
  3. 이름 격리의 중요성: yml 파일에 프로젝트 name을 명시해야 컨테이너 이름 충돌로 인한 실행 실패를 막을 수 있다.

이 가이드는 로컬 개발 환경을 넘어, 실제 여러 서비스를 한 대의 서버에서 운영할 때 가장 표준적인 방법이다.

+ Recent posts