В этой статье поделюсь информацией, как правильно поставить 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 по какой то причине Вам не подходит, рекомендую рассмотреть 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, в верхнем меню переходим во вкладку TerminalNew 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. Расскажите, на чём вы застряли или что хотите реализовать — и мы подскажем, как это сделать за $.

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