Описание flow деплоя приложения script
Проект состоит из:
- Дешборда построеного на React script-panel
- Бэкент построеного на Node.js script-api
Собрать три докер контейнера из фронта, бэка и базы Доставить контейнеры на вируальную машину Запустить контейнеры на вируальной машине
Регистрация на Docker Hub
- Регистрируемся на dockerhub
- На винде 10 пришлось также установить WSL2
- При наличии в проекте файлов с разделителями отличными от CRLF докер падает с ошибкой
Подготовка локального окружения
- Устанавливаем на локальную машину Docker с офф сайта
- На винде 10 пришлось также установить WSL2
- При наличии в проекте файлов с разделителями отличными от CRLF докер падает с ошибкой
- Логинимся в docker hub
docker login
Подготовка виртуальной машины
- Устанавлием на VPS докер в соотв с офф докой docker install ubuntu
- Прописываем SSH ключ
- Собираем образы frontend и backend на локальной машине
- Пушим образы в docker hub
- Заходим на VPS и в директории /home/scipt696 создаем файл docker-compose.yml
- Запускаем
docker compose up
- Докер запулит образы фронта, бэка и базы с docker hub в соответствии с конфигурацией файла и соберет кластер
Создаем образ фронта
- Создаем Dockerfile в коре проекта script-panel
FROM node:alpine
WORKDIR /app
COPY package*.json .
RUN npm ci --silent
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "run", "start"]
- Собираем докер image
docker build -t script696/script-panel
script696 - никнейм в моем профиле на doker hub должен быть обязательно такой 3. Пушим имедж в докерхаб
docker push script696/script-panel
Создаем образ бэка
- Создаем Dockerfile в коре проекта script-panel
FROM node
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY . .
EXPOSE 5000
CMD ["npm", "run", "start:prod"]
- Собираем докер image
docker build -t script696/script-api
- Пушим имедж в докерхаб
docker push script696/script-api
Заходим на VPS
- Переходим в папку /home/script696
- Создаем файл docker-compose.yml
- Открываем файл и пишем инструкции для сбокрки кластера
version: '3.9'
services:
# MongoDB service
mongo_db:
container_name: db_container
image: mongo:latest
restart: always
volumes:
- mongo_db:/data/db
# Script-api service
api:
container_name: script_api_container
image: script696/api_image:stage
ports:
- 5000:5000
environment:
PORT: 5000
MONGODB_URI: mongodb://mongo_db:27017
DB_NAME: script-api
ORIGIN: http://46.19.67.82:3000
depends_on:
- mongo_db
# Admin panel service
front:
container_name: script_admin_panel
image : script696/script_panel:latest
ports:
- 3000:3000
environment:
PORT: 3000
BROWSER: none
REACT_APP_BASE_URL: http://46.19.67.82:5000
depends_on:
- api
volumes:
mongo_db : {}
- Запускаем
docker compose up
Описание флоу автоматического деплоя
- На локальной машине настраиваем github actions workflows
- Настраиваем срабатывание экшена деплоя на релиз
- Запускаем экшен на гитхабе
- В раннере gh создается docker image приложения и пушится на docker hub
- Далее ранер подключается к VPS по SSH, пулит имейджи с docker hub и запускает docker compose
Настраиваем экшен для фронта
- в ./github/workflows создаем release.yml
name: Deploy project
on:
release:
types:
- created
jobs:
push_to_docker_hub:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v3
-
name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
-
name: Build and push
uses: docker/build-push-action@v4
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}:latest
deploy_on_vps:
needs: push_to_docker_hub
runs-on: ubuntu-latest
steps:
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@v0.1.7
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }}
port: ${{ secrets.SSH_PORT }}
passphrase : ${{ secrets.PASSPHRASE }}
script: |
cd /home/script696
docker compose pull
docker compose up -d --force-recreate --build
exit
- переменные типа DOCKERHUB_USERNAME берутс из секретов приложения добавляем их вручную в settings/Secrets and variables/Actions
- для HOST указываем айпишник машины
- для USERNAME указываем логин по которым заходим на машину
- для SSH_KEY указываем SSH key с локальный машины, ключ должен быть непубличным! вместе с -----BEGIN OPENSSH PRIVATE KEY----------END OPENSSH PRIVATE KEY-----
- для SSH_PORT указываем 22э
- для PASSPHRASE указываем пароль при входе
- для DOCKERHUB_TOKEN указываем токен который созаем в docker hub привязав туда публичный SSH ключ
- заходим на машину и создаем docker-compose.yml по аналогии с ручным деплоем