Supabase Продвинутый 38 минут

Установка Supabase на свой сервер (Self-hosted)

Пошаговое руководство по установке Supabase на собственный сервер (VPS): настройка Docker, S3-хранилища, API-доступа и интеграции с FlutterFlow.

важно

ВАЖНО! Развернём правильно SupaBase на вашем сервере за 4000 рублей. Пишите в телеграмм или макс.

В этой статье поделюсь информацией, как правильно поставить Supabase на свой сервер и как подключить у нему своё S3 хранилище. Если вы заметите ошибку в статье или Вам есть что добавить, пишите в вопросах под статьёй, буду рад послушать критику и дополнить статью. Перед началом хочу предупредить, что процедура установки не самая простая и сильно отличается от официальной статьи Self-Hosting with Docker от команды Supabase.

Статья написана от первого лица, но над её созданием и процессом установки Supabase трудились мы — Александр и Никита. Если вам нужна помощь в установке Supabase, обращайтесь к нам — мы с радостью вам поможем. Также предлагаем платную поддержку и сопровождение вашей базы Supabase. А теперь к делу.

Вот наш поэтапный план действий:

Содержание

  1. Выбираем сервер и регистрируемся
  2. Предподготовка (настроить SSH, скачать Visual Studio и Docker)
  3. Установка Docker и Docker Compose на сервер
  4. Установка Supabase
  5. Настройка Supabase
  6. Установка NGINX Proxy Manager
  7. Настройка NGINX Proxy Manager
  8. Подключение S3-хранилища

1. Выбираем сервер и регистрируемся

Для начала нам нужно выбрать качественный и надёжный сервер, который будет основой для развёртывания вашей собственной Supabase — это полноценная альтернатива облачному сервису, только полностью под вашим контролем. Такой сервер обеспечит хранение базы данных, запуск всех необходимых сервисов и безопасный доступ к вашим API.

Если вы ещё не сталкивались с этим раньше — не переживайте. Всё, что нам нужно, это арендовать VPS (виртуальный частный сервер) у надёжного провайдера. VPS даёт вам выделенный доступ к серверу с собственной операционной системой и полными правами администратора, позволяя установить любые нужные компоненты.

Все операции я делал на Timeweb Cloud — это российский облачный провайдер с удобной панелью и быстрой поддержкой. На основе него я подробно расскажу, как:

  • зарегистрироваться и создать проект,
  • заказать VPS с подходящей конфигурацией,
  • настроить домен и поддомены с привязкой IP-адреса.
важно

ВАЖНО! Если вы выбрали Timeweb, специально для вас есть промокод, который удвоит любой первый платёж. Просто введите flutterflow при оплате — промокод действует один раз и только для аккаунтов, на которых ещё не было платежей.

Все шаги разберём максимально подробно, чтобы даже без опыта вы могли спокойно повторить всё самостоятельно.

Если TimeWeb по какой то причине Вам не подходит, рекомендую рассмотреть Beget

Шаг 1. Регистрация на Timeweb Cloud

  1. Перейдите на сайт: https://timeweb.cloud/.
  2. Нажмите Войти / Регистрация в правом верхнем углу.
  3. Выберите способ регистрации:
    • через email (рекомендуется)
    • через аккаунты соцсетей
  4. Заполните форму (email и пароль) и подтвердите регистрацию по письму на почте.
  5. После входа попадёте в личный кабинет.

Совет: Сразу настройте двухфакторную аутентификацию для повышения безопасности.

Шаг 2. Создание проекта

  1. На панели слева выберите Проекты.
  2. Нажмите кнопку Создать проект.
  3. Введите название проекта (например, supabase-prod).
  4. Нажмите Создать.

Проекты помогают удобно разделять инфраструктуру по продуктам, средам (прод, тест) и командам.

Шаг 3. Создание сервера (VPS)

  1. Перейдите в свой проект.
  2. Нажмите Создать ресурс → Виртуальный сервер.
  3. Выберите подходящий тариф:
    • минимально рекомендованный для Supabase (self-hosted): 2–4 vCPU, 4–8 ГБ ОЗУ
    • для прод-окружения лучше больше ресурсов
  4. Выберите регион (ближе к вашим пользователям).
  5. Укажите ОС (рекомендуется: Ubuntu 24.04).
  6. Придумайте имя сервера.
  7. Укажите пароль root.
  8. Нажмите Создать сервер.

После пары минут развертывания вы получите публичный IP-адрес.

Шаг 4. Найти IP-адрес сервера

В карточке сервера в Timeweb Cloud будет указан его внешний IP. Скопируйте его — он понадобится для настройки доменов.

Шаг 5. Добавление домена и поддоменов

Для удобного и безопасного доступа к Supabase API, Studio, Dashboard и т.д. лучше сразу подготовить свои поддомены.

Пример структуры поддоменов:

  • api.yourdomain.com — для API Supabase
  • studio.yourdomain.com — для панели Studio
  • proxy.yourdomain.com — для доступа к NGINX Proxy Manager
  • другие по желанию

