Деплой на свой сервер

Деплой 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
локальный файл .envEnvironment Variables приложения (секреты)
http://localhost:3000/api/healthhttps://<домен>/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
Branchmain (или ваша боевая ветка)
Build PackDockerfile
Dockerfile locationDockerfile
Base directory/ (корень репозитория — контекст сборки)
Port3000
Domainhttps://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-историю.