Files

5.9 KiB
Raw Permalink Blame History

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:<PAT>@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 <ip> (на vps02). Детали — 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.

Файлы секретов проекта (не в 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).