화. 8월 12th, 2025

G: 안녕하세요, 개발자 여러분! 🧑‍💻 클라우드 기반의 BaaS(Backend as a Service) 솔루션은 개발 속도를 획기적으로 높여주지만, 때로는 데이터 주권, 비용, 혹은 특정 커스터마이징의 필요성 때문에 직접 솔루션을 호스팅하고 싶을 때가 있습니다. 오늘 다룰 Supabase는 PostgreSQL 기반의 오픈소스 BaaS 플랫폼으로, 자체 호스팅이 가능하도록 설계되어 있죠!

이 글에서는 Supabase를 직접 서버에 설치하고, 나아가 나만의 멋진 커스텀 API 도메인(예: api.mydomain.com)을 설정하는 방법을 낱낱이 파헤쳐 보겠습니다. 이 글 하나면 여러분의 Supabase 셀프 호스팅 여정이 한결 수월해질 거예요! ✨


💡 왜 Supabase를 셀프 호스팅해야 할까요? 🤔

Supabase 클라우드 버전도 훌륭하지만, 셀프 호스팅은 다음과 같은 매력적인 이점들을 제공합니다.

  • 완벽한 제어권: 데이터베이스, 인증, 스토리지 등 모든 구성 요소를 직접 관리하고 최적화할 수 있습니다. 🛠️
  • 비용 효율성 (대규모 운영 시): 특정 규모 이상이 되면 클라우드 비용보다 자체 서버 운영이 더 저렴할 수 있습니다. 💰
  • 데이터 주권 및 규제 준수: 민감한 데이터를 특정 지역에만 보관해야 하는 경우 유용합니다. 🔒
  • 커스터마이징의 자유: Supabase의 내부 로직을 수정하거나, 특정 요구사항에 맞춰 기능을 확장할 수 있습니다. 🎨

물론, 직접 관리해야 하는 책임과 유지보수 부담이 따른다는 점도 기억해야 합니다. 하지만 걱정 마세요! 이 가이드가 그 부담을 덜어드릴 겁니다.


Part 1: Supabase 셀프 호스팅, 이제 시작해볼까요? 🚀

Supabase를 셀프 호스팅하는 가장 일반적인 방법은 Docker와 Docker Compose를 활용하는 것입니다. 거의 모든 구성 요소가 Docker 이미지로 제공되기 때문에 설치가 매우 간편합니다.

1.1. 준비물 확인! 🎒

시작하기 전에 필요한 것들을 확인해봅시다.

  • Linux 서버 (Ubuntu, CentOS 등): 충분한 RAM과 디스크 공간을 가진 서버가 필요합니다. (최소 2GB RAM, 20GB 디스크 권장)
  • Docker 및 Docker Compose: 서버에 미리 설치되어 있어야 합니다. (설치 가이드는 각 OS 공식 문서를 참고하세요.)
    # Docker 설치 확인
    docker --version
    # Docker Compose 설치 확인 (v2.x 이상 권장)
    docker compose version
  • Git: Supabase 저장소를 클론하기 위해 필요합니다.
    git --version

1.2. Supabase 저장소 클론하기 📥

먼저 Supabase의 Docker Compose 설정을 담고 있는 저장소를 클론합니다.

git clone --depth 1 https://github.com/supabase/supabase
cd supabase

--depth 1 옵션은 불필요한 Git 히스토리를 다운로드하지 않아 클론 시간을 단축합니다.

1.3. 환경 변수 설정 (.env 파일) ⚙️

Supabase는 .env 파일을 통해 환경 변수를 관리합니다. .env.example 파일을 복사하여 새로운 .env 파일을 만들고, 필요한 변수들을 설정해야 합니다.

cp .env.example .env

이제 .env 파일을 열어 다음 핵심 변수들을 설정합니다. (nano, vi, VS Code 등으로 편집)

# .env 파일 예시

# --- 핵심 보안 변수 (매우 중요!) ---
# ⚠️ 반드시 강력하고 유추 불가능한 값으로 변경하세요!
# JWT Secret: 인증 토큰 서명에 사용됩니다. 32자 이상, 무작위 문자열 권장.
# `openssl rand -hex 32` 명령어로 생성할 수 있습니다.
JWT_SECRET="your-super-secret-jwt-key-here-please-change-this-now"

# Supabase Anonymous Key (클라이언트 SDK에서 사용)
# `openssl rand -hex 32` 또는 웹사이트에서 임의의 키 생성기를 사용하세요.
SUPABASE_ANON_KEY="your-random-anon-key-here"

# Supabase Service Role Key (서버 사이드에서 높은 권한으로 사용)
# `openssl rand -hex 32` 또는 웹사이트에서 임의의 키 생성기를 사용하세요.
SUPABASE_SERVICE_ROLE_KEY="your-random-service-role-key-here"

