
Добрый день, с вами ваш писатель-программист из компании SimplGroup. В этой статье я, насколько могу, подробно расскажу вам, как настроить SSH для подключения к виртуальной машине (VM) и интегрировать процесс CI/CD для вашего проекта с использованием Docker и GitLab/GitHub. Мы пройдем через все необходимые шаги, чтобы вы могли легко развернуть ваше приложение.
Стоит сказать, что сама я новичок и вообще бэкенд разработчик, которому неожиданно пришлось развернуть проект на виртуальной машине, так что, если сюда забрел такой же новичок, то, дружище, я может и не достаточно хорошо, но постараюсь тебе все объяснить.
Оглавление
Шаг 1: Подключение к виртуальной машине (VM)
Первым делом убедимся, что мы можем подключиться к нашей виртуальной машине с помощью SSH.
1. Создание SSH ключа
SSH ключи используются для безопасного подключения к удаленным серверам. Чтобы создать SSH ключ, выполните следующую команду в терминале:
ssh-keygen -t ed25519 -C "your_email@example.com"
-t ed25519
указывает тип ключа (еще можно rsa - побольше в размере, но постарше).-C "your_email@example.com"
добавляет метку для ключа (обычно это ваш email), но можно в целом не писать, если не хотите.
Далее протыкиваем везде Enter
, чтобы сильно не морочиться дальше. Если что, там задавался путь (по умолчанию (ваш пользователь)/.ssh/
) и пароль к ключу.
2. Прокидывание публичной части ключа в VM
После создания ключа вам нужно добавить его публичную часть на вашу виртуальную машину. Выполните следующую команду:
ssh-copy-id user@your_vm_ip
user
— это ваш логин на VM.your_vm_ip
— это IP-адрес вашей виртуальной машины.
Эта команда добавит ваш публичный ключ в файл ~/.ssh/authorized_keys
на VM, что позволит вам подключаться без пароля.
3. Подключение к VM
Теперь вы можете подключиться к вашей виртуальной машине с помощью команды:
ssh user@your_vm_ip
Если вы все сделали правильно, вы должны войти в систему без ввода пароля.
Шаг 2: Настройка SSH в VM для Git
Теперь настроим SSH для работы с Git, чтобы вы могли безопасно взаимодействовать с вашими репозиториями на GitLab или GitHub.
1. Создание SSH ключа (если вы еще этого не сделали)
В VM выполним знакомую нам команду:
ssh-keygen -t ed25519 -C "your_email@example.com"
2. Прокидывание публичной части ключа в ваш Git
Теперь добавьте публичную часть ключа в настройки вашего репозитория на GitLab или GitHub.
Для GitHub:
Перейдите в настройки вашего аккаунта.
Выберите "SSH and GPG keys".
Нажмите "New SSH key".
Вставьте содержимое файла
~/.ssh/id_ed25519.pub
в поле "Key".Нажмите "Add SSH key".
Для GitLab:
Перейдите в настройки вашего аккаунта.
Выберите "SSH Keys" в боковом меню.
Вставьте содержимое файла
~/.ssh/id_ed25519.pub
в поле "Key".Нажмите "Add key".
3. Проверка подключения
После добавления ключа проверьте, что все работает, выполнив команду в VM:
Для GitHub:
ssh -T git@github.com
Для GitLab:
ssh -T git@gitlab.com
Если все настроено правильно, вы увидите сообщение о том, что вы успешно аутентифицированы.
Шаг 3: Клонирование репозитория
Теперь, когда SSH настроен, вы можете клонировать репозиторий на свою локальную машину. Выполните команду:
git clone git@github.com:username/repository.git
Замените username и repository на ваши данные.
Шаг 4: Разработка и тестирование
Будем считать что локально, на вашем пк или ноутбуке, вы разработали некое приложение. Чтобы запустить это все на VM, для начала, нам нужно убедиться, что докер образ у вас вообще соберется, поэтому протестим.
(Дальше убедитесь, что у вас установлен докер на компьютере. Docker Desktop самый оптимальный вариант.)
В корневой папке вашего проекта (cd корень) создайте файл Dockerfile, чтобы описать, как собирать ваш проект в контейнер.
Пример простого Dockerfile для приложения на Node.js:
FROM node:14
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]
После создания Dockerfile убедитесь, что образ собирается локально:
docker build -t myapp .
Пока не соберется, лучше не переходить дальше, но если докер не устанавливали и хотите разворачивать сразу на VM, то хотя бы убедитесь, что ваш проект сам по себе запускается, даже без докера.
Шаг 5: Настройка CI/CD в GitLab/GitHub
Теперь создадим переменную в репозитории, куда вставим приватную часть своего SSH ключа.
1. Создание переменной
Для GitLab:
Перейдите в настройки вашего репозитория.
Выберите "CI/CD" в боковом меню.
Нажмите "Variables".
Добавьте новую переменную с именем SSH_PRIVATE_KEY и вставьте в нее содержимое файла
~/.ssh/id_ed25519
(открывать можно через блокнот).
Пометка:
- Visibility лучше поставить Visible, потому что другие запрещают пробелы.
- Flags ставим Expand variable reference, чтобы можно было использовать
Для GitHub:
Перейдите в настройки вашего репозитория.
Выберите "Secrets and variables" в боковом меню.
Нажмите "Actions".
Нажмите "New repository secret".
Введите имя SSH_PRIVATE_KEY и вставьте содержимое вашего приватного ключа
~/.ssh/id_ed25519
(открывать можно через блокнот).
2. Создание файла CI/CD
Создайте файл .gitlab-ci.yml (для GitLab) или .github/workflows/ci.yml (для GitHub) в корне вашего репозитория.
Пример для GitLab:
stages:
- build
- deploy
before_script:
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | sed 's/\\n/\n/g' > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H your_vm_ip >> ~/.ssh/known_hosts
build:
stage: build
script:
- docker build -t myapp .
deploy:
stage: deploy
only:
- master
script:
- ssh user@your_vm_ip "
cd /path/to/app &&
sudo docker stop myapp || true &&
sudo docker rm myapp || true &&
git pull origin master
sudo docker build -t myapp . &&
sudo docker run -d -p 3000:3000 --name myapp myapp
"
Пример для GitHub:
name: CI/CD
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Build Docker image
run: docker build -t myapp .
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- name: SSH into VM and deploy
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
run: |
echo "$SSH_PRIVATE_KEY" > private_key
chmod 600 private_key
ssh -o StrictHostKeyChecking=no -i private_key user@your_vm_ip << 'EOF'
cd /path/to/app
sudo docker stop myapp || true
sudo docker rm myapp || true
git pull origin master
sudo docker build -t myapp .
sudo docker run -d -p 3000:3000 --name myapp myapp
EOF
Шаг 6: Объяснение CI/CD файла
before_script (для GitLab):
- Получаем наш ключ из переменной и создаем файл ~/.ssh/id_rsa.
- Устанавливаем права на файл ключа.
- Добавляем IP адрес VM в known_hosts, чтобы избежать предупреждений о безопасности.build:
- Проверяем, что образ собирается с помощью команды docker build.deploy:
- Подключаемся по SSH к нашей VM.
- Переходим в нужную директорию.
- Останавливаем и удаляем предыдущий контейнер, если он существует.
- Подтягиваем изменения из гита.
- Собираем образ заново и запускаем его на порту 3000.only (для GitLab) и on: push: branches: (для GitHub):
- Указываем, что деплой должен выполняться только на ветке master.
Заключение
Теперь у вас настроен процесс CI/CD, который автоматически развертывает ваше приложение на виртуальной машине при каждом обновлении ветки master.
Это значительно упрощает процесс развертывания и управления приложением. Следуя этому руководству, вы сможете легко настроить свою среду разработки и развертывания, используя SSH, Docker и CI/CD.
Ну и, напоминаю, строго не судите, я только учусь. Девиз всех начинашек: «работает и ладно»:‑)