## 1. Модуль GoToSocial (services/publisher/app/gotosocial.py) - [x] 1.1 Создать `gotosocial.py`: `_client()`, `post_status()`, `upload_media()`, `verify_credentials()`, `delete_status()`, `GoToSocialError` - [x] 1.2 Проверка: `python -c "from app.gotosocial import post_status, verify_credentials"` (в venv) — импорт без ошибок ## 2. Конфиг - [x] 2.1 `config.py`: поля `gt_social_url`, `gt_social_token`, `gt_social_visibility`, `gt_social_channels` + чтение из env - [x] 2.2 `.env` (корень): добавить `GT_SOCIAL_URL=https://social.dedinit.ru`, `GT_SOCIAL_ACCESS_TOKEN=<токен vesti>`, `GT_SOCIAL_VISIBILITY=public`, `VESTI_GTS_CHANNELS=@vesti@dedinit.ru` - [x] 2.3 `.env.example` актуализирован (те же имена, значения-заглушки) ## 3. Логика каналов (channels.py) - [x] 3.1 Добавить `is_gotosocial(ch)` и чтение `VESTI_GTS_CHANNELS` (feediverse-каналы отдельно от Telegram) - [x] 3.2 Проверка: функция отличает `@dedinit_vesti` (TG) от `@vesti@dedinit.ru` (GtS); `gt:`-префикс уходит ТОЛЬКО в fediverse ## 4. main.py - [x] 4.1 `_publish_gotosocial(card, ch)`: upload_media → post_status → ChannelResult (status_id) - [x] 4.2 В `publish()`: после Telegram-каналов обработать fediverse-каналы (settings.gt_social_channels) в том же цикле; `all_ok` учитывает их - [x] 4.3 dry_run: эмулирует fediverse-каналы (message_id=0), без реальных HTTP-запросов - [x] 4.4 healthz: блок `gotosocial` (url, account, token_set, account_ok) - [x] 4.5 Проверка: `curl -s http://127.0.0.1:8410/healthz` → json c gotosocial ## 5. Сборка и функциональный тест - [x] 5.1 `docker compose -f services/publisher/docker-compose.yml up -d --build` — контейнер Up - [x] 5.2 dry_run с fediverse-каналом: results содержит `@vesti@dedinit.ru`, message_id=0, HTTP 200 - [x] 5.3 healthz содержит gotosocial c `token_set=true`, account=vesti, account_ok=true - [x] 5.4 Регресс: публикация чисто в Telegram (dry_run) работает как раньше ## 6. Токен + реальный тест - [x] 6.1 Создать аккаунт **vesti** на GtS (admin account create, confirmed, approved) — 2026-09-13 - [x] 6.2 Создать OAuth-приложение `vesti-publisher` (POST /api/v1/apps, scope `write write:media`) — client_id=01B09QNDM9YQ2VQVSRXHCVAV6K - [x] 6.3 Токен vesti: вставлен в БД `tokens` (user_id из `users`, scope `read write`, access 48 симв.), записан в .env → healthz `account_ok=true` - [x] 6.4 Реальный тест: публикация текста, публикация с медиа (1 attachment), delete — всё HTTP 200, статусы проверены и удалены ## 7. Документация и git - [ ] 7.1 STATUS.md: раздел «Fediverse-публикация (GoToSocial)» - [ ] 7.2 WALKTHROUGH.md/PRD.md: фича отмечена - [ ] 7.3 git commit + push на gitverse - [ ] 7.4 openspec archive (после подтверждения пользователя) - [ ] 7.5 backup.sh (обязателен после изменений)