From e8a2a2ebc704ad7c6d76f93140b49668ea788a0f Mon Sep 17 00:00:00 2001 From: "Choi A.K." Date: Sat, 6 Sep 2025 13:44:07 +0900 Subject: [PATCH] sript update --- bin/update.sh | 106 +++++++++++++++++++++++++++----------------------- update.sh | 0 2 files changed, 57 insertions(+), 49 deletions(-) delete mode 100644 update.sh diff --git a/bin/update.sh b/bin/update.sh index 6f6056f..7705344 100755 --- a/bin/update.sh +++ b/bin/update.sh @@ -1,29 +1,28 @@ #!/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" # единый путь БД внутри контейнера +SERVICE="bot" # имя сервиса в docker-compose +APP_DIR="/app" # рабочая директория в контейнере +HOST_DB_DIR="./db" # каталог БД на хосте +HOST_DB_FILE="./db/bot.db" # файл БД на хосте +DB_URL_DEFAULT="sqlite+aiosqlite:///db/bot.db" # единый путь БД в контейнере -log() { echo -e "[update.sh] $*"; } +log(){ echo -e "[update.sh] $*"; } +die(){ echo -e "[update.sh][ERROR] $*" >&2; exit 1; } -# === Работаем из директории скрипта === -cd "$(dirname "${BASH_SOURCE[0]}")" +cd "$(dirname "${BASH_SOURCE[0]}")/.." -# === Приводим БД к каталогу ./db/bot.db === -log "Проверка корректности БД (./db/bot.db)..." +# --- 0) Приводим БД к ./db/bot.db и .env к единому URL --- +log "Проверка каталога БД ${HOST_DB_DIR} ..." mkdir -p "${HOST_DB_DIR}" -# если раньше был конфликтный объект ./bot.db +# гашим древний конфликт ./bot.db (файл/папка) if [[ -d "./bot.db" ]]; then - log "Найдена ПАПКА ./bot.db → удаляю, чтобы не конфликтовала с файлом БД." + log "Удаляю конфликтующую ПАПКУ ./bot.db" rm -rf ./bot.db fi if [[ -f "./bot.db" && ! -f "${HOST_DB_FILE}" ]]; then - log "Переношу старый файл ./bot.db в ${HOST_DB_FILE} ..." + log "Переношу старый файл ./bot.db -> ${HOST_DB_FILE}" mv ./bot.db "${HOST_DB_FILE}" fi if [[ ! -f "${HOST_DB_FILE}" ]]; then @@ -31,61 +30,70 @@ if [[ ! -f "${HOST_DB_FILE}" ]]; then :> "${HOST_DB_FILE}" fi -# === .env: страхуем DATABASE_URL === -if [[ -f ".env" ]]; then +# .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 + log "В .env не найден DATABASE_URL — дописываю ${DB_URL_DEFAULT}" + echo "DATABASE_URL=${DB_URL_DEFAULT}" >> .env + else + # аккуратно заменим на нужный абсолютный путь, если другой + sed -i "s|^DATABASE_URL=.*$|DATABASE_URL=${DB_URL_DEFAULT}|g" .env + log "DATABASE_URL в .env → ${DB_URL_DEFAULT}" fi else - log "Файл .env не найден — создаю и прописываю DATABASE_URL=${DEFAULT_DB_URL}" - echo "DATABASE_URL=${DEFAULT_DB_URL}" > .env + log "Создаю .env с DATABASE_URL=${DB_URL_DEFAULT}" + echo "DATABASE_URL=${DB_URL_DEFAULT}" > .env fi -# === Git pull === -log "Получение свежего кода (git pull --rebase --autostash)..." -git pull --rebase --autostash +# --- 1) git pull + build --- +log "git pull --rebase --autostash ..." +git pull --rebase --autostash || die "git pull не удался" -# === Пересборка образа === -log "Пересборка контейнера..." +log "Пересборка образа ..." docker compose build --no-cache -# === (Опционально) создаём ревизию Alembic с комментарием === +# --- 2) Функция безопасного апгрейда Alembic --- +safe_upgrade() { + log "alembic upgrade head ..." + if docker compose run --rm -T "${SERVICE}" sh -lc "cd '${APP_DIR}' && alembic upgrade head"; then + return 0 + fi + log "upgrade head не прошёл. Пытаюсь выровнять ревизии: alembic stamp head → upgrade head" + docker compose run --rm -T "${SERVICE}" sh -lc "cd '${APP_DIR}' && alembic stamp head" || die "alembic stamp head провалился" + docker compose run --rm -T "${SERVICE}" sh -lc "cd '${APP_DIR}' && alembic upgrade head" || die "alembic upgrade head провалился повторно" +} + +# --- 3) Сначала выравниваем цепочку миграций --- +safe_upgrade + +# --- 4) (Опционально) создаём новую ревизию с твоим комментарием --- MIG_MSG="${1-}" if [[ -z "${MIG_MSG}" ]]; then - read -rp "[update.sh] Комментарий для новой миграции Alembic (Enter — пропустить создание ревизии): " MIG_MSG + read -rp "[update.sh] Комментарий для новой миграции (Enter — пропустить): " MIG_MSG || true 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}\"" + log "Создаю ревизию Alembic с комментарием: ${MIG_MSG}" + docker compose run --rm -T "${SERVICE}" sh -lc "cd '${APP_DIR}' && alembic revision --autogenerate -m \"${MIG_MSG}\"" \ + || die "alembic revision --autogenerate не удался" + # применяем новую ревизию + safe_upgrade else log "Создание ревизии пропущено." fi -# === Применяем миграции === -log "Применение миграций Alembic (upgrade head)..." -docker compose run --rm -T "${SERVICE}" sh -lc "cd '${APP_DIR}' && alembic upgrade head" +# --- 5) Запуск сервиса и пост-проверки --- +log "Запускаю контейнер ..." +docker compose up -d || die "docker compose up -d не удался" -# === Запуск приложения === -log "Запуск контейнера в фоне..." -docker compose up -d - -# === Мини-проверка окружения и таблиц === -log "Проверка DATABASE_URL внутри контейнера и списка таблиц..." +log "Проверка переменных и таблиц внутри контейнера ..." docker compose exec -T "${SERVICE}" sh -lc " echo 'DATABASE_URL='\"\$DATABASE_URL\"; + cd '${APP_DIR}'; + echo 'Alembic HEADS:'; alembic heads -v || true; + echo 'Alembic CURRENT:'; alembic current -v || true; if [ -f /app/db/bot.db ]; then - echo '[DB] /app/db/bot.db найден. Таблицы:'; + echo 'Таблицы SQLite (./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 "Готово!" + echo 'Вним diff --git a/update.sh b/update.sh deleted file mode 100644 index e69de29..0000000