Деплой на свой сервер
Деплой LaunchKit — это два шага. Сначала соберите и запустите поставленный продукт локально и
убедитесь, что он здоров (Section 0 ниже). Затем разверните его на своём сервере через Coolify
(«Продакшн-деплой»). LaunchKit — обычное Next.js-приложение со standalone-сборкой, поэтому его
можно задеплоить куда угодно, где есть Docker.
Section 0: Локальная проверка образа
# 1. Распакуйте поставленный tarball (или клонируйте репозиторий) в ПУСТУЮ директорию.
# ВАЖНО: используйте чистую/пустую директорию — не запускайте `docker compose build` в рабочем
# дереве, где уже есть node_modules/.next (Docker COPY-ит дерево целиком, и host-native
# node_modules затрёт linux-слой).
mkdir launchkit && tar -xzf launchkit-core.tgz -C launchkit && cd launchkit
# (или: git clone <your-repo> launchkit && cd launchkit)
cp .env.example .env # дефолтов достаточно, чтобы загрузиться; реальные креды впишете позже
docker compose up -d --build # собирает образ + поднимает app + Postgres + Redis
# 2. Дождитесь health (первая сборка занимает несколько минут), затем проверьте.
# Портируемое ожидание (macOS и Linux, без GNU `timeout` — до ~6 минут):
for _ in $(seq 1 120); do curl -sf http://localhost:3000/api/health >/dev/null && break; sleep 3; done
curl http://localhost:3000/api/health
# → HTTP 200 {"status":"ok","db":"up","time":"..."}
Порты по умолчанию (со стороны хоста): приложение — 3000, Postgres — 5434, Redis —
6381 (внутри compose-сети сервисы по-прежнему общаются по стандартным 5432/6379).
GET /api/health возвращает {status:'ok',db:'up'} и 200, как только Postgres доступен —
миграции для самой загрузки не нужны (health-роут делает лишь SELECT 1; Redis поднимается как
сервис, но в ответе health не участвует и для старта не критичен). Поставляется тег v0.2.2.
Продакшн-деплой (Coolify)
Это руководство описывает деплой на Coolify — self-hosted PaaS поверх вашего собственного сервера (VPS), с автоматическим TLS через Let's Encrypt и встроенным reverse-proxy (Traefik). Именно так задеплоен сам сайт документации, который вы сейчас читаете.
Локальная проверка из Section 0 один-в-один переносится в Coolify:
| Локально (Section 0) | Продакшн (Coolify) |
|---|---|
сервис app в docker compose | приложение Coolify (Build Pack: Dockerfile) |
сервис postgres | ресурс PostgreSQL в Coolify → его DATABASE_URL |
сервис redis | ресурс Redis в Coolify → его REDIS_URL |
локальный файл .env | Environment Variables приложения (секреты) |
http://localhost:3000/api/health | https://<домен>/api/health |
Почему Coolify
- Разворачивается на любом сервере одной командой (
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash) — не требует управляемого облака. - Сам выпускает и продлевает TLS-сертификаты Let's Encrypt через встроенный Traefik.
- Деплой по git — Coolify клонирует репозиторий по SSH и собирает образ по
Dockerfileиз указанного пути. - Каждое приложение — изолированный Docker-контейнер за общим reverse-proxy.
1. Dockerfile
В корне репозитория уже есть готовый multi-stage Dockerfile:
FROM node:22-slim AS base
# Prisma нужен OpenSSL (в node:*-slim его нет) для выбора движка.
RUN apt-get update && apt-get install -y --no-install-recommends openssl ca-certificates \
&& rm -rf /var/lib/apt/lists/*
RUN corepack enable && corepack prepare pnpm@11.1.2 --activate
FROM base AS deps
WORKDIR /app
# До frozen-install в контексте должны быть: pnpm-workspace.yaml (одобрение build-скриптов
# prisma/esbuild/sharp), vendor/ (@launchkit/payments как file:-tgz) и prisma/ (схема нужна
# postinstall'у `prisma generate`).
COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml* ./
COPY vendor/ ./vendor/
COPY prisma ./prisma
RUN pnpm install --frozen-lockfile
FROM base AS build
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN pnpm db:generate
RUN pnpm build
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
ENV PORT=3000
# Next standalone слушает process.env.HOSTNAME (Docker ставит его в id контейнера) — биндим на все интерфейсы.
ENV HOSTNAME=0.0.0.0
RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 nextjs
COPY --from=build /app/public ./public
COPY --from=build --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=build --chown=nextjs:nodejs /app/.next/static ./.next/static
COPY --from=build --chown=nextjs:nodejs /app/prisma ./prisma
USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]
Он рассчитан на output: 'standalone' в next.config.ts (уже включено в шаблоне) — итоговый
образ содержит только то, что реально нужно для запуска, без dev-зависимостей и без полного
node_modules.
2. Дать Coolify доступ к репозиторию
Coolify клонирует репозиторий по SSH. В своём GitLab/GitHub добавьте deploy key (публичный ключ, который сгенерирует/попросит Coolify при создании приложения) с правом чтения на нужный репозиторий.
3. Создать приложение в Coolify
В интерфейсе Coolify: New Resource → Application → Deploy from a Git repository, дальше:
| Поле | Значение |
|---|---|
| Repository | ваш git URL по SSH, например git@your-git-host:you/launchkit-core.git |
| Branch | main (или ваша боевая ветка) |
| Build Pack | Dockerfile |
| Dockerfile location | Dockerfile |
| Base directory | / (корень репозитория — контекст сборки) |
| Port | 3000 |
| Domain | https://your-domain.ru |
Coolify сам выпустит TLS-сертификат Let's Encrypt для указанного домена при первом успешном деплое, если A-запись домена уже указывает на IP сервера.
4. Переменные окружения
В разделе Environment Variables приложения задайте как минимум:
NODE_ENV=production
AUTH_SECRET=<сгенерируйте: npx auth secret>
AUTH_URL=https://your-domain.ru
NEXT_PUBLIC_APP_URL=https://your-domain.ru
DATABASE_URL=postgresql://user:password@host:5432/dbname
Плюс всё, что реально используете: REDIS_URL, AUTH_GOOGLE_ID/AUTH_GOOGLE_SECRET,
AUTH_YANDEX_ID/AUTH_YANDEX_SECRET, SMTP_*/EMAIL_FROM, PAYMENT_PROVIDER и ключи выбранного
платёжного провайдера (см. «Аутентификация», «Почта»,
«Платежи»). Ничего из .env не коммитится — все значения вводятся в
интерфейсе Coolify как секреты приложения.
Если база данных не поднята отдельно на том же сервере — самый простой вариант для старта:
создать в Coolify ресурс PostgreSQL (тот же интерфейс, отдельная кнопка «New Resource →
Database») и указать выданный им DATABASE_URL в переменных приложения.
5. Первый деплой и миграции
После первого успешного деплоя выполните миграции Prisma внутри контейнера (Coolify → приложение
→ Terminal, либо через docker exec на сервере):
pnpm db:deploy
db:deploy (prisma migrate deploy) применяет уже существующие миграции без интерактивных
вопросов — то, что нужно в проде, в отличие от db:migrate (prisma migrate dev), который
предназначен для разработки.
6. Проверка
curl -I https://your-domain.ru— должен вернуть200и валидный сертификат (issuer: Let's Encrypt).GET /api/health— health-check роут для мониторинга и правил Coolify «перезапустить при падении health-check».
Автодеплой и staging/prod
Coolify умеет автоматически передеплоивать приложение при пуше в указанную ветку (webhook от git-хостинга) — удобно для staging-окружения. Для боевого домена разумно оставить ручное подтверждение деплоя (Coolify поддерживает деплой по тегу/вручную), чтобы код, трогающий платежи или доступ пользователей, не попадал в прод без осознанного шага — так устроен деплой самого LaunchKit (staging-окружения автодеплоятся на push, прод — только по ручной промоции).
Логи и откат
Вкладка Logs приложения в Coolify показывает вывод сборки и рантайма в реальном времени — первое место для диагностики упавшего билда. Каждый деплой сохраняется в истории — при проблеме можно откатиться на предыдущий успешный деплой одной кнопкой, не трогая git-историю.