Как это сделать?

  1. Зайдите в панель управления доменом у вашего регистратора (например, Timeweb, Reg.ru и т.д.).
  2. Для каждого поддомена создайте A-запись:
    • Имя: api
    • Тип: A
    • Значение: ваш IP из Timeweb Cloud
  3. Повторите для всех нужных поддоменов:
    • studio → A → ваш IP
    • proxy → A → ваш IP
    • и т.д.

Все поддомены должны указывать на один и тот же IP сервера.

Шаг 6. Проверка DNS

Подождите 5–30 минут (иногда до 24 часов), пока обновятся записи DNS. Вам ничего не мешает продолжить дальше всё настраивать, по этому на этому на этом этапе не нужно ждать, а идти дальше по инструкции.

Краткий чек-лист

  • Зарегистрировались на Timeweb Cloud
  • Создали проект
  • Развернули сервер (Ubuntu)
  • Получили его IP
  • Создали домен и поддомены
  • Прописали A-записи с IP сервера

2. Предподготовка (скачать Visual Studio и Docker)

Перед тем как развернуть Supabase на сервере, давайте подготовим свой компьютер для работы. Это очень важный шаг, который сильно упростит все последующие этапы.

Что понадобится установить

  • Docker Desktop — для управления контейнерами и запуска Supabase на сервере.
  • Visual Studio Code (VS Code) — для удобного редактирования файлов на сервере прямо со своего компьютера.
  • Расширение Remote — SSH — чтобы подключаться к серверу через SSH и редактировать файлы в одном окне редактора.

Шаг 1. Установка Docker Desktop

  1. Перейдите на официальный сайт: https://www.docker.com/products/docker-desktop/.
  2. Скачайте версию для вашей операционной системы (Windows или macOS).
  3. Запустите установщик и следуйте инструкциям на экране.
  4. После установки проверьте, что Docker запускается и работает (иконка появится в системном трее/панели задач).

Совет: Зарегистрируйте бесплатный Docker-аккаунт, если потребуется вход в систему.

Шаг 2. Установка Visual Studio Code

  1. Скачайте редактор с официального сайта: https://code.visualstudio.com/.
  2. Установите как обычное приложение для вашей ОС.
  3. Запустите VS Code после установки.

Visual Studio Code — это очень популярный редактор кода, который отлично подходит для работы с сервером благодаря множеству полезных расширений.

Шаг 3. Установка расширения Remote — SSH

Важно: Если вы не до конца поняли, как именно настроить SSH-подключение в VS Code, не стесняйтесь поискать подробные видео-инструкции на YouTube или другие руководства в сети. Этот шаг очень важен и действительно сильно упростит вам жизнь при работе с сервером — лучше разобраться в нём один раз и работать потом удобно и быстро.

  1. Откройте VS Code.
  2. Нажмите на иконку Extensions в боковой панели (или используйте сочетание клавиш Ctrl+Shift+X).
  3. В строке поиска наберите Remote — SSH.
  4. Найдите официальное расширение от Microsoft и нажмите Install.

Remote — SSH позволяет подключаться к вашему серверу по SSH и редактировать все файлы как будто они у вас на локальной машине.

Шаг 4. Как подключиться к серверу через Remote — SSH

  1. Убедитесь, что у вас есть IP-адрес вашего сервера и логин (обычно root).
  2. В VS Code нажмите на зелёный уголок внизу слева — откроется панель Remote.
  3. Выберите Remote-SSH: Connect to Host….
  4. Введите адрес сервера в формате root@your.server.ip и нажмите Enter.
  5. При первом подключении VS Code предложит сохранить конфигурацию в SSH-конфиге — согласитесь.
  6. Введите пароль сервера, если понадобится.

После подключения вы сможете открывать файлы на сервере, редактировать их в привычном интерфейсе и запускать терминал прямо в VS Code, как будто работаете на локальной машине.

Зачем это всё нужно?

Docker позволит запускать и управлять контейнерами Supabase на сервере. Visual Studio Code с Remote — SSH сильно упрощает жизнь: вам не придётся копировать файлы по SCP или постоянно использовать неудобный терминал. Всё редактирование и настройка происходят напрямую на сервере, но через удобное локальное приложение.

3. Установка Docker и Docker Compose

Первое подключение

Итак, подготовительный этап завершён — теперь приступим к подключению к серверу. Открываем Visual Studio Code, в верхнем меню переходим во вкладку Terminal → New Terminal или используем горячие клавиши:

  • Windows: Ctrl + `
  • macOS: Cmd + `

Выполните команду для подключения к серверу через SSH (замените 1.1.1.1 на IP-адрес вашего сервера):

ssh root@1.1.1.1

Нажмите Enter. Далее введите пароль от сервера (символы не будут отображаться во время ввода). При первом подключении появится запрос на подтверждение сохранения отпечатка сервера. Напишите английскую букву Y, чтобы согласиться, и снова нажмите Enter.

Рекомендация по безопасности:

После подключения под root-пользователем, последовательно выполните следующие команды для создания отдельного пользователя для работы с Supabase:

