🔧 Restructure scripts and add CLI tool

 New features:
- Add CLI tool for container command execution
- Reorganize all scripts into bin/ directory
- Create convenient wrappers in project root
- Add local changes auto-commit functionality
- Enhanced backup repository management

📁 Structure changes:
- Move all scripts to bin/ directory
- Create wrapper scripts in root (cli, update, start, stop, logs)
- Add setup-backup.sh for backup repository management
- Update documentation with new CLI examples

🛠️ CLI capabilities:
- Django commands (shell, migrate, collectstatic, etc.)
- System commands (bash, logs, status)
- Container management (restart, status)
- Interactive and non-interactive modes

📚 Documentation:
- Updated SCRIPTS_README.md with CLI examples
- Added troubleshooting section
- Comprehensive usage examples
This commit is contained in:
2025-11-25 06:51:52 +09:00
parent bd028d09e6
commit 8f1e0459fc
22 changed files with 618 additions and 64 deletions

207
bin/cli.sh Executable file
View File

@@ -0,0 +1,207 @@
#!/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_command> # Произвольная Django команда"
echo " $0 exec <system_command> # Произвольная системная команда"
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

45
bin/demo.sh Executable file
View File

@@ -0,0 +1,45 @@
#!/bin/bash
# =============================================================================
# SmartSolTech - Пример использования скриптов обновления
# =============================================================================
echo "🚀 Демонстрация скриптов управления SmartSolTech"
echo "=============================================="
echo ""
echo "📋 Доступные удаленные репозитории:"
git remote -v
echo ""
echo "📊 Текущий статус проекта:"
./update.sh --status
echo ""
echo "💡 Примеры команд обновления:"
echo ""
echo " # Стандартное обновление из основного репозитория"
echo " ./update.sh"
echo ""
echo " # Обновление из резервного репозитория"
echo " ./update.sh backup"
echo ""
echo " # Обновление из основного с созданием бэкапа в резервном"
echo " ./update.sh origin backup"
echo ""
echo " # Обновление из резервного с бэкапом в основной"
echo " ./update.sh backup origin"
echo ""
echo "🛠️ Другие полезные команды:"
echo ""
echo " ./start.sh # Быстрый запуск сервисов"
echo " ./stop.sh # Остановка сервисов"
echo " ./stop.sh --clean # Полная очистка"
echo " ./logs.sh # Просмотр логов"
echo " ./logs.sh web # Логи веб-сервера"
echo ""
echo "📚 Полная документация: cat SCRIPTS_README.md"
echo ""
echo "✅ Готово!"

85
bin/logs.sh Executable file
View File

@@ -0,0 +1,85 @@
#!/bin/bash
# =============================================================================
# SmartSolTech - Скрипт для отображения логов
# =============================================================================
# Цвета для вывода
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
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}"
}
# Проверка docker-compose.yml
if [ ! -f "docker-compose.yml" ]; then
error "docker-compose.yml не найден. Запустите скрипт из корня проекта."
exit 1
fi
# Обработка параметров
case "${1:-}" in
--help|-h)
echo "SmartSolTech - Скрипт для отображения логов"
echo ""
echo "Использование:"
echo " $0 - Показать все логи в реальном времени"
echo " $0 web - Показать только логи веб-сервера"
echo " $0 db - Показать только логи базы данных"
echo " $0 pgadmin - Показать только логи PgAdmin"
echo " $0 --tail 50 - Показать последние 50 строк"
echo " $0 --help - Показать эту справку"
echo ""
exit 0
;;
--tail)
if [ -z "$2" ]; then
error "Укажите количество строк для --tail"
exit 1
fi
log "Показываем последние $2 строк логов..."
docker-compose logs --tail=$2
;;
web|db|pgadmin)
log "Показываем логи сервиса $1..."
warning "Для выхода нажмите Ctrl+C"
sleep 2
docker-compose logs -f $1
;;
"")
echo ""
echo "📋 SmartSolTech - Логи сервисов"
echo "==============================="
echo ""
log "Статус сервисов:"
docker-compose ps
echo ""
log "Показываем все логи в реальном времени..."
warning "Для выхода нажмите Ctrl+C"
sleep 2
docker-compose logs -f
;;
*)
error "Неизвестный параметр: $1"
echo "Используйте --help для справки"
exit 1
;;
esac

157
bin/setup-backup.sh Executable file
View File

