Skip to content

Instantly share code, notes, and snippets.

@mzaidannas
Last active October 4, 2023 10:52
Show Gist options
  • Save mzaidannas/f537446be1e71b71aa6bcffefad62b80 to your computer and use it in GitHub Desktop.
Save mzaidannas/f537446be1e71b71aa6bcffefad62b80 to your computer and use it in GitHub Desktop.
Ubuntu Initial Setup
#!/usr/bin/env bash
# Configure some system specifications
sudo usermod -G input -a $USER
# Max number of files (Required by services like docker/jvm)
sudo sysctl -w fs.inotify.max_user_watches=524288
sudo sysctl -w vm.max_map_count=262144
# Better swap if system have a lot of unused memory
sudo sysctl -w vm.swappiness=10
sudo sysctl -w vm.vfs_cache_pressure=100
# Better USB transfer speed/progress
sudo sysctl -w vm.dirty_bytes=50331648
sudo sysctl -w vm.dirty_background_bytes=16777216
# Make these changes permanent
echo "fs.inotify.max_user_watches=524288\nvm.max_map_count=262144" | sudo tee /etc/sysctl.d/20-max-files.conf
echo "vm.swappiness=10\nvm.vfs_cache_pressure=100" | sudo tee /etc/sysctl.d/40-swap.conf
echo "vm.dirty_bytes=50331648\nvm.dirty_background_bytes=16777216" | sudo tee /etc/sysctl.d/50-usb-transfer.conf
sudo apt update && sudo apt upgrade -y
# Install common tools and utilities
sudo apt install -y unace unrar zip unzip p7zip-full p7zip-rar sharutils rar uudeview mpack arj cabextract zsh samba
# Set samba password
(echo "$password"; echo "$password") | sudo smbpasswd -s -a $USER
# Change default shell
sudo chsh -s /bin/zsh $(whoami)
# GPG keys for extra repos
sudo mkdir -p /etc/apt/keyrings
# Nodejs
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
sudo apt install -y nodejs
sudo npm install -g yarn eslint stylelint coffeelint htmlhint prettier
# Postgresql
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt update && sudo apt install -y postgresql libpq-dev
sudo systemctl restart postgresql
sudo systemctl enable postgresql
sudo -u postgres psql -U postgres -d postgres -c "ALTER USER postgres WITH PASSWORD '$password';"
# Redis
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt update && sudo apt install -y redis
sudo systemctl restart redis-server
sudo systemctl enable redis-server
# Memcached
sudo apt install -y memcached
sudo systemctl restart memcached
sudo systemctl enable memcached
# MongoDB
curl -fsSL https://pgp.mongodb.com/server-7.0.asc | sudo gpg --dearmor -o /etc/apt/keyrings/mongodb-server-7.0.gpg
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mongodb-server-7.0.gpg] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
sudo apt update && sudo apt install -y mongodb-org
sudo systemctl restart mongod
sudo systemctl enable mongod
# Elasticsearch
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /etc/apt/keyrings/elastic.gpg
echo "deb [signed-by=/etc/apt/keyrings/elastic.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update && sudo apt install -y elasticsearch
# Only use 2 GB of heap memory
echo "-Xms2g\n-Xmx2g" | sudo tee /etc/elasticsearch/jvm.options.d/heap_size.options
sudo systemctl restart elasticsearch
sudo systemctl enable elasticsearch
# Docker
sudo apt purge -y docker docker-engine docker.io containerd runc
sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo systemctl restart docker
sudo systemctl enable docker
# Install build tools and programming languages
sudo apt install -y build-essential git git-lfs gitk openssl python3 python3-setuptools python3-pip libssl-dev resolvconf default-jre default-jdk llvm clang clang-tools lldb lld cmake gradle ruby ruby-build rust-all golang
# Install asdf and configure ruby, nodejs, python and java plugins
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
tee -a ~/.bashrc << ASDF
# asdf
. "\$HOME/.asdf/asdf.sh"
. "$HOME/.asdf/completions/asdf.bash"
ASDF
. "\$HOME/.asdf/asdf.sh"
. "$HOME/.asdf/completions/asdf.bash"
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf plugin add ruby https://github.com/asdf-vm/asdf-ruby.git
asdf plugin-add python https://github.com/asdf-community/asdf-python.git
asdf plugin-add java https://github.com/halcyon/asdf-java.git
# Use vscode as default editor
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/
rm microsoft.gpg
echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" | sudo tee /etc/apt/sources.list.d/vscode.list
sudo apt update && sudo apt install -y code
# Use helix as default command line text editor
sudo add-apt-repository -y ppa:maveonair/helix-editor
sudo apt install -y helix
# User dbeaver community as default database gui
sudo add-apt-repository -y ppa:serge-rider/dbeaver-ce
sudo apt install -y dbeaver-ce
# Alias commands (Better commandline tools)
# zioxide (smart cd replacement)
sudo apt install -y zoxide
tee -a ~/.bashrc << ZOXIDE
# Zoxide (smart cd replacement)
eval "$(zoxide init bash)"
ZOXIDE
# Bat (cat and less alternative for printing to terminal)
sudo apt install -y bat
# NeoVim vim commandline text editor with plugin system
sudo apt install -y neovim
# Use SpaceVim vim distribution
curl -sLf https://spacevim.org/install.sh | bash
# Prettyping (ping alternative with colors and progress bar)
sudo apt install -y prettyping
# fd (faster find alternative)
sudo apt install -y fd-find
# ripgrep (faster grep and file content search)
sudo apt install -y ripgrep
# Diff-so-fancy (git diff with colors and highlighting)
sudo npm install -g diff-so-fancy
# duf (df alternative)
sudo apt install -y duf
# ncdu (du alternative)
sudo apt install -y ncdu
# Htop (top alternative)
sudo apt install -y htop
# lsd (ls alternative with colors and icons)
curl -fsSLO https://github.com/lsd-rs/lsd/releases/download/v1.0.0/lsd_1.0.0_amd64.deb
sudo dpkg -i lsd_1.0.0_amd64.deb
rm lsd_1.0.0_amd64.deb
# tldr (Better help and man pages)
sudo apt install -y tldr
# jq and yq commandline JSON and Yaml parsers
sudo add-apt-repository -y ppa:rmescandon/yq
sudo apt install -y jq yq
# FZF (Fuzzy search everything)
sudo apt install -y fzf
tee -a ~/.bashrc << FZF
# FZF (Fuzzy substring searching)
[ -f /usr/share/doc/fzf/examples/key-bindings.bash ] && source /usr/share/doc/fzf/examples/key-bindings.bash
FZF
# clipboard
sudo apt install -y wl-clipboard
tee -a ~/.bashrc << ALIASES
# Shell alias commands
alias sudo="sudo "
alias cd="z"
alias vim="nvim"
alias less="batcat --pager='less -RF'"
alias cat="batcat --paging never"
alias ping="prettyping --nolegend"
alias preview="fzf --preview 'batcat --color \"always\" {}'"
# add support for ctrl+o to open selected file in Helix text editor
export FZF_DEFAULT_OPTS="--bind='ctrl-o:execute(hx {})+abort'"
export FZF_DEFAULT_COMMAND="fdfind --type file --color=never --hidden --no-ignore"
export FZF_ALT_C_COMMAND='fdfind --type directory . --color=never --hidden --no-ignore'
alias top="htop"
alias find="fdfind"
alias du="ncdu -rr -x --exclude .git --exclude node_modules"
alias ls="lsd"
alias df="duf"
alias grep="rg"
alias help="tldr"
alias yq="yq -CP"
alias pbcopy='wl-copy'
alias pbpaste='wl-paste'
ALIASES
# To enable clipboard sharing between server/client using aliases pbcopy/pbpaste
# echo 'ForwardX11 yes' >> ~/.ssh/config
# setup diff-so-fancy
git config --global pager.diff 'diff-so-fancy | less --tabs=1,5 -RF'
git config --global pager.show 'diff-so-fancy | less --tabs=1,5 -RF'
git config --global color.ui true
git config --global color.diff-highlight.oldNormal "red bold"
git config --global color.diff-highlight.oldHighlight "red bold 52"
git config --global color.diff-highlight.newNormal "green bold"
git config --global color.diff-highlight.newHighlight "green bold 22"
git config --global color.diff.meta "11"
git config --global color.diff.frag "magenta bold"
git config --global color.diff.commit "yellow bold"
git config --global color.diff.old "red bold"
git config --global color.diff.new "green bold"
git config --global color.diff.whitespace "red reverse"
# Optional (git default editor as helix)
git config --global core.editor 'hx'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment