#!/bin/bash # ============================================================================= # SmartSolTech - CLI для выполнения команд в контейнере веб-приложения # ============================================================================= set -e # Цвета для вывода GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' RED='\033[0;31m' CYAN='\033[0;36m' NC='\033[0m' log() { echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" } success() { echo -e "${GREEN}✅ $1${NC}" } warning() { echo -e "${YELLOW}⚠️ $1${NC}" } error() { echo -e "${RED}❌ $1${NC}" } info() { echo -e "${CYAN}ℹ️ $1${NC}" } # Имя контейнера Django CONTAINER_NAME="django_app" # Проверка что контейнер запущен check_container() { if ! docker ps --format "table {{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then error "Контейнер $CONTAINER_NAME не запущен" warning "Запустите сервисы командой: ./bin/start.sh" return 1 fi } # Выполнение команды в контейнере run_in_container() { local cmd="$*" log "Выполнение в контейнере: $cmd" docker exec -it $CONTAINER_NAME $cmd } # Выполнение Django команды run_django_command() { local django_cmd="$*" run_in_container python smartsoltech/manage.py $django_cmd } # Выполнение команды без интерактивности run_in_container_quiet() { local cmd="$*" docker exec $CONTAINER_NAME $cmd } # Django команды без интерактивности run_django_command_quiet() { local django_cmd="$*" run_in_container_quiet python smartsoltech/manage.py $django_cmd } # Показать справку show_help() { echo "SmartSolTech CLI - Выполнение команд в контейнере веб-приложения" echo "" echo "Использование:" echo " $0 <команда> [аргументы...]" echo "" echo "Django команды:" echo " $0 shell # Django shell" echo " $0 dbshell # Database shell" echo " $0 migrate # Выполнить миграции" echo " $0 makemigrations # Создать миграции" echo " $0 collectstatic # Собрать статические файлы" echo " $0 createsuperuser # Создать суперпользователя" echo " $0 check # Проверка проекта" echo " $0 runserver # Запуск dev сервера" echo "" echo "Системные команды:" echo " $0 bash # Bash оболочка в контейнере" echo " $0 sh # Sh оболочка в контейнере" echo " $0 ps # Список процессов в контейнере" echo " $0 logs [lines] # Логи приложения (по умолчанию 50 строк)" echo "" echo "Пользовательские команды:" echo " $0 manage # Произвольная Django команда" echo " $0 exec # Произвольная системная команда" echo "" echo "Специальные команды:" echo " $0 status # Статус контейнеров" echo " $0 restart # Перезапуск веб-контейнера" echo " $0 --help # Показать эту справку" echo "" echo "Примеры:" echo " $0 shell # Django shell" echo " $0 manage showmigrations # Показать статус миграций" echo " $0 exec cat /app/requirements.txt # Показать зависимости" echo " $0 logs 100 # Последние 100 строк логов" echo "" } # Проверка параметров и выполнение команд case "${1:-}" in --help|-h|help) show_help exit 0 ;; # Django команды shell|dbshell|migrate|makemigrations|collectstatic|createsuperuser|check|runserver) check_container run_django_command "$@" ;; # Системные команды bash|sh) check_container run_in_container "$@" ;; ps) check_container run_in_container_quiet ps aux ;; logs) check_container lines="${2:-50}" info "Показываем последние $lines строк логов..." docker logs --tail=$lines $CONTAINER_NAME ;; # Пользовательские команды manage) check_container shift # убираем 'manage' из аргументов run_django_command "$@" ;; exec) check_container shift # убираем 'exec' из аргументов run_in_container "$@" ;; # Специальные команды status) echo "" info "Статус контейнеров:" docker-compose ps echo "" if docker ps --format "table {{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then success "Веб-контейнер $CONTAINER_NAME запущен" info "Процессы в контейнере:" docker exec $CONTAINER_NAME ps aux | head -10 else warning "Веб-контейнер $CONTAINER_NAME не запущен" fi ;; restart) log "Перезапуск веб-контейнера..." docker-compose restart web success "Веб-контейнер перезапущен" ;; "") error "Не указана команда" echo "" echo "Используйте '$0 --help' для справки" echo "" echo "Быстрые команды:" echo " $0 shell # Django shell" echo " $0 bash # Bash в контейнере" echo " $0 status # Статус сервисов" exit 1 ;; *) # Пробуем выполнить как Django команду check_container log "Попытка выполнить как Django команду: $*" if run_django_command_quiet help "$1" >/dev/null 2>&1; then run_django_command "$@" else error "Неизвестная команда: $1" echo "" echo "Попробуйте:" echo " $0 --help # Полная справка" echo " $0 manage help # Список Django команд" echo " $0 exec $* # Выполнить как системную команду" exit 1 fi ;; esac