Files
chatballs/deploy/cli/lib/status.sh
T
AndreyandClaude Opus 5 a2e6672424 🔥 chore: .env убран отовсюду — установка не читает файл с переменными
Переход на запуск без .env (41a4b0d) не был доведён: в дереве остались файл
`env.example`, чтение instance .env во всём deploy/cli и CI, который этот .env
сам же и создавал из `env.example`. Из-за остатков ломались две вещи.

`chatballs deploy` не работал на установке без .env: _normalize_schema_ownership
брал POSTGRES_USER и POSTGRES_DB из файла и падал с «POSTGRES_USER not set»,
хотя установка исправна. Теперь берёт те же значения по умолчанию, что compose.

`chatballs doctor` выдавал пять ложных ошибок подряд: искал в .env домены,
ACME-почту, POSTGRES_PASSWORD и CHATBALLS_SECRET_KEY. Первое задаёт владелец
в «Настройках», второе генерирует в том с секретами первый старт стека —
снаружи, с хоста, этого не видно, и проверки убраны.

Убрано: env.example (из репозитория, release bundle и README); instance_env_file()
и все его чтения в common/compose/deploy/doctor/status; --env-file instance .env
из вызова compose — остаётся только release.env с digest-пинами образов от CI;
создание .env в gateway:validate. Профиль calls и его адреса читаются из
переменных окружения — оттуда же, откуда их берёт сам compose.

Тесты CLI переведены с фиктивного .env на переменные окружения; три проверки
удалённого поведения doctor убраны. Девять оставшихся проходят вообще без .env
— это и есть проверка, что установка теперь обслуживается. Заодно у
test_custocrm_cli.py выправлены окончания строк: в файле были одиночные CR
внутри кода, отчего diff по нему больше содержательной правки.

Проверено: pytest tests/cli — 9 passed; docker compose config валиден с пустым
каталогом инстанса; bash -n чист по всем скриптам CLI.

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

41 lines
1.4 KiB
Bash

#!/usr/bin/env bash
# status.sh — observability: версия, состояние сервисов, profiles, последняя
# ошибка (SPEC-HUB-0019 §29). Installation-status (NEW/READY/…) — этап 2.
cmd_status() {
local inst rel applied target
inst="$(instance_dir)"
rel="$(release_dir)"
target="$(env_get "$(release_env_file)" CHATBALLS_VERSION)"
applied="$(env_get "$(_state_file)" applied_version)"
if [[ "$CHATBALLS_JSON" == "1" ]]; then
printf '{"status":"info","instance":%s,"release_dir":%s,"target_version":%s,"applied_version":%s}\n' \
"$(json_escape "$inst")" "$(json_escape "$rel")" \
"$(json_escape "${target:-unknown}")" "$(json_escape "${applied:-none}")"
return 0
fi
printf 'Chatballs status\n'
printf ' instance dir: %s\n' "$inst"
printf ' release dir: %s\n' "$rel"
printf ' target version: %s\n' "${target:-unknown}"
printf ' applied version: %s\n' "${applied:-none}"
printf ' profiles: %s\n' "${COMPOSE_PROFILES:-none}"
if [[ -f "$(_state_file)" ]]; then
printf ' last applied at: %s\n' "$(env_get "$(_state_file)" applied_at)"
else
printf ' last applied at: (none)\n'
fi
if docker info >/dev/null 2>&1; then
printf '\nServices:\n'
run_compose ps 2>/dev/null || log_warn "compose ps failed (not deployed yet?)"
else
printf '\nServices: (docker daemon not reachable)\n'
fi
}
_state_file() { printf '%s/applied_release' "$(state_dir)"; }