Удаление
This commit is contained in:
440
deploy.sh
440
deploy.sh
@@ -1,440 +0,0 @@
|
||||
#!/bin/bash
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Vortex Messenger — полный деплой на чистый VPS
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
#
|
||||
# Требования:
|
||||
# - Чистый VPS с Ubuntu 22.04 или 24.04
|
||||
# - Домен с A-записью, направленной на IP сервера
|
||||
#
|
||||
# Инструкция:
|
||||
# 1. Загрузите весь проект на сервер:
|
||||
# scp -r ./* root@<IP>:/var/www/vortex/
|
||||
# 2. Зайдите на сервер: ssh root@<IP>
|
||||
# 3. Запустите:
|
||||
# chmod +x /var/www/vortex/deploy.sh
|
||||
# /var/www/vortex/deploy.sh
|
||||
#
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
set -e
|
||||
|
||||
# ─── Цвета ───
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
print_step() { echo -e "\n${CYAN}━━━ $1 ━━━${NC}\n"; }
|
||||
print_ok() { echo -e "${GREEN}✅ $1${NC}"; }
|
||||
print_warn() { echo -e "${YELLOW}⚠️ $1${NC}"; }
|
||||
print_error(){ echo -e "${RED}❌ $1${NC}"; }
|
||||
|
||||
# ─── Проверки ───
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
print_error "Запустите с правами root: sudo ./deploy.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
APP_DIR="/var/www/vortex"
|
||||
|
||||
if [ ! -f "$APP_DIR/package.json" ]; then
|
||||
print_error "Файлы проекта не найдены в $APP_DIR!"
|
||||
echo ""
|
||||
echo "Сначала загрузите проект на сервер:"
|
||||
echo " scp -r ./* root@<IP>:$APP_DIR/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ─── Ввод параметров ───
|
||||
echo -e "${CYAN}"
|
||||
echo "╔═══════════════════════════════════════════════════╗"
|
||||
echo "║ 🌀 Vortex Messenger — Деплой ║"
|
||||
echo "╚═══════════════════════════════════════════════════╝"
|
||||
echo -e "${NC}"
|
||||
|
||||
read -p "Введите домен (например messenger.ru): " DOMAIN
|
||||
if [ -z "$DOMAIN" ]; then
|
||||
print_error "Домен не указан!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
read -p "Введите email для SSL-сертификата: " SSL_EMAIL
|
||||
if [ -z "$SSL_EMAIL" ]; then
|
||||
print_error "Email не указан!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Генерация безопасных ключей
|
||||
DB_PASSWORD=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 32)
|
||||
JWT_SECRET=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | head -c 64)
|
||||
ENCRYPTION_KEY=$(openssl rand -hex 32)
|
||||
TURN_SECRET=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 32)
|
||||
|
||||
echo ""
|
||||
print_ok "Параметры приняты. Начинаю установку..."
|
||||
echo ""
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Шаг 1: Обновление системы
|
||||
# ═══════════════════════════════════════
|
||||
print_step "1/10 — Обновление системы"
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
apt update && apt upgrade -y
|
||||
apt install -y curl wget gnupg2 software-properties-common git unzip build-essential
|
||||
print_ok "Система обновлена"
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Шаг 2: Node.js 20
|
||||
# ═══════════════════════════════════════
|
||||
print_step "2/10 — Установка Node.js 20"
|
||||
if ! command -v node &>/dev/null || [[ $(node -v | cut -d. -f1 | tr -d v) -lt 20 ]]; then
|
||||
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
|
||||
apt install -y nodejs
|
||||
fi
|
||||
npm install -g pm2
|
||||
print_ok "Node.js $(node -v), npm $(npm -v), PM2 установлен"
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Шаг 3: PostgreSQL
|
||||
# ═══════════════════════════════════════
|
||||
print_step "3/10 — Установка PostgreSQL"
|
||||
apt install -y postgresql postgresql-contrib
|
||||
systemctl enable postgresql
|
||||
systemctl start postgresql
|
||||
|
||||
sudo -u postgres psql -c "DO \$\$ BEGIN
|
||||
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'vortex') THEN
|
||||
CREATE ROLE vortex WITH LOGIN PASSWORD '${DB_PASSWORD}';
|
||||
END IF;
|
||||
END \$\$;"
|
||||
sudo -u postgres psql -c "SELECT 1 FROM pg_database WHERE datname = 'vortex'" | grep -q 1 || \
|
||||
sudo -u postgres createdb -O vortex vortex
|
||||
|
||||
print_ok "PostgreSQL готов (БД: vortex, пользователь: vortex)"
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Шаг 4: Nginx
|
||||
# ═══════════════════════════════════════
|
||||
print_step "4/10 — Установка Nginx"
|
||||
apt install -y nginx
|
||||
systemctl enable nginx
|
||||
print_ok "Nginx установлен"
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Шаг 5: Certbot (SSL)
|
||||
# ═══════════════════════════════════════
|
||||
print_step "5/10 — Установка Certbot"
|
||||
apt install -y certbot python3-certbot-nginx
|
||||
print_ok "Certbot установлен"
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Шаг 6: coturn (TURN-сервер для звонков)
|
||||
# ═══════════════════════════════════════
|
||||
print_step "6/10 — Установка coturn (TURN)"
|
||||
apt install -y coturn
|
||||
|
||||
cat > /etc/turnserver.conf << EOF
|
||||
listening-port=3478
|
||||
tls-listening-port=5349
|
||||
realm=${DOMAIN}
|
||||
server-name=${DOMAIN}
|
||||
lt-cred-mech
|
||||
use-auth-secret
|
||||
static-auth-secret=${TURN_SECRET}
|
||||
fingerprint
|
||||
no-cli
|
||||
no-tlsv1
|
||||
no-tlsv1_1
|
||||
EOF
|
||||
|
||||
sed -i 's/#TURNSERVER_ENABLED=1/TURNSERVER_ENABLED=1/' /etc/default/coturn 2>/dev/null || true
|
||||
systemctl enable coturn
|
||||
systemctl restart coturn
|
||||
print_ok "coturn настроен"
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Шаг 7: Настройка окружения (.env)
|
||||
# ═══════════════════════════════════════
|
||||
print_step "7/10 — Создание .env"
|
||||
|
||||
mkdir -p ${APP_DIR}/apps/server/uploads/avatars
|
||||
|
||||
cat > ${APP_DIR}/apps/server/.env << EOF
|
||||
DATABASE_URL=postgresql://vortex:${DB_PASSWORD}@localhost:5432/vortex
|
||||
JWT_SECRET=${JWT_SECRET}
|
||||
ENCRYPTION_KEY=${ENCRYPTION_KEY}
|
||||
PORT=3001
|
||||
NODE_ENV=production
|
||||
CORS_ORIGINS=https://${DOMAIN}
|
||||
MAX_REGISTRATIONS_PER_IP=5
|
||||
TURN_URL=turn:${DOMAIN}:3478
|
||||
TURN_SECRET=${TURN_SECRET}
|
||||
STUN_URLS=stun:stun.l.google.com:19302,stun:${DOMAIN}:3478
|
||||
EOF
|
||||
|
||||
print_ok "Файл .env создан"
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Шаг 8: Установка зависимостей и сборка
|
||||
# ═══════════════════════════════════════
|
||||
print_step "8/10 — Установка зависимостей и сборка"
|
||||
|
||||
cd ${APP_DIR}
|
||||
|
||||
# Установка зависимостей (npm workspaces)
|
||||
npm install --legacy-peer-deps
|
||||
print_ok "Зависимости установлены"
|
||||
|
||||
# --- Бэкенд ---
|
||||
cd ${APP_DIR}/apps/server
|
||||
npx prisma generate
|
||||
npx prisma db push --accept-data-loss
|
||||
print_ok "БД синхронизирована"
|
||||
|
||||
npx tsc
|
||||
print_ok "Бэкенд скомпилирован (dist/)"
|
||||
|
||||
# --- Фронтенд ---
|
||||
cd ${APP_DIR}/apps/web
|
||||
npx vite build
|
||||
print_ok "Фронтенд собран (dist/)"
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Шаг 9: Nginx конфигурация
|
||||
# ═══════════════════════════════════════
|
||||
print_step "9/10 — Настройка Nginx"
|
||||
|
||||
cat > /etc/nginx/sites-available/vortex << EOF
|
||||
server {
|
||||
listen 80;
|
||||
server_name ${DOMAIN};
|
||||
|
||||
root ${APP_DIR}/apps/web/dist;
|
||||
index index.html;
|
||||
client_max_body_size 50M;
|
||||
|
||||
gzip on;
|
||||
gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript;
|
||||
gzip_min_length 1000;
|
||||
|
||||
location / {
|
||||
try_files \$uri \$uri/ /index.html;
|
||||
|
||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
}
|
||||
|
||||
location /api/ {
|
||||
proxy_pass http://127.0.0.1:3001;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade \$http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host \$host;
|
||||
proxy_set_header X-Real-IP \$remote_addr;
|
||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||
client_max_body_size 50M;
|
||||
}
|
||||
|
||||
location /socket.io/ {
|
||||
proxy_pass http://127.0.0.1:3001;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade \$http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host \$host;
|
||||
proxy_set_header X-Real-IP \$remote_addr;
|
||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||
proxy_read_timeout 86400;
|
||||
}
|
||||
|
||||
location /uploads/ {
|
||||
proxy_pass http://127.0.0.1:3001/uploads/;
|
||||
proxy_set_header Host \$host;
|
||||
proxy_set_header X-Real-IP \$remote_addr;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
# Блокировка доступа по голому IP
|
||||
cat > /etc/nginx/sites-available/block-ip << EOF
|
||||
server {
|
||||
listen 80 default_server;
|
||||
server_name _;
|
||||
return 444;
|
||||
}
|
||||
EOF
|
||||
|
||||
ln -sf /etc/nginx/sites-available/vortex /etc/nginx/sites-enabled/
|
||||
ln -sf /etc/nginx/sites-available/block-ip /etc/nginx/sites-enabled/
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
|
||||
nginx -t && systemctl reload nginx
|
||||
print_ok "Nginx настроен"
|
||||
|
||||
# --- SSL ---
|
||||
print_step "Получение SSL-сертификата"
|
||||
certbot --nginx -d ${DOMAIN} --non-interactive --agree-tos -m ${SSL_EMAIL} 2>&1 || {
|
||||
print_warn "SSL не удалось получить автоматически."
|
||||
print_warn "Проверьте что DNS A-запись ${DOMAIN} указывает на IP этого сервера."
|
||||
print_warn "После настройки DNS выполните вручную:"
|
||||
echo " certbot --nginx -d ${DOMAIN}"
|
||||
}
|
||||
|
||||
# Обновить block-ip для HTTPS тоже
|
||||
if [ -f "/etc/letsencrypt/live/${DOMAIN}/fullchain.pem" ]; then
|
||||
cat > /etc/nginx/sites-available/block-ip << EOF
|
||||
server {
|
||||
listen 80 default_server;
|
||||
listen 443 ssl default_server;
|
||||
server_name _;
|
||||
ssl_certificate /etc/letsencrypt/live/${DOMAIN}/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/${DOMAIN}/privkey.pem;
|
||||
return 444;
|
||||
}
|
||||
EOF
|
||||
nginx -t && systemctl reload nginx
|
||||
print_ok "Доступ по IP заблокирован (HTTP и HTTPS)"
|
||||
fi
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Шаг 10: Запуск через PM2
|
||||
# ═══════════════════════════════════════
|
||||
print_step "10/10 — Запуск сервера"
|
||||
|
||||
cd ${APP_DIR}/apps/server
|
||||
|
||||
pm2 delete vortex-server 2>/dev/null || true
|
||||
pm2 start dist/index.js --name vortex-server --cwd ${APP_DIR}/apps/server
|
||||
pm2 save
|
||||
pm2 startup systemd -u root --hp /root 2>/dev/null || pm2 startup
|
||||
|
||||
print_ok "Сервер запущен"
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Файрвол
|
||||
# ═══════════════════════════════════════
|
||||
if command -v ufw &>/dev/null; then
|
||||
ufw allow 22/tcp
|
||||
ufw allow 80/tcp
|
||||
ufw allow 443/tcp
|
||||
ufw allow 3478/tcp
|
||||
ufw allow 3478/udp
|
||||
ufw --force enable
|
||||
print_ok "Файрвол настроен"
|
||||
fi
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Скрипт обновления (для будущих апдейтов)
|
||||
# ═══════════════════════════════════════
|
||||
cat > ${APP_DIR}/update.sh << 'UPDATESCRIPT'
|
||||
#!/bin/bash
|
||||
set -e
|
||||
APP_DIR="/var/www/vortex"
|
||||
ARCHIVE="/root/vortex-deploy.tar.gz"
|
||||
ENV_BACKUP="/root/vortex-env-backup"
|
||||
|
||||
echo ""
|
||||
echo "VORTEX - Update server"
|
||||
echo ""
|
||||
|
||||
if [ ! -f "$ARCHIVE" ]; then
|
||||
echo "Архив не найден: $ARCHIVE"; exit 1
|
||||
fi
|
||||
|
||||
echo "1/7 Остановка сервера"
|
||||
pm2 stop vortex-server 2>/dev/null || true
|
||||
|
||||
echo "2/7 Бэкап .env"
|
||||
if [ -f "$APP_DIR/apps/server/.env" ]; then
|
||||
cp "$APP_DIR/apps/server/.env" "$ENV_BACKUP"
|
||||
fi
|
||||
|
||||
echo "3/7 Бэкап аватаров"
|
||||
if [ -d "$APP_DIR/apps/server/uploads/avatars" ]; then
|
||||
cp -r "$APP_DIR/apps/server/uploads/avatars" /root/vortex-avatars-backup 2>/dev/null || true
|
||||
fi
|
||||
|
||||
echo "4/7 Распаковка обновления"
|
||||
tar -xzf "$ARCHIVE" -C "$APP_DIR"
|
||||
if [ -f "$ENV_BACKUP" ]; then
|
||||
cp "$ENV_BACKUP" "$APP_DIR/apps/server/.env"
|
||||
fi
|
||||
if [ -d "/root/vortex-avatars-backup" ]; then
|
||||
mkdir -p "$APP_DIR/apps/server/uploads/avatars"
|
||||
cp -r /root/vortex-avatars-backup/* "$APP_DIR/apps/server/uploads/avatars/" 2>/dev/null || true
|
||||
rm -rf /root/vortex-avatars-backup
|
||||
fi
|
||||
|
||||
echo "5/7 Установка зависимостей"
|
||||
cd "$APP_DIR"
|
||||
npm install --legacy-peer-deps
|
||||
|
||||
echo "6/7 Сборка сервера"
|
||||
cd "$APP_DIR/apps/server"
|
||||
npx prisma generate
|
||||
npx prisma db push --accept-data-loss
|
||||
npx tsc
|
||||
|
||||
echo "7/7 Запуск сервера"
|
||||
pm2 restart vortex-server
|
||||
pm2 save
|
||||
rm -f "$ARCHIVE"
|
||||
echo ""
|
||||
echo "Готово! Проверка: pm2 logs vortex-server --lines 10"
|
||||
UPDATESCRIPT
|
||||
chmod +x ${APP_DIR}/update.sh
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# Итог
|
||||
# ═══════════════════════════════════════
|
||||
SERVER_IP=$(curl -s4 ifconfig.me 2>/dev/null || hostname -I | awk '{print $1}')
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}╔═══════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${GREEN}║ 🎉 Vortex Messenger развёрнут! ║${NC}"
|
||||
echo -e "${GREEN}╠═══════════════════════════════════════════════════╣${NC}"
|
||||
echo -e "${GREEN}║${NC} ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}║${NC} 🌐 Сайт: https://${DOMAIN}${NC}"
|
||||
echo -e "${GREEN}║${NC} 📡 IP: ${SERVER_IP}${NC}"
|
||||
echo -e "${GREEN}║${NC} ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}║${NC} 📂 Проект: ${APP_DIR}${NC}"
|
||||
echo -e "${GREEN}║${NC} 🔧 Env: ${APP_DIR}/apps/server/.env${NC}"
|
||||
echo -e "${GREEN}║${NC} 🔄 Апдейт: ${APP_DIR}/update.sh${NC}"
|
||||
echo -e "${GREEN}║${NC} ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}╠═══════════════════════════════════════════════════╣${NC}"
|
||||
echo -e "${GREEN}║${NC} Команды: ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}║${NC} pm2 logs vortex-server — логи ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}║${NC} pm2 restart vortex-server — перезапуск ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}║${NC} pm2 monit — мониторинг ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}╚═══════════════════════════════════════════════════╝${NC}"
|
||||
|
||||
# Сохранить credentials
|
||||
cat > ${APP_DIR}/CREDENTIALS.txt << EOF
|
||||
=== Vortex Messenger — Credentials ===
|
||||
Дата: $(date)
|
||||
Домен: ${DOMAIN}
|
||||
IP: ${SERVER_IP}
|
||||
|
||||
--- База данных ---
|
||||
Host: localhost:5432
|
||||
Database: vortex
|
||||
User: vortex
|
||||
Password: ${DB_PASSWORD}
|
||||
|
||||
--- Приложение ---
|
||||
JWT_SECRET=${JWT_SECRET}
|
||||
ENCRYPTION_KEY=${ENCRYPTION_KEY}
|
||||
|
||||
--- TURN сервер ---
|
||||
TURN_URL=turn:${DOMAIN}:3478
|
||||
TURN_SECRET=${TURN_SECRET}
|
||||
EOF
|
||||
|
||||
chmod 600 ${APP_DIR}/CREDENTIALS.txt
|
||||
echo ""
|
||||
print_ok "Credentials сохранены в ${APP_DIR}/CREDENTIALS.txt"
|
||||
echo ""
|
||||
@@ -1,79 +0,0 @@
|
||||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo.
|
||||
echo ╔═══════════════════════════════════════════════════╗
|
||||
echo ║ 🌀 Vortex Messenger — Упаковка для деплоя ║
|
||||
echo ╚═══════════════════════════════════════════════════╝
|
||||
echo.
|
||||
|
||||
cd /d "%~dp0"
|
||||
|
||||
echo 📦 Создание архива для загрузки на VPS...
|
||||
|
||||
:: Создаём временную папку
|
||||
if exist "vortex-deploy" rmdir /s /q "vortex-deploy"
|
||||
mkdir "vortex-deploy"
|
||||
|
||||
:: Копируем нужные файлы (без node_modules, .git, и т.д.)
|
||||
echo Копирование package.json...
|
||||
copy package.json vortex-deploy\ >nul
|
||||
|
||||
echo Копирование deploy.sh...
|
||||
copy deploy.sh vortex-deploy\ >nul
|
||||
|
||||
echo Копирование apps\server...
|
||||
xcopy apps\server vortex-deploy\apps\server\ /E /I /Q /EXCLUDE:exclude-list.tmp >nul 2>nul
|
||||
:: Удаляем то что не нужно
|
||||
if exist "vortex-deploy\apps\server\node_modules" rmdir /s /q "vortex-deploy\apps\server\node_modules"
|
||||
if exist "vortex-deploy\apps\server\dist" rmdir /s /q "vortex-deploy\apps\server\dist"
|
||||
|
||||
echo Копирование apps\web...
|
||||
xcopy apps\web vortex-deploy\apps\web\ /E /I /Q >nul 2>nul
|
||||
:: Удаляем то что не нужно
|
||||
if exist "vortex-deploy\apps\web\node_modules" rmdir /s /q "vortex-deploy\apps\web\node_modules"
|
||||
if exist "vortex-deploy\apps\web\dist" rmdir /s /q "vortex-deploy\apps\web\dist"
|
||||
|
||||
echo Копирование sounds...
|
||||
if exist sounds xcopy sounds vortex-deploy\sounds\ /E /I /Q >nul 2>nul
|
||||
|
||||
:: Удаляем загруженные файлы (только тестовые)
|
||||
if exist "vortex-deploy\apps\server\uploads" (
|
||||
rmdir /s /q "vortex-deploy\apps\server\uploads"
|
||||
mkdir "vortex-deploy\apps\server\uploads\avatars"
|
||||
)
|
||||
|
||||
:: Удаляем .env (секреты генерируются на сервере)
|
||||
if exist "vortex-deploy\apps\server\.env" del "vortex-deploy\apps\server\.env"
|
||||
|
||||
echo.
|
||||
echo 📦 Сжатие в архив...
|
||||
|
||||
:: Проверяем наличие tar (есть в Windows 10+)
|
||||
where tar >nul 2>nul
|
||||
if %ERRORLEVEL% equ 0 (
|
||||
tar -czf vortex-deploy.tar.gz -C vortex-deploy .
|
||||
echo.
|
||||
echo ✅ Архив создан: vortex-deploy.tar.gz
|
||||
) else (
|
||||
echo ⚠ tar не найден. Установите 7-Zip или заархивируйте папку vortex-deploy вручную.
|
||||
echo Папка готова: vortex-deploy\
|
||||
)
|
||||
|
||||
:: Очистка
|
||||
rmdir /s /q "vortex-deploy" 2>nul
|
||||
|
||||
echo.
|
||||
echo ═══════════════════════════════════════════════════════
|
||||
echo Следующий шаг — загрузите архив на VPS:
|
||||
echo.
|
||||
echo scp vortex-deploy.tar.gz root@ВАШ_IP:/root/
|
||||
echo.
|
||||
echo Затем на сервере:
|
||||
echo cd /root
|
||||
echo mkdir -p /var/www/vortex
|
||||
echo tar -xzf vortex-deploy.tar.gz -C /var/www/vortex
|
||||
echo chmod +x /var/www/vortex/deploy.sh
|
||||
echo sudo /var/www/vortex/deploy.sh
|
||||
echo ═══════════════════════════════════════════════════════
|
||||
echo.
|
||||
pause
|
||||
@@ -1,74 +0,0 @@
|
||||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo.
|
||||
echo ══════════════════════════════════════════════
|
||||
echo VORTEX — Подготовка обновления (Windows)
|
||||
echo ══════════════════════════════════════════════
|
||||
echo.
|
||||
|
||||
set SERVER_IP=109.196.102.13
|
||||
|
||||
:: 1. Очистка старого архива
|
||||
echo [1/4] Очистка...
|
||||
if exist vortex-deploy rd /s /q vortex-deploy
|
||||
if exist vortex-deploy.tar.gz del vortex-deploy.tar.gz
|
||||
|
||||
:: 2. Копирование файлов
|
||||
echo [2/4] Копирование файлов проекта...
|
||||
mkdir vortex-deploy
|
||||
copy package.json vortex-deploy\ >nul
|
||||
copy deploy.sh vortex-deploy\ >nul
|
||||
xcopy apps vortex-deploy\apps /E /I /Q >nul
|
||||
|
||||
:: 3. Удаление лишнего
|
||||
echo [3/4] Очистка от node_modules, dist, .env...
|
||||
if exist vortex-deploy\apps\server\node_modules rd /s /q vortex-deploy\apps\server\node_modules
|
||||
if exist vortex-deploy\apps\server\dist rd /s /q vortex-deploy\apps\server\dist
|
||||
if exist vortex-deploy\apps\server\.env del vortex-deploy\apps\server\.env
|
||||
if exist vortex-deploy\apps\web\node_modules rd /s /q vortex-deploy\apps\web\node_modules
|
||||
if exist vortex-deploy\apps\web\dist rd /s /q vortex-deploy\apps\web\dist
|
||||
if exist vortex-deploy\apps\server\uploads\avatars rd /s /q vortex-deploy\apps\server\uploads\avatars
|
||||
mkdir vortex-deploy\apps\server\uploads\avatars >nul 2>&1
|
||||
|
||||
:: 4. Создание архива
|
||||
echo [4/4] Создание архива...
|
||||
tar -czf vortex-deploy.tar.gz -C vortex-deploy .
|
||||
|
||||
:: Проверка
|
||||
if not exist vortex-deploy.tar.gz (
|
||||
echo.
|
||||
echo ✗ ОШИБКА: Архив не создан!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
for %%A in (vortex-deploy.tar.gz) do set SIZE=%%~zA
|
||||
set /a SIZE_KB=%SIZE%/1024
|
||||
echo.
|
||||
echo ✓ Архив создан: vortex-deploy.tar.gz (%SIZE_KB% KB)
|
||||
echo.
|
||||
|
||||
:: 5. Загрузка на сервер
|
||||
echo Загрузка на сервер %SERVER_IP%...
|
||||
echo (Введите пароль root когда попросит)
|
||||
echo.
|
||||
scp vortex-deploy.tar.gz root@%SERVER_IP%:/root/
|
||||
|
||||
if %errorlevel% equ 0 (
|
||||
echo.
|
||||
echo ══════════════════════════════════════════════
|
||||
echo ✓ ГОТОВО! Архив загружен на сервер.
|
||||
echo.
|
||||
echo Теперь зайдите на сервер:
|
||||
echo ssh root@%SERVER_IP%
|
||||
echo.
|
||||
echo И запустите:
|
||||
echo /var/www/vortex/update.sh
|
||||
echo ══════════════════════════════════════════════
|
||||
) else (
|
||||
echo.
|
||||
echo ✗ Ошибка загрузки. Проверьте пароль и попробуйте снова.
|
||||
)
|
||||
|
||||
echo.
|
||||
pause
|
||||
112
update-server.sh
112
update-server.sh
@@ -1,112 +0,0 @@
|
||||
#!/bin/bash
|
||||
# ══════════════════════════════════════════════
|
||||
# VORTEX — Обновление на сервере
|
||||
# ══════════════════════════════════════════════
|
||||
|
||||
set -e
|
||||
|
||||
APP_DIR="/var/www/vortex"
|
||||
ARCHIVE="/root/vortex-deploy.tar.gz"
|
||||
ENV_BACKUP="/root/vortex-env-backup"
|
||||
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
print_step() { echo -e "\n${CYAN}━━━ $1 ━━━${NC}\n"; }
|
||||
print_ok() { echo -e "${GREEN} ✓ $1${NC}"; }
|
||||
print_err() { echo -e "${RED} ✗ $1${NC}"; }
|
||||
|
||||
echo ""
|
||||
echo "══════════════════════════════════════════════"
|
||||
echo " VORTEX — Обновление сервера"
|
||||
echo "══════════════════════════════════════════════"
|
||||
echo ""
|
||||
|
||||
# Проверка архива
|
||||
if [ ! -f "$ARCHIVE" ]; then
|
||||
print_err "Архив $ARCHIVE не найден!"
|
||||
echo " Сначала запустите update-local.bat на вашем ПК"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 1. Остановка сервера
|
||||
print_step "1/7 — Остановка сервера"
|
||||
pm2 stop vortex-server 2>/dev/null || true
|
||||
print_ok "Сервер остановлен"
|
||||
|
||||
# 2. Бэкап .env
|
||||
print_step "2/7 — Сохранение .env"
|
||||
if [ -f "$APP_DIR/apps/server/.env" ]; then
|
||||
cp "$APP_DIR/apps/server/.env" "$ENV_BACKUP"
|
||||
print_ok ".env сохранён в $ENV_BACKUP"
|
||||
else
|
||||
print_err ".env не найден — пропускаем"
|
||||
fi
|
||||
|
||||
# 3. Бэкап uploads
|
||||
print_step "3/7 — Сохранение загруженных файлов"
|
||||
if [ -d "$APP_DIR/apps/server/uploads/avatars" ]; then
|
||||
cp -r "$APP_DIR/apps/server/uploads/avatars" /root/vortex-avatars-backup 2>/dev/null || true
|
||||
print_ok "Аватарки сохранены"
|
||||
fi
|
||||
|
||||
# 4. Распаковка
|
||||
print_step "4/7 — Распаковка обновления"
|
||||
tar -xzf "$ARCHIVE" -C "$APP_DIR"
|
||||
print_ok "Файлы обновлены"
|
||||
|
||||
# Восстановление .env
|
||||
if [ -f "$ENV_BACKUP" ]; then
|
||||
cp "$ENV_BACKUP" "$APP_DIR/apps/server/.env"
|
||||
print_ok ".env восстановлен"
|
||||
fi
|
||||
|
||||
# Восстановление аватарок
|
||||
if [ -d "/root/vortex-avatars-backup" ]; then
|
||||
mkdir -p "$APP_DIR/apps/server/uploads/avatars"
|
||||
cp -r /root/vortex-avatars-backup/* "$APP_DIR/apps/server/uploads/avatars/" 2>/dev/null || true
|
||||
rm -rf /root/vortex-avatars-backup
|
||||
print_ok "Аватарки восстановлены"
|
||||
fi
|
||||
|
||||
# 5. Установка зависимостей
|
||||
print_step "5/7 — Установка зависимостей"
|
||||
cd "$APP_DIR"
|
||||
npm install --production=false --legacy-peer-deps
|
||||
print_ok "Зависимости установлены"
|
||||
|
||||
# 6. Сборка
|
||||
print_step "6/7 — Сборка проекта"
|
||||
|
||||
cd "$APP_DIR/apps/server"
|
||||
npx prisma generate
|
||||
print_ok "Prisma Client сгенерирован"
|
||||
|
||||
npx prisma db push --accept-data-loss
|
||||
print_ok "База данных синхронизирована"
|
||||
|
||||
npx tsc
|
||||
print_ok "Сервер скомпилирован"
|
||||
|
||||
cd "$APP_DIR/apps/web"
|
||||
npx vite build
|
||||
print_ok "Фронтенд собран"
|
||||
|
||||
# 7. Запуск
|
||||
print_step "7/7 — Запуск сервера"
|
||||
pm2 restart vortex-server
|
||||
pm2 save
|
||||
print_ok "Сервер запущен"
|
||||
|
||||
# Очистка
|
||||
rm -f "$ARCHIVE"
|
||||
|
||||
echo ""
|
||||
echo "══════════════════════════════════════════════"
|
||||
echo -e " ${GREEN}✓ ОБНОВЛЕНИЕ ЗАВЕРШЕНО!${NC}"
|
||||
echo ""
|
||||
echo " Проверьте: pm2 logs vortex-server --lines 10"
|
||||
echo "══════════════════════════════════════════════"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user