@@ -0,0 +1,157 @@
#!/bin/bash
# =============================================================================
# SmartSolTech - Настройка резервного репозитория
# =============================================================================
set -e
# Цвета для вывода
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
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}"
}
echo ""
echo "🔧 SmartSolTech - Настройка backup репозитория"
echo "=============================================="
echo ""
# Проверка что мы в Git репозитории
if [ ! -d ".git" ]; then
error "Не найден Git репозиторий. Запустите скрипт из корня проекта."
exit 1
fi
# Показать текущие репозитории
log "Текущие удаленные репозитории:"
git remote -v
echo ""
# Функция добавления нового backup репозитория
add_backup_repo() {
local repo_url="$1"
local repo_name="${2:-backup}"
log "Добавление backup репозитория..."
# Проверяем не существует ли уже такой remote
if git remote | grep -q "^${repo_name}$"; then
warning "Репозиторий $repo_name уже существует"
git remote -v | grep "^${repo_name}"
read -p "Заменить? (y/N): " replace_choice
if [[ $replace_choice =~ ^[Yy]$ ]]; then
git remote remove $repo_name
else
return 0
fi
fi
# Добавляем новый remote
if git remote add $repo_name "$repo_url"; then
success "Backup репозиторий $repo_name добавлен"
# Проверяем подключение
log "Проверка подключения..."
if git ls-remote $repo_name > /dev/null 2>&1; then
success "Подключение к $repo_name работает"
# Предлагаем сделать первый push
read -p "Отправить текущее состояние в backup? (y/N): " push_choice
if [[ $push_choice =~ ^[Yy]$ ]]; then
git push $repo_name master
success "Backup создан в $repo_name"
fi
else
error "Не удалось подключиться к $repo_name"
git remote remove $repo_name
return 1
fi
else
error "Не удалось добавить backup репозиторий"
return 1
fi
}
# Обработка параметров
case "${1:-}" in
--help|-h)
echo "Использование:"
echo " $0 # Интерактивная настройка"
echo " $0 <URL> # Добавить backup репозиторий"
echo " $0 <URL> <name> # Добавить с именем"
echo " $0 --remove <name> # Удалить backup репозиторий"
echo " $0 --list # Показать все репозитории"
echo ""
echo "Примеры:"
echo " $0 git@github.com:user/backup.git"
echo " $0 git@server.com:backup.git mybkp"
echo " $0 --remove backup"
echo ""
exit 0
;;
--list)
log "Все удаленные репозитории:"
git remote -v
exit 0
;;
--remove)
if [ -z "$2" ]; then
error "Укажите имя репозитория для удаления"
exit 1
fi
log "Удаление репозитория $2..."
if git remote remove "$2"; then
success "Репозиторий $2 удален"
else
error "Не удалось удалить репозиторий $2"
fi
exit 0
;;
"")
# Интерактивный режим
echo "💡 Примеры URL репозиториев:"
echo " git@github.com:username/repo-backup.git"
echo " ssh://git@server.com:2222/user/backup.git"
echo " https://github.com/username/repo-backup.git"
echo ""
read -p "Введите URL backup репозитория: " repo_url
if [ -z "$repo_url" ]; then
warning "URL не указан, выход"
exit 0
fi
read -p "Введите имя (backup): " repo_name
repo_name="${repo_name:-backup}"
add_backup_repo "$repo_url" "$repo_name"
;;
*)
# URL передан как параметр
add_backup_repo "$1" "$2"
;;
esac
echo ""
log "Обновленный список репозиториев:"
git remote -v
echo ""
success "Готово!"

67
bin/start.sh Executable file
View File

@@ -0,0 +1,67 @@
#!/bin/bash
# =============================================================================
# SmartSolTech - Быстрый скрипт запуска разработки
# =============================================================================
set -e
# Цвета для вывода
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
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}"
}
echo ""
echo "🚀 SmartSolTech - Быстрый запуск"
echo "==============================="
echo ""
# Проверка docker-compose.yml
if [ ! -f "docker-compose.yml" ]; then
echo "❌ docker-compose.yml не найден. Запустите скрипт из корня проекта."
exit 1
fi
# Запуск контейнеров
log "Запуск сервисов..."
docker-compose up -d
# Ожидание готовности
log "Ожидание готовности сервисов..."
sleep 10
# Статус
echo ""
log "Статус сервисов:"
docker-compose ps
echo ""
success "Сервисы запущены!"
echo ""
echo "📊 Доступные ресурсы:"
echo " • Веб-сайт: http://localhost:8000"
echo " • Админка: http://localhost:8000/admin"
echo " • PgAdmin: http://localhost:8080"
echo ""
# Предложение показать логи
read -p "Показать логи в реальном времени? (y/N): " show_logs_choice
if [[ $show_logs_choice =~ ^[Yy]$ ]]; then
echo ""
warning "Для выхода из логов нажмите Ctrl+C"
sleep 2
docker-compose logs -f
fi

