SaaS/deploy-with-password.sh
Claude Code a8bc41d3ea Fix deployment issue: add database folder to Dockerfile and deploy script
Resolves "Cannot find module './database/init'" error during deployment by:
- Properly copying the database folder to the Docker container
- Including database folder in the deployment archive

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-29 11:08:37 +01:00

143 lines
No EOL
5.2 KiB
Bash
Executable file
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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/ \
database/
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'"