adduser supabase
usermod -aG sudo supabase
su - supabase
  • adduser supabase — создаёт нового пользователя с именем supabase. После ввода команды вам будет предложено:
    • ввести и подтвердить пароль для нового пользователя — обязательно запомните его, он понадобится при дальнейшем подключении;
    • при желании указать дополнительную информацию (например, полное имя, номер телефона и т.п.) — вы можете пропустить эти поля, нажав Enter.
  • usermod -aG sudo supabase — добавляет нового пользователя в группу sudo, давая ему права выполнять команды с повышенными привилегиями через команду sudo.
  • su - supabase — переключает текущую сессию на нового пользователя supabase.

После выполнения команд рекомендуется переподключиться к серверу уже под пользователем supabase:

ssh supabase@1.1.1.1

Используйте пароль, который вы указали при создании пользователя supabase. Далее для работы используйте исключительно пользователя supabase, а не root.

Выполняем следующие команды по порядку. Обязательно дожидайтесь загрузки каждой команды.

1. Обновление пакетов

sudo apt update && sudo apt upgrade -y

Эта команда обновляет список доступных пакетов и устанавливает обновления для уже установленных.

2. Установка вспомогательных пакетов

sudo apt install -y curl wget git gnupg2 ca-certificates lsb-release software-properties-common

Эти утилиты необходимы для загрузки и установки Docker и других компонентов.

3. Добавление GPG-ключа Docker

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Команда загружает и сохраняет официальный GPG-ключ Docker, который нужен для верификации пакетов.

4. Добавление репозитория Docker

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Добавляем официальный репозиторий Docker для установки последних стабильных версий.

5. Обновляем пакеты после добавления репозитория

sudo apt update

Чтобы новые пакеты Docker стали доступны, обновляем список пакетов.

6. Установка Docker Engine и плагина Docker Compose

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

Эта команда установит Docker Engine, клиент Docker и встроенную поддержку Docker Compose.

7. Проверка установки

docker --version
docker compose version

Тут просто проверяем, что Docker и Docker Compose установлены корректно — они выведут свои актуальные версии.

8. Добавление пользователя в группу Docker

sudo usermod -aG docker supabase

Добавляем пользователя supabase в группу Docker, чтобы запускать команды без sudo.

9. Применение новых прав без выхода из системы

newgrp docker

Применяет изменения групповой принадлежности текущей сессии (альтернатива перезагрузке или повторному входу).

Теперь вы можете использовать команды docker и docker compose от имени пользователя supabase без sudo.

4. Установка Supabase

Перед установкой Supabase рекомендуется проверить, какая версия является наиболее стабильной и актуальной. Это особенно важно, если вы не хотите использовать последнюю нестабильную сборку или экспериментальные функции.

Актуальные теги с версиями можно посмотреть на официальной странице релизов Supabase на GitHub — https://github.com/supabase/supabase/tags.

Перед установкой Supabase рекомендуется выбрать стабильную версию. Для этого используем команды Git, чтобы клонировать репозиторий и переключиться на нужный тег.

Шаг 1. Клонируем репозиторий без извлечения файлов

git clone --no-checkout https://github.com/supabase/supabase.git

Данная команда клонирует только структуру репозитория, но не загружает все файлы сразу. Это удобно, если вы хотите сначала выбрать нужную версию.

Шаг 2. Переходим в директорию с репозиторием

cd supabase

Тут просто переходим в папку, куда был клонирован репозиторий Supabase.

Шаг 3. Переключаемся на нужную версию (тег)

Важно: замените 1.25.04 на актуальную версию!

git checkout tags/1.25.04

Данная команда переключает репозиторий на конкретную стабильную версию Supabase с тегом 1.25.04. Напомню список всех доступных версий вы можете найти на странице: https://github.com/supabase/supabase/tags

5. Настройка Supabase

Теперь открываем папку проекта через SSH с помощью расширения Remote — SSH в Visual Studio Code. Про этот плагин мы говорили в самом начале статьи — он позволит вам удобно редактировать файлы напрямую на сервере.

**Шаг 1:**Переходим в директорию с Docker-конфигурацией

cd supabase/docker

В этой папке находятся все необходимые файлы для запуска Supabase с помощью Docker.

**Шаг 2:**В директории supabase/docker уже существует файл с настройками по умолчанию — .env.example. Этот файл необходимо переименовать в .env, чтобы Supabase использовал его при запуске.

mv .env.example .env

**Шаг 3:**После переименования откройте файл .env для редактирования. В нём найдите и измените следующие четыре ключевые строки (где example.local это ваш домен):

SITE_URL=https://api.example.local
API_EXTERNAL_URL=https://api.example.local
SUPABASE_PUBLIC_URL=https://api.example.local

В этом же файле так же надо настроить JWT_SECRET, ANON_KEY и SERVICE_ROLE_KEY

**Шаг 1:**Откройте сайт https://supabase.com/docs/guides/self-hosting/docker и найдите раздел JWT Secret.

Шаг 3: Скопируйте предложенное значение JWT Secret и вставьте его в файл .env в строку:

JWT_SECRET=ваше_значение

Шаг 4: На той же странице ниже найдите форму Generate JWT. Убедитесь, что выбрано ANON_KEY в выпадающем списке, нажмите Generate JWT и скопируйте сгенерированный токен.

Вставьте его в переменную:

