Files
chatballs/compose.dev.yaml
T
AndreyandClaude Opus 5 146052916b 🔥 refactor: снос сущности Product и авторизованного in-product чата (ADR-HUB-0045)
`Product` оставался в схеме «скрытой технической осью» (ADR-HUB-0041 §7), но
из интерфейса не исчез: в настройках портала жил раздел «Продукты и поддержка»,
в списке порталов — колонка «Продукты». Решение владельца — убрать сущность
целиком вместе со всем контуром, который на ней держался.

Удалено:
- приложения `products` и `support` (контракты идентификации, снимки личности,
  Product Support Token, публичные endpoints сессии);
- `Channel.product` и `requires_authenticated_product_identity` (инварианты
  P3-P5; остались P1-P2), `LlmInvocation.product`, `SupportPortalProduct`;
- `WebChatWidget.mode` целиком: различать было нечего, у веб-виджета одна
  анонимная точка входа. Ключ `mode` ушёл и из ответов API виджета;
- `mode=support` и `ChatballsChat.init` в лоадере, `SupportApp` в web-chat;
- capability `products.*`, аудит-действия `products.*`, продукты в карточке
  контакта и в статистике (`byProduct`);
- раздел настроек портала и колонка списка — в коде и в дизайн-базлайне v2.

У диалога один источник identity — контакт: XOR заменён на
`conversation_requires_contact`. `PUT /portals/{id}/products/` удалён,
`GET /portals/{id}/support-channels/` → `GET /portals/{id}/widgets/`.

Миграции — по образцу сноса продаж: исторические миграции уцелевших приложений
вычищены от ссылок (чистая установка объектов не создаёт), существующие БД
чинит `tenancy/0029_drop_product_support`. Данные не экспортируются, но диалоги
со снимком личности не удаляются — каждому создаётся контакт с именем из снимка.

Проверено: backend 583 OK, фронт tsc + vitest 77 OK, сборки internal-ui и
web-chat OK, миграция прогнана на локальной БД, публичный портал открывается.

В коммит также вошли накопленные незакоммиченные правки рабочего дерева
(библиотека знаний, настройки, dev-compose и nginx, макеты базлайна).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 00:39:12 +03:00

