first commit

This commit is contained in:
2025-06-18 21:22:55 +03:00
commit ad4d215f04
22 changed files with 3762 additions and 0 deletions

406
deploy.sh Normal file
View File

@@ -0,0 +1,406 @@
#!/bin/bash
# Скрипт для развертывания парсера
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="/opt/morele_parser"
SERVICE_USER="morele"
PYTHON_VERSION="3.11"
echo "🚀 Deploying Morele Parser..."
# Функция для вывода сообщений
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# Проверка прав root
if [[ $EUID -eq 0 ]]; then
echo "❌ Don't run this script as root"
exit 1
fi
# Установка системных зависимостей
install_system_deps() {
log "Installing system dependencies..."
sudo apt update
sudo apt install -y \
python${PYTHON_VERSION} \
python${PYTHON_VERSION}-venv \
python${PYTHON_VERSION}-dev \
nginx \
sqlite3 \
supervisor \
curl \
wget \
unzip \
git
}
# Создание пользователя
create_user() {
if ! id "$SERVICE_USER" &>/dev/null; then
log "Creating user $SERVICE_USER..."
sudo useradd -r -s /bin/bash -d $PROJECT_DIR $SERVICE_USER
fi
}
# Создание директорий
create_directories() {
log "Creating directories..."
sudo mkdir -p $PROJECT_DIR
sudo mkdir -p $PROJECT_DIR/{data,images,feeds,logs,backups}
sudo mkdir -p /var/log/morele_parser
sudo chown -R $SERVICE_USER:$SERVICE_USER $PROJECT_DIR
sudo chown -R $SERVICE_USER:$SERVICE_USER /var/log/morele_parser
}
# Копирование файлов
copy_files() {
log "Copying files..."
sudo cp -r $SCRIPT_DIR/* $PROJECT_DIR/
sudo chown -R $SERVICE_USER:$SERVICE_USER $PROJECT_DIR
}
# Создание виртуального окружения
setup_venv() {
log "Setting up Python virtual environment..."
sudo -u $SERVICE_USER python${PYTHON_VERSION} -m venv $PROJECT_DIR/venv
sudo -u $SERVICE_USER $PROJECT_DIR/venv/bin/pip install --upgrade pip
sudo -u $SERVICE_USER $PROJECT_DIR/venv/bin/pip install -r $PROJECT_DIR/requirements.txt
}
# Настройка конфигурации
setup_config() {
log "Setting up configuration..."
if [ ! -f "$PROJECT_DIR/config.yaml" ]; then
sudo -u $SERVICE_USER $PROJECT_DIR/venv/bin/python $PROJECT_DIR/main.py --help > /dev/null
log "Default config created. Please edit $PROJECT_DIR/config.yaml"
fi
}
# Настройка Supervisor
setup_supervisor() {
log "Setting up Supervisor..."
sudo tee /etc/supervisor/conf.d/morele_parser.conf > /dev/null <<EOF
[program:morele_parser_admin]
command=$PROJECT_DIR/venv/bin/python $PROJECT_DIR/main.py --admin --host 127.0.0.1 --port 5000
directory=$PROJECT_DIR
user=$SERVICE_USER
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/morele_parser/admin.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=3
environment=PYTHONPATH="$PROJECT_DIR"
[program:morele_parser_monitor]
command=$PROJECT_DIR/venv/bin/python $PROJECT_DIR/cli_tools.py monitor
directory=$PROJECT_DIR
user=$SERVICE_USER
autostart=false
autorestart=false
startsecs=0
redirect_stderr=true
stdout_logfile=/var/log/morele_parser/monitor.log
EOF
sudo supervisorctl reread
sudo supervisorctl update
}
# Настройка Nginx
setup_nginx() {
log "Setting up Nginx..."
# Резервная копия существующей конфигурации
if [ -f "/etc/nginx/sites-available/default" ]; then
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
fi
# Создание конфигурации для парсера
sudo tee /etc/nginx/sites-available/morele_parser > /dev/null <<EOF
server {
listen 80;
server_name _;
client_max_body_size 50M;
# Раздача изображений
location /images/ {
alias $PROJECT_DIR/images/;
expires 7d;
add_header Cache-Control "public, immutable";
}
# Раздача фидов
location /feeds/ {
alias $PROJECT_DIR/feeds/;
add_header Access-Control-Allow-Origin "*";
}
# Админка
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}
EOF
# Активация сайта
sudo ln -sf /etc/nginx/sites-available/morele_parser /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
# Проверка конфигурации
sudo nginx -t
}
# Настройка cron
setup_cron() {
log "Setting up cron jobs..."
sudo -u $SERVICE_USER crontab -l > /tmp/morele_cron 2>/dev/null || true
cat >> /tmp/morele_cron <<EOF
# Morele Parser Jobs
0 2 * * * cd $PROJECT_DIR && $PROJECT_DIR/venv/bin/python main.py --parse >> logs/cron.log 2>&1
0 3 * * * cd $PROJECT_DIR && $PROJECT_DIR/venv/bin/python main.py --generate-feed >> logs/cron.log 2>&1
0 4 * * 0 cd $PROJECT_DIR && $PROJECT_DIR/venv/bin/python cli_tools.py backup --backup-dir backups >> logs/cron.log 2>&1
0 5 * * 0 cd $PROJECT_DIR && $PROJECT_DIR/venv/bin/python cli_tools.py cleanup --days 30 --optimize >> logs/cron.log 2>&1
EOF
sudo -u $SERVICE_USER crontab /tmp/morele_cron
rm /tmp/morele_cron
}
# Настройка логротации
setup_logrotate() {
log "Setting up log rotation..."
sudo tee /etc/logrotate.d/morele_parser > /dev/null <<EOF
$PROJECT_DIR/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
copytruncate
su $SERVICE_USER $SERVICE_USER
}
/var/log/morele_parser/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
copytruncate
postrotate
supervisorctl restart morele_parser_admin
endscript
}
EOF
}
# Запуск сервисов
start_services() {
log "Starting services..."
sudo systemctl enable supervisor
sudo systemctl start supervisor
sudo systemctl enable nginx
sudo systemctl restart nginx
sudo supervisorctl start morele_parser_admin
}
# Проверка установки
verify_installation() {
log "Verifying installation..."
# Проверка админки
if curl -s http://localhost:5000 > /dev/null; then
log "✅ Admin panel is running"
else
log "❌ Admin panel is not responding"
fi
# Проверка nginx
if curl -s http://localhost/health | grep -q "healthy"; then
log "✅ Nginx is working"
else
log "❌ Nginx is not working"
fi
# Проверка supervisor
if sudo supervisorctl status morele_parser_admin | grep -q "RUNNING"; then
log "✅ Supervisor service is running"
else
log "❌ Supervisor service is not running"
fi
}
# Основная функция
main() {
log "Starting deployment process..."
install_system_deps
create_user
create_directories
copy_files
setup_venv
setup_config
setup_supervisor
setup_nginx
setup_cron
setup_logrotate
start_services
verify_installation
log "🎉 Deployment completed!"
log "Admin panel: http://your-server-ip/"
log "Please edit configuration: $PROJECT_DIR/config.yaml"
log "Check logs: tail -f /var/log/morele_parser/admin.log"
}
# Проверка аргументов
case "${1:-}" in
"install")
main
;;
"update")
copy_files
sudo supervisorctl restart morele_parser_admin
log "Updated successfully"
;;
"status")
sudo supervisorctl status
sudo systemctl status nginx
;;
"logs")
tail -f /var/log/morele_parser/admin.log
;;
*)
echo "Usage: $0 {install|update|status|logs}"
echo " install - Full installation"
echo " update - Update code only"
echo " status - Show service status"
echo " logs - Show logs"
exit 1
;;
esac
# ===== update.sh =====
#!/bin/bash
# Скрипт для обновления парсера
set -e
PROJECT_DIR="/opt/morele_parser"
SERVICE_USER="morele"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# Создание резервной копии
backup_current() {
log "Creating backup..."
BACKUP_DIR="$PROJECT_DIR/backups/update_$(date +%Y%m%d_%H%M%S)"
sudo -u $SERVICE_USER mkdir -p "$BACKUP_DIR"
sudo -u $SERVICE_USER cp -r $PROJECT_DIR/{*.py,modules,config.yaml} "$BACKUP_DIR/" 2>/dev/null || true
sudo -u $SERVICE_USER $PROJECT_DIR/venv/bin/python $PROJECT_DIR/cli_tools.py backup --backup-dir "$BACKUP_DIR"
log "Backup created: $BACKUP_DIR"
}
# Обновление кода
update_code() {
log "Updating code..."
# Здесь можно добавить git pull или копирование новых файлов
# git -C $PROJECT_DIR pull origin main
# Или копирование из source директории
if [ -d "./source" ]; then
sudo cp -r ./source/* $PROJECT_DIR/
sudo chown -R $SERVICE_USER:$SERVICE_USER $PROJECT_DIR
fi
}
# Обновление зависимостей
update_dependencies() {
log "Updating dependencies..."
sudo -u $SERVICE_USER $PROJECT_DIR/venv/bin/pip install --upgrade pip
sudo -u $SERVICE_USER $PROJECT_DIR/venv/bin/pip install -r $PROJECT_DIR/requirements.txt --upgrade
}
# Миграция базы данных (если нужно)
migrate_database() {
log "Checking database migrations..."
# Здесь можно добавить скрипты миграции БД
# sudo -u $SERVICE_USER $PROJECT_DIR/venv/bin/python $PROJECT_DIR/migrate.py
}
# Перезапуск сервисов
restart_services() {
log "Restarting services..."
sudo supervisorctl restart morele_parser_admin
sudo systemctl reload nginx
}
# Проверка обновления
verify_update() {
log "Verifying update..."
sleep 5
if curl -s http://localhost:5000 > /dev/null; then
log "✅ Update successful"
else
log "❌ Update failed, check logs"
sudo supervisorctl status
exit 1
fi
}
main() {
log "Starting update process..."
backup_current
update_code
update_dependencies
migrate_database
restart_services
verify_update
log "🎉 Update completed successfully!"
}
main