Stack 26 (books-ops-mcp) in-place PUT в host-level compose без container churn. Stack 43 (bookva-ops-mcp) deleted. 2 Gitea secrets revoked. New canonical: `host-stacks/books-vds/ops-mcp.compose.yml` (management-plane, manual Portainer updates как traefik/portainer). Design locks: location=.admin/host-stacks, deploy=manual Portainer, MariaDB scope=slovo's only (Option A), config path unchanged. Companion commits: `victor/books ae3ab14`, `victor/bookva-overlay 50f5bbb`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
68 lines
2.9 KiB
YAML
68 lines
2.9 KiB
YAML
# 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 (current): slovo's books-db + slovo's Mongo (per ops-mcp/config/default.json).
|
||
# Bookva-tenant DB observability через MCP — design call отложен (см. .tasks/books-ops-mcp-host-promote.md).
|
||
#
|
||
# 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: ${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
|