Установка 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.

Скопируйте полученные токены в .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-renewImportant: тестируйте автообновление в тестовом режиме перед продакшн.
Шаг 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 nginxImportant: проверьте логи /var/log/nginx/* при ошибках.
Шаг 9 — Доступ к Supabase
Откройте https://supabase.example.com — должна загрузиться Supabase Studio (если все сервисы подняты).

Заметьте: создание новых проектов в самохосте ограничено; можно управлять существующими проектами, БД, хранилищем и аутентификацией.
Шаг 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‑аутентификации.

Шаг 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 -dChecklist перед обновлением:
- Сделать бэкап базы данных (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 минут).
План отката (простая инструкция)
- Остановить новые контейнеры: docker-compose down.
- Восстановить старый образ/тег (если использовали теги) или откатить git‑репозиторий к стабильному коммиту.
- Перезапустить контейнеры старых версий.
- Проверить логи и доступность сервиса.
Простая проверка работоспособности (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.
Если у вас остались вопросы или нужно добавить пример бэкапа/скрипт восстановления — напишите, и я дополню руководство.
Похожие материалы
Безопасность контейнеров AWS: руководство
Автоудаление старых файлов в Windows 10/11
Исправить неверное время на Android
Как делиться паролями в iCloud Keychain
Жесты навигации Android: как включить и пользоваться