Поиск по сайту:

Как установить Supabase с Docker на Debian 11


На этой странице

  1. Предпосылки
  2. Шаг 1. Настройка брандмауэра
  3. Шаг 2. Установите Git
  4. Шаг 3. Установите Docker
  5. Шаг 4. Установите Docker Compose
  6. Шаг 5. Загрузите и настройте Supabase
  7. Шаг 6. Установите Supabase
  8. Шаг 7. Установите SSL
  9. Шаг 8. Установите и настройте Nginx
  10. Шаг 9. Доступ к Supabase
  11. Шаг 10. Включите HTTP-аутентификацию
  12. Шаг 11. Обновите Supabase
  13. Заключение

Supabase — это альтернатива Firebase с открытым исходным кодом, которая предоставляет вам все инструменты, необходимые для разработки ваших приложений. Supabase предлагает базу данных PostgreSQL, аутентификацию пользователей, хранилище и API в реальном времени и интегрируется с популярными фреймворками и инструментами, такими как Angular, Flutter, Next.js, React, Svelte и Vue.

Есть два способа использования Supabase. Первый вариант — подписаться на их облачное приложение, которое предлагает больше возможностей. Второй вариант — самостоятельно разместить код с помощью Docker. Однако есть несколько предостережений по самостоятельному хостингу. Вы не можете создавать или управлять проектами. Более того, весь проект находится в стадии бета-тестирования, и вы должны использовать версию на собственном хостинге только для тестирования и локальной разработки. Для всех остальных целей следует использовать их облачное приложение.

В этом руководстве вы узнаете, как установить Supabase на сервер на основе Debian 11 и проксировать его через сервер 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. Настройте брандмауэр

Первым шагом является настройка брандмауэра. Debian поставляется с 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, добавьте официальный GPG-ключ Dockers.

$ 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 требует привилегий root. Если вы хотите избежать использования sudo при каждом запуске команды docker, добавьте свое имя пользователя в 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

Загрузите и установите скрипт завершения bash Docker Composes.

$ 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 в раскрывающемся меню Preconfigured Payload и нажмите кнопку Generate JWT, чтобы сгенерировать токен.

Скопируйте и вставьте этот токен в качестве значения для ANON_KEY в файле .env.

Точно так же повторите те же шаги для создания SERVICE_KEY, переключив предварительно настроенную полезную нагрузку и нажав кнопку Generate JWT.

Скопируйте сгенерированный токен и вставьте его в качестве значения SERVICE_KEY в файл .env.

Настройте параметры SMTP электронной почты, настроив следующие переменные. Мы используем сервис Amazon 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

Настройте общедоступный URL-адрес REST.

PUBLIC_REST_URL=https://supabase.example.com/rest/v1/

Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

Письма аутентификации, отправленные через SMTP, будут иметь неработающие ссылки из-за ошибки, распространенной в Supabase. Чтобы устранить эту проблему, откройте файл docker-compose.yml.

$ nano docker-compose.yml

Добавьте переменную API_EXTERNAL_URL прямо под переменной GOTRUE_SITE_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_roles на сгенерированный выше SERVICE_KEY.

- username: service_role
    keyauth_credentials:
      - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q

Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

Шаг 6 - Установите Supabase

Запустите 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

Чтобы установить SSL-сертификат с помощью Lets Encrypt, нам нужно установить инструмент Certbot.

Для этого мы будем использовать установщик пакета Snapd. Поскольку большинство серверов Debian не поставляются с ним, установите установщик Snapd.

$ sudo apt install snapd

Убедитесь, что ваша версия Snapd обновлена.

$ sudo snap install core && sudo snap refresh core

Установите Сертбот.

$ sudo snap install --classic certbot

Используйте следующую команду, чтобы убедиться, что команду Certbot можно запустить, создав символическую ссылку на каталог /usr/bin.

$ 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 на вашем сервере.

Создайте групповой сертификат Диффи-Хеллмана.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

Создайте корневой каталог вызова для автоматического обновления Lets Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Создайте задание Cron для обновления SSL. Он будет запускаться каждый день для проверки сертификата и его обновления при необходимости. Для этого сначала создайте файл /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

Добавьте репозиторий для стабильной версии Nginx.

$ 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

Установите Нгинкс.

$ sudo apt install nginx

Проверьте установку. Убедитесь, что вы используете sudo каждый раз, когда запускаете команду Nginx в Debian. В противном случае это не сработает.

$ 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 в своем веб-браузере.

Вы не можете создавать новые проекты, но можете управлять существующими и настраивать базу данных, хранилище и аутентификацию.

Шаг 10. Включите HTTP-аутентификацию

Supabase не обеспечивает управление пользователями, поэтому вам необходимо защитить свою установку Supabase. Самый простой способ сделать это — включить HTTP-аутентификацию с помощью сервера Nginx.

Установите пакет apache2-utils для Nginx.

$ 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

Заключение

На этом мы завершаем наше руководство по установке Supabase на сервер под управлением Debian 11 с использованием сервера Nginx в качестве обратного прокси-сервера. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.