Гид по технологиям

Установка Supabase на Debian 11 с Nginx — самохостинг

6 min read Инфраструктура Обновлено 28 Nov 2025
Supabase на Debian 11 с Nginx — самохостинг
Supabase на Debian 11 с Nginx — самохостинг

Important: самохостинг Supabase в момент написания находится в бета‑стадии; некоторые функции, например создание проектов, недоступны.

Введение

Supabase — это открытая альтернатива Firebase: PostgreSQL, аутентификация, хранение файлов, realtime API и интеграции с фреймворками (Next.js, React, Vue, Svelte, Flutter и т.д.). В этой инструкции мы установим самохостящуюся версию на Debian 11, настроим Nginx как обратный прокси с SSL и включим базовую HTTP-аутентификацию для доступа к студии.

Краткие определения:

  • Supabase: набор сервисов (Postgres, auth, storage, realtime) с интерфейсом Studio.
  • Nginx: обратный прокси и веб‑сервер.

Кому подходит этот гид

  • Разработчикам, которым нужен локальный или тестовый инстанс Supabase.
  • Командам, проверяющим интеграцию с собственной инфраструктурой.

Что не покрывается

  • Полный production‑hardening и HA/кластеры PostgreSQL.
  • Экспорт/миграция данных между облачным Supabase и самохостом.

Предпосылки

  • Сервер с Debian 11, минимум 2 ГБ ОЗУ.
  • Нерутовый пользователь с sudo.
  • Домeн: supabase.example.com, указывающий на сервер.
  • Система обновлена:
$ sudo apt update && sudo apt upgrade
  • Установлены базовые пакеты:
$ sudo apt install nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring -y

Некоторые пакеты уже могут быть установлены.

Шаг 1 — Настройка файрвола

Debian обычно поставляется с ufw (Uncomplicated Firewall).

Проверим статус:

$ 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)

Важно: если у вас нестандартный SSH‑порт, откройте именно его.

Шаг 2 — Установка Git

$ sudo apt install git

Проверим версию:

$ git --version
git version 2.30.2

Шаг 3 — Установка Docker

Добавим официальный ключ GPG Docker:

$ 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

Обновим пакеты и установим Docker:

$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

Проверка статуса:

$ 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

Чтобы не вводить sudo при каждой команде docker, добавьте пользователя в группу docker:

$ sudo usermod -aG docker $(whoami)

Выйдите и снова войдите в сессию для применения.

Шаг 4 — Установка Docker Compose

В этой инструкции используем стабильную ветку Docker Compose v1.29.2 для совместимости.

Скачиваем бинарник:

$ 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‑compose:

$ 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 (shallow clone для скорости):

$ git clone --depth 1 https://github.com/supabase/supabase.git

Переходим в docker‑каталог:

$ cd supabase/docker

Создаём файл окружения из примера и редактируем его:

$ cp .env.example .env
$ nano .env

Измените значения:

  • POSTGRES_PASSWORD — надёжный пароль для PostgreSQL.
  • JWT_SECRET — уникальная строка более 32 символов (без спецсимволов для совместимости в некоторых окружениях).

Пример:

POSTGRES_PASSWORD=
JWT_SECRET=

Генерация ANON_KEY и SERVICE_KEY:

  • На сайте Supabase используйте экран генерации JWT: вставьте JWT_SECRET в поле и выберите “ANON_KEY” в списке преднастроенных полезных нагрузок, затем “Generate JWT”.
  • Повторите для SERVICE_KEY.

Генератор ANON_KEY в Supabase

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

Настройка SMTP (пример — Amazon SES):

[email protected]
SMTP_HOST=email-smtp.us-west-2.amazonaws.com
SMTP_PORT=587
SMTP_USER=
SMTP_PASS=
SMTP_SENDER_NAME=SupabaseAdmin

Настройте SITE_URL и PUBLIC_REST_URL:

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

Сохраните файл (Ctrl+X, Y).

Исправление известного бага со ссылками в письмах: откройте docker-compose.yml:

$ nano docker-compose.yml

Найдите блок с GOTRUE_SITE_URL и добавьте API_EXTERNAL_URL прямо под ним:

 GOTRUE_SITE_URL: ${SITE_URL}
 API_EXTERNAL_URL: ${SITE_URL}

Сохраните. Учтите: файл docker-compose.yml может перезаписываться при обновлениях — следите за изменениями.

