# VK Parser New Core Первый чистый слой проекта: - админка с источниками, пользователями, воркерами и raw-лентой; - VK parser worker; - VK storage uploader worker; - PostgreSQL job queue. Старый проект лежит в `original_project/` как справочник. Новый код живёт в `src/vk_parser_app/`. ## Что нужно на сервере Ubuntu 22.04/24.04: ```bash sudo apt update sudo apt install -y python3 python3-venv python3-pip postgresql postgresql-contrib nginx git curl ``` Для будущей работы с видео: ```bash sudo apt install -y ffmpeg ``` ## БД Пример: ```bash sudo -u postgres psql ``` ```sql CREATE DATABASE vk_parser; CREATE USER vk_parser_user WITH PASSWORD 'CHANGE_ME'; GRANT ALL PRIVILEGES ON DATABASE vk_parser TO vk_parser_user; \c vk_parser GRANT ALL ON SCHEMA public TO vk_parser_user; ``` ## Установка проекта ```bash cd /opt sudo git clone vk-parser sudo chown -R $USER:$USER /opt/vk-parser cd /opt/vk-parser python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt cp .env.example .env ``` Заполнить `.env`: ```env APP_SECRET_KEY=long-random-string ADMIN_BOOTSTRAP_LOGIN=admin ADMIN_BOOTSTRAP_PASSWORD=long-admin-password DB_HOST=localhost DB_PORT=5432 DB_NAME=vk_parser DB_USER=vk_parser_user DB_PASSWORD=... VK_ACCESS_TOKEN=... VK_STORAGE_GROUP_ID=239548476 ``` Важно: для `wall.post`, `wall.edit`, `photos.saveWallPhoto` нужен VK user token пользователя с правами в storage-группе. Community token для этого контура не подходит. ## Миграции ```bash PYTHONPATH=src .venv/bin/python scripts/apply_migrations.py ``` Первый админ создаётся из `ADMIN_BOOTSTRAP_LOGIN` / `ADMIN_BOOTSTRAP_PASSWORD` при старте админки. ## Проверка VK storage Без фото: ```bash PYTHONPATH=src .venv/bin/python scripts/vk_storage_spike.py ``` С фото: ```bash cp /path/to/photo.jpg sample_photo.jpg PYTHONPATH=src .venv/bin/python scripts/vk_storage_spike.py ``` Скрипт должен вывести ссылку вида: ```text https://vk.com/wall-239548476_123 ``` После этого надо руками проверить: - пост создан от имени storage-группы; - админ/редактор группы может открыть и отредактировать пост; - вложенное фото видно в браузере. ## Site Parser Сайты обрабатывает отдельный stateless-воркер из `site_parser_worker`. Основная коробка хранит источники, расписание, RuCaptcha-ключ и браузерное состояние, а воркер возвращает нормализованные материалы в существующий пайплайн. Сейчас поддерживается RSS/Atom, включая Cloudflare: ```json { "format": "rss", "access": "auto", "max_items": 20 } ``` Если RSS отдаёт только заголовки и ссылки, можно явно дочитывать страницы записей: ```json { "format": "rss", "access": "cloudflare", "max_items": 20, "follow_links": true, "content_selector": "article.full", "text_selector": ".field--name-body", "min_text_length": 50 } ``` В глобальном разделе `Site Parser` задаются URL воркера, его токен, ключ RuCaptcha и таймаут. Внешний модуль запускается командой: ```bash cd site_parser_worker printf 'WORKER_TOKEN=replace-me\n' > .env chmod 600 .env docker-compose up -d --build docker-compose ps ``` ## Запуск локально Админка: ```bash PYTHONPATH=src .venv/bin/uvicorn vk_parser_app.admin:app --host 0.0.0.0 --port 8080 ``` Парсер: ```bash PYTHONPATH=src .venv/bin/python -m vk_parser_app.workers.parser ``` Media uploader: ```bash PYTHONPATH=src .venv/bin/python -m vk_parser_app.workers.media_uploader ``` ## systemd units Минимальный `vk-admin.service`: ```ini [Unit] Description=VK Parser Admin After=network.target postgresql.service [Service] WorkingDirectory=/opt/vk-parser Environment=PYTHONPATH=/opt/vk-parser/src ExecStart=/opt/vk-parser/.venv/bin/uvicorn vk_parser_app.admin:app --host 0.0.0.0 --port 8080 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target ``` `vk-parser.service`: ```ini [Unit] Description=VK Parser Worker After=network.target postgresql.service [Service] WorkingDirectory=/opt/vk-parser Environment=PYTHONPATH=/opt/vk-parser/src ExecStart=/opt/vk-parser/.venv/bin/python -m vk_parser_app.workers.parser Restart=always RestartSec=10 [Install] WantedBy=multi-user.target ``` `media-uploader.service`: ```ini [Unit] Description=Media Uploader Worker After=network.target postgresql.service [Service] WorkingDirectory=/opt/vk-parser Environment=PYTHONPATH=/opt/vk-parser/src ExecStart=/opt/vk-parser/.venv/bin/python -m vk_parser_app.workers.media_uploader Restart=always RestartSec=10 [Install] WantedBy=multi-user.target ``` ## Текущий pipeline ```text sources(vk/site) -> vk-parser -> raw_posts + raw_post_media -> jobs(type='media.storage.copy') -> media-uploader -> локальный Telegram Bot API -> raw_posts.storage_post_url ``` Фото и видео загружаются в Telegram media storage; исходные URL остаются в `raw_post_media`.