Skip to Content

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_USER
  • DOCKER_PASS
  • HOST — публичный 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 будет происходить:

  1. Сборка Docker-образа
  2. Публикация в Docker Hub
  3. Деплой и перезапуск контейнера на сервере

🌐 Настройка 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