supabase self-hosting은 앱 개발을 더 쉽게 할 수 있도록 도와준다. 데이터베이스와 백엔드 서버를 구축하는 과정이 간편해진다. 예를 들어, 유저 정보를 저장하거나 인증 시스템을 만들 때 데이터베이스와 서버가 필요한데, supabase self-hosting을 이용하면 이런 작업을 더 쉽게 처리할 수 있다. AWS나 Firebase 같은 클라우드 서비스를 사용하지 않아도 자체 서버를 운영할 수 있다.
워낙 기업에서 클라우드 사용하여 서비스를 만든 뒤 이용 비용이 많이 나와 눈치를 볼 필요가 없다. 많은 서비스나 도구들이 그 때 그 때 필요해서 잠깐 만들고 운영하다 그 수명을 다하는 경우가 많은데, 매번 클라우드에 만들어두고 바쁘다고 삭제하거나 비활성화 시키는 것을 놓져 난감한 경우를 겪는 개발자들이 많았다.
그럴바에는 온프렘의 x86_x64장비에서 마음껏 개발하고 서비스하는 것이 바람직해보인다.
그런 차원에서 많은 리소스를 절감해줄 수 있는 이런 오픈 소스는 적극 활용할 필요가 있다.
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을 관리하면 간편하다.
supabase의 self-hosting 에는 로그인 기능이 없으므로 퀵하게 nginx의 basic auth기능을 사용하기로 한다. 이를 위해 nginx설치와 설정을 다음과 같이 한다.
sudo apt-get update
sudo apt-get install nginx
sudo vi /etc/nginx/sites-available/supa_end_point
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으로 하며 도메인 이름은 각자의 사용하는 도메인으로 설정
sudo ln -s /etc/nginx/sites-available/supa_end_point /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
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 인증서와 개인 키 파일의 경로를 설정.
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
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 같은 타 프레임워크를 다시 고려해볼 수도 있겠다.