#!/usr/bin/env bash set -Eeuo pipefail # Deploy script for Forgejo Actions # Uses Forgejo environment variables instead of GitLab CI variables : "${DEPLOY_USER:?DEPLOY_USER is required}" : "${DEPLOY_HOST:?DEPLOY_HOST is required}" : "${APP_IMAGE:?APP_IMAGE is required}" : "${DEPLOY_SSH_PRIVATE_KEY:?DEPLOY_SSH_PRIVATE_KEY is required}" DEPLOY_PORT="${DEPLOY_PORT:-22}" DEPLOY_PATH="${DEPLOY_PATH:-/opt/vault-dash}" COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.deploy.yml}" COMPOSE_SERVICE="${COMPOSE_SERVICE:-vault-dash}" DEPLOY_TIMEOUT="${DEPLOY_TIMEOUT:-120}" HEALTHCHECK_URL="${HEALTHCHECK_URL:-http://127.0.0.1:${APP_PORT:-8000}/health}" REMOTE_ENV_FILE="${REMOTE_ENV_FILE:-$DEPLOY_PATH/.env}" SSH_OPTS=(-p "$DEPLOY_PORT" -o StrictHostKeyChecking=accept-new) SCP_OPTS=(-P "$DEPLOY_PORT" -o StrictHostKeyChecking=accept-new) REMOTE_TARGET="${DEPLOY_USER}@${DEPLOY_HOST}" echo "=== Deploying vault-dash ===" echo "Host: $DEPLOY_HOST:$DEPLOY_PORT" echo "Path: $DEPLOY_PATH" echo "Image: $APP_IMAGE" # Create deployment directory ssh "${SSH_OPTS[@]}" "$REMOTE_TARGET" "mkdir -p '$DEPLOY_PATH'" # Write environment file echo "=== Writing environment file ===" ssh "${SSH_OPTS[@]}" "$REMOTE_TARGET" "cat > '$REMOTE_ENV_FILE'" < .last_successful_image # Stop existing container echo "Stopping existing containers..." docker compose -f "$COMPOSE_FILE" --env-file "$REMOTE_ENV_FILE" down --remove-orphans || true # Start new container echo "Starting new container..." docker compose -f "$COMPOSE_FILE" --env-file "$REMOTE_ENV_FILE" up -d --remove-orphans # Wait for health check echo "Waiting for health check..." COUNTER=0 MAX_WAIT=$DEPLOY_TIMEOUT while [ \$COUNTER -lt \$MAX_WAIT ]; do if curl -sf "${HEALTHCHECK_URL}" > /dev/null 2>&1; then echo "Health check passed after \${COUNTER}s" echo "=== Deployment successful ===" exit 0 fi sleep 1 COUNTER=\$((COUNTER + 1)) done # Health check failed - rollback echo "Health check failed after \${MAX_WAIT}s" if [[ -n "\${PREVIOUS_IMAGE:-}" ]]; then echo "Rolling back to \$PREVIOUS_IMAGE..." sed -i.bak "s|^APP_IMAGE=.*|APP_IMAGE=\$PREVIOUS_IMAGE|" "$REMOTE_ENV_FILE" docker compose -f "$COMPOSE_FILE" --env-file "$REMOTE_ENV_FILE" up -d --remove-orphans echo "Rollback complete" fi exit 1 EOF echo "=== Deployment complete ==="