91
bin/stop.sh Executable file
View File

@@ -0,0 +1,91 @@
#!/bin/bash
# =============================================================================
# SmartSolTech - Скрипт остановки сервисов
# =============================================================================
set -e
# Цвета для вывода
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
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}"
}
echo ""
echo "🛑 SmartSolTech - Остановка сервисов"
echo "==================================="
echo ""
# Проверка docker-compose.yml
if [ ! -f "docker-compose.yml" ]; then
error "docker-compose.yml не найден. Запустите скрипт из корня проекта."
exit 1
fi
# Показать текущий статус
log "Текущий статус сервисов:"
docker-compose ps
echo ""
# Остановка сервисов
log "Остановка сервисов..."
# Проверяем параметры
case "${1:-}" in
--remove|-r)
log "Удаление контейнеров и волюмов..."
docker-compose down -v --remove-orphans
success "Сервисы остановлены, контейнеры и волюмы удалены"
;;
--clean|-c)
log "Полная очистка (контейнеры, образы, волюмы)..."
docker-compose down -v --rmi all --remove-orphans
success "Сервисы остановлены, все ресурсы очищены"
;;
--help|-h)
echo "SmartSolTech - Скрипт остановки сервисов"
echo ""
echo "Использование:"
echo " $0 - Простая остановка контейнеров"
echo " $0 --remove - Остановка + удаление контейнеров и волюмов"
echo " $0 --clean - Полная очистка (контейнеры + образы + волюмы)"
echo " $0 --help - Показать эту справку"
echo ""
exit 0
;;
"")
docker-compose down
success "Сервисы остановлены"
;;
*)
error "Неизвестный параметр: $1"
echo "Используйте --help для справки"
exit 1
;;
esac
echo ""
log "Итоговый статус:"
docker-compose ps
echo ""
success "Готово!"

370
bin/update.sh Executable file
View File

@@ -0,0 +1,370 @@
#!/bin/bash
# =============================================================================
# SmartSolTech - Скрипт автоматического обновления
# =============================================================================
set -e # Выход при любой ошибке
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Функция для логирования
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}"
}
# Функция проверки зависимостей
check_dependencies() {
log "Проверка зависимостей..."
if ! command -v git &> /dev/null; then
error "Git не установлен"
exit 1
fi
if ! command -v docker &> /dev/null; then
error "Docker не установлен"
exit 1
fi
if ! command -v docker-compose &> /dev/null; then
error "Docker Compose не установлен"
exit 1
fi
success "Все зависимости найдены"
}
# Функция очистки staticfiles
cleanup_staticfiles() {
log "Очистка staticfiles..."
if [ -d "smartsoltech/staticfiles" ]; then
warning "Найдена папка staticfiles, удаляем..."
chmod -R 755 smartsoltech/staticfiles 2>/dev/null || true
rm -rf smartsoltech/staticfiles
success "Staticfiles очищены"
fi
}
# Функция сохранения локальных изменений
save_local_changes() {
log "Проверка локальных изменений..."
# Проверяем есть ли изменения в рабочей директории или индексе
if [ -n "$(git status --porcelain)" ]; then
warning "Обнаружены локальные изменения, сохраняем в коммит..."
# Добавляем все изменения
git add .
# Создаем коммит с временной меткой
local commit_msg="Auto commit before update $(date '+%Y-%m-%d %H:%M:%S')"
if git commit -m "$commit_msg"; then
success "Локальные изменения сохранены в коммит"
log "Коммит: $commit_msg"
else
warning "Не удалось создать коммит (возможно нет изменений для коммита)"
fi
else
log "Локальных изменений не обнаружено"
fi
}
update_code() {
local remote_name="${1:-origin}"
log "Обновление кода из репозитория $remote_name..."
# Проверяем существование удаленного репозитория
if ! git remote | grep -q "^${remote_name}$"; then
error "Удаленный репозиторий '$remote_name' не найден"
log "Доступные репозитории:"
git remote -v
return 1
fi
# Настраиваем стратегию pull если не настроено
if [ -z "$(git config pull.rebase 2>/dev/null)" ]; then
log "Настраиваем стратегию Git pull..."
git config pull.rebase false
fi
# Получаем обновления
log "Получение обновлений из $remote_name..."
git fetch $remote_name
# Обновляем текущую ветку
local current_branch
current_branch=$(git rev-parse --abbrev-ref HEAD)
# Пробуем обновить с обработкой конфликтов
if ! git pull $remote_name $current_branch; then
error "Не удалось обновить код. Возможно есть конфликты."
log "Попробуйте выполнить команды вручную:"
log " git status"
log " git merge --abort # если нужно отменить"
log " git pull $remote_name $current_branch"
return 1
fi
success "Код обновлен с ветки $current_branch из $remote_name"
}
# Функция остановки контейнеров
stop_containers() {
log "Остановка контейнеров..."
if docker-compose ps | grep -q "Up"; then
docker-compose down
success "Контейнеры остановлены"
else
warning "Контейнеры уже остановлены"
fi
}
# Функция сборки образов
build_images() {
log "Сборка Docker образов..."
# Принудительная пересборка
docker-compose build --no-cache
success "Образы собраны"
}
# Функция запуска контейнеров
start_containers() {
log "Запуск контейнеров..."
# Запуск в фоновом режиме
docker-compose up -d
# Ожидание готовности
log "Ожидание готовности сервисов..."
sleep 10
# Проверка статуса
if docker-compose ps | grep -q "Exit"; then
error "Некоторые контейнеры завершились с ошибкой"
docker-compose ps
return 1
fi
success "Контейнеры запущены"
}
# Функция выполнения миграций
run_migrations() {
log "Выполнение миграций Django..."
# Ожидание готовности БД
log "Ожидание готовности базы данных..."
sleep 15
# Выполнение миграций
docker-compose exec -T web python smartsoltech/manage.py migrate
success "Миграции выполнены"
}
# Функция сбора статических файлов
collect_static() {
log "Сбор статических файлов..."
docker-compose exec -T web python smartsoltech/manage.py collectstatic --noinput
success "Статические файлы собраны"
}
# Функция проверки состояния сервисов
health_check() {
log "Проверка состояния сервисов..."
# Проверка веб-сервера
local max_attempts=30
local attempt=1
while [ $attempt -le $max_attempts ]; do
if curl -sf http://localhost:8000/ > /dev/null 2>&1; then
success "Веб-сервер доступен"
break
fi
if [ $attempt -eq $max_attempts ]; then
error "Веб-сервер недоступен после $max_attempts попыток"
return 1
fi
log "Попытка $attempt/$max_attempts - ожидание веб-сервера..."
sleep 5
((attempt++))
done
# Показать статус контейнеров
echo ""
log "Статус контейнеров:"
docker-compose ps
success "Проверка здоровья завершена"
}
# Функция отображения логов
show_logs() {
log "Последние логи сервисов:"
echo ""
docker-compose logs --tail=20 web
}
# Функция бэкапа в удаленный репозиторий
backup_to_remote() {
local backup_remote="${1:-backup}"
# Пропускаем если это тот же репозиторий что используется для обновления
local update_remote="${2:-origin}"
if [ "$backup_remote" = "$update_remote" ]; then
log "Пропускаем бэкап - используется тот же репозиторий для обновления"
return 0
fi
log "Создание бэкапа в удаленном репозитории $backup_remote..."
if git remote | grep -q "^${backup_remote}$"; then
# Пушим текущее состояние в backup (изменения уже сохранены в коммит)
if git push $backup_remote master; then
success "Бэкап создан в удаленном репозитории $backup_remote"
else
warning "Не удалось создать бэкап в $backup_remote"
fi
else
warning "$backup_remote репозиторий не настроен, пропускаем бэкап"
fi
}
# Главная функция
main() {
local remote_source="${1:-origin}"
local backup_remote="${2:-backup}"
echo ""
echo "🚀 SmartSolTech - Автоматическое обновление"
echo "=========================================="
echo "📡 Источник: $remote_source"
if git remote | grep -q "^${backup_remote}$"; then
echo "💾 Бэкап: $backup_remote"
fi
echo ""
# Проверка что мы в правильной директории
if [ ! -f "docker-compose.yml" ]; then
error "docker-compose.yml не найден. Запустите скрипт из корня проекта."
exit 1
fi
local start_time
start_time=$(date +%s)
# Выполняем все этапы
check_dependencies
save_local_changes
backup_to_remote "$backup_remote" "$remote_source"
cleanup_staticfiles
update_code "$remote_source"
stop_containers
build_images
start_containers
run_migrations
collect_static
health_check
local end_time
end_time=$(date +%s)
local duration=$((end_time - start_time))
echo ""
echo "🎉 Обновление завершено успешно!"
echo "⏱️ Время выполнения: ${duration} секунд"
echo "📡 Источник обновления: $remote_source"
echo ""
echo "📊 Полезная информация:"
echo " • Веб-сайт: http://localhost:8000"
echo " • Админка: http://localhost:8000/admin"
echo " • PgAdmin: http://localhost:8080"
echo ""
# Предложение показать логи
read -p "Показать логи сервисов? (y/N): " show_logs_choice
if [[ $show_logs_choice =~ ^[Yy]$ ]]; then
show_logs
fi
success "Готово!"
}
# Обработка прерываний
trap 'echo ""; error "Обновление прервано пользователем"; exit 130' INT TERM
# Обработка ошибок
error_handler() {
local line_no=$1
error "Ошибка на строке $line_no"
echo ""
echo "Для диагностики можете выполнить:"
echo " docker-compose logs"
echo " docker-compose ps"
exit 1
}
trap 'error_handler $LINENO' ERR
# Запуск с параметрами
case "${1:-}" in
--help|-h)
echo "SmartSolTech - Скрипт автоматического обновления"
echo ""
echo "Использование:"
echo " $0 - Полное обновление из origin (по умолчанию)"
echo " $0 origin - Обновление из origin репозитория"
echo " $0 backup - Обновление из backup репозитория"
echo " $0 origin backup - Обновление из origin с бэкапом в backup"
echo " $0 backup origin - Обновление из backup с бэкапом в origin"
echo " $0 --help - Показать эту справку"
echo " $0 --logs - Показать логи без обновления"
echo " $0 --status - Показать статус без обновления"
echo ""
echo "Примеры:"
echo " $0 # обновление из origin"
echo " $0 backup # обновление из backup репозитория"
echo " $0 origin backup # обновление из origin, бэкап в backup"
echo ""
exit 0
;;
--logs)
show_logs
exit 0
;;
--status)
docker-compose ps
health_check
exit 0
;;
*)
# Передаем все параметры в main
main "$@"
;;
esac

