<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://voxihost.pl/" xml:lang="en">
  <title>Knowledge Base | VoxiHost</title>
  <subtitle>Master your infrastructure with professional server management tutorials, industry news, and step-by-step guides from the VoxiHost team.</subtitle>
  <link href="https://voxihost.pl/blog/feed.xml" rel="self"/>
  <link href="https://voxihost.pl/blog/" rel="alternate"/>
  <updated>2026-04-10T00:00:00Z</updated>
  <id>https://voxihost.pl/blog/</id>
  <rights>© 2026 VoxiHost. All rights reserved.</rights>
  <generator uri="https://www.11ty.dev/" version="3.1.2">Eleventy</generator>
  <icon>https://voxihost.pl/assets/images/favicon-32x32.png</icon>
  <logo>https://voxihost.pl/assets/images/brand/logo-full.png</logo>
  <author>
    <name>VoxiHost</name>
    <uri>https://voxihost.pl</uri>
  </author>
  <entry>
    <title>Now Live: Hourly VPS Hosting - The Ultimate Flexibility for Your Projects</title>
    <link href="https://voxihost.pl/blog/hourly-vps-hosting-launch/" rel="alternate"/>
    <published>2026-04-10T00:00:00Z</published>
    <updated>2026-04-10T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/hourly-vps-hosting-launch/</id>
    <summary type="text">We are launching our new Hourly VPS offer! Discover how hourly billing, rates starting at €0.01/hr, and the special DEPLOYMENT promo code will revolutionize your workflow.</summary>
    <category term="Updates"/>
    <content xml:lang="en" type="html">&lt;p&gt;At &lt;strong&gt;&lt;span&gt;Voxi&lt;/span&gt;&lt;span&gt;Host&lt;/span&gt;&lt;/strong&gt;, we strive to make your infrastructure as dynamic as your ideas. Today, we are taking a massive leap forward by introducing one of our most requested features: &lt;strong&gt;Hourly VPS Hosting&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Whether you need a server for 3 hours of testing or want to run short-term scripts without committing to a monthly subscription, the new Hourly offer is built for you.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/PorSRJGpKo-400.avif 400w, https://voxihost.pl/assets/images/generated/PorSRJGpKo-800.avif 800w, https://voxihost.pl/assets/images/generated/PorSRJGpKo-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/PorSRJGpKo-400.webp 400w, https://voxihost.pl/assets/images/generated/PorSRJGpKo-800.webp 800w, https://voxihost.pl/assets/images/generated/PorSRJGpKo-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/PorSRJGpKo-400.jpeg&quot; alt=&quot;The new billing cycle toggle in the VoxiHost dashboard allowing users to switch between Monthly and Hourly payments&quot; width=&quot;1600&quot; height=&quot;649&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/PorSRJGpKo-400.jpeg 400w, https://voxihost.pl/assets/images/generated/PorSRJGpKo-800.jpeg 800w, https://voxihost.pl/assets/images/generated/PorSRJGpKo-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-choose-hourly-vps&quot;&gt;Why Choose Hourly VPS? &lt;/h2&gt;
&lt;p&gt;The Hourly system isn&#39;t just a different way to pay, it&#39;s a total shift in how you manage your resources.&lt;/p&gt;
&lt;h3 id=&quot;1-pay-only-for-what-you-use&quot;&gt;1. Pay Only for What You Use &lt;/h3&gt;
&lt;p&gt;No more paying for unused time. If your compute needs only last a few hours a week, the Hourly model will save you real money. Prices start as low as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;€0.01 / hour&lt;/strong&gt; on the &lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt; plan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;€0.02 / hour&lt;/strong&gt; on the &lt;a href=&quot;https://voxihost.pl/premium-vps/&quot;&gt;Premium VPS&lt;/a&gt; plan&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-full-flexibility-of-choice&quot;&gt;2. Full Flexibility of Choice &lt;/h3&gt;
&lt;p&gt;We don&#39;t compromise on quality. Hourly billing is available for both our &lt;a href=&quot;https://voxihost.pl/premium-vps/&quot;&gt;Premium VPS&lt;/a&gt; and &lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt; base models.&lt;/p&gt;
&lt;p&gt;For full transparency, here is how we calculate the hourly rate based on your selected resources:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Element&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://voxihost.pl/premium-vps/&quot;&gt;Premium VPS&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Base (minimum)&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;€0.01/hr&lt;/strong&gt; (2 vCPU, 2 GB RAM, 10 GB SSD)&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;€0.02/hr&lt;/strong&gt; (1 vCPU, 2 GB RAM, 10 GB SSD)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;CPU Upgrade&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;+€0.0023/hr (per +2 vCores)&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;+€0.01/hr (per +1 vCore)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;RAM Upgrade&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;+€0.0023/hr (per +2 GB)&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;+€0.0046/hr (per +2 GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Disk Upgrade&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;+€0.0023/hr (per +10 GB)&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;+€0.0023/hr (per +10 GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;how-is-the-price-calculated&quot;&gt;How is the Price Calculated? &lt;/h3&gt;
&lt;p&gt;The system is simple and transparent. Every server has a &lt;strong&gt;Base Configuration&lt;/strong&gt; (starting point) with a fixed price (e.g., €0.01/hr).&lt;/p&gt;
&lt;p&gt;If you need more resources, you simply increase the specific parameter — for instance, every additional 2 GB of RAM adds +€0.0023/hr to your base rate. You decide how much you want to &amp;quot;crank up&amp;quot; your server, and the price updates dynamically with every adjustment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The final total hourly price is calculated by summing up the base price and any additional parameter upgrades. The final result is always rounded to &lt;strong&gt;2 decimal places&lt;/strong&gt; (e.g., €0.03).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Flexibility vs. Cost:&lt;/strong&gt; You can use the Hourly model for long-term projects, but the total monthly cost will be higher than choosing a predefined &lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Monthly Plan&lt;/a&gt;. Specifically, hourly rates are approximately &lt;strong&gt;1.46x&lt;/strong&gt; higher for &lt;strong&gt;Budget&lt;/strong&gt; and &lt;strong&gt;1.77x&lt;/strong&gt; higher for &lt;strong&gt;Premium&lt;/strong&gt; models compared to our fixed monthly packages. You are paying for the absolute freedom to delete or change your instance at any second. For long-term 24/7 projects, our Monthly plans are always the most economical choice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;3-intelligent-server-management&quot;&gt;3. Intelligent Server Management &lt;/h3&gt;
&lt;p&gt;We’ve introduced several features to make life easier for Hourly users:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Self-Destruct Button (Destroy)&lt;/strong&gt;: Want to stop paying immediately? One click and the server is deleted, and billing stops instantly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Price Comparison&lt;/strong&gt;: The dashboard will automatically notify you when it’s more cost-effective to switch to a Monthly plan if your server configuration matches one of the standard monthly tiers &lt;strong&gt;(Which are long-term more cost-effective).&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/NWUMOt1OM5-400.avif 400w, https://voxihost.pl/assets/images/generated/NWUMOt1OM5-800.avif 800w, https://voxihost.pl/assets/images/generated/NWUMOt1OM5-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/NWUMOt1OM5-400.webp 400w, https://voxihost.pl/assets/images/generated/NWUMOt1OM5-800.webp 800w, https://voxihost.pl/assets/images/generated/NWUMOt1OM5-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/NWUMOt1OM5-400.jpeg&quot; alt=&quot;The hourly server management interface showcasing the &#39;Destroy&#39; button to stop billing instantly&quot; width=&quot;1600&quot; height=&quot;631&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/NWUMOt1OM5-400.jpeg 400w, https://voxihost.pl/assets/images/generated/NWUMOt1OM5-800.jpeg 800w, https://voxihost.pl/assets/images/generated/NWUMOt1OM5-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;major-promotion&quot;&gt;Major Promotion &lt;/h2&gt;
&lt;p&gt;To celebrate the launch of our Hourly model and the new server deployment flow, we have a special offer. If you prefer the stability of a monthly plan, we have something to sweeten the deal:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Promo Code: &lt;span&gt;DEPLOYMENT&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Apply it at checkout to receive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-45% Discount&lt;/strong&gt; on any Monthly plan.&lt;/li&gt;
&lt;li&gt;Offer valid until &lt;strong&gt;April 18, 2026&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Note: This code applies exclusively to Monthly billing cycles.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;/h2&gt;
&lt;p&gt;The introduction of Hourly offers is the next stage in building the most developer-friendly hosting platform on the market. We pride ourselves on giving you tools that adapt to you, not the other way around.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ready to get started?&lt;/strong&gt; Head over to the &lt;strong&gt;&lt;a href=&quot;https://dashboard.voxihost.pl/&quot;&gt;Deployment Wizard&lt;/a&gt;&lt;/strong&gt; and spin up your first hourly server today!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>March 2026: VoxiHost DevBlog</title>
    <link href="https://voxihost.pl/blog/march-2026-devblog/" rel="alternate"/>
    <published>2026-04-01T00:00:00Z</published>
    <updated>2026-04-01T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/march-2026-devblog/</id>
    <summary type="text">A major month of updates for VoxiHost! In this DevBlog, we&#39;ve launched the VNC console, added support for 7 brand new Linux distributions, and enabled Google Authentication.</summary>
    <category term="Updates"/>
    <content xml:lang="en" type="html">&lt;p&gt;March has been an incredibly productive month at &lt;strong&gt;&lt;span&gt;Voxi&lt;/span&gt;&lt;span&gt;Host&lt;/span&gt;&lt;/strong&gt;. We’ve been listening to your feedback and working hard to bring features that make managing your cloud infrastructure faster, more secure, and more flexible.&lt;/p&gt;
&lt;p&gt;From low-level server access to a massive expansion of our supported operating systems, here is everything we’ve rolled out over the past few weeks.&lt;/p&gt;
&lt;h2 id=&quot;1-direct-server-access-with-vnc-console&quot;&gt;1. Direct Server Access with VNC Console &lt;/h2&gt;
&lt;p&gt;One of our most requested features is finally live: &lt;strong&gt;VNC Console support&lt;/strong&gt; directly in your dashboard.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Lk2KPZ0jw7-400.avif 400w, https://voxihost.pl/assets/images/generated/Lk2KPZ0jw7-800.avif 800w, https://voxihost.pl/assets/images/generated/Lk2KPZ0jw7-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Lk2KPZ0jw7-400.webp 400w, https://voxihost.pl/assets/images/generated/Lk2KPZ0jw7-800.webp 800w, https://voxihost.pl/assets/images/generated/Lk2KPZ0jw7-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/Lk2KPZ0jw7-400.jpeg&quot; alt=&quot;VoxiHost Dashboard showing the new VNC console integration for remote VPS management&quot; width=&quot;1600&quot; height=&quot;656&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Lk2KPZ0jw7-400.jpeg 400w, https://voxihost.pl/assets/images/generated/Lk2KPZ0jw7-800.jpeg 800w, https://voxihost.pl/assets/images/generated/Lk2KPZ0jw7-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;We know how frustrating it is to be locked out of your server because of a firewall misconfiguration or a broken SSH config. With the new VNC support, you can access your VPS &amp;quot;at the hardware level&amp;quot; through your browser. This means you can troubleshoot boot issues, fix network settings, or manage your server even if SSH is completely unavailable.&lt;/p&gt;
&lt;h2 id=&quot;2-7-new-os-distributions-live-alma-rocky-fedora-centos&quot;&gt;2. 7 New OS Distributions Live (Alma, Rocky, Fedora, CentOS) &lt;/h2&gt;
&lt;p&gt;We believe in giving you the freedom to choose the environment that fits your workflow. This month, we&#39;ve significantly expanded our OS library, adding some of the most stable and modern distributions for enterprise and development work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New additions include:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AlmaLinux 9 &amp;amp; 10&lt;/strong&gt; (The perfect CentOS successor)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rocky Linux 9 &amp;amp; 10&lt;/strong&gt; (Community-driven enterprise Linux)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CentOS Stream 9 &amp;amp; 10&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fedora 43&lt;/strong&gt; (For those who need the absolute latest packages)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/J_jLHBMsQm-400.avif 400w, https://voxihost.pl/assets/images/generated/J_jLHBMsQm-800.avif 800w, https://voxihost.pl/assets/images/generated/J_jLHBMsQm-1080.avif 1080w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/J_jLHBMsQm-400.webp 400w, https://voxihost.pl/assets/images/generated/J_jLHBMsQm-800.webp 800w, https://voxihost.pl/assets/images/generated/J_jLHBMsQm-1080.webp 1080w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/J_jLHBMsQm-400.jpeg&quot; alt=&quot;A selection of new Linux distributions available for one-click install on VoxiHost VPS&quot; width=&quot;1080&quot; height=&quot;465&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/J_jLHBMsQm-400.jpeg 400w, https://voxihost.pl/assets/images/generated/J_jLHBMsQm-800.jpeg 800w, https://voxihost.pl/assets/images/generated/J_jLHBMsQm-1080.jpeg 1080w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;All these distributions are now available for &lt;strong&gt;one-click deployment&lt;/strong&gt; on all our &lt;a href=&quot;https://voxihost.pl/premium-vps/&quot;&gt;Premium&lt;/a&gt; and &lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget&lt;/a&gt; VPS plans.&lt;/p&gt;
&lt;h2 id=&quot;3-seamless-login-with-google-auth&quot;&gt;3. Seamless Login with Google Auth &lt;/h2&gt;
&lt;p&gt;Security and convenience shouldn&#39;t be a trade-off. To make your life easier, we have implemented &lt;strong&gt;Google OAuth support&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/WIGzNZH9Sx-400.avif 400w, https://voxihost.pl/assets/images/generated/WIGzNZH9Sx-800.avif 800w, https://voxihost.pl/assets/images/generated/WIGzNZH9Sx-1196.avif 1196w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/WIGzNZH9Sx-400.webp 400w, https://voxihost.pl/assets/images/generated/WIGzNZH9Sx-800.webp 800w, https://voxihost.pl/assets/images/generated/WIGzNZH9Sx-1196.webp 1196w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/WIGzNZH9Sx-400.jpeg&quot; alt=&quot;Showing google login page redirecting to VoxiHost Dashboard&quot; width=&quot;1196&quot; height=&quot;495&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/WIGzNZH9Sx-400.jpeg 400w, https://voxihost.pl/assets/images/generated/WIGzNZH9Sx-800.jpeg 800w, https://voxihost.pl/assets/images/generated/WIGzNZH9Sx-1196.jpeg 1196w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/L8U-sKYCuj-400.avif 400w, https://voxihost.pl/assets/images/generated/L8U-sKYCuj-619.avif 619w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/L8U-sKYCuj-400.webp 400w, https://voxihost.pl/assets/images/generated/L8U-sKYCuj-619.webp 619w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/L8U-sKYCuj-400.jpeg&quot; alt=&quot;VoxiHost login page showcasing the new &#39;Sign in with Google&#39; feature for faster dashboard access&quot; width=&quot;619&quot; height=&quot;288&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/L8U-sKYCuj-400.jpeg 400w, https://voxihost.pl/assets/images/generated/L8U-sKYCuj-619.jpeg 619w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;You can now link your Google account to VoxiHost and log in with a single click. This not only speeds up your workflow but also allows you to leverage Google’s advanced multi-factor authentication (MFA) to protect your hosting account.&lt;/p&gt;
&lt;h2 id=&quot;4-verified-reviews-via-trustpilot&quot;&gt;4. Verified Reviews via Trustpilot &lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/v7jnQQ39gF-400.avif 400w, https://voxihost.pl/assets/images/generated/v7jnQQ39gF-800.avif 800w, https://voxihost.pl/assets/images/generated/v7jnQQ39gF-1304.avif 1304w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/v7jnQQ39gF-400.webp 400w, https://voxihost.pl/assets/images/generated/v7jnQQ39gF-800.webp 800w, https://voxihost.pl/assets/images/generated/v7jnQQ39gF-1304.webp 1304w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/v7jnQQ39gF-400.jpeg&quot; alt=&quot;VoxiHost reviews section showing Trustpilot integration&quot; width=&quot;1304&quot; height=&quot;584&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/v7jnQQ39gF-400.jpeg 400w, https://voxihost.pl/assets/images/generated/v7jnQQ39gF-800.jpeg 800w, https://voxihost.pl/assets/images/generated/v7jnQQ39gF-1304.jpeg 1304w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Transparency is one of our core values. We’ve redesigned our reviews section and integrated it directly with &lt;strong&gt;Trustpilot&lt;/strong&gt;. You can now see verified feedback from our users with direct links to the original reviews.&lt;/p&gt;
&lt;p&gt;We want you to know exactly what to expect from our hardware and support before you even spend a penny.&lt;/p&gt;
&lt;h2 id=&quot;5-improving-the-platform-experience&quot;&gt;5. Improving the Platform Experience &lt;/h2&gt;
&lt;p&gt;Beyond the big features, we’ve made dozens of small improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New Blog Platform:&lt;/strong&gt; You are looking at it! We launched our blog to bring you more high-quality Linux tutorials and news.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Promotion System:&lt;/strong&gt; A new smart banner on the homepage will now always show you the best current discounts available.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bug Fixes:&lt;/strong&gt; We resolved an issue on the Contact page where special characters were being incorrectly rendered.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What&#39;s Next? &lt;/h2&gt;
&lt;p&gt;March was huge, but we aren&#39;t stopping there. We are already working on several networking upgrades and more automated tools for your dashboard.&lt;/p&gt;
&lt;p&gt;Stay tuned for more updates, and as always, thank you for choosing &lt;strong&gt;&lt;span&gt;Voxi&lt;/span&gt;&lt;span&gt;Host&lt;/span&gt;&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ready to try the new VNC console?&lt;/strong&gt; Log in to your &lt;strong&gt;&lt;a href=&quot;https://dashboard.voxihost.pl/&quot;&gt;Dashboard&lt;/a&gt;&lt;/strong&gt; and check out your active instances today!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Update Fedora 43 &amp; Newer: The Complete Server Guide</title>
    <link href="https://voxihost.pl/blog/how-to-update-fedora/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-update-fedora/</id>
    <summary type="text">A complete step-by-step guide to updating Fedora 43 and newer servers using dnf5. Covers dnf5 upgrade, autoremove, reboot detection, and automatic updates for production VPS environments.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;Fedora moves fast. It&#39;s the distro that ships what RHEL will be running in two years, which means you get bleeding-edge kernels, newer toolchains, and packages that are actually current. The tradeoff is you need to stay on top of updates more actively than you would on a long-term-support distro.&lt;/p&gt;
