Phase 0 findings: - 6 target stacks (5 original + imgproxy discovered on /usr/docker/imgproxy/) - All bind-only, no env_file, no surprise named volumes - Portainer PAT works via X-API-Key; endpoint 1 = books VDS, endpoint 6 = stostayer (not ours, user-confirmed) - mongo container lost image tag (digest only) — fresh mongo:4.2 pull at recreate acceptable - Q1 (endpoint 6) + Q2 (volume preservation) closed Updated entity books-vds: imgproxy added to SSH-managed inventory (was missing). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.4 KiB
Books VDS
Клиентский VDS (отдельный от инфра-VDS vds-kzntsv). Хостит production books app stack (api/web/scheduler/task-runner) + shared infra (mongo, minio, elasticsearch, traefik, portainer).
Это НЕ vds-kzntsv. Books-стек живёт здесь, не на vds.kzntsv.site. Domain books.kzntsv.site (и bookva.kzntsv.site) разрешаются в этот IP.
Доступ
- Public IP: 89.253.255.133
- Provider: host4g.ru (DNS вендорский
vps-21075162-277731.host4g.ru) - OS: CentOS 7, kernel 3.10.0-1160.36.2.el7.x86_64 (древний, EOL)
- SSH:
root@89.253.255.133:22— only via ed25519 key (~/.ssh/id_ed25519_books_opsна workstation) - Sudo: root, passwordless (мы под root напрямую)
- Portainer:
https://portainer.kzntsv.site(отдельный Portainer, не путать сportainer.vds.kzntsv.siteдля vds-kzntsv)
Все creds — в pass show books-vds/full-env.
Disk
/dev/vda1 122G 59G used (49%) 63G free
Single root partition, нет отдельной /data. Docker hub data под /var/lib/docker/.
Стек (2026-05-25 inventory)
Portainer-managed stacks (endpoint 1)
| Stack | Container(s) | Purpose |
|---|---|---|
books-api |
books-api | books API server (Nitro, port 3021) |
books-web |
books-web | books-Nuxt front-end |
books-job-scheduler |
books-job-scheduler + books-job-scheduler-mongo | agenda jobs (cron + on-demand) |
books-ntfy |
books-ntfy | local ntfy (separate from shared ntfy.vds.kzntsv.site) |
books-ops-mcp |
books-ops-mcp + books-ops-mcp-bootstrap-1 + books-docker-proxy + books-docker-proxy-ro | books ops-mcp endpoint |
chrome |
chrome | Puppeteer browser for PDFs / scraping |
SSH-managed (legacy compose at /usr/docker/<svc>/)
| Compose dir | Containers | Bind data path |
|---|---|---|
/usr/docker/books-db/ |
books-db | ./data → /var/lib/mysql (MariaDB 10.6.4) |
/usr/docker/mongo/ |
mongo | ./data/{db,configdb} |
/usr/docker/minio/ |
minio | ./data (S3 blobs) |
/usr/docker/elasticsearch/ |
elasticsearch | ./data + ./snapshots (added 2026-05-25) |
/usr/docker/traefik/ |
traefik | ./letsencrypt (acme.json) + ./data/traefik.yml |
/usr/docker/portainer/ |
portainer | named volume portainer_data |
/usr/docker/proxy-chain/ |
proxy-chain | ./config (upstream HTTP-proxy chain) |
/usr/docker/imgproxy/ |
imgproxy + imgproxy-nginx | ./nginx/cache + ./nginx/nginx.conf (serves imgproxy.kzntsv.site, S3 backend via minio) |
TODO: мигрировать максимум SSH-managed контейнеров под Portainer (отдельная таска после backup-pipeline live). Cause: разделённое управление обламывает CI (Portainer-only deploy.yml) и debugging.
Build helpers (transient)
buildx_buildkit_builder-*× 7 — buildkit builders, oneshot заdocker buildx. Не data.
App-config paths
/opt/books/api/{config,data,upload}
/opt/books/job-scheduler/{config,mongo/{db,configdb}}
/opt/books/task-runner/
/opt/books/ntfy/ # local ntfy data
/opt/books/books-ops-mcp/
config/default.json overrides image-baked config (MySQL/ES/S3 endpoints).
Backup
Daily 06:00 MSK → kreknin. См. ../sources/books-vds-backup-daily-kreknin-2026-05-25. Pipeline:
- DB dumps: books-db (mariadb), mongo (shared), books-job-scheduler-mongo
- ES snapshot via REST API (file repo
kreknin) - rsync bind paths + dumps +
/opt/books/+/etc/{ssh,hosts,cron.d}+/root/.ssh→vitya@kreknin:/volume1/NetBackup/books-vds/<date>/ - ntfy
BOOKS-VDS backup OK <date>+ email - Retention 7 daily snapshots
Live since 2026-05-25.
DNS
books.kzntsv.site→ 89.253.255.133 (books-apihost route via local traefik)bookva.kzntsv.site→ 89.253.255.133 (books-webhost route)elasticsearch.kzntsv.site→ 89.253.255.133 (ES via traefik basicAuth)portainer.kzntsv.site→ 89.253.255.133 (Portainer UI)edge.kzntsv.site→ 89.253.255.133 (Portainer edge agent)
Auth-зоны DNS — в reg.ru под kzntsv.site.
Cross-refs
- kreknin-synology — backup target.
- vds-kzntsv — наш инфра-VDS (отдельный, gitea/registry/etc.) — НЕ хост books'а.
- ../concepts/vds-kzntsv-ssh-access — SSH-аудит инфра-VDS (был misnamed как
books-ssh-accessдо 2026-05-25; ошибочно claimed vds-kzntsv hosts books). - ../sources/books-vds-backup-daily-kreknin-2026-05-25 — backup standup chronology.
Каking-of-history notes
- Discovered 2026-05-25 во время backup-таски. Wiki ../concepts/books-ssh-access до этого ошибочно говорила что books на vds-kzntsv (89.253.255.94). User: «books VDS - это совсем другой сервер, клиентский». Inventory + IP probe confirmed.
- Workstation SSH key
id_ed25519_books_opsуже был задеплоен под root до этой сессии (видимо, прошлый bootstrap забыт-без-документации). - Hybrid stack-management (Portainer + SSH-compose) — pre-existing, не наш design. Migrate to Portainer-only — follow-up.