supabase 와 nginx로 backend engineer 대체하기

나이트 개발자·2023년 3월 30일
2
post-thumbnail

supabase self-hosting은 앱 개발을 더 쉽게 할 수 있도록 도와준다. 데이터베이스와 백엔드 서버를 구축하는 과정이 간편해진다. 예를 들어, 유저 정보를 저장하거나 인증 시스템을 만들 때 데이터베이스와 서버가 필요한데, supabase self-hosting을 이용하면 이런 작업을 더 쉽게 처리할 수 있다. AWS나 Firebase 같은 클라우드 서비스를 사용하지 않아도 자체 서버를 운영할 수 있다.

워낙 기업에서 클라우드 사용하여 서비스를 만든 뒤 이용 비용이 많이 나와 눈치를 볼 필요가 없다. 많은 서비스나 도구들이 그 때 그 때 필요해서 잠깐 만들고 운영하다 그 수명을 다하는 경우가 많은데, 매번 클라우드에 만들어두고 바쁘다고 삭제하거나 비활성화 시키는 것을 놓져 난감한 경우를 겪는 개발자들이 많았다.

그럴바에는 온프렘의 x86_x64장비에서 마음껏 개발하고 서비스하는 것이 바람직해보인다.

그런 차원에서 많은 리소스를 절감해줄 수 있는 이런 오픈 소스는 적극 활용할 필요가 있다.

supabase 설치

nocode로 백엔드 개발이 필요
supabase와 nocodb 를 고민하던 중 supabase사용하기로 결정
https://supabase.com/docs/guides/self-hosting/docker

# Get the code
git clone --depth 1 https://github.com/supabase/supabase

# Go to the docker folder
cp -R supabase/docker supabase/supa-docker
cd supabase/supa-docker

# Copy the fake env vars
cp .env.example .env

# Start 는 나중에
# docker compose up

default로 되어 있는 POSTGRES_PASSWORD와 JWT_SECRET, ANON_KEY, SERVICE_ROLE_KEY 변경한 뒤 띄워야함.

생성할 때 seed가 되는 JWT_SECRET 은 예제로 나온 키가 40자리 이므로 40자리 pass phrase를 생성

 openssl rand -base64 40

supabase self-hosting guide 로가서 ANON_KEY, SERVICE_ROLE_KEY 생성할 때 위 JWT_SECRET을 사용한다.

이 제너레이터로 생성된 키들은 .env파일에 반영하고 실행

docker compose up

docker명령어로 확인하는 게 너무 귀찮고 시간을 많이 요하기 때문에 vscode의 docker plugin을 설치해서 vscode상에서 확인하고 survival을 관리하면 간편하다.

nginx 구성

supabase의 self-hosting 에는 로그인 기능이 없으므로 퀵하게 nginx의 basic auth기능을 사용하기로 한다. 이를 위해 nginx설치와 설정을 다음과 같이 한다.

  1. 먼저 서버에 Nginx를 설치.
sudo apt-get update
sudo apt-get install nginx
  1. /etc/nginx/sites-available 디렉토리에 새로운 Nginx 설정 파일생성
sudo vi /etc/nginx/sites-available/supa_end_point
  1. 설정 파일에 다음과 같은 내용 추가
server {
  listen 80;
  listen [::]:80;

  server_name example.com; # Replace with your domain name
  auth_basic "Restricted Access";
  auth_basic_user_file /etc/nginx/.htpasswd;

  location / {
    proxy_pass http://localhost:3000;
    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;
  }
}

포트 80에서 요청을 수신하고 http://localhost:3000으로 하며 도메인 이름은 각자의 사용하는 도메인으로 설정

  1. /etc/nginx/sites-enabled 디렉토리에 새로운 설정 파일에 대한 심볼릭 링크생성
sudo ln -s /etc/nginx/sites-available/supa_end_point /etc/nginx/sites-enabled/
  1. 설정 파일이 문법적으로 올바른지 확인한 후 Nginx를 다시 로드
sudo nginx -t
sudo systemctl reload nginx
  1. (선택 사항) HTTPS를 사용하려면 SSL 인증서를 설치하고 설정 파일을 업데이트하여 HTTPS를 활성화
server {
  listen 80;
  listen [::]:80;

  server_name example.com;

  location / {
    return 301 https://$host$request_uri;
  }
}

server {
  listen 443 ssl;
  listen [::]:443 ssl;

  server_name example.com;
  auth_basic "Restricted Access";
  auth_basic_user_file /etc/nginx/.htpasswd;

  ssl_certificate /path/to/certificate.pem;
  ssl_certificate_key /path/to/private-key.pem;

  location / {
    proxy_pass http://localhost:3000;
    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;
  }
}

포트 443에서 요청을 수신하고 https://localhost:3000으로 전달하며, SSL 인증서와 개인 키 파일의 경로를 설정.

  1. basic auth 구성은 다음과 같이 한다.
sudo apt-get install apache2-utils
#처음만들 때만사용
sudo htpasswd -c /etc/nginx/.htpasswd john
# 여러 사용자일 때는 -c 없이 사용
sudo htpasswd /etc/nginx/.htpasswd clark
python -m http.server 3000
sudo systemctl reload nginx
sudo systemctl status nginx

오류가 있거나 nginx 동작 상황 보고 싶을 땐 상황에 맞게 아래와 같이 확인

sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/slow.log
  1. location별 basic auth 적용
    url path별로 basic auth를 적용하려면 아래와 같은 패턴으로 가능하다.
http {
    ...
    server {
        ...
        location /api {
            auth_basic "Restricted Area";
            auth_basic_user_file /etc/nginx/.htpasswd_api;
            ...
        }
        location /admin {
            auth_basic "Administrator Area";
            auth_basic_user_file /etc/nginx/.htpasswd_admin;
            ...
        }
        ...
    }
}

다음 단계

설치됐으니 인증서를 설치하고 실제 서비스에 연결해 봐야겠다. 아마 supabase studio 접근만 auth로 막는 작업이 될 것 같고, REST API접근은 별도의 설정을 해야할 것으로 보인다. 이후에는 프론트엔드에 연동할 때 supabase에서 제공하는 라이브러리나 API들을 어떻게 사용하는 지를 기록해야 할 것 같다.
사용하다가 안정성에 의심이 간다면 nocodb나 pREST 같은 타 프레임워크를 다시 고려해볼 수도 있겠다.

profile
개발하면서 또는 프러덕 관리하면서 겪는 기억해둬야하는 내용을 메모장 삼아 남긴다. Google Keep이나 메모 도구에 남기는 것과는 달리 잘 정리할 수 있어서 언젠가 들춰봐야할 내용들을 담은 글들이 게시된다.

0개의 댓글