/
Redelic
/
Clear_text_AI
Обзор
Документация
Войти
/
Redelic
/
Clear_text_AI
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/deploy_remote.sh
106 строк
3 KB
Александр Обогрелов
Release v2.0
15 июн 2026, 01:45
15 июн 2026, 01:45
71e86de
Код
Авторство
О чём код?
#!/usr/bin/env bash set -euo pipefail : "${DEPLOY_HOST:?DEPLOY_HOST is required}" : "${DEPLOY_USER:?DEPLOY_USER is required}" : "${DEPLOY_PATH:?DEPLOY_PATH is required}" DEPLOY_PORT="${DEPLOY_PORT:-22}" DEPLOY_BRANCH="${DEPLOY_BRANCH:-master}" DEPLOY_REF="${DEPLOY_REF:-}" DEPLOY_GIT_REMOTE="${DEPLOY_GIT_REMOTE:-origin}" DEPLOY_COMPOSE_FILE="${DEPLOY_COMPOSE_FILE:-docker-compose.yml}" DEPLOY_COMPOSE_SERVICES="${DEPLOY_COMPOSE_SERVICES:-backend frontend}" DEPLOY_BACKEND_CONTAINER_NAME="${DEPLOY_BACKEND_CONTAINER_NAME:-style_ai_backend}" DEPLOY_HEALTHCHECK_ATTEMPTS="${DEPLOY_HEALTHCHECK_ATTEMPTS:-20}" DEPLOY_HEALTHCHECK_INTERVAL_SECONDS="${DEPLOY_HEALTHCHECK_INTERVAL_SECONDS:-5}" ssh_args=( -p "$DEPLOY_PORT" -o BatchMode=yes ) if [[ -n "${DEPLOY_SSH_KEY_FILE:-}" ]]; then ssh_args+=(-i "$DEPLOY_SSH_KEY_FILE") fi if [[ -n "${DEPLOY_SSH_KNOWN_HOSTS_FILE:-}" && -f "${DEPLOY_SSH_KNOWN_HOSTS_FILE}" ]]; then ssh_args+=( -o StrictHostKeyChecking=yes -o "UserKnownHostsFile=${DEPLOY_SSH_KNOWN_HOSTS_FILE}" ) else ssh_args+=(-o StrictHostKeyChecking=accept-new) fi printf -v remote_env \ 'DEPLOY_PATH=%q DEPLOY_BRANCH=%q DEPLOY_REF=%q DEPLOY_GIT_REMOTE=%q DEPLOY_COMPOSE_FILE=%q DEPLOY_COMPOSE_SERVICES=%q DEPLOY_BACKEND_CONTAINER_NAME=%q DEPLOY_HEALTHCHECK_ATTEMPTS=%q DEPLOY_HEALTHCHECK_INTERVAL_SECONDS=%q' \ "$DEPLOY_PATH" \ "$DEPLOY_BRANCH" \ "$DEPLOY_REF" \ "$DEPLOY_GIT_REMOTE" \ "$DEPLOY_COMPOSE_FILE" \ "$DEPLOY_COMPOSE_SERVICES" \ "$DEPLOY_BACKEND_CONTAINER_NAME" \ "$DEPLOY_HEALTHCHECK_ATTEMPTS" \ "$DEPLOY_HEALTHCHECK_INTERVAL_SECONDS" ssh "${ssh_args[@]}" "${DEPLOY_USER}@${DEPLOY_HOST}" "$remote_env bash -s" <<'REMOTE_SCRIPT' set -euo pipefail cd "$DEPLOY_PATH" if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then echo "Deploy path is not a git repository: $DEPLOY_PATH" >&2 exit 1 fi git fetch "$DEPLOY_GIT_REMOTE" --prune if [[ -n "$DEPLOY_REF" ]]; then git checkout "$DEPLOY_REF" else if git show-ref --verify --quiet "refs/heads/$DEPLOY_BRANCH"; then git checkout "$DEPLOY_BRANCH" else git checkout -b "$DEPLOY_BRANCH" "$DEPLOY_GIT_REMOTE/$DEPLOY_BRANCH" fi git pull --ff-only "$DEPLOY_GIT_REMOTE" "$DEPLOY_BRANCH" fi if docker compose version >/dev/null 2>&1; then compose_cmd=(docker compose) elif command -v docker-compose >/dev/null 2>&1; then compose_cmd=(docker-compose) else echo "docker compose is not available on the target server" >&2 exit 1 fi read -r -a compose_services <<< "$DEPLOY_COMPOSE_SERVICES" "${compose_cmd[@]}" -f "$DEPLOY_COMPOSE_FILE" up -d --build "${compose_services[@]}" "${compose_cmd[@]}" -f "$DEPLOY_COMPOSE_FILE" ps last_status="unknown" for ((attempt = 1; attempt <= DEPLOY_HEALTHCHECK_ATTEMPTS; attempt += 1)); do last_status="$( docker inspect \ --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' \ "$DEPLOY_BACKEND_CONTAINER_NAME" 2>/dev/null || true )" if [[ "$last_status" == "healthy" || "$last_status" == "running" ]]; then echo "Backend container status: $last_status" exit 0 fi sleep "$DEPLOY_HEALTHCHECK_INTERVAL_SECONDS" done echo "Backend container did not become healthy. Last status: ${last_status:-unknown}" >&2 docker logs --tail 100 "$DEPLOY_BACKEND_CONTAINER_NAME" || true exit 1 REMOTE_SCRIPT