--- title: Books VDS (client server — 89.253.255.133) type: entity tags: [hardware, vds, books, host4g, backup, portainer] related: [[kreknin-synology]], [[vds-kzntsv]], [[../concepts/portainer-stack-management-books-vds]] updated: 2026-05-25 --- # 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) Post-migration 2026-05-25 (см. [[../concepts/portainer-stack-management-books-vds]]). | Id | Stack | Container(s) | Bind data path | Purpose | |---|---|---|---|---| | 22 | `books-job-scheduler` | books-job-scheduler + books-job-scheduler-mongo | `/opt/books/job-scheduler/{config,mongo/{db,configdb}}` | agenda jobs (cron + on-demand) | | 23 | `books-api` | books-api | `/opt/books/api/{config,data,upload}` | books API server (Nitro, port 3021) | | 24 | `books-web` | books-web | — | books-Nuxt front-end | | 25 | `books-ntfy` | books-ntfy | `/opt/books/ntfy/` | local ntfy (separate from shared `ntfy.vds.kzntsv.site`) | | 26 | `books-ops-mcp` | books-ops-mcp + books-ops-mcp-bootstrap-1 + books-docker-proxy + books-docker-proxy-ro | `/opt/books/books-ops-mcp/` | books ops-mcp endpoint | | 27 | `chrome` | chrome | — | Puppeteer browser for PDFs / scraping | | 28 | `proxy-chain` | proxy-chain | `/usr/docker/proxy-chain/config` | upstream HTTP-proxy chain, internal-only | | 29 | `imgproxy` | imgproxy + imgproxy-nginx | `/usr/docker/imgproxy/nginx/{cache,nginx.conf}` | serves `imgproxy.kzntsv.site`, S3→minio | | 30 | `minio` | minio | `/usr/docker/minio/data` | S3 blob store, `minio.kzntsv.site` | | 31 | `mongo` | mongo | `/usr/docker/mongo/data/{db,configdb}` | shared MongoDB 4.2 | | 32 | `books-db` | books-db | `/usr/docker/books-db/data` | MariaDB latest, books application DB | | 33 | `elasticsearch` | elasticsearch | `/usr/docker/elasticsearch/{data,snapshots}` | ES 7.10.0 + path.repo для backup | ### SSH-managed (management plane — Portainer migration skipped) Recreate ломает access всему остальному (traefik) или себя (portainer). Оставлены ad-hoc compose в `/usr/docker//`. | Compose dir | Containers | Bind data path | |---|---|---| | `/usr/docker/traefik/` | traefik | `./letsencrypt` (acme.json) + `./data/traefik.yml` | | `/usr/docker/portainer/` | portainer | named volume `portainer_data` | ### 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//` - ntfy `BOOKS-VDS backup OK ` + email - Retention 7 daily snapshots Live since 2026-05-25. ## DNS - `books.kzntsv.site` → 89.253.255.133 (`books-api` host route via local traefik) - `bookva.kzntsv.site` → 89.253.255.133 (`books-web` host 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. ## Making-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. Migrated 6 SSH-compose стеков → Portainer 2026-05-25 (`books-vds-stacks-to-portainer` 🟢). `traefik` + `portainer` остаются SSH-managed (management plane). - `imgproxy` (2 containers, `imgproxy.kzntsv.site`) был missing из этого entity wiki до Phase 0 probe 2026-05-25 — fixed in flight.