100 lines
3.5 KiB
Bash
Executable File
100 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Install ClickHouse server + client on Debian/Ubuntu from packages.clickhouse.com.
|
|
# Avoids Ubuntu "universe" ClickHouse 18.x, which is outdated and often misconfigured.
|
|
#
|
|
# Usage (from repo root or any path):
|
|
# bash scripts/setup-clickhouse.sh
|
|
# bash scripts/setup-clickhouse.sh --purge-existing # remove old clickhouse* packages first
|
|
# CLICKHOUSE_CHANNEL=lts bash scripts/setup-clickhouse.sh
|
|
#
|
|
# Env:
|
|
# CLICKHOUSE_CHANNEL stable (default) or lts — see https://clickhouse.com/docs/knowledgebase/production
|
|
#
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)"
|
|
CLICKHOUSE_LIST="/etc/apt/sources.list.d/clickhouse.list"
|
|
KEYRING="/usr/share/keyrings/clickhouse-keyring.gpg"
|
|
CHANNEL="${CLICKHOUSE_CHANNEL:-stable}"
|
|
PURGE_EXISTING=false
|
|
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
--purge-existing) PURGE_EXISTING=true ;;
|
|
-h|--help)
|
|
echo "Usage: $0 [--purge-existing]"
|
|
echo " --purge-existing apt purge existing clickhouse* packages before installing (destructive for old installs)."
|
|
echo " Env: CLICKHOUSE_CHANNEL=stable|lts (default: stable)"
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $arg (try --help)" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ ! -f /etc/os-release ]]; then
|
|
echo "Error: /etc/os-release not found. This script supports Debian/Ubuntu only." >&2
|
|
exit 1
|
|
fi
|
|
# shellcheck source=/dev/null
|
|
source /etc/os-release
|
|
case "${ID:-},${ID_LIKE:-}" in
|
|
debian,*|ubuntu,*|*,*debian*|*,*ubuntu*) ;;
|
|
*)
|
|
echo "Warning: OS ID=${ID:-unknown} may not be Debian/Ubuntu. Continuing if apt works." >&2
|
|
;;
|
|
esac
|
|
|
|
if [[ "$CHANNEL" != "stable" && "$CHANNEL" != "lts" ]]; then
|
|
echo "Error: CLICKHOUSE_CHANNEL must be stable or lts, got: $CHANNEL" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$PURGE_EXISTING" == "true" ]]; then
|
|
echo "==> Purging existing ClickHouse packages (--purge-existing)..."
|
|
sudo systemctl stop clickhouse-server 2>/dev/null || true
|
|
sudo systemctl stop clickhouse-keeper 2>/dev/null || true
|
|
sudo apt-get purge -y 'clickhouse*' || true
|
|
sudo apt-get autoremove -y || true
|
|
fi
|
|
|
|
echo "==> Installing prerequisites..."
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
sudo apt-get update -qq
|
|
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
|
|
|
|
echo "==> Adding ClickHouse APT repo (channel: $CHANNEL)..."
|
|
sudo mkdir -p /usr/share/keyrings
|
|
if [[ ! -f "$KEYRING" ]]; then
|
|
curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' \
|
|
| sudo gpg --dearmor -o "$KEYRING"
|
|
fi
|
|
|
|
ARCH="$(dpkg --print-architecture)"
|
|
echo "deb [signed-by=${KEYRING} arch=${ARCH}] https://packages.clickhouse.com/deb ${CHANNEL} main" \
|
|
| sudo tee "$CLICKHOUSE_LIST" >/dev/null
|
|
|
|
echo "==> Installing clickhouse-server and clickhouse-client..."
|
|
sudo apt-get update -qq
|
|
sudo apt-get install -y clickhouse-server clickhouse-client
|
|
|
|
echo "==> Enabling and starting clickhouse-server..."
|
|
sudo systemctl enable --now clickhouse-server
|
|
sudo systemctl --no-pager --full status clickhouse-server || true
|
|
|
|
echo "==> Verifying..."
|
|
if clickhouse-client -q "SELECT version(), 1" 2>/dev/null; then
|
|
echo "ClickHouse responded OK."
|
|
else
|
|
echo "Note: clickhouse-client check failed (password required?). Try: clickhouse-client --password -q \"SELECT 1\"" >&2
|
|
echo "Logs: sudo tail -50 /var/log/clickhouse-server/clickhouse-server.err.log" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "Done. Client: clickhouse-client | HTTP default :8123 | native default :9000"
|
|
echo "Optional: open ports in ufw / cloud NSG only if you need remote access."
|