/
DATKAI
/
ITCUP
Обзор
Документация
Войти
/
DATKAI
/
ITCUP
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
deploy/update.sh
94 строки
4 KB
DATKAI
fix(update): git fetch --force для тегов (устраняет 'would clobber existing tag')
01 июл 2026, 20:53
01 июл 2026, 20:53
645f99a
Код
Авторство
О чём код?
#!/usr/bin/env bash # # ITCUP — обновление уже развёрнутого приложения из GitVerse. # Запускается вручную или из админ-панели (страница «Обновление системы»). # Выполняется от имени пользователя приложения (www-data), из корня проекта. # set -euo pipefail # Новые файлы — доступны на запись группе (чтобы root/www-data не мешали друг другу) umask 0002 APP_DIR="${APP_DIR:-/var/www/itcup}" BRANCH="${BRANCH:-main}" cd "$APP_DIR" # Проверка прав: все ли файлы принадлежат текущему пользователю if [ -n "$(find "$APP_DIR/public" "$APP_DIR/vendor" ! -user "$(id -un)" -print -quit 2>/dev/null)" ]; then echo "!! В проекте есть файлы, принадлежащие другому пользователю." echo "!! Выполните от root: chown -R www-data:www-data $APP_DIR" fi echo "==> Текущая версия: $(git describe --tags --always 2>/dev/null || echo '?')" echo "==> Загрузка списка версий (fetch + tags)" git fetch --all --tags --prune --force --quiet # Куда переключаемся: # TARGET_REF задан → конкретный тег/ветка (обновление или откат) # не задан → последний по версии тег, иначе ветка ${BRANCH} TARGET_REF="${TARGET_REF:-}" if [ -z "$TARGET_REF" ]; then ALL_TAGS="$(git tag --sort=-v:refname)" TARGET_REF="${ALL_TAGS%%$'\n'*}" # первая строка без пайпа (безопасно при pipefail) [ -n "$TARGET_REF" ] || TARGET_REF="origin/${BRANCH}" fi ### ── Бэкап БД перед любыми изменениями ──────────────────────────────────────── env_val(){ grep -E "^$1=" "$APP_DIR/.env" 2>/dev/null | tail -n1 | cut -d= -f2- | sed -e 's/^"//' -e 's/"$//'; } if [ "${SKIP_BACKUP:-0}" != "1" ] && [ "$(env_val DB_CONNECTION)" = "pgsql" ]; then BACKUP_DIR="$APP_DIR/storage/backups" mkdir -p "$BACKUP_DIR" CUR_VER="$(git describe --tags --always 2>/dev/null || echo unknown)" STAMP="$(date +%Y%m%d-%H%M%S)" BACKUP_FILE="$BACKUP_DIR/db-${STAMP}-${CUR_VER}.sql.gz" DB_H="$(env_val DB_HOST)"; DB_H="${DB_H:-127.0.0.1}" DB_P="$(env_val DB_PORT)"; DB_P="${DB_P:-5432}" echo "==> Бэкап БД → ${BACKUP_FILE}" if PGPASSWORD="$(env_val DB_PASSWORD)" pg_dump \ -h "$DB_H" -p "$DB_P" \ -U "$(env_val DB_USERNAME)" "$(env_val DB_DATABASE)" 2>/dev/null | gzip > "$BACKUP_FILE"; then echo " бэкап сохранён ($(du -h "$BACKUP_FILE" | cut -f1))" # Храним последние 10 бэкапов ls -1t "$BACKUP_DIR"/db-*.sql.gz 2>/dev/null | tail -n +11 | xargs -r rm -f else echo "!! Не удалось создать бэкап БД." rm -f "$BACKUP_FILE" if [ "${FORCE:-0}" != "1" ]; then echo "!! Прерываю (запустите с FORCE=1, чтобы продолжить без бэкапа)." exit 1 fi fi fi echo "==> Переключение на версию: ${TARGET_REF}" git checkout -f "$TARGET_REF" git reset --hard "$TARGET_REF" echo "==> composer install" composer install --no-dev --optimize-autoloader --no-interaction echo "==> npm build" npm ci --no-audit --no-fund npm run build echo "==> Миграции" php artisan migrate --force echo "==> Сброс старых кэшей" php artisan optimize:clear echo "==> Пересборка кэшей" php artisan config:cache php artisan route:cache php artisan view:cache php artisan filament:cache-components >/dev/null 2>&1 || true echo "==> Перезапуск очереди" php artisan queue:restart echo "==> Готово. Новая версия: $(git describe --tags --always)"