Skip to content

Instantly share code, notes, and snippets.

@myinusa
Created March 7, 2026 17:30
Show Gist options
  • Select an option

  • Save myinusa/6563182b05387d3a661c30c7c5ef6cde to your computer and use it in GitHub Desktop.

Select an option

Save myinusa/6563182b05387d3a661c30c7c5ef6cde to your computer and use it in GitHub Desktop.
cataclysm-vital-ubnutu-savior.sh
#!/usr/bin/env bash
set -Eeuo pipefail
export DEBIAN_FRONTEND=noninteractive
log() {
printf '\n[%s] %s\n' "$(date '+%F %T')" "$*"
}
require_sudo() {
if [[ "${EUID}" -eq 0 ]]; then
log "Please run this script as a normal user with sudo, not as root."
exit 1
fi
sudo -v
}
apt_install() {
sudo apt-get install -y --no-install-recommends "$@"
}
add_ppa_if_missing() {
local ppa="$1"
local needle="$2"
if ! grep -Rqs "$needle" /etc/apt/sources.list /etc/apt/sources.list.d 2>/dev/null; then
log "Adding PPA: $ppa"
sudo add-apt-repository -y "$ppa"
APT_CHANGED=1
else
log "PPA already present: $ppa"
fi
}
add_qsv_repo_if_missing() {
local keyring="/usr/share/keyrings/qsv-deb.gpg"
local listfile="/etc/apt/sources.list.d/qsv.list"
local repo_line='deb [signed-by=/usr/share/keyrings/qsv-deb.gpg] https://dathere.github.io/qsv-deb-releases ./'
if [[ ! -f "$keyring" ]]; then
log "Installing QSV keyring"
wget -qO- https://dathere.github.io/qsv-deb-releases/qsv-deb.gpg \
| sudo gpg --dearmor -o "$keyring"
APT_CHANGED=1
fi
if [[ ! -f "$listfile" ]] || ! grep -Fqs "$repo_line" "$listfile"; then
log "Adding QSV apt repository"
echo "$repo_line" | sudo tee "$listfile" >/dev/null
APT_CHANGED=1
else
log "QSV repo already present"
fi
}
setup_pgdg_if_missing() {
local listfile="/etc/apt/sources.list.d/pgdg.list"
if [[ ! -f "$listfile" ]]; then
log "Setting up PostgreSQL PGDG repository"
apt_install postgresql-common ca-certificates
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
APT_CHANGED=0
else
log "PGDG repository already present"
fi
}
main() {
require_sudo
log "Refreshing package lists and upgrading current packages"
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get autoremove -y
sudo apt-get clean
log "Installing base packages required for repo management and downloads"
apt_install \
software-properties-common \
apt-transport-https \
ca-certificates \
gpg \
curl \
wget \
rsync \
lsof
APT_CHANGED=0
log "Installing foundational security/system tools"
apt_install \
unattended-upgrades \
update-notifier-common \
ufw \
fail2ban
log "Installing development headers and build environment"
apt_install \
build-essential \
cmake \
pkg-config \
python3-dev \
python3-pip \
python3-venv \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev
log "Installing core CLI, terminal, monitoring, and networking tools"
apt_install \
nano \
mc \
dialog \
git \
jq \
btop \
ncdu \
tldr \
net-tools \
dnsutils \
iputils-ping \
apache2-utils \
nala \
fzf \
zoxide \
ripgrep \
fd-find \
glances \
speedtest-cli \
tmux \
rclone \
shellcheck \
gdal-bin \
mkcert \
sshpass \
openssh-server \
dbus-x11 \
upower \
eza \
bat
log "Installing archive/compression tools"
apt_install \
bzip2 \
tar \
xz-utils \
lzma \
p7zip-full
log "Adding third-party repositories"
add_ppa_if_missing "ppa:zhangsongcui3371/fastfetch" "zhangsongcui3371/fastfetch"
add_ppa_if_missing "ppa:tomtomtom/yt-dlp" "tomtomtom/yt-dlp"
add_qsv_repo_if_missing
if [[ "${APT_CHANGED}" -eq 1 ]]; then
log "Updating package lists after adding repositories"
sudo apt-get update
fi
log "Installing packages from third-party repositories"
apt_install \
fastfetch \
qsv \
yt-dlp
log "Setting up PostgreSQL client repository"
setup_pgdg_if_missing
log "Installing PostgreSQL client 17"
sudo apt-get update
apt_install postgresql-client-17
log "Disabling PostgreSQL service if it exists"
if systemctl list-unit-files | grep -q '^postgresql\.service'; then
sudo systemctl disable --now postgresql || true
else
log "PostgreSQL service not present; skipping disable step"
fi
log "Installing ffmpeg"
apt_install ffmpeg
log "Done."
log "You may want to verify: fastfetch --version, qsv --version, yt-dlp --version, psql --version"
}
main "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment