<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Danielius Navickas </title>
    <description>The latest articles on DEV Community by Danielius Navickas  (@navickas).</description>
    <link>https://dev.to/navickas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3650737%2F861dd2cd-a0f5-4e03-9b92-c5ca8e77a0fc.png</url>
      <title>DEV Community: Danielius Navickas </title>
      <link>https://dev.to/navickas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/navickas"/>
    <language>en</language>
    <item>
      <title>Self-Hosted Nextcloud on a Ubuntu Server 24.04 VM</title>
      <dc:creator>Danielius Navickas </dc:creator>
      <pubDate>Tue, 13 Jan 2026 23:10:03 +0000</pubDate>
      <link>https://dev.to/navickas/self-hosted-nextcloud-on-a-ubuntu-server-2404-vm-4agh</link>
      <guid>https://dev.to/navickas/self-hosted-nextcloud-on-a-ubuntu-server-2404-vm-4agh</guid>
      <description>&lt;p&gt;While learning Linux server administration, I wanted to set up something more realistic than just installing packages or running test containers.&lt;/p&gt;

&lt;p&gt;Something that actually reflects what you'd do on a server: running a real service, managing containers, handling storage, dealing with security-related setup, and routing traffic properly.&lt;/p&gt;

&lt;p&gt;So I deployed Nextcloud using Docker and Docker Compose on an Ubuntu 24.04 server VM, with a reverse proxy using Nginx to handle incoming requests and HTTPS termination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the setup includes&lt;/strong&gt;&lt;br&gt;
Services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nextcloud running in Docker&lt;/li&gt;
&lt;li&gt;MariaDB for the database&lt;/li&gt;
&lt;li&gt;Nginx as a reverse proxy&lt;/li&gt;
&lt;li&gt;Docker Compose to manage the stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwaj0gx5eyzqedos7xo7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwaj0gx5eyzqedos7xo7.PNG" alt="docker compose ps" width="800" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Persistence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database data stored using Docker volumes&lt;/li&gt;
&lt;li&gt;Nextcloud data directory mounted so files persist across restarts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh9nk3yza8nvwg41ozicb.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh9nk3yza8nvwg41ozicb.PNG" alt="docker volume ls" width="722" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Access &amp;amp; networking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTPS enabled using a self-signed certificate&lt;/li&gt;
&lt;li&gt;Service accessible locally and over the network&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why I built it&lt;/strong&gt;&lt;br&gt;
I wanted hands-on experience with things you actually run into when working with Linux servers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How multiple containers work together&lt;/li&gt;
&lt;li&gt;How data is stored safely outside containers&lt;/li&gt;
&lt;li&gt;How to work with Docker Compose&lt;/li&gt;
&lt;li&gt;How to use a reverse proxy to manage traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Challenges &amp;amp; fixes&lt;/strong&gt;&lt;br&gt;
Database persistence&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Made sure MariaDB data survives container restarts by using volumes and testing stop/start scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTTPS setup&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTPS works through the Nginx reverse proxy using a self-signed certificate, but browsers still show a warning. Good reminder that self-signed certificates are fine for testing, but not ideal for production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Redis configuration&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tried adding Redis for Nextcloud, but stopped when the configuration became unclear. Decided to skip it for now instead of adding something I didn’t fully understand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb32ygx7r6ebdeazragmq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb32ygx7r6ebdeazragmq.PNG" alt="nextcloud setup" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to structure a Docker Compose file for a multi-service setup&lt;/li&gt;
&lt;li&gt;How Nextcloud depends on external services like databases&lt;/li&gt;
&lt;li&gt;How Docker volumes work and why they’re important&lt;/li&gt;
&lt;li&gt;How to set up a basic reverse proxy with Nginx&lt;/li&gt;
&lt;li&gt;The difference between “HTTPS enabled” and “trusted HTTPS”&lt;/li&gt;
&lt;li&gt;When it's better to pause and understand something instead of forcing it to work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's next?&lt;/strong&gt;&lt;br&gt;
Possible improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up proper HTTPS with Let's Encrypt&lt;/li&gt;
&lt;li&gt;Adding Redis once I understand how it fits into the setup&lt;/li&gt;
&lt;li&gt;Improving security and configuration cleanup&lt;/li&gt;
&lt;li&gt;Adding basic monitoring or backups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg2xbrfqyd0dnrhsij1mx.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg2xbrfqyd0dnrhsij1mx.PNG" alt="nextcloud front page" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This project was mainly about learning by doing and understanding how a real service is deployed and maintained on a Linux server.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>tooling</category>
      <category>productivity</category>
    </item>
    <item>
      <title>VitaGuard: My First Real-Time Linux System Health Monitor in Bash</title>
      <dc:creator>Danielius Navickas </dc:creator>
      <pubDate>Sat, 10 Jan 2026 16:56:04 +0000</pubDate>
      <link>https://dev.to/navickas/vitaguard-my-first-real-time-linux-system-health-monitor-in-bash-plm</link>
      <guid>https://dev.to/navickas/vitaguard-my-first-real-time-linux-system-health-monitor-in-bash-plm</guid>
      <description>&lt;p&gt;While learning Linux system administration, I wanted a lightweight tool that mirrors what I actually check when supporting or troubleshooting a Linux system. CPU usage, memory, disk space, running processes and whether or not anything critical is showing up in the logs.&lt;/p&gt;

&lt;p&gt;Not something complicated or over-engineered.&lt;br&gt;
Just fast, short and sweet, directly in the terminal.&lt;/p&gt;

&lt;p&gt;So I built VitaGuard, a real-time system health monitor written entirely in Bash.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the script does&lt;/strong&gt;&lt;br&gt;
VitaGuard provides a continuously updating overview of system health:&lt;br&gt;
Resource usage&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU usage with visual progress bars&lt;/li&gt;
&lt;li&gt;Memory usage (used vs total)&lt;/li&gt;
&lt;li&gt;Disk usage for the root filesystem&lt;/li&gt;
&lt;li&gt;Automatic warnings for high usage thresholds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;System information&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System uptime and load average&lt;/li&gt;
&lt;li&gt;Active network interfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Processes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Top 5 processes by CPU usage&lt;/li&gt;
&lt;li&gt;Clean, readable table output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Logs&lt;/strong&gt;&lt;br&gt;
Scans recent system logs for critical issues&lt;br&gt;
Filters for errors such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kernel issues&lt;/li&gt;
&lt;li&gt;failed services&lt;/li&gt;
&lt;li&gt;OOM events&lt;/li&gt;
&lt;li&gt;Reduces common log noise and limits output to the most recent entries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Services&lt;/strong&gt;&lt;br&gt;
Checks the status of common services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sshd&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this runs in an auto refreshing loop, updating every 5 seconds until you exit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I built it&lt;/strong&gt;&lt;br&gt;
I built VitaGuard to practice Linux administration fundamentals, not just scripting syntax.&lt;/p&gt;

&lt;p&gt;Things I specifically wanted to work on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turning raw system metrics into a readable output&lt;/li&gt;
&lt;li&gt;Building visual progress bars and color-based alerts&lt;/li&gt;
&lt;li&gt;Filtering noisy logs to surface useful signals&lt;/li&gt;
&lt;li&gt;Writing Bash that's structured, readable and most importantly safe&lt;/li&gt;
&lt;li&gt;Creating something practical that can be dropped onto a server and be used immediately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the kind of script I'd want to have available when I SSH into a VPS or troubleshooting a system under load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenges &amp;amp; Fixes&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Colors weren't showing up on the progress bars at first. Fixed it by using &lt;code&gt;printf "%b"&lt;/code&gt; to make the escape codes work.
&lt;/li&gt;
&lt;li&gt;Syslog was dumping a ton of random noise. Added some &lt;code&gt;grep -v&lt;/code&gt; filters to remove junk like "workqueue" and "drm".&lt;/li&gt;
&lt;li&gt;The top processes table looked messy initially. Used &lt;code&gt;awk&lt;/code&gt; with fixed widths to align everything nicely.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I learned&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to pull system info (CPU, memory, disk) from commands like &lt;code&gt;top, free, and df and clean&lt;/code&gt; it up with &lt;code&gt;awk&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Using color codes in the terminal to make warnings stand out (green for good, red for bad).&lt;/li&gt;
&lt;li&gt;Writing Bash scripts that don't break easily, adding checks, handling empty results and keeping it readable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's next&lt;/strong&gt;&lt;br&gt;
Planned improvements for VitaGuard:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configurable refresh interval&lt;/li&gt;
&lt;li&gt;Optional non-interactive / one-shot mode&lt;/li&gt;
&lt;li&gt;Improved compatibility across Linux distributions&lt;/li&gt;
&lt;li&gt;Optional HTML/JS dashboard for remote monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Source code&lt;/strong&gt;&lt;br&gt;
The full script is available on GitHub:&lt;br&gt;


&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/N4V1CKAS" rel="noopener noreferrer"&gt;
        N4V1CKAS
      &lt;/a&gt; / &lt;a href="https://github.com/N4V1CKAS/VitaGuard" rel="noopener noreferrer"&gt;
        VitaGuard
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      VitaGuard is a lightweight Bash-based system health monitor that provides real-time insights into CPU, memory, disk usage, processes, logs, network interfaces and service status on Linux systems.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🛡️ VitaGuard&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Quickly monitor your Linux server's vital signs straight from the terminal&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/N4V1CKAS/VitaGuard/images/vitaguard.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FN4V1CKAS%2FVitaGuard%2Fimages%2Fvitaguard.png" alt="VitaGuard" width="550"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🛠️ Technologies&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Bash scripting&lt;/li&gt;
&lt;li&gt;Core Linux tools: &lt;code&gt;top, free, df, ps, grep, awk, tail&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Real-time updates (refreshes every 5 seconds)&lt;/li&gt;
&lt;li&gt;Color-coded progress bars for CPU, memory, disk&lt;/li&gt;
&lt;li&gt;Uptime and load average&lt;/li&gt;
&lt;li&gt;Top 5 processes by CPU usage (clean table)&lt;/li&gt;
&lt;li&gt;Recent critical errors from syslog (filtered, max 3 lines)&lt;/li&gt;
&lt;li&gt;Awesome ASCII art header&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💡 Why I built it&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;This script was created to practice my Linux administration and Bash scripting skills:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creating visual progress bars and color alerts&lt;/li&gt;
&lt;li&gt;Filtering log noise for useful error reporting&lt;/li&gt;
&lt;li&gt;Making something truly practical that anyone can pick up and run with ease&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🔍 How it works&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The script runs in an infinite loop that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clears the terminal screen&lt;/li&gt;
&lt;li&gt;Collects system metrics using standard Linux utilities&lt;/li&gt;
&lt;li&gt;Renders color-coded progress bars and warnings&lt;/li&gt;
&lt;li&gt;Displays process, log and service information&lt;/li&gt;
&lt;li&gt;Sleeps for 5…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/N4V1CKAS/VitaGuard" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>tooling</category>
      <category>devops</category>
    </item>
    <item>
      <title>A Practical Bash Log Analyzer for Ubuntu</title>
      <dc:creator>Danielius Navickas </dc:creator>
      <pubDate>Wed, 31 Dec 2025 22:05:55 +0000</pubDate>
      <link>https://dev.to/navickas/a-practical-bash-log-analyzer-for-ubuntu-442g</link>
      <guid>https://dev.to/navickas/a-practical-bash-log-analyzer-for-ubuntu-442g</guid>
      <description>&lt;p&gt;While learning Linux server administration, I wanted a practical tool that mirrors common day to day Linux support and admin tasks, quickly checking logs, spotting issues and extracting useful patterns, all without over-engineering it.&lt;/p&gt;

&lt;p&gt;So I built a menu driven Bash log analyzer for Ubuntu systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the script does&lt;/strong&gt;&lt;br&gt;
The script analyzes common Linux logs:&lt;br&gt;
System logs (/var/log/syslog)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show recent entries&lt;/li&gt;
&lt;li&gt;Highlight errors and warnings&lt;/li&gt;
&lt;li&gt;Display most frequently repeated messages&lt;/li&gt;
&lt;li&gt;Supports rotated logs automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Authentication logs (/var/log/auth.log)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recent failed login attempts&lt;/li&gt;
&lt;li&gt;Most common invalid usernames&lt;/li&gt;
&lt;li&gt;Top IPs responsible for failed logins&lt;/li&gt;
&lt;li&gt;Works across compressed (.gz) log files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nginx logs&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recent access and error entries&lt;/li&gt;
&lt;li&gt;Top IPs accessing the server&lt;/li&gt;
&lt;li&gt;Checks if Nginx log files exist before analyzing them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Custom log paths&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyze any log file provided by the user&lt;/li&gt;
&lt;li&gt;Filter for errors and warnings safely&lt;/li&gt;
&lt;li&gt;All checks include basic validation to avoid crashes or noisy output.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why I built it&lt;/strong&gt;&lt;br&gt;
This project helped me practice real admin fundamentals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reading and understanding Linux log formats&lt;/li&gt;
&lt;li&gt;Using core tools effectively (grep, zgrep, awk, sort, uniq, tail)&lt;/li&gt;
&lt;li&gt;Handling rotated and compressed logs&lt;/li&gt;
&lt;li&gt;Writing safer and better Bash scripts (file checks, handling empty results, strict mode)&lt;/li&gt;
&lt;li&gt;Structuring scripts for clarity and reuse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Challenges &amp;amp; fixes&lt;/strong&gt;&lt;br&gt;
A few issues I ran into and solved:&lt;br&gt;
Rotated logs not being read&lt;br&gt;
Switched to zcat -f and zgrep to seamlessly handle .log and .log.gz files.&lt;/p&gt;

&lt;p&gt;"Binary file matches" errors&lt;br&gt;
Fixed with -a flags to treat logs as text consistently.&lt;/p&gt;

&lt;p&gt;Empty or misleading output&lt;br&gt;
Captured results into variables and checked for empty output before printing.&lt;/p&gt;

&lt;p&gt;Messy output&lt;br&gt;
Iterated on filtering and sorting so results are readable and actionable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bash doesn't need to be complex to be effective&lt;/li&gt;
&lt;li&gt;A lot of scripts are small, focused and iterative&lt;/li&gt;
&lt;li&gt;Clear output and safe handling matter more than fancy one-line code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's next&lt;/strong&gt;&lt;br&gt;
Planned improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smarter error/warning filtering and sorting to show the most relevant messages first&lt;/li&gt;
&lt;li&gt;Optional export to a text file&lt;/li&gt;
&lt;li&gt;Show basic log rotation or size info&lt;/li&gt;
&lt;li&gt;Loop back to the menu instead of exiting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The full script is here on my Github:&lt;/strong&gt;&lt;br&gt;


&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/N4V1CKAS" rel="noopener noreferrer"&gt;
        N4V1CKAS
      &lt;/a&gt; / &lt;a href="https://github.com/N4V1CKAS/log-analyzer" rel="noopener noreferrer"&gt;
        log-analyzer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Menu-driven script to filter errors on system, auth, Nginx or custom logs on Ubuntu.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;📜 Log Analyzer&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Quickly inspect system, authentication, Nginx or custom logs from a single interactive menu&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🛠️ Technologies&lt;/h1&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Bash scripting&lt;/li&gt;
