CapRover - установка и настройка

CapRover — чрезвычайно простой в использовании менеджер развертывания приложений/баз данных и веб-серверов для приложений NodeJS, Python, PHP, ASP.NET, Ruby, MySQL, MongoDB, Postgres, WordPress и т.д.

Он невероятно быстр и очень надежен, поскольку использует Docker, nginx, LetsEncrypt и NetData за своим простым в использовании интерфейсом.

CapRover включает в себя:

  • CLI для автоматизации и сценариев
  • Веб-интерфейс для простоты доступа и удобства
  • Docker Swarm для контейнеризации и кластеризации
  • Nginx (полностью настраиваемый шаблон) для балансировки нагрузки
  • Let's Encrypt бесплатный SSL (HTTPS)

Подготовка

Для успешной установки нам понадобятся:

  • Сервер - VPS/VDS/железо
  • Docker
  • Домен
  • Настроить фаервол

Сервер

Для CapRover подойдёт любое железо/VPS на процессоре AMD64 (X86), ARM64 или ARMV7 с более чем 1 гб доступной оперативной памятью. Но имейте в виду, что для установки большого количества приложений этого объёма недостаточно.

Для примера установим CapRover на VPS Beget выбрав Ubuntu 20.04 в качестве операционной системы. Для теста подойдёт самая слабая версия vps на 1гб. Установку vps в данной статье опустим, думаю, с этим проблем не должно быть.

Docker

Устанавливаем Docker по инструкции.

Домен

Настраиваем DNS записи у домена, который подключим к серверу. В качестве A-record в настройках DNS поддоменов указываем IP адрес сервера. То есть, если, например, будет использоваться name.ru, то нужно указать А запись для *.name.ru, так как после настройки вся конфигурация сервера будет находиться на поддомене captain.name.ru.

Настройка фаервола

Перед установкой CapRover также необходимо убедиться, что фаервол системы не блокирует необходимые нам порты. Нам потребуется:

  • 80 TCP для HTTP соединения
  • 443 TCP для защищённого HTTPS соединения
  • 3000 TCP для первичной установки CapRover (может быть заблокирован после привязки домена)
  • 7946 TCP/UDP для Container Network Discovery
  • 4789 TCP/UDP для Container Overlay Network
  • 2377 TCP/UDP для Docker swarm API
  • 996 TCP для защищённого HTTPS соединения к Docker Registry

Запускаем команду:

sudo ufw allow 80,443,3000,996,7946,4789,2377/tcp; sudo ufw allow 7946,4789,2377/udp;

Установка CapRover

Вся установка сводится к запуску одной команды:

docker run -p 80:80 -p 443:443 -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock -v /captain:/captain caprover/caprover

Если возникнет ошибка:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied

Исправляем её с помощью команды:

sudo chmod 666 /var/run/docker.sock

После завершения установки панель управления CapRover становится доступной по адресу http://[IP_АДРЕС_СЕРВЕРА]:3000, пароль по умолчанию captain42. Однако, сейчас не стоит изменять что-то через интерфейс, а также менять пароль (можно сделать это позднее). Мы будем использовать инструмент командной строки для настройки сервера.

Установка CapRover CLI

Для установки CapRover CLI необходимо, чтобы был установлен npm, после чего запустите следующую команду:

npm install -g caprover

После завершения установки пакетов запускаем настройку сервера командой:

caprover serversetup

Программа установки задаст несколько вопросов. Остановимся подробнее о том, что необходимо указать в процессе настройки:

  1. Have you already started CapRover container on your server? — по умолчанию отвечаем Yes
  2. IP address of your server — здесь необходимо указать публичный IP адрес сервера
  3. CapRover server root domain — указываем ранее приобретённый домен. Если вы укажете что-то вроде name.ru, панель управления CapRover будет доступна по адресу captain.name.ru
  4. new CapRover password (min 8 characters) — на этом и следующем вопросе вводим новый пароль для доступа к панели управления.
  5. "valid" email address to get certificate and enable HTTPS — для получения сертификатов Let’s Encrypt необходимо указать действующий адрес электронной почты.
  6. CapRover machine name, with whom the login credentials are stored locally — любое удобное наименование серверу с установленным CapRover.

Если домен куплен и привязан к серверу заранее, никаких проблем возникнуть не должно. В будущем все приложения будут устанавливаться по адресу *.name.ru, а сертификаты для них сгенерируются автоматически.

Настройка файл подкачки

В некоторых случаях можно столкнуться с проблемами из-за нехватки физической оперативной памяти. Например, при сборке образа Docker, если он начнет занимать слишком много памяти, сборка завершится ошибкой. Чтобы обойти эти проблемы (без покупки дополнительной оперативной памяти), можно настроить файл подкачки (который используется как виртуальная оперативная память).

Деплой приложения

Одним из ключевых компонентов CapRover является файл определения, который необходимо поместить в корне проекта. В случае приложения NodeJS это рядом с package.json или рядом с index.php в случае PHP или рядом с файлом requirements.txt для приложения на Python. Сам файл настроек captain-definition – это простой JSON, например:

