uploader-bot/setup_production_server.sh

348 lines
11 KiB
Bash
Raw 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
# =============================================================================
# MY UPLOADER BOT - PRODUCTION SERVER SETUP SCRIPT
# =============================================================================
# Полная автоматическая установка на чистом Ubuntu/Debian сервере
#
# Использование:
# ./setup_production_server.sh yourdomain.com your@email.com
#
# Автор: MY Network Team
# =============================================================================
set -e # Выход при любой ошибке
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
NC='\033[0m' # No Color
# Логирование
log() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
}
warn() {
echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}"
}
error() {
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}"
exit 1
}
info() {
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
}
header() {
echo -e "${PURPLE}"
echo "=============================================="
echo " $1"
echo "=============================================="
echo -e "${NC}"
}
# Проверка аргументов
if [ $# -lt 2 ]; then
error "Usage: $0 <domain> <email>"
echo "Example: $0 mydomain.com admin@mydomain.com"
exit 1
fi
DOMAIN="$1"
EMAIL="$2"
PROJECT_DIR="/opt/my-uploader-bot"
NGINX_CONFIG="/etc/nginx/sites-available/my-uploader-bot"
SERVICE_USER="myuploader"
header "🚀 УСТАНОВКА MY UPLOADER BOT НА СЕРВЕР $DOMAIN"
log "Домен: $DOMAIN"
log "Email: $EMAIL"
log "Проект будет установлен в: $PROJECT_DIR"
# Проверка root прав
if [[ $EUID -ne 0 ]]; then
error "Этот скрипт должен запускаться с правами root (sudo)"
fi
# Проверка операционной системы
if ! command -v apt-get &> /dev/null; then
error "Этот скрипт поддерживает только Ubuntu/Debian системы"
fi
header "📦 ШАГ 1: ОБНОВЛЕНИЕ СИСТЕМЫ"
log "Обновление списка пакетов..."
apt-get update -y
log "Обновление установленных пакетов..."
apt-get upgrade -y
log "Установка базовых пакетов..."
apt-get install -y \
curl \
wget \
git \
unzip \
software-properties-common \
apt-transport-https \
ca-certificates \
gnupg \
lsb-release \
htop \
nano \
vim \
net-tools \
ufw
header "🐳 ШАГ 2: УСТАНОВКА DOCKER"
# Удаление старых версий Docker
log "Удаление старых версий Docker..."
apt-get remove -y docker docker-engine docker.io containerd runc || true
# Добавление репозитория Docker
log "Добавление Docker репозитория..."
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# Установка Docker
log "Установка Docker..."
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Установка Docker Compose standalone
log "Установка 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
ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
# Запуск и включение Docker
systemctl enable docker
systemctl start docker
log "Docker версия: $(docker --version)"
log "Docker Compose версия: $(docker-compose --version)"
header "🔥 ШАГ 3: НАСТРОЙКА FIREWALL"
log "Настройка UFW firewall..."
# Сброс правил UFW
ufw --force reset
# Базовая политика
ufw default deny incoming
ufw default allow outgoing
# Разрешение SSH (важно для сохранения доступа)
ufw allow 22/tcp comment "SSH"
# Разрешение HTTP и HTTPS
ufw allow 80/tcp comment "HTTP"
ufw allow 443/tcp comment "HTTPS"
# Включение firewall
ufw --force enable
log "Статус firewall:"
ufw status verbose
header "🔒 ШАГ 4: УСТАНОВКА CERTBOT"
log "Установка snapd..."
apt-get install -y snapd
log "Установка Certbot через snap..."
snap install core
snap refresh core
snap install --classic certbot
# Создание symlink
ln -sf /snap/bin/certbot /usr/bin/certbot
log "Certbot версия: $(certbot --version)"
header "👤 ШАГ 5: СОЗДАНИЕ ПОЛЬЗОВАТЕЛЯ СЕРВИСА"
log "Создание пользователя $SERVICE_USER..."
if ! id "$SERVICE_USER" &>/dev/null; then
useradd -r -s /bin/bash -d /home/$SERVICE_USER -m $SERVICE_USER
usermod -aG docker $SERVICE_USER
log "Пользователь $SERVICE_USER создан"
else
log "Пользователь $SERVICE_USER уже существует"
fi
header "📂 ШАГ 6: ПОДГОТОВКА ПРОЕКТА"
log "Создание директории проекта..."
mkdir -p $PROJECT_DIR
cd $PROJECT_DIR
# Если это git репозиторий, клонируем. Иначе копируем текущую директорию
if [ -d "$(dirname $0)/.git" ]; then
log "Клонирование из Git репозитория..."
# Определяем URL репозитория
REPO_URL=$(cd "$(dirname $0)" && git config --get remote.origin.url || echo "")
if [ -n "$REPO_URL" ]; then
git clone "$REPO_URL" .
else
warn "Git репозиторий не найден, копирую файлы локально..."
cp -r "$(dirname $0)"/* .
fi
else
log "Копирование файлов проекта..."
cp -r "$(dirname $0)"/* .
fi
# Установка владельца
chown -R $SERVICE_USER:$SERVICE_USER $PROJECT_DIR
header "⚙️ ШАГ 7: НАСТРОЙКА NGINX"
log "Установка Nginx..."
apt-get install -y nginx
# Остановка Nginx для получения сертификатов
systemctl stop nginx
log "Создание конфигурации Nginx..."
./scripts/create_nginx_config.sh $DOMAIN $PROJECT_DIR
header "🔐 ШАГ 8: ПОЛУЧЕНИЕ SSL СЕРТИФИКАТОВ"
log "Получение Let's Encrypt сертификатов для $DOMAIN..."
# Остановка процессов на портах 80/443
fuser -k 80/tcp 2>/dev/null || true
fuser -k 443/tcp 2>/dev/null || true
# Получение сертификатов
certbot certonly \
--standalone \
--non-interactive \
--agree-tos \
--email "$EMAIL" \
--domains "$DOMAIN,www.$DOMAIN" \
--no-eff-email
log "Настройка автообновления сертификатов..."
systemctl enable certbot.timer
systemctl start certbot.timer
# Проверка автообновления
certbot renew --dry-run
header "🔧 ШАГ 9: КОНФИГУРАЦИЯ ПРОЕКТА"
log "Создание production конфигурации..."
./scripts/setup_production_env.sh $DOMAIN $EMAIL
header "📦 ШАГ 10: КОПИРОВАНИЕ ДОПОЛНИТЕЛЬНЫХ МОДУЛЕЙ"
log "Настройка дополнительных модулей..."
./scripts/setup_modules.sh $PROJECT_DIR
header "🐳 ШАГ 11: ЗАПУСК DOCKER СЕРВИСОВ"
log "Запуск Docker Compose в production режиме..."
cd $PROJECT_DIR
# Запуск от имени пользователя сервиса
sudo -u $SERVICE_USER docker-compose -f docker-compose.production.yml pull
sudo -u $SERVICE_USER docker-compose -f docker-compose.production.yml build --no-cache
sudo -u $SERVICE_USER docker-compose -f docker-compose.production.yml up -d
log "Ожидание запуска сервисов..."
sleep 30
# Проверка статуса
log "Статус Docker сервисов:"
sudo -u $SERVICE_USER docker-compose -f docker-compose.production.yml ps
header "🌐 ШАГ 12: ЗАПУСК NGINX"
log "Включение конфигурации Nginx..."
ln -sf $NGINX_CONFIG /etc/nginx/sites-enabled/my-uploader-bot
rm -f /etc/nginx/sites-enabled/default
log "Проверка конфигурации Nginx..."
nginx -t
log "Запуск Nginx..."
systemctl enable nginx
systemctl start nginx
header "🔄 ШАГ 13: НАСТРОЙКА АВТОЗАПУСКА"
log "Создание systemd сервисов..."
./scripts/create_systemd_services.sh $PROJECT_DIR $SERVICE_USER
header "✅ ШАГ 14: ФИНАЛЬНАЯ ПРОВЕРКА"
log "Проверка всех сервисов..."
# Проверка Docker
if sudo -u $SERVICE_USER docker-compose -f $PROJECT_DIR/docker-compose.production.yml ps | grep -q "Up"; then
log "✅ Docker сервисы: Работают"
else
error "❌ Docker сервисы: Не запущены"
fi
# Проверка Nginx
if systemctl is-active --quiet nginx; then
log "✅ Nginx: Работает"
else
error "❌ Nginx: Не запущен"
fi
# Проверка SSL
if curl -sf "https://$DOMAIN/health" > /dev/null; then
log "✅ SSL сертификат: Работает"
else
warn "⚠️ SSL проверка не прошла (сервис может еще запускаться)"
fi
# Проверка API
log "Ожидание полного запуска API..."
sleep 60
if curl -sf "https://$DOMAIN/api/my/health" > /dev/null; then
log "✅ MY Network API: Работает"
else
warn "⚠️ MY Network API пока не доступен"
fi
header "🎉 УСТАНОВКА ЗАВЕРШЕНА!"
info "=== ИНФОРМАЦИЯ О РАЗВЕРТЫВАНИИ ==="
info "Домен: https://$DOMAIN"
info "API: https://$DOMAIN/api/"
info "Мониторинг: https://$DOMAIN/api/my/monitor/"
info "Health Check: https://$DOMAIN/health"
info "Директория проекта: $PROJECT_DIR"
info "Пользователь: $SERVICE_USER"
info "Nginx конфиг: $NGINX_CONFIG"
info "=== ПОЛЕЗНЫЕ КОМАНДЫ ==="
info "Просмотр логов: cd $PROJECT_DIR && sudo -u $SERVICE_USER docker-compose -f docker-compose.production.yml logs -f"
info "Перезапуск: cd $PROJECT_DIR && sudo -u $SERVICE_USER docker-compose -f docker-compose.production.yml restart"
info "Обновление: cd $PROJECT_DIR && git pull && sudo -u $SERVICE_USER docker-compose -f docker-compose.production.yml build --no-cache && sudo -u $SERVICE_USER docker-compose -f docker-compose.production.yml up -d"
info "=== БЕЗОПАСНОСТЬ ==="
info "Firewall: ufw status"
info "SSL сертификаты: ls -la /etc/letsencrypt/live/$DOMAIN/"
info "Автообновление SSL: systemctl status certbot.timer"
log "🚀 Проект успешно развернут на https://$DOMAIN"
log "📝 Не забудьте настроить Telegram токены в $PROJECT_DIR/.env.production"
exit 0