150 lines
5.6 KiB
Bash
Executable File
150 lines
5.6 KiB
Bash
Executable File
#!/bin/bash
|
||
# Скрипт для синхронизации кода с localhost на VDS
|
||
|
||
# Цвета для вывода
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
RED='\033[0;31m'
|
||
NC='\033[0m' # No Color
|
||
|
||
echo -e "${GREEN}🔄 Синхронизация кода с VDS...${NC}"
|
||
|
||
# Параметры VDS (из настроек)
|
||
VDS_HOST="185.221.214.140"
|
||
VDS_USER="root"
|
||
VDS_PORT="22"
|
||
VDS_PATH="/home/docker/dapp"
|
||
|
||
# SSH опции
|
||
SSH_OPTS="-p $VDS_PORT -o StrictHostKeyChecking=no"
|
||
|
||
# Проверяем наличие rsync на удаленном сервере
|
||
echo -e "${YELLOW}🔍 Проверка наличия rsync на VDS...${NC}"
|
||
if ssh $SSH_OPTS $VDS_USER@$VDS_HOST "command -v rsync >/dev/null 2>&1"; then
|
||
USE_RSYNC=true
|
||
echo -e "${GREEN}✅ rsync найден на VDS${NC}"
|
||
else
|
||
USE_RSYNC=false
|
||
echo -e "${YELLOW}⚠️ rsync не найден на VDS, будет использован метод tar/scp${NC}"
|
||
read -p "Установить rsync на VDS? (y/n): " -n 1 -r
|
||
echo
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
echo -e "${YELLOW}📦 Установка rsync на VDS...${NC}"
|
||
ssh $SSH_OPTS $VDS_USER@$VDS_HOST "apt-get update && apt-get install -y rsync"
|
||
if ssh $SSH_OPTS $VDS_USER@$VDS_HOST "command -v rsync >/dev/null 2>&1"; then
|
||
USE_RSYNC=true
|
||
echo -e "${GREEN}✅ rsync успешно установлен${NC}"
|
||
else
|
||
echo -e "${RED}❌ Не удалось установить rsync, используется tar/scp${NC}"
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
# Функция синхронизации через rsync
|
||
sync_with_rsync() {
|
||
local SRC=$1
|
||
local DST=$2
|
||
rsync -avz --progress -e "ssh $SSH_OPTS" \
|
||
--exclude='.git' \
|
||
--exclude='node_modules' \
|
||
--exclude='*.log' \
|
||
--exclude='.env' \
|
||
--exclude='dist' \
|
||
--exclude='build' \
|
||
--exclude='.next' \
|
||
--exclude='coverage' \
|
||
--exclude='.nyc_output' \
|
||
--exclude='sessions' \
|
||
--exclude='temp' \
|
||
--exclude='tmp' \
|
||
--exclude='*.swp' \
|
||
--exclude='*.swo' \
|
||
--exclude='*~' \
|
||
--exclude='.DS_Store' \
|
||
"$SRC" "$DST"
|
||
}
|
||
|
||
# Функция синхронизации через tar/scp
|
||
sync_with_tar() {
|
||
local SRC_DIR=$1
|
||
local DST_DIR=$2
|
||
local DIR_NAME=$(basename "$SRC_DIR")
|
||
|
||
# Создаем временный архив
|
||
local TMP_TAR="/tmp/${DIR_NAME}_sync_$$.tar.gz"
|
||
|
||
# Упаковываем директорию с исключениями
|
||
tar -czf "$TMP_TAR" \
|
||
--exclude='.git' \
|
||
--exclude='node_modules' \
|
||
--exclude='*.log' \
|
||
--exclude='.env' \
|
||
--exclude='dist' \
|
||
--exclude='build' \
|
||
--exclude='.next' \
|
||
--exclude='coverage' \
|
||
--exclude='.nyc_output' \
|
||
--exclude='sessions' \
|
||
--exclude='temp' \
|
||
--exclude='tmp' \
|
||
--exclude='*.swp' \
|
||
--exclude='*.swo' \
|
||
--exclude='*~' \
|
||
--exclude='.DS_Store' \
|
||
-C "$(dirname "$SRC_DIR")" "$DIR_NAME"
|
||
|
||
# Копируем архив на VDS
|
||
scp -e "ssh $SSH_OPTS" "$TMP_TAR" "$VDS_USER@$VDS_HOST:/tmp/"
|
||
|
||
# Распаковываем на VDS
|
||
ssh $SSH_OPTS $VDS_USER@$VDS_HOST "mkdir -p $DST_DIR && tar -xzf /tmp/$(basename $TMP_TAR) -C $DST_DIR --strip-components=1 && rm /tmp/$(basename $TMP_TAR)"
|
||
|
||
# Удаляем локальный архив
|
||
rm -f "$TMP_TAR"
|
||
}
|
||
|
||
# Синхронизация backend
|
||
echo -e "${YELLOW}📦 Синхронизация backend...${NC}"
|
||
if [ "$USE_RSYNC" = true ]; then
|
||
sync_with_rsync "./backend/" "$VDS_USER@$VDS_HOST:$VDS_PATH/backend/"
|
||
else
|
||
sync_with_tar "./backend" "$VDS_PATH/backend"
|
||
fi
|
||
|
||
# Синхронизация frontend
|
||
echo -e "${YELLOW}📦 Синхронизация frontend...${NC}"
|
||
if [ "$USE_RSYNC" = true ]; then
|
||
sync_with_rsync "./frontend/" "$VDS_USER@$VDS_HOST:$VDS_PATH/frontend/"
|
||
else
|
||
sync_with_tar "./frontend" "$VDS_PATH/frontend"
|
||
fi
|
||
|
||
# Синхронизация shared
|
||
echo -e "${YELLOW}📦 Синхронизация shared...${NC}"
|
||
if [ "$USE_RSYNC" = true ]; then
|
||
sync_with_rsync "./shared/" "$VDS_USER@$VDS_HOST:$VDS_PATH/shared/"
|
||
else
|
||
sync_with_tar "./shared" "$VDS_PATH/shared"
|
||
fi
|
||
|
||
# Синхронизация docker-compose.prod.yml
|
||
echo -e "${YELLOW}📦 Синхронизация docker-compose.prod.yml...${NC}"
|
||
scp -e "ssh $SSH_OPTS" ./webssh-agent/docker-compose.prod.yml "$VDS_USER@$VDS_HOST:$VDS_PATH/docker-compose.prod.yml"
|
||
|
||
echo -e "${GREEN}✅ Синхронизация завершена!${NC}"
|
||
|
||
# Спрашиваем, нужно ли пересобрать образы
|
||
read -p "Пересобрать Docker образы на VDS? (y/n): " -n 1 -r
|
||
echo
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
echo -e "${YELLOW}🔨 Пересборка Docker образов на VDS...${NC}"
|
||
ssh $SSH_OPTS $VDS_USER@$VDS_HOST "cd $VDS_PATH && docker compose -f docker-compose.prod.yml build backend frontend frontend-nginx && docker compose -f docker-compose.prod.yml up -d --force-recreate backend frontend frontend-nginx"
|
||
echo -e "${GREEN}✅ Образы пересобраны и контейнеры перезапущены!${NC}"
|
||
else
|
||
echo -e "${YELLOW}💡 Для пересборки образов выполните:${NC}"
|
||
echo -e " ssh -p $VDS_PORT $VDS_USER@$VDS_HOST"
|
||
echo -e " cd $VDS_PATH"
|
||
echo -e " docker compose -f docker-compose.prod.yml build backend frontend frontend-nginx"
|
||
echo -e " docker compose -f docker-compose.prod.yml up -d --force-recreate backend frontend frontend-nginx"
|
||
fi
|