348 lines
11 KiB
Bash
348 lines
11 KiB
Bash
#!/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 |