Развертывание SupaBase

Для запуска SupaBase необходимо:

Настройка кластера Docker Swarm

Для настройки нужно подключиться к первому серверу, созданному для хостинга SupaBase:

Подключение первой виртуальной машины SupaBase

  1. Войдите в консоль управления Advanced:

  2. Чтобы открыть список сервисов, нажмите Service List.

  3. Перейдите в раздел Computing → Elastic Cloud Server.

  4. Выберите первый бэкенд-сервер, созданный для SupaBase, и нажмите Remote login.

  5. В консоли сервера введите:

  6. Нажмите Enter.

  7. Для установки docker построчно выполните команды:

    sudo apt update
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    sudo docker swarm init --advertise-addr $(ip route get 8.8.8.8 | head -1 | cut -d' ' -f7)
    

Подключение второй виртуальной машины SupaBase

Теперь нужно добавить вторую виртуальную машину в docker swarm:

  1. Войдите в консоль управления Advanced:

  2. Чтобы открыть список сервисов, нажмите Service List.

  3. Выберите Computing → Elastic Cloud Server.

  4. Выберите второй бэкенд-сервер, созданный для SupaBase, и нажмите Remote login.

  5. В консоли сервера введите:

  6. Нажмите Enter.

  7. Построчно выполните команды:

    sudo apt update
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    

Подключение к Docker Swarm

  1. Войдите в консоль управления Advanced:

  2. Чтобы открыть список сервисов, нажмите Service List.

  3. Перейдите в раздел Computing → Elastic Cloud Server.

  4. В списке виртуальных машин ECS выберите первый бэкенд-сервер и скопируйте его Private IP, нажав Кнопка Copy.

  5. В команде ниже замените:

    • <пароль> — на пароль root-пользователя, указанный при создании виртуальной машины.

    • <ip-адрес> — на скопированный адрес Private IP.

    ssh root:<пароль>@<ip адрес> "docker swarm join-token worker" | grep -E "docker" | sh
    
  6. Выполните эту команду на втором бэкенд-сервере. В процессе выполнения необходимо согласиться с подключением к первому серверу и ввести его пароль.

  7. Для проверки подключения перейдите к первому бэкенд-серверу и выполните команду:

    docker node ls
    

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

    ../../_images/s__added-vm-to-docker-swarm.png

Запуск SupaBase в Docker Swarm

Внимание

Указанные конфигурации не должны применяться в продуктивных средах по следующим причинам:

  • Используются ключи-примеры, которые должны быть отдельно сформированы для каждой среды.

  • Отсутствует подключение к почтовому серверу.

  • Используется простой пароль для Postgres.

  • Используется простой секрет для JWT.

Подробности на сайте supabase.com.

