Add all 44 scripts, update CI: error severity baseline, PowerShell validation, multi-distro testing
Amp-Thread-ID: https://ampcode.com/threads/T-019cc404-c628-759e-a50b-f5eeea35b91f Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
Executable
+305
@@ -0,0 +1,305 @@
|
||||
#!/bin/bash
|
||||
|
||||
#############################################################
|
||||
#### Grafana Mimir Install Script for Oracle Linux, ####
|
||||
#### Centos/Redhat and Debian/Ubuntu Servers. ####
|
||||
#### ####
|
||||
#### Author: Phil Connor 01/09/2025 ####
|
||||
#### License: MIT ####
|
||||
#### Contact: contact@mylinux.work ####
|
||||
#### Version 1.00.010925 ####
|
||||
#### ####
|
||||
#### To use this script chmod it to 755 ####
|
||||
#### or simply type bash <filename.sh> ####
|
||||
#############################################################
|
||||
|
||||
########################
|
||||
### System Variables ###
|
||||
########################
|
||||
if [ "$(command -v lsb_release)" ]; then
|
||||
OS=$(lsb_release -i | awk '{print $3}' | tr '[:upper:]' '[:lower:]')
|
||||
else
|
||||
OS=$(grep PRETTY_NAME /etc/os-release | sed 's/PRETTY_NAME=//g' | tr -d '="' | awk '{print $1}' | tr '[:upper:]' '[:lower:]')
|
||||
fi
|
||||
|
||||
domain=mylinux.work
|
||||
bindir=/usr/local/bin
|
||||
mimirdir=/etc/prometheus
|
||||
datadir=/mimir
|
||||
|
||||
if [ -d "/usr/lib/systemd/system" ]; then
|
||||
psdir='/etc/systemd/system'
|
||||
else
|
||||
psdir='/usr/lib/systemd/system'
|
||||
fi
|
||||
|
||||
#########################
|
||||
### Check permissions ###
|
||||
#########################
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo ''
|
||||
echo "$(basename "$0") This script must be run as root! Login as root, or sudo/su."
|
||||
echo ''
|
||||
exit 1
|
||||
fi
|
||||
|
||||
######################
|
||||
### Package Manager ##
|
||||
######################
|
||||
pkgmgr="yum -y"
|
||||
if [ "$OS" = "ubuntu" ]; then
|
||||
pkgmgr="apt -y"
|
||||
fi
|
||||
|
||||
#################################
|
||||
#### Add Mimir User/Group ####
|
||||
#################################
|
||||
if ! grep mimir /etc/passwd; then
|
||||
groupadd --system mimir
|
||||
if [ "$OS" = "ubuntu" ]; then
|
||||
useradd -s /sbin/nologin --system -g mimir mimir
|
||||
else
|
||||
useradd -m -s /bin/false mimir -g mimir
|
||||
fi
|
||||
fi
|
||||
|
||||
#################################
|
||||
#### Check for wget and curl ####
|
||||
#################################
|
||||
if [ ! "$(command -v wget)" ]; then
|
||||
$pkgmgr install wget
|
||||
fi
|
||||
|
||||
if [ ! "$(command -v curl)" ]; then
|
||||
$pkgmgr install curl
|
||||
fi
|
||||
|
||||
if [ ! "$(command -v unzip)" ]; then
|
||||
$pkgmgr install unzip
|
||||
fi
|
||||
|
||||
##########################
|
||||
### Install Mimir ###
|
||||
##########################
|
||||
install_mimir() {
|
||||
{
|
||||
# Create base directories if they don't exist
|
||||
if [ ! -d "$mimirdir" ]; then
|
||||
mkdir -p $mimirdir || { echo "Failed to create $mimirdir directory"; exit 1; }
|
||||
fi
|
||||
|
||||
if [ ! -d "$datadir" ]; then
|
||||
mkdir -p $datadir || { echo "Failed to create $datadir directory"; exit 1; }
|
||||
fi
|
||||
|
||||
# Create Mimir subdirectories
|
||||
mkdir -p $datadir/{tsdb-sync,data/tsdb,mimir-tsdb,compactor,mimir-ruler}
|
||||
chown -R mimir:mimir $datadir
|
||||
|
||||
# Download and install Mimir
|
||||
cd /tmp || exit 2
|
||||
echo "Downloading latest Grafana Mimir..."
|
||||
curl -s https://api.github.com/repos/grafana/mimir/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d '"' -f 4 | wget -qi - || { echo "Failed to download Mimir"; exit 1; }
|
||||
|
||||
tar -xvf mimir-linux-amd64.tar.gz
|
||||
mv mimir-linux-amd64 $bindir/mimir || exit 1
|
||||
chown mimir:mimir $bindir/mimir || exit 1
|
||||
rm -rf /tmp/mimir-linux-amd64.tar.gz
|
||||
|
||||
# Get server IP address
|
||||
SERVER_IP=$(hostname -I | awk '{print $1}')
|
||||
|
||||
# Create Mimir config
|
||||
touch $mimirdir/mimir.yml
|
||||
{
|
||||
echo '# Mimir Configuration - Single Instance Mode'
|
||||
echo 'multitenancy_enabled: false'
|
||||
echo ''
|
||||
echo 'blocks_storage:'
|
||||
echo ' backend: filesystem'
|
||||
echo ' bucket_store:'
|
||||
echo " sync_dir: $datadir/tsdb-sync"
|
||||
echo ' filesystem:'
|
||||
echo " dir: $datadir/data/tsdb"
|
||||
echo ' tsdb:'
|
||||
echo " dir: $datadir/mimir-tsdb"
|
||||
echo ' retention_period: 720h'
|
||||
echo ''
|
||||
echo 'compactor:'
|
||||
echo " data_dir: $datadir/compactor"
|
||||
echo ' sharding_ring:'
|
||||
echo ' kvstore:'
|
||||
echo ' store: inmemory'
|
||||
echo ''
|
||||
echo 'distributor:'
|
||||
echo ' ring:'
|
||||
echo ' kvstore:'
|
||||
echo ' store: inmemory'
|
||||
echo ''
|
||||
echo 'ingester:'
|
||||
echo ' ring:'
|
||||
echo ' kvstore:'
|
||||
echo ' store: inmemory'
|
||||
echo ' replication_factor: 1'
|
||||
echo ''
|
||||
echo 'ruler_storage:'
|
||||
echo ' backend: filesystem'
|
||||
echo ' filesystem:'
|
||||
echo " dir: $datadir/mimir-ruler"
|
||||
echo ''
|
||||
echo 'server:'
|
||||
echo ' http_listen_port: 9009'
|
||||
echo ' log_level: info'
|
||||
echo ''
|
||||
echo 'memberlist:'
|
||||
echo ' abort_if_cluster_join_fails: false'
|
||||
echo ' bind_port: 7946'
|
||||
echo " advertise_addr: $SERVER_IP"
|
||||
echo ' join_members: []'
|
||||
echo ''
|
||||
echo 'store_gateway:'
|
||||
echo ' sharding_ring:'
|
||||
echo ' replication_factor: 1'
|
||||
echo ' kvstore:'
|
||||
echo ' store: inmemory'
|
||||
echo ''
|
||||
echo 'limits:'
|
||||
echo ' max_global_series_per_user: 0'
|
||||
echo ' max_global_exemplars_per_user: 100000'
|
||||
} > $mimirdir/mimir.yml
|
||||
|
||||
chown mimir:mimir $mimirdir/mimir.yml
|
||||
|
||||
# Create systemd service
|
||||
{
|
||||
echo '[Unit]'
|
||||
echo 'Description=Grafana Mimir'
|
||||
echo 'Documentation=https://grafana.com/docs/mimir/'
|
||||
echo 'After=network-online.target'
|
||||
echo 'Wants=network-online.target'
|
||||
echo ''
|
||||
echo '[Service]'
|
||||
echo 'Type=simple'
|
||||
echo 'User=mimir'
|
||||
echo 'Group=mimir'
|
||||
echo "ExecStart=$bindir/mimir -config.file=$mimirdir/mimir.yml"
|
||||
echo "ExecReload=/bin/kill -HUP \$MAINPID"
|
||||
echo 'TimeoutStopSec=20s'
|
||||
echo 'SendSIGKILL=no'
|
||||
echo ''
|
||||
echo '# Output to journal'
|
||||
echo 'StandardOutput=journal'
|
||||
echo 'StandardError=journal'
|
||||
echo 'SyslogIdentifier=mimir'
|
||||
echo ''
|
||||
echo '# Restart'
|
||||
echo 'Restart=on-failure'
|
||||
echo 'RestartSec=5s'
|
||||
echo ''
|
||||
echo '# Security'
|
||||
echo 'NoNewPrivileges=yes'
|
||||
echo 'PrivateTmp=yes'
|
||||
echo 'ProtectSystem=full'
|
||||
echo 'ProtectHome=yes'
|
||||
echo "ReadWritePaths=$datadir"
|
||||
echo ''
|
||||
echo '# Resource limits'
|
||||
echo 'LimitNOFILE=1048576'
|
||||
echo 'LimitNPROC=1048576'
|
||||
echo ''
|
||||
echo '# Environment'
|
||||
echo 'Environment=GOMAXPROCS=4'
|
||||
echo ''
|
||||
echo '[Install]'
|
||||
echo 'WantedBy=multi-user.target'
|
||||
} > $psdir/mimir.service
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable --now mimir
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "Mimir installation complete!"
|
||||
echo "=========================================="
|
||||
echo "Mimir UI: http://localhost:9009"
|
||||
echo "Config: $mimirdir/mimir.yml"
|
||||
echo "Data: $datadir"
|
||||
echo ""
|
||||
echo "Add to Prometheus remote_write:"
|
||||
echo " remote_write:"
|
||||
echo " - url: http://localhost:9009/api/v1/push"
|
||||
echo ""
|
||||
}
|
||||
}
|
||||
|
||||
################################
|
||||
### Install and Config Nginx ###
|
||||
################################
|
||||
install_nginx() {
|
||||
{
|
||||
$pkgmgr install nginx
|
||||
|
||||
if [ -d "/etc/nginx/sites-available" ]; then
|
||||
sitesa=/etc/nginx/sites-available
|
||||
sitese=/etc/nginx/sites-enabled/
|
||||
elif [ -d "/etc/nginx/conf.d" ]; then
|
||||
sitesa=/etc/nginx/conf.d
|
||||
fi
|
||||
|
||||
touch "$sitesa"/mimir.conf
|
||||
{
|
||||
echo 'server {'
|
||||
echo ' listen 80;'
|
||||
echo ' listen [::]:80;'
|
||||
echo ''
|
||||
echo " server_name mimir.$domain;"
|
||||
echo ''
|
||||
echo ' location / {'
|
||||
echo ' proxy_pass http://localhost:9009/;'
|
||||
# shellcheck disable=SC2016
|
||||
echo ' proxy_set_header Host $host;'
|
||||
# shellcheck disable=SC2016
|
||||
echo ' proxy_set_header X-Real-IP $remote_addr;'
|
||||
# shellcheck disable=SC2016
|
||||
echo ' proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;'
|
||||
# shellcheck disable=SC2016
|
||||
echo ' proxy_set_header X-Forwarded-Proto $scheme;'
|
||||
echo ' proxy_read_timeout 300s;'
|
||||
echo ' proxy_connect_timeout 75s;'
|
||||
echo ' }'
|
||||
echo '}'
|
||||
} > "$sitesa"/mimir.conf
|
||||
|
||||
if [ -d "/etc/nginx/sites-available" ]; then
|
||||
ln -s "$sitesa"/mimir.conf "$sitese" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if nginx -t; then
|
||||
systemctl restart nginx
|
||||
echo "Nginx configured for Mimir at mimir.$domain"
|
||||
else
|
||||
echo "Nginx configuration test failed"
|
||||
fi
|
||||
}
|
||||
}
|
||||
|
||||
######################
|
||||
### Function Calls ###
|
||||
######################
|
||||
install_mimir
|
||||
|
||||
# Uncomment to install nginx reverse proxy
|
||||
# install_nginx
|
||||
|
||||
#############################################################
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "Installation Summary"
|
||||
echo "=========================================="
|
||||
echo "Mimir version: $(mimir --version 2>&1 | head -1)"
|
||||
echo "Status: $(systemctl is-active mimir)"
|
||||
echo ""
|
||||
echo "Check status: systemctl status mimir"
|
||||
echo "View logs: journalctl -u mimir -f"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user