&lt;li&gt;Core Linux tools: &lt;code&gt;grep, zgrep, awk, sort, uniq, tail, zcat&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🚀 Features&lt;/h1&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Analyzes common Ubuntu logs&lt;/li&gt;
&lt;li&gt;Analyzes any custom log file path&lt;/li&gt;
&lt;li&gt;Handles compressed logs (.gz) automatically&lt;/li&gt;
&lt;li&gt;Highlights errors, warnings and failed login attempts&lt;/li&gt;
&lt;li&gt;Shows top repeated log messages for quick insight&lt;/li&gt;
&lt;li&gt;User-friendly interactive menu&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;💡 Why I built it&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;This script was mainly created to practice Linux admin and bash scripting skills:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigating log formats and rotated logs&lt;/li&gt;
&lt;li&gt;Filtering and highlighting important log messages&lt;/li&gt;
&lt;li&gt;Writing safer Bash scripts with strict mode, file checks and handling empty results&lt;/li&gt;
&lt;li&gt;Creating a reusable, menu-driven tool&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🔍 How it works&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;The script prints a menu to select which log to analyze, each option prints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Last few lines of the log&lt;/li&gt;
&lt;li&gt;Recent errors and warnings&lt;/li&gt;
&lt;li&gt;Top repeated messages or most relevant stats (failed logins…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/N4V1CKAS/log-analyzer" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>tooling</category>
      <category>devops</category>
    </item>
    <item>
      <title>The mental checklist I use when troubleshooting Linux servers</title>
      <dc:creator>Danielius Navickas </dc:creator>
      <pubDate>Sat, 20 Dec 2025 19:09:59 +0000</pubDate>
      <link>https://dev.to/navickas/the-mental-checklist-i-use-when-troubleshooting-linux-servers-2g5d</link>
      <guid>https://dev.to/navickas/the-mental-checklist-i-use-when-troubleshooting-linux-servers-2g5d</guid>
      <description>&lt;p&gt;When a Linux server breaks or something doesn't go to plan, I used to panic and jump between several different commands. Over time, I realized almost every issue fits into the same pattern. This is the mental checklist I now fall back on, written down officially.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: What is broken?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service not running?&lt;/li&gt;
&lt;li&gt;Server unreachable?&lt;/li&gt;
&lt;li&gt;Performance issue?&lt;/li&gt;
&lt;li&gt;Permission issue?&lt;/li&gt;
&lt;li&gt;Always define failure first&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Is the system alive?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can I SSH in?&lt;/li&gt;
&lt;li&gt;Is the server responsive?&lt;/li&gt;
&lt;li&gt;Is the disk full?&lt;/li&gt;
&lt;li&gt;Is RAM exhausted?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Is the service running?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the process running?&lt;/li&gt;
&lt;li&gt;Did it fail to start?&lt;/li&gt;
&lt;li&gt;Did it crash?&lt;/li&gt;
&lt;li&gt;This eliminates 50% of issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Check logs&lt;/strong&gt;&lt;br&gt;
Logs usually tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why it failed&lt;/li&gt;
&lt;li&gt;What it tried to do&lt;/li&gt;
&lt;li&gt;What it couldn't access&lt;/li&gt;
&lt;li&gt;Learn to scan logs, not read every line&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 5: What changed last?&lt;/strong&gt;&lt;br&gt;
Most issues come from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updates&lt;/li&gt;
&lt;li&gt;Config edits&lt;/li&gt;
&lt;li&gt;Permission changes&lt;/li&gt;
&lt;li&gt;New files&lt;/li&gt;
&lt;li&gt;Always ask: what changed?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Narrow scope&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is it one user or all users?&lt;/li&gt;
&lt;li&gt;One service or the whole system?&lt;/li&gt;
&lt;li&gt;One port or all networking?&lt;/li&gt;
&lt;li&gt;This prevents panic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 7: Test ONE thing at a time&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make a small change&lt;/li&gt;
&lt;li&gt;Restart service&lt;/li&gt;
&lt;li&gt;Observe&lt;/li&gt;
&lt;li&gt;Never shotgun-fix&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 8: Confirm + document&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is it fixed?&lt;/li&gt;
&lt;li&gt;Why?&lt;/li&gt;
&lt;li&gt;What would I do faster next time?&lt;/li&gt;
&lt;li&gt;That's real troubleshooting&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linux</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Updated Pterodactyl + Wings Installer for Ubuntu - Fixed Version</title>
      <dc:creator>Danielius Navickas </dc:creator>
      <pubDate>Tue, 16 Dec 2025 22:55:48 +0000</pubDate>
      <link>https://dev.to/navickas/updated-pterodactyl-wings-installer-for-ubuntu-fixed-version-2gla</link>
      <guid>https://dev.to/navickas/updated-pterodactyl-wings-installer-for-ubuntu-fixed-version-2gla</guid>
      <description>&lt;p&gt;Hey everyone!&lt;/p&gt;

&lt;p&gt;Recently, I shared a Pterodactyl + Wings installer Bash script for Ubuntu that many of you tried to use. Thanks for all the feedback! It turns out the original version had a few critical issues that prevented it from working properly.&lt;/p&gt;

&lt;p&gt;I've now updated the installer and here’s what's new and fixed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fixes &amp;amp; Improvements&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed handling of Composer installation&lt;/li&gt;
&lt;li&gt;Permissions for .env, storage, bootstrap/cache and vendor directories corrected&lt;/li&gt;
&lt;li&gt;Added missing PHP extensions required by Laravel&lt;/li&gt;
&lt;li&gt;Fully working first-time setup with database, keys, and migrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tested on Ubuntu 24.04&lt;/li&gt;
&lt;li&gt;The script now works reliably from start to finish&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you tried the old version and ran into issues, this should finally work for you. &lt;/p&gt;

&lt;p&gt;You can check out the updated installer on my GitHub here: &lt;br&gt;


&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/N4V1CKAS" rel="noopener noreferrer"&gt;
        N4V1CKAS
      &lt;/a&gt; / &lt;a href="https://github.com/N4V1CKAS/pterodactyl-wings-installer" rel="noopener noreferrer"&gt;
        pterodactyl-wings-installer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An Interactive Bash script to automate Pterodactyl Panel and Wings installation on Ubuntu
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🐉 Pterodactyl + Wings Easy Installer&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An interactive Bash script to automate the installation of Pterodactyl Panel and Wings daemon on Ubuntu, saving hours of manual setup.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🛠️ Technologies&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Bash scripting&lt;/li&gt;
&lt;li&gt;Core Linux tools and package managers &lt;code&gt;apt, curl, systemd&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Interactive menu to choose Panel or Wings installation&lt;/li&gt;
&lt;li&gt;Automatic dependency installation&lt;/li&gt;
&lt;li&gt;MariaDB database setup (Panel)&lt;/li&gt;
&lt;li&gt;Pterodactyl Panel configuration, crontab and queue workers&lt;/li&gt;
&lt;li&gt;Safe checks and user prompts throughout&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💡 Why I built it&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;This was my first deep dive into Bash scripting and a practical way to automate a real-world server task I repeat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Learning how Bash works in real server setups&lt;/li&gt;
&lt;li&gt;Building an interactive menu that's easy to follow&lt;/li&gt;
&lt;li&gt;Installing dependencies and configuring services step by step&lt;/li&gt;
&lt;li&gt;Testing everything on fresh VMs to fix issues as they came up&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;
⚠️ Requirements &amp;amp; Notes&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu Server 24.04 (tested, may work on earlier versions)&lt;/li&gt;
&lt;li&gt;Fresh VM/VPS recommended&lt;/li&gt;
&lt;li&gt;User with…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/N4V1CKAS/pterodactyl-wings-installer" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>tooling</category>
      <category>devops</category>
    </item>
    <item>
      <title>How I Automated Pterodactyl + Wings Installation with a Bash Script</title>
      <dc:creator>Danielius Navickas </dc:creator>
      <pubDate>Sun, 14 Dec 2025 20:34:32 +0000</pubDate>
      <link>https://dev.to/navickas/how-i-automated-pterodactyl-wings-installation-with-a-bash-script-3e6n</link>
      <guid>https://dev.to/navickas/how-i-automated-pterodactyl-wings-installation-with-a-bash-script-3e6n</guid>
      <description>&lt;p&gt;I've always enjoyed hosting game servers and coding, but after setting up Pterodactyl and Wings a few days ago, I decided it was the perfect opportunity to dive into some Bash scripting. My goal was simple: automate a setup process that normally takes a lot of time and make it faster and way more efficient for myself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the Script Does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menu System: Choose between installing Pterodactyl or Wings.&lt;/li&gt;
&lt;li&gt;Pterodactyl: Sets up domain, admin email, database, user; installs dependencies, runs migrations, and configures crontab and queue workers.&lt;/li&gt;
&lt;li&gt;Wings: Downloads the correct binary, creates configuration directories, and sets up Wings as a service for automatic management.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Challenges &amp;amp; Fixes&lt;/strong&gt;&lt;br&gt;
Database Configuration:&lt;br&gt;
Problem: MariaDB rejected credentials for the pterodactyl user.&lt;br&gt;
Fix: Adjusted MariaDB user creation to allow access from both localhost and 127.0.0.1, ensuring proper database access.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE USER IF NOT EXISTS \`$DB_USER\`@'127.0.0.1' IDENTIFIED BY '$DB_PASS';
CREATE USER IF NOT EXISTS \`$DB_USER\`@'localhost' IDENTIFIED BY '$DB_PASS';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Crontab Command Issue:&lt;br&gt;
Problem: The crontab entry wasn’t being added due to a typo (-1 instead of -l).&lt;br&gt;
Fix: Corrected the crontab command to add the cron job correctly, ensuring tasks run on schedule.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(crontab -l 2&amp;gt;/dev/null; echo "* * * * * php /var/www/pterodactyl/artisan schedule:run &amp;gt;&amp;gt; /dev/null 2&amp;gt;&amp;amp;1") | crontab -

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Syntax Errors:&lt;br&gt;
Problem: Common script syntax issues such as missing spaces after [[, semicolons, and incorrect if statements led to failure.&lt;br&gt;
Fix: Fixed the syntax issues, including default values for timezones and ensuring the if statements are properly formatted.&lt;/p&gt;

&lt;p&gt;Redundant Code Cleanup:&lt;br&gt;
Problem: The queue worker setup was duplicated, leading to unnecessary complexity.&lt;br&gt;
Fix: Cleaned up the code to improve readability, removing redundancies and streamlining the setup process.&lt;/p&gt;

&lt;p&gt;Missing sudo Permissions:&lt;br&gt;
Problem: Several commands were missing sudo, which caused failures due to insufficient privileges.&lt;br&gt;
Fix: Added sudo to the necessary commands to ensure smooth execution of the script.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Message &amp;amp; Next Steps&lt;/strong&gt;&lt;br&gt;
Once the installation is complete, the script provides instructions for the final Wings setup.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if [[ $choice == "2" ]]; then
    echo
    echo " Next steps are as follows for the final Wings setup:"
    echo " 1. Log into your Pterodactyl Panel."
    echo " 2. Head over to admin, into nodes and create new node."
    echo " 3. Scroll down and download the generated config.yml"
    echo " 4. Place it at: /etc/pterodactyl/config.yml"
    echo
    echo " Once you're all done, start wings with:"
    echo " sudo systemctl restart wings"
    echo " or run it in debug mode if you wish:"
    echo " sudo wings --debug"
    echo
    echo " Wings will NOT start until the config.yml file is in place!!"
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This script ended up being my first real deep dive into Bash scripting and server automation. What would normally take hours to manually set up, installing Pterodactyl and Wings, is now pretty much fully automated, saving me time and removing a lot of the same old repetitive work.&lt;/p&gt;

&lt;p&gt;This was literally my first Bash script. Before this, I had never worked with Bash, my only real coding experience was HTML, CSS, JavaScript and Lua. I did use AI for a small part, a random password generator and an initial menu structure, but everything else came from reading the official documentation, testing on a fresh VM and fixing errors as they came up.&lt;/p&gt;

&lt;p&gt;Fixing issues like permissions and database configuration while learning how Bash actually behaves in real scenarios was both very rewarding and at times incredibly frustrating. It made it clear to me just how powerful scripting can be when it comes to removing unnecessary "boring" work.&lt;/p&gt;

&lt;p&gt;You can check out the full script on my Github:&lt;br&gt;


&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/N4V1CKAS" rel="noopener noreferrer"&gt;
        N4V1CKAS
      &lt;/a&gt; / &lt;a href="https://github.com/N4V1CKAS/pterodactyl-wings-installer" rel="noopener noreferrer"&gt;
        pterodactyl-wings-installer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An Interactive Bash script to automate Pterodactyl Panel and Wings installation on Ubuntu
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🐉 Pterodactyl + Wings Easy Installer&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;An interactive Bash script to automate the installation of Pterodactyl Panel and Wings daemon on Ubuntu, saving hours of manual setup.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🛠️ Technologies&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Bash scripting&lt;/li&gt;
&lt;li&gt;Core Linux tools and package managers &lt;code&gt;apt, curl, systemd&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Features&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Interactive menu to choose Panel or Wings installation&lt;/li&gt;
&lt;li&gt;Automatic dependency installation&lt;/li&gt;
&lt;li&gt;MariaDB database setup (Panel)&lt;/li&gt;
&lt;li&gt;Pterodactyl Panel configuration, crontab and queue workers&lt;/li&gt;
&lt;li&gt;Safe checks and user prompts throughout&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💡 Why I built it&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;This was my first deep dive into Bash scripting and a practical way to automate a real-world server task I repeat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning how Bash works in real server setups&lt;/li&gt;
&lt;li&gt;Building an interactive menu that's easy to follow&lt;/li&gt;
&lt;li&gt;Installing dependencies and configuring services step by step&lt;/li&gt;
&lt;li&gt;Testing everything on fresh VMs to fix issues as they came up&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;
⚠️ Requirements &amp;amp; Notes&lt;/h2&gt;

&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt;Ubuntu Server 24.04 (tested, may work on earlier versions)&lt;/li&gt;

&lt;li&gt;Fresh VM/VPS recommended&lt;/li&gt;

&lt;li&gt;User with…&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/N4V1CKAS/pterodactyl-wings-installer" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>tooling</category>
      <category>devops</category>
    </item>
    <item>
      <title>Setting up Pterodactyl panel + Wings on Ubuntu Server 24.04, Struggles &amp; Fixes</title>
      <dc:creator>Danielius Navickas </dc:creator>
      <pubDate>Mon, 08 Dec 2025 20:40:50 +0000</pubDate>
      <link>https://dev.to/navickas/setting-up-pterodactyl-panel-wings-on-ubuntu-2404-struggles-fixes-3n7c</link>
      <guid>https://dev.to/navickas/setting-up-pterodactyl-panel-wings-on-ubuntu-2404-struggles-fixes-3n7c</guid>
      <description>&lt;p&gt;I've always been into solving stuff and just in general always problem solving, so I decided to set up a Pterodactyl Panel and Wings on two separate Ubuntu Server VMs to manage game servers. Here's my process, the issues I hit and how I fixed them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing the Pterodactyl Panel&lt;/strong&gt;&lt;br&gt;
I started by setting up the Pterodactyl panel on the first VM. The installation guide was mostly helpful, but I ran into issues with incompatible PHP versions and missing extensions. I fixed this by Installing PHP 8.3, adding the ondrej/php PPA, and manually installing the required extensions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting Up Nginx&lt;/strong&gt;&lt;br&gt;
After PHP was sorted, I moved on to configuring Nginx. This involved setting up a server block for SSL and adding proxy headers. I also Adjusted Nginx settings to handle CORS and SSL issues, ensuring proper communication with Wings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wings Installation&lt;/strong&gt;&lt;br&gt;
On the second VM, I installed Wings to handle game server instances. The panel couldn't communicate with Wings at first due to SSL and token issues. I solved this by changing the Panel URL, added the token in the Wings config and setting up Nginx headers properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Networking Between VMs&lt;/strong&gt;&lt;br&gt;
I got a 502 Bad Gateway error due to networking/firewall issues between the VMs. I solved this by opening ports 443 &amp;amp; 8080 in the firewall and switching Docker's networking mode to bridged for better and easier connectivity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Containers Not Showing in Docker&lt;/strong&gt;&lt;br&gt;
After running docker ps, no containers showed up, despite them being created. I quickly fixed this by Adding my user to the Docker group and rebooting the system, which resolved the issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Outcome&lt;/strong&gt;&lt;br&gt;
Panel: Running smoothly&lt;br&gt;
Wings: Successfully connected&lt;br&gt;
Game Servers: I can create and start various game servers in under 30 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;br&gt;
Networking: Proper firewall rules and network modes between VMs are crucial.&lt;br&gt;
Docker Management: Handling permissions saved a ton of time.&lt;br&gt;
Debugging: The --debug flag on Wings helped me find issues quickly.&lt;br&gt;
Tutorials Aren’t Enough: I had to customize beyond the guide to get everything working properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;br&gt;
Setting up Pterodactyl and Wings was a challenge, but I learned a lot about system administration and Docker management. If you've run into similar issues, or have some tips and tricks to share, hit me up! Always down to learn more.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Installing Paper Minecraft on Ubuntu Server 24.04: Issues I Ran Into &amp; How I Fixed Them</title>
      <dc:creator>Danielius Navickas </dc:creator>
      <pubDate>Sun, 07 Dec 2025 22:54:48 +0000</pubDate>
      <link>https://dev.to/navickas/installing-paper-minecraft-on-ubuntu-2404-issues-i-ran-into-how-i-fixed-them-2ik9</link>
      <guid>https://dev.to/navickas/installing-paper-minecraft-on-ubuntu-2404-issues-i-ran-into-how-i-fixed-them-2ik9</guid>
      <description>&lt;p&gt;I've been hosting game servers for years, but I recently decided to take a deeper dive into Linux server administration to strengthen my skills and prepare for IT roles professionally. This post documents my journey setting up a Paper Minecraft server on a Ubuntu Server 24.04, including the challenges I ran into and how I solved them. My goal is to share practical troubleshooting tips while building a portfolio of practical Linux experience.&lt;/p&gt;

&lt;p&gt;Along the way, I ran into a few unexpected issues. In this post, I'll share what went wrong and how I fixed it, so anyone trying this themselves can save time and frustration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Installing Java for Paper&lt;/strong&gt;&lt;br&gt;
I started by setting up Ubuntu Server 24.04 in a VM.&lt;br&gt;
Initially, I installed Java 17, but when I tried to launch Paper, I got: UnsupportedClassVersionError&lt;/p&gt;

&lt;p&gt;Fix: Installed Java 21 (the current supported version for Paper).&lt;/p&gt;

&lt;p&gt;Lesson: Always check the Minecraft server's Java requirements before starting. Installing the wrong version can break your server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Dealing with the Keyboard Layout&lt;/strong&gt;&lt;br&gt;
On my VM, I ran into a weird problem: backslashes and some characters didn't work, which messed up my command-line usage.&lt;/p&gt;

&lt;p&gt;Fix: Switched the VM keyboard layout to Swedish, matching my physical keyboard.&lt;/p&gt;

&lt;p&gt;Tip: This is a common issue when working in virtual machines with non-US keyboards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Downloading the Paper Server JAR&lt;/strong&gt;&lt;br&gt;
At first, I tried using wget, but the jar kept getting corrupted during the download.&lt;/p&gt;

&lt;p&gt;Fix: Switched to curl with -L -o paper.jar , which downloaded the file quickly and more reliably.&lt;/p&gt;

&lt;p&gt;Tip: Some servers redirect URLs, which wget may not handle properly. curl -L automatically follows redirects for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Networking &amp;amp; SSH&lt;/strong&gt;&lt;br&gt;
Using a NAT network adapter in the VM blocked my SSH connection.&lt;/p&gt;

&lt;p&gt;Fix: Switched to a Bridged Adapter, which put the VM on the same network as my host machine, allowing SSH access.&lt;/p&gt;

&lt;p&gt;Tip: Networking issues are common in virtual machines, bridging or port forwarding usually solves them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Running the Server&lt;/strong&gt;&lt;br&gt;
Once the above issues were resolved, I could finally run Paper using screen and Aikar’s JVM flags (as in my cheat-sheet on my first post).&lt;br&gt;
Server started successfully, TPS stable, and logs clean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lessons learned from all of this&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VM settings matter: Keyboard layouts and networking can break things quickly.&lt;/li&gt;
&lt;li&gt;Always check Java version requirements: Paper will not run on unsupported versions.&lt;/li&gt;
&lt;li&gt;Know your download tools: curl is usually more reliable for redirected downloads.&lt;/li&gt;
&lt;li&gt;Document troubleshooting: Keeping notes makes future setups much easier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm sharing this as part of my journey into Linux and server administration. If you're learning to run Minecraft servers on Ubuntu, I hope this post saves you some painful headaches!&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>beginners</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Ubuntu 24.04 Cheat-Sheet for MC-Server Support (Everything I Use)</title>
      <dc:creator>Danielius Navickas </dc:creator>
      <pubDate>Sun, 07 Dec 2025 22:09:37 +0000</pubDate>
      <link>https://dev.to/navickas/ubuntu-2404-cheat-sheet-for-mc-server-support-everything-i-use-4ied</link>
      <guid>https://dev.to/navickas/ubuntu-2404-cheat-sheet-for-mc-server-support-everything-i-use-4ied</guid>
      <description>&lt;p&gt;I've been hosting and setting up game servers since I was around 13 years old. Recently, I decided it was time to properly take a deep dive into Linux, specifically Ubuntu servers, since this is something I'm genuinely interested in and want to work with professionally.&lt;/p&gt;

&lt;p&gt;I set up Ubuntu Server 24.04 in a virtual machine and started building everything from scratch. Along the way, I found myself constantly forgetting certain commands, especially the ones I use most often for Minecraft server hosting and general troubleshooting.&lt;/p&gt;

&lt;p&gt;So I created this personal cheat sheet. It's mainly focused on Ubuntu servers running Minecraft, but I also use it as a general Linux refresher. Hopefully, it can help others as well.&lt;/p&gt;

&lt;h1&gt;
  
  
  Ubuntu / Minecraft Server Cheat-Sheet
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Term explanation&lt;/strong&gt;&lt;br&gt;
vim     - terminal text editor&lt;br&gt;
curl    - tool to download files from the internet&lt;br&gt;
screen  - keeps a program running in a detachable terminal session&lt;br&gt;
tail    - displays file output in real time&lt;br&gt;
ssh     - log into a remote machine securely  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Navigation &amp;amp; files&lt;/strong&gt;&lt;br&gt;
ls -la              - list all files including hidden (with permissions)&lt;br&gt;
cd /                - go to root directory&lt;br&gt;
cd ..               - go up one folder&lt;br&gt;
cd ~/mcserver       - go to Minecraft server folder&lt;br&gt;
pwd                 - show current directory&lt;br&gt;
cat file.txt        - display file contents&lt;br&gt;
rm -f paper.jar     - delete file forcefully&lt;br&gt;
nano filename       - edit file (Ctrl+O save, Ctrl+X exit)&lt;br&gt;
ip a                - show IP addresses (Windows ipconfig equivalent)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screen commands&lt;/strong&gt;&lt;br&gt;
screen -S name            - create and enter a new screen session&lt;br&gt;
screen -ls                - list active screen sessions&lt;br&gt;
screen -r name            - reattach to a session&lt;br&gt;
screen -r 1234.mc         - reattach using PID&lt;br&gt;
Ctrl + A then D           - detach without stopping the server&lt;br&gt;
screen -X -S 1234.mc quit - kill a specific session&lt;br&gt;
screen -wipe              - clean up dead sessions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSH commands&lt;/strong&gt;&lt;br&gt;
ssh user@ip                              - connect via SSH&lt;br&gt;
ssh -p 2222 user@ip                      - connect using custom port&lt;br&gt;
ssh-copy-id user@ip                      - enable passwordless SSH login&lt;br&gt;
exit                                     - disconnect from SSH&lt;br&gt;
scp paper.jar user@ip:~/mcserver/        - upload file to server&lt;br&gt;
scp user@ip:~/mcserver/logs/latest.log   - download file&lt;br&gt;
sudo systemctl status ssh                - check SSH status&lt;br&gt;
sudo systemctl start ssh                 - start SSH service&lt;br&gt;
sudo ufw allow ssh                       - allow SSH through firewall&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RAM / CPU&lt;/strong&gt;&lt;br&gt;
free -h   - show RAM usage&lt;br&gt;
htop      - live CPU &amp;amp; memory usage&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Downloading files&lt;/strong&gt;&lt;br&gt;
curl -L -o filename URL - command&lt;br&gt;
-L   - follow redirects&lt;br&gt;
-o   - output file name&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vim basics&lt;/strong&gt;&lt;br&gt;
vim file.txt     - open file&lt;br&gt;
i                - insert mode&lt;br&gt;
Esc :wq          - save &amp;amp; quit&lt;br&gt;
Esc :q!          - quit without saving&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tail log stuff&lt;/strong&gt; &lt;br&gt;
tail -f logs/latest.log             - live console (Ctrl+C = stop)&lt;br&gt;
tail -f /var/log/syslog             - show system messages&lt;br&gt;
tail -f /var/log/auth.log       - show who logged in&lt;br&gt;
tail -f plugins/*/debug.log     - show plugin debug&lt;br&gt;
tail -f logs/latest.log | grep ERROR    - show only errors&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MC start one liner&lt;/strong&gt;&lt;br&gt;
screen -S mc &amp;amp;&amp;amp; java -Xmx6G -Xms6G -jar paper.jar --nogui&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are Aikar's flags?&lt;/strong&gt;&lt;br&gt;
A set of JVM arguments that optimize Java’s garbage collector for Minecraft servers.&lt;br&gt;
Without them: lag spikes &amp;amp; crashes.&lt;br&gt;
With them: much smoother performance and stable TPS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starting the MC server with Aikar's flags&lt;/strong&gt;&lt;br&gt;
java -Xmx6G -Xms6G \&lt;br&gt;
-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 \&lt;br&gt;
-XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC \&lt;br&gt;
-XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M \&lt;br&gt;
-XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 \&lt;br&gt;
-XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 \&lt;br&gt;
-XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 \&lt;br&gt;
-XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 \&lt;br&gt;
-jar paper.jar --nogui&lt;/p&gt;

&lt;p&gt;I'm currently documenting my Linux and game server hosting learning publicly while working toward junior hosting &amp;amp; support roles. If this cheat sheet helped you, feel free to comment or reach out!&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>beginners</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
