К блогу

Деплой в 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 на следующий день.