ANON_KEY=сгенерированный_anon_jwt

Шаг 5: Повторите процедуру, но теперь выберите в выпадающем списке SERVISE_KEY, снова нажмите Generate и скопируйте новый токен.

Вставьте его в переменную:

SERVICE_ROLE_KEY=сгенерированный_service_jwt

После этого сохраните файл .env. Эти ключи необходимы для работы авторизации Supabase и будут использоваться при запуске контейнеров.

После редактирования сохраните файл. Эти параметры будут использоваться при запуске контейнеров Supabase.

Дополнительные важные параметры в файле .env

Кроме ключей авторизации, в файле .env обязательно нужно настроить ещё несколько переменных. Они отвечают за доступ к вашей базе и панели управления. Ниже разберём каждую.

  • POSTGRES_PASSWORD — пароль для пользователя postgres в вашей базе данных.Рекомендация: используйте длинный и сложный пароль, минимум 12–16 символов (буквы верхнего и нижнего регистра, цифры, спецсимволы).
  • DASHBOARD_USERNAME — имя пользователя для входа в админ-панель Supabase (Dashboard).Рекомендация: выберите простое запоминающееся имя, например supabase или ваш email.
  • DASHBOARD_PASSWORD — пароль для входа в Dashboard.Рекомендация: минимум 12 символов, используйте буквы, цифры и спецсимволы.
  • SECRET_KEY_BASE — секрет для подписи сессий Rails-приложений (используется Supabase Dashboard).Рекомендация: длинная случайная строка не менее 32 символов. Можно сгенерировать командой в Linux: openssl rand -hex 32
  • VAULT_ENC_KEY — ключ шифрования для Supabase Vault (хранения секретов).Рекомендация: также минимум 32 символа. Можно сгенерировать аналогично: openssl rand -hex 32

Пример итогового блока в вашем файле .env может выглядеть так:

POSTGRES_PASSWORD=сложный_пароль_здесь
DASHBOARD_USERNAME=supabase
DASHBOARD_PASSWORD=сложный_пароль
SECRET_KEY_BASE=сгенерированная_длинная_строка
VAULT_ENC_KEY=сгенерированная_длинная_строка

После заполнения всех этих полей не забудьте сохранить файл .env. Все эти значения будут использоваться при запуске контейнеров и обеспечат безопасность вашего проекта.

Запуск Supabase

Теперь, когда файл .env готов, можно запустить Supabase с помощью Docker. В директории supabase/docker выполните команду:

docker compose up -d

Описание: эта команда запустит все контейнеры Supabase в фоновом режиме. Убедитесь, что запуск прошёл без ошибок.

Затем проверьте статус всех контейнеров:

docker ps

Вы должны увидеть список запущенных сервисов (например, supabase-rest, supabase-auth, supabase-postgres и другие). Убедитесь, что у каждого сервиса в столбце STATUS указано Up, а не Exited или Error.

Если какие-либо контейнеры не запускаются — проверьте файл .env на наличие ошибок, когда всё устранили, не забываем перезапускать сервер.:

docker compose down
docker compose up -d

Обратите внимание, перезапуск нужен только если у Вас проблемы. Если проблем нет, то последние команды делать не нужно, Вас сервер должен работать и последняя команда должна быть всегда.

docker compose up -d

6. Установка NGINX Proxy Manager

Давайте немного отдохнём от бесконечных команд и поговорим про безопасность нашего сервера. А если быть точнее — про NGINX Proxy Manager. Что это такое и зачем он нужен?

В самом начале статьи я упомянул про стандартную установку Supabase, и вы могли заметить, что в официальной документации вообще нет упоминаний о NGINX Proxy Manager. Так зачем же мы его используем?

Что такое NGINX Proxy Manager

NGINX Proxy Manager (NPM) — это удобный графический интерфейс для настройки обратного прокси на базе NGINX. Он позволяет:

  • привязывать поддомены к локальным сервисам (например, studio.вашдомен.com, api.вашдомен.com и т.д.);
  • управлять SSL-сертификатами от Let’s Encrypt через пару кликов;
  • включать автоматическое перенаправление с HTTP на HTTPS;
  • ограничивать доступ к сервисам по IP, логину и паролю (basic auth);
  • удобно управлять конфигурациями без необходимости вручную редактировать файлы nginx.conf.

Почему NGINX Proxy Manager нужен при self-hosted Supabase

Официальный способ установки Supabase предполагает работу в пределах локальной сети или за одной точкой входа. Но как только вы хотите разнести сервисы по поддоменам, подключить SSL и обеспечить безопасный доступ извне — без прокси-сервера не обойтись.

NGINX Proxy Manager упрощает эту задачу и делает self-hosted Supabase не только доступным, но и безопасным в продакшене. Особенно если у вас несколько сервисов:

  • Studio (studio.example.com)
  • API Gateway (api.example.com)
  • Storage, Auth, Realtime и другие

Вы централизуете маршрутизацию, настраиваете SSL, и весь трафик будет идти через защищённый NGINX.

Преимущества

  • Простая установка через Docker;
  • Красивый и понятный интерфейс;
  • Автоматическое продление SSL-сертификатов;
  • Минимум ручной настройки;
  • Идеально для старта и малого бизнеса.