50
bin/update_bot_token.sh Executable file
View File

@@ -0,0 +1,50 @@
#!/bin/bash
# Скрипт для обновления токена Telegram бота
# Использование: ./update_bot_token.sh "НОВЫЙ_ТОКЕН"
if [ $# -eq 0 ]; then
echo "❌ Ошибка: Необходимо указать токен"
echo "Использование: $0 \"НОВЫЙ_ТОКЕН\""
echo ""
echo "Пример: $0 \"1234567890:ABCDEFghijklmnopqrstuvwxyz\""
echo ""
echo "Получите токен от @BotFather в Telegram:"
echo "1. Отправьте /mybots"
echo "2. Выберите своего бота"
echo "3. Нажмите 'API Token'"
exit 1
fi
NEW_TOKEN="$1"
echo "🔄 Обновление токена Telegram бота..."
# Проверяем валидность токена
echo "🔍 Проверка валидности токена..."
RESPONSE=$(curl -s "https://api.telegram.org/bot${NEW_TOKEN}/getMe")
if echo "$RESPONSE" | grep -q '"ok":true'; then
BOT_USERNAME=$(echo "$RESPONSE" | grep -o '"username":"[^"]*"' | cut -d'"' -f4)
echo "✅ Токен валиден! Бот: @${BOT_USERNAME}"
else
echo "❌ Ошибка: Токен невалиден!"
echo "Ответ API: $RESPONSE"
exit 1
fi
# Обновляем токен в базе данных
echo "💾 Обновление токена в базе данных..."
docker exec postgres_db psql -U trevor -d 2st_db -c "
UPDATE comunication_telegramsettings
SET bot_token = '$NEW_TOKEN', bot_name = '@${BOT_USERNAME}'
WHERE id = 1;
"
if [ $? -eq 0 ]; then
echo "✅ Токен успешно обновлен в базе данных!"
echo "🔄 Перезапуск контейнера telegram_bot..."
docker restart telegram_bot
echo "🎉 Готово! Проверьте логи: docker logs telegram_bot"
else
echo "❌ Ошибка при обновлении базы данных"
exit 1
fi