From 92df7346c7acb2b3d045caf5696e6c55fc5c7934 Mon Sep 17 00:00:00 2001 From: ochenstarik-ui <267932263+ochenstarik-ui@users.noreply.github.com> Date: Mon, 19 Oct 2026 11:59:16 +0700 Subject: [PATCH] docs(agents): add Codex stage-1 completion task Task from Claude (orchestrator), forwarded by the owner on 2026-10-19: dependency security fix, real-PostgreSQL integration run, live VK smoke preparation, single-host deployment and domain access. Co-Authored-By: Claude Opus 5.5 --- .../inbox/2026-10-19-stage1-completion.md | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 agents/codex/inbox/2026-10-19-stage1-completion.md diff --git a/agents/codex/inbox/2026-10-19-stage1-completion.md b/agents/codex/inbox/2026-10-19-stage1-completion.md new file mode 100644 index 0000000..10950c2 --- /dev/null +++ b/agents/codex/inbox/2026-10-19-stage1-completion.md @@ -0,0 +1,104 @@ +# Codex — Randomayzer: завершение первого этапа + +Дата: 2026-10-19. От: Claude, передаёт владелец. +Репозиторий `github.com/ochenstarik-ui/randomayzer`, ветка `main` (`b625d70`). +Одна задача — одна ветка — один PR в `main`. В `main` сам не вливаешь — сливает владелец или Claude. + +**Где что выполняется.** Ты работаешь на своём ПК. Сервер развёртывания — отдельная машина +владельца (сведения о ней ниже, в R4/R5). Ты готовишь и проверяешь у себя конфигурацию, скрипты +и runbook. Запуск на сервере по твоему runbook выполняет Claude, результат он записывает +в `agents/claude/done/`. Runbook должен быть исполнимым без тебя: команды, ожидаемый вывод, +откат. +Проект некоммерческий: платежи, биллинг и юридические тексты не нужны. + +## Состояние на 19.10 (проверено Claude) +- `vitest run` — 346 из 346, 59 файлов; `tsc --noEmit` — без ошибок; `eslint` — 0 ошибок, 6 предупреждений; + `next build` — проходит. +- `npm audit --omit=dev` — **3 уязвимости:** next 16.0.0–16.3.7 (**критическая**), sharp ≤0.35.5-rc.1 (высокая), + source-map-js 1.0.0–1.2.1 (высокая); для всех есть обновления. +- Интеграционные тесты (`npm run test:integration`, реальная PostgreSQL) не запускались. +- Чек-лист `docs/VK_REAL_SMOKE_TEST.md`, пункты A–H, не отмечен ни один. В `docs/VK_INTEGRATION_PLAN.md` + и `docs/VK_ID_LIVE_CONTRACT.md` часть поведения VK API помечена UNVERIFIED. + +## Как работаешь +Дешёвые модели: кодер 1 → кодер 2 → два независимых аудитора сверяют результат с этим заданием, +цикл до зелёного. Затем ты сам проверяешь и исправляешь, потом PR и отчёт в `agents/codex/done/`. +Существующие тесты не менять, проверки не ослаблять. Секреты VK — только из 0600-файла, не в Git и не в логи. + +## Задания по порядку + +### R1. Безопасность зависимостей (первым) +Обновить next, sharp и source-map-js до версий без уязвимостей, минимально необходимым шагом, +без смены мажорных версий без нужды. Если Next требует правок кода, сделать их. +**Приёмка:** `npm audit --omit=dev` без critical и high; тесты, tsc, lint и build зелёные. +В отчёте указать старые и новые версии и лицензии. + +### R2. Интеграционные тесты на реальной PostgreSQL +Поднять PostgreSQL 16 (docker-compose проекта, порт только на 127.0.0.1) и прогнать +`npm run test:integration`. Найденные падения исправить в коде, не в тестах. +**Приёмка:** вывод прогона, 0 падений; миграции Prisma применяются на чистой базе. + +### R3. Подготовка к проверке на живом VK +Без реальных ключей: +1. Для каждого UNVERIFIED-поведения (список руководителей сообщества, репосты закрытых профилей, + лимиты пагинации, лимит `execute`) — безопасное поведение при отказе VK. Понятная причина + в UI и в статусе участника, без падения розыгрыша и без молчаливой потери участников. + Тесты на мок-провайдере для каждого отказа. +2. Скрипт `tools/vk-smoke.(ts|sh)`, который владелец запустит с реальными ключами: проходит пункты + A–H чек-листа там, где их можно автоматизировать, и печатает PASS или FAIL по каждому. + Ручные пункты (экран согласия VK) — пошаговая инструкция. + +### R4. Развёртывание +**Целевой хост — этот же сервер (решение владельца 19.10), не отдельный VPS.** На нём уже +работают другие сервисы, ничего из них не трогать: +- порт 80 занят Apache из snap Nextcloud; +- 3000 занят Express-приложением (слушает 0.0.0.0); +- 127.0.0.1:5432 и 127.0.0.1:8080 тоже заняты; +- диск заполнен на 82%. + +Поэтому: +- приложение — на свободном порту, только `127.0.0.1` (например, 3100; перед выбором проверить через `ss -ltn`); +- своя PostgreSQL — в отдельной сети Docker, без публикации порта на хост; +- имена контейнеров, сетей и томов — с префиксом `randomayzer-`; +- лимиты памяти и CPU. + +**Доступ — только у владельца (решение 19.10).** Наружу ничего не публикуется: ни домена, +ни публичного TLS, ни правил firewall. Приложение слушает только `127.0.0.1`. Владелец открывает его +в браузере на самом сервере или через SSH-туннель (`ssh -L <порт>:127.0.0.1:<порт>`) — команду +записать в runbook. + +Важно для VK ID и проверок production: +- redirect URI приложения VK — `http://localhost:<порт>/api/auth/vk/callback`; так и записать его + в настройках VK ID-приложения; +- если `docs/PRODUCTION_GUARDS.md` или код требуют HTTPS, флаг `Secure` у cookie или публичный + origin в production-режиме — добавить явный профиль «local single-user», где это допустимо только + для loopback-адреса. Проверки не ослаблять глобально: для не-loopback origin они должны работать + как прежде, это покрыть тестом. + +Production-конфигурация на этот хост: +- приложение и PostgreSQL, без внешнего прокси и без публичного HTTPS; +- порты БД только на loopback, непривилегированные контейнеры; +- `AUTH_SECRET` и ключи VK из 0600-файла; +- ежедневный бэкап БД с проверкой восстановления; +- runbook запуска, обновления и отката в `docs/`. + +**Приёмка:** локальный прогон стека в production-режиме, восстановление из бэкапа на чистую базу. + +### R5. Доступ по домену `random.ochenstarik.ru` +Шаг 1 (loopback) делается сразу. Домен добавляется вторым шагом, без переделки шага 1: +- Порт 80 занят Apache из snap Nextcloud, его не трогать. Порт 443 свободен. TLS — через + reverse proxy на 443 (например, Caddy в контейнере `randomayzer-proxy`) с выпуском сертификата + по TLS-ALPN-01 на 443 или DNS-01. HTTP-01 на 80 недоступен. +- Пользователь один — владелец. Поэтому перед приложением дополнительный слой доступа: + basic auth или allowlist IP на прокси, плюс собственный вход через VK. +- Redirect URI VK ID — `https://<домен>/api/auth/vk/callback`. Production-проверки (HTTPS, + Secure-cookie, origin) — в обычном строгом режиме, профиль «local» для домена не использовать. +- Открыть 443 в firewall хоста только для прокси. Приложение и БД по-прежнему на loopback + и во внутренней сети. + +**Приёмка:** сертификат выпущен; без авторизации на прокси — 401; вход через VK ID работает +по домену; приложение напрямую извне недоступно. + +## После R1–R4 от владельца нужно +Приложение VK ID и сервисный токен в 0600-файле. Тогда — живая проверка по R3 +и исправление найденного. Для R5 домен уже есть: `random.ochenstarik.ru`, A → 185.26.122.80. Сервер стоит за NAT (192.168.1.81), поэтому нужен проброс TCP 443 с роутера или внешнего адреса на 192.168.1.81 — подтверждает владелец. Исходящий трафик сервера идёт через прозрачный прокси xray: на выпуск сертификата это не влияет, но внешний IP по запросам «изнутри» определять нельзя.