
These three commands are frequently confused because their names sound similar. They do fundamentally different things, and mixing them up on a production server can cause unexpected service disruptions.
apt update refreshes the local package index from the configured repositories. It downloads metadata — package names, versions, and dependency information — but installs absolutely nothing. Always run this before any upgrade command to ensure you are seeing the latest available versions.
apt upgrade downloads and installs newer versions of all currently installed packages. Critically, it does not install new packages or remove existing ones — this constraint makes it the safe choice for production servers, since it will not pull in unexpected new dependencies or remove a package that something else depends on.
apt full-upgrade (formerly dist-upgrade) does everything apt upgrade does, plus handles dependency changes that require installing new packages or removing old ones. Use this cautiously on production — it can occasionally remove a package that seems obsolete but is actually required by your application.
Never run updates blindly during business hours. Check what is upgrading, look for service restarts that require downtime, and schedule the update during a low-traffic window. The safe process:
Take a server snapshot before major upgrades. DigitalOcean, Vultr, and Hetzner all support one-click snapshots from their dashboards — the process takes 2-5 minutes and gives you an instant rollback point if the upgrade breaks something critical.
Security vulnerabilities in system packages are discovered and patched constantly — many of them are critical and exploited within hours of disclosure. Unattended-upgrades automatically applies security patches from the Ubuntu Security Notice (USN) feed, so your server stays protected even if you forget to run apt upgrade manually for a week.
Crucially, unattended-upgrades only applies packages from the security repository by default — not all upgrades. This means it patches OpenSSL, glibc, and the kernel without touching your application packages like PHP or MySQL, reducing the risk of breaking production.
Set the Automatic-Reboot-Time to a time when your traffic is lowest — typically between 2:00am and 5:00am in your primary user timezone. If your site serves a global audience 24/7, consider using a two-server setup behind a load balancer so one server is always available during the reboot window.
Kernel updates require a full reboot — there is no live-patching solution available on standard Ubuntu installations. The update installs the new kernel package, but the system continues running on the old kernel until you reboot. The /var/run/reboot-required file is created automatically when a reboot is needed.
For high-availability setups running two servers behind a load balancer, update and reboot one server at a time. Route all traffic to server B, update and reboot server A, verify it comes back healthy, then switch traffic back and update server B. This gives you zero-downtime kernel updates.
Most service breakage after apt upgrade comes from PHP-FPM, MySQL, or Nginx configuration incompatibilities introduced in newer package versions. The recovery steps, in order of severity:
CloudStick's Security & Third-party Updates feature in the server panel triggers apt update && apt upgrade on your server from the web dashboard — no SSH required. This is available on all CloudStick plans and is useful for teams where not every member has server SSH access but needs to apply routine security patches.
For kernel reboots, you can initiate a server restart from the CloudStick dashboard as well, timing it to your maintenance window. CloudStick's Service Management panel shows the status of Nginx, MySQL, and PHP-FPM after the restart, confirming all services came back up without requiring you to SSH in and check manually.


We use cookies to improve your experience
CloudStick uses cookies to personalise content, analyse traffic and keep you signed in. Cookie Policy · Terms of Service