September 14, 2021

Автоматизация развёртывания NodeJS (и не только) проекта с использованием Docker, GitLab CI/CD и GitLab Runner

В рамках данной статьи мы не будем рассматривать как обернуть проект в Docker, а будем использовать подготовленный мною заранее проект: CodeSurfHQ/simple-nodejs, проект написан на NodeJS, но GitLab CI/CD им не ограничивается, nodejs используется лишь для демонстрации.

Статья предназначена для изучения работы с GitLab Runner, в статье не учитываются способы параметризации, ограничение доступа к средам исполнения, автоматическая настройка с помощью Ansible, автоматическое очищение старых образов из GitLab Container Registry.

Проект подразумевает серию статей, в последующих статьях мы будем улучшать и оптимизировать проект.

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

Я буду использовать shared-сервер с конфигурацией: Intel(R) Xeon(R) Gold 6240 CPU @ 2.60GHz (1vCPU), 1GiB DIMM RAM, 16GiB HDD и предустановленным образом Ubuntu 20.04 LTS, чего для данной статьи вполне себе достаточно.

Мой сервер работает на архитектуре x86_64. Вы же можете использовать команду: uname -pi, если не знаете информацию о своём сервере.

Обновляем все индексы пакетов и устанавливаем:

sudo apt-get update
sudo apt-get upgrade

Устанавливаем Docker

Подробнее в документации Docker: Install Docker Engine

Обратите внимание: архитектура

1. Устанавливаем Docker:

curl -sSLf https://get.docker.com | bash

2. Проверяем, всё ли запустилось успешно:

sudo service docker status
Результат выполнения 6-го шага

Устанавливаем GitLab Runner

Подробнее в документации GitLab: Install GitLab Runner

Обратите внимание: архитектура

1. Скачиваем бинарный файл раннера:

sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64"

2. Выдаём права на запуск:

sudo chmod +x /usr/local/bin/gitlab-runner

3. Создаём отдельного GitLab CI пользователя:

sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

4. Устанавливаем раннер:

sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner

5. Запускаем раннер:

sudo gitlab-runner start

6. Проверяем, всё ли запустилось успешно:

sudo service gitlab-runner status
Результат выполнения 6-го шага

7. Добавляем пользователя gitlab-runner в группу Docker:

adduser gitlab-runner docker

8. Выдаем права пользователю gitlab-runner:

usermod -aG docker gitlab-runner

Регистрируем GitLab Runner

1. Для регистрации раннера выполняем команду:

gitlab-runner register

Команда потребует ссылку на GitLab инстанс и уникальный регистрационный токен раннера, ссылку и токен можно получить в странице настройки группы (см. ниже на изображении)

2. Вводим все полученные данные в терминал.

3. Вводим описание раннера (опционально)

4. Вводим тег для раннера (я всегда придерживаюсь стиля название сервера-название исполнителя)

5. В качестве исполнителя вводим: shell

Результат выполнения регистрации раннера

Обновите страницу настроек группы и увидите что в списке доступных раннеров появился ваш раннер:

Конфигурация .gitlab-ci.yml файла

Мы не будем разбирать как конфигурировать .gitlab-ci.yml файл, так как каждая задача требует индивидуального подхода, вы можете самостоятельно этому научиться следуя документации GitLab CI/CD

Содержимое файла: CodeSurfHQ/simple-nodejs/.gitlab-ci.yml

Содержимое .gitlab-ci.yml

Строки 54-55 задают исполнителя Job (подробнее), должен совпадать тем, что мы указывали в шаге №3

После успешного выполнения Pipeline (возможные ошибки) мы можем перейти по IP-адресу или домену сайта (с учетом порта):

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

Поддержать автора: codesurf.ru/donate

Установка ufw и nginx

Установка ufw и nginx

sudo apt-get install ufw nginx

Настройка:

sudo ufw allow 'Nginx Full'

Включение:

sudo ufw enable

Запуск:

sudo service ufw start

Проверка:

sudo service ufw status
Результат выполнения проверки

Создаём новый файл: nano /etc/nginx/sites-available/apple.codesurf.ru

server {
    listen          80;
    # Если ваш сервер поддерживает IPv6, то раскомментируйте строку ниже!
    # listen [::]:80;
    server_name     apple.codesurf.ru;
    location / {
        proxy_pass  http://0.0.0.0:3000/;
    }
}

Создаём символическую ссылка: ln -s /etc/nginx/sites-available/apple.codesurf.ru /etc/nginx/sites-enabled/apple.codesurf.ru

Проверяем, всё ли верно: nginx -t

Перезапускаем nginx: sudo service nginx restart

Проверяем, успешно ли запустился nginx: sudo service nginx status

Переходим по IP-адресу сервера или по домену:

Настройка SSL-сертификата

Установка certbot:

sudo apt-get install certbot python3-certbot-nginx

В содержимом файла /etc/nginx/sites-enabled/default заменяем значение у поля server_name на ваш домен (в моём случае с _ на apple.codesurf.ru)

Проверяем, всё ли верно: nginx -t

Перезапускаем nginx: sudo service nginx restart

Проверяем, успешно ли запустился nginx: sudo service nginx status

Настройка доступа к HTTPS через ufw:

Удаляем лишний профиль Nginx HTTP (предварительно настроив ufw):

sudo ufw delete allow 'Nginx HTTP'

Выпускаем Let`s Encrypt SSL-сертификат с помощью certbot (подробнее):

sudo certbot --nginx -d apple.codesurf.ru

Certbot автоматически верифицирует ваш домен, выпустит SSL-сертификат и привяжет его к nginx.

Проверка автоматического обновление SSL

Certbot автоматически продливает все SSL сертификаты истекающие менее, чем через 30 дней:

sudo systemctl status certbot.timer

Ниже представлены ошибки, с которыми вы можете столкнуться

Ошибка при этапе deploy:

Проблематика: #26605

Решение (подробнее): rm /home/gitlab-runner/.bash_logout

Поддержать автора: codesurf.ru/donate