&lt;p&gt;Starting with &lt;strong&gt;Fedora 41&lt;/strong&gt;, the default package manager switched to &lt;strong&gt;dnf5&lt;/strong&gt;, a full rewrite of &lt;code&gt;dnf&lt;/code&gt; that&#39;s faster, uses less memory, and has a cleaner API. If you&#39;re on Fedora 43, you&#39;re using dnf5. The command is &lt;code&gt;dnf5&lt;/code&gt;, though &lt;code&gt;dnf&lt;/code&gt; still works as an alias pointing to the same binary.&lt;/p&gt;
&lt;p&gt;Before we start: if you are deploying a fresh server with a premium provider like &lt;strong&gt;&lt;span&gt;Voxi&lt;/span&gt;&lt;span&gt;Host&lt;/span&gt;&lt;/strong&gt;, the system automatically runs a full package update immediately after deployment on first boot. But as your server runs over time, you will still need to know how to maintain it yourself.&lt;/p&gt;
&lt;h2 id=&quot;the-basics-dnf5-upgrade&quot;&gt;The basics: dnf5 upgrade &lt;/h2&gt;
&lt;p&gt;To update a Fedora 43 server, you run:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/OlX2FezJd1-400.avif 400w, https://voxihost.pl/assets/images/generated/OlX2FezJd1-800.avif 800w, https://voxihost.pl/assets/images/generated/OlX2FezJd1-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/OlX2FezJd1-400.webp 400w, https://voxihost.pl/assets/images/generated/OlX2FezJd1-800.webp 800w, https://voxihost.pl/assets/images/generated/OlX2FezJd1-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/OlX2FezJd1-400.jpeg&quot; alt=&quot;Running sudo dnf5 upgrade on Fedora 43 - terminal output showing packages being updated&quot; width=&quot;1600&quot; height=&quot;557&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/OlX2FezJd1-400.jpeg 400w, https://voxihost.pl/assets/images/generated/OlX2FezJd1-800.jpeg 800w, https://voxihost.pl/assets/images/generated/OlX2FezJd1-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf5 upgrade -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This checks for available updates, downloads them, and installs them in one pass. The &lt;strong&gt;&lt;code&gt;-y&lt;/code&gt; flag skips the confirmation&lt;/strong&gt;. That&#39;s it for routine updates.&lt;/p&gt;
&lt;p&gt;If you want to see what would change before committing:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/U77pLr_MfR-400.avif 400w, https://voxihost.pl/assets/images/generated/U77pLr_MfR-800.avif 800w, https://voxihost.pl/assets/images/generated/U77pLr_MfR-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/U77pLr_MfR-400.webp 400w, https://voxihost.pl/assets/images/generated/U77pLr_MfR-800.webp 800w, https://voxihost.pl/assets/images/generated/U77pLr_MfR-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/U77pLr_MfR-400.jpeg&quot; alt=&quot;Running dnf5 check-upgrade on Fedora to preview available package updates without installing&quot; width=&quot;1600&quot; height=&quot;418&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/U77pLr_MfR-400.jpeg 400w, https://voxihost.pl/assets/images/generated/U77pLr_MfR-800.jpeg 800w, https://voxihost.pl/assets/images/generated/U77pLr_MfR-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf5 check-upgrade
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Short list, nothing gets touched. &lt;strong&gt;Good habit&lt;/strong&gt; before running updates on a machine that&#39;s actually serving traffic.&lt;/p&gt;
&lt;p&gt;One difference from older &lt;code&gt;dnf&lt;/code&gt;: &lt;code&gt;dnf5&lt;/code&gt; separates the concepts of &lt;code&gt;update&lt;/code&gt; and &lt;code&gt;upgrade&lt;/code&gt; more clearly. In practice, &lt;code&gt;dnf5 upgrade&lt;/code&gt; is the command you want, it handles both package updates and dependency resolution. &lt;code&gt;dnf5 update&lt;/code&gt; is an alias and works the same way.&lt;/p&gt;
&lt;h2 id=&quot;cleaning-up-dnf5-autoremove&quot;&gt;Cleaning up (dnf5 autoremove) &lt;/h2&gt;
&lt;p&gt;After upgrades, orphaned packages pile up. Old kernels, old libraries that newer versions replaced. Clean those up:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf5 autoremove -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fedora by default also keeps the last two kernel versions installed, which is sensible, it gives you a fallback if something goes sideways. If you want to prune old kernels specifically:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf5 repoquery --installonly --latest-limit=-2 -q
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That shows you what would be removed. Add &lt;code&gt;--remove&lt;/code&gt; to actually do it. Be careful on systems where you don&#39;t have out-of-band console access.&lt;/p&gt;
&lt;h2 id=&quot;do-you-need-a-reboot-needs-restarting&quot;&gt;Do you need a reboot? (needs-restarting) &lt;/h2&gt;
&lt;p&gt;Fedora doesn&#39;t write a &lt;code&gt;reboot-required&lt;/code&gt; file like Ubuntu does. Instead, use:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/-9VJNxjORJ-400.avif 400w, https://voxihost.pl/assets/images/generated/-9VJNxjORJ-748.avif 748w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/-9VJNxjORJ-400.webp 400w, https://voxihost.pl/assets/images/generated/-9VJNxjORJ-748.webp 748w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/-9VJNxjORJ-400.jpeg&quot; alt=&quot;Running sudo needs-restarting -r on Fedora to check if a reboot is needed after kernel update&quot; width=&quot;748&quot; height=&quot;135&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/-9VJNxjORJ-400.jpeg 400w, https://voxihost.pl/assets/images/generated/-9VJNxjORJ-748.jpeg 748w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo needs-restarting -r
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Exit code 1&lt;/strong&gt; means a reboot is needed (usually a kernel update). &lt;strong&gt;Exit code 0&lt;/strong&gt; means you&#39;re fine. If the tool isn&#39;t installed:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/OVAp6luNVH-400.avif 400w, https://voxihost.pl/assets/images/generated/OVAp6luNVH-800.avif 800w, https://voxihost.pl/assets/images/generated/OVAp6luNVH-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/OVAp6luNVH-400.webp 400w, https://voxihost.pl/assets/images/generated/OVAp6luNVH-800.webp 800w, https://voxihost.pl/assets/images/generated/OVAp6luNVH-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/OVAp6luNVH-400.jpeg&quot; alt=&quot;Installing dnf-utils on Fedora with sudo dnf5 install dnf-utils to get needs-restarting&quot; width=&quot;1600&quot; height=&quot;468&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/OVAp6luNVH-400.jpeg 400w, https://voxihost.pl/assets/images/generated/OVAp6luNVH-800.jpeg 800w, https://voxihost.pl/assets/images/generated/OVAp6luNVH-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf5 install dnf-utils -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On a server, you can also check which services are running against outdated libraries and restart only those, avoiding a full system reboot:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo needs-restarting -s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is particularly useful on Fedora, where kernel updates are frequent. Restarting a handful of services is much less disruptive than taking the machine down.&lt;/p&gt;
&lt;h2 id=&quot;automating-patches-with-dnf-automatic&quot;&gt;Automating patches with dnf-automatic &lt;/h2&gt;
&lt;p&gt;For servers that sit in the background without regular manual attention:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/cikxyY9xNZ-400.avif 400w, https://voxihost.pl/assets/images/generated/cikxyY9xNZ-800.avif 800w, https://voxihost.pl/assets/images/generated/cikxyY9xNZ-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/cikxyY9xNZ-400.webp 400w, https://voxihost.pl/assets/images/generated/cikxyY9xNZ-800.webp 800w, https://voxihost.pl/assets/images/generated/cikxyY9xNZ-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/cikxyY9xNZ-400.jpeg&quot; alt=&quot;Installing dnf-automatic package on Fedora for automatic unattended security updates&quot; width=&quot;1600&quot; height=&quot;106&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/cikxyY9xNZ-400.jpeg 400w, https://voxihost.pl/assets/images/generated/cikxyY9xNZ-800.jpeg 800w, https://voxihost.pl/assets/images/generated/cikxyY9xNZ-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf5 install dnf-automatic -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The config file controls what gets updated automatically:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Qt2rDnUtvM-400.avif 400w, https://voxihost.pl/assets/images/generated/Qt2rDnUtvM-800.avif 800w, https://voxihost.pl/assets/images/generated/Qt2rDnUtvM-1479.avif 1479w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Qt2rDnUtvM-400.webp 400w, https://voxihost.pl/assets/images/generated/Qt2rDnUtvM-800.webp 800w, https://voxihost.pl/assets/images/generated/Qt2rDnUtvM-1479.webp 1479w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/Qt2rDnUtvM-400.jpeg&quot; alt=&quot;Editing /etc/dnf/automatic.conf on Fedora to configure unattended updates with nano&quot; width=&quot;1479&quot; height=&quot;247&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Qt2rDnUtvM-400.jpeg 400w, https://voxihost.pl/assets/images/generated/Qt2rDnUtvM-800.jpeg 800w, https://voxihost.pl/assets/images/generated/Qt2rDnUtvM-1479.jpeg 1479w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/dnf/automatic.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If missing package &lt;code&gt;nano&lt;/code&gt; install it first:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf5 install nano -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Key settings:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[commands]
# security = only security patches (recommended for servers)
upgrade_type = security

# Actually install the updates, not just download them
apply_updates = yes

# Emit output to the journal
emit_via = stdio
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enable the systemd timer to run it daily:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now dnf-automatic.timer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verify it&#39;s scheduled:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl status dnf-automatic.timer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On Fedora, security patches come through regularly given how active the project is, so automatic security updates make a real difference.&lt;/p&gt;
&lt;h2 id=&quot;the-quick-one-liner&quot;&gt;The quick one-liner &lt;/h2&gt;
&lt;p&gt;SSH in, do your thing, leave it clean:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf5 upgrade -y &amp;amp;&amp;amp; sudo dnf5 autoremove -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then check &lt;code&gt;needs-restarting -r&lt;/code&gt;. Two minutes of work, system stays current.&lt;/p&gt;
&lt;h2 id=&quot;upgrading-to-the-next-fedora-release&quot;&gt;Upgrading to the next Fedora release &lt;/h2&gt;
&lt;p&gt;Fedora moves to a new release every six months, and each release is supported for about 13 months. When it&#39;s time to move from 43 to 44:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/V_nKxcJSxu-400.avif 400w, https://voxihost.pl/assets/images/generated/V_nKxcJSxu-800.avif 800w, https://voxihost.pl/assets/images/generated/V_nKxcJSxu-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/V_nKxcJSxu-400.webp 400w, https://voxihost.pl/assets/images/generated/V_nKxcJSxu-800.webp 800w, https://voxihost.pl/assets/images/generated/V_nKxcJSxu-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/V_nKxcJSxu-400.jpeg&quot; alt=&quot;Running sudo dnf5 system-upgrade download --releasever=43 to start Fedora version upgrade&quot; width=&quot;1600&quot; height=&quot;508&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/V_nKxcJSxu-400.jpeg 400w, https://voxihost.pl/assets/images/generated/V_nKxcJSxu-800.jpeg 800w, https://voxihost.pl/assets/images/generated/V_nKxcJSxu-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf5 system-upgrade download --releasever=44
sudo dnf5 system-upgrade reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The upgrade happens on the next boot in a controlled environment. This is the &lt;strong&gt;supported path&lt;/strong&gt;, don&#39;t try to manually swap repos and run &lt;code&gt;dnf5 distro-sync&lt;/code&gt;, you&#39;ll end up in a broken state.&lt;/p&gt;
&lt;p&gt;Before upgrading: &lt;strong&gt;snapshot the VM&lt;/strong&gt;, read the Fedora 44 release notes for anything that might break your workload, and if possible test on a clone first.&lt;/p&gt;
&lt;h2 id=&quot;the-selinux-and-config-file-traps&quot;&gt;The SELinux and config file traps &lt;/h2&gt;
&lt;p&gt;Two things to watch after updates on Fedora:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SELinux denials.&lt;/strong&gt; If a service stops working after an update, check the audit log:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ausearch -m avc -ts recent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If missing package &lt;code&gt;ausearch&lt;/code&gt; install it first:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf5 install ausearch -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A policy update might have changed what your service is allowed to do, or an updated binary might need a new label. Most of the time this sorts itself out, but it&#39;s the first thing to check.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RPM config file conflicts.&lt;/strong&gt; When a package ships a new default config, it creates a &lt;strong&gt;&lt;code&gt;.rpmnew&lt;/code&gt;&lt;/strong&gt; file instead of overwriting yours:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo find /etc -name &amp;quot;*.rpmnew&amp;quot; -o -name &amp;quot;*.rpmsave&amp;quot; 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check those after any significant update. Merge what matters, delete what doesn&#39;t.&lt;/p&gt;
&lt;p&gt;Fedora is a solid server operating system if you&#39;re staying current. The six-month release cycle sounds fast, but the system-upgrade path is smooth and rarely causes surprises. If you want a clean VPS to test a Fedora upgrade without risking your production machine, our &lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt; plans are a cheap way to run through the whole process.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Update AlmaLinux, CentOS Stream &amp; Rocky Linux: The Complete Server Guide</title>
    <link href="https://voxihost.pl/blog/how-to-update-almalinux-centos-rocky/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-update-almalinux-centos-rocky/</id>
    <summary type="text">A complete step-by-step guide to updating AlmaLinux 9/10, CentOS Stream 9/10, and Rocky Linux 9/10 servers. Covers dnf update, autoremove, reboot detection, and dnf-automatic for production VPS environments.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;If you&#39;re running AlmaLinux, CentOS Stream, or Rocky Linux, you&#39;re on distros that take stability seriously. But stability doesn&#39;t mean you can leave the system untouched for months. Packages still get CVEs, the kernel still gets security patches, and OpenSSH vulnerabilities wait for no one.&lt;/p&gt;
&lt;p&gt;Good news: all three distros share the exact same package manager, &lt;code&gt;dnf&lt;/code&gt;. Same commands, same behavior, same output. So this guide applies to AlmaLinux 9, AlmaLinux 10, CentOS Stream 9, CentOS Stream 10, Rocky Linux 9, and Rocky Linux 10 without any changes.&lt;/p&gt;
&lt;p&gt;Before we start: if you are deploying a fresh server with a premium provider like &lt;strong&gt;&lt;span&gt;Voxi&lt;/span&gt;&lt;span&gt;Host&lt;/span&gt;&lt;/strong&gt;, the system automatically runs a full package update immediately after deployment on first boot. But as your server runs over time, you will still need to know how to maintain it yourself.&lt;/p&gt;
&lt;h2 id=&quot;the-basics-dnf-update-and-dnf-upgrade&quot;&gt;The basics: dnf update and dnf upgrade &lt;/h2&gt;
&lt;p&gt;Unlike &lt;code&gt;apt&lt;/code&gt;, which splits &amp;quot;refresh index&amp;quot; and &amp;quot;install updates&amp;quot; into two separate commands, &lt;code&gt;dnf update&lt;/code&gt; does both in one shot. It fetches the latest metadata and installs whatever&#39;s new:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/abX3UGq-j6-400.avif 400w, https://voxihost.pl/assets/images/generated/abX3UGq-j6-800.avif 800w, https://voxihost.pl/assets/images/generated/abX3UGq-j6-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/abX3UGq-j6-400.webp 400w, https://voxihost.pl/assets/images/generated/abX3UGq-j6-800.webp 800w, https://voxihost.pl/assets/images/generated/abX3UGq-j6-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/abX3UGq-j6-400.jpeg&quot; alt=&quot;Running sudo dnf update -y on AlmaLinux 9 - terminal output&quot; width=&quot;1600&quot; height=&quot;355&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/abX3UGq-j6-400.jpeg 400w, https://voxihost.pl/assets/images/generated/abX3UGq-j6-800.jpeg 800w, https://voxihost.pl/assets/images/generated/abX3UGq-j6-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf update -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#39;s genuinely all you need for routine maintenance. The &lt;strong&gt;&lt;code&gt;-y&lt;/code&gt; flag skips confirmation prompts&lt;/strong&gt;, which is convenient when you&#39;re SSH&#39;d in to do something else and don&#39;t want to babysit a package upgrade.&lt;/p&gt;
&lt;p&gt;If you want to check what would be updated before actually running it:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/66eCkNdXqD-400.avif 400w, https://voxihost.pl/assets/images/generated/66eCkNdXqD-800.avif 800w, https://voxihost.pl/assets/images/generated/66eCkNdXqD-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/66eCkNdXqD-400.webp 400w, https://voxihost.pl/assets/images/generated/66eCkNdXqD-800.webp 800w, https://voxihost.pl/assets/images/generated/66eCkNdXqD-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/66eCkNdXqD-400.jpeg&quot; alt=&quot;Running sudo dnf check-update on Rocky Linux to preview available updates&quot; width=&quot;1600&quot; height=&quot;315&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/66eCkNdXqD-400.jpeg 400w, https://voxihost.pl/assets/images/generated/66eCkNdXqD-800.jpeg 800w, https://voxihost.pl/assets/images/generated/66eCkNdXqD-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf check-update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the equivalent of &lt;code&gt;apt update&lt;/code&gt;, it shows you the list of available updates without touching anything. &lt;strong&gt;Good habit&lt;/strong&gt; before running updates on something you&#39;re not sure about.&lt;/p&gt;
&lt;p&gt;One note on naming: &lt;code&gt;dnf upgrade&lt;/code&gt; is an alias for &lt;code&gt;dnf update&lt;/code&gt;. They&#39;re identical on these three distros. You&#39;ll see both in documentation; don&#39;t let that confuse you.&lt;/p&gt;
&lt;h2 id=&quot;cleaning-up-dnf-autoremove&quot;&gt;Cleaning up (dnf autoremove) &lt;/h2&gt;
&lt;p&gt;After updates, old packages tend to accumulate. Dependencies that were pulled in for something that&#39;s since been updated, libraries nothing uses anymore. Clean those up with:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/E7GgDF2Z9K-400.avif 400w, https://voxihost.pl/assets/images/generated/E7GgDF2Z9K-682.avif 682w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/E7GgDF2Z9K-400.webp 400w, https://voxihost.pl/assets/images/generated/E7GgDF2Z9K-682.webp 682w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/E7GgDF2Z9K-400.jpeg&quot; alt=&quot;Running sudo dnf autoremove on CentOS Stream to remove unused packages&quot; width=&quot;682&quot; height=&quot;121&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/E7GgDF2Z9K-400.jpeg 400w, https://voxihost.pl/assets/images/generated/E7GgDF2Z9K-682.jpeg 682w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf autoremove -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Same concept as &lt;code&gt;apt autoremove&lt;/code&gt;. Not critical to run every time, but worth doing after a major update or once a month. It keeps the system clean and the disk usage predictable.&lt;/p&gt;
&lt;h2 id=&quot;do-you-need-a-reboot-needs-restarting&quot;&gt;Do you need a reboot? (needs-restarting) &lt;/h2&gt;
&lt;p&gt;Kernel updates don&#39;t take effect until you reboot. Unlike Debian-based systems that leave a &lt;code&gt;/var/run/reboot-required&lt;/code&gt; file, RHEL-family distros use a tool called &lt;code&gt;needs-restarting&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/2To8j3eQrN-400.avif 400w, https://voxihost.pl/assets/images/generated/2To8j3eQrN-581.avif 581w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/2To8j3eQrN-400.webp 400w, https://voxihost.pl/assets/images/generated/2To8j3eQrN-581.webp 581w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/2To8j3eQrN-400.jpeg&quot; alt=&quot;Running sudo needs-restarting -r on AlmaLinux to check if a reboot is required after kernel update&quot; width=&quot;581&quot; height=&quot;143&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/2To8j3eQrN-400.jpeg 400w, https://voxihost.pl/assets/images/generated/2To8j3eQrN-581.jpeg 581w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo needs-restarting -r
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the command exits with &lt;strong&gt;code 1&lt;/strong&gt; and tells you a reboot is required, you need one. If it exits cleanly with &lt;strong&gt;code 0&lt;/strong&gt;, you&#39;re fine. This tool is part of the &lt;code&gt;dnf-utils&lt;/code&gt; package, if it&#39;s not installed:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Wy3kwkzeN3-400.avif 400w, https://voxihost.pl/assets/images/generated/Wy3kwkzeN3-800.avif 800w, https://voxihost.pl/assets/images/generated/Wy3kwkzeN3-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Wy3kwkzeN3-400.webp 400w, https://voxihost.pl/assets/images/generated/Wy3kwkzeN3-800.webp 800w, https://voxihost.pl/assets/images/generated/Wy3kwkzeN3-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/Wy3kwkzeN3-400.jpeg&quot; alt=&quot;Installing dnf-utils package with sudo dnf install dnf-utils on Rocky Linux&quot; width=&quot;1600&quot; height=&quot;235&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Wy3kwkzeN3-400.jpeg 400w, https://voxihost.pl/assets/images/generated/Wy3kwkzeN3-800.jpeg 800w, https://voxihost.pl/assets/images/generated/Wy3kwkzeN3-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf install dnf-utils -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It can also check for services that need restarting without a full reboot. Worth knowing if you&#39;re trying to minimize downtime:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo needs-restarting -s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This lists services that have loaded outdated libraries. Restarting those individually is often enough to pick up security fixes without taking the whole system down.&lt;/p&gt;
&lt;h2 id=&quot;automating-patches-with-dnf-automatic&quot;&gt;Automating patches with dnf-automatic &lt;/h2&gt;
&lt;p&gt;For servers you don&#39;t log into daily, automatic security updates are a practical safety net. Install the package:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/YGzYeyvyLK-400.avif 400w, https://voxihost.pl/assets/images/generated/YGzYeyvyLK-800.avif 800w, https://voxihost.pl/assets/images/generated/YGzYeyvyLK-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/YGzYeyvyLK-400.webp 400w, https://voxihost.pl/assets/images/generated/YGzYeyvyLK-800.webp 800w, https://voxihost.pl/assets/images/generated/YGzYeyvyLK-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/YGzYeyvyLK-400.jpeg&quot; alt=&quot;Installing dnf-automatic for unattended updates on AlmaLinux 9&quot; width=&quot;1600&quot; height=&quot;140&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/YGzYeyvyLK-400.jpeg 400w, https://voxihost.pl/assets/images/generated/YGzYeyvyLK-800.jpeg 800w, https://voxihost.pl/assets/images/generated/YGzYeyvyLK-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf install dnf-automatic -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then edit the config to set the behavior you want:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/dnf/automatic.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If missing package &lt;code&gt;nano&lt;/code&gt; install it first:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/S8TLUN8GBA-400.avif 400w, https://voxihost.pl/assets/images/generated/S8TLUN8GBA-800.avif 800w, https://voxihost.pl/assets/images/generated/S8TLUN8GBA-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/S8TLUN8GBA-400.webp 400w, https://voxihost.pl/assets/images/generated/S8TLUN8GBA-800.webp 800w, https://voxihost.pl/assets/images/generated/S8TLUN8GBA-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/S8TLUN8GBA-400.jpeg&quot; alt=&quot;Installing nano editor with sudo dnf install nano -y on CentOS Stream&quot; width=&quot;1600&quot; height=&quot;140&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/S8TLUN8GBA-400.jpeg 400w, https://voxihost.pl/assets/images/generated/S8TLUN8GBA-800.jpeg 800w, https://voxihost.pl/assets/images/generated/S8TLUN8GBA-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf install nano -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The key settings:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[commands]
# Options: default, security, security-severity:Critical, minimal, minimal-security
upgrade_type = security

# Actually apply the updates (not just download)
apply_updates = yes

