#!/usr/bin/env bash set -Eeuo pipefail # ================= КОНФИГУРАЦИЯ ================= BASE_DIR="/var/lib/depfile" STATUS_DIR="${BASE_DIR}/status" CHANGE_FILE="${STATUS_DIR}/change.me" HASH_FILE="${STATUS_DIR}/sha256.hash" DEPLOY_DIR="${BASE_DIR}/deployment" SUCCESS_FILE="${DEPLOY_DIR}/success.me" BACKUP_CFG="/etc/haproxy/backup/haproxy.cfg" TARGET_CFG="/etc/haproxy/haproxy.cfg" # =============================================== log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" } err() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [ОШИБКА] $*" >&2 } # 1. Проверяем наличие триггер-файла change.me if [ ! -f "${CHANGE_FILE}" ]; then exit 0 fi log "Обнаружен файл ${CHANGE_FILE}. Запуск процедуры развертывания..." # 2. Проверяем наличие файла контрольной суммы if [ ! -f "${HASH_FILE}" ]; then err "Файл хеша ${HASH_FILE} не найден. Отмена операции." exit 1 fi # 3. Валидация целостности change.me по sha256.hash log "Проверка контрольной суммы SHA-256..." if ! (cd "${STATUS_DIR}" && sha256sum -c --status "sha256.hash"); then err "Несовпадение контрольной суммы файла ${CHANGE_FILE}!" exit 2 fi log "Контрольная сумма подтверждена." # 4. Проверяем наличие резервной конфигурации if [ ! -f "${BACKUP_CFG}" ]; then err "Резервная копия не найдена: ${BACKUP_CFG}" exit 3 fi # 5. Тестирование синтаксиса бэкапа перед применением log "Валидация синтаксиса конфигурации из бэкапа..." if ! haproxy -c -f "${BACKUP_CFG}" > /dev/null 2>&1; then err "Резервная конфигурация содержит ошибки синтаксиса. Отмена применения." haproxy -c -f "${BACKUP_CFG}" || true exit 4 fi log "Синтаксис резервного конфига корректен." # 6. Замена рабочей конфигурации log "Копирование конфигурации в ${TARGET_CFG}..." cp -f "${BACKUP_CFG}" "${TARGET_CFG}" if ! haproxy -c -f "${TARGET_CFG}" > /dev/null 2>&1; then err "Критическая ошибка: боевой файл не прошел повторную валидацию!" exit 5 fi # 7. Перезапуск службы haproxy log "Перезапуск службы haproxy..." if ! systemctl restart haproxy; then err "Не удалось перезапустить сервис haproxy!" exit 6 fi log "Сервис haproxy успешно перезапущен." # 8. Очистка каталога status log "Удаление директории ${STATUS_DIR}..." rm -rf "${STATUS_DIR}" # 9. Формирование отчета об успешном выполнении mkdir -p "${DEPLOY_DIR}" chown depfile:depfile "${DEPLOY_DIR}" CURRENT_DATETIME=$(date '+%Y-%m-%d %H:%M:%S') echo "deploment success {${CURRENT_DATETIME}}" > "${SUCCESS_FILE}" chown depfile:depfile "${SUCCESS_FILE}" log "Зафиксирован статус в ${SUCCESS_FILE}." log "Процесс успешно завершен." exit 0