docs: document external site parser

This commit is contained in:
Your Name
2026-08-10 23:28:47 +05:00
parent f866a13a8a
commit 01eea99c88
3 changed files with 142 additions and 3 deletions
+56 -1
View File
@@ -196,7 +196,8 @@
Источники для парсинга. Источники для парсинга.
Сейчас реально используется только `platform='vk'`, но схема заложена под другие площадки. Используются `platform='vk'` и `platform='site'`. Для сайта конфигурация
конкретного адаптера хранится вместе с источником в `settings_json`.
Важные поля: Важные поля:
@@ -215,9 +216,14 @@
- `parse_from` - `parse_from`
- `priority` - `priority`
- `archived_at` - `archived_at`
- `settings_json` для `platform='site'`
`tag` нужен для будущих хэштегов и финального оформления. `tag` нужен для будущих хэштегов и финального оформления.
Для сайта отсутствие или ошибка JSON-конфига блокирует запуск с видимой
ошибкой источника. Конфиг задаёт способ получения именно этого сайта; общее
расписание и секреты остаются в `app_settings`.
### 5.4. `raw_posts` ### 5.4. `raw_posts`
Главная таблица жизненного цикла поста. Главная таблица жизненного цикла поста.
@@ -558,6 +564,37 @@ Retention: записи старше 30 дней удаляются при ст
8. Сохраняет raw post и media. 8. Сохраняет raw post и media.
9. Создаёт job `media.storage.copy`. 9. Создаёт job `media.storage.copy`.
### 7.1.1. Источники сайтов
Тот же scheduling loop обрабатывает `platform='site'`, но сетевую работу
делегирует внешнему stateless-модулю Site Parser. Основная коробка хранит БД,
источники, конфиги, расписание, статусы и очередь. Внешний модуль получает один
запрос и возвращает унифицированный JSON с текстом, исходной ссылкой, датой и
медиа. Готовые источники запускаются строго последовательно.
Настройки основной коробки:
- `site_parser_url`
- `site_parser_token`
- `site_parser_rucaptcha_token`
- `site_parser_timeout_sec`
- `site_parser_interval_minutes`
- `site_parser_min_text_length`
Персональный `min_text_length` в JSON источника переопределяет общий порог.
Проверяется только тело материала: заголовок не помогает пройти фильтр.
Записи без достаточного текста, включая video-only, не сохраняются и не
попадают в media uploader.
`access='cloudflare'` включает Playwright и RuCaptcha для конкретного
источника; обычные RSS и сайты идут без браузера. Полученные `cf_clearance` и
точный User-Agent браузера сохраняются в runtime state источника и повторно
используются media uploader при скачивании защищённых картинок.
Внешний модуль работает в LXC `108` (`192.168.1.113:8080`) через Docker
Compose `/opt/site-parser/docker-compose.yml`. Репозиторный compose находится
в `site_parser_worker/docker-compose.yml`.
### 7.2. Политика мусорных постов ### 7.2. Политика мусорных постов
Настройки: Настройки:
@@ -1091,6 +1128,24 @@ Worker учитывает:
- active - active
- parse_from - parse_from
Для сайта важны:
- platform `site`
- name
- url
- active
- обязательный JSON-конфиг конкретного источника
Пример рабочего PopularAirsoft:
```json
{"format":"rss","access":"cloudflare","max_items":10,"min_text_length":50}
```
Ошибки конфигурации, внешнего worker или сайта показываются в статусе
источника. После загрузки защищённые изображения отображаются в raw/editor по
авторизованному маршруту `/raw/media/{media_id}` из Telegram storage.
### 12.3. Raw ### 12.3. Raw
Raw-страница показывает: Raw-страница показывает:
+29 -1
View File
@@ -1,6 +1,6 @@
# RAA deployment # RAA deployment
Last updated: 2026-08-04. Last updated: 2026-08-10.
RAA is not a separate code project anymore. The source of truth for code and RAA is not a separate code project anymore. The source of truth for code and
documentation is: documentation is:
@@ -26,6 +26,7 @@ continue feature work there.
- Destination: `raa-fn8`, CTID `105`, IP `192.168.1.105` - Destination: `raa-fn8`, CTID `105`, IP `192.168.1.105`
- Edge proxy: Caddy in CTID `110` proxies `raa.panel.f-n8.ru` to Coolify Traefik at `192.168.1.105:80` - Edge proxy: Caddy in CTID `110` proxies `raa.panel.f-n8.ru` to Coolify Traefik at `192.168.1.105:80`
- Health check: `https://raa.panel.f-n8.ru/health` - Health check: `https://raa.panel.f-n8.ru/health`
- Current verified deploy: `f866a13a8a83598e26a7a6a3406b8bc1c01c9a80`
## Per-Project Settings ## Per-Project Settings
@@ -55,6 +56,10 @@ Database settings:
- `vk_poster_access_token` is the RAA community token - `vk_poster_access_token` is the RAA community token
- `site_poster_enabled=false` - `site_poster_enabled=false`
- `site_poster_provider=""` until a website adapter is configured - `site_poster_provider=""` until a website adapter is configured
- Site parser settings are stored here as well:
`site_parser_url`, `site_parser_token`, `site_parser_rucaptcha_token`,
`site_parser_timeout_sec`, `site_parser_interval_minutes`, and
`site_parser_min_text_length`.
- Optional social text headers/footers: - Optional social text headers/footers:
- `tg_poster_header_text` / `tg_poster_footer_text` - `tg_poster_header_text` / `tg_poster_footer_text`
- `vk_poster_header_text` / `vk_poster_footer_text` - `vk_poster_header_text` / `vk_poster_footer_text`
@@ -83,6 +88,29 @@ AI qualifier/writer are configured with user-provided token, models, and prompts
but both the worker controls and double-safety settings were still off. Turning but both the worker controls and double-safety settings were still off. Turning
them on will spend LLM tokens and process the pending RAA raw posts. them on will spend LLM tokens and process the pending RAA raw posts.
## Website Sources
Website sources use the existing `vk-parser` scheduling loop but are sent one
at a time to a stateless external worker in LXC `108` (`192.168.1.113:8080`).
All source records, JSON configs, schedules, errors, raw posts, and media state
remain in the RAA database. The worker is managed by Docker Compose from
`/opt/site-parser` and should be healthy as `site-parser-worker`.
PopularAirsoft source id `72`:
- URL: `https://popularairsoft.com/rss.xml`
- Config: `{"format":"rss","access":"cloudflare","max_items":10,"min_text_length":50}`
- `access='cloudflare'` deliberately starts the browser/RuCaptcha flow before
fetching the RSS.
- Keep `follow_links` disabled for this feed. Nine current entries have no
body, only title/video, and are intentionally filtered before media upload.
- Cloudflare cookies and browser User-Agent are reused by `media-uploader` for
protected images.
- Admin image previews use authenticated Telegram-backed
`/raw/media/{media_id}` URLs.
- Verified 2026-08-10: source `ok`; raw post `102` is `storage_ready`; four
images are `uploaded`. The AI later rejected the content as non-target.
## RAA Categories ## RAA Categories
RAA categories live in the RAA `content_categories` table. The UI has only RAA categories live in the RAA `content_categories` table. The UI has only
+57 -1
View File
@@ -1,6 +1,6 @@
# N8 Parser: current state # N8 Parser: current state
Last updated: 2026-08-03 Last updated: 2026-08-10
This file is the short handoff state for future Codex threads. Read this first before touching the project, so the whole chat history does not need to be carried forward. This file is the short handoff state for future Codex threads. Read this first before touching the project, so the whole chat history does not need to be carried forward.
@@ -37,6 +37,8 @@ Current runtime is local infrastructure, not the old VPS.
1. Sources are configured in admin. 1. Sources are configured in admin.
2. VK parser reads enabled sources and stores raw posts. 2. VK parser reads enabled sources and stores raw posts.
The same worker also dispatches `platform='site'` sources to the external
site-parser module one at a time.
3. Media/storage uploader sends raw post copies to Telegram storage and stores media metadata. 3. Media/storage uploader sends raw post copies to Telegram storage and stores media metadata.
4. AI qualifier scores raw posts and marks accepted/rejected/maybe. 4. AI qualifier scores raw posts and marks accepted/rejected/maybe.
5. AI writer rewrites accepted posts into editor-ready drafts. 5. AI writer rewrites accepted posts into editor-ready drafts.
@@ -75,6 +77,60 @@ canonical git repository as FN-8. Code work for both projects must happen in
(`raa-sender`) remains a valid legacy VK reposting app and is not the shared (`raa-sender`) remains a valid legacy VK reposting app and is not the shared
RAA parser/writer/poster app. RAA parser/writer/poster app.
## External Site Parser
As of 2026-08-10, website parsing is integrated into the normal raw-post
pipeline. The main application owns sources, per-source JSON configs,
schedules, settings, database state, deduplication, media jobs, and errors.
The external module is stateless: it receives one source request, fetches it,
and returns normalized JSON.
- Runtime: LXC `108`, IP `192.168.1.113`, port `8080`.
- Management: Docker Compose in `/opt/site-parser`.
- Repository compose file: `site_parser_worker/docker-compose.yml`.
- The module is protected by `WORKER_TOKEN`; the value is stored only in
deployment settings/secrets.
- RuCaptcha is stored in the main app setting
`site_parser_rucaptcha_token`; never copy the key into git documentation.
- Main settings are under `/workers` -> `Site Parser`: worker URL/token,
RuCaptcha token, request timeout, global interval, and default minimum body
length.
- Website sources are added on `/sources` with `platform='site'` and their own
JSON config. A missing or invalid config produces a visible source error and
does not run silently.
- Due website sources are processed sequentially, not launched together.
- `access='cloudflare'` enables the Playwright/RuCaptcha path for that source.
Plain RSS/sites do not use a browser.
- Browser cookies plus the exact browser User-Agent are returned to the main
app and reused by `media-uploader` when downloading protected images.
- Uploaded photos are previewed in the admin through authenticated
`/raw/media/{media_id}` URLs backed by Telegram storage, not by the original
Cloudflare-protected URL.
Current RAA test source:
```json
{"format":"rss","access":"cloudflare","max_items":10,"min_text_length":50}
```
- Source: `Popularairsoft`, `https://popularairsoft.com/rss.xml`, id `72`.
- Do not add `follow_links` for the current feed: one of ten entries has a real
body and four photos; the other nine are title-plus-video entries and are
intentionally skipped by the body-length threshold.
- Verified on 2026-08-10: source status `ok`, raw post `102` reached
`storage_ready`, and all four photos were uploaded. Its later rejection is
an AI non-target decision, not a parser/media failure.
- Verified RAA deploy: commit `f866a13a8a83598e26a7a6a3406b8bc1c01c9a80`.
LXC 108 operations:
```bash
cd /opt/site-parser
docker-compose up -d --build
docker-compose ps
docker-compose logs -f
```
## Important Text Rules ## Important Text Rules
- AI writer output text must be clean: no physical hashtags at the end. - AI writer output text must be clean: no physical hashtags at the end.