├── README.md └── ubuntu.sh /README.md: -------------------------------------------------------------------------------- 1 | # Linux Install Development Script 2 | 3 | ### Supported Systems 4 | - [Ubuntu - 24.04 (Base)](https://ubuntu.com/download) 5 | 6 | ### Supported Architectures 7 | - x86_64 (amd64) 8 | 9 |
10 | 11 | # Preparing to Run the Script 12 | 13 | ### Ubuntu 14 | ```bash 15 | sudo apt install curl -y 16 | ``` 17 | 18 |
19 | 20 | # Running the Script 21 | 22 | ### Ubuntu 23 | ```bash 24 | curl -H 'Cache-Control: no-cache' -sSL https://raw.githubusercontent.com/daniloancilotto/linux-install-development-script/master/ubuntu.sh | bash 25 | ``` 26 | 27 |
28 | 29 | # Installations and Configurations 30 | 31 | ### Ubuntu 32 | - Kernel (Configuration Only) 33 | - Packages 34 | - Automatically Installed 35 | - Parameters 36 | - /etc/sysctl.d/60-swappiness.conf 37 | - /etc/sysctl.d/60-cache-pressure.conf 38 | - /etc/sysctl.d/60-inotify-watches.conf 39 | - Wget - Latest (Repository) 40 | - Tar - Latest (Repository) 41 | - Crudini - Latest (Repository) 42 | - Jq - Latest (Repository) 43 | - Python - 3 (Repository) 44 | - OpenJDK - 8 & 21 (Repository) 45 | - Menu 46 | - ~/.local/share/applications/openjdk-8-policytool.desktop 47 | - Git - Latest (Repository) 48 | - Maven - Latest (Repository) 49 | - [Node.js - Latest (Repository)](https://github.com/nodesource/distributions) 50 | - Docker - Latest (Repository) 51 | - Modules 52 | - Compose 53 | - User Groups 54 | - docker 55 | - Preferences 56 | - /etc/docker/daemon.json 57 | - Cron Jobs 58 | - Volume Prune 59 | - Image Prune 60 | - MySQL Client - Latest (Repository) 61 | - [MySQL Workbench - 8.0.45 (Dpkg)](https://dev.mysql.com/downloads/workbench/) 62 | - [Google Chrome - Latest (Dpkg)](https://www.google.com/chrome/) 63 | - [Postman - Latest (Portable)](https://www.postman.com/downloads/) 64 | - Menu 65 | - ~/.local/share/applications/postman.desktop 66 | - [Visual Studio Code - Latest (Dpkg)](https://code.visualstudio.com/updates) 67 | - Extensions 68 | - Material Icon Theme 69 | - GitLens — Git supercharged 70 | - Python 71 | - Pylance 72 | - autopep8 73 | - Pylint 74 | - Extension Pack for Java 75 | - Spring Boot Tools 76 | - Lombok Annotations Support for VS Code 77 | - Vetur 78 | - vuetify-vscode 79 | - ESLint 80 | - Version Lens 81 | - Docker 82 | - Live Server 83 | - Preferences 84 | - ~/.config/Code/User/settings.json 85 | - Language Pack - Latest (Repository) 86 | - Languages 87 | - pt -------------------------------------------------------------------------------- /ubuntu.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | system="`lsb_release -sd`" 3 | system_release="`lsb_release -sr`" 4 | system_architecture="`uname -m`" 5 | 6 | echo "INSTALL DEVELOPMENT APPS (UBUNTU)" 7 | echo "Version: 2025.11.25-2320" 8 | echo "Author: Danilo Ancilotto" 9 | echo "System: $system" 10 | echo "Architecture: $system_architecture" 11 | echo "Home: $HOME" 12 | echo "User: $USER" 13 | sudo echo -n "" 14 | 15 | printLine() { 16 | text="$1" 17 | if [ ! -z "$text" ] 18 | then 19 | text="$text " 20 | fi 21 | length=${#text} 22 | sudo echo "" 23 | echo -n "$text" 24 | for i in {1..80} 25 | do 26 | if [ $i -gt $length ] 27 | then 28 | echo -n "=" 29 | fi 30 | done 31 | echo "" 32 | } 33 | 34 | dpkgInstall() { 35 | file="$HOME/$1" 36 | wget -O "$file" "$2" 37 | sudo dpkg -i "$file" 38 | rm -fv "$file" 39 | sudo apt install -fy 40 | } 41 | 42 | menuConf() { 43 | source_file="/usr/share/applications/$2" 44 | target_file="$1/$2" 45 | if [ -f "$source_file" ] && [ "$5" != "--no-replace-file" ] 46 | then 47 | cp -fv "$source_file" "$target_file" 48 | fi 49 | if [ -f "$target_file" ] 50 | then 51 | crudini --set "$target_file" "Desktop Entry" "$3" "$4" 52 | fi 53 | } 54 | 55 | python3_dir="/usr/bin/python3" 56 | java8_dir="/usr/lib/jvm/java-8-openjdk-amd64" 57 | java21_dir="/usr/lib/jvm/java-21-openjdk-amd64" 58 | 59 | root_app_dir="/root/Applications" 60 | sudo mkdir -pv "$root_app_dir" 61 | 62 | home_app_dir="$HOME/Applications" 63 | mkdir -pv "$home_app_dir" 64 | 65 | home_menu_dir="$HOME/.local/share/applications" 66 | mkdir -pv "$home_menu_dir" 67 | 68 | printLine "Update" 69 | sudo apt update 70 | 71 | printLine "Kernel" 72 | sudo apt-mark auto $(apt-mark showmanual | grep -E "^linux-([[:alpha:]]+-)+[[:digit:].]+-[^-]+(|-.+)$") 73 | 74 | swappiness="10" 75 | if [ "`cat /proc/sys/vm/swappiness`" != "$swappiness" ] 76 | then 77 | file="/etc/sysctl.d/60-swappiness.conf" 78 | echo "vm.swappiness=$swappiness" | sudo tee "$file" 79 | sudo sysctl -p "$file" 80 | fi 81 | 82 | cache_pressure="50" 83 | if [ "`cat /proc/sys/vm/vfs_cache_pressure`" != "$cache_pressure" ] 84 | then 85 | file="/etc/sysctl.d/60-cache-pressure.conf" 86 | echo "vm.vfs_cache_pressure=$cache_pressure" | sudo tee "$file" 87 | sudo sysctl -p "$file" 88 | fi 89 | 90 | inotify_watches="524288" 91 | if [ "`cat /proc/sys/fs/inotify/max_user_watches`" != "$inotify_watches" ] 92 | then 93 | file="/etc/sysctl.d/60-inotify-watches.conf" 94 | echo "fs.inotify.max_user_watches=$inotify_watches" | sudo tee "$file" 95 | sudo sysctl -p "$file" 96 | fi 97 | 98 | echo "kernel have been configured" 99 | 100 | printLine "Wget" 101 | sudo apt install wget -y 102 | 103 | printLine "Tar" 104 | sudo apt install tar -y 105 | 106 | printLine "Crudini" 107 | sudo apt install crudini -y 108 | 109 | printLine "Jq" 110 | sudo apt install jq -y 111 | 112 | printLine "Python" 113 | sudo apt install python3 python3-pip python3-tk python3-dev python3-venv python-is-python3 -y 114 | 115 | printLine "OpenJDK" 116 | 117 | sudo apt install openjdk-8-jdk openjdk-21-jdk -y 118 | menuConf "$home_menu_dir" "openjdk-8-policytool.desktop" "NoDisplay" "true" 119 | 120 | echo "openjdk have been configured" 121 | 122 | printLine "Git" 123 | sudo apt install git -y 124 | 125 | printLine "Maven" 126 | sudo apt install maven -y 127 | 128 | printLine "Node.js" 129 | sudo snap remove node --purge 130 | curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - 131 | sudo apt install nodejs -y 132 | 133 | printLine "Docker" 134 | 135 | sudo apt install docker.io docker-compose-v2 -y 136 | 137 | sudo usermod -aG docker $USER 138 | 139 | file="/etc/docker/daemon.json" 140 | json="{\"data-root\": \"/home/docker/data\"}" 141 | if [ ! -f "$file" ] 142 | then 143 | sudo mkdir -pv "/etc/docker" 144 | sudo mkdir -pv "/home/docker" 145 | echo "$json" | sudo tee "$file" 146 | 147 | if [ -d "/var/lib/docker" ] && [ ! -d "/home/docker/data" ] 148 | then 149 | sudo systemctl stop docker.service 150 | sudo mv -fv "/var/lib/docker" "/home/docker/data" 151 | sudo systemctl start docker.service 152 | fi 153 | fi 154 | sudo systemctl enable docker.service 155 | 156 | cronjobs=( \ 157 | "@reboot /usr/bin/sudo /usr/bin/docker volume prune -a -f" \ 158 | "@reboot /usr/bin/sudo /usr/bin/docker image prune -a -f" \ 159 | ) 160 | i=0 161 | while [ $i != ${#cronjobs[@]} ] 162 | do 163 | cronjob="${cronjobs[$i]}" 164 | 165 | if [ -z "$(sudo crontab -l | grep -F "$cronjob")" ] 166 | then 167 | (sudo crontab -l 2>/dev/null; echo "$cronjob") | sudo crontab - 168 | fi 169 | 170 | let "i++" 171 | done 172 | 173 | echo "docker have been configured" 174 | 175 | printLine "MySQL Client" 176 | sudo apt install mysql-client -y 177 | 178 | printLine "MySQL Workbench" 179 | 180 | root_app_name="mysql-workbench" 181 | root_app_subdir="$root_app_dir/$root_app_name" 182 | root_app_cversion="`sudo cat "$root_app_subdir/version.txt"`" 183 | root_app_version="8.0.45" 184 | 185 | if [ "$root_app_cversion" != "$root_app_version" ] 186 | then 187 | sudo rm -rf "$root_app_subdir" 188 | 189 | sudo apt remove mysql-workbench-community -y 190 | fi 191 | 192 | if [ -z "`mysql-workbench --version`" ] 193 | then 194 | dpkgInstall "mysql-workbench.deb" $'https://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-workbench-community_'$root_app_version$'-1ubuntu'$system_release$'_amd64.deb' 195 | 196 | sudo mkdir -pv "$root_app_subdir" 197 | 198 | if [ ! -z "`mysql-workbench --version`" ] 199 | then 200 | echo "$root_app_version" | sudo tee "$root_app_subdir/version.txt" 201 | fi 202 | else 203 | echo "$root_app_name is already installed" 204 | fi 205 | 206 | printLine "Google Chrome" 207 | if [ -z "`google-chrome --version`" ] 208 | then 209 | dpkgInstall "google-chrome.deb" "https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" 210 | else 211 | echo "google-chrome is already installed" 212 | fi 213 | 214 | printLine "Postman" 215 | 216 | home_app_name="postman" 217 | home_app_subdir="$home_app_dir/$home_app_name" 218 | home_app_cversion="`cat "$home_app_subdir/version.txt"`" 219 | home_app_version="latest" 220 | 221 | if [ "$home_app_cversion" != "$home_app_version" ] 222 | then 223 | rm -rf "$home_app_subdir" 224 | fi 225 | 226 | if [ ! -d "$home_app_subdir" ] 227 | then 228 | file="$home_app_dir/postman-$home_app_version.tar.gz" 229 | wget -O "$file" "https://dl.pstmn.io/download/$home_app_version/linux_64" 230 | tar -xzf "$file" -C "$home_app_dir" 231 | rm -fv "$file" 232 | 233 | mv -fv "$home_app_dir/Postman" "$home_app_subdir" 234 | 235 | if [ -f "$home_app_subdir/Postman" ] 236 | then 237 | echo "$home_app_version" > "$home_app_subdir/version.txt" 238 | fi 239 | else 240 | echo "$home_app_name is already installed" 241 | fi 242 | 243 | file="$home_menu_dir/postman.desktop" 244 | desk=$'[Desktop Entry]\n' 245 | desk+=$'Name=Postman\n' 246 | desk+=$'Exec='$home_app_subdir$'/Postman\n' 247 | desk+=$'Terminal=false\n' 248 | desk+=$'Type=Application\n' 249 | desk+=$'Icon='$home_app_subdir$'/app/icons/icon_128x128.png\n' 250 | desk+=$'Categories=Utility;\n' 251 | echo "$desk" > "$file" 252 | 253 | echo "$home_app_name have been configured" 254 | 255 | printLine "Visual Studio Code" 256 | 257 | sudo snap remove code --purge 258 | if [ -z "`code --version`" ] 259 | then 260 | echo "code code/add-microsoft-repo boolean true" | sudo debconf-set-selections 261 | dpkgInstall "code.deb" "https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64" 262 | else 263 | echo "code is already installed" 264 | fi 265 | 266 | code_extensions=( \ 267 | "pkief.material-icon-theme" \ 268 | "eamodio.gitlens" \ 269 | "ms-python.python" \ 270 | "ms-python.vscode-pylance" \ 271 | "ms-python.autopep8" \ 272 | "ms-python.pylint" \ 273 | "vscjava.vscode-java-pack" \ 274 | "vmware.vscode-spring-boot" \ 275 | "vscjava.vscode-lombok" \ 276 | "octref.vetur" \ 277 | "vuetifyjs.vuetify-vscode" \ 278 | "dbaeumer.vscode-eslint" \ 279 | "pflannery.vscode-versionlens" \ 280 | "ms-azuretools.vscode-docker" \ 281 | "ritwickdey.liveserver" \ 282 | ) 283 | i=0 284 | while [ $i != ${#code_extensions[@]} ] 285 | do 286 | code --install-extension "${code_extensions[$i]}" 287 | 288 | let "i++" 289 | done 290 | 291 | file="$HOME/.config/Code/User/settings.json" 292 | json="`cat "$file"`" 293 | if [ -z "$json" ] 294 | then 295 | json="{}" 296 | fi 297 | json="`echo "$json" | jq '."workbench.startupEditor"="none"'`" 298 | json="`echo "$json" | jq '."workbench.colorTheme"="Default Dark+"'`" 299 | json="`echo "$json" | jq '."workbench.iconTheme"="material-icon-theme"'`" 300 | json="`echo "$json" | jq '."workbench.tree.enableStickyScroll"=false'`" 301 | json="`echo "$json" | jq '."extensions.ignoreRecommendations"=true'`" 302 | json="`echo "$json" | jq '."window.zoomLevel"=0'`" 303 | json="`echo "$json" | jq '."window.newWindowDimensions"="inherit"'`" 304 | json="`echo "$json" | jq '."editor.minimap.enabled"=false'`" 305 | json="`echo "$json" | jq '."editor.stickyScroll.enabled"=false'`" 306 | json="`echo "$json" | jq '."editor.suggestSelection"="first"'`" 307 | json="`echo "$json" | jq '."editor.inlineSuggest.enabled"=false'`" 308 | json="`echo "$json" | jq '."editor.bracketPairColorization.enabled"=true'`" 309 | json="`echo "$json" | jq '."editor.foldingMaximumRegions"=65000'`" 310 | json="`echo "$json" | jq '."diffEditor.ignoreTrimWhitespace"=false'`" 311 | json="`echo "$json" | jq '."diffEditor.maxComputationTime"=0'`" 312 | json="`echo "$json" | jq '."search.maxResults"=null'`" 313 | json="`echo "$json" | jq '."terminal.integrated.env.linux"={}'`" 314 | json="`echo "$json" | jq '."terminal.integrated.env.linux"."JAVA_HOME"="'$java21_dir'"'`" 315 | json="`echo "$json" | jq '."terminal.integrated.cursorStyle"="underline"'`" 316 | json="`echo "$json" | jq '."terminal.integrated.fontSize"=13'`" 317 | json="`echo "$json" | jq '."terminal.integrated.stickyScroll.enabled"=false'`" 318 | json="`echo "$json" | jq '."debug.console.fontSize"=13'`" 319 | json="`echo "$json" | jq '."debug.internalConsoleOptions"="neverOpen"'`" 320 | json="`echo "$json" | jq '."debug.openDebug"="neverOpen"'`" 321 | json="`echo "$json" | jq '."debug.showInStatusBar"="never"'`" 322 | json="`echo "$json" | jq '."git.suggestSmartCommit"=false'`" 323 | json="`echo "$json" | jq '."git.confirmSync"=false'`" 324 | json="`echo "$json" | jq '."git.fetchOnPull"=true'`" 325 | json="`echo "$json" | jq '."gitlens.codeLens.authors.enabled"=false'`" 326 | json="`echo "$json" | jq '."gitlens.codeLens.recentChange.enabled"=false'`" 327 | json="`echo "$json" | jq '."gitlens.advanced.messages"={}'`" 328 | json="`echo "$json" | jq '."gitlens.advanced.messages"."suppressLineUncommittedWarning"=true'`" 329 | json="`echo "$json" | jq '."python.showStartPage"=false'`" 330 | json="`echo "$json" | jq '."python.languageServer"="Pylance"'`" 331 | json="`echo "$json" | jq '."python.pythonPath"="'$python3_dir'"'`" 332 | json="`echo "$json" | jq '."python.defaultInterpreterPath"="'$python3_dir'"'`" 333 | json="`echo "$json" | jq '."python.analysis.importFormat"="absolute"'`" 334 | json="`echo "$json" | jq '."python.analysis.autoImportCompletions"=true'`" 335 | json="`echo "$json" | jq '."python.analysis.indexing"=true'`" 336 | json="`echo "$json" | jq '."java.semanticHighlighting.enabled"=true'`" 337 | json="`echo "$json" | jq '."java.configuration.checkProjectSettingsExclusions"=false'`" 338 | json="`echo "$json" | jq '."java.configuration.updateBuildConfiguration"="automatic"'`" 339 | json="`echo "$json" | jq '."java.project.importOnFirstTimeStartup"="automatic"'`" 340 | json="`echo "$json" | jq '."java.compile.nullAnalysis.mode"="automatic"'`" 341 | json="`echo "$json" | jq '."java.inlayHints.parameterNames.enabled"="none"'`" 342 | json="`echo "$json" | jq '."java.refactor.renameFromFileExplorer"="autoApply"'`" 343 | json="`echo "$json" | jq '."java.configuration.runtimes"=[]'`" 344 | json="`echo "$json" | jq '."java.configuration.runtimes"+=[{"name":"JavaSE-1.8","path":"'$java8_dir'"}]'`" 345 | json="`echo "$json" | jq '."java.configuration.runtimes"+=[{"name":"JavaSE-21","path":"'$java21_dir'","default":true}]'`" 346 | json="`echo "$json" | jq '."java.jdt.ls.java.home"="'$java21_dir'"'`" 347 | json="`echo "$json" | jq '."spring-boot.ls.java.home"="'$java21_dir'"'`" 348 | json="`echo "$json" | jq '."maven.terminal.useJavaHome"=true'`" 349 | json="`echo "$json" | jq '."liveServer.settings.donotShowInfoMsg"=true'`" 350 | json="`echo "$json" | jq '."liveServer.settings.donotVerifyTags"=true'`" 351 | json="`echo "$json" | jq '."redhat.telemetry.enabled"=false'`" 352 | json="`echo "$json" | jq '."thunder-client.codeSnippetLanguage"="cs-httpclient"'`" 353 | echo "$json" > "$file" 354 | 355 | echo "code have been configured" 356 | 357 | printLine "Language Pack" 358 | sudo apt install language-pack-pt language-pack-gnome-pt -y 359 | sudo apt install language-selector-common -y 360 | sudo apt install `check-language-support` -y 361 | 362 | printLine "Finished" 363 | echo "Please reboot your system." 364 | echo "" --------------------------------------------------------------------------------