#!/usr/bin/env bash set -Eeuo pipefail # === Настройки === SERVICE="bot" # имя сервиса в docker-compose.yml APP_DIR="/app" # рабочая директория в контейнере HOST_DB_DIR="./db" # каталог БД на хосте HOST_DB_FILE="./db/bot.db" # файл БД на хосте DEFAULT_DB_URL="sqlite+aiosqlite:////app/db/bot.db" # единый путь БД внутри контейнера log() { echo -e "[update.sh] $*"; } # === Работаем из директории скрипта === cd "$(dirname "${BASH_SOURCE[0]}")" # === Приводим БД к каталогу ./db/bot.db === log "Проверка корректности БД (./db/bot.db)..." mkdir -p "${HOST_DB_DIR}" # если раньше был конфликтный объект ./bot.db if [[ -d "./bot.db" ]]; then log "Найдена ПАПКА ./bot.db → удаляю, чтобы не конфликтовала с файлом БД." rm -rf ./bot.db fi if [[ -f "./bot.db" && ! -f "${HOST_DB_FILE}" ]]; then log "Переношу старый файл ./bot.db в ${HOST_DB_FILE} ..." mv ./bot.db "${HOST_DB_FILE}" fi if [[ ! -f "${HOST_DB_FILE}" ]]; then log "Создаю пустой файл БД: ${HOST_DB_FILE}" :> "${HOST_DB_FILE}" fi # === .env: страхуем DATABASE_URL === if [[ -f ".env" ]]; then if ! grep -q '^DATABASE_URL=' .env; then log "В .env не найден DATABASE_URL — дописываю с ${DEFAULT_DB_URL}" echo "DATABASE_URL=${DEFAULT_DB_URL}" >> .env fi else log "Файл .env не найден — создаю и прописываю DATABASE_URL=${DEFAULT_DB_URL}" echo "DATABASE_URL=${DEFAULT_DB_URL}" > .env fi # === Git pull === log "Получение свежего кода (git pull --rebase --autostash)..." git pull --rebase --autostash # === Пересборка образа === log "Пересборка контейнера..." docker compose build --no-cache # === (Опционально) создаём ревизию Alembic с комментарием === MIG_MSG="${1-}" if [[ -z "${MIG_MSG}" ]]; then read -rp "[update.sh] Комментарий для новой миграции Alembic (Enter — пропустить создание ревизии): " MIG_MSG fi if [[ -n "${MIG_MSG}" ]]; then log "Создание ревизии Alembic с комментарием: ${MIG_MSG}" docker compose run --rm -T \ -e MIG_MSG="${MIG_MSG}" \ "${SERVICE}" sh -lc "cd '${APP_DIR}' && alembic revision --autogenerate -m \"\${MIG_MSG}\"" else log "Создание ревизии пропущено." fi # === Применяем миграции === log "Применение миграций Alembic (upgrade head)..." docker compose run --rm -T "${SERVICE}" sh -lc "cd '${APP_DIR}' && alembic upgrade head" # === Запуск приложения === log "Запуск контейнера в фоне..." docker compose up -d # === Мини-проверка окружения и таблиц === log "Проверка DATABASE_URL внутри контейнера и списка таблиц..." docker compose exec -T "${SERVICE}" sh -lc " echo 'DATABASE_URL='\"\$DATABASE_URL\"; if [ -f /app/db/bot.db ]; then echo '[DB] /app/db/bot.db найден. Таблицы:'; sqlite3 /app/db/bot.db '.tables' || true; elif [ -f /db/bot.db ]; then echo '[DB] /db/bot.db найден (проверь docker-compose volume!). Таблицы:'; sqlite3 /db/bot.db '.tables' || true; else echo 'Файл БД не найден в стандартных путях /app/db/bot.db или /db/bot.db'; fi " log "Готово!"