├── 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 ""
--------------------------------------------------------------------------------