diff --git a/deploy_haproxy.sh b/deploy_haproxy.sh new file mode 100644 index 0000000..9a584e2 --- /dev/null +++ b/deploy_haproxy.sh @@ -0,0 +1,92 @@ +#!/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 \ No newline at end of file