Multi-fix session: bookva tenant works correctly после 6 fix'ов одной природы (incomplete cutover-prep без e2e smoke). См. NEXT_SESSION.md § "What's LIVE" + § "Memory updates" + shared wiki concept tenant-overlay-config-volume-mount-path-pitfall. Changes: - host-stacks/books-vds/ops-mcp.compose.yml: add BOOKVA_MARIADB_PASSWORD env declaration + multi-tenant docs note. Stack 26 ещё не пере-PUT'нут на это, открытая микро-таска ops-mcp-multi-tenant-stack-activate в NEXT_SESSION. - STATUS.md: 6-bug summary в latest update line. - NEXT_SESSION.md: full rewrite с 14 recent commits, open треками, asks к user'у, memory updates про agenda.db.collection / composite jobId / scheduler envs / bookva auth tokens. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
72 lines
3.1 KiB
YAML
72 lines
3.1 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: 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
|