Деплой в production
Локально всё работает — пора в production. Этот чеклист покрывает типичный выкат Micro SaaS Starter на VPS, Railway, Fly.io или аналог. Адаптируйте под свой хостинг, но порядок шагов сохраняйте.
Переменные окружения — минимум. DATABASE_URL: production PostgreSQL с SSL. BETTER_AUTH_SECRET: случайная строка 32+ символов, уникальная для prod. APP_URL: https://ваш-домен.ru без trailing slash. YOOKASSA_SHOP_ID и YOOKASSA_SECRET_KEY: боевой магазин, не тестовый.
SMTP: host, port, user, password, from. Без SMTP не работают сброс пароля и daily digest. ADMIN_EMAILS: ваш email и команды через запятую. Опционально: ключ API для LLM-агентов, если не используете mock.
Сборка: npm run build создаёт production bundle React Router. Проверьте build локально npm run start перед деплоем — ловит ошибки, которые dev-сервер скрывает.
Миграции БД: на prod не используйте db:push. Выполните drizzle-kit migrate с versioned SQL. Сделайте бэкап БД до первой миграции. Rollback плана: держите предыдущий Docker image / release tag.
После деплоя зарегистрируйте webhook YooKassa: URL https://ваш-домен.ru/api/yookassa/webhook, события payment.succeeded и связанные. Проверьте, что firewall пропускает IP YooKassa. Тестовый платёж на минимальную сумму — лучшая проверка.
Фоновые workers стартуют в entry.server.ts: pg-boss обрабатывает очереди analytics rollup, daily digest, продление подписок. Убедитесь, что процесс сервера долгоживущий (не serverless без адаптера для boss) или вынесите workers в отдельный dyno.
HTTPS обязателен: better-auth cookies с secure flag, YooKassa webhook на http не примете в prod. Let's Encrypt или сертификат облака — настройте до первого пользователя.
Мониторинг: алерты на HTTP 5xx, рост latency, падение healthcheck. Логируйте ошибки webhook и payment без secretKey и PAN. Метрики pg-boss: зависшие jobs, failed count.
Staging: отдельный инстанс с тестовым магазином YooKassa и копией схемы БД. Прогоните e2e против staging перед promote в prod. Не используйте production DATABASE_URL в staging.
Безопасность: ограничьте доступ к БД по IP, ротируйте BETTER_AUTH_SECRET при компрометации (инвалидирует все сессии). ADMIN_EMAILS не должен содержать общие ящики без MFA.
После выката: зарегистрируйтесь сами, пройдите оплату, отправьте сообщение агенту, проверьте /admin/analytics. Smoke test за 15 минут экономит часы support на следующий день.