В следующих шагах мы развернём NGINX Proxy Manager и настроим маршруты к Supabase-сервисам. Это станет вашей точкой входа для управления проектом. И так, давайте приступим. Пока вы читали статью, возможно вас выкинуло с сервера, по этому подключаемся обратно, прописав команды ssh@1.1.1.1 и пароль. Обязательно смотрите в какой папке вы делаете установку!

Создание директории для NGINX Proxy Manager

Перед установкой NGINX Proxy Manager создадим отдельную папку для его файлов. Это поможет структурировать проект и избежать путаницы в будущем.

Шаг 1. Переход в домашнюю директорию

cd ~

Команда возвращает вас в домашнюю директорию текущего пользователя (например, /home/supabase). Нам нужна корневая папка.

Шаг 2. Создание папки для NGINX Proxy Manager

mkdir npm

Команда создаёт новую директорию с именем npm. В неё мы поместим все конфигурации и файлы для запуска NGINX Proxy Manager.

Шаг 3. Переход в созданную директорию

cd npm

Простой переход в созданную директорию, где будем инициализировать Docker-конфигурацию.

Шаг 4. Создание файла docker-compose.yml

Теперь создаём в этой папке файл docker-compose.yml. Это делается через подключение по SSH — в Visual Studio Code через Remote — SSH далее открываем файл и вставляем следующий код:

version: '3'

services:
  npm:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm-proxy
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

container_name: — вы можете задать любое название для контейнера. Примеры:

  • npm-proxy — базовый вариант
  • nginx-manager — если хотите более описательно

После вставки сохраните файл.

Шаг 5. Вход в Docker Hub

docker login

При первом запуске вам потребуется авторизоваться в Docker Hub. После ввода команды вы увидите сообщение вроде:

Your one-time device confirmation code is: XHMK-NQTW
Press ENTER to open your browser or submit your device code here: https://login.docker.com/activate

Перейдите по указанной ссылке и введите код. Важно: вы должны быть авторизованы в Docker Hub в браузере на вашем компьютере. Подождите, пока терминал подтвердит успешную авторизацию.

Шаг 6. Запуск NGINX Proxy Manager

docker compose up -d

Эта команда запустит контейнер с NGINX Proxy Manager. После успешного запуска, переходим в браузер и пишем http://ваш-ip:81 где ip это ip вашего сервера. Если видим такую картинку, поздравляем, вы настроили прогси сервер и осталось его настроить.

Nginx Proxy Manager Admin

7.Настройка NGINX Proxy Manager для self-hosted Supabase

В этой части мы настроим маршрутизацию к вашему Supabase через собственный домен с HTTPS и управлением через удобную веб-панель NGINX Proxy Manager.

Шаг 1. Первый вход в NGINX Proxy Manager

Откройте в браузере http://ваш-ip:81 (порт 81 — это админка Proxy Manager).

Используйте стандартные данные для первого входа:

Email: admin@example.com
Пароль: changeme

После входа система сразу предложит сменить пароль и email. Обязательно укажите надёжный пароль и актуальный email — это защитит панель управления от несанкционированного доступа и позволит восстановить пароль.

Шаг 2. Добавляем домен для API

В панели перейдите в Hosts → Proxy Hosts и нажмите Add Proxy Host. Настроим домен для API:

  • Domain Names: api.example.com (замените на ваш домен)
  • Scheme: http
  • Forward Hostname / IP: kong
  • Forward Port: 8000
  • Включите Block Common Exploits

Перейдите на вкладку SSL, выберите Request a new certificate и включите:

  • Force SSL
  • HTTP/2 Support
  • HSTS Enabled

После сохранения ваш API будет доступен по адресу https://api.example.com. Этот домен мы уже использовали ранее в статье, добавляли в .env файле Supabase в API_EXTERNAL_URL и SUPABASE_PUBLIC_URL. Также именно этот адрес указываем во FlutterFlow для всех запросов.

Назначение: Kong маршрутизирует все API-запросы Supabase (PostgREST, Auth, Realtime и др.).

Шаг 3. Добавляем домен для Studio

Добавляем второй Proxy Host для админки Supabase Studio:

  • Domain Names: studio.example.com
  • Scheme: http
  • Forward Hostname / IP: studio
  • Forward Port: 3000
  • Включите Block Common Exploits

На вкладке SSL снова запросите сертификат и включите все флажки:

  • Force SSL
  • HTTP/2 Support
  • HSTS Enabled

После этого Supabase Studio будет доступен по https://studio.example.com — это ваш веб-интерфейс для управления базой данных, аутентификацией и настройками.

Ограничение доступа к Studio (рекомендуется)

Studio — это административный интерфейс, который желательно защитить. Для этого в Proxy Manager:

  1. Перейдите в раздел Access Lists.
  2. Создайте новый Access List.
  3. Добавьте пользователей с логином и паролем.
  4. Включите Satisfy Any (если хотите пускать по одному условию из нескольких).
  5. Сохраните Access List.
  6. Затем в настройках Proxy Host для studio.example.com выберите этот Access List и сохраните.