# Reboot if required after updates (be careful in production)
reboot = never
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set &lt;code&gt;upgrade_type = security&lt;/code&gt; to only auto-apply security patches, not general package updates. That&#39;s the sensible default for a production machine, you don&#39;t want feature releases going in automatically, just CVE fixes.&lt;/p&gt;
&lt;p&gt;Enable and start the timer:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now dnf-automatic.timer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check that it&#39;s active:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl status dnf-automatic.timer
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;the-quick-update-one-liner&quot;&gt;The quick update one-liner &lt;/h2&gt;
&lt;p&gt;When you SSH in for something else and want to leave the server in a clean state:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf update -y &amp;amp;&amp;amp; sudo dnf autoremove -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run it, let it finish, check &lt;code&gt;needs-restarting -r&lt;/code&gt;, done. Takes a minute, saves you from finding out your server was running a year-old kernel next time something breaks.&lt;/p&gt;
&lt;h2 id=&quot;upgrading-to-a-new-major-release&quot;&gt;Upgrading to a new major release &lt;/h2&gt;
&lt;p&gt;Jumping from AlmaLinux 9 to 10, CentOS Stream 9 to 10, or Rocky Linux 9 to 10 is a bigger operation than a routine update. Each project has its own migration tool:&lt;/p&gt;
&lt;p&gt;For AlmaLinux, the official path is through &lt;strong&gt;ELevate&lt;/strong&gt;, a tool from the AlmaLinux project that handles the switch between major versions including dependency resolution and package replacement. Same tooling also handles Rocky Linux and CentOS Stream migrations.&lt;/p&gt;
&lt;p&gt;Before attempting any major release upgrade:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Take a full snapshot of the VM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Read the &lt;strong&gt;release notes&lt;/strong&gt; for the target version&lt;/li&gt;
&lt;li&gt;Test on a non-production clone first&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&#39;t do a major upgrade via SSH on a machine with no out-of-band access. If something goes wrong mid-upgrade, you&#39;ll want a way in.&lt;/p&gt;
&lt;h2 id=&quot;what-to-watch-out-for&quot;&gt;What to watch out for &lt;/h2&gt;
&lt;p&gt;The most common gotcha on RHEL-family systems is &lt;strong&gt;SELinux&lt;/strong&gt;. If an update changes file permissions or binary paths, SELinux policies might block the service from starting correctly after the update. Check the audit log if something stops working after an update:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ausearch -m avc -ts recent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If missing command &lt;code&gt;ausearch&lt;/code&gt; install it first:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/HKOymMGXTc-400.avif 400w, https://voxihost.pl/assets/images/generated/HKOymMGXTc-800.avif 800w, https://voxihost.pl/assets/images/generated/HKOymMGXTc-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/HKOymMGXTc-400.webp 400w, https://voxihost.pl/assets/images/generated/HKOymMGXTc-800.webp 800w, https://voxihost.pl/assets/images/generated/HKOymMGXTc-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/HKOymMGXTc-400.jpeg&quot; alt=&quot;Installing setroubleshoot-server to diagnose SELinux access denials on AlmaLinux&quot; width=&quot;1600&quot; height=&quot;426&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/HKOymMGXTc-400.jpeg 400w, https://voxihost.pl/assets/images/generated/HKOymMGXTc-800.jpeg 800w, https://voxihost.pl/assets/images/generated/HKOymMGXTc-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf install setroubleshoot-server -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Config file handling in &lt;code&gt;dnf&lt;/code&gt; is somewhat more aggressive than &lt;code&gt;apt&lt;/code&gt;. When a package ships a new default config, &lt;code&gt;dnf&lt;/code&gt; might overwrite your customized version with a &lt;strong&gt;&lt;code&gt;.rpmnew&lt;/code&gt;&lt;/strong&gt; suffix on the original. Always check for those after a major update:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo find /etc -name &amp;quot;*.rpmnew&amp;quot; -o -name &amp;quot;*.rpmsave&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Look at what&#39;s changed, decide if you need to merge anything, then clean up.&lt;/p&gt;
&lt;p&gt;If you want a clean RHEL-based VPS to practice this on without risking anything, our &lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt; plans are cheap enough to spin up a test box, run the whole process, and discard it.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Transfer Files to Your VPS using SFTP &amp; FileZilla</title>
    <link href="https://voxihost.pl/blog/how-to-transfer-files-vps-sftp-filezilla/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-transfer-files-vps-sftp-filezilla/</id>
    <summary type="text">A complete beginner&#39;s guide to securely transferring files from your PC to your Linux VPS using SFTP, FileZilla, and SSH Keys.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;When you rent a brand new Linux VPS, you are usually greeted with a terrifying black terminal screen.&lt;/p&gt;
&lt;p&gt;While you can technically upload files directly through the command line using &lt;code&gt;scp&lt;/code&gt; or &lt;code&gt;rsync&lt;/code&gt;, dragging and dropping your website&#39;s folder using a visual interface is infinitely easier, especially for beginners.&lt;/p&gt;
&lt;p&gt;The absolute best way to do this is using &lt;strong&gt;SFTP&lt;/strong&gt; (Secure File Transfer Protocol) with a free desktop client called &lt;strong&gt;FileZilla&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important Note:&lt;/strong&gt; Do not confuse standard FTP with SFTP. Standard FTP sends your passwords and files over the internet in plain, unencrypted text. SFTP routes all FTP commands through your server&#39;s secure SSH tunnel. Because of this, &lt;em&gt;you do not need to install an FTP server like vsftpd on your Linux VPS&lt;/em&gt;. If you have an SSH connection, SFTP will work automatically!&lt;/p&gt;
&lt;h2 id=&quot;step-1-download-filezilla&quot;&gt;Step 1: Download FileZilla &lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/vFUPOP5M-I-400.avif 400w, https://voxihost.pl/assets/images/generated/vFUPOP5M-I-800.avif 800w, https://voxihost.pl/assets/images/generated/vFUPOP5M-I-1041.avif 1041w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/vFUPOP5M-I-400.webp 400w, https://voxihost.pl/assets/images/generated/vFUPOP5M-I-800.webp 800w, https://voxihost.pl/assets/images/generated/vFUPOP5M-I-1041.webp 1041w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/vFUPOP5M-I-400.jpeg&quot; alt=&quot;Downloading FileZilla Client installer from the official filezilla-project.org website for SFTP connection&quot; width=&quot;1041&quot; height=&quot;497&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/vFUPOP5M-I-400.jpeg 400w, https://voxihost.pl/assets/images/generated/vFUPOP5M-I-800.jpeg 800w, https://voxihost.pl/assets/images/generated/vFUPOP5M-I-1041.jpeg 1041w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;If you haven&#39;t already, download the &lt;strong&gt;FileZilla Client&lt;/strong&gt; (not the Server version) from the &lt;a href=&quot;https://filezilla-project.org/&quot;&gt;official FileZilla website&lt;/a&gt;. It is completely free and available for Windows, macOS, and Linux.&lt;/p&gt;
&lt;h2 id=&quot;step-2-configure-the-site-manager&quot;&gt;Step 2: Configure the Site Manager &lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/u-PfLpNlmz-400.avif 400w, https://voxihost.pl/assets/images/generated/u-PfLpNlmz-632.avif 632w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/u-PfLpNlmz-400.webp 400w, https://voxihost.pl/assets/images/generated/u-PfLpNlmz-632.webp 632w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/u-PfLpNlmz-400.jpeg&quot; alt=&quot;Opening the FileZilla Site Manager to create a new saved SFTP server connection&quot; width=&quot;632&quot; height=&quot;328&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/u-PfLpNlmz-400.jpeg 400w, https://voxihost.pl/assets/images/generated/u-PfLpNlmz-632.jpeg 632w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt; use the &amp;quot;Quickconnect&amp;quot; bar at the very top of the application. It does not securely save your SSH keys or complex server settings.&lt;/p&gt;
&lt;p&gt;Instead, open the &lt;strong&gt;Site Manager&lt;/strong&gt;. You can find it by clicking the very first icon on the top-left toolbar, or by navigating to &lt;code&gt;File &amp;gt; Site Manager&lt;/code&gt; (or &lt;code&gt;CTRL + S&lt;/code&gt; on Windows).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;New Site&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Name the site something recognizable, like &amp;quot;My VPS Web Server&amp;quot;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;step-3-select-the-sftp-protocol&quot;&gt;Step 3: Select the SFTP Protocol &lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/B4vJIoCU28-400.avif 400w, https://voxihost.pl/assets/images/generated/B4vJIoCU28-800.avif 800w, https://voxihost.pl/assets/images/generated/B4vJIoCU28-1182.avif 1182w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/B4vJIoCU28-400.webp 400w, https://voxihost.pl/assets/images/generated/B4vJIoCU28-800.webp 800w, https://voxihost.pl/assets/images/generated/B4vJIoCU28-1182.webp 1182w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/B4vJIoCU28-400.jpeg&quot; alt=&quot;Selecting SFTP - SSH File Transfer Protocol from the FileZilla protocol dropdown instead of FTP&quot; width=&quot;1182&quot; height=&quot;663&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/B4vJIoCU28-400.jpeg 400w, https://voxihost.pl/assets/images/generated/B4vJIoCU28-800.jpeg 800w, https://voxihost.pl/assets/images/generated/B4vJIoCU28-1182.jpeg 1182w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Look at the right side of the Site Manager window. Under the &lt;strong&gt;Protocol&lt;/strong&gt; dropdown, it defaults to standard FTP.&lt;/p&gt;
&lt;p&gt;You &lt;strong&gt;must&lt;/strong&gt; change this. Click the dropdown and select:&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;SFTP - SSH File Transfer Protocol&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you skip this step, FileZilla will constantly fail to connect to your server securely.&lt;/p&gt;
&lt;h2 id=&quot;step-4-add-your-credentials-or-ssh-key&quot;&gt;Step 4: Add Your Credentials or SSH Key &lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Zvz5nTvCdT-400.avif 400w, https://voxihost.pl/assets/images/generated/Zvz5nTvCdT-800.avif 800w, https://voxihost.pl/assets/images/generated/Zvz5nTvCdT-1182.avif 1182w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Zvz5nTvCdT-400.webp 400w, https://voxihost.pl/assets/images/generated/Zvz5nTvCdT-800.webp 800w, https://voxihost.pl/assets/images/generated/Zvz5nTvCdT-1182.webp 1182w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/Zvz5nTvCdT-400.jpeg&quot; alt=&quot;Adding VPS IP address, username, and SSH key file in FileZilla Site Manager for secure connection&quot; width=&quot;1182&quot; height=&quot;663&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Zvz5nTvCdT-400.jpeg 400w, https://voxihost.pl/assets/images/generated/Zvz5nTvCdT-800.jpeg 800w, https://voxihost.pl/assets/images/generated/Zvz5nTvCdT-1182.jpeg 1182w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Now you need to tell FileZilla where to go and how to log in.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Host&lt;/strong&gt;: Enter your server&#39;s public IP address (e.g., &lt;code&gt;192.168.1.100&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port&lt;/strong&gt;: Leave this &lt;strong&gt;blank&lt;/strong&gt; unless you have manually changed your SSH port.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logon Type&lt;/strong&gt;: This is where most beginners get stuck. Change this to &lt;strong&gt;&lt;code&gt;Key file&lt;/code&gt;&lt;/strong&gt; if you use SSH keys, or &lt;strong&gt;&lt;code&gt;Normal&lt;/code&gt;&lt;/strong&gt; if you use a password.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User&lt;/strong&gt;: Enter your username (usually &lt;strong&gt;&lt;code&gt;root&lt;/code&gt;&lt;/strong&gt; for a fresh server deployment).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key file&lt;/strong&gt;: Click &lt;strong&gt;Browse&lt;/strong&gt; and select the private key file on your computer.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;if-you-use-a-password&quot;&gt;If you use a Password: &lt;/h3&gt;
&lt;p&gt;While we highly discourage using passwords for server access (as they are vulnerable to brute-force attacks), if you must:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Set the Logon Type to &lt;strong&gt;Normal&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User&lt;/strong&gt;: Type &lt;code&gt;root&lt;/code&gt; (or whatever user account you created).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password&lt;/strong&gt;: Enter your standard SSH password.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;if-you-use-ssh-keys-recommended&quot;&gt;If you use SSH Keys (Recommended): &lt;/h3&gt;
&lt;p&gt;If you generated an &lt;a href=&quot;https://voxihost.pl/blog/how-to-secure-ssh-ubuntu-debian/&quot;&gt;SSH key pair&lt;/a&gt; (like &lt;code&gt;id_rsa&lt;/code&gt; or &lt;code&gt;id_ed25519&lt;/code&gt;) to log into your server securely without a password:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Set the Logon Type to &lt;strong&gt;Key file&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User&lt;/strong&gt;: Type your username (like &lt;code&gt;root&lt;/code&gt; or &lt;code&gt;admin&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Browse&lt;/strong&gt; button and locate the &lt;code&gt;private key&lt;/code&gt; file on your desktop (not the one ending in &lt;code&gt;.pub&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;(If FileZilla asks for a password during the connection, it is asking for the passphrase you put on your private key, not the server&#39;s root password).&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;step-5-connect-and-transfer&quot;&gt;Step 5: Connect and Transfer &lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/G1YRb4rPU--400.avif 400w, https://voxihost.pl/assets/images/generated/G1YRb4rPU--773.avif 773w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/G1YRb4rPU--400.webp 400w, https://voxihost.pl/assets/images/generated/G1YRb4rPU--773.webp 773w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/G1YRb4rPU--400.jpeg&quot; alt=&quot;FileZilla host key verification popup when connecting to a VPS for the first time via SFTP&quot; width=&quot;773&quot; height=&quot;346&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/G1YRb4rPU--400.jpeg 400w, https://voxihost.pl/assets/images/generated/G1YRb4rPU--773.jpeg 773w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Click the &lt;strong&gt;Connect&lt;/strong&gt; button at the bottom of the window.&lt;/p&gt;
&lt;p&gt;The very first time you connect to the server from this computer, a scary-looking window will pop up titled &lt;em&gt;&amp;quot;Unknown host key&amp;quot;&lt;/em&gt;. This is a &lt;strong&gt;standard security measure&lt;/strong&gt; preventing &amp;quot;Man in the Middle&amp;quot; attacks.&lt;br /&gt;
Check the box that says &lt;strong&gt;&amp;quot;Always trust this host...&amp;quot;&lt;/strong&gt; and click OK.&lt;/p&gt;
&lt;h3 id=&quot;the-filezilla-interface&quot;&gt;The FileZilla Interface &lt;/h3&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Ydp6FJ5GgM-400.avif 400w, https://voxihost.pl/assets/images/generated/Ydp6FJ5GgM-800.avif 800w, https://voxihost.pl/assets/images/generated/Ydp6FJ5GgM-1140.avif 1140w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Ydp6FJ5GgM-400.webp 400w, https://voxihost.pl/assets/images/generated/Ydp6FJ5GgM-800.webp 800w, https://voxihost.pl/assets/images/generated/Ydp6FJ5GgM-1140.webp 1140w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/Ydp6FJ5GgM-400.jpeg&quot; alt=&quot;FileZilla split-pane interface showing local files on left and remote Linux VPS directory on right for drag-and-drop transfer&quot; width=&quot;1140&quot; height=&quot;891&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Ydp6FJ5GgM-400.jpeg 400w, https://voxihost.pl/assets/images/generated/Ydp6FJ5GgM-800.jpeg 800w, https://voxihost.pl/assets/images/generated/Ydp6FJ5GgM-1140.jpeg 1140w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;If your credentials are correct, you will successfully connect. You are now looking at two massive split windows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Left Side&lt;/strong&gt;: Your &lt;strong&gt;local computer&lt;/strong&gt; (your hard drive).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Right Side&lt;/strong&gt;: Your &lt;strong&gt;Linux VPS&lt;/strong&gt; (the remote server).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To transfer files, simply &lt;strong&gt;drag and drop&lt;/strong&gt; them from the left window to the right window.&lt;/p&gt;
&lt;p&gt;A common place to upload web files is:&lt;br /&gt;
&lt;code&gt;/var/www/html/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Navigate there in the right-side window, drag your &lt;code&gt;index.html&lt;/code&gt; from your desktop (left side) to that folder, and your website is live!&lt;/p&gt;
&lt;p&gt;If you don&#39;t have a server to practice on, &lt;strong&gt;&lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt;&lt;/strong&gt; plans from &lt;strong&gt;&lt;span&gt;Voxi&lt;/span&gt;&lt;span&gt;Host&lt;/span&gt;&lt;/strong&gt; are a perfect, affordable playground to learn how to manage Linux without breaking the bank. You can deploy a clean instance in seconds and start transferring files immediately.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Set Up a WireGuard VPN Server on Ubuntu &amp; Debian</title>
    <link href="https://voxihost.pl/blog/how-to-setup-wireguard-vpn-ubuntu-debian/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-setup-wireguard-vpn-ubuntu-debian/</id>
    <summary type="text">A beginner-friendly guide to installing, configuring, and generating client connection keys for a lightning-fast WireGuard VPN server on your Linux VPS.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;&lt;strong&gt;WireGuard&lt;/strong&gt; is a modern, revolutionary VPN protocol that has completely dominated the privacy landscape. It is significantly faster, more secure, and connects almost instantaneously without heavily draining cell phone batteries compared to older standards like OpenVPN.&lt;/p&gt;