157 lines
5.9 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Override для локальной разработки (ADR-HUB-0028 §compose.dev).
# Применяется поверх canonical compose.yaml:
# docker compose -f compose.yaml -f compose.dev.yaml up
# Переопределяет image на build, dev-команды, bind mounts и host-порты.
# Не определяет отдельную production-топологию.
services:
postgres:
ports:
- "${POSTGRES_HOST_PORT:-5432}:5432"
redis:
ports:
- "${REDIS_HOST_PORT:-6379}:6379"
# Dev: migrate через init, без collectstatic (испечён только в prod-образе).
init:
build:
context: .
dockerfile: apps/backend/Dockerfile
environment:
# Dev-контур работает по http на localhost: без DEBUG включается
# SSL-redirect и SPA не может ходить в API. В коробке DEBUG выключен.
CHATBALLS_DEBUG: "true"
CHATBALLS_DELIVERY_MODE: ${CHATBALLS_DELIVERY_MODE:-CLOUD}
CHATBALLS_HELP_BASE_DOMAIN: localhost
CHATBALLS_HELP_PUBLIC_SCHEME: http
CHATBALLS_HELP_PUBLIC_PORT: ""
backend-app:
build:
context: .
dockerfile: apps/backend/Dockerfile
# Миграции выполняет one-shot init (CHATBALLS_DB_ROLE=migration); runtime-роль app
# не имеет прав на django_migrations, поэтому migrate здесь запускать нельзя.
command: uvicorn chatballs_backend.asgi_app:application --host 0.0.0.0 --port 8000 --reload
ports:
- "${BACKEND_APP_PORT:-8010}:8000"
environment:
# Dev-контур работает по http на localhost: без DEBUG включается
# SSL-redirect и SPA не может ходить в API. В коробке DEBUG выключен.
CHATBALLS_DEBUG: "true"
CHATBALLS_DELIVERY_MODE: ${CHATBALLS_DELIVERY_MODE:-CLOUD}
CHATBALLS_ALLOWED_HOSTS: "localhost,127.0.0.1,.localhost"
CHATBALLS_HELP_BASE_DOMAIN: localhost
CHATBALLS_HELP_PUBLIC_SCHEME: http
CHATBALLS_HELP_PUBLIC_PORT: ""
volumes:
- ./apps/backend:/app/apps/backend
depends_on:
init:
condition: service_completed_successfully
postgres:
condition: service_healthy
redis:
condition: service_healthy
backend-platform:
build:
context: .
dockerfile: apps/backend/Dockerfile
command: uvicorn chatballs_backend.asgi_platform:application --host 0.0.0.0 --port 8000 --reload
ports:
- "${BACKEND_PLATFORM_PORT:-8011}:8000"
environment:
# Dev-контур работает по http на localhost: без DEBUG включается
# SSL-redirect и SPA не может ходить в API. В коробке DEBUG выключен.
CHATBALLS_DEBUG: "true"
CHATBALLS_DELIVERY_MODE: ${CHATBALLS_DELIVERY_MODE:-CLOUD}
CHATBALLS_ALLOWED_HOSTS: "localhost,127.0.0.1,.localhost"
CHATBALLS_HELP_BASE_DOMAIN: localhost
CHATBALLS_HELP_PUBLIC_SCHEME: http
CHATBALLS_HELP_PUBLIC_PORT: ""
volumes:
- ./apps/backend:/app/apps/backend
backend-admin:
build:
context: .
dockerfile: apps/backend/Dockerfile
command: uvicorn chatballs_backend.asgi_admin:application --host 0.0.0.0 --port 8000 --reload
environment:
# Dev-контур работает по http на localhost: без DEBUG включается
# SSL-redirect и SPA не может ходить в API. В коробке DEBUG выключен.
CHATBALLS_DEBUG: "true"
CHATBALLS_DELIVERY_MODE: ${CHATBALLS_DELIVERY_MODE:-CLOUD}
volumes:
- ./apps/backend:/app/apps/backend
worker:
build:
context: .
dockerfile: apps/backend/Dockerfile
environment:
# Dev-контур работает по http на localhost: без DEBUG включается
# SSL-redirect и SPA не может ходить в API. В коробке DEBUG выключен.
CHATBALLS_DEBUG: "true"
CHATBALLS_DELIVERY_MODE: ${CHATBALLS_DELIVERY_MODE:-CLOUD}
volumes:
- ./apps/backend:/app/apps/backend
# Dev: frontend-сервис превращается в Vite dev-сервер internal-ui (HMR).
frontend:
build:
context: .
dockerfile: apps/internal-ui/Dockerfile
command: npm run dev -- --host 0.0.0.0 --port 5173
environment:
# Direct Vite remains same-origin for cookies/CSRF and proxies only to the
# real local Django service. This variable exists only in dev compose.
VITE_DEV_API_TARGET: http://backend-app:8000
# Bind-mounts from the Windows host do not deliver inotify events into the
# container, so the watcher polls instead — otherwise HMR never fires.
VITE_DEV_POLL: "1"
ports:
- "${INTERNAL_UI_PORT:-5173}:5173"
volumes:
- ./apps/internal-ui:/app/apps/internal-ui
- ./packages:/app/packages
- /app/node_modules
- /app/apps/internal-ui/node_modules
# Dev-only: web-chat как отдельный Vite-сервер (в prod встроен в frontend-образ).
web-chat:
build:
context: .
dockerfile: apps/web-chat/Dockerfile
command: npm run dev -- --host 0.0.0.0 --port 5175
environment:
VITE_DEV_POLL: "1"
ports:
- "${WEB_CHAT_PORT:-5175}:5175"
volumes:
- ./apps/web-chat:/app/apps/web-chat
- ./packages:/app/packages
- /app/node_modules
- /app/apps/web-chat/node_modules
# Dev: gateway — nginx с local.conf вместо Caddy (та же маршрутизация, HMR-friendly).
gateway:
image: nginx:1.27-alpine
command: ["nginx", "-g", "daemon off;"]
ports:
- "80:80"
volumes:
- ./deploy/nginx/local.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
backend-app:
condition: service_healthy
backend-platform:
condition: service_healthy
frontend:
condition: service_started
web-chat:
condition: service_started