# md2vk — Реквизиты и доступы **Цель этого файла — собрать все реквизиты/доступы к смежным сервисам, чтобы не искать их потом.** Секреты (токены, пароли) в git **не** помещаются — вместо них указывается файл-источник. Пароль приложения хранится только как bcrypt-хэш (см. ниже). ## Схема продакшена ``` Внешний мир │ https://md2vk.nixg.ru ▼ vps02 (87.242.100.206) ── Caddy (:443, basic auth + fail2ban) │ reverse_proxy 10.8.0.2:8420 (WireGuard) ▼ bigbox (10.8.0.2) ── docker-контейнер md2vk ── 127.0.0.1:8420 ── SQLite /opt/md2vk/data/md2vk.db │ ▼ VK API: https://api.vk.com/method/wall.post ``` | Роль | Значение | |------|----------| | Прод-домен | `md2vk.nixg.ru` → A 87.242.100.206 (vps02) | | bigbox | 10.8.0.2 (WireGuard), хост проекта `/opt/md2vk` | | vps02 | 87.242.100.206, ssh-алиас `vps02` (estorozhenko, sudo по ключу) | | Caddy | контейнер `caddy` на vps02, конфиг `/opt/caddy/Caddyfile`, reload: `docker exec caddy caddy reload` | | Порт приложения | 127.0.0.1:8420 на bigbox (контейнер), извне не торчит | | БД | SQLite `/opt/md2vk/data/md2vk.db` (в docker — `/data/md2vk.db`) | ## Git | Forge | URL | Логин | Как авторизоваться | |-------|-----|-------|--------------------| | **gitverse.ru (истина)** | `git@gitverse.ru:kpa39l/md2vk.git` | **kpa39l** | SSH-ключ `/home/estorozhenko/.ssh/gitverse`; PAT — в `git-tokens.env` | | gitea.nixg.ru (pull mirror) | `https://gitea.nixg.ru/estorozhenko/md2vk.git` | estorozhenko | токен `GITEA_NIXG_TOKEN` | - Источник токенов: `/opt/hermes/.hermes/secrets/git-tokens.env` (`source` его, не искать токены по каталогам). Переменные: `GITVERSE_LOGIN=kpa39l`, `GITVERSE_PAT`, `GITEA_NIXG_API`, `GITEA_NIXG_TOKEN`. - Gitea локальный API (bigbox): `http://127.0.0.1:3000/api/v1`, токен `GITEA_TOKEN` (там же). - Правила работы с зеркалами: см. skill `git-forge-management`, reference `gitea-pull-mirror-gitverse.md` (migrate работает только по HTTPS+PAT: `https://oauth2:@gitverse.ru/kpa39l/md2vk.git`). - `tea` CLI: `~/.local/bin/tea`, логин `gitea.nixg-full` — для работы с gitea.nixg.ru. ## Доступы к сервисам (смежные) | Сервис | URL/адрес | Доступ | |--------|-----------|--------| | DNS nixg.ru | NS: ns1..ns4.jino.ru (Jino) | панель регистратора Jino (кто владеет доменом), A-записи | | VK API | https://dev.vk.com/ru/reference | открытая документация | | VK ID (приложение) | https://id.vk.ru/about/business/go/docs/ru/vkid/latest/vk-id/connection/create-application | нужен аккаунт VK для client_id/secret | | Caddy vps02 | /opt/caddy/Caddyfile | ssh vps02, sudo | | fail2ban vps02 | jail local, `/etc/fail2ban/` | ssh vps02, sudo | ## Пароль приложения (basic auth на Caddy) - Пользователь: **estorozhenko** - Пароль: задан пользователем (md2vk!Ghjcgtrn73 — в менеджере паролей пользователя; в git не хранится). - В Caddyfile: bcrypt-хэш: `$2a$14$T5gAji7gmg1t3Ifxw0CJy.jat9vpFfOiJIE8j5bnHynEVH1q.QTPS` (генерируется заново при создании записи). - Генерация: `docker exec caddy caddy hash-password --plaintext '<пароль>'`. - Блокировка: fail2ban ban IP после 5 неудачных попыток подряд, ручной unban: `fail2ban-client -c /etc/fail2ban unban ` (на vps02). Детали — [security.md](security.md). ## VK OAuth (для OAuth-флоу VK ID) - Ссылка авторизации: `https://oauth.vk.com/authorize?client_id=...&scope=wall,offline&redirect_uri=...&response_type=token` - API: `https://api.vk.com/method/wall.post?access_token=...&owner_id=...&message=...&v=5.199` - Версия API в конфиге: `VK_API_VERSION=5.199` - Требуется пользовательский токен (не токен сообщества из настроек группы); для стены группы — токен администратора с `wall`, `photos`, публикация через `from_group=1`. - Ограничение VK: создать статью (лонгрид) через API нельзя; через `wall.post` можно прикрепить уже опубликованную: `attachments=articleXXX_YYY`. Подробности — [vk-api.md](vk-api.md). ## Файлы секретов проекта (не в git) | Файл | Что это | |------|---------| | `/opt/md2vk/secrets/token_encryption_key` | Fernet-ключ шифрования VK-токенов (генерируется `python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"`) | | `/opt/md2vk/secrets/estorozhenko_api_key.txt` | API-ключ пользователя estorozhenko (md2vk_...) для вызова API | | `/opt/hermes/.hermes/secrets/git-tokens.env` | токены gitverse/gitea | ## Наблюдаемость - Лог авторизации/запросов API: `/opt/md2vk/logs/access.log` (JSONL) и `access.{YYYY-MM-DD}.log` (ротация по дням). В docker: каталог монтируется как `/logs`. Поля: `ts, ip, method, path, api_key_prefix, user_id, status, success, latency_ms, error`. - Health: `GET /api/v1/health` → `{"status":"ok"}`. - Метрики доступности/успешности/активной сессии — собираются из лога (см. deploy.md).