Затем отредактируйте файл volumes/api/kong.yml и подставьте сгенерированные ключи ANON_KEY и SERVICE_KEY:

$ nano volumes/api/kong.yml

В секции consumers замените значения ключей.

Пример (образы JWT в инструкции — замените на свои):

consumers:
  - username: anon
    keyauth_credentials:
      - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...REPLACE_WITH_ANON_KEY

- username: service_role
    keyauth_credentials:
      - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...REPLACE_WITH_SERVICE_KEY

Сохраните файл.

Шаг 6 — Запуск Supabase

Запустите контейнеры:

$ docker-compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up -d

Поскольку сборка скачивает образы и поднимает сервисы, это займёт время.

Проверим контейнеры:

$ docker ps
CONTAINER ID   IMAGE                            COMMAND                   CREATED              STATUS                        PORTS                                                                                                                             NAMES
d25393873731   supabase/storage-api:v0.10.0     "/bin/sh -c \"./stora…\""   About a minute ago   Up About a minute             5000/tcp                                                                                                                          supabase-storage
... (вывод сокращён)

Пример ожидаемых контейнеров: storage, gotrue (auth), postgres-meta, realtime, postgrest, kong, postgres, studio, inbucket (почтовый тестовый сервис).

Шаг 7 — Установка SSL через Let\’s Encrypt

Установим snapd, затем certbot:

$ sudo apt install snapd
$ sudo snap install core && sudo snap refresh core
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
$ certbot --version
certbot 1.25.0

Сгенерируем сертификат:

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d supabase.example.com

Сертификат окажется в /etc/letsencrypt/live/supabase.example.com.

Сгенерируйте Diffie‑Hellman параметры:

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

Создайте webroot для автообновления и добавьте ежедневный крон‑скрипт:

$ sudo mkdir -p /var/lib/letsencrypt
$ 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"

Сделайте исполняемым:

$ sudo chmod +x /etc/cron.daily/certbot-renew

Important: тестируйте автообновление в тестовом режиме перед продакшн.

Шаг 8 — Установка и настройка Nginx

Добавим официальный репозиторий nginx и установим последнюю стабильную версию:

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
     | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
$ 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
$ sudo apt update
$ sudo apt install nginx
$ sudo nginx -v
nginx version: nginx/1.20.2

Создайте конфигурацию для Supabase: /etc/nginx/conf.d/supabase.conf

$ sudo nano /etc/nginx/conf.d/supabase.conf

Вставьте конфигурацию (оставляем proxy для studio, realtime и API):

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;
    }
}

