# books-ops — host-level observability stack на books VDS (89.253.255.133). # # Ideology: books VDS = наш host, slovo/bookva = клиентские tenant-стэки. # Один host-wide ops-mcp видит все контейнеры через `tcp://books-docker-proxy-ro:2375`. # # Tenant DB scope: per-tenant pools (slovo + bookva). Tools принимают optional # `tenant: 'slovo'|'bookva'` (default = config.defaultTenant). См. config/default.json # в `packages/ops-mcp/` (mirrored на host'е через mount). # # Lifecycle: # - Managed manually через Portainer UI (как traefik + portainer — management plane exception # из портейнер-rule, не deploy'ится из tenant CI pipeline). # - Update image tag: Portainer → Stack → Edit compose → change image tag → Update. # - Container names books-docker-proxy-ro + books-ops-mcp **сохраняются** — # .claude.json использует `ssh vps-books docker exec -i books-ops-mcp ...`. # # Если нужно поднять второй MCP instance (per-tenant DB observability) — отдельный stack, # отдельные container names (bookva-ops-mcp / slovo-ops-mcp), отдельный config volume. services: books-docker-proxy-ro: container_name: books-docker-proxy-ro image: tecnativa/docker-socket-proxy:0.3 restart: unless-stopped environment: # Только read-методы на /containers/* — list, inspect, logs, stats. # POST=0 (default) — никаких prune/start/stop/rm. Все остальные # ресурсы (images, build, volumes, networks, exec, system, info) — 0. CONTAINERS: 1 POST: 0 IMAGES: 0 BUILD: 0 EXEC: 0 VOLUMES: 0 NETWORKS: 0 SERVICES: 0 SYSTEM: 0 INFO: 0 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro networks: - proxy books-ops-mcp: container_name: books-ops-mcp image: registry.kzntsv.site/books-ops-mcp:master restart: unless-stopped depends_on: - books-docker-proxy-ro environment: NODE_ENV: production TZ: Europe/Moscow DOCKER_HOST: tcp://books-docker-proxy-ro:2375 # MARIADB_PASSWORD = slovo's books-db ops_ro; BOOKVA_MARIADB_PASSWORD = bookva-db's # (bookva-db = cp -a of books-db, ops_ro password идентичен; rotate отдельно). MARIADB_PASSWORD: ${MARIADB_PASSWORD} BOOKVA_MARIADB_PASSWORD: ${BOOKVA_MARIADB_PASSWORD} volumes: # ВНИМАНИЕ: на VPS файл /opt/books/books-ops-mcp/config/default.json # должен существовать ДО первого старта стека, иначе Docker создаст # пустую directory вместо файла. - /opt/books/books-ops-mcp/config/default.json:/usr/src/app/packages/ops-mcp/config/default.json networks: - proxy # Контейнер всегда живой; реальный MCP запускается per-session через # ssh + docker exec -i books-ops-mcp node lib/server.js. CMD = idle. command: ["tail", "-f", "/dev/null"] networks: proxy: external: true