# Kubernetes: AI Control Chat Манифесты разворачивают corp-ui, PostgreSQL и MinIO для чтения legacy-вложений в namespace `aegida-services`. Новые загрузки идут в Aegida Gate Files API; локальный MinIO можно удалить только после миграции/retention всех строк с `object_key` и отдельного удаления bucket bootstrap из entrypoint. До запуска должны существовать: - `user-service.aegida-services.svc.cluster.local:8080`; - `aegida-gate.aegida-services.svc.cluster.local:8080`. Gate должен использовать `JWT_ISSUER=corp-ui`, `JWT_AUDIENCE=aegida-gate` и `JWT_HS256_SECRET`, совпадающий с `JWT_SECRET` из `ai-control-chat-secrets`. `AEGIDA_TENANT_ID` в ConfigMap определяет claim `tenant_id`. ```bash minikube image build \ --build-opt build-arg=NEXT_PUBLIC_APP_URL=https://chat.aegida.test:8443 \ -t ai-control-chat-ui:minikube \ . kubectl apply -f k8s/namespace.yaml kubectl apply -f k8s/config.yaml kubectl apply -f k8s/postgres.yaml kubectl apply -f k8s/minio.yaml kubectl apply -f k8s/app.yaml ``` ## Общий HTTPS Ingress При совместном развёртывании с `aegida-admin-ui` корпоративный интерфейс доступен по `https://chat.aegida.test:8443`. Общий Ingress и локальный TLS-мост управляются из соседнего репозитория `aegida-admin-ui`. Его deploy-helper собирает этот образ с указанным выше build argument и изменяет только поле `NEXT_PUBLIC_APP_URL` в существующем ConfigMap. Он намеренно не применяет второй документ `ai-control-chat-secrets` из `k8s/config.yaml`, поэтому действующие значения Secret сохраняются. ## Постоянный доступ с macOS UI остаётся приватным `ClusterIP` Service. На macOS с Docker-драйвером Minikube постоянный адрес `http://127.0.0.1:3000` поддерживает per-user LaunchAgent: ```bash mkdir -p "$HOME/Library/LaunchAgents" install -m 0644 ops/macos/com.aegida.corp-ui-port-forward.plist \ "$HOME/Library/LaunchAgents/com.aegida.corp-ui-port-forward.plist" launchctl bootstrap "gui/$(id -u)" \ "$HOME/Library/LaunchAgents/com.aegida.corp-ui-port-forward.plist" launchctl kickstart -k "gui/$(id -u)/com.aegida.corp-ui-port-forward" ``` Статус и health-check: ```bash launchctl print "gui/$(id -u)/com.aegida.corp-ui-port-forward" curl --fail-with-body http://127.0.0.1:3000/api/health ``` Логи: ```bash tail -n 100 /tmp/aegida-corp-ui-port-forward.stdout.log tail -n 100 /tmp/aegida-corp-ui-port-forward.stderr.log ``` Перезапуск: ```bash launchctl kickstart -k "gui/$(id -u)/com.aegida.corp-ui-port-forward" ``` Отключение и удаление установленного LaunchAgent: ```bash launchctl bootout "gui/$(id -u)" \ "$HOME/Library/LaunchAgents/com.aegida.corp-ui-port-forward.plist" rm "$HOME/Library/LaunchAgents/com.aegida.corp-ui-port-forward.plist" ``` Перед установкой освободите порт 3000 только после проверки владельца процесса. Не используйте `pkill`, `killall` или принудительный сигнал. Checked-in Secret содержит только development-значения. Замените все секреты вне локального кластера и согласуйте JWT secret с Gate. Проверка без изменения состояния кластера: ```bash kubectl apply --dry-run=client -f k8s/namespace.yaml kubectl apply --dry-run=client -f k8s/config.yaml kubectl apply --dry-run=client -f k8s/postgres.yaml kubectl apply --dry-run=client -f k8s/minio.yaml kubectl apply --dry-run=client -f k8s/app.yaml ```