Как установить Supabase с Docker на Debian 11
На этой странице
- Предпосылки
- Шаг 1. Настройка брандмауэра
- Шаг 2. Установите Git
- Шаг 3. Установите Docker
- Шаг 4. Установите Docker Compose
- Шаг 5. Загрузите и настройте Supabase
- Шаг 6. Установите Supabase
- Шаг 7. Установите SSL
- Шаг 8. Установите и настройте Nginx
- Шаг 9. Доступ к Supabase
- Шаг 10. Включите HTTP-аутентификацию
- Шаг 11. Обновите Supabase
- Заключение
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_role
s на сгенерированный выше 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 в качестве обратного прокси-сервера. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.