From f9ced4507f3461453fe0503d415c08be6448e5ca Mon Sep 17 00:00:00 2001 From: Claude Code Date: Mon, 29 Sep 2025 10:30:22 +0100 Subject: [PATCH] Add deployment script with password authentication MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Created deploy-with-password.sh for VPS deployment - Includes automatic Docker & Docker Compose installation - Supports password-based SSH authentication via sshpass - Successfully deployed to production VPS: 128.140.8.206:3000 - Application is live and health checks are passing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- deploy-with-password.sh | 142 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100755 deploy-with-password.sh diff --git a/deploy-with-password.sh b/deploy-with-password.sh new file mode 100755 index 0000000..9830e06 --- /dev/null +++ b/deploy-with-password.sh @@ -0,0 +1,142 @@ +#!/bin/bash + +# Скрипт деплоя приложения click-counter на VPS с использованием пароля +# Использование: ./deploy-with-password.sh [VPS_IP] [SSH_USER] [SSH_PASSWORD] + +set -e + +VPS_IP=${1:-"YOUR_VPS_IP"} +SSH_USER=${2:-"root"} +SSH_PASSWORD=${3:-"acXCmaT3sFhV"} +APP_NAME="click-counter" +REMOTE_PATH="/opt/$APP_NAME" + +echo "🚀 Начинаем деплой $APP_NAME на VPS: $VPS_IP" + +# Проверяем что переданы параметры +if [ "$VPS_IP" = "YOUR_VPS_IP" ]; then + echo "❌ Ошибка: Укажите IP VPS" + echo "Использование: ./deploy-with-password.sh [VPS_IP] [SSH_USER] [SSH_PASSWORD]" + exit 1 +fi + +# Проверяем наличие sshpass +if ! command -v sshpass &> /dev/null; then + echo "📦 Установка sshpass..." + if command -v brew &> /dev/null; then + brew install sshpass + elif command -v apt-get &> /dev/null; then + sudo apt-get update && sudo apt-get install -y sshpass + elif command -v yum &> /dev/null; then + sudo yum install -y sshpass + else + echo "❌ Не удалось установить sshpass. Установите его вручную." + exit 1 + fi +fi + +# Создаем архив проекта +echo "📦 Создаем архив проекта..." +tar --exclude='.git' \ + --exclude='node_modules' \ + --exclude='*.log' \ + --exclude='.DS_Store' \ + --exclude='saas-*' \ + --exclude='*.tar.gz' \ + --exclude='frontend' \ + --exclude='backend' \ + --exclude='postgres_data' \ + -czf ${APP_NAME}-deploy.tar.gz \ + Dockerfile \ + docker-compose.yml \ + .dockerignore \ + package.json \ + package-lock.json \ + server.js \ + public/ + +echo "✅ Архив создан: ${APP_NAME}-deploy.tar.gz" + +# Загружаем на VPS +echo "⬆️ Загружаем на VPS..." +sshpass -p "$SSH_PASSWORD" scp -o StrictHostKeyChecking=no ${APP_NAME}-deploy.tar.gz ${SSH_USER}@${VPS_IP}:/tmp/ + +# Выполняем команды на VPS +echo "🔧 Настраиваем на VPS..." +sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no ${SSH_USER}@${VPS_IP} << EOF + set -e + + # Проверяем и устанавливаем Docker если нужно + if ! command -v docker &> /dev/null; then + echo "📦 Установка Docker..." + curl -fsSL https://get.docker.com -o get-docker.sh + sh get-docker.sh + systemctl enable docker + systemctl start docker + fi + + # Проверяем и устанавливаем Docker Compose если нужно + if ! command -v docker-compose &> /dev/null; then + echo "📦 Установка Docker Compose..." + curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-\$(uname -s)-\$(uname -m)" -o /usr/local/bin/docker-compose + chmod +x /usr/local/bin/docker-compose + fi + + # Создаем директорию приложения + mkdir -p $REMOTE_PATH + cd $REMOTE_PATH + + # Останавливаем старый контейнер если есть + if docker ps -q -f name=$APP_NAME > /dev/null; then + echo "🛑 Останавливаем старый контейнер..." + docker-compose down || true + fi + + # Распаковываем новую версию + echo "📂 Распаковываем приложение..." + tar -xzf /tmp/${APP_NAME}-deploy.tar.gz -C $REMOTE_PATH + + # Собираем и запускаем + echo "🏗️ Собираем Docker образ..." + docker-compose build --no-cache + + echo "🚀 Запускаем приложение..." + docker-compose up -d + + # Проверяем статус + sleep 10 + if docker-compose ps | grep -q "Up"; then + echo "✅ Приложение успешно запущено!" + echo "🌐 Доступно по адресу: http://$VPS_IP:3000" + + # Проверяем health endpoint + if command -v curl &> /dev/null; then + sleep 5 + if curl -f -s http://localhost:3000/health > /dev/null; then + echo "✅ Health check прошел успешно" + else + echo "⚠️ Health check не прошел, но контейнер запущен" + fi + fi + else + echo "❌ Ошибка запуска! Проверьте логи:" + docker-compose logs + exit 1 + fi + + # Очищаем временные файлы + rm -f /tmp/${APP_NAME}-deploy.tar.gz + + echo "🧹 Очищаем старые Docker образы..." + docker image prune -f || true +EOF + +# Очищаем локальный архив +rm -f ${APP_NAME}-deploy.tar.gz + +echo "" +echo "🎉 Деплой завершен успешно!" +echo "🌐 Приложение доступно: http://$VPS_IP:3000" +echo "🔍 Проверить health: curl http://$VPS_IP:3000/health" +echo "📊 Проверить статус: sshpass -p '$SSH_PASSWORD' ssh -o StrictHostKeyChecking=no $SSH_USER@$VPS_IP 'cd $REMOTE_PATH && docker-compose ps'" +echo "📋 Посмотреть логи: sshpass -p '$SSH_PASSWORD' ssh -o StrictHostKeyChecking=no $SSH_USER@$VPS_IP 'cd $REMOTE_PATH && docker-compose logs -f'" \ No newline at end of file