Теперь при входе в Studio будет запрашиваться логин и пароль, что предотвратит несанкционированный доступ.

Шаг 4. Настройка SSL и Let’s Encrypt

В Proxy Manager можно бесплатно получать и обновлять SSL-сертификаты через Let’s Encrypt. На вкладке SSL при добавлении домена выберите:

  • Request a new certificate
  • Включите Force SSL (все запросы будут перенаправлены на HTTPS)
  • Включите HTTP/2 и HSTS для улучшенной безопасности и скорости

Это автоматически настроит безопасное HTTPS-соединение для ваших доменов.

Шаг 5. Рекомендации по дополнительной безопасности

  • Ограничьте доступ к Proxy Manager по IP (например через firewall или Access List).
  • Включите UFW или другой брандмауэр на сервере и откройте только порты 80/443 и SSH (желательно с ограничением по IP).
  • Используйте сложные пароли для пользователей Proxy Manager и Supabase Studio.
  • Регулярно обновляйте сервер и контейнеры с помощью apt и docker pull.
  • Следите за логами контейнеров через docker logs.

Шаг 6. Подключение NGINX Proxy Manager к сети Supabase

Чтобы NGINX Proxy Manager мог направлять запросы к контейнерам Supabase по их сервисным именам (например, kong, studio), нужно убедиться, что он подключён к той же Docker-сети, что и Supabase.

Для этого откройте консоль на сервере (не забываем что для начала нужно подключиться к серверу) и перейдите в директорию с docker-compose файлами Supabase:

cd /root/supabase/docker

Убедитесь, что знаете название вашей сети. Обычно это supabase_default. Проверить можно так:

docker network ls

После этого подключите контейнер NGINX Proxy Manager к этой сети:

docker network connect supabase_default npm-proxy

Здесь:

  • supabase_default — это название сети Supabase. У вас может быть другое имя, если вы задавали своё в docker-compose.yml. Используйте то, что указано именно у вас.
  • npm-proxy — это название контейнера с NGINX Proxy Manager. Убедитесь, что используете правильное имя своего контейнера. Его можно посмотреть через команду:
docker ps

После подключения сети Proxy Manager сможет по внутренней сети Docker направлять запросы на сервисные имена Supabase, такие как kong, studio и другие.

Важно: Название контейнера NGINX Proxy Manager должно совпадать с тем, что вы указали при его создании на этапе 6. Установка NGINX Proxy Manager, в шаге 4 при написании файла docker-compose.yml. Если вы назвали контейнер иначе, используйте именно это имя при подключении к сети.

8. Подключение S3-хранилища

S3-хранилище — это облачное решение для хранения файлов (объектов), популярное благодаря Amazon S3 и множеству совместимых провайдеров (например, DigitalOcean Spaces, Backblaze B2, Beget S3, MinIO и т.д.).

Что такое S3 и зачем оно нужно

S3-хранилища — это отказоустойчивая и масштабируемая система хранения, оптимизированная под хранение и раздачу файлов через HTTP(S). Вместо того чтобы хранить файлы на своём сервере (например, в папке /var/lib/storage), мы можем отдать их на хранение в облако, где:

  • Хранение часто дешевле и масштабируемое — вы платите только за реально используемый объём.
  • Файлы автоматически дублируются и резервируются у провайдера.
  • Можно использовать существующую S3-совместимую инфраструктуру без лишних серверных затрат.

Использование S3 позволяет вынести хранение из вашего сервера Supabase и разгрузить его, а ваши клиенты будут получать файлы через удобные URL прямо из S3, но через API Supabase.

Однако важно правильно настроить подключение, чтобы Supabase Storage «видел» все объекты в S3-бакете и работал с ними так же, как если бы это было локальное хранилище.

Шаг 1. Заказать услугу S3

На этом шаге вам нужно зайти в панель вашего хостинга или облачного провайдера и оформить услугу S3-хранилища. Обычно это делается так:

После создания хранилища вам будут выданы данные, которые нужно сохранить — они понадобятся при настройке Supabase.

Какие данные вам выдадут и зачем они нужны?

  • Endpoint (конечная точка) — это URL-адрес вашего S3-совместимого хранилища. Supabase будет использовать его для отправки и загрузки файлов. Например: https://s3.region.storage.provider.com.
  • Access Key ID — публичный идентификатор пользователя (аналог логина). Нужен для аутентификации запросов.
  • Secret Access Key — секретный ключ (аналог пароля). Используется вместе с Access Key ID для безопасного доступа.
  • Bucket Name — имя созданного «бакета» (контейнера для файлов). Вы можете создать один или несколько бакетов, и при настройке Supabase указать нужный.
  • Region — регион, в котором развернуто хранилище (не всегда обязателен, но иногда используется в настройках клиента).

Очень важно: Access Key и Secret Key — это ваши учётные данные для доступа к хранилищу. Их нужно хранить в секрете и не публиковать в открытых репозиториях.

Обычно провайдер покажет вам эти данные один раз после создания пользователя или токена доступа. Обязательно сохраните их в надёжном месте (менеджер паролей, файл с настройками на вашем компьютере и т.д.).

Шаг 2. Настройка переменных окружения (.env)

