Skip to content

Instantly share code, notes, and snippets.

@riccardopedrielli
Last active March 11, 2025 12:13
Show Gist options
  • Save riccardopedrielli/26cdc09f1be72aaf73f8dd3fe60ec2d5 to your computer and use it in GitHub Desktop.
Save riccardopedrielli/26cdc09f1be72aaf73f8dd3fe60ec2d5 to your computer and use it in GitHub Desktop.
Ubuntu workstation setup
#!/usr/bin/env bash
set -Eeu
trap 'STATUS=${?}; echo "${0}: Error on line ${LINENO}: ${BASH_COMMAND}"; exit ${STATUS}' ERR
trap 'rm -rf ${tempDir}' EXIT
readonly supportedUbuntuVersion="24.10"
readonly tempDir="/tmp/setup"
readonly devDir="${HOME}/dev"
readonly scriptsDir="${devDir}/scripts"
readonly binDir="${devDir}/bin"
export DEBIAN_FRONTEND="noninteractive"
export PATH="${PATH}:${scriptsDir}:${binDir}:${HOME}/.binenv"
logInfo()
{
echo -e "\e[0;36m${*}\e[0m"
}
logError()
{
echo -e "\e[0;31m${*}\e[0m"
}
logWarning()
{
echo -e "\e[0;33m${*}\e[0m"
}
getLatestGithubVersion()
{
curl -fsSL "https://api.github.com/repos/${1}/releases/latest" | jq -r .tag_name
}
checkUbuntuVersion()
{
local -r currentUbuntuVersion=$(lsb_release -rs)
if [ "${currentUbuntuVersion}" != "${supportedUbuntuVersion}" ]; then
logWarning "This script is supported only on Ubuntu ${supportedUbuntuVersion}"
logWarning "The Ubuntu version currently installed is ${currentUbuntuVersion}"
while true; do
read -rp "Continue anyway? [y/n]: " ANSWER
case ${ANSWER} in
[Yy]* )
break
;;
[Nn]* )
logError "Aborted"
exit 1
;;
* )
echo "Please answer yes or no."
;;
esac
done
fi
}
getSudoPrivileges()
{
logInfo "Get sudo privileges"
sudo -v
while true; do sudo -v; sleep 30; done &
sudoLoopPid=$!
}
createTemporaryDirectory()
{
logInfo "Create temporary directory"
mkdir -p ${tempDir}
}
setKernelParameters()
{
logInfo "Set kernel parameters"
sudo tee /etc/sysctl.d/90-custom.conf > /dev/null \
<<- EOT
fs.inotify.max_user_watches=1048576
vm.swappiness=1
EOT
sudo sysctl -p /etc/sysctl.d/90-custom.conf
}
configureGrub()
{
logInfo "Configure grub"
sudo tee /etc/default/grub.d/disable-ipv6.cfg > /dev/null \
<<- EOT
GRUB_CMDLINE_LINUX="ipv6.disable=1"
EOT
sudo tee /etc/default/grub.d/timeout.cfg > /dev/null \
<<- EOT
GRUB_TIMEOUT=10
EOT
sudo tee /etc/default/grub.d/no-recovery.cfg > /dev/null \
<<- EOT
GRUB_DISABLE_RECOVERY="true"
EOT
sudo tee /etc/default/grub.d/no-submenu.cfg > /dev/null \
<<- EOT
GRUB_DISABLE_SUBMENU="true"
EOT
sudo update-grub
}
disableReports()
{
logInfo "Disable system and error reports"
ubuntu-report send no -f
sudo sed -i \
-e 's/^enabled=1$/enabled=0/' \
/etc/default/apport
sudo systemctl stop apport.service
sudo systemctl disable apport.service
sudo systemctl mask apport.service
}
createDevStructure()
{
logInfo "Create dev structure"
mkdir -p "${devDir}"
mkdir -p "${devDir}/bin"
mkdir -p "${devDir}/data"
mkdir -p "${devDir}/src"
mkdir -p "${devDir}/tools"
}
removeUnwantedPackages()
{
logInfo "Remove unwanted packages"
if command -v snap &> /dev/null; then
sudo snap remove --purge desktop-security-center
sudo snap remove --purge firefox
sudo snap remove --purge firmware-updater
sudo snap remove --purge gtk-common-themes
sudo snap remove --purge prompting-client
sudo snap remove --purge snap-store
sudo snap remove --purge snapd-desktop-integration
sudo snap remove --purge "$(sudo snap list | grep -E "gnome-[0-9]{2}-[0-9]{4}" | cut -d ' ' -f 1)"
sudo snap remove --purge core22
sudo snap remove --purge bare
sudo snap remove --purge snapd
fi
sudo apt autoremove --purge -y gnome-shell-extension-prefs
sudo apt autoremove --purge -y memtest86+
sudo apt autoremove --purge -y snapd
rm -rf "${HOME}/snap"
sudo rm -rf "/root/snap"
sudo rm -rf "/var/cache/snapd"
sudo tee /etc/apt/preferences.d/firefox-no-snap > /dev/null \
<<- EOT
Package: firefox*
Pin: release o=Ubuntu*
Pin-Priority: -1
EOT
sudo tee /etc/apt/preferences.d/no-snap > /dev/null \
<<- EOT
Package: snapd
Pin: release a=*
Pin-Priority: -10
EOT
}
configureApt()
{
logInfo "Configure APT"
sudo rm -f /etc/apt/sources.list.d/*.orig
sudo sed -i \
-e 's|http://.*\.archive.ubuntu.com|http://archive.ubuntu.com|g' \
/etc/apt/sources.list.d/ubuntu.sources
sudo tee /etc/apt/apt.conf.d/10periodic > /dev/null \
<<- EOT
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "0";
EOT
sudo tee /etc/apt/apt.conf.d/20auto-upgrades > /dev/null \
<<- EOT
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "0";
EOT
sudo tee /etc/apt/apt.conf.d/99phased-updates > /dev/null \
<<- EOT
Update-Manager::Always-Include-Phased-Updates true;
APT::Get::Always-Include-Phased-Updates true;
EOT
sudo tee /etc/apt/apt.conf.d/99disable-warning > /dev/null \
<<- EOT
Apt::Cmd::Disable-Script-Warning "true";
EOT
}
updateSystem()
{
logInfo "Update system"
sudo apt update
sudo apt dist-upgrade -y
sudo apt autoremove --purge -y
}
installAptPackages()
{
logInfo "Install APT packages"
sudo apt install -y \
apt-transport-https \
autokey-gtk \
build-essential \
curl \
dconf-editor \
duf \
filezilla \
flatpak \
fonts-firacode \
fwupd-unsigned \
gdu \
gimp \
gnome-browser-connector \
gnome-connections \
gnome-firmware \
gnome-shell-extension-manager \
gnome-software \
gnome-sushi \
gnome-tweaks \
lm-sensors \
lsd \
mediainfo \
meld \
micro \
net-tools \
nethogs \
openssh-server \
optipng \
piper \
pulsemixer \
silversearcher-ag \
simple-scan \
tldr \
tree \
unrar \
yadm
}
installFirefox()
{
logInfo "Install Firefox"
sudo tee /etc/apt/preferences.d/mozillateam-ppa > /dev/null \
<<- EOT
Package: firefox*
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 501
EOT
sudo add-apt-repository -y ppa:mozillateam/ppa
sudo apt update
sudo apt install -y firefox
}
install1Password()
{
logInfo "Install 1Password"
curl -fsSL "https://downloads.1password.com/linux/debian/amd64/stable/1password-latest.deb" -o ${tempDir}/1password.deb
sudo apt install -y ${tempDir}/1password.deb
}
installDocker()
{
logInfo "Install Docker"
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null \
<<- EOT
X-Repolib-Name: Docker
Enabled: yes
Types: deb
URIs:https://download.docker.com/linux/ubuntu
Suites: $(lsb_release -cs)
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOT
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo adduser "${USER}" docker
sudo tee /etc/docker/daemon.json > /dev/null \
<<- EOT
{
"log-driver": "local"
}
EOT
mkdir -p "${HOME}/.docker"
tee "${HOME}/.docker/config.json" > /dev/null \
<<- EOT
{
"auths": {
"https://index.docker.io/v1/": {}
},
"credsStore": "secretservice",
"credHelpers": {
"000000000000.dkr.ecr.eu-west-1.amazonaws.com": "ecr-login"
},
"experimental": "enabled"
}
EOT
local -r dockerCredentialVersion=$(getLatestGithubVersion docker/docker-credential-helpers)
curl -fsSL "https://github.com/docker/docker-credential-helpers/releases/download/${dockerCredentialVersion}/docker-credential-secretservice-${dockerCredentialVersion}.linux-amd64" \
-o "${binDir}/docker-credential-secretservice"
chmod +x "${binDir}/docker-credential-secretservice"
}
installGoogleChrome()
{
logInfo "Install Google Chrome"
curl -fsSL "https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" -o ${tempDir}/chrome.deb
sudo apt install -y ${tempDir}/chrome.deb
}
installSpotify()
{
logInfo "Install Spotify"
curl -fsSL https://download.spotify.com/debian/pubkey_C85668DF69375001.gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/spotify.gpg
sudo tee /etc/apt/sources.list.d/spotify.list > /dev/null \
<<- EOT
deb [signed-by=/etc/apt/keyrings/spotify.gpg] http://repository.spotify.com stable non-free
EOT
sudo apt update
sudo apt install -y spotify-client
}
installVSCode()
{
logInfo "Install Visual Studio Code"
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/packages.microsoft.gpg
sudo tee /etc/apt/sources.list.d/vscode.sources > /dev/null \
<<- EOT
X-Repolib-Name: VS Code
Enabled: yes
Types: deb
URIs: https://packages.microsoft.com/repos/code
Suites: stable
Components: main
Signed-By: /etc/apt/keyrings/packages.microsoft.gpg
EOT
sudo apt update
sudo apt install -y code
}
installCelluloid()
{
logInfo "Install Celluloid"
sudo add-apt-repository -y ppa:xuzhen666/gnome-mpv
sudo apt update
sudo apt install -y celluloid
}
installGit()
{
logInfo "Install Git"
sudo add-apt-repository -y ppa:git-core/ppa
sudo apt update
sudo apt install -y git
sudo apt install -y libsecret-1-dev
sudo make --directory=/usr/share/doc/git/contrib/credential/libsecret
git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret
}
installFlatpakPackages()
{
logInfo "Install Flatpak packages"
sudo apt install -y flatpak
sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install --or-update -y flathub \
com.belmoussaoui.Obfuscate \
com.getpostman.Postman \
com.github.tchx84.Flatseal \
com.slack.Slack \
com.todoist.Todoist \
fr.romainvigier.MetadataCleaner \
io.gitlab.news_flash.NewsFlash \
org.gabmus.whatip \
org.gnome.design.IconLibrary \
org.telegram.desktop \
re.sonny.Commit \
re.sonny.Junction
}
installScripts()
{
logInfo "Install scripts"
if [ -e "${scriptsDir}" ]; then
logWarning "The directory \"${scriptsDir}\" already exists and will not be overwritten"
else
git clone https://github.com/riccardopedrielli/scripts.git "${scriptsDir}"
fi
}
installWakeMeOps()
{
logInfo "Install WakeMeOps"
curl -fsSL https://raw.githubusercontent.com/upciti/wakemeops/main/assets/install_repository | sudo bash
sudo apt update
sudo apt install -y \
bat \
curlie \
datree \
eza \
fd \
ghorg \
glab \
gping \
helm \
hostctl \
hugo \
infracost \
k3d \
k6 \
krew \
kube-linter \
kubeaudit \
kubectl \
kubescape \
lens \
procs \
telepresence \
terraform \
terraform-docs \
terrascan \
tflint \
yq
}
installBinEnv()
{
logInfo "Install BinEnv"
local -r binenvVersion=$(getLatestGithubVersion devops-works/binenv)
curl -fsSL "https://github.com/devops-works/binenv/releases/download/${binenvVersion}/binenv_linux_amd64" -o ${tempDir}/binenv
chmod +x ${tempDir}/binenv
${tempDir}/binenv update
${tempDir}/binenv install binenv
binenv install broot
binenv install ctop
binenv install driftctl
binenv install gocloc
binenv install gokart
binenv install grype
binenv install kube-beacon
binenv install kube-bench
binenv install kubecolor
binenv install kubent
binenv install kubestr
binenv install tfsec
binenv install tlsexp
binenv install updatecli
}
installMise()
{
curl -fsSL https://mise.jdx.dev/gpg-key.pub | sudo gpg --dearmor --yes -o /etc/apt/keyrings/mise-archive-keyring.gpg
sudo tee /etc/apt/sources.list.d/mise.sources > /dev/null \
<<- EOT
X-Repolib-Name: Mise
Enabled: yes
Types: deb
URIs: https://mise.jdx.dev/deb
Suites: stable
Components: main
Signed-By: /etc/apt/keyrings/mise-archive-keyring.gpg
EOT
sudo apt update
sudo apt install -y mise libssl-dev
local -r miseConfDir="${HOME}/.config/mise"
mkdir -p "${miseConfDir}"
touch "${miseConfDir}/config.toml"
mise trust --all
ln -sf "${HOME}/.local/share/mise" "${HOME}/.asdf"
eval "$(mise activate bash --shims)"
mise use -y go
mise use -y node@22
mise use -y [email protected] [email protected] [email protected]
mise use -y java@corretto-21 java@corretto-17
mise use -y maven
mise use -y gradle
}
installNPMPackages()
{
logInfo "Install NPM packages"
eval "$(mise activate bash --shims)"
install-npm-pkgs
}
installDebPackages()
{
logInfo "Install deb packages"
update-local-deb
}
installJetBrainsToolbox()
{
logInfo "Install JetBrains Toolbox"
sudo apt install -y libfuse2t64
local -r toolboxUrl=$(curl -fsSL 'https://data.services.jetbrains.com/products/releases?code=TBA&latest=true&type=release' | jq -r '.TBA[0].downloads.linux.link')
curl -fsSL "${toolboxUrl}" -o ${tempDir}/jetbrains-toolbox.tar.gz
tar xzf ${tempDir}/jetbrains-toolbox.tar.gz -C ${tempDir}
mv ${tempDir}/jetbrains-toolbox-*/jetbrains-toolbox ${tempDir}
${tempDir}/jetbrains-toolbox
rm -rf ${tempDir}/jetbrains-toolbox*
}
installAwsCli()
{
logInfo "Install aws cli"
update-aws-cli
local -r credHelperVersion=$(curl -fsSL "https://api.github.com/repos/awslabs/amazon-ecr-credential-helper/releases/latest" | jq -r .tag_name | sed 's/v//')
local -r credHelperUrl="https://amazon-ecr-credential-helper-releases.s3.us-east-2.amazonaws.com/${credHelperVersion}/linux-amd64/docker-credential-ecr-login"
curl -fsSL "${credHelperUrl}" -o "${binDir}/docker-credential-ecr-login"
chmod +x "${binDir}/docker-credential-ecr-login"
}
installTranscrypt()
{
logInfo "Install Transcrypt"
local -r transcryptVersion=$(getLatestGithubVersion elasticdog/transcrypt)
curl -fsSL "https://raw.githubusercontent.com/elasticdog/transcrypt/${transcryptVersion}/transcrypt" \
-o "${binDir}/transcrypt"
chmod +x "${binDir}/transcrypt"
}
installCUDA()
{
logInfo "Install CUDA"
curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb -o ${tempDir}/cuda-keyring.deb
sudo apt install -y ${tempDir}/cuda-keyring.deb
sudo apt update
sudo apt install -y cuda-toolkit-12 nvitop
}
setupBash()
{
logInfo "Set up Bash"
local -r toolDir="${devDir}/tools/bash-git-prompt"
if [ -e "${toolDir}" ]; then
logWarning "The directory \"${toolDir}\" already exists and will not be overwritten"
else
git clone https://github.com/magicmonty/bash-git-prompt.git "${toolDir}"
fi
tee "${HOME}/.bash_aliases" > /dev/null \
<<- EOT
[ -s "\${HOME}/dev/data/bash/custom.sh" ] && source "\${HOME}/dev/data/bash/custom.sh"
EOT
}
setupSensors()
{
logInfo "Set up sensors"
sudo sensors-detect --auto
}
setupDatetime()
{
logInfo "Set up date & time"
timedatectl set-local-rtc true
timedatectl set-ntp true
}
setupBackground()
{
logInfo "Set up background"
local -r backgroundsDir="${HOME}/.local/share/backgrounds"
mkdir -p "${backgroundsDir}"
curl -fsSL https://i.imgur.com/PkHGuw2.jpg -o "${backgroundsDir}/background.jpg"
local -r gnomeSettings="
[/]
org/gnome/desktop/background/picture-uri-dark='file://${backgroundsDir}/background.jpg'
org/gnome/desktop/background/picture-uri='file://${backgroundsDir}/background.jpg'
org/gnome/desktop/background/primary-color='#000000'
org/gnome/desktop/background/secondary-color='#000000'
"
dconf load / <<< "${gnomeSettings}"
}
installGnomeShellExtensions()
{
logInfo "Install Gnome Shell Extensions"
gnome-extensions disable [email protected]
sudo apt install -y gir1.2-gtop-2.0
curl -fsSL https://raw.githubusercontent.com/NicolasBernaerts/ubuntu-scripts/master/ubuntugnome/gnomeshell-extension-manage -o ${tempDir}/gnomeshell-extension-manage
chmod +x ${tempDir}/gnomeshell-extension-manage
${tempDir}/gnomeshell-extension-manage --install --user --version latest --extension-id 28 # gTile
${tempDir}/gnomeshell-extension-manage --install --user --version latest --extension-id 36 # Lock Keys
${tempDir}/gnomeshell-extension-manage --install --user --version latest --extension-id 277 # Impatience
${tempDir}/gnomeshell-extension-manage --install --user --version latest --extension-id 841 # Freon
${tempDir}/gnomeshell-extension-manage --install --user --version latest --extension-id 5219 # TopHat
local -r gnomeSettings="
[/]
org/gnome/shell/extensions/freon/hot-sensors=['__average__', '__max__', 'NVIDIA GeForce RTX 4080']
org/gnome/shell/extensions/freon/show-voltage=false
org/gnome/shell/extensions/freon/use-gpu-nvidia=true
org/gnome/shell/extensions/gtile/global-presets=false
org/gnome/shell/extensions/gtile/grid-sizes='6x6'
org/gnome/shell/extensions/gtile/moveresize-enabled=false
org/gnome/shell/extensions/lockkeys/notification-preferences='osd'
org/gnome/shell/extensions/lockkeys/style='none'
org/gnome/shell/extensions/net/gfxmonk/impatience/speed-factor=0.75
org/gnome/shell/extensions/tiling-assistant/center-window=['<Super><Alt>c']
"
dconf load / <<< "${gnomeSettings}"
}
configureSshServer()
{
logInfo "Configure SSH server"
sudo tee /etc/ssh/sshd_config.d/99-custom.conf > /dev/null \
<<- EOT
Port 22011
EOT
sudo systemctl restart ssh.service
}
disableBluetooth()
{
logInfo "Disable Bluetooth"
sudo sed -i \
-E 's/(#| )*AutoEnable=.*/AutoEnable=false/g' \
/etc/bluetooth/main.conf
}
turnOffWiFi()
{
logInfo "Turn off WiFi"
nmcli radio wifi off
}
updateGnomeSettings()
{
logInfo "Update Gnome settings"
local -r gnomeSettings="
[/]
ca/desrt/dconf-editor/show-warning=false
org/gnome/Characters/recent-characters=['È', 'è', 'à', 'ì', 'ò', 'ù', '€', '°', ' ']
org/gnome/desktop/calendar/show-weekdate=true
org/gnome/desktop/input-sources/xkb-options=['compose:menu']
org/gnome/desktop/interface/clock-format='24h'
org/gnome/desktop/interface/clock-show-weekday=true
org/gnome/desktop/interface/color-scheme='prefer-dark'
org/gnome/desktop/interface/cursor-theme='DMZ-White'
org/gnome/desktop/interface/gtk-theme='Yaru-dark'
org/gnome/desktop/interface/icon-theme='Yaru-dark'
org/gnome/desktop/interface/monospace-font-name='Fira Code Medium 11'
org/gnome/desktop/interface/show-battery-percentage=true
org/gnome/desktop/media-handling/autorun-never=true
org/gnome/desktop/media-handling/autorun-x-content-start-app=['x-content/ostree-repository']
org/gnome/desktop/notifications/show-in-lock-screen=false
org/gnome/desktop/peripherals/mouse/accel-profile='flat'
org/gnome/desktop/peripherals/mouse/speed=0.0
org/gnome/desktop/peripherals/touchpad/click-method='fingers'
org/gnome/desktop/privacy/old-files-age=uint32 1
org/gnome/desktop/privacy/recent-files-max-age=1
org/gnome/desktop/privacy/remember-recent-files=false
org/gnome/desktop/privacy/remove-old-temp-files=true
org/gnome/desktop/privacy/remove-old-trash-files=true
org/gnome/desktop/screensaver/lock-delay=uint32 60
org/gnome/desktop/search-providers/disabled=['org.gnome.Characters.desktop', 'org.gnome.seahorse.Application.desktop', 'org.gnome.Terminal.desktop']
org/gnome/desktop/session/idle-delay=uint32 900
org/gnome/desktop/sound/event-sounds=false
org/gnome/gnome-system-monitor/graph-data-points=36
org/gnome/gnome-system-monitor/graph-update-interval=500
org/gnome/meld/filename-filters=[('Backups', true, '#*# .#* ~* *~ *.{orig,bak,swp}'), ('OS-specific metadata', true, '.DS_Store ._* .Spotlight-V100 .Trashes Thumbs.db Desktop.ini'), ('Version Control', true, '_MTN .bzr .svn .svn .hg .fslckout _FOSSIL_ .fos CVS _darcs .git .svn .osc'), ('Binaries', true, '*.{pyc,a,obj,o,so,la,lib,dll,exe}'), ('Media', false, '*.{jpg,gif,png,bmp,wav,mp3,ogg,flac,avi,mpg,xcf,xpm}'), ('Dev', true, '.gradle .cache .node-gyp .terraform .terraform.lock.hcl bower_components node_modules build')]
org/gnome/meld/folder-status-filters=['new', 'modified']
org/gnome/meld/highlight-current-line=true
org/gnome/meld/highlight-syntax=true
org/gnome/meld/indent-width=4
org/gnome/meld/insert-spaces-instead-of-tabs=true
org/gnome/meld/show-line-numbers=true
org/gnome/meld/style-scheme='Yaru-dark'
org/gnome/nautilus/list-view/default-visible-columns=['name', 'size', 'type', 'date_modified']
org/gnome/nautilus/list-view/default-zoom-level='small'
org/gnome/nautilus/list-view/use-tree-view=true
org/gnome/nautilus/preferences/default-folder-viewer='list-view'
org/gnome/nautilus/preferences/recursive-search='always'
org/gnome/nautilus/preferences/show-delete-permanently=true
org/gnome/nautilus/preferences/show-directory-item-counts='never'
org/gnome/nautilus/preferences/show-image-thumbnails='never'
org/gnome/nautilus/window-state/sidebar-width=200
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/binding='<Super>x'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/command='gnome-session-quit --power-off'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/name='Shutdown'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/binding='<Shift><Super>x'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/command='gnome-session-quit --reboot'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/name='Reboot'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/binding='<Primary><Shift>Escape'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/command='gnome-system-monitor'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/name='System Monitor'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings=['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/']
org/gnome/settings-daemon/plugins/power/ambient-enabled=false
org/gnome/settings-daemon/plugins/power/power-button-action='interactive'
org/gnome/settings-daemon/plugins/power/sleep-inactive-ac-timeout=1200
org/gnome/settings-daemon/plugins/power/sleep-inactive-ac-type='nothing'
org/gnome/settings-daemon/plugins/power/sleep-inactive-battery-timeout=1200
org/gnome/settings-daemon/plugins/power/sleep-inactive-battery-type='suspend'
org/gnome/shell/extensions/dash-to-dock/dash-max-icon-size=40
org/gnome/shell/extensions/dash-to-dock/dock-position='BOTTOM'
org/gnome/shell/extensions/dash-to-dock/multi-monitor=true
org/gnome/shell/extensions/dash-to-dock/show-mounts-network=false
org/gnome/shell/extensions/dash-to-dock/show-mounts-only-mounted=true
org/gnome/shell/favorite-apps=['org.gnome.Nautilus.desktop', 'firefox.desktop', 'google-chrome.desktop', 'org.gnome.Terminal.desktop', 'code.desktop', 'syntevo-smartgit.desktop', 'org.gnome.meld.desktop', 'lens.desktop', 'com.todoist.Todoist.desktop', 'filezilla.desktop', 'com.getpostman.Postman.desktop', 'com.slack.Slack.desktop', 'org.telegram.desktop.desktop', 'discord-ptb.desktop', 'notable.desktop', 'org.gnome.TextEditor.desktop', 'com.gitlab.newsflash.desktop', 'spotify.desktop', '1password.desktop']
org/gnome/shell/ubuntu/startup-sound=''
org/gnome/software/download-updates-notify=false
org/gnome/software/download-updates=false
org/gnome/system/location/enabled=true
org/gnome/terminal/legacy/keybindings/close-window='disabled'
org/gnome/terminal/legacy/keybindings/preferences='<Primary>less'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/audible-bell=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/background-color='rgb(21,27,31)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/bold-color-same-as-fg=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/bold-color='rgb(245,245,245)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/bold-is-bright=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/cell-height-scale=1.1000000000000001
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/cell-width-scale=1.0
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/cursor-background-color='rgb(251,0,232)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/cursor-blink-mode='off'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/cursor-colors-set=true
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/cursor-foreground-color='rgb(255,229,253)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/default-size-columns=160
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/default-size-rows=40
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/font='Fira Code Medium 11'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/foreground-color='rgb(240,240,240)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/highlight-background-color='rgb(193,221,255)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/highlight-colors-set=true
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/highlight-foreground-color='rgb(0,0,0)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/palette=['rgb(0,0,0)', 'rgb(255,72,38)', 'rgb(65,167,50)', 'rgb(243,225,31)', 'rgb(82,137,249)', 'rgb(165,69,183)', 'rgb(65,185,211)', 'rgb(170,170,170)', 'rgb(126,126,126)', 'rgb(226,97,92)', 'rgb(115,205,114)', 'rgb(255,246,70)', 'rgb(98,174,255)', 'rgb(185,87,202)', 'rgb(69,195,221)', 'rgb(255,255,255)']
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/scrollbar-policy='never'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/use-system-font=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/use-theme-colors=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/use-theme-transparency=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/use-transparent-background=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/visible-name='Default'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/audible-bell=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/background-color='rgb(21,27,31)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/bold-color-same-as-fg=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/bold-color='rgb(245,245,245)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/bold-is-bright=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/cell-height-scale=1.1000000000000001
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/cell-width-scale=1.0
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/cursor-background-color='rgb(251,0,232)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/cursor-blink-mode='off'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/cursor-colors-set=true
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/cursor-foreground-color='rgb(255,229,253)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/default-size-columns=96
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/default-size-rows=24
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/font='Fira Code Medium 16'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/foreground-color='rgb(240,240,240)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/highlight-background-color='rgb(193,221,255)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/highlight-colors-set=true
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/highlight-foreground-color='rgb(0,0,0)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/palette=['rgb(0,0,0)', 'rgb(255,72,38)', 'rgb(65,167,50)', 'rgb(243,225,31)', 'rgb(82,137,249)', 'rgb(165,69,183)', 'rgb(65,185,211)', 'rgb(170,170,170)', 'rgb(126,126,126)', 'rgb(226,97,92)', 'rgb(115,205,114)', 'rgb(255,246,70)', 'rgb(98,174,255)', 'rgb(185,87,202)', 'rgb(69,195,221)', 'rgb(255,255,255)']
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/scrollbar-policy='never'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/use-system-font=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/use-theme-colors=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/use-theme-transparency=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/use-transparent-background=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/visible-name='Presentation'
org/gnome/terminal/legacy/profiles:/default='107d05fc-a7be-4eb3-aa9e-77061af82199'
org/gnome/terminal/legacy/profiles:/list=['107d05fc-a7be-4eb3-aa9e-77061af82199', '90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa']
org/gnome/TextEditor/highlight-current-line=true
org/gnome/TextEditor/indent-style='space'
org/gnome/TextEditor/restore-session=false
org/gnome/TextEditor/right-margin-position=uint32 120
org/gnome/TextEditor/show-line-numbers=true
org/gnome/TextEditor/show-map=true
org/gnome/TextEditor/spellcheck=false
org/gnome/TextEditor/style-scheme='Adwaita-dark'
org/gnome/TextEditor/tab-width=uint32 4
org/gnome/TextEditor/wrap-text=false
org/gtk/settings/file-chooser/clock-format='24h'
"
dconf load / <<< "${gnomeSettings}"
}
killSudoLoop()
{
kill "${sudoLoopPid}"
}
writeTODO()
{
logInfo "Write TODO"
tee "${HOME}/TODO.txt" > /dev/null \
<<- EOT
- Delete the setup.sh script
- Open Settings -> Privacy & Security -> Diagnostic -> Send error reports to Canonical -> Never
- Open Settings -> Apps -> Default Apps -> Set Web to Junction
-> Set Music to Celluloid
-> Set Video to Celluloid
- Open Language Support -> If prompted for missing languages, click Install
-> Language -> Apply System-Wide
-> Regional Formats -> Apply System-Wide
- Load configs with YADM
- Install JetBrains IDEs from JetBrains Toolbox
- Delete this file
EOT
}
printEndMessage()
{
logInfo "Done"
echo ""
echo "The setup has been completed successfully."
echo "Some changes require a restart to take effect."
echo "After the restart, read the TODO.txt file in your home directory for the manual steps to complete the setup."
echo ""
}
main()
{
checkUbuntuVersion
getSudoPrivileges
createTemporaryDirectory
setKernelParameters
configureGrub
disableReports
createDevStructure
removeUnwantedPackages
configureApt
updateSystem
installAptPackages
installFirefox
install1Password
installDocker
installGoogleChrome
installSpotify
installVSCode
installCelluloid
installGit
installFlatpakPackages
installScripts
installWakeMeOps
installBinEnv
installMise
installNPMPackages
installDebPackages
installJetBrainsToolbox
installAwsCli
installTranscrypt
installCUDA
setupBash
setupSensors
setupDatetime
setupBackground
installGnomeShellExtensions
configureSshServer
disableBluetooth
turnOffWiFi
updateGnomeSettings
killSudoLoop
writeTODO
printEndMessage
}
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment