From 2d2250df122c3bdb6c3aa33d1f22d47e646c63a6 Mon Sep 17 00:00:00 2001 From: NishantRajputRN Date: Wed, 13 May 2026 16:00:52 +0530 Subject: [PATCH] clickhouse --- scripts/setup-clickhouse.sh | 99 +++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100755 scripts/setup-clickhouse.sh diff --git a/scripts/setup-clickhouse.sh b/scripts/setup-clickhouse.sh new file mode 100755 index 0000000..73bb565 --- /dev/null +++ b/scripts/setup-clickhouse.sh @@ -0,0 +1,99 @@ +#!/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."