#!/usr/bin/env bash set -Eeuo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" SRC="${ROOT}/stacks/vaultwarden" LIVE="/srv/nfs/infra/vaultwarden" ENV_FILE="${LIVE}/.env" BACKUP_ROOT="/srv/nfs/infra/.deploy-backups/vaultwarden" STAMP="$(date '+%Y%m%d-%H%M%S')" BACKUP="${BACKUP_ROOT}/${STAMP}" echo "=================================" echo " Vaultwarden deployment" echo "=================================" echo "Source: ${SRC}" echo "Target: ${LIVE}" # # Проверки исходных файлов # if [[ ! -f "${SRC}/docker-compose.yml" ]]; then echo "ERROR: ${SRC}/docker-compose.yml not found" exit 1 fi if [[ ! -f "${ENV_FILE}" ]]; then echo "ERROR: ${ENV_FILE} not found" exit 1 fi # # Проверка docker-compose # echo echo "--- Validate Docker Compose ---" docker compose \ --env-file "${ENV_FILE}" \ -f "${SRC}/docker-compose.yml" \ config >/dev/null echo "Docker Compose configuration is valid." # # Определяем образ # echo echo "--- Detect Vaultwarden image ---" VAULTWARDEN_IMAGE="$( docker compose \ --env-file "${ENV_FILE}" \ -f "${SRC}/docker-compose.yml" \ config --images | grep -m1 'vaultwarden/server' )" if [[ -z "${VAULTWARDEN_IMAGE}" ]]; then echo "ERROR: Vaultwarden image not found" exit 1 fi echo "Vaultwarden image: ${VAULTWARDEN_IMAGE}" # # Backup текущего compose # echo echo "--- Backup current configuration ---" mkdir -p "${BACKUP}" if [[ -f "${LIVE}/docker-compose.yml" ]]; then cp \ "${LIVE}/docker-compose.yml" \ "${BACKUP}/docker-compose.yml" fi echo "Backup: ${BACKUP}" # # Rollback # rollback() { rc=$? echo echo "!!! Deployment failed" if [[ -f "${BACKUP}/docker-compose.yml" ]]; then echo "Restoring previous docker-compose.yml" cp \ "${BACKUP}/docker-compose.yml" \ "${LIVE}/docker-compose.yml" ( cd "${LIVE}" docker compose \ --env-file "${ENV_FILE}" \ up -d --remove-orphans || true ) fi exit "${rc}" } trap rollback ERR # # Deployment compose-файла # echo echo "--- Deploy docker-compose.yml ---" cp \ "${SRC}/docker-compose.yml" \ "${LIVE}/docker-compose.yml" # # Pull образов # echo echo "--- Pull images ---" cd "${LIVE}" docker compose \ --env-file "${ENV_FILE}" \ pull # # Apply # echo echo "--- Apply Docker Compose ---" docker compose \ --env-file "${ENV_FILE}" \ up -d --remove-orphans # # Post-check # echo echo "--- Check Vaultwarden container ---" sleep 3 RUNNING="$( docker inspect \ -f '{{.State.Running}}' \ vaultwarden )" if [[ "${RUNNING}" != "true" ]]; then echo "ERROR: Vaultwarden container is not running" exit 1 fi # # Показываем фактически запущенный image # RUNNING_IMAGE="$( docker inspect \ -f '{{.Config.Image}}' \ vaultwarden )" echo "Running image: ${RUNNING_IMAGE}" trap - ERR echo echo "=================================" echo " Vaultwarden deployment successful" echo "=================================" echo "Backup: ${BACKUP}"