После того, как виртуальные машины настроены, можно выполнить развертывание SupaBase:

  1. В консоли управления Advanced перейдите в раздел Computing → Elastic Cloud Server.

  2. Выберите бэкенд-сервер и нажмите Remote login.

  3. В консоли сервера введите логин и пароль, если необходимо.

  4. Скачайте необходимые файлы. Команды выполняются построчно:

    git clone --depth 1 https://github.com/supabase/supabase
    cd supabase/docker
    touch .env
    
  5. Создайте файл с переменными. Для этого копируйте команду целиком:

    Внимание

    Перед копирование замените адрес <IP-адрес балансировщика> на ваш внешний IP-адрес (EIP) созданного балансировщика нагрузки.

    cat <<EOT >> .env
    POSTGRES_PASSWORD=MyStrongPassword
    JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long
    ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
    SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q
    POSTGRES_HOST=db
    POSTGRES_DB=postgres
    POSTGRES_USER=postgres
    POSTGRES_PORT=5432
    KONG_HTTP_PORT=8000
    KONG_HTTPS_PORT=8443
    PGRST_DB_SCHEMAS=public,storage,graphql_public
    SITE_URL=http://<IP-адрес балансировщика>:3000
    ADDITIONAL_REDIRECT_URLS=
    JWT_EXPIRY=3600
    DISABLE_SIGNUP=false
    API_EXTERNAL_URL=http://<IP-адрес балансировщика>:8000
    MAILER_URLPATHS_CONFIRMATION="/auth/v1/verify"
    MAILER_URLPATHS_INVITE="/auth/v1/verify"
    MAILER_URLPATHS_RECOVERY="/auth/v1/verify"
    MAILER_URLPATHS_EMAIL_CHANGE="/auth/v1/verify"
    ENABLE_EMAIL_SIGNUP=true
    ENABLE_EMAIL_AUTOCONFIRM=true
    SMTP_ADMIN_EMAIL=admin@example.com
    SMTP_HOST=fakeserver.com
    SMTP_PORT=25
    SMTP_USER=user
    SMTP_PASS=password
    SMTP_SENDER_NAME=fake_sender
    ENABLE_PHONE_SIGNUP=false
    ENABLE_PHONE_AUTOCONFIRM=false
    STUDIO_DEFAULT_ORGANIZATION=Default Organization
    STUDIO_DEFAULT_PROJECT=Default project
    STUDIO_PORT=3000
    PUBLIC_REST_URL=http://<IP-адрес балансировщика>:8000/rest/v1/
    EOT
    
  6. Обновите файл docker-compose.yml.

  7. Откройте файл для редактирования:

    nano docker-compose.yml
    
  8. Уберите все содержимое файла и вставьте код:

    Примечание

    Рекомендуется использовать окно Input Commands несколько раз, так как файл достаточно длинный. Также важно сохранить отступы.

    version: "3.8"
    services:
      studio:
        container_name: supabase-studio
        image: supabase/studio:0.22.08
        restart: unless-stopped
        ports:
          - ${STUDIO_PORT}:3000/tcp
        environment:
          STUDIO_PG_META_URL: http://meta:8080
          POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    
         DEFAULT_ORGANIZATION: ${STUDIO_DEFAULT_ORGANIZATION}
         DEFAULT_PROJECT: ${STUDIO_DEFAULT_PROJECT}
    
         SUPABASE_URL: http://kong:8000
         SUPABASE_REST_URL: ${PUBLIC_REST_URL}
         SUPABASE_ANON_KEY: ${ANON_KEY}
         SUPABASE_SERVICE_KEY: ${SERVICE_ROLE_KEY}
    
      kong:
        container_name: supabase-kong
        image: kong:2.8.1
        restart: unless-stopped
        ports:
          - ${KONG_HTTP_PORT}:8000/tcp
          - ${KONG_HTTPS_PORT}:8443/tcp
          - 8001:8001/tcp
        environment:
          KONG_DATABASE: "off"
          KONG_ADMIN_LISTEN: "0.0.0.0:8001"
          KONG_DECLARATIVE_CONFIG: /var/lib/kong/kong.yml
          # https://github.com/supabase/cli/issues/14
          KONG_DNS_ORDER: LAST,A,CNAME
          KONG_PLUGINS: request-transformer,cors,key-auth,acl
          KONG_NGINX_PROXY_PROXY_BUFFER_SIZE: 160k
          KONG_NGINX_PROXY_PROXY_BUFFERS: 64 160k
        volumes:
          - /mnt/sfs_turbo/volumes/api:/var/lib/kong:ro
    
      auth:
        container_name: supabase-auth
        image: supabase/gotrue:v2.19.4
        restart: unless-stopped
        environment:
          GOTRUE_API_HOST: 0.0.0.0
          GOTRUE_API_PORT: 9999
          API_EXTERNAL_URL: ${API_EXTERNAL_URL}
    
         GOTRUE_DB_DRIVER: postgres
         GOTRUE_DB_DATABASE_URL: postgres://supabase_auth_admin:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
    
         GOTRUE_SITE_URL: ${SITE_URL}
         GOTRUE_URI_ALLOW_LIST: ${ADDITIONAL_REDIRECT_URLS}
         GOTRUE_DISABLE_SIGNUP: ${DISABLE_SIGNUP}
    
         GOTRUE_JWT_ADMIN_ROLES: service_role
         GOTRUE_JWT_AUD: authenticated
         GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated
         GOTRUE_JWT_EXP: ${JWT_EXPIRY}
         GOTRUE_JWT_SECRET: ${JWT_SECRET}
    
         GOTRUE_EXTERNAL_EMAIL_ENABLED: ${ENABLE_EMAIL_SIGNUP}
         GOTRUE_MAILER_AUTOCONFIRM: ${ENABLE_EMAIL_AUTOCONFIRM}
         GOTRUE_SMTP_ADMIN_EMAIL: ${SMTP_ADMIN_EMAIL}
         GOTRUE_SMTP_HOST: ${SMTP_HOST}
         GOTRUE_SMTP_PORT: ${SMTP_PORT}
         GOTRUE_SMTP_USER: ${SMTP_USER}
         GOTRUE_SMTP_PASS: ${SMTP_PASS}
         GOTRUE_SMTP_SENDER_NAME: ${SMTP_SENDER_NAME}
         GOTRUE_MAILER_URLPATHS_INVITE: ${MAILER_URLPATHS_INVITE}
         GOTRUE_MAILER_URLPATHS_CONFIRMATION: ${MAILER_URLPATHS_CONFIRMATION}
         GOTRUE_MAILER_URLPATHS_RECOVERY: ${MAILER_URLPATHS_RECOVERY}
         GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE: ${MAILER_URLPATHS_EMAIL_CHANGE}
    
         GOTRUE_EXTERNAL_PHONE_ENABLED: ${ENABLE_PHONE_SIGNUP}
         GOTRUE_SMS_AUTOCONFIRM: ${ENABLE_PHONE_AUTOCONFIRM}
    
      rest:
        container_name: supabase-rest
        image: postgrest/postgrest:v9.0.1.20220717
        restart: unless-stopped
        environment:
          PGRST_DB_URI: postgres://authenticator:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
          PGRST_DB_SCHEMAS: ${PGRST_DB_SCHEMAS}
          PGRST_DB_ANON_ROLE: anon
          PGRST_JWT_SECRET: ${JWT_SECRET}
          PGRST_DB_USE_LEGACY_GUCS: "false"
    
      realtime:
        container_name: supabase-realtime
        image: supabase/realtime:v0.25.1
        restart: unless-stopped
        environment:
          DB_HOST: ${POSTGRES_HOST}
          DB_PORT: ${POSTGRES_PORT}
          DB_NAME: ${POSTGRES_DB}
          DB_USER: supabase_admin
          DB_PASSWORD: ${POSTGRES_PASSWORD}
          DB_SSL: "false"
          PORT: 4000
          JWT_SECRET: ${JWT_SECRET}
          REPLICATION_MODE: RLS
          REPLICATION_POLL_INTERVAL: 100
          SECURE_CHANNELS: "true"
          SLOT_NAME: supabase_realtime_rls
          TEMPORARY_SLOT: "true"
      command: >
        bash -c "./prod/rel/realtime/bin/realtime eval Realtime.Release.migrate
        && ./prod/rel/realtime/bin/realtime start"
    
      storage:
        container_name: supabase-storage
        image: supabase/storage-api:v0.21.4
        depends_on:
          - rest
        restart: unless-stopped
        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: 52428800
          STORAGE_BACKEND: file
          FILE_STORAGE_BACKEND_PATH: /var/lib/storage
          TENANT_ID: stub
          REGION: stub
          GLOBAL_S3_BUCKET: stub
        volumes:
          - /mnt/sfs_turbo/volumes/storage:/var/lib/storage
    
      meta:
        container_name: supabase-meta
        image: supabase/postgres-meta:v0.50.2
        restart: unless-stopped
        environment:
          PG_META_PORT: 8080
          PG_META_DB_HOST: ${POSTGRES_HOST}
          PG_META_DB_PORT: ${POSTGRES_PORT}
          PG_META_DB_NAME: ${POSTGRES_DB}
          PG_META_DB_USER: supabase_admin
          PG_META_DB_PASSWORD: ${POSTGRES_PASSWORD}
    
      db:
        container_name: supabase-db
        image: supabase/postgres:14.1.0.82
        healthcheck:
          test: pg_isready -U postgres -h localhost
          interval: 5s
          timeout: 5s
          retries: 10
        command:
          - postgres
          - -c
          - config_file=/etc/postgresql/postgresql.conf
          - -c
          - log_min_messages=fatal # prevents Realtime polling queries from appearing in logs
        restart: unless-stopped
        ports:
          - ${POSTGRES_PORT}:5432
        environment:
          POSTGRES_HOST: /var/run/postgresql
          POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
        volumes:
          - /mnt/sfs_turbo/volumes/db/roles.sql:/docker-entrypoint-initdb.d/roles.sql
          - /mnt/sfs_turbo/volumes/postgres:/var/lib/postgresql/data
    
  9. Сохраните изменения, нажав Ctrl + O.

  10. Подготовьте папки для хранения данных.

    mkdir /mnt/sfs_turbo/volumes/
    mkdir /mnt/sfs_turbo/volumes/api
    mkdir /mnt/sfs_turbo/volumes/storage
    mkdir /mnt/sfs_turbo/volumes/db
    mkdir /mnt/sfs_turbo/volumes/postgres
    cp volumes/db/roles.sql /mnt/sfs_turbo/volumes/db
    cp volumes/api/kong.yml /mnt/sfs_turbo/volumes/api
    
  11. Запустите SupaBase.

    set -a && . .env && set +a
    docker stack deploy --compose-file docker-compose.yml supabase
    