Перейдите в папку, где у вас находится файл .env ( /supabase/docker). Откройте его для редактирования и пропишите следующие параметры:

GLOBAL_S3_BUCKET=bucket_name
FILE_SIZE_LIMIT=52428800
GLOBAL_S3_ENDPOINT=https://s3.example.com
GLOBAL_S3_PROTOCOL=https
GLOBAL_S3_FORCE_PATH_STYLE=false
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key
AWS_DEFAULT_REGION=your-region
GLOBAL_S3_REGION=your-region

Описание параметров:

  • GLOBAL_S3_BUCKET — имя вашего бакета в S3.
  • GLOBAL_S3_ENDPOINT — endpoint вашего S3-хранилища (например, https://s3.ru1.storage.beget.cloud).
  • GLOBAL_S3_PROTOCOL — обычно https.
  • GLOBAL_S3_FORCE_PATH_STYLE — зависит от провайдера (для Beget S3 часто true).
  • AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY — ваши ключи доступа к S3.
  • GLOBAL_S3_REGION и AWS_DEFAULT_REGION — регион вашего S3 (например, ru-1).

—

Шаг 3. Настройка docker-compose-s3.yml

Supabase поставляется с дополнительным файлом docker-compose.s3.yml, который нужно настроить для использования S3 вместо локального файлового хранилища.

Откройте docker-compose-s3.yml для редактирования и убедитесь, что он выглядит примерно так:

services:
  storage:
    container_name: supabase-storage
    image: supabase/storage-api:v1.22.7
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
      rest:
        condition: service_started
      imgproxy:
        condition: service_started
    healthcheck:
      test:
        [
          "CMD",
          "wget",
          "--no-verbose",
          "--tries=1",
          "--spider",
          "http://storage:5000/status"
        ]
      timeout: 5s
      interval: 5s
      retries: 3
    environment:
      ANON_KEY: ${ANON_KEY}
      SERVICE_KEY: ${SERVICE_ROLE_KEY}
      POSTGREST_URL: http://rest:3000
      PGRST_JWT_SECRET: ${JWT_SECRET}
      DATABASE_URL: postgres://supabase_storage_admin:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
      FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT}
      STORAGE_BACKEND: s3
      GLOBAL_S3_BUCKET: ${GLOBAL_S3_BUCKET}
      GLOBAL_S3_ENDPOINT: ${GLOBAL_S3_ENDPOINT}
      GLOBAL_S3_PROTOCOL: ${GLOBAL_S3_PROTOCOL}
      GLOBAL_S3_FORCE_PATH_STYLE: ${GLOBAL_S3_FORCE_PATH_STYLE:-false}
      AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
      AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
      AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION}
      FILE_STORAGE_BACKEND_PATH: /var/lib/storage
      TENANT_ID: stub
      REGION: ${GLOBAL_S3_REGION}
      ENABLE_IMAGE_TRANSFORMATION: "true"
      IMGPROXY_URL: http://imgproxy:5001

  imgproxy:
    container_name: supabase-imgproxy
    image: darthsim/imgproxy:v3.8.0
    healthcheck:
      test: ["CMD", "imgproxy", "health"]
      timeout: 5s
      interval: 5s
      retries: 3
    environment:
      IMGPROXY_BIND: ":5001"
      IMGPROXY_USE_ETAG: "true"
      IMGPROXY_ENABLE_WEBP_DETECTION: ${IMGPROXY_ENABLE_WEBP_DETECTION}
      IMGPROXY_LOCAL_FILESYSTEM_ROOT: /

Обратите внимание:

  • Мы убираем зависимости и переменные, связанные с MinIO, если раньше вы его использовали для тестов.
  • Указываем STORAGE_BACKEND: s3, чтобы Supabase знал, что теперь мы работаем через S3.

Шаг 4. Запуск Supabase с поддержкой S3

После сохранения всех изменений и настройки переменных окружения запустите Supabase с использованием двух compose-файлов одновременно:

docker compose -f docker-compose.yml -f docker-compose.s3.yml up -d --remove-orphans

Эта команда:

  • Запустит все стандартные сервисы Supabase.
  • Подключит и настроит контейнер Storage для работы через S3 вместо локального диска.
  • Удалит неиспользуемые контейнеры (например, MinIO), благодаря флагу --remove-orphans.

Теперь ваше Supabase Storage будет хранить и отдавать все файлы через ваше облачное S3-хранилище. Все запросы к /storage/v1/object будут работать через ваш бакет. Это особенно полезно для масштабирования, резервирования и снижения затрат на хранение больших объёмов данных.

Если вы захотите вернуться к локальному хранилищу, просто остановите контейнеры и запустите без docker-compose.s3.yml:

docker compose up -d

В заключении

Вот и подошла к концу наша небольшая инструкция по установке Supabase на собственный сервер. Теперь у вас есть полностью готовая среда для запуска своего собственного хостинга Supabase с полным контролем над данными и настройками.

Мы (Саша и Никита) постарались описать все шаги максимально понятно и последовательно — от аренды сервера и настройки SSH до развертывания контейнеров с Supabase и настройки переменных окружения.

