Выход в продакшен
Узнайте, как развернуть ваше приложение в продакшене с помощью Skitflow.
По умолчанию Skitflow предлагает несколько типов сборки для развертывания вашего приложения. Наиболее распространенные — nixpacks и heroku buildpacks, однако они имеют свои проблемы. В первую очередь это ресурсы, необходимые для сборки приложения, что иногда может привести к таймаутам на вашем сервере или даже к его зависанию, из-за чего все ваши приложения будут недоступны. Это в основном проблема Docker, так как потребление ресурсов (RAM, CPU) при сборке приложения очень высокое.
Решение
У вас есть два варианта решения этой проблемы:
- Увеличить ресурсы вашего сервера: CPU, RAM, диск (вероятно, это не лучшее и не самое дешевое решение).
- Собирать и публиковать приложение в CI/CD-пайплайне, например, GitHub Actions, GitLab CI, Gitea Actions и т.д. (рекомендуется).
Сборка и публикация приложения в CI/CD-пайплайне
В качестве примера мы будем использовать GitHub Actions, но вы можете использовать любой CI/CD-пайплайн.
Мы будем использовать следующую конфигурацию:
- Используйте Git-провайдер в вашем приложении:
- Репозиторий:
https://github.com/Stainless888/production-example - Ветка:
main - Путь сборки:
/
- Репозиторий:
Репозиторий содержит всё необходимое, однако вы можете следовать той же идее для своих собственных приложений.
- Репозиторий уже содержит Dockerfile, поэтому мы будем его использовать. Если ваше приложение отличается, для этого руководства необходимо создать собственный Dockerfile.
- В качестве примера мы будем использовать
Dockerhub, но вы можете использовать любой реестр контейнеров. - Убедитесь, что вы создали репозиторий в
Dockerhub, гдеnamespace— ваше имя пользователя, аrepository—example. - Создайте новый GitHub Actions workflow в
.github/workflows/deploy.yml - Добавьте следующий код в 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 - Создайте собственный 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"]- Теперь при каждом коммите в ваш репозиторий workflow будет запускаться, и приложение будет собрано и отправлено в
Dockerhub. - Создадим приложение в Skitflow.
- В
Source TypeвыберитеDocker. - В поле Docker-образа введите
namespace/example:latest. - Нажмите
Save. - Нажмите
Deploy. - Перейдите в
Domainsи нажмите иконкуDicesдля генерации домена, установив порт3000. - Теперь вы можете получить доступ к вашему приложению.
Автоматическое развертывание
При использовании Dockerhub в качестве реестра вы также можете включить автоматическое развертывание — приложение будет автоматически развертываться при каждой отправке изменений в репозиторий.
Для настройки автоматических развертываний с Dockerhub выполните следующие шаги:
- Перейдите к вашему приложению и выберите вкладку
Deployments. - Скопируйте
Webhook URL. - Перейдите в ваш репозиторий Dockerhub и выберите вкладку
Webhooks. - Укажите имя для вебхука и вставьте
Webhook URL, скопированный на шаге 2. - Готово! Теперь при каждой отправке изменений в репозиторий ваше приложение будет запускать развертывание в 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-ами.
Мы настоятельно рекомендуем использовать этот подход в продакшене, так как сервер не будет выполнять сборку приложения, а будет отвечать только за развертывание, обеспечивая работу сервера без простоев.