&lt;p&gt;While you &lt;em&gt;can&lt;/em&gt; manually configure IP tables and NAT forwarding rules to install it, you shouldn&#39;t. It is extremely error-prone for beginners.&lt;/p&gt;
&lt;p&gt;Instead, the global open-source community relies on a highly audited, universally trusted bash script by developer &lt;em&gt;Angristan&lt;/em&gt; to seamlessly configure WireGuard on any VPS securely in less than two minutes.&lt;/p&gt;
&lt;p&gt;Here is how to deploy your own private VPN on any Linux VPS to bypass restrictions and browse securely.&lt;/p&gt;
&lt;h2 id=&quot;step-1-download-the-trusted-install-script&quot;&gt;Step 1: Download the Trusted Install Script &lt;/h2&gt;
&lt;p&gt;Log into your server via SSH. Make sure you update your system before executing the installation:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/EsTjgMKGBH-400.avif 400w, https://voxihost.pl/assets/images/generated/EsTjgMKGBH-624.avif 624w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/EsTjgMKGBH-400.webp 400w, https://voxihost.pl/assets/images/generated/EsTjgMKGBH-624.webp 624w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/EsTjgMKGBH-400.jpeg&quot; alt=&quot;Running sudo apt update and apt upgrade -y on Ubuntu to update the system before installing WireGuard VPN&quot; width=&quot;624&quot; height=&quot;165&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/EsTjgMKGBH-400.jpeg 400w, https://voxihost.pl/assets/images/generated/EsTjgMKGBH-624.jpeg 624w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, download the official installation script directly from Angristan&#39;s GitHub repository:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/cYFEsYAcb7-400.avif 400w, https://voxihost.pl/assets/images/generated/cYFEsYAcb7-800.avif 800w, https://voxihost.pl/assets/images/generated/cYFEsYAcb7-1060.avif 1060w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/cYFEsYAcb7-400.webp 400w, https://voxihost.pl/assets/images/generated/cYFEsYAcb7-800.webp 800w, https://voxihost.pl/assets/images/generated/cYFEsYAcb7-1060.webp 1060w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/cYFEsYAcb7-400.jpeg&quot; alt=&quot;Downloading the Angristan WireGuard auto-install script from GitHub using curl on Ubuntu VPS&quot; width=&quot;1060&quot; height=&quot;165&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/cYFEsYAcb7-400.jpeg 400w, https://voxihost.pl/assets/images/generated/cYFEsYAcb7-800.jpeg 800w, https://voxihost.pl/assets/images/generated/cYFEsYAcb7-1060.jpeg 1060w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;step-2-run-the-auto-installer&quot;&gt;Step 2: Run the Auto-Installer &lt;/h2&gt;
&lt;p&gt;Before you can run the file, you &lt;strong&gt;must&lt;/strong&gt; tell Linux that this text file is actually an executable script:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/R4J0OLuUKV-400.avif 400w, https://voxihost.pl/assets/images/generated/R4J0OLuUKV-800.avif 800w, https://voxihost.pl/assets/images/generated/R4J0OLuUKV-1060.avif 1060w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/R4J0OLuUKV-400.webp 400w, https://voxihost.pl/assets/images/generated/R4J0OLuUKV-800.webp 800w, https://voxihost.pl/assets/images/generated/R4J0OLuUKV-1060.webp 1060w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/R4J0OLuUKV-400.jpeg&quot; alt=&quot;Running sudo chmod and then sudo ./wireguard-install.sh to launch the WireGuard auto-installer on Ubuntu&quot; width=&quot;1060&quot; height=&quot;170&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/R4J0OLuUKV-400.jpeg 400w, https://voxihost.pl/assets/images/generated/R4J0OLuUKV-800.jpeg 800w, https://voxihost.pl/assets/images/generated/R4J0OLuUKV-1060.jpeg 1060w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x wireguard-install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, execute the script with root privileges:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ./wireguard-install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;step-3-the-configuration-prompts&quot;&gt;Step 3: The Configuration Prompts &lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/aowLHyZCGv-400.avif 400w, https://voxihost.pl/assets/images/generated/aowLHyZCGv-800.avif 800w, https://voxihost.pl/assets/images/generated/aowLHyZCGv-1060.avif 1060w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/aowLHyZCGv-400.webp 400w, https://voxihost.pl/assets/images/generated/aowLHyZCGv-800.webp 800w, https://voxihost.pl/assets/images/generated/aowLHyZCGv-1060.webp 1060w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/aowLHyZCGv-400.jpeg&quot; alt=&quot;WireGuard install script configuration prompts showing IP address, port, and DNS resolver options on Ubuntu&quot; width=&quot;1060&quot; height=&quot;438&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/aowLHyZCGv-400.jpeg 400w, https://voxihost.pl/assets/images/generated/aowLHyZCGv-800.jpeg 800w, https://voxihost.pl/assets/images/generated/aowLHyZCGv-1060.jpeg 1060w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The brilliant thing about this script is that it automatically detects your server&#39;s network interfaces, public IP addresses, and DNS configurations.&lt;/p&gt;
&lt;p&gt;When you run the script, it will ask you to confirm several settings. &lt;strong&gt;For 99% of deployments, you should simply press &lt;code&gt;Enter&lt;/code&gt; to accept the default values for every single prompt.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The prompts will look roughly like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IPv4 or IPv6 public address: (Auto-filled with your IP)
Public interface: (Auto-filled, usually eth0 or enp3s0)
WireGuard port: [51820]
First DNS resolver to use for the clients: [1.1.1.1]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Press &lt;code&gt;Enter&lt;/code&gt; through all of them. The script will then rapidly download the &lt;code&gt;wireguard&lt;/code&gt; packages via &lt;code&gt;apt&lt;/code&gt;, configure all the complex IP forwarding traffic rules in the Linux kernel, set up the firewall routing, and generate the master server encryption keys.&lt;/p&gt;
&lt;h2 id=&quot;step-4-generate-your-first-client-key&quot;&gt;Step 4: Generate Your First Client Key &lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/j_ZuDGgaJB-400.avif 400w, https://voxihost.pl/assets/images/generated/j_ZuDGgaJB-800.avif 800w, https://voxihost.pl/assets/images/generated/j_ZuDGgaJB-1193.avif 1193w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/j_ZuDGgaJB-400.webp 400w, https://voxihost.pl/assets/images/generated/j_ZuDGgaJB-800.webp 800w, https://voxihost.pl/assets/images/generated/j_ZuDGgaJB-1193.webp 1193w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/j_ZuDGgaJB-400.jpeg&quot; alt=&quot;WireGuard script prompting for a client name and generating the first .conf file and QR code on Ubuntu&quot; width=&quot;1193&quot; height=&quot;895&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/j_ZuDGgaJB-400.jpeg 400w, https://voxihost.pl/assets/images/generated/j_ZuDGgaJB-800.jpeg 800w, https://voxihost.pl/assets/images/generated/j_ZuDGgaJB-1193.jpeg 1193w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;WireGuard uses highly secure peer-to-peer cryptography. To connect your phone or laptop to the VPN, you need to generate a client configuration file (&lt;code&gt;.conf&lt;/code&gt;) for each device.&lt;/p&gt;
&lt;p&gt;Immediately after installing the server packages, the script will automatically prompt you to create your first client:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Client name: 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Type a recognizable name without spaces, like &lt;code&gt;daniel_iphone&lt;/code&gt; or &lt;code&gt;my_macbook&lt;/code&gt;, and press Enter.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Client&#39;s DNS server: [1]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Press Enter to accept the default DNS (usually Cloudflare or Google).&lt;/p&gt;
&lt;p&gt;The script does something incredibly helpful here. Not only does it create the &lt;code&gt;.conf&lt;/code&gt; file in your root folder, but it also renders a &lt;strong&gt;massive QR code&lt;/strong&gt; directly in your terminal window using ASCII characters!&lt;/p&gt;
&lt;h2 id=&quot;step-5-connect-your-devices&quot;&gt;Step 5: Connect Your Devices &lt;/h2&gt;
&lt;h3 id=&quot;connecting-a-mobile-phone-ios-android&quot;&gt;Connecting a Mobile Phone (iOS/Android): &lt;/h3&gt;
&lt;p&gt;Connecting your mobile phone is absurdly simple.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to the App Store or Google Play Store.&lt;/li&gt;
&lt;li&gt;Download the official, free &lt;strong&gt;WireGuard&lt;/strong&gt; app.&lt;/li&gt;
&lt;li&gt;Open the app and tap the &lt;code&gt;+&lt;/code&gt; icon to add a new tunnel.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;&amp;quot;Create from QR code&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Point your phone&#39;s camera at the giant QR code currently sitting on your computer terminal screen.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Name your connection, flip the toggle switch to &amp;quot;On&amp;quot;, and you are immediately encrypting all your mobile traffic through your VPS!&lt;/p&gt;
&lt;h3 id=&quot;connecting-a-laptop-or-pc-windows-mac-linux&quot;&gt;Connecting a Laptop or PC (Windows/Mac/Linux): &lt;/h3&gt;
&lt;p&gt;Laptops cannot scan terminal QR codes easily. Instead, you need to retrieve the actual &lt;code&gt;.conf&lt;/code&gt; file the script generated.&lt;/p&gt;
&lt;p&gt;If you named your client &lt;code&gt;my_macbook&lt;/code&gt;, the script saved a file named &lt;code&gt;my_macbook.conf&lt;/code&gt; in the directory where you ran the script (usually &lt;code&gt;/home/youruser/&lt;/code&gt; or &lt;code&gt;/root/&lt;/code&gt;).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download the &lt;code&gt;my_macbook.conf&lt;/code&gt; file to your personal computer. (The easiest way to do this securely is using an &lt;a href=&quot;https://voxihost.pl/blog/how-to-transfer-files-vps-sftp-filezilla/&quot;&gt;SFTP client like FileZilla&lt;/a&gt; or WinSCP).&lt;/li&gt;
&lt;li&gt;Download the official &lt;strong&gt;WireGuard&lt;/strong&gt; application for Windows or Mac Desktop from their website.&lt;/li&gt;
&lt;li&gt;Click &amp;quot;Import tunnel(s) from file&amp;quot; and select &lt;code&gt;.conf&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Click &amp;quot;Activate&amp;quot;. Your traffic is now secured!&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;generating-more-clients&quot;&gt;Generating More Clients &lt;/h2&gt;
&lt;p&gt;If you want to add a second laptop, a smart TV, or grant secure connection access to a team member, you do not need to reinstall WireGuard.&lt;/p&gt;
&lt;p&gt;Simply run the script again:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/TsqFYFQVCw-400.avif 400w, https://voxihost.pl/assets/images/generated/TsqFYFQVCw-800.avif 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/TsqFYFQVCw-400.webp 400w, https://voxihost.pl/assets/images/generated/TsqFYFQVCw-800.webp 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/TsqFYFQVCw-400.jpeg&quot; alt=&quot;Running the WireGuard install script again to open the management menu for adding more VPN clients&quot; width=&quot;800&quot; height=&quot;265&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/TsqFYFQVCw-400.jpeg 400w, https://voxihost.pl/assets/images/generated/TsqFYFQVCw-800.jpeg 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ./wireguard-install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because WireGuard is already installed, the script transforms cleanly into a management menu.&lt;/p&gt;
&lt;p&gt;Press &lt;code&gt;1&lt;/code&gt; to instantly generate another &lt;code&gt;.conf&lt;/code&gt; file and QR code.&lt;/p&gt;
&lt;p&gt;If you want a safe playground to test your WireGuard configuration, &lt;strong&gt;&lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt;&lt;/strong&gt; plans from &lt;strong&gt;&lt;span&gt;Voxi&lt;/span&gt;&lt;span&gt;Host&lt;/span&gt;&lt;/strong&gt; are a perfect starting point. You can deploy a fresh instance in seconds and start building your private network right away.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Set Up SSL with Let&#39;s Encrypt &amp; Certbot on Ubuntu &amp; Debian: The Complete Guide</title>
    <link href="https://voxihost.pl/blog/how-to-setup-ssl-letsencrypt-certbot-ubuntu-debian/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-setup-ssl-letsencrypt-certbot-ubuntu-debian/</id>
    <summary type="text">A complete beginner-friendly guide to securing your Nginx or Apache web server with free SSL/TLS certificates from Let&#39;s Encrypt using Certbot on Ubuntu and Debian.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;In the modern web, serving your website over plain HTTP is no longer acceptable. Browsers will aggressively warn users that your site is &amp;quot;Not Secure,&amp;quot; search engines like Google will heavily penalize your SEO rankings, and any submitted forms (like passwords or credit cards) will be transmitted in plain text for anyone to intercept.&lt;/p&gt;
&lt;p&gt;You need an SSL/TLS certificate to enable HTTPS. Years ago, this was an expensive and deeply frustrating process. Today, thanks to the non-profit &lt;strong&gt;Let&#39;s Encrypt&lt;/strong&gt; project and their automated client called &lt;strong&gt;Certbot&lt;/strong&gt;, you can get enterprise-grade, cryptographically secure certificates completely for free in about two minutes.&lt;/p&gt;
&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites &lt;/h2&gt;
&lt;p&gt;Before you begin, you must have two things in place:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;A web server with a configured domain block&lt;/strong&gt;: You must have either Nginx or Apache installed, and a Server Block (Nginx) or Virtual Host (Apache) officially configured for your domain name. If you haven&#39;t done this, check out our &lt;a href=&quot;https://voxihost.pl/blog/how-to-install-nginx-ubuntu-debian/&quot;&gt;Nginx installation guide&lt;/a&gt; or &lt;a href=&quot;https://voxihost.pl/blog/how-to-install-apache-ubuntu-debian/&quot;&gt;Apache installation guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proper DNS settings&lt;/strong&gt;: Your domain (e.g., &lt;code&gt;your_domain.com&lt;/code&gt; and &lt;code&gt;www.your_domain.com&lt;/code&gt;) must have &lt;code&gt;A&lt;/code&gt; records actively pointing to your server&#39;s public IP address. Certbot will fail if the domain doesn&#39;t resolve to your server.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;step-1-install-certbot&quot;&gt;Step 1: Install Certbot &lt;/h2&gt;
&lt;p&gt;Certbot is the tool that reaches out to the Let&#39;s Encrypt servers, proves you own the domain, downloads the certificates, and injects them directly into your web server&#39;s configuration files.&lt;/p&gt;
&lt;p&gt;First, update your package index:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, you need to install Certbot along with its plugin for your specific web server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you are using Nginx:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/qypg9-DZ1a-400.avif 400w, https://voxihost.pl/assets/images/generated/qypg9-DZ1a-800.avif 800w, https://voxihost.pl/assets/images/generated/qypg9-DZ1a-1594.avif 1594w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/qypg9-DZ1a-400.webp 400w, https://voxihost.pl/assets/images/generated/qypg9-DZ1a-800.webp 800w, https://voxihost.pl/assets/images/generated/qypg9-DZ1a-1594.webp 1594w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/qypg9-DZ1a-400.jpeg&quot; alt=&quot;Running sudo apt install certbot python3-certbot-nginx -y on Ubuntu/Debian - terminal output&quot; width=&quot;1594&quot; height=&quot;295&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/qypg9-DZ1a-400.jpeg 400w, https://voxihost.pl/assets/images/generated/qypg9-DZ1a-800.jpeg 800w, https://voxihost.pl/assets/images/generated/qypg9-DZ1a-1594.jpeg 1594w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install certbot python3-certbot-nginx -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;If you are using Apache:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install certbot python3-certbot-apache -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;step-2-confirm-firewall-settings&quot;&gt;Step 2: Confirm Firewall Settings &lt;/h2&gt;
&lt;p&gt;Certbot needs to communicate over HTTP (Port 80) to validate your domain, and your secure website will be served over HTTPS (Port 443).&lt;/p&gt;
&lt;p&gt;If you followed our &lt;a href=&quot;https://voxihost.pl/blog/how-to-configure-ufw-firewall-ubuntu-debian/&quot;&gt;UFW Firewall guide&lt;/a&gt;, you need to ensure the firewall is allowing this traffic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For Nginx:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you only see &lt;code&gt;Nginx HTTP&lt;/code&gt; allowed, you need to upgrade to &lt;code&gt;Nginx Full&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow &#39;Nginx Full&#39;
sudo ufw delete allow &#39;Nginx HTTP&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;For Apache:&lt;/strong&gt;&lt;br /&gt;
If you only see &lt;code&gt;Apache&lt;/code&gt; allowed in your &lt;code&gt;sudo ufw status&lt;/code&gt;, upgrade the profile:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow &#39;Apache Full&#39;
sudo ufw delete allow &#39;Apache&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;step-3-obtain-and-install-the-ssl-certificate&quot;&gt;Step 3: Obtain and Install the SSL Certificate &lt;/h2&gt;
&lt;p&gt;This is where the magic happens. By using the web server plugins you installed in Step 1, Certbot will handle the entire validation, downloading, and configuration process automatically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Run Certbot for Nginx:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Zfsu3Tp17e-400.avif 400w, https://voxihost.pl/assets/images/generated/Zfsu3Tp17e-732.avif 732w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Zfsu3Tp17e-400.webp 400w, https://voxihost.pl/assets/images/generated/Zfsu3Tp17e-732.webp 732w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/Zfsu3Tp17e-400.jpeg&quot; alt=&quot;Running sudo certbot --nginx -d your_domain.com -d www.your_domain.com on Ubuntu/Debian - terminal output&quot; width=&quot;732&quot; height=&quot;405&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Zfsu3Tp17e-400.jpeg 400w, https://voxihost.pl/assets/images/generated/Zfsu3Tp17e-732.jpeg 732w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot --nginx -d your_domain.com -d www.your_domain.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Run Certbot for Apache:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot --apache -d your_domain.com -d www.your_domain.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;the-certbot-prompts&quot;&gt;The Certbot Prompts &lt;/h3&gt;
&lt;p&gt;When you run the command for the first time, Certbot will ask you a series of questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Email Address&lt;/strong&gt;: You must provide a valid email address. Let&#39;s Encrypt uses this strictly to notify you of impending expirations (if auto-renewal fails) or major security events.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terms of Service&lt;/strong&gt;: Type &lt;code&gt;Y&lt;/code&gt; to agree to the Let&#39;s Encrypt TOS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EFF Mailing List&lt;/strong&gt;: Type &lt;code&gt;Y&lt;/code&gt; or &lt;code&gt;N&lt;/code&gt; based on whether you want promotional emails from the Electronic Frontier Foundation (the creators of Certbot).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Certbot will then communicate with the Let&#39;s Encrypt API and run a challenge to verify you actually control the domain.&lt;/p&gt;
&lt;p&gt;If it succeeds, it will automatically edit your Nginx &lt;code&gt;.conf&lt;/code&gt; or Apache Virtual Host file to enable HTTPS. Modern versions of Certbot will automatically configure your server to aggressively redirect all unencrypted HTTP traffic entirely to the secure HTTPS connection.&lt;/p&gt;
&lt;p&gt;When it finishes, navigate to &lt;code&gt;https://your_domain.com&lt;/code&gt; in your browser to verify the padlock icon appears!&lt;/p&gt;
&lt;h2 id=&quot;step-4-verify-auto-renewal&quot;&gt;Step 4: Verify Auto-Renewal &lt;/h2&gt;
&lt;p&gt;Let&#39;s Encrypt certificates are absolutely free, but to minimize the impact of stolen or abandoned certificates, they only last for &lt;strong&gt;90 days&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Thankfully, you never have to repeat Step 3. The &lt;code&gt;certbot&lt;/code&gt; package on Ubuntu and Debian installs a systemd timer (a background background scheduled task) that runs twice a day. It checks for any certificates expiring in the next 30 days and smoothly auto-renews them in the background without dropping web traffic.&lt;/p&gt;
&lt;p&gt;You can verify the timer is active by running:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/sHCaykt6YB-400.avif 400w, https://voxihost.pl/assets/images/generated/sHCaykt6YB-787.avif 787w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/sHCaykt6YB-400.webp 400w, https://voxihost.pl/assets/images/generated/sHCaykt6YB-787.webp 787w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/sHCaykt6YB-400.jpeg&quot; alt=&quot;Running sudo systemctl status certbot.timer on Ubuntu/Debian - terminal output&quot; width=&quot;787&quot; height=&quot;171&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/sHCaykt6YB-400.jpeg 400w, https://voxihost.pl/assets/images/generated/sHCaykt6YB-787.jpeg 787w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl status certbot.timer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should see &lt;code&gt;&amp;quot;Active: active (waiting)&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To test the renewal process and ensure there are no configuration errors blocking it, you can run a dry run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot renew --dry-run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the dry run finishes without any errors, you are successfully set up! Your server is now continuously and permanently secured.&lt;/p&gt;
&lt;p&gt;Need a blistering-fast environment ready to deploy secure web apps? Pick up an exceptionally affordable &lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt;, setup your Nginx block, slap a free SSL on it, and launch your project safely to the world.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Set Up Netdata for Real-Time VPS Monitoring</title>
    <link href="https://voxihost.pl/blog/how-to-setup-netdata-vps/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-setup-netdata-vps/</id>
    <summary type="text">A complete step-by-step guide to installing Netdata on your Linux VPS. Get highly detailed, beautiful real-time dashboard metrics for CPU, RAM, Network, and Disk in minutes.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;Command-line tools like &lt;a href=&quot;https://voxihost.pl/blog/how-to-monitor-vps-htop-df-free/&quot;&gt;&lt;code&gt;htop&lt;/code&gt; and &lt;code&gt;df&lt;/code&gt;&lt;/a&gt; are excellent for quick troubleshooting when you are currently logged into an SSH session. But what if you need historical graphs? What if you want to see exactly how your CPU reacted when a burst of traffic hit your website 2 hours ago?&lt;/p&gt;
&lt;p&gt;For that, you need a full monitoring suite.&lt;/p&gt;
&lt;p&gt;While enterprise teams rely on complex stacks like Prometheus and Grafana (which are tedious to set up and difficult to configure), there is a radically simpler, instantly beautiful alternative: &lt;strong&gt;Netdata&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Netdata installs in a single command, automatically detects all running services (like Nginx, Apache, MySQL, Docker), and instantly generates thousands of real-time metrics presented in a stunning web dashboard.&lt;/p&gt;
&lt;h2 id=&quot;step-1-install-netdata-using-the-kickstart-script&quot;&gt;Step 1: Install Netdata Using the Kickstart Script &lt;/h2&gt;
&lt;p&gt;Netdata provides an official, universally supported &amp;quot;kickstart&amp;quot; script. This handles identifying your OS architecture, downloading the required package dependencies, and installing the monitoring agent perfectly whether you are running Ubuntu, Debian, AlmaLinux, CentOS, or Fedora.&lt;/p&gt;
&lt;p&gt;First, download the script to a temporary folder and execute it:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/wK01_wIvs6-400.avif 400w, https://voxihost.pl/assets/images/generated/wK01_wIvs6-800.avif 800w, https://voxihost.pl/assets/images/generated/wK01_wIvs6-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/wK01_wIvs6-400.webp 400w, https://voxihost.pl/assets/images/generated/wK01_wIvs6-800.webp 800w, https://voxihost.pl/assets/images/generated/wK01_wIvs6-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/wK01_wIvs6-400.jpeg&quot; alt=&quot;Downloading and executing the Netdata kickstart installation script via wget on a Linux VPS&quot; width=&quot;1600&quot; height=&quot;544&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/wK01_wIvs6-400.jpeg 400w, https://voxihost.pl/assets/images/generated/wK01_wIvs6-800.jpeg 800w, https://voxihost.pl/assets/images/generated/wK01_wIvs6-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh &amp;amp;&amp;amp; sh /tmp/netdata-kickstart.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The script will prompt you for confirmation. Press &lt;code&gt;Y&lt;/code&gt; to confirm.&lt;/p&gt;
&lt;p&gt;It handles everything invisibly in the background. Once the installation is finished, Netdata automatically registers itself as a systemd service, starts running its daemons, and configures itself to boot whenever your server starts.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/vT43H7gySw-400.avif 400w, https://voxihost.pl/assets/images/generated/vT43H7gySw-800.avif 800w, https://voxihost.pl/assets/images/generated/vT43H7gySw-1029.avif 1029w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/vT43H7gySw-400.webp 400w, https://voxihost.pl/assets/images/generated/vT43H7gySw-800.webp 800w, https://voxihost.pl/assets/images/generated/vT43H7gySw-1029.webp 1029w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/vT43H7gySw-400.jpeg&quot; alt=&quot;Terminal output showing the successful installation of Netdata and its telemetry agents&quot; width=&quot;1029&quot; height=&quot;293&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/vT43H7gySw-400.jpeg 400w, https://voxihost.pl/assets/images/generated/vT43H7gySw-800.jpeg 800w, https://voxihost.pl/assets/images/generated/vT43H7gySw-1029.jpeg 1029w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;To verify it is running smoothly, check the service status:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/FeyFF7lMkf-400.avif 400w, https://voxihost.pl/assets/images/generated/FeyFF7lMkf-800.avif 800w, https://voxihost.pl/assets/images/generated/FeyFF7lMkf-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/FeyFF7lMkf-400.webp 400w, https://voxihost.pl/assets/images/generated/FeyFF7lMkf-800.webp 800w, https://voxihost.pl/assets/images/generated/FeyFF7lMkf-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/FeyFF7lMkf-400.jpeg&quot; alt=&quot;Running sudo systemctl status netdata to verify the Netdata daemon is actively running in the background&quot; width=&quot;1600&quot; height=&quot;465&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/FeyFF7lMkf-400.jpeg 400w, https://voxihost.pl/assets/images/generated/FeyFF7lMkf-800.jpeg 800w, https://voxihost.pl/assets/images/generated/FeyFF7lMkf-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl status netdata
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Look for &lt;code&gt;active (running)&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;step-2-configure-the-firewall&quot;&gt;Step 2: Configure the Firewall &lt;/h2&gt;
&lt;p&gt;Netdata creates a lightweight web server strictly for serving its dashboard. By default, this web server listens on &lt;strong&gt;Port 19999&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Because you are likely (and should be!) running a firewall, port 19999 is blocked from the public internet. You need to explicitly open it so you can reach the dashboard from your browser.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you are using &lt;a href=&quot;https://voxihost.pl/blog/how-to-configure-ufw-firewall-ubuntu-debian/&quot;&gt;UFW&lt;/a&gt; (Ubuntu/Debian):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 19999/tcp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;If you are using &lt;a href=&quot;https://voxihost.pl/blog/how-to-configure-firewalld-almalinux-centos-rocky-fedora/&quot;&gt;firewalld&lt;/a&gt; (AlmaLinux/CentOS/Fedora):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo firewall-cmd --permanent --add-port=19999/tcp
sudo firewall-cmd --reload
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;step-3-access-your-dashboard&quot;&gt;Step 3: Access Your Dashboard &lt;/h2&gt;
&lt;p&gt;You are completely set up!&lt;/p&gt;
&lt;p&gt;Open your favorite web browser and navigate to your server&#39;s public IP address, appending the &lt;code&gt;:19999&lt;/code&gt; port number.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http://your_server_ip:19999&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/_txrHqAHCk-400.avif 400w, https://voxihost.pl/assets/images/generated/_txrHqAHCk-800.avif 800w, https://voxihost.pl/assets/images/generated/_txrHqAHCk-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/_txrHqAHCk-400.webp 400w, https://voxihost.pl/assets/images/generated/_txrHqAHCk-800.webp 800w, https://voxihost.pl/assets/images/generated/_txrHqAHCk-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/_txrHqAHCk-400.jpeg&quot; alt=&quot;The beautifully graphed real-time Netdata visual monitoring dashboard loaded in a web browser on port 19999&quot; width=&quot;1600&quot; height=&quot;720&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/_txrHqAHCk-400.jpeg 400w, https://voxihost.pl/assets/images/generated/_txrHqAHCk-800.jpeg 800w, https://voxihost.pl/assets/images/generated/_txrHqAHCk-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;You will immediately be loaded directly into the Netdata Local Dashboard. No passwords, no configurations, no waiting.&lt;/p&gt;
&lt;p&gt;Scroll down the right-hand bar. Netdata will have already found and mapped graphs for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU usage by active core&lt;/li&gt;
&lt;li&gt;Hard drive I/O (read/write speeds)&lt;/li&gt;
&lt;li&gt;Total and available Memory (RAM) handling&lt;/li&gt;
&lt;li&gt;Network bandwidth interfaces&lt;/li&gt;
&lt;li&gt;Interrupts, IPv4 tracking, and even background container (Docker) statistics.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;security-note&quot;&gt;Security Note &lt;/h3&gt;
&lt;p&gt;By default, Netdata&#39;s local dashboard is accessible to anyone who has your server&#39;s IP address and knows to append &lt;code&gt;:19999&lt;/code&gt;. While they cannot see your passwords or private code, they &lt;em&gt;can&lt;/em&gt; map out what software you are running based on identifying the graphs (e.g., admitting you run MySQL to attackers).&lt;/p&gt;
&lt;p&gt;If you are running a production server, it is highly recommended to eventually bind Netdata strictly to &lt;code&gt;localhost&lt;/code&gt; and access it via a Reverse Proxy (using an Nginx Server Block) with a required password prompt (&lt;code&gt;htpasswd&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;However, for a fresh testing or development environment, leaving the port open is fine for rapid monitoring. If you want to dive into complex performance metrics or monitor massive database loads efficiently, grab a remarkably robust &lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt;, spin up some intense applications, install Netdata, and watch the graphs dance perfectly in real-time.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Set Up a LEMP Stack (Linux, Nginx, MariaDB, PHP) on Ubuntu &amp; Debian</title>
    <link href="https://voxihost.pl/blog/how-to-setup-lemp-stack-ubuntu-debian/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-setup-lemp-stack-ubuntu-debian/</id>
    <summary type="text">A complete step-by-step guide to installing the modern LEMP stack (Linux, Nginx, MariaDB, PHP-FPM) on a fresh Ubuntu or Debian server.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;The &lt;strong&gt;LEMP&lt;/strong&gt; stack is the modern, high-performance foundation for millions of websites worldwide. It is an acronym representing the four critical pieces of software required to host dynamic, database-driven applications (like WordPress or Laravel):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;L&lt;/strong&gt;inux: The operating system (Ubuntu or Debian).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E&lt;/strong&gt;Nginx (pronounced &lt;em&gt;Engine-X&lt;/em&gt;): The lightning-fast web server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;M&lt;/strong&gt;ariaDB: The community-driven, drop-in replacement for MySQL.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P&lt;/strong&gt;HP: The backend processing language.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Compared to the older LAMP (Apache) stack, LEMP is highly favored for environments handling heavy, concurrent traffic because of Nginx&#39;s asynchronous architecture.&lt;/p&gt;
&lt;h2 id=&quot;step-1-install-nginx-the-web-server&quot;&gt;Step 1: Install Nginx (The Web Server) &lt;/h2&gt;
&lt;p&gt;First, update your package index to ensure you are downloading the latest software versions.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt upgrade -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Install Nginx:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/flyXYXaMTF-400.avif 400w, https://voxihost.pl/assets/images/generated/flyXYXaMTF-731.avif 731w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/flyXYXaMTF-400.webp 400w, https://voxihost.pl/assets/images/generated/flyXYXaMTF-731.webp 731w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/flyXYXaMTF-400.jpeg&quot; alt=&quot;Running sudo apt install nginx -y on Ubuntu or Debian to install Nginx as part of the LEMP stack&quot; width=&quot;731&quot; height=&quot;258&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/flyXYXaMTF-400.jpeg 400w, https://voxihost.pl/assets/images/generated/flyXYXaMTF-731.jpeg 731w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install nginx -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you followed our &lt;a href=&quot;https://voxihost.pl/blog/how-to-configure-ufw-firewall-ubuntu-debian/&quot;&gt;UFW Firewall Guide&lt;/a&gt;, you need to allow Nginx traffic through the firewall. Open both HTTP (Port 80) and HTTPS (Port 443):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow &#39;Nginx Full&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can verify Nginx is running by typing your server&#39;s public IP address into your web browser. You should see the standard &lt;em&gt;&amp;quot;Welcome to nginx!&amp;quot;&lt;/em&gt; page.&lt;/p&gt;
&lt;h2 id=&quot;step-2-install-mariadb-the-database&quot;&gt;Step 2: Install MariaDB (The Database) &lt;/h2&gt;
&lt;p&gt;Now that you have a web server, you need a database system to store and manage your application&#39;s data. &lt;strong&gt;MariaDB&lt;/strong&gt; is a highly optimized, fully open-source fork of MySQL that is standard on modern Linux distributions.&lt;/p&gt;
&lt;p&gt;Install the MariaDB server:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/C8TGX2y75k-400.avif 400w, https://voxihost.pl/assets/images/generated/C8TGX2y75k-800.avif 800w, https://voxihost.pl/assets/images/generated/C8TGX2y75k-1597.avif 1597w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/C8TGX2y75k-400.webp 400w, https://voxihost.pl/assets/images/generated/C8TGX2y75k-800.webp 800w, https://voxihost.pl/assets/images/generated/C8TGX2y75k-1597.webp 1597w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/C8TGX2y75k-400.jpeg&quot; alt=&quot;Running sudo apt install mariadb-server mariadb-client -y on Ubuntu to install MariaDB as part of the LEMP stack&quot; width=&quot;1597&quot; height=&quot;458&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/C8TGX2y75k-400.jpeg 400w, https://voxihost.pl/assets/images/generated/C8TGX2y75k-800.jpeg 800w, https://voxihost.pl/assets/images/generated/C8TGX2y75k-1597.jpeg 1597w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install mariadb-server -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once installed, the database is active but completely unsecured. You need to lock it down using the built-in security script.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Z0fJPqCq08-400.avif 400w, https://voxihost.pl/assets/images/generated/Z0fJPqCq08-689.avif 689w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Z0fJPqCq08-400.webp 400w, https://voxihost.pl/assets/images/generated/Z0fJPqCq08-689.webp 689w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/Z0fJPqCq08-400.jpeg&quot; alt=&quot;Running sudo mysql_secure_installation on Ubuntu to remove anonymous users, disable remote root login, and secure MariaDB&quot; width=&quot;689&quot; height=&quot;942&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Z0fJPqCq08-400.jpeg 400w, https://voxihost.pl/assets/images/generated/Z0fJPqCq08-689.jpeg 689w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mysql_secure_installation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You will be asked a series of prompts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Current root password&lt;/strong&gt;: Press &lt;code&gt;Enter&lt;/code&gt; (there is no password yet).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Switch to unix_socket authentication&lt;/strong&gt;: Type &lt;code&gt;Y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change the root password&lt;/strong&gt;: Type &lt;code&gt;N&lt;/code&gt; (modern MariaDB secures the root user dynamically using your Linux &lt;code&gt;sudo&lt;/code&gt; privileges).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove anonymous users&lt;/strong&gt;: Type &lt;code&gt;Y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disallow root login remotely&lt;/strong&gt;: Type &lt;code&gt;Y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove test database&lt;/strong&gt;: Type &lt;code&gt;Y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reload privilege tables&lt;/strong&gt;: Type &lt;code&gt;Y&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Your database is now locked down and ready.&lt;/p&gt;
&lt;h2 id=&quot;step-3-install-php-the-processing-language&quot;&gt;Step 3: Install PHP (The Processing Language) &lt;/h2&gt;
&lt;p&gt;Nginx is incredibly fast at serving static files (HTML, images, CSS), but it cannot process dynamic PHP code natively the way Apache can.&lt;/p&gt;
&lt;p&gt;To process PHP, we must install &lt;strong&gt;PHP-FPM&lt;/strong&gt; (FastCGI Process Manager). Nginx will pass all &lt;code&gt;.php&lt;/code&gt; files it receives directly to this background processor. You also need the &lt;code&gt;php-mysql&lt;/code&gt; package so PHP can talk to your MariaDB database.&lt;/p&gt;
&lt;p&gt;Install both packages:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/C_LDdNO7b8-400.avif 400w, https://voxihost.pl/assets/images/generated/C_LDdNO7b8-800.avif 800w, https://voxihost.pl/assets/images/generated/C_LDdNO7b8-1272.avif 1272w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/C_LDdNO7b8-400.webp 400w, https://voxihost.pl/assets/images/generated/C_LDdNO7b8-800.webp 800w, https://voxihost.pl/assets/images/generated/C_LDdNO7b8-1272.webp 1272w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/C_LDdNO7b8-400.jpeg&quot; alt=&quot;Running sudo apt install php-fpm php-mysql to install PHP 8 with FPM and MySQL extension on Ubuntu for LEMP stack&quot; width=&quot;1272&quot; height=&quot;258&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/C_LDdNO7b8-400.jpeg 400w, https://voxihost.pl/assets/images/generated/C_LDdNO7b8-800.jpeg 800w, https://voxihost.pl/assets/images/generated/C_LDdNO7b8-1272.jpeg 1272w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install php-fpm php-mysql -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Note: Depending on your exact Debian/Ubuntu version, &lt;code&gt;apt&lt;/code&gt; will automatically install the correct PHP version (e.g., &lt;code&gt;php8.1-fpm&lt;/code&gt; or &lt;code&gt;php8.3-fpm&lt;/code&gt;). Make a mental note of which version it installs, as you&#39;ll need it in the next step.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;step-4-configure-nginx-to-use-php&quot;&gt;Step 4: Configure Nginx to use PHP &lt;/h2&gt;
&lt;p&gt;We need to explicitly tell Nginx how to handle PHP files.&lt;/p&gt;
&lt;p&gt;Let&#39;s assume you are configuring the default Nginx Server Block. Open the default configuration file in nano:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/OsqgtuaHxm-400.avif 400w, https://voxihost.pl/assets/images/generated/OsqgtuaHxm-800.avif 800w, https://voxihost.pl/assets/images/generated/OsqgtuaHxm-1487.avif 1487w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/OsqgtuaHxm-400.webp 400w, https://voxihost.pl/assets/images/generated/OsqgtuaHxm-800.webp 800w, https://voxihost.pl/assets/images/generated/OsqgtuaHxm-1487.webp 1487w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/OsqgtuaHxm-400.jpeg&quot; alt=&quot;Creating a new Nginx server block configuration file in sites-available for a custom domain on Ubuntu LEMP setup&quot; width=&quot;1487&quot; height=&quot;720&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/OsqgtuaHxm-400.jpeg 400w, https://voxihost.pl/assets/images/generated/OsqgtuaHxm-800.jpeg 800w, https://voxihost.pl/assets/images/generated/OsqgtuaHxm-1487.jpeg 1487w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nginx/sites-available/default
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Look for the &lt;code&gt;index&lt;/code&gt; directive. You need to add &lt;code&gt;index.php&lt;/code&gt; to the very beginning of the list, telling Nginx to prioritize PHP files over standard HTML files.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Add index.php before index.html
index index.php index.html index.htm index.nginx-debian.html;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, scroll down to the &lt;code&gt;location ~ &#92;.php$&lt;/code&gt; block. Uncomment (remove the &lt;code&gt;#&lt;/code&gt; symbol) from the relevant lines so it looks exactly like this. &lt;strong&gt;Make sure the &lt;code&gt;phpX.X-fpm.sock&lt;/code&gt; matches the version you installed in Step 3!&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;location ~ &#92;.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save the file and exit &lt;code&gt;nano&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Test your Nginx configuration for syntax errors:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/v2BE-QM8R--400.avif 400w, https://voxihost.pl/assets/images/generated/v2BE-QM8R--613.avif 613w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/v2BE-QM8R--400.webp 400w, https://voxihost.pl/assets/images/generated/v2BE-QM8R--613.webp 613w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/v2BE-QM8R--400.jpeg&quot; alt=&quot;Running sudo nginx -t to test Nginx server block configuration for syntax errors before enabling the LEMP site&quot; width=&quot;613&quot; height=&quot;83&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/v2BE-QM8R--400.jpeg 400w, https://voxihost.pl/assets/images/generated/v2BE-QM8R--613.jpeg 613w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nginx -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If it reports &lt;code&gt;syntax is ok&lt;/code&gt;, reload Nginx to apply the changes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;step-5-test-php-processing-on-nginx&quot;&gt;Step 5: Test PHP Processing on Nginx &lt;/h2&gt;
&lt;p&gt;To prove that Nginx is successfully handing off code to PHP-FPM, we will create a classic PHP info script.&lt;/p&gt;
&lt;p&gt;Create a new file in your web root directory:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/ZjBvsbfg23-400.avif 400w, https://voxihost.pl/assets/images/generated/ZjBvsbfg23-800.avif 800w, https://voxihost.pl/assets/images/generated/ZjBvsbfg23-1430.avif 1430w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/ZjBvsbfg23-400.webp 400w, https://voxihost.pl/assets/images/generated/ZjBvsbfg23-800.webp 800w, https://voxihost.pl/assets/images/generated/ZjBvsbfg23-1430.webp 1430w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/ZjBvsbfg23-400.jpeg&quot; alt=&quot;Creating a PHP info test file at /var/www/your_domain/info.php with nano to verify PHP-FPM on Nginx LEMP stack&quot; width=&quot;1430&quot; height=&quot;94&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/ZjBvsbfg23-400.jpeg 400w, https://voxihost.pl/assets/images/generated/ZjBvsbfg23-800.jpeg 800w, https://voxihost.pl/assets/images/generated/ZjBvsbfg23-1430.jpeg 1430w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /var/www/html/info.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Paste the following PHP code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
phpinfo();
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save and exit.&lt;/p&gt;
&lt;p&gt;Open your browser and navigate to: &lt;code&gt;http://your_server_ip/info.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/rRA98C5pVK-400.avif 400w, https://voxihost.pl/assets/images/generated/rRA98C5pVK-800.avif 800w, https://voxihost.pl/assets/images/generated/rRA98C5pVK-1576.avif 1576w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/rRA98C5pVK-400.webp 400w, https://voxihost.pl/assets/images/generated/rRA98C5pVK-800.webp 800w, https://voxihost.pl/assets/images/generated/rRA98C5pVK-1576.webp 1576w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/rRA98C5pVK-400.jpeg&quot; alt=&quot;phpinfo() page rendering in browser confirming PHP is working correctly with Nginx and MariaDB on the LEMP stack&quot; width=&quot;1576&quot; height=&quot;1023&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/rRA98C5pVK-400.jpeg 400w, https://voxihost.pl/assets/images/generated/rRA98C5pVK-800.jpeg 800w, https://voxihost.pl/assets/images/generated/rRA98C5pVK-1576.jpeg 1576w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;You should see a massive, detailed purple and gray table outlining your server&#39;s exact PHP configuration and modules. This proves your complete LEMP stack is functioning perfectly!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Crucial Warning:&lt;/strong&gt; Delete this file immediately. Leaving it publicly accessible exposes extremely sensitive information about your server&#39;s configuration to hackers.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo rm /var/www/html/info.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Your server is now a fully powered production machine. Ready to host millions of hits? Deploy an intensely fast &lt;a href=&quot;https://voxihost.pl/premium-vps/&quot;&gt;Premium VPS&lt;/a&gt;, install your LEMP stack, get a &lt;a href=&quot;https://voxihost.pl/blog/how-to-setup-ssl-letsencrypt-certbot-ubuntu-debian/&quot;&gt;free Let&#39;s Encrypt SSL&lt;/a&gt;, and launch your database-driven application directly to the world.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Set Up a LAMP Stack (Linux, Apache, MySQL, PHP) on Ubuntu &amp; Debian</title>
    <link href="https://voxihost.pl/blog/how-to-setup-lamp-stack-ubuntu-debian/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-setup-lamp-stack-ubuntu-debian/</id>
    <summary type="text">A comprehensive beginner-friendly guide to installing the tried-and-true LAMP stack (Linux, Apache2, MySQL, PHP) on Ubuntu and Debian.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;The &lt;strong&gt;LAMP&lt;/strong&gt; stack is the undisputed grandfather of open-source web hosting. For decades, it has been the most reliable, thoroughly documented, and widespread foundation for hosting dynamic web applications like WordPress, Drupal, and Joomla.&lt;/p&gt;
&lt;p&gt;LAMP stands for four components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;L&lt;/strong&gt;inux: The operating system (Ubuntu or Debian).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A&lt;/strong&gt;pache: The incredibly robust, highly customizable web server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;M&lt;/strong&gt;ySQL: The most popular relational database management system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P&lt;/strong&gt;HP: The server-side scripting language handling the backend logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Compared to the newer LEMP (Nginx) stack, LAMP remains universally beloved because Apache processes PHP dynamically natively (no need to configure external FPM sockets) and relies on highly flexible &lt;code&gt;.htaccess&lt;/code&gt; files for easy, per-directory configuration overrides.&lt;/p&gt;
&lt;h2 id=&quot;step-1-install-apache-the-web-server&quot;&gt;Step 1: Install Apache (The Web Server) &lt;/h2&gt;
&lt;p&gt;Before installing any software, always update your local package indexes so you are downloading the latest security patches.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt upgrade -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, install the Apache web server (the package is named &lt;code&gt;apache2&lt;/code&gt; on Debian/Ubuntu systems):&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/1KBdco9Wxt-400.avif 400w, https://voxihost.pl/assets/images/generated/1KBdco9Wxt-800.avif 800w, https://voxihost.pl/assets/images/generated/1KBdco9Wxt-1573.avif 1573w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/1KBdco9Wxt-400.webp 400w, https://voxihost.pl/assets/images/generated/1KBdco9Wxt-800.webp 800w, https://voxihost.pl/assets/images/generated/1KBdco9Wxt-1573.webp 1573w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/1KBdco9Wxt-400.jpeg&quot; alt=&quot;Running sudo apt install apache2 -y to start Apache installation&quot; width=&quot;1573&quot; height=&quot;330&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/1KBdco9Wxt-400.jpeg 400w, https://voxihost.pl/assets/images/generated/1KBdco9Wxt-800.jpeg 800w, https://voxihost.pl/assets/images/generated/1KBdco9Wxt-1573.jpeg 1573w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install apache2 -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you are running the &lt;code&gt;ufw&lt;/code&gt; firewall (which you should be, per our &lt;a href=&quot;https://voxihost.pl/blog/how-to-configure-ufw-firewall-ubuntu-debian/&quot;&gt;Security Guide&lt;/a&gt;), you need to allow Apache traffic to pass through. You want to open both HTTP (Port 80) and HTTPS (Port 443).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow &#39;Apache Full&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To verify your web server is alive, type your server&#39;s public IP address into your favorite web browser (&lt;code&gt;http://your_server_ip&lt;/code&gt;). You should see the default &lt;em&gt;&amp;quot;Apache2 Ubuntu Default Page&amp;quot;&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;step-2-install-mysql-the-database&quot;&gt;Step 2: Install MySQL (The Database) &lt;/h2&gt;
&lt;p&gt;Your server can serve static HTML now, but to store application data (like user accounts, blog posts, and settings), you need a database.&lt;/p&gt;
&lt;p&gt;Install the official MySQL server:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/ETbrP-60i6-400.avif 400w, https://voxihost.pl/assets/images/generated/ETbrP-60i6-800.avif 800w, https://voxihost.pl/assets/images/generated/ETbrP-60i6-1573.avif 1573w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/ETbrP-60i6-400.webp 400w, https://voxihost.pl/assets/images/generated/ETbrP-60i6-800.webp 800w, https://voxihost.pl/assets/images/generated/ETbrP-60i6-1573.webp 1573w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/ETbrP-60i6-400.jpeg&quot; alt=&quot;Running sudo apt install mysql-server -y to start MySQL installation&quot; width=&quot;1573&quot; height=&quot;370&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/ETbrP-60i6-400.jpeg 400w, https://voxihost.pl/assets/images/generated/ETbrP-60i6-800.jpeg 800w, https://voxihost.pl/assets/images/generated/ETbrP-60i6-1573.jpeg 1573w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install mysql-server -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once the installation finishes, the database is running but its default configuration is dangerously open. You must lock it down using the interactive security script:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/sGuMxckyKJ-400.avif 400w, https://voxihost.pl/assets/images/generated/sGuMxckyKJ-800.avif 800w, https://voxihost.pl/assets/images/generated/sGuMxckyKJ-1029.avif 1029w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/sGuMxckyKJ-400.webp 400w, https://voxihost.pl/assets/images/generated/sGuMxckyKJ-800.webp 800w, https://voxihost.pl/assets/images/generated/sGuMxckyKJ-1029.webp 1029w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/sGuMxckyKJ-400.jpeg&quot; alt=&quot;Running sudo mysql_secure_installation to secure MySQL installation&quot; width=&quot;1029&quot; height=&quot;944&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/sGuMxckyKJ-400.jpeg 400w, https://voxihost.pl/assets/images/generated/sGuMxckyKJ-800.jpeg 800w, https://voxihost.pl/assets/images/generated/sGuMxckyKJ-1029.jpeg 1029w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mysql_secure_installation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You will be asked several questions to configure the security profile:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Validate Password Plugin&lt;/strong&gt;: Type &lt;code&gt;y&lt;/code&gt; if you want MySQL to actively block weak passwords, or &lt;code&gt;n&lt;/code&gt; to skip it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove anonymous users&lt;/strong&gt;: Type &lt;code&gt;y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disallow root login remotely&lt;/strong&gt;: Type &lt;code&gt;y&lt;/code&gt; (root should only ever access the database from &lt;em&gt;inside&lt;/em&gt; the server).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove test database&lt;/strong&gt;: Type &lt;code&gt;y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reload privilege tables&lt;/strong&gt;: Type &lt;code&gt;y&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;MySQL is now secure.&lt;/p&gt;
&lt;h2 id=&quot;step-3-install-php&quot;&gt;Step 3: Install PHP &lt;/h2&gt;
&lt;p&gt;You have a web server and a database, but they cannot communicate with each other yet, nor can they process dynamic code. You need PHP.&lt;/p&gt;
&lt;p&gt;For Apache, installing PHP requires three main packages: the core &lt;code&gt;php&lt;/code&gt; package, the &lt;code&gt;php-mysql&lt;/code&gt; extension allowing PHP scripts to talk to your database, and the vital &lt;code&gt;libapache2-mod-php&lt;/code&gt; package, which magically binds PHP processing directly into the Apache runtime.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/g1677eDr3X-400.avif 400w, https://voxihost.pl/assets/images/generated/g1677eDr3X-800.avif 800w, https://voxihost.pl/assets/images/generated/g1677eDr3X-1416.avif 1416w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/g1677eDr3X-400.webp 400w, https://voxihost.pl/assets/images/generated/g1677eDr3X-800.webp 800w, https://voxihost.pl/assets/images/generated/g1677eDr3X-1416.webp 1416w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/g1677eDr3X-400.jpeg&quot; alt=&quot;Running sudo apt install php libapache2-mod-php php-mysql -y to start PHP installation&quot; width=&quot;1416&quot; height=&quot;258&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/g1677eDr3X-400.jpeg 400w, https://voxihost.pl/assets/images/generated/g1677eDr3X-800.jpeg 800w, https://voxihost.pl/assets/images/generated/g1677eDr3X-1416.jpeg 1416w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install php libapache2-mod-php php-mysql -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;step-4-configure-apache-index-priorities&quot;&gt;Step 4: Configure Apache Index Priorities &lt;/h2&gt;
&lt;p&gt;When a user visits a directory on your website (like &lt;code&gt;yoursite.com/blog/&lt;/code&gt;), Apache automatically looks for a default &amp;quot;index&amp;quot; file to serve. By default, it looks for &lt;code&gt;index.html&lt;/code&gt; first, and if it doesn&#39;t find it, it eventually looks for &lt;code&gt;index.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For dynamic applications, we want Apache to prioritize &lt;code&gt;index.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/b5ss5H06_I-400.avif 400w, https://voxihost.pl/assets/images/generated/b5ss5H06_I-800.avif 800w, https://voxihost.pl/assets/images/generated/b5ss5H06_I-1486.avif 1486w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/b5ss5H06_I-400.webp 400w, https://voxihost.pl/assets/images/generated/b5ss5H06_I-800.webp 800w, https://voxihost.pl/assets/images/generated/b5ss5H06_I-1486.webp 1486w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/b5ss5H06_I-400.jpeg&quot; alt=&quot;Running sudo nano /etc/apache2/mods-enabled/dir.conf to open the dir.conf file&quot; width=&quot;1486&quot; height=&quot;51&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/b5ss5H06_I-400.jpeg 400w, https://voxihost.pl/assets/images/generated/b5ss5H06_I-800.jpeg 800w, https://voxihost.pl/assets/images/generated/b5ss5H06_I-1486.jpeg 1486w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Open the &lt;code&gt;dir.conf&lt;/code&gt; file in the nano text editor:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/apache2/mods-enabled/dir.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It will look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule mod_dir.c&amp;gt;
    DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Move the &lt;code&gt;index.php&lt;/code&gt; string from the middle of the list directly to the first position, immediately after &lt;code&gt;DirectoryIndex&lt;/code&gt;, so it looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule mod_dir.c&amp;gt;
    DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save and exit &lt;code&gt;nano&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Whenever you alter Apache&#39;s configuration modules, you inherently must restart the web server for the changes to take effect:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;step-5-test-the-lamp-stack&quot;&gt;Step 5: Test the LAMP Stack &lt;/h2&gt;
&lt;p&gt;Your environment is complete! However, the golden rule of system administration is to verify your work. We are going to write a tiny PHP script to prove that Apache can process dynamic code.&lt;/p&gt;
&lt;p&gt;Create a new file in Apache&#39;s default web root directory:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /var/www/html/info.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Paste the standard initialization function:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
phpinfo();
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save the file. Open your web browser and navigate to &lt;code&gt;http://your_server_ip/info.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/8gxPa22zqU-400.avif 400w, https://voxihost.pl/assets/images/generated/8gxPa22zqU-800.avif 800w, https://voxihost.pl/assets/images/generated/8gxPa22zqU-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/8gxPa22zqU-400.webp 400w, https://voxihost.pl/assets/images/generated/8gxPa22zqU-800.webp 800w, https://voxihost.pl/assets/images/generated/8gxPa22zqU-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/8gxPa22zqU-400.jpeg&quot; alt=&quot;Running sudo systemctl status apache2 on Ubuntu to verify Apache is active after completing the full LAMP stack installation&quot; width=&quot;1600&quot; height=&quot;1000&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/8gxPa22zqU-400.jpeg 400w, https://voxihost.pl/assets/images/generated/8gxPa22zqU-800.jpeg 800w, https://voxihost.pl/assets/images/generated/8gxPa22zqU-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;If the installation was successful, you will be greeted by a massive, highly detailed table detailing your PHP version, installed modules, memory limits, and Apache integration settings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Critical Security Warning:&lt;/strong&gt; The &lt;code&gt;info.php&lt;/code&gt; page contains an extensive roadmap of your internal server architecture. Leaving this file public is a massive security risk. Once you have confirmed the stack works, &lt;strong&gt;delete the file immediately&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo rm /var/www/html/info.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Congratulations! You have successfully built a tried, tested, and rock-solid foundation for hosting on Linux. Do you have a heavy e-commerce site, forum, or high-traffic blog ready to launch? Pair your new LAMP stack with one of our high-tier &lt;a href=&quot;https://voxihost.pl/premium-vps/&quot;&gt;Premium VPS&lt;/a&gt; environments or a highly cost-effective &lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt;, install a &lt;a href=&quot;https://voxihost.pl/blog/how-to-setup-ssl-letsencrypt-certbot-ubuntu-debian/&quot;&gt;free SSL via Certbot&lt;/a&gt;, and build the ultimate web experience.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Set Up fail2ban on Ubuntu &amp; Debian: The Complete Server Guide</title>
    <link href="https://voxihost.pl/blog/how-to-setup-fail2ban-ubuntu-debian/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-setup-fail2ban-ubuntu-debian/</id>
    <summary type="text">A complete guide to installing and configuring fail2ban on Ubuntu and Debian servers. Protect SSH and web services from brute-force attacks with automatic IP banning, custom jails, and ufw integration.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;fail2ban watches your auth logs and bans IP addresses that rack up too many failed login attempts. It&#39;s one of those tools that runs quietly in the background and only makes itself known when you check the ban list and realize it&#39;s blocked hundreds of addresses that were hammering your SSH port.&lt;/p&gt;
&lt;p&gt;It&#39;s not a silver bullet, if you&#39;ve already set up SSH key auth with passwords disabled, brute-force attacks against SSH are already useless. But fail2ban covers everything else: web services, mail servers, any application that logs authentication failures. And for servers where password auth is still in use for some services, it&#39;s a practical first line of defense.&lt;/p&gt;
&lt;p&gt;fail2ban is often not installed by default on fresh Linux images, though premium providers like &lt;strong&gt;&lt;span&gt;Voxi&lt;/span&gt;&lt;span&gt;Host&lt;/span&gt;&lt;/strong&gt; pre-install it on their templates with a sensible baseline configuration. If you need to install it from scratch or tune it for your specific setup, this guide covers that too.&lt;/p&gt;
&lt;h2 id=&quot;installing-fail2ban&quot;&gt;Installing fail2ban &lt;/h2&gt;
&lt;p&gt;If it&#39;s not already installed:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/urOP1Xak19-400.avif 400w, https://voxihost.pl/assets/images/generated/urOP1Xak19-576.avif 576w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/urOP1Xak19-400.webp 400w, https://voxihost.pl/assets/images/generated/urOP1Xak19-576.webp 576w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/urOP1Xak19-400.jpeg&quot; alt=&quot;Running sudo apt install fail2ban -y on Ubuntu or Debian to install fail2ban from the apt repository&quot; width=&quot;576&quot; height=&quot;168&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/urOP1Xak19-400.jpeg 400w, https://voxihost.pl/assets/images/generated/urOP1Xak19-576.jpeg 576w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install fail2ban -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once installed, the service starts automatically. Verify:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/HOB5qSUrU5-400.avif 400w, https://voxihost.pl/assets/images/generated/HOB5qSUrU5-800.avif 800w, https://voxihost.pl/assets/images/generated/HOB5qSUrU5-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/HOB5qSUrU5-400.webp 400w, https://voxihost.pl/assets/images/generated/HOB5qSUrU5-800.webp 800w, https://voxihost.pl/assets/images/generated/HOB5qSUrU5-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/HOB5qSUrU5-400.jpeg&quot; alt=&quot;Running sudo systemctl status fail2ban on Ubuntu to verify the fail2ban service is active and running&quot; width=&quot;1600&quot; height=&quot;290&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/HOB5qSUrU5-400.jpeg 400w, https://voxihost.pl/assets/images/generated/HOB5qSUrU5-800.jpeg 800w, https://voxihost.pl/assets/images/generated/HOB5qSUrU5-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl status fail2ban
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;configuring-fail2ban-jails&quot;&gt;Configuring fail2ban jails &lt;/h2&gt;
&lt;p&gt;fail2ban works through &amp;quot;jails&amp;quot;, each jail monitors a specific log file for a specific failure pattern, and bans IPs that exceed the threshold.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Never edit &lt;code&gt;/etc/fail2ban/jail.conf&lt;/code&gt; directly.&lt;/strong&gt; That file gets overwritten on updates. Instead, create a local override:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now edit &lt;code&gt;jail.local&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/fail2ban/jail.local
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;global-defaults&quot;&gt;Global defaults &lt;/h3&gt;
&lt;p&gt;At the top of the file, set global defaults that apply to all jails:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[DEFAULT]
# IP whitelist, never ban these
ignoreip = 127.0.0.1/8 ::1 YOUR.HOME.IP.ADDRESS

# Ban duration in seconds (3600 = 1 hour, -1 = permanent)
bantime = 3600

# Time window to count failures in
findtime = 600

# How many failures before a ban
maxretry = 5

# Use systemd journal backend (better on modern Ubuntu/Debian)
backend = systemd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add your home or office IP to &lt;code&gt;ignoreip&lt;/code&gt;, you don&#39;t want to lock yourself out after mistyping your password a few times.&lt;/p&gt;
&lt;h3 id=&quot;ssh-jail&quot;&gt;SSH jail &lt;/h3&gt;
&lt;p&gt;Scroll down to find the &lt;code&gt;[sshd]&lt;/code&gt; section, or add it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[sshd]
enabled = true
port = ssh
# If you changed the SSH port, put the new port here:
# port = 2222
filter = sshd
logpath = %(sshd_log)s
maxretry = 3
bantime = 86400
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A shorter &lt;code&gt;maxretry&lt;/code&gt; and longer &lt;code&gt;bantime&lt;/code&gt; than the global defaults are reasonable for SSH, three failed attempts in the window bans for a full day.&lt;/p&gt;
&lt;h2 id=&quot;integrating-with-ufw&quot;&gt;Integrating with ufw &lt;/h2&gt;
&lt;p&gt;By default, fail2ban uses &lt;code&gt;iptables&lt;/code&gt; to ban IPs. If you&#39;re running &lt;code&gt;ufw&lt;/code&gt;, tell fail2ban to use it instead for consistency:&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;jail.local&lt;/code&gt; under &lt;code&gt;[DEFAULT]&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;banaction = ufw
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This inserts &lt;code&gt;ufw&lt;/code&gt; deny rules for banned IPs, which plays nicely with your existing firewall config.&lt;/p&gt;
&lt;h2 id=&quot;enabling-and-verifying-fail2ban&quot;&gt;Enabling and verifying fail2ban &lt;/h2&gt;
&lt;p&gt;Reload fail2ban to apply your config changes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart fail2ban
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check the status of the SSH jail specifically:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/OzeFJ5kxS0-400.avif 400w, https://voxihost.pl/assets/images/generated/OzeFJ5kxS0-584.avif 584w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/OzeFJ5kxS0-400.webp 400w, https://voxihost.pl/assets/images/generated/OzeFJ5kxS0-584.webp 584w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/OzeFJ5kxS0-400.jpeg&quot; alt=&quot;Running sudo fail2ban-client status sshd to check how many IPs are banned in the SSH jail&quot; width=&quot;584&quot; height=&quot;210&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/OzeFJ5kxS0-400.jpeg 400w, https://voxihost.pl/assets/images/generated/OzeFJ5kxS0-584.jpeg 584w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo fail2ban-client status sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&#39;ll see something like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed: 47
|  `- File list: /var/log/auth.log
`- Actions
   |- Currently banned: 3
   |- Total banned: 12
   `- Banned IP list: 203.0.113.1 198.51.100.5 ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That &amp;quot;currently banned&amp;quot; and &amp;quot;total banned&amp;quot; count are your proof it&#39;s working.&lt;/p&gt;
&lt;h2 id=&quot;unbanning-an-ip&quot;&gt;Unbanning an IP &lt;/h2&gt;
&lt;p&gt;If you accidentally ban yourself or a legitimate user:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo fail2ban-client set sshd unbanip 203.0.113.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace the IP with the one you need to unban. Changes take effect immediately, no restart required.&lt;/p&gt;
&lt;h2 id=&quot;checking-the-fail2ban-log&quot;&gt;Checking the fail2ban log &lt;/h2&gt;
&lt;p&gt;See what fail2ban has been doing:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tail -f /var/log/fail2ban.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&#39;ll see entries for each ban and unban action in real time. On a public-facing server, the log fills up quickly. If you see thousands of attempts from the same subnet, that&#39;s a hint to ban the whole subnet range manually through ufw rather than letting fail2ban handle individual IPs.&lt;/p&gt;
&lt;h2 id=&quot;protecting-nginx-and-apache&quot;&gt;Protecting Nginx and Apache &lt;/h2&gt;
&lt;p&gt;fail2ban ships with filters for common web services. To add Nginx protection:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5

[nginx-limit-req]
enabled = true
filter = nginx-limit-req
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For Apache:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[apache-auth]
enabled = true
filter = apache-auth
port = http,https
logpath = /var/log/apache2/error.log
maxretry = 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After adding jails, restart fail2ban:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart fail2ban
sudo fail2ban-client status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The last command shows all active jails and their ban counts.&lt;/p&gt;
&lt;p&gt;If you want a clean VPS to test fail2ban on before rolling it out to production, our &lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt; plans are cheap enough to run through the whole setup without risk.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Set Up fail2ban on AlmaLinux, CentOS, Rocky Linux &amp; Fedora: The Complete Server Guide</title>
    <link href="https://voxihost.pl/blog/how-to-setup-fail2ban-almalinux-centos-rocky-fedora/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-setup-fail2ban-almalinux-centos-rocky-fedora/</id>
    <summary type="text">A complete guide to installing and configuring fail2ban on AlmaLinux, CentOS Stream, Rocky Linux, and Fedora servers. Protect SSH and web services from brute-force attacks with automatic IP banning and firewalld integration.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;fail2ban monitors authentication logs and automatically bans IP addresses that accumulate too many failed login attempts. On a server with a public IP, it quietly blocks hundreds of automated scanners that would otherwise churn through your ports looking for weak credentials.&lt;/p&gt;
&lt;p&gt;For servers running AlmaLinux, CentOS Stream, Rocky Linux, or Fedora, the setup is almost identical to any other Linux system. The one meaningful difference is the firewall backend: these distros use &lt;code&gt;firewalld&lt;/code&gt;, and fail2ban needs to know that so it inserts bans through &lt;code&gt;firewalld&lt;/code&gt; rather than attempting raw &lt;code&gt;iptables&lt;/code&gt; commands that might conflict.&lt;/p&gt;
&lt;p&gt;While premium providers like &lt;strong&gt;&lt;span&gt;Voxi&lt;/span&gt;&lt;span&gt;Host&lt;/span&gt;&lt;/strong&gt; pre-install fail2ban on their templates with a working baseline configuration, most default Linux images do not. This guide walks through installing and tuning it for your specific needs.&lt;/p&gt;
&lt;h2 id=&quot;installing-fail2ban&quot;&gt;Installing fail2ban &lt;/h2&gt;
&lt;p&gt;On RHEL-based systems, fail2ban is available from EPEL (Extra Packages for Enterprise Linux). If it&#39;s not already installed:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/LeXS1CGtLa-400.avif 400w, https://voxihost.pl/assets/images/generated/LeXS1CGtLa-800.avif 800w, https://voxihost.pl/assets/images/generated/LeXS1CGtLa-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/LeXS1CGtLa-400.webp 400w, https://voxihost.pl/assets/images/generated/LeXS1CGtLa-800.webp 800w, https://voxihost.pl/assets/images/generated/LeXS1CGtLa-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/LeXS1CGtLa-400.jpeg&quot; alt=&quot;Running sudo dnf install epel-release -y command on AlmaLinux, CentOS, Rocky Linux &amp;amp; Fedora to install epel-release&quot; width=&quot;1600&quot; height=&quot;592&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/LeXS1CGtLa-400.jpeg 400w, https://voxihost.pl/assets/images/generated/LeXS1CGtLa-800.jpeg 800w, https://voxihost.pl/assets/images/generated/LeXS1CGtLa-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf install epel-release -y
sudo dnf install fail2ban -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On Fedora, it&#39;s in the main repos:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf install fail2ban -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enable and start it:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/kGNO3PUpp4-400.avif 400w, https://voxihost.pl/assets/images/generated/kGNO3PUpp4-800.avif 800w, https://voxihost.pl/assets/images/generated/kGNO3PUpp4-1127.avif 1127w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/kGNO3PUpp4-400.webp 400w, https://voxihost.pl/assets/images/generated/kGNO3PUpp4-800.webp 800w, https://voxihost.pl/assets/images/generated/kGNO3PUpp4-1127.webp 1127w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/kGNO3PUpp4-400.jpeg&quot; alt=&quot;Running sudo systemctl enable --now fail2ban command on AlmaLinux, CentOS, Rocky Linux &amp;amp; Fedora to enable and start fail2ban&quot; width=&quot;1127&quot; height=&quot;68&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/kGNO3PUpp4-400.jpeg 400w, https://voxihost.pl/assets/images/generated/kGNO3PUpp4-800.jpeg 800w, https://voxihost.pl/assets/images/generated/kGNO3PUpp4-1127.jpeg 1127w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now fail2ban
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;configuring-fail2ban-jails&quot;&gt;Configuring fail2ban jails &lt;/h2&gt;
&lt;p&gt;fail2ban&#39;s behavior is controlled by &amp;quot;jails&amp;quot;, each one watches a specific log for failure patterns and bans offending IPs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&#39;t edit &lt;code&gt;/etc/fail2ban/jail.conf&lt;/code&gt; directly.&lt;/strong&gt; Package updates overwrite it. Create a local override instead:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;global-defaults&quot;&gt;Global defaults &lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[DEFAULT]
# Never ban these IPs
ignoreip = 127.0.0.1/8 ::1 YOUR.HOME.IP.ADDRESS

# Ban duration in seconds (86400 = 24 hours, -1 = permanent)
bantime = 3600

# Window to count failures in
findtime = 600

# Failures before ban
maxretry = 5

# Use systemd journal (correct backend for these distros)
backend = systemd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add your home IP to &lt;code&gt;ignoreip&lt;/code&gt;, saves you from a frustrating self-lockout.&lt;/p&gt;
&lt;h2 id=&quot;firewalld-integration&quot;&gt;firewalld integration &lt;/h2&gt;
&lt;p&gt;This is the critical difference from Debian-based systems. fail2ban defaults to &lt;code&gt;iptables&lt;/code&gt;, which conflicts with &lt;code&gt;firewalld&lt;/code&gt;. Set the correct backend:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[DEFAULT]
# Use firewalld for banning (required on RHEL/Fedora)
banaction = firewallcmd-ipset
banaction_allports = firewallcmd-allports
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Without this, fail2ban may appear to work but won&#39;t actually be blocking anything, or will create iptables rules that firewalld ignores.&lt;/p&gt;
&lt;h3 id=&quot;ssh-jail&quot;&gt;SSH jail &lt;/h3&gt;
&lt;p&gt;Find or add the &lt;code&gt;[sshd]&lt;/code&gt; section:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[sshd]
enabled = true
port = ssh
# If you changed the SSH port:
# port = 2222
filter = sshd
logpath = %(sshd_log)s
maxretry = 3
bantime = 86400
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Three strikes and you&#39;re out for 24 hours is a reasonable policy for SSH.&lt;/p&gt;
&lt;h2 id=&quot;enabling-and-verifying-fail2ban&quot;&gt;Enabling and verifying fail2ban &lt;/h2&gt;
&lt;p&gt;Apply the configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart fail2ban
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check the SSH jail status:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/vNt3OCQzsn-400.avif 400w, https://voxihost.pl/assets/images/generated/vNt3OCQzsn-800.avif 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/vNt3OCQzsn-400.webp 400w, https://voxihost.pl/assets/images/generated/vNt3OCQzsn-800.webp 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/vNt3OCQzsn-400.jpeg&quot; alt=&quot;Running sudo fail2ban-client status sshd command on AlmaLinux, CentOS, Rocky Linux &amp;amp; Fedora to check the SSH jail status&quot; width=&quot;800&quot; height=&quot;198&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/vNt3OCQzsn-400.jpeg 400w, https://voxihost.pl/assets/images/generated/vNt3OCQzsn-800.jpeg 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo fail2ban-client status sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Expected output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed: 34
|  `- Journal matches: _SYSTEMD_UNIT=sshd.service
`- Actions
   |- Currently banned: 2
   |- Total banned: 8
   `- Banned IP list: 203.0.113.45 198.51.100.12
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If &lt;code&gt;Currently banned&lt;/code&gt; is non-zero, something already tried and failed against your SSH. Good, it&#39;s working.&lt;/p&gt;
&lt;p&gt;Verify that firewalld is actually enforcing the bans:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo firewall-cmd --list-rich-rules | grep fail2ban
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should see &lt;code&gt;fail2ban-sshd&lt;/code&gt; rules listed. If that command returns nothing, the &lt;code&gt;banaction&lt;/code&gt; wasn&#39;t set correctly, go back and check &lt;code&gt;jail.local&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;unbanning-an-ip&quot;&gt;Unbanning an IP &lt;/h2&gt;
&lt;p&gt;To remove a specific ban immediately:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo fail2ban-client set sshd unbanip 203.0.113.45
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No restart needed. The firewalld rule is removed on the spot.&lt;/p&gt;
&lt;h2 id=&quot;checking-the-logs&quot;&gt;Checking the logs &lt;/h2&gt;
&lt;p&gt;Watch what fail2ban is doing in real time:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tail -f /var/log/fail2ban.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On a public server you&#39;ll see this fill up quickly. Ban events, unban events, and occasionally errors if something is misconfigured. If you stopped seeing bans but know SSH is still getting hammered, check whether fail2ban is still running:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/W9Cl0JAAyS-400.avif 400w, https://voxihost.pl/assets/images/generated/W9Cl0JAAyS-800.avif 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/W9Cl0JAAyS-400.webp 400w, https://voxihost.pl/assets/images/generated/W9Cl0JAAyS-800.webp 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/W9Cl0JAAyS-400.jpeg&quot; alt=&quot;Running sudo systemctl status fail2ban command on AlmaLinux, CentOS, Rocky Linux &amp;amp; Fedora to check the fail2ban status&quot; width=&quot;800&quot; height=&quot;318&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/W9Cl0JAAyS-400.jpeg 400w, https://voxihost.pl/assets/images/generated/W9Cl0JAAyS-800.jpeg 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl status fail2ban
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;protecting-web-services&quot;&gt;Protecting web services &lt;/h2&gt;
&lt;p&gt;fail2ban ships with filters for Nginx and Apache. Add jails for them:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5

[nginx-limit-req]
enabled = true
filter = nginx-limit-req
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Restart after adding jails:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart fail2ban
sudo fail2ban-client status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;status&lt;/code&gt; command shows all active jails. Each one you&#39;ve enabled should appear with its own counter.&lt;/p&gt;
&lt;h2 id=&quot;selinux-note&quot;&gt;SELinux note &lt;/h2&gt;
&lt;p&gt;On systems where SELinux is enforced (which is the default), fail2ban generally works without issues because it interacts with firewalld at a higher level. If you see permission denials in &lt;code&gt;/var/log/audit/audit.log&lt;/code&gt; related to fail2ban, check:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ausearch -m avc -ts recent | grep fail2ban
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Most common issues are solved by installing the &lt;code&gt;fail2ban&lt;/code&gt; package through the official repos (which includes correct SELinux contexts) rather than manual installation.&lt;/p&gt;
&lt;p&gt;If you want a clean RHEL-based server to test this setup on, our &lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt; plans let you spin up, configure, and experiment without touching anything important.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Set Up Docker Compose: A Complete Guide to Managing Multi-Container Apps</title>
    <link href="https://voxihost.pl/blog/how-to-setup-docker-compose/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-setup-docker-compose/</id>
    <summary type="text">A complete step-by-step guide to setting up and using Docker Compose V2 on Ubuntu, Debian, AlmaLinux, Rocky Linux, CentOS, and Fedora.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;Docker Engine is fantastic for running single, isolated containers. But modern applications rarely exist in total isolation. You usually have a web server, a backend API, a database (like MySQL or PostgreSQL), and maybe a caching layer (like Redis).&lt;/p&gt;
&lt;p&gt;Trying to start all of those containers manually and manually linking their internal networking together via exhausting, mile-long &lt;code&gt;docker run&lt;/code&gt; commands is frustrating and severely prone to human error.&lt;/p&gt;
&lt;p&gt;Enter &lt;strong&gt;Docker Compose&lt;/strong&gt;. It allows you to declare your entire application stack in a single, clean &lt;code&gt;.yml&lt;/code&gt; (YAML) configuration file. With one central command, Docker builds the internal networks, pulls all necessary images, and launches the entire stack sequentially.&lt;/p&gt;
&lt;h2 id=&quot;step-1-verify-docker-compose-is-installed&quot;&gt;Step 1: Verify Docker Compose is Installed &lt;/h2&gt;
&lt;p&gt;If you followed our Docker installation guides for &lt;a href=&quot;https://voxihost.pl/blog/how-to-install-docker-ubuntu-debian/&quot;&gt;Ubuntu/Debian&lt;/a&gt; or &lt;a href=&quot;https://voxihost.pl/blog/how-to-install-docker-almalinux-centos-rocky-fedora/&quot;&gt;AlmaLinux/Rocky/Fedora&lt;/a&gt;, you actually already have Docker Compose installed!&lt;/p&gt;
&lt;p&gt;Modern Docker distributions have shifted away from the old standalone &lt;code&gt;docker-compose&lt;/code&gt; binary (written in Python) to a native &lt;strong&gt;Docker Compose V2 Plugin&lt;/strong&gt; (written in Go) embedded directly into the Docker CLI.&lt;/p&gt;
&lt;p&gt;Verify it is installed by checking its version:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/F2fECEf43p-375.avif 375w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/F2fECEf43p-375.webp 375w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/F2fECEf43p-375.jpeg&quot; alt=&quot;Running docker compose version in the terminal on Ubuntu to verify Docker Compose V2 is installed&quot; width=&quot;375&quot; height=&quot;61&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(Notice there is a space between &lt;code&gt;docker&lt;/code&gt; and &lt;code&gt;compose&lt;/code&gt;, not a hyphen!)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You should see an output like:&lt;br /&gt;
&lt;code&gt;Docker Compose version v2.32.x&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If you receive a &amp;quot;command not found&amp;quot; error, you need to install the plugin via your package manager:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ubuntu/Debian&lt;/strong&gt;: &lt;code&gt;sudo apt install docker-compose-plugin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AlmaLinux/RHEL&lt;/strong&gt;: &lt;code&gt;sudo dnf install docker-compose-plugin&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;step-2-set-up-a-project-directory&quot;&gt;Step 2: Set Up a Project Directory &lt;/h2&gt;
&lt;p&gt;Docker Compose relies absolutely on the context of the directory you run the command in. It looks for a file named &lt;code&gt;docker-compose.yml&lt;/code&gt; in whatever folder you are currently inside.&lt;/p&gt;
&lt;p&gt;First, let&#39;s make a dedicated home for your new project so files stay organized:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/M91_OiIhxK-375.avif 375w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/M91_OiIhxK-375.webp 375w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/M91_OiIhxK-375.jpeg&quot; alt=&quot;Running mkdir my-webapp and cd my-webapp to create and enter a dedicated Docker Compose project directory on Ubuntu&quot; width=&quot;375&quot; height=&quot;61&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir my-webapp
cd my-webapp
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;step-3-create-the-docker-compose-yml-file&quot;&gt;Step 3: Create the docker-compose.yml File &lt;/h2&gt;
&lt;p&gt;Now, let&#39;s create a functional, real-world example. We are going to deploy the official WordPress image and attach it to a secure MySQL database backend, cleanly configuring everything through Compose.&lt;/p&gt;
&lt;p&gt;Open a new file with &lt;code&gt;nano&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/InrzeTSuDC-400.avif 400w, https://voxihost.pl/assets/images/generated/InrzeTSuDC-800.avif 800w, https://voxihost.pl/assets/images/generated/InrzeTSuDC-1407.avif 1407w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/InrzeTSuDC-400.webp 400w, https://voxihost.pl/assets/images/generated/InrzeTSuDC-800.webp 800w, https://voxihost.pl/assets/images/generated/InrzeTSuDC-1407.webp 1407w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/InrzeTSuDC-400.jpeg&quot; alt=&quot;Running nano docker-compose.yml to open the Docker Compose configuration file for editing on Ubuntu&quot; width=&quot;1407&quot; height=&quot;511&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/InrzeTSuDC-400.jpeg 400w, https://voxihost.pl/assets/images/generated/InrzeTSuDC-800.jpeg 800w, https://voxihost.pl/assets/images/generated/InrzeTSuDC-1407.jpeg 1407w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Paste the following YAML block entirely:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  database:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: secure_root_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: secure_wp_password
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress:latest
    restart: always
    ports:
      - &amp;quot;8080:80&amp;quot;
    environment:
      WORDPRESS_DB_HOST: database
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: secure_wp_password
      WORDPRESS_DB_NAME: wordpress
    depends_on:
      - database

volumes:
  db_data:
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;breaking-down-the-configuration&quot;&gt;Breaking Down the Configuration: &lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;services&lt;/strong&gt;: We defined two containers: &lt;code&gt;database&lt;/code&gt; and &lt;code&gt;wordpress&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;image&lt;/strong&gt;: Tells Docker which container template to pull from Docker Hub.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;environment&lt;/strong&gt;: Injects secure variables (like passwords and usernames) automatically into the containers so they configure themselves silently on first boot. Look at how the &lt;code&gt;wordpress&lt;/code&gt; container knows its host is &lt;code&gt;database&lt;/code&gt; (the exact name of the other service). Docker Compose automatically built an internal, invisible network for them to talk to each other seamlessly!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ports&lt;/strong&gt;: Maps port &lt;code&gt;8080&lt;/code&gt; on the public internet directly to port &lt;code&gt;80&lt;/code&gt; (Standard HTTP) inside the internal isolated WordPress container.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;volumes&lt;/strong&gt;: In standard containers, when you delete a container, all the data goes with it. We mapped the database storage to a hard drive volume so your data persists even if you restart or delete the container!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;depends_on&lt;/strong&gt;: Ensures WordPress does not attempt to boot up until the database is successfully running.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Save and exit.&lt;/p&gt;
&lt;h2 id=&quot;step-4-spin-it-up&quot;&gt;Step 4: Spin it Up &lt;/h2&gt;
&lt;p&gt;With one file, your entire infrastructure is declared. To launch it, run the &lt;code&gt;up&lt;/code&gt; command. The &lt;code&gt;-d&lt;/code&gt; flag tells it to run &amp;quot;detached&amp;quot; in the background so you can keep using your terminal console:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/b4VEpQlisv-400.avif 400w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/b4VEpQlisv-400.webp 400w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/b4VEpQlisv-400.jpeg&quot; alt=&quot;Running docker compose up -d to start all containers defined in docker-compose.yml in detached mode on Ubuntu&quot; width=&quot;400&quot; height=&quot;153&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Docker will automatically:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a dedicated internal network for &lt;code&gt;my-webapp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Pull the heavy MySQL and WordPress images.&lt;/li&gt;
&lt;li&gt;Start the database, assign the passwords, and build the persistent storage partition.&lt;/li&gt;
&lt;li&gt;Start the WordPress server, attach it to the network, and map port 8080.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once finished, open your web browser and navigate to your server&#39;s IP address combined with port 8080:&lt;br /&gt;
&lt;code&gt;http://your_server_ip:8080&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security Warning:&lt;/strong&gt; Docker manages its own network rules through &lt;code&gt;iptables&lt;/code&gt;. When you use a &lt;code&gt;ports:&lt;/code&gt; mapping in your &lt;code&gt;docker-compose.yml&lt;/code&gt; file, Docker will &lt;strong&gt;bypass your UFW firewall completely&lt;/strong&gt;. To keep a service private, map it to &lt;code&gt;127.0.0.1:8080&lt;/code&gt; instead of just &lt;code&gt;8080&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/8xzZ6Nifwn-400.avif 400w, https://voxihost.pl/assets/images/generated/8xzZ6Nifwn-800.avif 800w, https://voxihost.pl/assets/images/generated/8xzZ6Nifwn-1600.avif 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/8xzZ6Nifwn-400.webp 400w, https://voxihost.pl/assets/images/generated/8xzZ6Nifwn-800.webp 800w, https://voxihost.pl/assets/images/generated/8xzZ6Nifwn-1600.webp 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/8xzZ6Nifwn-400.jpeg&quot; alt=&quot;WordPress installation wizard screen in browser after launching a WordPress plus MySQL Docker Compose stack on Ubuntu VPS&quot; width=&quot;1600&quot; height=&quot;992&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/8xzZ6Nifwn-400.jpeg 400w, https://voxihost.pl/assets/images/generated/8xzZ6Nifwn-800.jpeg 800w, https://voxihost.pl/assets/images/generated/8xzZ6Nifwn-1600.jpeg 1600w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;You will instantly hit the famous WordPress installation screen!&lt;/p&gt;
&lt;h2 id=&quot;step-5-manage-your-environment&quot;&gt;Step 5: Manage Your Environment &lt;/h2&gt;
&lt;p&gt;Here are the crucial commands to memorize when operating in the directory containing your &lt;code&gt;docker-compose.yml&lt;/code&gt; file:&lt;/p&gt;
&lt;p&gt;See what&#39;s actively running in this project:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/UU5F0F7Yx--400.avif 400w, https://voxihost.pl/assets/images/generated/UU5F0F7Yx--800.avif 800w, https://voxihost.pl/assets/images/generated/UU5F0F7Yx--1397.avif 1397w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/UU5F0F7Yx--400.webp 400w, https://voxihost.pl/assets/images/generated/UU5F0F7Yx--800.webp 800w, https://voxihost.pl/assets/images/generated/UU5F0F7Yx--1397.webp 1397w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/UU5F0F7Yx--400.jpeg&quot; alt=&quot;Running docker compose ps to list all running containers and their ports in the current Docker Compose project&quot; width=&quot;1397&quot; height=&quot;115&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/UU5F0F7Yx--400.jpeg 400w, https://voxihost.pl/assets/images/generated/UU5F0F7Yx--800.jpeg 800w, https://voxihost.pl/assets/images/generated/UU5F0F7Yx--1397.jpeg 1397w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose ps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check the deeply detailed background system logs (useful if an app crashes to see why it died):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose logs
# Add -f to follow the logs live in real-time
docker compose logs -f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Stop the containers temporarily without deleting them:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/joRmmuVJuS-400.avif 400w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/joRmmuVJuS-400.webp 400w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/joRmmuVJuS-400.jpeg&quot; alt=&quot;Running docker compose stop to temporarily stop all running containers in a Docker Compose project without removing them&quot; width=&quot;400&quot; height=&quot;86&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose stop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(You can start them again using &lt;code&gt;docker compose start&lt;/code&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Tear the entire project down (stops the containers, deletes them, and removes the internal network):&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/FAMvD04ycr-400.avif 400w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/FAMvD04ycr-400.webp 400w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/FAMvD04ycr-400.jpeg&quot; alt=&quot;Running docker compose down to stop and remove all containers, networks, and volumes in a Docker Compose project&quot; width=&quot;400&quot; height=&quot;104&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(By default, this does NOT delete your database volume, so your WordPress posts are completely safe upon re-deployment).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To deploy high-availability application stacks using containerized architecture, there is nothing like a high-performance backend infrastructure backing it. Spin up a &lt;a href=&quot;https://voxihost.pl/premium-vps/&quot;&gt;Premium VPS&lt;/a&gt;, install Docker, copy in your YAML configs, and launch your complex, multi-layered infrastructures into production effortlessly.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Secure SSH on Ubuntu &amp; Debian: The Complete Server Guide</title>
    <link href="https://voxihost.pl/blog/how-to-secure-ssh-ubuntu-debian/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-secure-ssh-ubuntu-debian/</id>
    <summary type="text">A complete guide to hardening SSH on Ubuntu and Debian servers. Disable root login, set up key-based authentication, change the default port, configure ufw, and lock down your VPS against brute-force attacks.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;Port 22 is scanned constantly. The moment you spin up a VPS with a public IP, automated bots start hammering it for weak passwords and default credentials. Hardening SSH takes about 15 minutes and makes your server dramatically less interesting to anyone trying to get in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prerequisite:&lt;/strong&gt; This guide disables root login. You &lt;strong&gt;must&lt;/strong&gt; have a non-root user with &lt;code&gt;sudo&lt;/code&gt; privileges ready &lt;strong&gt;before&lt;/strong&gt; running any of these steps. If you haven&#39;t done that yet, follow our &lt;a href=&quot;https://voxihost.pl/blog/how-to-create-sudo-user-ubuntu-debian/&quot;&gt;How to Create a Sudo User on Ubuntu &amp;amp; Debian&lt;/a&gt; guide first, then come back here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;set-up-ssh-key-authentication&quot;&gt;Set up SSH key authentication &lt;/h2&gt;
&lt;p&gt;The single most effective change you can make. Password logins can be brute-forced. Key-based auth cannot,  not in any realistic timeframe.&lt;/p&gt;
&lt;p&gt;On your &lt;strong&gt;local machine&lt;/strong&gt;, generate a key pair:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Ikqz-M8KzE-400.avif 400w, https://voxihost.pl/assets/images/generated/Ikqz-M8KzE-740.avif 740w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Ikqz-M8KzE-400.webp 400w, https://voxihost.pl/assets/images/generated/Ikqz-M8KzE-740.webp 740w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/Ikqz-M8KzE-400.jpeg&quot; alt=&quot;Running ssh-keygen -t ed25519 -C &amp;quot;your-server-label&amp;quot; to generate a new SSH key pair&quot; width=&quot;740&quot; height=&quot;405&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Ikqz-M8KzE-400.jpeg 400w, https://voxihost.pl/assets/images/generated/Ikqz-M8KzE-740.jpeg 740w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t ed25519 -C &amp;quot;your-server-label&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use &lt;code&gt;ed25519&lt;/code&gt;,  it&#39;s faster and more secure than the older RSA algorithm. When prompted for a passphrase, &lt;strong&gt;set one&lt;/strong&gt;. It encrypts the private key on disk, so even if someone compromises your laptop, they still can&#39;t use the key without it.&lt;/p&gt;
&lt;p&gt;Copy the public key to the server. Replace &lt;code&gt;youruser&lt;/code&gt; with your actual sudo username:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/fsEcPmG3Le-400.avif 400w, https://voxihost.pl/assets/images/generated/fsEcPmG3Le-800.avif 800w, https://voxihost.pl/assets/images/generated/fsEcPmG3Le-1056.avif 1056w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/fsEcPmG3Le-400.webp 400w, https://voxihost.pl/assets/images/generated/fsEcPmG3Le-800.webp 800w, https://voxihost.pl/assets/images/generated/fsEcPmG3Le-1056.webp 1056w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/fsEcPmG3Le-400.jpeg&quot; alt=&quot;Running ssh-copy-id -i ~/.ssh/id_ed25519.pub youruser@your-server-ip to copy the public key to the server&quot; width=&quot;1056&quot; height=&quot;195&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/fsEcPmG3Le-400.jpeg 400w, https://voxihost.pl/assets/images/generated/fsEcPmG3Le-800.jpeg 800w, https://voxihost.pl/assets/images/generated/fsEcPmG3Le-1056.jpeg 1056w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-copy-id -i ~/.ssh/id_ed25519.pub youruser@your-server-ip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Test the key works before moving on.&lt;/strong&gt; Open a new terminal window and connect. If you get in without a password prompt, the key is installed correctly. &lt;strong&gt;Do not close your existing session yet&lt;/strong&gt;,  you still need to disable password auth as a separate step.&lt;/p&gt;
&lt;p&gt;Optional: add an entry to &lt;code&gt;~/.ssh/config&lt;/code&gt; on your local machine for quick access:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/bMgsn1r4Df-400.avif 400w, https://voxihost.pl/assets/images/generated/bMgsn1r4Df-800.avif 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/bMgsn1r4Df-400.webp 400w, https://voxihost.pl/assets/images/generated/bMgsn1r4Df-800.webp 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/bMgsn1r4Df-400.jpeg&quot; alt=&quot;Fast connection to the server&quot; width=&quot;800&quot; height=&quot;87&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/bMgsn1r4Df-400.jpeg 400w, https://voxihost.pl/assets/images/generated/bMgsn1r4Df-800.jpeg 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host myserver
    HostName your-server-ip
    User youruser
    IdentityFile ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/AJvjc59oKY-400.avif 400w, https://voxihost.pl/assets/images/generated/AJvjc59oKY-642.avif 642w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/AJvjc59oKY-400.webp 400w, https://voxihost.pl/assets/images/generated/AJvjc59oKY-642.webp 642w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/AJvjc59oKY-400.jpeg&quot; alt=&quot;Fast connection to the server&quot; width=&quot;642&quot; height=&quot;458&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/AJvjc59oKY-400.jpeg 400w, https://voxihost.pl/assets/images/generated/AJvjc59oKY-642.jpeg 642w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;After this, &lt;code&gt;ssh myserver&lt;/code&gt; is all you need to type.&lt;/p&gt;
&lt;h2 id=&quot;disable-root-login&quot;&gt;Disable root login &lt;/h2&gt;
&lt;p&gt;SSH in as your sudo user from this point forward. Direct root login is a security risk,  if your session is compromised, an attacker has full unrestricted access with zero additional steps.&lt;/p&gt;
&lt;p&gt;Open the SSH daemon config:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Z13HoTdhUq-400.avif 400w, https://voxihost.pl/assets/images/generated/Z13HoTdhUq-800.avif 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Z13HoTdhUq-400.webp 400w, https://voxihost.pl/assets/images/generated/Z13HoTdhUq-800.webp 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/Z13HoTdhUq-400.jpeg&quot; alt=&quot;Disabling root login in sshd_config&quot; width=&quot;800&quot; height=&quot;308&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/Z13HoTdhUq-400.jpeg 400w, https://voxihost.pl/assets/images/generated/Z13HoTdhUq-800.jpeg 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Find and update this line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PermitRootLogin no
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you ever need root access on the server, SSH in as your sudo user and run &lt;code&gt;sudo su&lt;/code&gt; from there.&lt;/p&gt;
&lt;h2 id=&quot;disable-password-authentication&quot;&gt;Disable password authentication &lt;/h2&gt;
&lt;p&gt;Your key is working, so now eliminate password logins entirely:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set both of these:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PasswordAuthentication no
PubkeyAuthentication yes
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Some Ubuntu and Debian versions set &lt;code&gt;PasswordAuthentication&lt;/code&gt; in a drop-in file under &lt;code&gt;/etc/ssh/sshd_config.d/&lt;/code&gt; that &lt;strong&gt;overrides&lt;/strong&gt; the main config. Check for it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep -r &amp;quot;PasswordAuthentication&amp;quot; /etc/ssh/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you see it set to &lt;code&gt;yes&lt;/code&gt; anywhere in the output, edit that specific file,  not the main &lt;code&gt;sshd_config&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;tighten-a-few-more-settings&quot;&gt;Tighten a few more settings &lt;/h2&gt;
&lt;p&gt;While you have &lt;code&gt;sshd_config&lt;/code&gt; open, add these to reduce the attack surface further:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Disconnect after 3 failed attempts
MaxAuthTries 3

# Close unauthenticated connections faster
LoginGraceTime 30

# Disable unused features
X11Forwarding no
AllowTcpForwarding no
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If only specific usernames should be able to log in remotely, add an allowlist:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AllowUsers youruser
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any account not on the list will be refused at the SSH level, even with a valid key.&lt;/p&gt;
&lt;h2 id=&quot;change-the-default-port&quot;&gt;Change the default port &lt;/h2&gt;
&lt;p&gt;Port 22 appears in every scanner&#39;s default target list. Moving SSH to a non-standard port won&#39;t stop a determined attacker from port-scanning, but it eliminates virtually all the automated noise. Auth logs go from hundreds of failed login attempts per day to effectively zero.&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;sshd_config&lt;/code&gt;, update the port:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Port 2222
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Choose any unused port above 1024. &lt;strong&gt;Before restarting SSH&lt;/strong&gt;, update your firewall to allow the new port and close the old one:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow 2222/tcp
sudo ufw deny 22/tcp
sudo ufw status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make sure &lt;strong&gt;2222 shows as ALLOW&lt;/strong&gt; in the output before proceeding.&lt;/p&gt;
&lt;h2 id=&quot;restart-ssh-and-verify&quot;&gt;Restart SSH and verify &lt;/h2&gt;
&lt;p&gt;Apply all your changes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, in a &lt;strong&gt;new terminal window&lt;/strong&gt; (keep your current session open), test the connection on the new port:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -p 2222 youruser@your-server-ip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If it connects cleanly, you&#39;re done. If it fails, return to your existing session and debug. Run &lt;code&gt;sudo sshd -t&lt;/code&gt; to check &lt;code&gt;sshd_config&lt;/code&gt; for syntax errors before restarting again.&lt;/p&gt;
&lt;p&gt;Common issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firewall not updated for the new port&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PasswordAuthentication no&lt;/code&gt; set in a drop-in file that was missed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;check-what-the-server-is-actually-seeing&quot;&gt;Check what the server is actually seeing &lt;/h2&gt;
&lt;p&gt;After locking things down, inspect live authentication attempts:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo journalctl -u ssh --since &amp;quot;1 hour ago&amp;quot; | grep &amp;quot;Failed&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On a properly hardened server you should see nothing,  or just a handful of attempts on the old port being silently dropped by the firewall.&lt;/p&gt;
&lt;h2 id=&quot;a-note-on-fail2ban&quot;&gt;A note on fail2ban &lt;/h2&gt;
&lt;p&gt;With SSH key auth enabled and password auth disabled, brute-force attacks against SSH are already impossible. fail2ban becomes less critical for SSH itself. That said, it&#39;s still useful for protecting other services like Nginx and Apache, and running it alongside these settings adds a reasonable layer of defense in depth. See our &lt;a href=&quot;https://voxihost.pl/blog/how-to-setup-fail2ban-ubuntu-debian/&quot;&gt;fail2ban setup guide&lt;/a&gt; if you want to add it.&lt;/p&gt;
&lt;p&gt;If you want a safe place to practice this hardening process without risking a production server, our &lt;strong&gt;&lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt;&lt;/strong&gt; plans are an affordable sandbox to lock down, break, and start fresh as many times as you need.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Secure SSH on AlmaLinux, CentOS, Rocky Linux &amp; Fedora: The Complete Server Guide</title>
    <link href="https://voxihost.pl/blog/how-to-secure-ssh-almalinux-centos-rocky-fedora/" rel="alternate"/>
    <published>2026-03-25T00:00:00Z</published>
    <updated>2026-03-25T00:00:00Z</updated>
    <id>https://voxihost.pl/blog/how-to-secure-ssh-almalinux-centos-rocky-fedora/</id>
    <summary type="text">A complete guide to hardening SSH on AlmaLinux, CentOS Stream, Rocky Linux, and Fedora servers. Disable root login, set up key-based authentication, change the default port, configure firewalld, and protect your VPS against brute-force attacks.</summary>
    <category term="Tutorials"/>
    <content xml:lang="en" type="html">&lt;p&gt;The moment a server with a public IP goes live, automated scanners start probing port 22. It&#39;s not personal, it&#39;s just what happens on the internet. Most of them are looking for root logins with weak passwords or default credentials from cloud images that haven&#39;t been touched.&lt;/p&gt;
&lt;p&gt;Locking down SSH on AlmaLinux, CentOS Stream, Rocky Linux, and Fedora takes the same 15 minutes as on any Linux server, with one extra step that RHEL-based systems require: telling SELinux about any port changes you make. Skip that and you&#39;ll be wondering why SSH stopped working.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prerequisite:&lt;/strong&gt; This guide disables root login. You &lt;strong&gt;must&lt;/strong&gt; have a non-root user with &lt;code&gt;sudo&lt;/code&gt; privileges ready &lt;strong&gt;before&lt;/strong&gt; running any of these steps. If you haven&#39;t done that yet, follow our &lt;a href=&quot;https://voxihost.pl/blog/how-to-create-sudo-user-almalinux-centos-rocky-fedora/&quot;&gt;How to Create a Sudo User on AlmaLinux, CentOS, Rocky Linux &amp;amp; Fedora&lt;/a&gt; guide first, then come back here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;set-up-ssh-key-authentication&quot;&gt;Set up SSH key authentication &lt;/h2&gt;
&lt;p&gt;Do keys before anything else. Password authentication is the main vector for SSH brute-force attacks, and switching to keys eliminates it entirely.&lt;/p&gt;
&lt;p&gt;On your &lt;strong&gt;local machine&lt;/strong&gt;, generate an ed25519 key pair:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/P4yzmTcxUX-400.avif 400w, https://voxihost.pl/assets/images/generated/P4yzmTcxUX-800.avif 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/P4yzmTcxUX-400.webp 400w, https://voxihost.pl/assets/images/generated/P4yzmTcxUX-800.webp 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/P4yzmTcxUX-400.jpeg&quot; alt=&quot;Running ssh-keygen -t ed25519 -C &amp;quot;your-server-label&amp;quot; command on AlmaLinux, CentOS, Rocky Linux &amp;amp; Fedora to generate an ed25519 key pair&quot; width=&quot;800&quot; height=&quot;357&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/P4yzmTcxUX-400.jpeg 400w, https://voxihost.pl/assets/images/generated/P4yzmTcxUX-800.jpeg 800w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t ed25519 -C &amp;quot;your-server-label&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set a passphrase when prompted. It encrypts the private key on disk, if someone gets your local machine, they still can&#39;t use the key without the passphrase.&lt;/p&gt;
&lt;p&gt;Copy the public key to the server:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/0he2LIrjnT-400.avif 400w, https://voxihost.pl/assets/images/generated/0he2LIrjnT-800.avif 800w, https://voxihost.pl/assets/images/generated/0he2LIrjnT-1059.avif 1059w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/0he2LIrjnT-400.webp 400w, https://voxihost.pl/assets/images/generated/0he2LIrjnT-800.webp 800w, https://voxihost.pl/assets/images/generated/0he2LIrjnT-1059.webp 1059w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/0he2LIrjnT-400.jpeg&quot; alt=&quot;Running ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-server-ip command on AlmaLinux, CentOS, Rocky Linux &amp;amp; Fedora to copy the public key to the server&quot; width=&quot;1059&quot; height=&quot;227&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/0he2LIrjnT-400.jpeg 400w, https://voxihost.pl/assets/images/generated/0he2LIrjnT-800.jpeg 800w, https://voxihost.pl/assets/images/generated/0he2LIrjnT-1059.jpeg 1059w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-server-ip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Open a &lt;strong&gt;new terminal window&lt;/strong&gt; and verify you can connect with the key before changing anything else. If you&#39;re in without a password prompt, the key works. Keep your original session open, you&#39;ll need it as a fallback if something goes wrong in later steps.&lt;/p&gt;
&lt;h2 id=&quot;disable-root-login&quot;&gt;Disable root login &lt;/h2&gt;
&lt;p&gt;Direct root login is an unnecessary risk. If your key gets compromised, an attacker immediately has unrestricted access. Use a non-root account with sudo instead.&lt;/p&gt;
&lt;p&gt;Edit the SSH config:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/iBrJ7VOY1a-400.avif 400w, https://voxihost.pl/assets/images/generated/iBrJ7VOY1a-800.avif 800w, https://voxihost.pl/assets/images/generated/iBrJ7VOY1a-1414.avif 1414w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/iBrJ7VOY1a-400.webp 400w, https://voxihost.pl/assets/images/generated/iBrJ7VOY1a-800.webp 800w, https://voxihost.pl/assets/images/generated/iBrJ7VOY1a-1414.webp 1414w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/iBrJ7VOY1a-400.jpeg&quot; alt=&quot;Running sudo nano /etc/ssh/sshd_config on AlmaLinux to open and edit the SSH daemon configuration file to disable root login&quot; width=&quot;1414&quot; height=&quot;276&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/iBrJ7VOY1a-400.jpeg 400w, https://voxihost.pl/assets/images/generated/iBrJ7VOY1a-800.jpeg 800w, https://voxihost.pl/assets/images/generated/iBrJ7VOY1a-1414.jpeg 1414w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Find and set:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PermitRootLogin no
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If this isn&#39;t set, on RHEL-based systems the default may vary by cloud image. Always set it explicitly.&lt;/p&gt;
&lt;h2 id=&quot;disable-password-authentication&quot;&gt;Disable password authentication &lt;/h2&gt;
&lt;p&gt;With your key confirmed working, disable passwords:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/HyzYL5f6g9-356.avif 356w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://voxihost.pl/assets/images/generated/HyzYL5f6g9-356.webp 356w&quot; sizes=&quot;(max-width: 768px) 100vw, 800px&quot; /&gt;&lt;img src=&quot;https://voxihost.pl/assets/images/generated/HyzYL5f6g9-356.jpeg&quot; alt=&quot;Editing /etc/ssh/sshd_config on AlmaLinux to set PasswordAuthentication no and PubkeyAuthentication yes to enforce key-only login&quot; width=&quot;356&quot; height=&quot;62&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PasswordAuthentication no
PubkeyAuthentication yes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On these distros, the main config file is usually authoritative. But double-check for overrides:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grep -r &amp;quot;PasswordAuthentication&amp;quot; /etc/ssh/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If anything in &lt;code&gt;/etc/ssh/sshd_config.d/&lt;/code&gt; is setting it to &lt;code&gt;yes&lt;/code&gt;, fix that file.&lt;/p&gt;
&lt;h2 id=&quot;tighten-a-few-more-settings&quot;&gt;Tighten a few more settings &lt;/h2&gt;
&lt;p&gt;Small changes that reduce exposure:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Disconnect after 3 failed auth attempts
MaxAuthTries 3

# Reduce the window for incomplete connections
LoginGraceTime 30

# Disable features you&#39;re not using
X11Forwarding no
AllowTcpForwarding no
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If only specific users should have SSH access:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AllowUsers youruser
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any system user not listed won&#39;t be able to authenticate remotely, even with valid credentials. Useful for keeping application accounts locked down.&lt;/p&gt;
&lt;h2 id=&quot;change-the-default-port&quot;&gt;Change the default port &lt;/h2&gt;
&lt;p&gt;This is where RHEL-based systems differ from Debian-based ones. SELinux controls which ports services are allowed to listen on. If you change the SSH port without updating SELinux, the service will fail to restart.&lt;/p&gt;
&lt;p&gt;First, check which ports SSH is currently allowed to use:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo semanage port -l | grep ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add your new port to the allowed list:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo semanage port -a -t ssh_port_t -p tcp 2222
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If &lt;code&gt;semanage&lt;/code&gt; isn&#39;t available:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf install policycoreutils-python-utils -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then edit &lt;code&gt;sshd_config&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Port 2222
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now update firewalld to allow the new port and remove the old one:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verify:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo firewall-cmd --list-all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should see &lt;code&gt;2222/tcp&lt;/code&gt; in the ports list and &lt;code&gt;ssh&lt;/code&gt; removed from services.&lt;/p&gt;
&lt;h2 id=&quot;restart-sshd-and-verify&quot;&gt;Restart sshd and verify &lt;/h2&gt;
&lt;p&gt;On RHEL-family systems the service is &lt;code&gt;sshd&lt;/code&gt;, not &lt;code&gt;ssh&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In a &lt;strong&gt;new terminal window&lt;/strong&gt;, connect on the new port:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -p 2222 user@your-server-ip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If it works, you&#39;re done. If not, use your existing session to debug. Check for config syntax errors first:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo sshd -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That command validates the config without actually restarting, it will tell you if there&#39;s a typo or invalid setting.&lt;/p&gt;
&lt;h2 id=&quot;verify-the-selinux-port-assignment&quot;&gt;Verify the SELinux port assignment &lt;/h2&gt;
&lt;p&gt;After restarting, confirm SELinux accepted the port:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo semanage port -l | grep ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should see your new port listed. If the restart succeeded, this should already be fine.&lt;/p&gt;
&lt;h2 id=&quot;check-the-auth-logs&quot;&gt;Check the auth logs &lt;/h2&gt;
&lt;p&gt;See what&#39;s hitting your server:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo journalctl -u sshd --since &amp;quot;1 hour ago&amp;quot; | grep -E &amp;quot;Failed|Invalid&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On a properly hardened server with password auth disabled and running on a non-standard port, this log should be essentially empty.&lt;/p&gt;
&lt;h2 id=&quot;selinux-audit-denials&quot;&gt;SELinux audit denials &lt;/h2&gt;
&lt;p&gt;If sshd fails to start or connect after the port change, check for SELinux denials:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ausearch -m avc -ts recent | grep sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#39;ll tell you exactly what SELinux blocked, which makes fixing it much simpler than guessing.&lt;/p&gt;
&lt;p&gt;If you want a clean RHEL-based VPS to practice this on without risk, our &lt;a href=&quot;https://voxihost.pl/budget-vps/&quot;&gt;Budget VPS&lt;/a&gt; plans are cheap enough to spin up a test box, harden it, and start fresh if anything breaks.&lt;/p&gt;
</content>
  </entry>
</feed>