# PostgreSQL 데이터베이스 비밀번호
# ⚠️ 반드시 변경하세요!
POSTGRES_PASSWORD="your-secure-postgres-password"

# --- 일반 설정 변수 ---
# PostgreSQL 포트 (기본값: 5432)
# 필요에 따라 변경할 수 있지만, 외부 노출은 권장하지 않습니다.
# POSTGRES_PORT=5432

# Supabase Studio (관리자 UI) 포트 (기본값: 8000)
# SUPABASE_STUDIO_PORT=8000

# 프로젝트 ID (선택 사항, 여러 프로젝트를 실행할 때 유용)
# PROJECT_ID="default"

# 공용 URL (매우 중요! 커스텀 도메인 설정 시 변경됩니다)
# 초기에는 서버 IP로 설정하거나 기본값으로 둡니다.
# SUPABASE_PUBLIC_URL="http://your-server-ip:8000" # 또는 http://localhost:8000

# CORS 허용 도메인 (쉼표로 구분)
# 프론트엔드 애플리케이션의 도메인을 여기에 추가합니다.
# CORS_ALLOWED_ORIGINS="http://localhost:3000,https://your-frontend-app.com"

# 기타 서비스 설정 (필요에 따라 주석 해제 및 설정)
# STORAGE_SERVICE_URL="http://localhost:5000"
# AUTH_SERVICE_URL="http://localhost:5000"
# ...

⚠️ 중요: JWT_SECRET, SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY, POSTGRES_PASSWORD반드시 안전하고 강력한 값으로 변경해야 합니다. 이 키들이 노출되면 심각한 보안 문제가 발생할 수 있습니다!

1.4. Supabase 서비스 실행하기 🚀

.env 파일 설정이 완료되었다면, 이제 Docker Compose를 사용하여 Supabase 서비스를 시작할 수 있습니다.

docker compose pull # 최신 이미지 다운로드 (선택 사항이지만 권장)
docker compose up -d # 백그라운드에서 모든 서비스 시작
  • docker compose pull: Supabase에 필요한 모든 Docker 이미지를 미리 다운로드합니다.
  • docker compose up -d: 모든 Supabase 서비스를 백그라운드(-d는 detach 모드)에서 시작합니다.

서비스가 성공적으로 실행되는지 확인하려면 다음 명령어를 사용할 수 있습니다.

docker compose ps
# 모든 Supabase 컨테이너가 'Up' 상태여야 합니다.
docker compose logs # 모든 서비스의 로그를 실시간으로 확인 (Ctrl+C로 종료)
# 또는 특정 서비스의 로그:
docker compose logs auth # 인증 서비스 로그

1.5. Supabase Studio 접속 및 확인 ✅

모든 서비스가 정상적으로 실행되었다면, 웹 브라우저를 통해 Supabase Studio에 접속할 수 있습니다.

  • http://[서버 IP]:8000

접속하면 로그인 페이지가 나타납니다. .env 파일에 설정했던 POSTGRES_PASSWORD를 사용하여 로그인할 수 있습니다. 로그인에 성공하면 Supabase의 관리 대시보드를 볼 수 있습니다. 🎉


Part 2: 커스텀 API 도메인 설정, 이제 프로페셔널하게! 🌐

Supabase Studio에 접속하여 내부적으로 사용하는 것은 문제가 없지만, 실제 프론트엔드 애플리케이션에서 api.mydomain.com과 같은 멋진 도메인으로 Supabase API에 접근하려면 몇 가지 추가 설정이 필요합니다.

이 과정은 크게 DNS 설정, 역방향 프록시 (Reverse Proxy) 설정, SSL 인증서 발급으로 나뉩니다.

2.1. 도메인 및 DNS 설정 🗺️

가장 먼저 할 일은 여러분의 도메인(예: mydomain.com)에 새로운 서브도메인(예: api.mydomain.com)을 추가하고, 이 서브도메인이 여러분의 서버 IP 주소를 가리키도록 설정하는 것입니다.

  • CNAME 레코드: api.mydomain.commydomain.com을 가리키고, mydomain.com이 서버 IP를 가리키는 경우.
  • A 레코드: api.mydomain.com이 직접 서버 IP를 가리키는 경우. (일반적으로 더 간단하고 명확)

여러분의 도메인을 구매한 호스팅 서비스(예: GoDaddy, Namecheap, Cloudflare 등)의 DNS 관리 페이지로 이동합니다.

예시 (A 레코드 추가):

타입 이름 / 호스트 값 / 가리키는 주소 TTL (Time To Live)
A api [여러분의 서버 IP 주소] 자동 또는 3600