Примечание

Почему файл docker-compose не используется из репозитория Supabase на github?

Так как система разворачивается на нескольких серверах, контейнеры должны иметь возможность работать с одними и теми же файлами на системе вне зависимости от сервера, на котором они запущены. Для этого была смонтирована SFS в качестве единой файловой системы и обновлен файл docker-compose, чтобы контейнеры ее использовали.

Публикация SupaBase через балансировщик

После запуска SupaBase на кластере из двух серверов его необходимо опубликовать, чтобы приложения могли его использовать.

Внимание

В рабочей среде не рекомендуется публиковать сервис «Studio» наружу, так как он не защищен логином и паролем. Рекомендуется использовать доступ через VPN или публиковать через отдельный сервер с аутентификацией.

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

Для публикации нескольких сервисов:
  • Studio — веб-интерфейс управления, работает на порту 3000.

  • Kong — встроенный API-gateway, работает на порту 8000.

Так как разные сервисы работают на разных портах внутри виртуальных машин, то нужно создать несколько Backend Server Group и несколько Listener, по одной паре на публикуемый сервис.

Создание объектов для сервиса Studio

  1. Войдите в консоль управления Advanced:

  2. Чтобы открыть список сервисов, нажмите Service List.

  3. Перейдите в раздел Network → Elastic Load Balance.

  4. Нажмите на название ранее созданного балансировщика.

  5. На вкладке Backend Server Groups нажмите Add Backend Server Group.

  6. Заполните параметры группы серверов:

    • Name — название группы серверов.

    • Backend protocolHTTP.

    • Port — 3000.

  7. Нажмите ОК.

  8. В правой части экрана нажмите Add.

  9. В открывшемся окне выберите два сервера, созданных для Supabase и нажмите Next.

  10. В качестве порта Backend Port укажите 3000 и нажмите Finish.

    ../../_images/s__supabase__add-backend-servers.png
  11. На вкладке Listeners нажмите Add Listener.

  12. Заполните параметры группы серверов:

    • Name — название создаваемого listner.

    • Frontend protocolPortHTTP.

    • Port — 3000.

  13. Нажмите Next.

  14. Настройте группу серверов, для этого:

    • Backend Server Group — укажите Use existing.

    • В выпадающем списке выберите ранее созданную группу.

  15. Нажмите Finish.