captain-definition
{ 
  "schemaVersion": 2,
  "templateId": "node/16.14.2"
}

Значение schemaVersion всегда равен 2, templateId — это часть, которая определяет основу, необходимую для запуска вашего приложения в формате ЯЗЫК/ВЕРСИЯ. ЯЗЫК может быть одним из следующих: node, php, python-django, ruby-rack. ВЕРСИЯ — это версия языка, который вы хотите использовать.

С CapRover есть возможность определить свой собственный Dockerfile. С настроенным Dockerfile можно развернуть любой язык – Go, Java, .NET и тд. Dockerfiles довольно легко написать. Сейчас подробнее останавливаться на нюансах написания этих файлов не будем. В большинстве случаев задеплоить проект в CapRover можно и стандартным методом.

Пример деплоя для vite проекта

Деплой в режиме сервера:

captain-definition
{
    "schemaVersion": 2,
    "dockerfileLines": [
        "FROM node:16-alpine",
        "RUN mkdir -p /usr/src/app",
        "WORKDIR /usr/src/app",
        "COPY ./package.json /usr/src/app/",
        "RUN npm install && npm cache clean --force",
        "COPY ./ /usr/src/app",
        "EXPOSE 5173",
        "CMD [ \"npm\", \"run\", \"dev\", \"--\", \"--host\" ]"
    ]
}

Деплой в статическом режиме:

captain-definition
{
    "schemaVersion": 2,
    "dockerfileLines": [
        "FROM node:16-alpine as builder",
        "RUN mkdir -p /usr/src/app",
        "WORKDIR /usr/src/app",
        "COPY ./package.json /usr/src/app/",
        "RUN npm install && npm cache clean --force",
        "COPY ./ /usr/src/app",
        "RUN npm run build",
        "FROM nginx:alpine",
        "COPY --from=builder /usr/src/app/dist /usr/share/nginx/html",
        "EXPOSE 80",
        "CMD [ \"nginx\", \"-g\", \"daemon off;\" ]"
    ]
}

Пример деплоя для gulp проекта

Конфигурация деплоя на примере сборки статичного сайта на nodejs с использованием gulp.

В примере проекта используется оптимизация изображений, поэтому в Dockerfile присутствуют строки apt-get update и apt-get install nasm zlib1g-dev -y, так как без них сборка оканчивается ошибкой. Если данные библиотеки не нужны, то эти две строчки из файла можно удалить, либо заменить на установку специфичных для определенного проекта компонентов.

captain-definition
{
    "schemaVersion": 2,
    "dockerfilePath": "./Dockerfile"
}
Dockerfile
# build environment
FROM node:16 as builder
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY . /usr/src/app
RUN apt-get update
# RUN apt-get install nasm zlib1g-dev libpng-dev -y
RUN apt-get install libpng-dev -y
RUN npm install
RUN npm run build

# production environment
FROM nginx:alpine
COPY --from=builder /usr/src/app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Методы развертывания

Независимо от вашего метода развертывания, убедитесь, что в вашем проекте есть файл captain-definition.

Развертывание через интерфейс командной строки

Просто запустите caprover deploy в репозитории git и следуйте инструкциям. Это лучший метод, так как это единственный метод, который сообщает вам о потенциальных сбоях сборки.

Развертывание через веб-панель

Преобразуйте содержимое вашего проекта в tar-архив (.tar), перейдите на веб-панель управления и загрузите tar-файл на вкладке Deployment проекта. Этот метод развертывания обычно используется только в целях тестирования. Откат в один клик

Допустим, вы развернули новую версию своего приложения, но вы же понимаете, что оно глючит. Просто перейдите на вкладку Deployment и щелкните значок возврата рядом с версией, к которой вы хотите вернуться. CapRover автоматически запускает новую сборку и развертывает предыдущую версию! Обратите внимание, что это НЕ отменяет изменения, внесенные вами в переменные среды и другие конфигурации приложения, такие как постоянные каталоги и т. д. Он просто возвращает ваш образ (развернутый исходный код).

Автоматическое развертывание с использованием Github, Bitbucket и т.д.

Этот способ, пожалуй, самый удобный. CapRover автоматически запускает сборку, когда вы отправляете репозиторий в определенную ветку (например, master, staging или release). Настроить автоматическое развертывание можно на вкладке Deployment конкретного приложения. Очень удобно, не так ли.

P.S.

На этом возможности CapRover не заканчиваются, все возможности подробно описаны в документации проекта.

Если планируете установить CapRover на локальном сервере, то установка немного будет отличаться, об этом есть отдельная статья, а также данный процесс описан в документации.

Как развернуть статический сайт можно посмотреть тут.

Также рекомендуется сделать следующее:

  1. Активировать NetData из панели управления. Это позволит следить за работой сервера CapRover, а также потреблением ресурсов.
  2. Установить Fail2Ban на сервер и отключить доступ к root через ввод пароля. Это обеспечит дополнительную безопасность не только CapRover, но и серверу в целом.