설정 후 DNS 전파에는 시간이 걸릴 수 있습니다 (몇 분에서 몇 시간). ping api.mydomain.com 명령어로 IP 주소가 올바르게 뜨는지 확인해 보세요.

2.2. 역방향 프록시 (Reverse Proxy) 설정 🔄

클라이언트가 api.mydomain.com으로 요청을 보내면, 이 요청을 Supabase 컨테이너 내부의 포트(기본적으로 8000번)로 전달해주는 ‘역방향 프록시’가 필요합니다. 여기서는 널리 사용되는 Nginx를 예시로 들겠습니다. (Caddy를 사용해도 좋습니다!)

Nginx 설치:

sudo apt update
sudo apt install nginx -y # Ubuntu/Debian 기준
# 또는 CentOS/RHEL: sudo yum install nginx -y

Nginx 설정 파일 생성:

sudo nano /etc/nginx/sites-available/supabase.conf

다음 내용을 복사하여 붙여넣고, api.mydomain.com 부분을 여러분의 실제 도메인으로 변경하세요.

# /etc/nginx/sites-available/supabase.conf

server {
    listen 80;
    server_name api.mydomain.com; # ⚠️ 여러분의 커스텀 도메인으로 변경하세요!

    # HTTP에서 HTTPS로 리다이렉트 (SSL 인증서 발급 후 활성화)
    # return 301 https://$host$request_uri;

    location / {
        proxy_pass http://localhost:8000; # Supabase Studio 및 API 게이트웨이가 실행되는 포트
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSockets 지원
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # Supabase Studio의 특정 경로를 직접 매핑할 수도 있습니다 (선택 사항)
    # location ~ ^/(auth|storage|functions|realtime|rest|graphql)/ {
    #     proxy_pass http://localhost:8000;
    #     proxy_set_header Host $host;
    #     proxy_set_header X-Real-IP $remote_addr;
    #     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #     proxy_set_header X-Forwarded-Proto $scheme;
    # }
}

설정 활성화 및 Nginx 재시작:

sudo ln -s /etc/nginx/sites-available/supabase.conf /etc/nginx/sites-enabled/
sudo nginx -t # 설정 파일 문법 오류 검사
sudo systemctl restart nginx # Nginx 재시작
sudo systemctl enable nginx # 부팅 시 자동 시작 설정

이제 http://api.mydomain.com으로 접속해보면 Supabase Studio 로그인 페이지가 나타날 것입니다. 하지만 아직 HTTPS가 아니므로 보안 경고가 뜰 수 있습니다.

2.3. SSL 인증서 발급 (Let’s Encrypt + Certbot) 🔒

보안과 신뢰성을 위해 HTTPS를 사용하는 것은 필수입니다. Let’s Encrypt는 무료로 SSL/TLS 인증서를 발급해주며, Certbot은 이를 자동화해주는 훌륭한 도구입니다.

Certbot 설치:

sudo snap install core # snapd가 설치되어 있는지 확인
sudo snap refresh core

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

인증서 발급 및 Nginx 설정 자동화:

sudo certbot --nginx -d api.mydomain.com # ⚠️ 여러분의 커스텀 도메인으로 변경하세요!

이 명령어를 실행하면 Certbot이 Nginx 설정을 분석하여 자동으로 인증서를 발급하고, Nginx 설정 파일에 HTTPS 관련 내용을 추가해줍니다. 이메일 주소 입력 및 약관 동의 절차가 있을 수 있습니다.

성공적으로 완료되면, nginx/sites-available/supabase.conf 파일이 다음과 유사하게 변경되었을 것입니다.

server {
    listen 80;
    server_name api.mydomain.com;
    return 301 https://$host$request_uri; # HTTP -> HTTPS 리다이렉션 추가됨
}

server {
    listen 443 ssl http2; # HTTPS 포트 추가
    server_name api.mydomain.com;

    # Certbot이 추가한 SSL 설정
    ssl_certificate /etc/letsencrypt/live/api.mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.mydomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Nginx를 재시작하여 변경된 설정을 적용합니다.

sudo systemctl restart nginx

이제 https://api.mydomain.com으로 접속하여 안전한 HTTPS 연결로 Supabase Studio에 접근할 수 있는지 확인합니다.

2.4. Supabase 환경 변수 업데이트 (매우 중요! ⚠️)

마지막으로, Supabase 서비스 자체가 외부에서 어떤 URL로 접근될지 인지하도록 .env 파일을 업데이트해야 합니다.

sudo nano .env # 또는 vim .env

SUPABASE_PUBLIC_URL 변수를 커스텀 도메인으로 변경합니다.

# .env 파일
# ...
SUPABASE_PUBLIC_URL="https://api.mydomain.com" # ⚠️ 여기에 커스텀 도메인을 정확히 입력!
# ...

변경 사항을 저장한 후, Supabase Docker 컨테이너를 재시작하여 새로운 환경 변수를 적용합니다.

docker compose down # 기존 컨테이너 중지 및 삭제
docker compose up -d # 새로운 환경 변수로 컨테이너 재시작

이 단계는 매우 중요합니다. SUPABASE_PUBLIC_URL이 정확히 설정되지 않으면, 인증 토큰 발급, 스토리지 파일 URL 생성 등 Supabase의 핵심 기능들이 올바르게 작동하지 않을 수 있습니다. 특히 Supabase 클라이언트 SDK를 사용할 때 오류가 발생할 가능성이 큽니다.


Part 3: 고급 팁 & 베스트 프랙티스 ✨

이제 기본적인 셀프 호스팅과 커스텀 도메인 설정은 완료되었습니다. 하지만 프로덕션 환경에서 Supabase를 안정적으로 운영하려면 몇 가지 추가 고려사항이 있습니다.

3.1. 보안 강화 🔒

  • 방화벽 설정 (UFW/FirewallD): 80, 443 포트만 외부에서 접근하도록 허용하고, 8000, 5432 등 내부 포트는 외부 접근을 차단합니다.
    sudo ufw allow 'Nginx Full' # Nginx 기본 HTTP/HTTPS 포트 허용
    sudo ufw allow OpenSSH     # SSH 접속 허용
    sudo ufw enable            # UFW 활성화
    sudo ufw status            # 상태 확인
  • 강력한 JWT Secret: openssl rand -base64 32 등으로 32자 이상의 무작위 문자열을 생성하여 사용합니다.
  • 비밀번호 관리: 모든 비밀번호는 강력하고 유추 불가능한 것으로 설정하며, 주기적으로 변경합니다.
  • 인증 키 제한: SUPABASE_ANON_KEY는 클라이언트에게 노출되므로, 필요한 권한만 부여된 정책으로 제한해야 합니다. SUPABASE_SERVICE_ROLE_KEY는 서버 측에서만 사용하고 절대 클라이언트에 노출해서는 안 됩니다.

3.2. 정기적인 백업 💾

데이터는 가장 소중한 자산입니다. PostgreSQL 데이터베이스와 스토리지 버킷 데이터를 정기적으로 백업하는 전략을 수립해야 합니다.

  • pg_dump를 사용하여 PostgreSQL 데이터베이스를 백업합니다.
  • 스토리지 파일은 supabase/volumes 디렉토리에 저장되므로 이 디렉토리를 주기적으로 백업합니다.

3.3. Supabase 업데이트 🔄

Supabase는 빠르게 발전하므로, 주기적으로 최신 버전을 유지하는 것이 좋습니다.

  1. cd supabase (저장소 디렉토리로 이동)
  2. git pull origin main (최신 코드 가져오기)
  3. docker compose pull (최신 Docker 이미지 다운로드)
  4. docker compose up -d (새로운 이미지로 서비스 재시작) ⚠️ 주의: 대규모 업데이트는 잠재적 변경 사항을 먼저 확인하고, 백업 후 진행하는 것이 안전합니다.

3.4. 모니터링 및 로깅 📊

서비스의 상태를 파악하기 위해 모니터링 및 로깅 시스템을 구축하는 것이 좋습니다.

  • Docker Logs: docker compose logs [서비스명] 명령어로 개별 서비스의 로그를 확인할 수 있습니다.
  • Prometheus & Grafana: 보다 고급 모니터링을 위해 설치를 고려해볼 수 있습니다.

결론: 당신의 Supabase, 이제 자유롭게 날개를 펴세요! 🚀

이 가이드를 통해 Supabase를 직접 호스팅하고, 커스텀 API 도메인까지 연결하는 방법을 성공적으로 익히셨기를 바랍니다. 이제 여러분은 데이터에 대한 완전한 제어권을 가지고, 비용 효율성을 높이며, 필요한 모든 커스터마이징을 수행할 수 있는 강력한 위치에 서게 되었습니다.

물론, 직접 관리하는 것은 추가적인 노력과 책임이 필요합니다. 하지만 그만큼 여러분의 프로젝트에 더 큰 유연성과 가능성을 제공할 것입니다. Supabase의 오픈소스 생태계는 계속해서 발전하고 있으니, 공식 문서를 꾸준히 확인하며 최신 정보를 습득하는 것도 잊지 마세요!

궁금한 점이나 막히는 부분이 있다면 언제든지 Supabase 커뮤니티나 관련 포럼에서 도움을 구할 수 있습니다. 여러분의 멋진 프로젝트를 응원합니다! 🎉

🔗 유용한 링크:

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다