Debian 11에서 Docker로 Supabase를 설치하는 방법
이 페이지에서
- 전제 조건
- 1단계 - 방화벽 구성\n
- 2단계 - Git 설치
- 3단계 - Docker 설치
- 4단계 - Docker Compose 설치
- 5단계 - Supabase 다운로드 및 구성
- 6단계 - Supabase 설치
- 7단계 - SSL 설치
- 8단계 - Nginx 설치 및 구성
- 9단계 - Supabase에 액세스
- 10단계 - HTTP 인증 활성화\n
- 11단계 - Supabase 업데이트
- 결론
Supabase는 애플리케이션 개발에 필요한 모든 도구를 제공하는 오픈 소스 Firebase 대안입니다. Supabase는 PostgreSQL 데이터베이스, 사용자 인증, 스토리지 및 실시간 API를 제공하며 Angular, Flutter, Next.js, React, Svelte 및 Vue와 같은 널리 사용되는 프레임워크 및 도구와 통합됩니다.
수파베이스를 사용하는 방법은 2가지가 있습니다. 첫 번째 옵션은 더 많은 기능을 제공하는 클라우드 호스팅 앱에 가입하는 것입니다. 두 번째 옵션은 Docker를 사용하여 코드를 자체 호스팅하는 것입니다. 그러나 자체 호스팅에는 몇 가지 주의 사항이 있습니다. 프로젝트를 생성하거나 관리할 수 없습니다. 또한 전체 프로젝트는 베타 단계에 있으며 자체 호스팅 버전은 테스트 및 로컬 개발용으로만 사용해야 합니다. 다른 모든 목적을 위해서는 클라우드 애플리케이션을 사용해야 합니다.
이 튜토리얼에서는 Debian 11 기반 서버에 Supabase를 설치하고 Nginx 서버를 통해 프록시하는 방법을 배웁니다.
전제 조건
-
A server running Debian 11 with a minimum of 2GB RAM.
-
A non-root user with sudo privileges.
-
A Domain name (
supabase.example.com
) pointing to the server. -
Everything is updated.
$ sudo apt update && sudo apt upgrade
-
Few packages that your system needs.
$ sudo apt install nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring -y
Some of these packages may already be installed on your system.
1단계 - 방화벽 구성
첫 번째 단계는 방화벽을 구성하는 것입니다. 데비안은 ufw(복잡하지 않은 방화벽)와 함께 제공됩니다.
방화벽이 실행 중인지 확인하십시오.
$ sudo ufw status
다음 출력을 얻어야 합니다.
Status: inactive
방화벽이 활성화 시 현재 연결을 끊지 않도록 SSH 포트를 허용합니다.
$ sudo ufw allow OpenSSH
HTTP 및 HTTPS 포트도 허용합니다.
$ sudo ufw allow 80/tcp $ sudo ufw allow 443/tcp
방화벽 활성화
$ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup
방화벽의 상태를 다시 확인하십시오.
$ sudo ufw status
비슷한 출력이 표시되어야 합니다.
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80/tcp ALLOW Anywhere 443/tcp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 443/tcp (v6) ALLOW Anywhere (v6)
2단계 - Git 설치
힘내를 설치하십시오.
$ sudo apt install git
설치를 확인하십시오.
$ git --version git version 2.30.2
3단계 - 도커 설치
최신 버전의 Docker를 설치하려면 Dockers 공식 GPG 키를 추가하십시오.
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
공식 Docker 저장소를 설치합니다.
$ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Debian 시스템 리포지토리를 업데이트합니다.
$ sudo apt update
최신 버전의 Docker를 설치합니다.
$ sudo apt install docker-ce docker-ce-cli containerd.io
Docker가 실행 중인지 확인합니다.
$ sudo systemctl status docker ? docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-03-21 03:19:09 UTC; 9s ago TriggeredBy: ? docker.socket Docs: https://docs.docker.com Main PID: 15816 (dockerd) Tasks: 7 Memory: 27.9M CPU: 566ms CGroup: /system.slice/docker.service ??15816 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
기본적으로 Docker에는 루트 권한이 필요합니다. sudo
명령을 실행할 때마다 sudo
를 사용하지 않으려면 docker
명령에 사용자 이름을 추가하세요. > 그룹.
$ sudo usermod -aG docker $(whoami)
이 변경 사항을 사용하려면 서버에서 로그아웃하고 동일한 사용자로 다시 로그인해야 합니다.
4단계 - Docker Compose 설치
Docker Composes의 사용 가능한 최신 버전은 2.0.x이지만 호환성을 위해 이전 버전의 안정적인 v1.29.2를 설치합니다.
다음 명령을 실행하여 안정적인 Docker Compose 릴리스를 다운로드합니다.
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
바이너리 파일에 실행 권한을 적용합니다.
$ sudo chmod +x /usr/local/bin/docker-compose
Docker Composes bash 완료 스크립트를 다운로드하고 설치합니다.
$ sudo curl \ -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \ -o /etc/bash_completion.d/docker-compose
다음 명령을 실행하여 변경 사항을 적용하십시오.
$ source ~/.bashrc
5단계 - Supabase 다운로드 및 구성
Supabase Github 리포지토리를 복제합니다.
$ git clone --depth 1 https://github.com/supabase/supabase.git
--depth 1
매개변수는 리포지토리의 얕은 복제를 수행합니다. 즉, 전체 기록이 아닌 최신 커밋만 가져옵니다. 이것은 성능을 향상시키기 위해 수행됩니다.
도커 디렉터리로 전환합니다.
$ cd supabase/docker
예제 파일에서 환경 파일을 만듭니다.
$ cp .env.example .env
편집을 위해 새로 만든 파일을 엽니다.
$ nano .env
강력하게 생성된 고유 암호로 변수 POSTGRES_PASSWORD
의 값을 변경합니다.
$ POSTGRES_PASSWORD=<yourpostgresqlpwd>
특수 문자 없이 32자 이상으로 다른 고유 암호를 생성하십시오. JWT_SECRET
의 값을 이 암호로 바꿉니다.
JWT_SECRET=<your32pluscharacterspwd>
1password와 같은 온라인 비밀번호 생성기를 사용하여 위의 비밀번호를 만들 수 있습니다.
Supabase 웹사이트를 열고 JWT_SECRET
을 입력하여 ANON_KEY
를 생성합니다. 지정된 상자에 JWT_SECRET
을 붙여넣고 미리 구성된 페이로드 드롭다운 메뉴에서 ANON_KEY
를 선택한 다음 Generate JWT 버튼을 클릭하여 토큰을 생성합니다.
이 토큰을 복사하여 .env
파일의 ANON_KEY
값으로 붙여넣습니다.
마찬가지로 사전 구성된 페이로드를 전환하고 JWT 생성 버튼을 눌러 SERVICE_KEY
를 생성하는 동일한 단계를 반복합니다.
생성된 토큰을 복사하여 .env
파일의 SERVICE_KEY
값으로 붙여넣습니다.
다음 변수를 구성하여 이메일 SMTP 설정을 구성합니다. 튜토리얼에 Amazons SES 서비스를 사용하고 있습니다.
SMTP_HOST=email-smtp.us-west-2.amazonaws.com SMTP_PORT=587 SMTP_USER=<your_amazon_ses_user> SMTP_PASS=<your_amazon_ses_password> SMTP_SENDER_NAME=SupabaseAdmin
사이트 URL을 구성합니다.
SITE_URL=https://supabase.example.com
공용 REST URL을 구성하십시오.
PUBLIC_REST_URL=https://supabase.example.com/rest/v1/
Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
SMTP를 통해 전송되는 인증 메일은 Supabase에 만연한 버그로 인해 링크가 끊어집니다. 이 문제를 해결하려면 docker-compose.yml
파일을 엽니다.
$ nano docker-compose.yml
GOTRUE_SITE_URL
변수 바로 아래에 API_EXTERNAL_URL
변수를 추가하면 다음과 같이 표시됩니다.
GOTRUE_SITE_URL: ${SITE_URL} API_EXTERNAL_URL: ${SITE_URL}
Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다. 이 파일은 Supabase 설치를 업그레이드할 때마다 덮어쓰게 됩니다. 다음 번에 버그가 수정되기를 바랍니다. 이메일 버그가 반복되지 않도록 하려면 이 변수를 수동으로 추가해야 합니다.
편집을 위해 volumes/api/kong.yml
파일을 엽니다.
$ nano volumes/api/kong.yml
consumers
섹션에서 anon
사용자 키를 이전에 생성된 ANON_KEY
로 바꿉니다.
consumers: - username: anon keyauth_credentials: - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
또한 service_role
의 키를 위에서 생성한 SERVICE_KEY
로 교체합니다.
- username: service_role keyauth_credentials: - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q
Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
6단계 - 수파베이스 설치
다음 명령을 사용하여 Supabase를 실행합니다. 이 과정은 다소 시간이 걸립니다.
$ docker-compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up -d
실행 중인 컨테이너의 상태를 확인합니다.
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d25393873731 supabase/storage-api:v0.10.0 "/bin/sh -c \"./stora…" About a minute ago Up About a minute 5000/tcp supabase-storage e6df7dcdd45b supabase/gotrue:v2.5.21 "gotrue" About a minute ago Up About a minute supabase-auth b3a758592d10 supabase/postgres-meta:v0.29.0 "postgres-meta" About a minute ago Up About a minute 0.0.0.0:5555->8080/tcp, :::5555->8080/tcp supabase-meta cdb18c248f79 supabase/realtime:v0.21.0 "bash -c './prod/rel…" About a minute ago Up About a minute supabase-realtime 71417337efae postgrest/postgrest:v9.0.0 "/bin/postgrest" About a minute ago Up About a minute 3000/tcp supabase-rest 2d51af16bd1f kong:2.1 "/docker-entrypoint.…" 2 minutes ago Up About a minute 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 8001/tcp, 0.0.0.0:8443->8443/tcp, :::8443->8443/tcp, 8444/tcp supabase-kong d6490380e4e8 supabase/postgres:14.1.0 "docker-entrypoint.s…" 2 minutes ago Up About a minute 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp supabase-db 40a49d1482fa supabase/studio:latest "docker-entrypoint.s…" 2 minutes ago Up About a minute 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp supabase-studio 3cce50db9782 inbucket/inbucket:stable "/start-inbucket.sh …" 2 minutes ago Up About a minute (healthy) 0.0.0.0:1100->1100/tcp, :::1100->1100/tcp, 0.0.0.0:2500->2500/tcp, :::2500->2500/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp supabase-mail
7단계 - SSL 설치
Lets Encrypt를 사용하여 SSL 인증서를 설치하려면 Certbot 도구를 설치해야 합니다.
이를 위해 Snapd 패키지 설치 프로그램을 사용합니다. 대부분의 Debian 서버는 함께 제공되지 않으므로 Snapd 설치 프로그램을 설치합니다.
$ sudo apt install snapd
Snapd 버전이 최신인지 확인하세요.
$ sudo snap install core && sudo snap refresh core
Certbot을 설치합니다.
$ sudo snap install --classic certbot
다음 명령을 사용하여 /usr/bin
디렉토리에 대한 심볼릭 링크를 생성하여 Certbot 명령을 실행할 수 있는지 확인하십시오.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
설치를 확인하십시오.
$ certbot --version certbot 1.25.0
SSL 인증서를 생성합니다.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m -d supabase.example.com
위의 명령은 서버의 /etc/letsencrypt/live/supabase.example.com
디렉토리에 인증서를 다운로드합니다.
Diffie-Hellman 그룹 인증서를 생성합니다.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
Lets Encrypt 자동 갱신을 위한 챌린지 웹루트 디렉터리를 만듭니다.
$ sudo mkdir -p /var/lib/letsencrypt
SSL을 갱신하기 위해 Cron 작업을 생성합니다. 인증서를 확인하고 필요한 경우 갱신하기 위해 매일 실행됩니다. 이를 위해 먼저 /etc/cron.daily/certbot-renew
파일을 생성하고 편집을 위해 엽니다.
$ sudo nano /etc/cron.daily/certbot-renew
다음 코드를 붙여넣습니다.
#!/bin/sh certbot renew --cert-name supabase.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"
Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
실행 가능하도록 태스크 파일에 대한 권한을 변경하십시오.
$ sudo chmod +x /etc/cron.daily/certbot-renew
8단계 - Nginx 설치 및 구성
Debian은 이전 버전의 Nginx와 함께 제공됩니다. 최신 버전을 설치하려면 공식 Nginx 저장소를 다운로드해야 합니다.
공식 Nginx 서명 키를 가져옵니다.
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Nginxs 안정 버전용 리포지토리를 추가합니다.
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \ http://nginx.org/packages/debian `lsb_release -cs` nginx" \ | sudo tee /etc/apt/sources.list.d/nginx.list
Debian 리포지토리를 업데이트합니다.
$ sudo apt update
Nginx를 설치합니다.
$ sudo apt install nginx
설치를 확인하십시오. Debian에서 Nginx 명령을 실행할 때마다 sudo
를 사용해야 합니다. 그렇지 않으면 작동하지 않습니다.
$ sudo nginx -v nginx version: nginx/1.20.2
편집을 위해 /etc/nginx/conf.d/supabase.conf
파일을 만들고 엽니다.
$ sudo nano /etc/nginx/conf.d/supabase.conf
다음 코드를 붙여넣습니다.
map $http_upgrade $connection_upgrade { default upgrade; '' close; } upstream supabase { server localhost:3000; } upstream kong { server localhost:8000; } # enforce HTTPS server { listen 80; listen [::]:80; server_name supabase.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name supabase.example.com; access_log /var/log/nginx/supabase.access.log; error_log /var/log/nginx/supabase.error.log; gzip on; # SSL ssl_certificate /etc/letsencrypt/live/supabase.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/supabase.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/supabase.example.com/chain.pem; ssl_session_timeout 5m; ssl_session_cache shared:MozSSL:10m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1; ssl_stapling on; ssl_stapling_verify on; ssl_dhparam /etc/ssl/certs/dhparam.pem; resolver 8.8.8.8; client_max_body_size 100m; # REST API location ~ ^/rest/v1/(.*)$ { proxy_set_header Host $host; proxy_pass http://kong; proxy_redirect off; } # Authentication location ~ ^/auth/v1/(.*)$ { proxy_set_header Host $host; proxy_pass http://kong; proxy_redirect off; } # Realtime location ~ ^/realtime/v1/(.*)$ { proxy_redirect off; proxy_pass http://kong; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; } # Studio location / { proxy_set_header Host $host; proxy_pass http://supabase; proxy_redirect off; proxy_set_header Upgrade $http_upgrade; } }
완료되면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력하여 파일을 저장합니다.
편집을 위해 /etc/nginx/nginx.conf
파일을 엽니다.
$ sudo nano /etc/nginx/nginx.conf
include /etc/nginx/conf.d/*.conf;
줄 앞에 다음 줄을 추가합니다.
server_names_hash_bucket_size 64;
Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
Nginx 구성 파일 구문을 확인합니다.
$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Nginx 서비스를 시작하여 새 구성을 활성화합니다.
$ sudo systemctl start nginx
9단계 - Supabase에 액세스
이제 웹 브라우저에서 URL https://supabase.example.com
을 통해 Supabase에 액세스할 수 있습니다.
새 프로젝트를 만들 수는 없지만 기존 프로젝트를 관리하고 데이터베이스, 저장소 및 인증을 구성할 수 있습니다.
10단계 - HTTP 인증 활성화
Supabase는 사용자 관리를 제공하지 않으므로 Supabase 설치를 보호해야 합니다. 가장 쉬운 방법은 Nginx 서버를 사용하여 HTTP 인증을 활성화하는 것입니다.
Nginx용 apache2-utils
패키지를 설치합니다.
$ sudo apt install apache2-utils
supabase
사용자의 암호 파일을 만듭니다. 원하는 사용자 이름을 선택할 수 있습니다. 새 비밀번호를 입력하라는 메시지가 표시됩니다. 강력한 암호를 입력하여 파일 설정을 완료하십시오.
$ sudo htpasswd -c /etc/nginx/.htpasswd supabase New password: Re-type new password: Adding password for user supabase
-c
플래그는 유틸리티에 새 파일을 생성하도록 지시합니다. 파일을 생략하면 기존 파일의 위치를 지정해야 합니다.
편집을 위해 /etc/nginx/conf.d/supabase.conf
를 엽니다.
$ sudo nano /etc/nginx/conf.d/supabase.conf
아래와 같이 파일의 다음 섹션에서 변경합니다.
# REST API location ~ ^/rest/v1/(.*)$ { auth_basic off; proxy_set_header Host $host; proxy_pass http://kong; proxy_redirect off; } # Authentication location ~ ^/auth/v1/(.*)$ { auth_basic off; proxy_set_header Host $host; proxy_pass http://kong; proxy_redirect off; } # Realtime location ~ ^/realtime/v1/(.*)$ { auth_basic off; proxy_redirect off; proxy_pass http://kong; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; } # Studio location / { auth_basic “Supabase Studio Login”; auth_basic_user_file /etc/nginx/.htpasswd; proxy_set_header Host $host; proxy_pass http://supabase; proxy_redirect off; proxy_set_header Upgrade $http_upgrade; }
Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
구성을 확인하십시오.
$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Nginx 서비스를 다시 시작합니다.
$ sudo systemctl restart nginx
다음에 Supabase를 열면 다음과 같은 로그인 화면이 나타납니다.
11단계 - Supabase 업데이트
수파베이스는 지속적으로 작업 중인 제품이며 지속적인 변화를 겪을 것입니다. 자체 호스팅 인스턴스로 사용하는 경우 Supabase 설치를 최신 상태로 유지해야 합니다.
Supabase 디렉터리로 전환합니다.
$ cd ~/supabase
최신 Github 리포지토리를 가져옵니다.
$ git pull
docker/.env
, docker/volumes/api/kong.yml
파일에서 재구성이 필요한 모든 변경 사항을 찾습니다.
기존 Docker 컨테이너를 종료하고 정리합니다.
$ docker-compose down --remove-orphans
최신 이미지를 가져옵니다.
$ docker-compose pull
컨테이너를 다시 시작하십시오.
$ docker-compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up -d
결론
이것으로 Nginx 서버를 리버스 프록시로 사용하여 Debian 11 기반 서버에 Supabase를 설치하는 방법에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.