Автоматизация развёртывания 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
Обратите внимание: архитектура
curl -sSLf https://get.docker.com | bash
2. Проверяем, всё ли запустилось успешно:
sudo service docker status
Устанавливаем 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"
sudo chmod +x /usr/local/bin/gitlab-runner
3. Создаём отдельного GitLab CI пользователя:
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
6. Проверяем, всё ли запустилось успешно:
sudo service gitlab-runner status
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
Строки 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-сертификата
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