Files
2026-09-04 16:30:37 +08:00

119 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
cd "$(dirname "$0")"
SKIP_PULL=0
usage() {
cat <<'EOF'
Usage: ./deploy-rabbitmq.sh [options]
Options:
--skip-pull Do not pull images before starting.
-h, --help Show this help.
EOF
}
while [ "$#" -gt 0 ]; do
case "$1" in
--skip-pull)
SKIP_PULL=1
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown option: $1" >&2
usage >&2
exit 1
;;
esac
shift
done
if ! command -v docker >/dev/null 2>&1; then
echo "Docker is not installed or not in PATH." >&2
exit 1
fi
if docker compose version >/dev/null 2>&1; then
COMPOSE=(docker compose)
elif command -v docker-compose >/dev/null 2>&1; then
COMPOSE=(docker-compose)
else
echo "Docker Compose is not installed." >&2
exit 1
fi
if [ ! -f .env ]; then
cp .env.example .env
echo "Created .env from .env.example."
fi
set -a
# shellcheck disable=SC1091
. ./.env
set +a
RABBITMQ_AMQP_PORT="${RABBITMQ_AMQP_PORT:-5672}"
RABBITMQ_MANAGEMENT_PORT="${RABBITMQ_MANAGEMENT_PORT:-15672}"
RABBITMQ_PROMETHEUS_PORT="${RABBITMQ_PROMETHEUS_PORT:-15692}"
echo "==> validating docker compose"
"${COMPOSE[@]}" config >/dev/null
if [ "$SKIP_PULL" -eq 0 ]; then
echo "==> pulling RabbitMQ images"
"${COMPOSE[@]}" pull
fi
echo "==> starting RabbitMQ"
"${COMPOSE[@]}" up -d
echo "==> waiting for RabbitMQ health check"
for _ in $(seq 1 45); do
status="$(docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' ping-rabbitmq 2>/dev/null || true)"
if [ "$status" = "healthy" ]; then
break
fi
if [ "$status" = "unhealthy" ] || [ "$status" = "exited" ] || [ "$status" = "dead" ]; then
echo "RabbitMQ entered state: $status" >&2
docker logs --tail 100 ping-rabbitmq >&2 || true
exit 1
fi
sleep 2
done
status="$(docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' ping-rabbitmq 2>/dev/null || true)"
if [ "$status" != "healthy" ]; then
echo "RabbitMQ did not become healthy; current state: ${status:-unknown}" >&2
docker logs --tail 100 ping-rabbitmq >&2 || true
exit 1
fi
if ! docker exec ping-rabbitmq rabbitmq-plugins list -e | grep -q '^\[E.\].*rabbitmq_prometheus'; then
echo "rabbitmq_prometheus is not enabled." >&2
exit 1
fi
if command -v curl >/dev/null 2>&1; then
if ! curl -fsS "http://127.0.0.1:${RABBITMQ_PROMETHEUS_PORT}/metrics" >/dev/null; then
echo "RabbitMQ is healthy, but its Prometheus metrics endpoint is unavailable." >&2
exit 1
fi
fi
echo "==> current services"
"${COMPOSE[@]}" ps
cat <<EOF
Deployment finished.
AMQP: SERVER_IP:${RABBITMQ_AMQP_PORT}
Management: http://SERVER_IP:${RABBITMQ_MANAGEMENT_PORT}
Metrics: http://SERVER_IP:${RABBITMQ_PROMETHEUS_PORT}/metrics
EOF