Deploy
🚀 Сервер
Для выполнения данного задания вам понадобится:
- Сервер с Ubuntu 22.04 LTS или 24.04 LTS
- SSH-ключ для доступа к серверу
- Публичный IP сервера
Сервер можно получить, например, на AWS . Либо на любом другом хостинг провайдере.
🛠 Настройка сервера (Ubuntu)
На сервере выполните:
sudo apt update && sudo apt upgrade -y
# 🔄 Обновляем список пакетов и сразу устанавливаем последние версии всех установленных пакетов
sudo apt install docker.io -y
# 🐳 Устанавливаем Docker из официальных репозиториев Ubuntu
sudo systemctl enable docker
# ⚙️ Включаем автозапуск Docker при загрузке системы
sudo usermod -aG docker $USER
# 👤 Добавляем текущего пользователя в группу "docker", чтобы можно было запускать команды без sudoЗатем выйдите и заново подключитесь по SSH, чтобы применились изменения.
📁 Пример secrets в GitHub
Создайте в Settings → Secrets and variables → Actions:
DOCKER_USERDOCKER_PASSHOST— публичный IP EC2-инстансаSSH_KEY— содержимое.pem
cat my-key.pem⚙️ GitHub Actions: билд, пуш, деплой
Создайте .github/workflows/deploy.yml:
name: CI/CD Pipeline
on:
push:
branches: [main] # Запускать только при пуше в ветку main
jobs:
checks:
uses: ./.github/workflows/pr-check.yaml
build:
needs: checks
runs-on: ubuntu-latest # Используем GitHub-hosted runner с Ubuntu
steps:
- uses: actions/checkout@v3
- name: Сборка
run: docker build -t ${{ secrets.DOCKER_USER }}/devops-node-starter:${{ github.sha }} .
- name: Docker Login
run: echo ${{ secrets.DOCKER_PASS }} | docker login -u ${{ secrets.DOCKER_USER }} --password-stdin
- name: Docker Push
run: docker push ${{ secrets.DOCKER_USER }}/devops-node-starter:${{ github.sha }}
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Deploy over SSH
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
echo ${{ secrets.DOCKER_PASS }} | docker login -u ${{ secrets.DOCKER_USER }} --password-stdin
docker pull ${{ secrets.DOCKER_USER }}/devops-node-starter:${{ github.sha }}
docker stop devops-node-starter || true
docker rm devops-node-starter || true
docker run -d --name devops-node-starter -p 4545:4545 ${{ secrets.DOCKER_USER }}/devops-node-starter:${{ github.sha }}
Теперь при каждом пуше в main будет происходить:
- Сборка Docker-образа
- Публикация в Docker Hub
- Деплой и перезапуск контейнера на сервере
🌐 Настройка NGINX как обратного прокси
На сервере установим и настроим NGINX для проксирования запросов к Node.js-приложению внутри Docker-контейнера.
📦 Установка NGINX
sudo apt update
sudo apt install nginx -y⚙️ Настройка прокси
Создайте конфиг:
sudo nano /etc/nginx/sites-available/devops-node-starterВставьте:
server {
listen 80; # Слушаем HTTP-запросы на 80 порту
server_name your-domain.com; # Указываем домен или публичный IP сервера
location /api {
rewrite ^/api/(.*)$ /$1 break; # удаляем префикс /api из пути
proxy_pass http://localhost:4545; # Проксируем запросы на локальный Node.js-сервер (в контейнере)
proxy_http_version 1.1; # Используем HTTP/1.1 для поддержки веб-сокетов и keep-alive
proxy_set_header Upgrade $http_upgrade; # Поддержка веб-сокетов (если есть)
proxy_set_header Connection 'upgrade'; # То же самое — разрешает обновление соединения
proxy_set_header Host $host; # Передаём оригинальный Host-заголовок
proxy_cache_bypass $http_upgrade; # Обход кеша при использовании веб-сокетов
}
}Активируйте конфиг:
sudo ln -s /etc/nginx/sites-available/devops-node-starter /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxТеперь все HTTP-запросы на порт 80 будут проксироваться к контейнеру на порту 4545.
Last updated on