mirror of
https://github.com/dartdavros/chatballs.git
synced 2026-10-05 09:14:58 +03:00
Переход на запуск без .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>
75 lines
2.5 KiB
Bash
75 lines
2.5 KiB
Bash
#!/usr/bin/env bash
|
|
# chatballs — единый deployment entrypoint Chatballs (ADR-HUB-0028 §CLI).
|
|
# Команды этапа 1: doctor, deploy, status, logs.
|
|
# (install/setup-url/update/backup/restore/rollback — этап 2.)
|
|
#
|
|
# Не требует Python/Node на host. POSIX bash + flock. Запускается из instance dir;
|
|
# release-файлы (compose.yaml, Caddyfile, release.env) лежат в release dir и
|
|
# проектируются в instance через symlink (см. lib/compose.sh).
|
|
set -euo pipefail
|
|
|
|
CHATBALLS_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
|
|
: "${CHATBALLS_RELEASE_DIR:=$CHATBALLS_SCRIPT_DIR}"
|
|
: "${CHATBALLS_INSTANCE_DIR:=$PWD}"
|
|
export CHATBALLS_RELEASE_DIR CHATBALLS_INSTANCE_DIR
|
|
CLI_LIB_DIR="$CHATBALLS_RELEASE_DIR/deploy/cli/lib"
|
|
|
|
# shellcheck source=deploy/cli/lib/common.sh
|
|
. "$CLI_LIB_DIR/common.sh"
|
|
# shellcheck source=deploy/cli/lib/compose.sh
|
|
. "$CLI_LIB_DIR/compose.sh"
|
|
# shellcheck source=deploy/cli/lib/doctor.sh
|
|
. "$CLI_LIB_DIR/doctor.sh"
|
|
# shellcheck source=deploy/cli/lib/deploy.sh
|
|
. "$CLI_LIB_DIR/deploy.sh"
|
|
# shellcheck source=deploy/cli/lib/status.sh
|
|
. "$CLI_LIB_DIR/status.sh"
|
|
# shellcheck source=deploy/cli/lib/logs.sh
|
|
. "$CLI_LIB_DIR/logs.sh"
|
|
|
|
usage() {
|
|
cat >&2 <<'USAGE'
|
|
Chatballs deployment CLI (stage 1).
|
|
|
|
Usage: chatballs <command> [options]
|
|
|
|
Commands:
|
|
doctor Pre-flight checks (no container starts, no data changes).
|
|
deploy Apply the active release (canonical workflow).
|
|
status Show versions, services, profiles.
|
|
logs [service] Tail compose logs (optional service filter).
|
|
|
|
Global options:
|
|
--non-interactive Suppress prompts (CI). Destructive ops require this or a tty.
|
|
--json Machine-readable output (status/doctor errors).
|
|
|
|
Environment:
|
|
CHATBALLS_RELEASE_DIR Release bundle dir (default: script dir).
|
|
CHATBALLS_INSTANCE_DIR Instance dir with data/ and state/ (default: $PWD).
|
|
USAGE
|
|
}
|
|
|
|
cmd="${1:-}"
|
|
[[ -n "$cmd" ]] || { usage; exit 2; }
|
|
shift || true
|
|
|
|
# Разбор глобальных флагов: --non-interactive/--json могут стоять до или после команды.
|
|
rest=()
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--non-interactive) CHATBALLS_NON_INTERACTIVE=1; shift ;;
|
|
--json) CHATBALLS_JSON=1; shift ;;
|
|
*) rest+=("$1"); shift ;;
|
|
esac
|
|
done
|
|
set -- "${rest[@]}"
|
|
|
|
case "$cmd" in
|
|
doctor) cmd_doctor "$@" ;;
|
|
deploy) cmd_deploy "$@" ;;
|
|
status) cmd_status "$@" ;;
|
|
logs) cmd_logs "$@" ;;
|
|
-h|--help|help) usage; exit 0 ;;
|
|
*) log_err "unknown command: $cmd"; usage; exit 2 ;;
|
|
esac
|