#!/usr/bin/env bash set -euo pipefail # Usage: # ./deploy.sh # deploy master # ./deploy.sh master # deploy master # ./deploy.sh master --no-build # ./deploy.sh master --no-cache BRANCH="${1:-master}" OPTION="${2:-}" PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$PROJECT_DIR" if [[ ! -f "docker-compose.yml" ]]; then echo "ERROR: docker-compose.yml not found in $PROJECT_DIR" exit 1 fi if ! command -v docker >/dev/null 2>&1; then echo "ERROR: docker is not installed." exit 1 fi COMPOSE_CMD="" 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 "ERROR: neither 'docker compose' nor 'docker-compose' is available." exit 1 fi if [[ ! -f ".env" ]]; then if [[ -f ".env.example" ]]; then cp .env.example .env echo "INFO: .env not found, created from .env.example" echo "INFO: please review .env values for production." else echo "ERROR: .env and .env.example are both missing." exit 1 fi fi echo "==> Fetch latest code" git fetch --all git checkout "$BRANCH" git pull origin "$BRANCH" echo "==> Build and start containers" if [[ "$OPTION" == "--no-build" ]]; then $COMPOSE_CMD up -d elif [[ "$OPTION" == "--no-cache" ]]; then $COMPOSE_CMD build --no-cache $COMPOSE_CMD up -d else $COMPOSE_CMD up -d --build fi echo "==> Service status" $COMPOSE_CMD ps echo "==> Backend health check" if command -v curl >/dev/null 2>&1; then set +e HEALTH_OUTPUT="$(curl -sS --max-time 5 http://127.0.0.1:8000/demand/api/v1/health)" CURL_CODE=$? set -e if [[ $CURL_CODE -eq 0 ]]; then echo "$HEALTH_OUTPUT" echo "Deploy done." else echo "WARN: backend health check failed, please inspect logs:" echo " $COMPOSE_CMD logs --tail=100 backend" fi else echo "WARN: curl not found, skip health check." fi