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>
143 lines
No EOL
5.2 KiB
Bash
Executable file
143 lines
No EOL
5.2 KiB
Bash
Executable file
#!/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'" |