Добавьте в /etc/nginx/nginx.conf строчку server_names_hash_bucket_size 64; перед include /etc/nginx/conf.d/*.conf; затем проверьте конфигурацию:

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo systemctl start nginx

Important: проверьте логи /var/log/nginx/* при ошибках.

Шаг 9 — Доступ к Supabase

Откройте https://supabase.example.com — должна загрузиться Supabase Studio (если все сервисы подняты).

Studio Supabase

Заметьте: создание новых проектов в самохосте ограничено; можно управлять существующими проектами, БД, хранилищем и аутентификацией.

Шаг 10 — Включение HTTP аутентификации для доступа к Studio

Supabase сам по себе не предоставляет управление пользователями на уровне админ‑панели Studio; для защиты используем базовую HTTP‑аутентификацию в Nginx.

Установите утилиту htpasswd:

$ sudo apt install apache2-utils

Создайте файл паролей и пользователя supabase:

$ sudo htpasswd -c /etc/nginx/.htpasswd supabase
New password:
Re-type new password:
Adding password for user supabase

Затем отредактируйте /etc/nginx/conf.d/supabase.conf и добавьте аутентификацию для Studio, при этом оставив public API и realtime открытыми (auth_basic off), как показано ниже:

# 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;
    }

Проверьте конфигурацию и перезапустите nginx:

$ sudo nginx -t
$ sudo systemctl restart nginx

При заходе в Studio вы увидите окно базовой HTTP‑аутентификации.

Nginx HTTP Authentication for Supabase

Шаг 11 — Обновление Supabase (процедура)

Supabase активно развивается; при самохостинге нужно отслеживать обновления.

Обновление:

$ cd ~/supabase
$ git pull
# проверьте изменения в docker/.env и docker/volumes/api/kong.yml
$ docker-compose down --remove-orphans
$ docker-compose pull
$ docker-compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up -d

Checklist перед обновлением:

  • Сделать бэкап базы данных (pg_dump или файл тома).
  • Сохранить текущие настройки .env и kong.yml.
  • Проверить release notes в репозитории Supabase.

Безопасность и hardening (рекомендации)

  • Бэкап базы: регулярно делайте pg_dump всех важных баз и копируйте в удалённое хранилище.
  • Ограничьте доступ к серверу через SSH (ключи, отказ от паролей, fail2ban).
  • Для production используйте отдельную сеть для контейнеров и не пробрасывайте порты БД наружу.
  • Защитите .env и конфигурационные файлы правами 600/640 и владельцем root или deploy‑пользователем.
  • Контролируйте секреты: используйте менеджеры секретов (Vault, AWS Secrets Manager) для production.
  • Логи: настраивайте ротацию логов и централизированный лог‑агрегатор.

Когда самохостинг не подходит

  • Вам нужно создавать проекты через Dashboard в облаке — эта функция в self-host ограничена.
  • Нужна высокая доступность и SLA — лучше облачный Supabase или управляемый Postgres/HA.
  • Если в команде нет ответственных за безопасность и обновления, поддержка cloud версии безопаснее.

Альтернативы

  • Использовать Supabase cloud — проще для продакшн и обновлений.
  • Использовать управляемый PostgreSQL + собственные сервисы auth и storage.
  • Использовать другие Backend as a Service решения (Firebase, Appwrite).

Чек‑лист по ролям

Для администратора сервера:

  • Убедиться в наличии бэкапов Postgres.
  • Настроить обновления безопасности для Debian.
  • Настроить SSL автообновление.

Для DevOps:

  • Интегрировать запуск контейнеров в CI/CD.
  • Настроить мониторинг контейнеров и алерты (CPU, RAM, restart rate).

Для разработчика приложения:

  • Проверить соответствие PUBLIC_REST_URL и SITE_URL.
  • Подготовить миграции и тесты schema migrations.

Критерии приёмки

  • Studio доступна по HTTPS и требует HTTP‑аутентификацию.
  • REST API, auth и realtime доступны и корректно проксируются через Nginx.
  • SSL сертификаты успешно обновляются cron‑скриптом.
  • Контейнеры работают без рестартов в течение контрольного окна (например, 30 минут).

План отката (простая инструкция)

  1. Остановить новые контейнеры: docker-compose down.
  2. Восстановить старый образ/тег (если использовали теги) или откатить git‑репозиторий к стабильному коммиту.
  3. Перезапустить контейнеры старых версий.
  4. Проверить логи и доступность сервиса.

Простая проверка работоспособности (test cases)

  • Открыть https://supabase.example.com — получить экран входа.
  • Выполнить CURL к REST API: curl -i https://supabase.example.com/rest/v1/health или аналогичный endpoint.
  • Попробовать регистрацию/вход через auth API (тестовая почта должна доставляться через inbucket или настроенный SMTP).

Рекомендации по миграции к облаку

  • Экспортируйте дамп базы (pg_dump) и импортируйте в облачную БД.
  • Перенесите секреты ANON_KEY и SERVICE_KEY только при необходимости; обычно в облаке ключи генерируются заново.

Резюме

  • Самохостинг Supabase на Debian 11 возможен, подходит для тестов и разработки.
  • Для продакшна оцените риски: обновления, резервные копии и безопасность ложатся на вашу команду.
  • Рекомендуем использовать HTTP‑аутентификацию для ограничения доступа к Studio и настраивать регулярный бэкап Postgres.

Если у вас остались вопросы или нужно добавить пример бэкапа/скрипт восстановления — напишите, и я дополню руководство.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Безопасность контейнеров AWS: руководство
Облачная безопасность

Безопасность контейнеров AWS: руководство

Автоудаление старых файлов в Windows 10/11
Windows

Автоудаление старых файлов в Windows 10/11

Исправить неверное время на Android
Android.

Исправить неверное время на Android

Как делиться паролями в iCloud Keychain
Безопасность

Как делиться паролями в iCloud Keychain

Жесты навигации Android: как включить и пользоваться
Android.

Жесты навигации Android: как включить и пользоваться

Встраивание Google Drawings в Google Docs
Инструкции

Встраивание Google Drawings в Google Docs