Если в процессе у вас возникнут вопросы, трудности с каким-то из этапов или просто нужна помощь, не стесняйтесь обращаться. Мы с радостью поможем вам установить и настроить Supabase под ваши задачи.

Связаться с нами очень просто — пишите в Telegram. Расскажите, на чём вы застряли или что хотите реализовать — и мы подскажем, как это сделать за $.

Удачи в ваших проектах! 🚀

обновлено · опубликовано

Вопросы читателей

Здесь разобраны места, где чаще всего спотыкаются. Вопросы — от читателей статьи, ответы мои.

  1. Supavisor не стартует: «Unknown cipher or invalid key size»

    Anton Larin

    Если с supavisor идёт ошибка Unknown cipher or invalid key size, то для VAULT_ENC_KEY попробуйте использовать ключ ровно в 32 символа (команда для генерации openssl rand -base64 32 | head -c 32).

    Ответ

    Всё верно, спасибо за находку. VAULT_ENC_KEY — ключ AES-256, и длина у него не «не меньше 32», а ровно 32 символа: с 31 или 33 контейнер supavisor падает на старте именно с этой ошибкой. У SECRET_KEY_BASE требование мягче, но короче 32 символов брать не стоит.

    Dmitriy Avdeev в комментариях добавил вариант с ; echo в конце — чтобы приглашение терминала не прилипло к ключу и вы не скопировали лишний символ:

    openssl rand -base64 24 | tr -d '\n=' | head -c 32; echo

    После правки .env контейнеры нужно пересоздать: docker compose down && docker compose up -d. Команда restart новые значения переменных не подхватывает — ключ останется прежним, и ошибка повторится.

  2. На шаге 5 «Настройка Supabase» не находится файл

    Павел

    На шаге 5. Настройка Supabase застрял… У меня показывает, что нет этого файла…

    Ответ

    Скорее всего, дело в пути, а не в самом файле. На шаге 2 главы 4 вы уже зашли внутрь репозитория командой cd supabase, а шаг 5 начинается с cd supabase/docker — из этой точки такой папки действительно нет, терминал отвечает No such file or directory. Нужен либо cd docker, либо полный путь от домашней папки:

    cd ~/supabase/docker
    ls -la

    Второй вариант — вы дошли до нужной папки, но не видите .env. Его там и не должно быть: в репозитории лежит .env.example, и точка в начале имени делает файл скрытым — обычный ls и проводник VS Code его не показывают. Смотрите через ls -la, а затем переименуйте:

    mv .env.example .env

    Если ls -la показывает почти пустую папку без docker-compose.yml, значит не отработал git checkout tags/<версия> из шага 3: репозиторий клонировался с --no-checkout, и до checkout файлов на диске нет.

  3. Файлы не грузятся в Storage, в пути появляется двойной слэш

    Глеб

    Делал всё по инструкции и довольно быстро всё запустилось. Потом обнаружил странное поведение на загрузке файлов в хранилище. Сначала создался корневой bucket uploads, но в нём не мог создать папки. И загрузить фото через дашборд не мог. Переустановил ещё раз с нуля — сразу попробовал загрузить файл, всё легло за секунду, создал папки внутри uploads. Сегодня проверяю — файлы снова не грузятся. Судя по логам, внутри пути добавляется ещё один слэш: /storage/v1/object/uploads//avatars/test.jpg. И при попытке загрузить из приложения то же самое — файл не грузится.

    Ответ

    Двойной слэш — не сбой Storage, а склейка пути. Имя бакета Supabase подставляет сам, поэтому путь к файлу должен идти без ведущего слэша: avatars/test.jpg, а не /avatars/test.jpg. В FlutterFlow это поле пути у действия загрузки в Supabase Storage, в SDK — второй аргумент upload().

    Ключ объекта хранится буквально, без нормализации: uploads//avatars/test.jpg и uploads/avatars/test.jpg — два разных объекта. Отсюда и «то грузится, то нет»: запись уходит по одному имени, а чтение и политики ждут другое. Если вы уже перевели хранилище на S3 из главы 8, там ровно та же история — пустой сегмент остаётся частью ключа.

    Про папки: в Supabase Storage их не существует как отдельной сущности, это просто часть имени объекта. Пустую папку создать нельзя — она появляется вместе с первым файлом. А когда дашборд не даёт загрузить, почти всегда упирается в политики доступа: на таблицу storage.objects нужны правила на insert и select для той роли, под которой идёт запрос. Быстрая проверка прямо в SQL-редакторе:

    select name from storage.objects where bucket_id = 'uploads' order by created_at desc limit 20;

    Если строки в ответе есть, а в интерфейсе пусто — вопрос к политике select, а не к загрузке.

Задать свой вопрос

Опишите, на каком шаге застряли и что показывает терминал. Отвечу и добавлю разбор сюда же — вопросы по этой статье полезны не только вам. Срочное быстрее решается в Telegram.

Вопрос отправлен — спасибо. Отвечу на почту, а разбор появится на этой странице.

Отправить не получилось. Напишите, пожалуйста, в Telegram — так вопрос точно дойдёт.

Публикуется имя и текст вопроса. Почта нужна только для ответа.