Перейти к содержимому

Выпуск приложения

Целевая схема: Vercel для Next.js, Supabase для Auth/PostgreSQL/Storage, Cloudflare для DNS домена foliovera.app.

В Vercel корень приложения — apps/web. Установка выполняется из monorepo с pnpm и lockfile. Переменные production задаются в защищённых настройках проекта:

Переменная Назначение
APP_ORIGIN https://foliovera.app
SUPABASE_URL URL целевого Supabase проекта
NEXT_PUBLIC_SUPABASE_URL Тот же публичный API URL
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY Publishable key
ENABLE_EXPERIMENTAL_COREPACK 1, выбор закреплённой версии pnpm

Перед применением миграций следует проверить точный project ref и резервную копию существующей базы. Начальный seed не должен создавать тестовых пользователей в production. Вход ограничен приглашёнными членами семьи.

Работающее приложение использует publishable key и пользовательскую сессию; права ограничиваются RLS. Административный ключ не нужен в Vercel для обычных экранов и API. Он требуется только отдельной операции первичного создания участников; храните его в защищённом окружении этой операции.

Production SMTP настроен через Resend с отправителем login@foliovera.app, сервером smtp.resend.com, портом 465 и отдельным ключом отправки только для этого домена. DKIM, SPF и MX подтверждены. Это подтверждает конфигурацию, но не заменяет проверку доставки magic link и входа на production-домене.

Миграции запускаются официальным Supabase CLI с проверкой сертификата и имени узла. Прямое подключение недоступно: на машине оператора нет маршрута IPv6, — поэтому используется session pooler.

Первичное развёртывание пришлось выполнить через migration endpoint Supabase Management API: CLI падал на создании журнала миграций в пустой базе (supabase/cli#6393). API сам присваивает версии с точностью до секунды, поэтому имена локальных файлов приведены к версиям из его ответа; SQL не менялся. Журнал теперь существует, и обход больше не нужен — CLI работает, и все последующие выпуски идут им.

Не изменяйте журнал применённых миграций вручную. Перед выпуском сверяйте историю: pnpm db:prod:status показывает, что применено и что ждёт.

Docker задаёт BUILD_TARGET=docker для standalone-сборки. Vercel использует свой штатный адаптер Next.js без standalone-режима.

Выпуском считается мердж релизной ветки в main. release.yml читает версию из package.json, ставит тег, публикует релиз на GitHub с текстом из ченджлога и только после этого запускает production-раскатку. Обычный мердж без смены версии релиза не создаёт.

Проверки идут на машине разработчика, в pre-push; отдельного прогона в Actions нет намеренно — он повторял бы уже сделанное.

Схему базы не двигает ни то ни другое. Миграции применяет человек командой pnpm db:prod:apply — до мерджа, потому что все миграции аддитивны и работающая версия переживает новую схему, а обратное неверно. Полный порядок выпуска и откат — в docs/release.md.

Подключение к production-базе: scripts/production-database.mjs. Прямой хост недоступен без IPv6-маршрута, поэтому используется session pooler; TLS проверяется по закреплённому сертификату из infrastructure/certificates, а не отключается. Пароль берётся из игнорируемого корневого .env и вырезается из всего, что скрипт печатает или записывает.

В Supabase настраиваются Site URL, точный callback /auth/callback, Google OAuth и SMTP для magic link. Google Cloud OAuth использует callback проекта Supabase. Секреты OAuth и SMTP не коммитятся. Публичная форма входа не показывает пароль.

После выпуска проверяются TLS, Google-вход, получение magic link, отказ постороннему пользователю, права ученика, загрузка закрытого файла и выход из системы. Production считается готовым только после успешной проверки всех критериев .agent/tasks/foliovera-mvp/spec.md.

Текущий проверенный статус выпуска хранится в evidence и verdict внутри задачи; наличие этой инструкции само по себе не означает выполненный деплой.