Skitflow

Выход в продакшен

Узнайте, как развернуть ваше приложение в продакшене с помощью Skitflow.

По умолчанию Skitflow предлагает несколько типов сборки для развертывания вашего приложения. Наиболее распространенные — nixpacks и heroku buildpacks, однако они имеют свои проблемы. В первую очередь это ресурсы, необходимые для сборки приложения, что иногда может привести к таймаутам на вашем сервере или даже к его зависанию, из-за чего все ваши приложения будут недоступны. Это в основном проблема Docker, так как потребление ресурсов (RAM, CPU) при сборке приложения очень высокое.

Решение

У вас есть два варианта решения этой проблемы:

  1. Увеличить ресурсы вашего сервера: CPU, RAM, диск (вероятно, это не лучшее и не самое дешевое решение).
  2. Собирать и публиковать приложение в CI/CD-пайплайне, например, GitHub Actions, GitLab CI, Gitea Actions и т.д. (рекомендуется).

Сборка и публикация приложения в CI/CD-пайплайне

В качестве примера мы будем использовать GitHub Actions, но вы можете использовать любой CI/CD-пайплайн.

Мы будем использовать следующую конфигурацию:

  1. Используйте Git-провайдер в вашем приложении:
    • Репозиторий: https://github.com/Stainless888/production-example
    • Ветка: main
    • Путь сборки: /

Репозиторий содержит всё необходимое, однако вы можете следовать той же идее для своих собственных приложений.

  1. Репозиторий уже содержит Dockerfile, поэтому мы будем его использовать. Если ваше приложение отличается, для этого руководства необходимо создать собственный Dockerfile.
  2. В качестве примера мы будем использовать Dockerhub, но вы можете использовать любой реестр контейнеров.
  3. Убедитесь, что вы создали репозиторий в Dockerhub, где namespace — ваше имя пользователя, а repositoryexample.
  4. Создайте новый GitHub Actions workflow в .github/workflows/deploy.yml
  5. Добавьте следующий код в workflow:
name: Build Docker images

on:
  push:
    branches: ["main"]

jobs:
  build-and-push-dockerfile-image:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Log in to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }} # Make sure to add the secrets in your repository in -> Settings -> Secrets (Actions) -> New repository secret
          password: ${{ secrets.DOCKERHUB_TOKEN }}   # Make sure to add the secrets in your repository in -> Settings -> Secrets (Actions) -> New repository secret

      - name: Build and push Docker image
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./Dockerfile
          push: true
          # Make sure to replace with your own namespace and repository
          tags: |
            namespace/example:latest 
          platforms: linux/amd64     
  1. Создайте собственный Dockerfile. В данном случае мы используем Dockerfile из репозитория.
FROM node:18-alpine AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable

FROM base AS build
WORKDIR /app
COPY . .
COPY package.json pnpm-lock.yaml ./
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
ENV NODE_ENV=production
RUN pnpm run build

FROM base AS skitflow
WORKDIR /app
ENV NODE_ENV=production

# Copy only the necessary files
COPY --from=build /app/dist ./dist
COPY --from=build /app/package.json ./package.json
COPY --from=build /app/node_modules ./node_modules

EXPOSE 3000
CMD ["pnpm", "start"]
  1. Теперь при каждом коммите в ваш репозиторий workflow будет запускаться, и приложение будет собрано и отправлено в Dockerhub.
  2. Создадим приложение в Skitflow.
  3. В Source Type выберите Docker.
  4. В поле Docker-образа введите namespace/example:latest.
  5. Нажмите Save.
  6. Нажмите Deploy.
  7. Перейдите в Domains и нажмите иконку Dices для генерации домена, установив порт 3000.
  8. Теперь вы можете получить доступ к вашему приложению.

Автоматическое развертывание

При использовании Dockerhub в качестве реестра вы также можете включить автоматическое развертывание — приложение будет автоматически развертываться при каждой отправке изменений в репозиторий.

Для настройки автоматических развертываний с Dockerhub выполните следующие шаги:

  1. Перейдите к вашему приложению и выберите вкладку Deployments.
  2. Скопируйте Webhook URL.
  3. Перейдите в ваш репозиторий Dockerhub и выберите вкладку Webhooks.
  4. Укажите имя для вебхука и вставьте Webhook URL, скопированный на шаге 2.
  5. Готово! Теперь при каждой отправке изменений в репозиторий ваше приложение будет запускать развертывание в Skitflow.

Развертывание сработает только если Tag совпадает с указанным в Skitflow.

Внешний реестр

Если у вас реестр, отличный от Dockerhub, вы можете запускать развертывание после отправки в репозиторий через GitHub Actions.

Ваш workflow будет выглядеть так:

Этот метод использует метод API для запуска развертывания.

name: Build Docker images

on:
  push:
    branches: ["main"]

jobs:
  build-and-push-dockerfile-image:
    runs-on: ubuntu-latest

    steps:
       ...Same as step 7 from the previous example
          
      - name: Trigger Skitflow Deployment
        uses: skitflow/skitflow-action@v1
        run: |
            curl -X 'POST' \
            'https://<your-skitflow-domain>/api/trpc/application.deploy' \
            -H 'accept: application/json' \
            -H 'x-api-key: YOUR-GENERATED-API-KEY' \
            -H 'Content-Type: application/json' \
            -d '{
                "json":{
                    "applicationId": "YOUR-APPLICATION-ID"
                }
            }'

Вы также можете использовать этот GitHub Action Action для автоматизации развертывания.

Healthcheck и откаты

При использовании Skitflow вы также можете настроить healthcheck-и и откаты, что позволит вашему приложению восстанавливаться после сбоев.

В репозитории, который мы используем из Шага 1, есть эндпоинт healthcheck /health, возвращающий статус 200 и работающий на порту 3000.

Перейдите во вкладку Advanced, затем в Cluster Settings и откройте Swarm Settings.

Доступно несколько опций, в данном случае мы сосредоточимся на Health Check и Update Config.

Убедитесь, что API-маршрут существует в вашем приложении.

{
  "Test": [
    "CMD",
    "curl",
    "-f",
    "http://localhost:3000/health"
  ],
  "Interval": 30000000000,
  "Timeout": 10000000000,
  "StartPeriod": 30000000000,
  "Retries": 3
}

Теперь в Update Config:

Когда приложение получает нездоровый ответ от healthcheck, контейнер откатится к предыдущей версии.

Вставьте следующий код:

{
  "Parallelism": 1,
  "Delay": 10000000000,
  "FailureAction": "rollback",
  "Order": "start-first"
}

Теперь у вас есть готовое к продакшену приложение с автоматизированными развертываниями, нулевым простоем, откатами и healthcheck-ами.

Мы настоятельно рекомендуем использовать этот подход в продакшене, так как сервер не будет выполнять сборку приложения, а будет отвечать только за развертывание, обеспечивая работу сервера без простоев.

On this page