sript update
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2025-09-06 13:44:07 +09:00
parent 2bcf07f6a9
commit e8a2a2ebc7
2 changed files with 57 additions and 49 deletions

View File

@@ -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 'Вним