Создание объектов для сервиса Kong

Повторите действия по созданию объектов Studio для публикации Kong: создание группы серверов и listener.

  1. Нажмите на название ранее созданного балансировщика.

  2. На вкладке Backend Server Groups нажмите Add Backend Server Group.

  3. Заполните параметры группы серверов:

    • Name — название создаваемого listner. Рекомендуется в названии указать «kong-» для удобства.

    • Frontend protocolPortTCP.

    • Port — 8000.

    • Health Check Configuration — для проверки работоспособности используйте порт TCP — 8001 (интерфейс администратора).

  4. Нажмите ОК.

  5. В правой части экрана нажмите Add.

  6. В открывшемся окне выберите два сервера, созданных для Supabase и нажмите Next.

  7. В качестве порта Backend Port укажите 8000 и нажмите Finish.

    ../../_images/s__supabase__add-backend-servers-kong.png
Для проверки корректной настройки выполните:
  1. На странице балансировщика откройте вкладку Basic information.

  2. Скопируйте внешний IP-адрес (EIP) в поле IP Address, присвоенный балансировщику.

  3. Откройте в браузере страницу:

    http://<IP-адрес балансировщика>:3000/
    

    Если все настройки верны, то откроется интерфейс SupaBase.

../../_images/s__supabase-start.png

Теперь перейдите к шагу развертывания тестового приложения, которое будет использовать BaaS (backend as a service).

Запустили Evolution free tier
для Dev & Test
Получить