From f80afab9e853ce03582a78eabd110a15a207432b Mon Sep 17 00:00:00 2001 From: qananasikq Date: Sat, 18 Apr 2026 00:39:20 +0300 Subject: [PATCH] deploy: add VPS bootstrap (WSL2+Docker) and lightweight compose overlay for 4GB RAM --- docker-compose.vps.yml | 76 ++++++++++++++++++++++++ scripts/vps_bootstrap.ps1 | 121 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 docker-compose.vps.yml create mode 100644 scripts/vps_bootstrap.ps1 diff --git a/docker-compose.vps.yml b/docker-compose.vps.yml new file mode 100644 index 0000000..ecf5694 --- /dev/null +++ b/docker-compose.vps.yml @@ -0,0 +1,76 @@ +# Overlay для слабого VPS (4 vCPU, 4 GB RAM). +# Применять как: docker compose -f docker-compose.yml -f docker-compose.vps.yml up -d --build +# +# Главное: +# - worker concurrency=1, max-tasks-per-child=3 (Chromium быстро течёт) +# - IAAI_PARALLEL_TABS=4 (важно: каждая вкладка ~80-150 MB) +# - IAAI_MAX_PAGES_PER_RUN=200, IAAI_MAX_VEHICLES_PER_RUN=2000 — короткие тестовые прогоны +# - hard memory limits на каждый сервис + +x-vps-env: &vps-env + CELERY_WORKER_CONCURRENCY: "1" + CELERY_WORKER_MAX_TASKS_PER_CHILD: "3" + CELERY_WORKER_MAX_MEMORY_PER_CHILD_KB: "350000" # ~350 MB → перезапуск процесса + IAAI_PARALLEL_TABS: "4" + IAAI_BLOCK_RESOURCES: "true" + IAAI_MAX_PAGES_PER_RUN: "200" + IAAI_MAX_VEHICLES_PER_RUN: "2000" + IAAI_LISTING_SEGMENTS: "auto" + IAAI_HUMAN_PACE_ENABLED: "true" + CELERY_BATCH_SIZE: "100" + CELERY_TASK_SOFT_TIME_LIMIT: "1500" # 25 мин — короче бутстрап-сегмент + CELERY_TASK_TIME_LIMIT: "1800" # 30 мин + CELERY_BROKER_VISIBILITY_TIMEOUT: "3600" + IAAI_DATABASE_POOL_SIZE: "3" + IAAI_DATABASE_MAX_OVERFLOW: "2" + +services: + postgres: + mem_limit: 512m + mem_reservation: 256m + command: + - "postgres" + - "-c" + - "shared_buffers=128MB" + - "-c" + - "effective_cache_size=384MB" + - "-c" + - "work_mem=8MB" + - "-c" + - "maintenance_work_mem=64MB" + - "-c" + - "max_connections=50" + + redis: + mem_limit: 192m + mem_reservation: 64m + command: > + redis-server + --appendonly yes + --save 60 1000 + --maxmemory 128mb + --maxmemory-policy allkeys-lru + + api: + mem_limit: 384m + mem_reservation: 128m + environment: + <<: *vps-env + + worker: + mem_limit: 1800m + mem_reservation: 512m + environment: + <<: *vps-env + # Переопределяем, чтобы concurrency=1 и max-tasks-per-child=3 точно применились + command: > + celery -A iaai_scraper.worker.celery_app worker + --loglevel=info --concurrency=1 --pool=prefork + --pidfile=/tmp/celery-worker.pid + -Q scraping --max-tasks-per-child=3 + + beat: + mem_limit: 256m + mem_reservation: 64m + environment: + <<: *vps-env diff --git a/scripts/vps_bootstrap.ps1 b/scripts/vps_bootstrap.ps1 new file mode 100644 index 0000000..0ba6939 --- /dev/null +++ b/scripts/vps_bootstrap.ps1 @@ -0,0 +1,121 @@ +# ============================================================ +# IAAI scraper — bootstrap для Windows 10 VPS (4 vCPU / 4 GB RAM) +# Запускать в PowerShell ОТ ИМЕНИ АДМИНИСТРАТОРА. +# +# Использование (через RDP): +# 1) Откройте PowerShell как администратор +# 2) Set-ExecutionPolicy -Scope Process Bypass -Force +# 3) iwr -useb https://gitea.millionmiles.ru/qananasikq/iaai-parser/raw/branch/main/scripts/vps_bootstrap.ps1 | iex +# (или скопируйте файл вручную и: .\vps_bootstrap.ps1) +# +# Скрипт: +# - Включает WSL2 + ставит Ubuntu 22.04 (если ещё нет) +# - Внутри Ubuntu ставит Docker Engine + Compose plugin + git +# - Клонирует репо в /opt/iaai-parser +# - Поднимает стек через docker-compose.vps.yml +# ============================================================ + +$ErrorActionPreference = "Stop" + +function Step($msg) { Write-Host "`n=== $msg ===" -ForegroundColor Cyan } + +if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { + throw "Run this script as Administrator (правый клик по PowerShell → 'Запуск от имени администратора')" +} + +# --- 1. WSL2 + Ubuntu ---------------------------------------- +Step "Checking WSL" +$wslList = wsl --list --quiet 2>$null +$ubuntu = $null +if ($wslList) { + $ubuntu = $wslList | Where-Object { $_ -match "Ubuntu" } | Select-Object -First 1 +} + +if (-not $ubuntu) { + Step "Installing WSL2 + Ubuntu-22.04 (this will take a few minutes; reboot may be required)" + wsl --install -d Ubuntu-22.04 --no-launch + Write-Host "WSL installation triggered. If a reboot is required, reboot, then re-run this script." -ForegroundColor Yellow + Write-Host "After Ubuntu first-launches, set username 'iaai' and any password." -ForegroundColor Yellow + Write-Host "Then re-run: .\vps_bootstrap.ps1" -ForegroundColor Yellow + exit 0 +} + +Write-Host "WSL distro found: $ubuntu" + +# Чтобы WSL2 не сожрал всю RAM, ограничим до 2.5 GB +$wslConfig = "$env:USERPROFILE\.wslconfig" +if (-not (Test-Path $wslConfig)) { + Step "Writing $wslConfig (memory=2500MB, processors=3, swap=1500MB)" + @" +[wsl2] +memory=2500MB +processors=3 +swap=1500MB +localhostForwarding=true +"@ | Out-File -FilePath $wslConfig -Encoding ASCII + Write-Host "Restarting WSL to apply config..." + wsl --shutdown + Start-Sleep -Seconds 5 +} + +# --- 2. Внутри WSL: docker + git + clone + up ---------------- +Step "Bootstrapping Ubuntu (docker engine, git, clone)" + +$bash = @' +set -euo pipefail + +if ! command -v docker >/dev/null 2>&1; then + echo "[bootstrap] installing docker engine + compose plugin" + sudo -n apt-get update -y + sudo -n apt-get install -y ca-certificates curl gnupg git + sudo -n install -m 0755 -d /etc/apt/keyrings + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo -n gpg --dearmor -o /etc/apt/keyrings/docker.gpg + sudo -n chmod a+r /etc/apt/keyrings/docker.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo -n tee /etc/apt/sources.list.d/docker.list >/dev/null + sudo -n apt-get update -y + sudo -n DEBIAN_FRONTEND=noninteractive apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + sudo -n usermod -aG docker "$USER" + sudo -n service docker start || true +fi + +# WSL2 systemd workaround: убедимся что dockerd запущен +if ! sudo -n service docker status >/dev/null 2>&1; then + sudo -n service docker start +fi + +if [ ! -d /opt/iaai-parser/.git ]; then + sudo -n mkdir -p /opt/iaai-parser + sudo -n chown -R "$USER:$USER" /opt/iaai-parser + git clone https://gitea.millionmiles.ru/qananasikq/iaai-parser.git /opt/iaai-parser +else + cd /opt/iaai-parser && git fetch --all --prune && git reset --hard origin/main +fi + +cd /opt/iaai-parser +git log -1 --oneline + +if [ ! -f .env ]; then + echo "[bootstrap] WARNING: .env missing — copy your .env to /opt/iaai-parser/.env, then re-run 'docker compose -f docker-compose.yml -f docker-compose.vps.yml up -d --build'" + exit 0 +fi + +echo "[bootstrap] docker compose build + up (vps overlay)" +sudo -n docker compose -f docker-compose.yml -f docker-compose.vps.yml build +sudo -n docker compose -f docker-compose.yml -f docker-compose.vps.yml up -d +sleep 5 +sudo -n docker compose -f docker-compose.yml -f docker-compose.vps.yml ps +'@ + +# Заворачиваем в одну строку для wsl +$tmpScript = "$env:TEMP\wsl_bootstrap.sh" +$bash | Set-Content -Path $tmpScript -Encoding ASCII -NoNewline + +# Копируем в WSL и запускаем +wsl -d $ubuntu -- bash -c "cp /mnt/c/Users/$env:USERNAME/AppData/Local/Temp/wsl_bootstrap.sh ~/bootstrap.sh && chmod +x ~/bootstrap.sh && ~/bootstrap.sh" + +Step "Done" +Write-Host "Дальше:" +Write-Host " 1) Если выведено 'WARNING: .env missing' — создайте /opt/iaai-parser/.env (см. README), затем:" +Write-Host " wsl -d Ubuntu-22.04 -- bash -c 'cd /opt/iaai-parser && sudo docker compose -f docker-compose.yml -f docker-compose.vps.yml up -d --build'" +Write-Host " 2) Логи: wsl -d Ubuntu-22.04 -- bash -c 'cd /opt/iaai-parser && sudo docker compose -f docker-compose.yml -f docker-compose.vps.yml logs -f --tail=80'" +Write-Host " 3) Статус: wsl -d Ubuntu-22.04 -- bash -c 'cd /opt/iaai-parser && sudo docker compose -f docker-compose.yml -f docker-compose.vps.yml ps'"