<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Frank Zhang</title>
    <description>The latest articles on DEV Community by Frank Zhang (@frankzhang).</description>
    <link>https://dev.to/frankzhang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4084184%2Fbd788009-bcdc-42d7-8803-4af0a1421140.jpg</url>
      <title>DEV Community: Frank Zhang</title>
      <link>https://dev.to/frankzhang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frankzhang"/>
    <language>en</language>
    <item>
      <title>Docker Compose volumes: four mix-ups that can cost you data</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Tue, 10 Nov 2026 04:17:13 +0000</pubDate>
      <link>https://dev.to/frankzhang/docker-compose-volumes-four-mix-ups-that-can-cost-you-data-3d94</link>
      <guid>https://dev.to/frankzhang/docker-compose-volumes-four-mix-ups-that-can-cost-you-data-3d94</guid>
      <description>&lt;p&gt;Most people learn early on that &lt;code&gt;docker compose down&lt;/code&gt; followed by &lt;code&gt;up&lt;/code&gt; keeps the database. Fewer can say why, and that gap is where data gets lost: someone copies &lt;code&gt;down -v&lt;/code&gt; from a tutorial, or assumes &lt;code&gt;:ro&lt;/code&gt; protects a volume from everything.&lt;/p&gt;

&lt;p&gt;Here's a short quiz. Which of these are true?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A.&lt;/strong&gt; A volume declared under top-level &lt;code&gt;volumes:&lt;/code&gt; but not mounted by any service makes &lt;code&gt;docker compose up&lt;/code&gt; fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B.&lt;/strong&gt; Adding &lt;code&gt;:ro&lt;/code&gt; to a service's volume mount makes it read-only inside that container.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C.&lt;/strong&gt; With &lt;code&gt;external: true&lt;/code&gt;, Compose looks for an existing volume instead of creating one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;D.&lt;/strong&gt; A named volume that a service references and that is declared at the top level gets created automatically, using the default driver.&lt;/p&gt;

&lt;p&gt;B, C and D are true. A is false. The rest of this post goes through why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Declaring is not mounting
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;alpine:3.21&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sleep 3600&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is valid. &lt;code&gt;app_data&lt;/code&gt; is defined, but nothing uses it, and &lt;code&gt;up&lt;/code&gt; doesn't complain. To actually get it into a container you need a service-level mount:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;alpine:3.21&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sleep 3600&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app_data:/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The top-level block defines the volume (and its driver, name, options). The service-level entry attaches it to a path in one container. They're separate steps, and a typo in either one gives you a very different result than you expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;:ro&lt;/code&gt; belongs to the mount
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app_data:/data:ro&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's source, destination, and mode. The default mode is &lt;code&gt;rw&lt;/code&gt;. The long syntax says the same thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;volume&lt;/span&gt;
    &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_data&lt;/span&gt;
    &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/data&lt;/span&gt;
    &lt;span class="na"&gt;read_only&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What &lt;code&gt;:ro&lt;/code&gt; blocks is writes through that one mount. Another container can still mount the same volume read-write, and anyone with access to the Docker host can still change the data underneath. A reporting container that reads exports it shouldn't touch is a good use. A data-protection mechanism it is not.&lt;/p&gt;

&lt;p&gt;It's also easy to confuse with the service-level &lt;code&gt;read_only: true&lt;/code&gt;, which makes the container's root filesystem read-only. Different setting, different problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;external: true&lt;/code&gt; hands over lifecycle
&lt;/h2&gt;

&lt;p&gt;Say an admin created the volume beforehand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create shared_app_data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the Compose file points at it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shared_app_data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compose now expects &lt;code&gt;shared_app_data&lt;/code&gt; to exist. If it doesn't, &lt;code&gt;up&lt;/code&gt; fails; it won't quietly create an empty one. Compose also won't remove it. Without &lt;code&gt;name:&lt;/code&gt;, it looks for a volume called &lt;code&gt;app_data&lt;/code&gt; exactly as written, with no project prefix.&lt;/p&gt;

&lt;p&gt;"External" here has nothing to do with network storage. The volume can live on the same host. The word is about who owns creation and deletion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Normal named volumes just get created
&lt;/h2&gt;

&lt;p&gt;For an ordinary Compose-managed volume you don't run &lt;code&gt;docker volume create&lt;/code&gt;. &lt;code&gt;docker compose up -d&lt;/code&gt; makes it if it's missing, using the &lt;code&gt;local&lt;/code&gt; driver by default. The name is prefixed with the project name, so key &lt;code&gt;app_data&lt;/code&gt; in a project called &lt;code&gt;demo&lt;/code&gt; becomes &lt;code&gt;demo_app_data&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume ls
docker volume inspect demo_app_data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;down&lt;/code&gt; vs &lt;code&gt;down -v&lt;/code&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Containers&lt;/th&gt;
&lt;th&gt;Managed named volumes&lt;/th&gt;
&lt;th&gt;External volumes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;stopped&lt;/td&gt;
&lt;td&gt;kept&lt;/td&gt;
&lt;td&gt;kept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;down&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;removed&lt;/td&gt;
&lt;td&gt;kept&lt;/td&gt;
&lt;td&gt;kept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;down -v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;removed&lt;/td&gt;
&lt;td&gt;removed&lt;/td&gt;
&lt;td&gt;kept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;up -d --build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;recreated as needed&lt;/td&gt;
&lt;td&gt;reused&lt;/td&gt;
&lt;td&gt;reused&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;down -v&lt;/code&gt; removes named volumes declared in the Compose file plus anonymous volumes attached to the containers. It won't touch bind-mounted host directories, and it can fail on a volume that's still in use.&lt;/p&gt;

&lt;p&gt;Anonymous volumes have a quirk. A plain &lt;code&gt;down&lt;/code&gt; leaves them on disk, but since they have no stable name in the Compose file, the next &lt;code&gt;up&lt;/code&gt; creates new ones instead of reattaching the old. They're kept, but not reused, and they pile up.&lt;/p&gt;

&lt;p&gt;So when someone asks why the database is still there after a rebuild: rebuilding an image doesn't touch volumes. And when someone's data vanished after &lt;code&gt;down -v&lt;/code&gt;: that flag asked for exactly that.&lt;/p&gt;

&lt;h2&gt;
  
  
  A lab you can run
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;volume-lab&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;alpine:3.21&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sh -c 'date &amp;gt;&amp;gt; /data/events.log &amp;amp;&amp;amp; sleep 3600'&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app_data:/data&lt;/span&gt;

  &lt;span class="na"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;alpine:3.21&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sleep 3600&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app_data:/data:ro&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up -d
&lt;span class="c"&gt;# give the writer a second to create the file, then:&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; reader cat /data/events.log
docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; reader sh -c &lt;span class="s1"&gt;'echo test &amp;gt;&amp;gt; /data/events.log'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last command should fail with a read-only filesystem error. Now recreate the containers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down
docker compose up -d
docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; reader cat /data/events.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The log now has two timestamps, because the volume outlived the containers. Check it with &lt;code&gt;docker volume inspect volume-lab_app_data&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Only run &lt;code&gt;docker compose down -v&lt;/code&gt; here if you want to wipe the lab. Don't paste it into a production directory without checking which volumes it will hit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you deploy something stateful
&lt;/h2&gt;

&lt;p&gt;Check four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is the volume declared where Compose expects it?&lt;/li&gt;
&lt;li&gt;Which services mount it, and at which paths?&lt;/li&gt;
&lt;li&gt;Does each service really need write access?&lt;/li&gt;
&lt;li&gt;Does Compose own this volume, or is it external?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And remember that a volume isn't a backup. It survives container replacement, but not corruption, a mistaken &lt;code&gt;docker volume rm&lt;/code&gt;, or a dead disk. Keep backups, and test restoring them.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Synology Ransomware Warning: You Can't Patch a NAS You Haven't Found</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Thu, 05 Nov 2026 11:59:21 +0000</pubDate>
      <link>https://dev.to/frankzhang/synology-ransomware-warning-you-cant-patch-a-nas-you-havent-found-15do</link>
      <guid>https://dev.to/frankzhang/synology-ransomware-warning-you-cant-patch-a-nas-you-havent-found-15do</guid>
      <description>&lt;p&gt;How to find every Synology NAS on your network, see which DSM version it reports, and check whether that release is still supported.&lt;/p&gt;

&lt;p&gt;In October 2026, Synology issued a warning: attackers are targeting NAS devices running outdated DiskStation Manager (DSM). The exploited vulnerability was patched back in December 2024 (SA-24:20), and the ransomware, called C3RB3R, encrypts files and demands a ransom. Other security vendors point to several different DSM vulnerabilities as the entry point, so the safest approach is simple: bring DSM fully up to date.&lt;/p&gt;

&lt;p&gt;But before doing that, there's a prerequisite: you need to know exactly which devices you have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do you remember how many NAS you have?
&lt;/h2&gt;

&lt;p&gt;Storage devices in homelabs and small offices tend to pile up: the main Synology, an older DiskStation for backups, one in another room, and one you said you'd unplug but never did. Some may not have been logged into for a year, and older models can't all run the latest DSM. Some models top out at DSM 7.4, so "the latest version" depends on the model.&lt;/p&gt;

&lt;p&gt;Checking by hand means finding each device's IP, logging in to DSM, and opening the software info page. That's fine for one device, but across a whole network it becomes an inventory job.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's the most convenient way? Scan first
&lt;/h2&gt;

&lt;p&gt;WiFi Health Check is an iPhone app that scans the Wi-Fi network you're connected to and lists the devices on it. Many Synology NAS units announce themselves over multicast discovery protocols, and when one does, the app can read the model and DSM build the NAS reports about itself, for example a DS920+ running DSM 7.1-42962.&lt;/p&gt;

&lt;p&gt;If a NAS doesn't announce itself (multicast discovery is disabled, or the device sits behind VLAN isolation), you'll see a Synology device with the model or version marked "unknown." That's a prompt to check inside DSM. It's a low-probability event, unless your Synology NAS is very old.&lt;/p&gt;

&lt;p&gt;For versions it can read, the app also shows whether that DSM release is still within Synology's published support window. Under Synology's lifecycle policy, DSM 7.2 maintenance ended in December 2025, extended support for DSM 7.1 on eligible hardware ended in June 2025, and DSM 7.4, released in June 2026, is maintained through June 2028. Devices running on a branch that's out of support will have to rely on other means of protection.&lt;/p&gt;

&lt;p&gt;An example of a practical workflow: first, run a scan, and you'll get an overall report and a list. Fully identified devices appear in it, and your Synology devices are among them. For those that meet the detection conditions, you can go straight to the Synology detail page in the app and view the lifecycle card and recommendations. For those that don't meet the conditions, you'll get a separate-style Synology list, but the specific version numbers need to be looked up manually.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxfsp5d0zliitrk10kwyc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxfsp5d0zliitrk10kwyc.png" alt="Before" width="800" height="1576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This last step is critical. Once you have the product identification report, the next step is to apply patch updates and security hardening as needed. That's the purpose of the scan: to let you know where you stand ahead of time. WiFi Health Check is a discovery and diagnostic tool; Synology's updates and security protections are the steps that follow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then check the basics
&lt;/h2&gt;

&lt;p&gt;Once you know what's on your network:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install the latest DSM security updates, and turn on automatic updates if possible.&lt;/li&gt;
&lt;li&gt;Don't expose the DSM management interface to the internet.&lt;/li&gt;
&lt;li&gt;Disable the default administrator account and enable two-factor authentication.&lt;/li&gt;
&lt;li&gt;Run Synology's Security Advisor.&lt;/li&gt;
&lt;li&gt;Keep at least one verified backup that ransomware can't reach.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The recent PHP2Shell advisories (SA-26:13) involve specific PHP-based packages. Synology's ransomware warning points to SA-24:20, so please treat the two as separate issues.&lt;/p&gt;

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

&lt;p&gt;For a homelab or small office, this is enough to answer a basic question: what's on my network, and which of it needs attention? Windows, Mac, Ubuntu? The product lifecycles of all these systems can be correctly identified.&lt;/p&gt;

&lt;p&gt;Next, if you want to know which cameras or NVRs exist on your network, you can also use WiFi Health Check.&lt;/p&gt;

&lt;p&gt;As for the tiers of information and reports, this is a boundary worth knowing: it separates the FREE tier from the PRO tier. It's a tier of information density, not a technical ceiling, and you're free to choose.&lt;/p&gt;

&lt;p&gt;APPStore: &lt;a href="https://apps.apple.com/app/wifi-health-check/id6791147190" rel="noopener noreferrer"&gt;https://apps.apple.com/app/wifi-health-check/id6791147190&lt;/a&gt;&lt;/p&gt;

</description>
      <category>synology</category>
      <category>dsm</category>
      <category>wifihealthcheck</category>
      <category>security</category>
    </item>
    <item>
      <title>Why Run a PHP Probe on Your NAS When Monitoring Can Run in a Container?</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Mon, 02 Nov 2026 03:59:54 +0000</pubDate>
      <link>https://dev.to/frankzhang/why-run-a-php-probe-on-your-nas-when-monitoring-can-run-in-a-container-1mfm</link>
      <guid>https://dev.to/frankzhang/why-run-a-php-probe-on-your-nas-when-monitoring-can-run-in-a-container-1mfm</guid>
      <description>&lt;p&gt;In October 2026, the C3RB3R ransomware began hitting Synology devices that were exposed to the internet and running outdated DSM. According to reports, the attackers exploited already-disclosed DSM vulnerabilities, encrypted files, and demanded a ransom.&lt;/p&gt;

&lt;p&gt;The news brought back something I've never quite understood. Many homelab users monitor their NAS by installing PHP on it, setting up a web server, dropping a probe script into the site directory, and letting an external platform pull data over HTTP. Why not run a separate Docker container that reports outward on its own?&lt;/p&gt;

&lt;p&gt;PHP probes have their reasons: they're simple, light, and easy to deploy. But from a maintenance and network-boundary standpoint, the two approaches differ more than you'd expect.&lt;/p&gt;

&lt;h2&gt;
  
  
  PHP probes: easy to start, tied to the host
&lt;/h2&gt;

&lt;p&gt;The typical flow looks like this: enable PHP on the NAS, configure Nginx or Apache, drop the probe file into the site directory, and have the monitoring platform poll that URL on a schedule.&lt;/p&gt;

&lt;p&gt;It's popular for good reasons. You upload one file and it works. Resource usage is low, Docker isn't required, and it runs on older NAS models and most Linux environments. If all you want is CPU, memory, and disk usage, that's enough.&lt;/p&gt;

&lt;p&gt;The trouble comes later. Because the probe serves data over HTTP, you can't avoid a few questions. Is the endpoint reachable from the internet? Is there reliable authentication? Is PHP kept up to date? Does the web service account have more privileges than it needs? Can the script read files it shouldn't? Once the probe lives in the NAS's web environment, it becomes one more component you have to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real problem is version fragmentation
&lt;/h2&gt;

&lt;p&gt;Real homelabs are rarely a tidy collection of fully updated systems.&lt;/p&gt;

&lt;p&gt;Some older models can't move to the latest major DSM version. Some people worry that upgrading will break third-party packages or databases, so they leave a stable system alone. Others simply never get into the habit of checking for updates. To be clear, being unable to upgrade to the latest major version doesn't mean there are no security updates. Synology still ships fixes for some older releases, and whether one exists depends on your model, DSM branch, and the security advisories.&lt;/p&gt;

&lt;p&gt;PHP has the same issue. Different models and packages ship different PHP versions, with 7.x and several 8.x branches side by side, different extensions, and different Web Station, Nginx, and Apache configurations. PHP's official support policy is two years of active support followed by two years of security fixes, and then nothing. You can leave the probe script untouched and still end up on a runtime that's long out of support.&lt;/p&gt;

&lt;p&gt;Synology's recent PHP2Shell advisory is an example. It affects specific PHP versions and the packages that depend on PHP, such as Web Station, WordPress, and phpMyAdmin. Several PHP branches received fixes. PHP 7.3, which is end-of-life, did not.&lt;/p&gt;

&lt;p&gt;One point needs stressing: PHP2Shell and C3RB3R are separate incidents, and nothing here says a PHP probe was the entry point for the ransomware. My point is narrower. Security maintenance can't stop at the operating system. The applications and runtimes on top of it need the same attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker probes: give monitoring its own runtime
&lt;/h2&gt;

&lt;p&gt;The alternative is to run the monitoring agent in a container, so it carries its own runtime and only makes outbound connections.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       NAS / Linux Server
       ┌──────────────────────┐
       │                      │
       │  DSM / File Services │
       │                      │
       │  Docker Engine       │
       │    ┌──────────────┐  │
       │    │ Docker Probe │  │
       │    │              │  │
       │    │ System Check │  │
       │    │ Asset Probe  │  │
       │    └──────┬───────┘  │
       │           │          │
       └───────────┼──────────┘
                   │
              Outbound Only
                   │
                   ▼
          OpsHome NOC Backend
                   │
          ┌────────┴─────────┐
          │                  │
        iOS App         NOC Console
                            Web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Independent runtime.&lt;/strong&gt; Dependencies are baked into the image, so it doesn't matter whether the host has PHP, and you don't have to set up a web environment just for the probe. Two NAS units on different DSM versions can run the same image as long as both support containers. The compatibility problems caused by PHP versions, extensions, and web server configs largely go away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outbound only, no new entry points.&lt;/strong&gt; The local agent connects to the monitoring platform, so you don't open an inbound port for the probe, you don't expose the NAS admin interface to the platform, and you don't leave a probe page reachable from the internet. The NAS's existing network boundary stays as it was. Outbound doesn't mean free of security requirements, though. Agent authentication, encrypted transport, credential management, and control over destination addresses are all still needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Independent lifecycle.&lt;/strong&gt; Updating the probe doesn't touch the NAS's PHP. You can pin the image version, restart or redeploy the agent on its own when something breaks at the application layer, and use container resource limits to cap what it takes from the host.&lt;/p&gt;

&lt;p&gt;A caveat so nobody misreads this: Docker is not a virtual machine and not an absolute sandbox. Containers share the host kernel. Run one in privileged mode, mount too many directories, or expose the Docker socket, and most of the isolation value is gone. Least privilege still applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-side comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;PHP file probe&lt;/th&gt;
&lt;th&gt;Docker probe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;NAS PHP / web environment&lt;/td&gt;
&lt;td&gt;Separate container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP dependency&lt;/td&gt;
&lt;td&gt;Usually required&lt;/td&gt;
&lt;td&gt;No dependency on host PHP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web server&lt;/td&gt;
&lt;td&gt;Usually required&lt;/td&gt;
&lt;td&gt;Not needed by the probe itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency management&lt;/td&gt;
&lt;td&gt;Affected by the host environment&lt;/td&gt;
&lt;td&gt;Managed inside the image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Updates&lt;/td&gt;
&lt;td&gt;May involve several components&lt;/td&gt;
&lt;td&gt;Can be updated independently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consistency&lt;/td&gt;
&lt;td&gt;Varies by NAS model&lt;/td&gt;
&lt;td&gt;Largely consistent on supported platforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound services&lt;/td&gt;
&lt;td&gt;Depends on the access architecture&lt;/td&gt;
&lt;td&gt;No new inbound port in outbound mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permission boundary&lt;/td&gt;
&lt;td&gt;Web service account and script privileges&lt;/td&gt;
&lt;td&gt;Container privileges and mount policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource control&lt;/td&gt;
&lt;td&gt;Relies on host process management&lt;/td&gt;
&lt;td&gt;Container resource limits available&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The table doesn't claim PHP is inherently insecure or Docker inherently safe. A well-configured PHP probe that's only reachable from the LAN is perfectly adequate for plenty of people. What differs is whether the runtime is separate, whether the access boundary is clear, and how much effort maintenance takes later.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we approach it in OpsHome NOC
&lt;/h2&gt;

&lt;p&gt;If all you need is resource usage on one NAS, a simple probe is enough. Once the targets grow to include servers, virtual machines, network devices, domains, and public services, you need a unified platform. OpsHome NOC splits monitoring into two kinds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public services&lt;/strong&gt; are checked directly from outside by the platform: HTTP/HTTPS availability, TCP connectivity, SSL certificate expiry, and domain status. These targets don't need a probe installed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private assets&lt;/strong&gt; such as Synology, Proxmox VE, ESXi, and Ubuntu/Linux servers are collected by a local Docker Probe and reported over an outbound connection, so you don't have to open management ports to the internet for remote monitoring. If an older NAS can't run Docker, don't fight it. Run the Probe on a supported Linux host on the same network and let it do the collection.&lt;/p&gt;

&lt;p&gt;Viewing happens in two places. The iOS app is for checking status and incidents wherever you are. NOC Console Web is a read-only central view with Overview, Matrix, Assets, Incidents, and Account pages. It can sit on an office monitor or a server-room wall display, and nothing about it requires opening a device's admin interface to the display. It's separate from Status Pages: Status Pages show public service status to outside visitors, while Console Web shows private assets to administrators.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitoring is not ransomware protection
&lt;/h2&gt;

&lt;p&gt;Neither a PHP probe nor a Docker probe replaces the NAS's own security measures. OpsHome NOC is not antivirus software and not a backup system.&lt;/p&gt;

&lt;p&gt;The basics still apply. Install DSM and package security updates promptly. Don't expose management ports to the internet. Use strong passwords and multi-factor authentication. Turn off services and ports you don't use. Review access logs regularly. Enable snapshots and keep offline backups, and actually test that you can restore from them. Monitoring helps you notice service failures and dropped connections sooner, but it won't stop an attack from happening.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;PHP probes still have a place. For simple setups with tight resources, a correctly configured script solves the problem. But if you're monitoring many targets over the long term and want one place to manage and view them remotely, it's worth rethinking the deployment: keep inbound entry points to a minimum, put the probe in its own container, use outbound connections for private assets, and keep monitoring separate from device administration.&lt;/p&gt;

&lt;p&gt;A NAS exists to store data, and a monitoring platform exists to show you what's going on. Ideally neither drags the other down.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.synology.com/en-global/security/advisory" rel="noopener noreferrer"&gt;Synology Product Security Advisories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://noc.opshome.run/" rel="noopener noreferrer"&gt;OpsHome NOC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.itsc.cuhk.edu.hk/all-it/information-security/information-security-alerts/ransomware-c3rb3r-ransomware-targeting-synology-nas-devices/" rel="noopener noreferrer"&gt;C3RB3R Ransomware Targeting Synology NAS Devices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>php</category>
      <category>docker</category>
      <category>nas</category>
      <category>security</category>
    </item>
    <item>
      <title>Why Does Docker Compose Keep Your Data After `down`?</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Sat, 31 Oct 2026 23:21:19 +0000</pubDate>
      <link>https://dev.to/frankzhang/why-does-docker-compose-keep-your-data-after-down-32f5</link>
      <guid>https://dev.to/frankzhang/why-does-docker-compose-keep-your-data-after-down-32f5</guid>
      <description>&lt;p&gt;&lt;em&gt;How Docker volume lifecycles work, why &lt;code&gt;--volumes&lt;/code&gt; is dangerous, and how to protect persistent data.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You remove and rebuild your Compose app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The containers are brand new, the image is rebuilt, and yet your database, accounts, and settings are all still there.&lt;/p&gt;

&lt;p&gt;Is Docker failing to clean up? No. This is exactly how persistent storage is designed to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Containers and volumes have different lifecycles
&lt;/h2&gt;

&lt;p&gt;A container is disposable. A volume is built to outlive it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;alpine:3.20&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sleep"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;infinity"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-data:/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here &lt;code&gt;app-data&lt;/code&gt; is a &lt;strong&gt;named volume&lt;/strong&gt;. Compose creates it and mounts it at &lt;code&gt;/data&lt;/code&gt;. When the container is removed, the volume stays on the Docker host.&lt;/p&gt;

&lt;p&gt;This is what makes databases, uploads, and configuration survive upgrades.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What does &lt;code&gt;docker compose down&lt;/code&gt; remove?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;docker compose down --volumes&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Containers&lt;/td&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compose-managed networks&lt;/td&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Named volumes (declared in top-level &lt;code&gt;volumes&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kept&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Removed&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anonymous volumes&lt;/td&gt;
&lt;td&gt;Kept (not reattached by the next &lt;code&gt;up&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Removed&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;external: true&lt;/code&gt; volumes&lt;/td&gt;
&lt;td&gt;Kept&lt;/td&gt;
&lt;td&gt;Kept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host bind mounts&lt;/td&gt;
&lt;td&gt;Kept&lt;/td&gt;
&lt;td&gt;Kept&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both commands remove containers. The only difference is whether Compose also deletes its persistent storage.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; &lt;code&gt;down --volumes&lt;/code&gt; (or &lt;code&gt;-v&lt;/code&gt;) permanently deletes that data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. Verify it yourself
&lt;/h2&gt;

&lt;p&gt;Start the app and write a file into the volume:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;app sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'echo "Persistent data!" &amp;gt; /data/check.txt'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remove and recreate the app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;app &lt;span class="nb"&gt;cat&lt;/span&gt; /data/check.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Persistent data!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now remove the volumes too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down &lt;span class="nt"&gt;--volumes&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;app &lt;span class="nb"&gt;cat&lt;/span&gt; /data/check.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This time you get &lt;code&gt;No such file or directory&lt;/code&gt;: the old volume was deleted and &lt;code&gt;up&lt;/code&gt; created a new, empty one.&lt;/p&gt;

&lt;p&gt;This is why rebuilding an image never resets your database. Images and volumes are separate things.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. A safer approach: &lt;code&gt;external: true&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;For data you cannot afford to lose, manage the volume outside the Compose lifecycle.&lt;/p&gt;

&lt;p&gt;Create it once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create production-data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then reference it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;alpine:3.20&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sleep"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;infinity"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-data:/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production-data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;external: true&lt;/code&gt;, Compose treats the volume as an existing resource it does not own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker compose down --volumes&lt;/code&gt; will &lt;strong&gt;not&lt;/strong&gt; delete it.&lt;/li&gt;
&lt;li&gt;If the volume does not exist, &lt;code&gt;docker compose up&lt;/code&gt; fails with an error instead of silently creating an empty one. That is a feature: a typo in the name will not give you a blank database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that &lt;code&gt;external: true&lt;/code&gt; protects against Compose, not against everything. &lt;code&gt;docker volume rm&lt;/code&gt; and &lt;code&gt;docker volume prune&lt;/code&gt; can still delete the volume, and it is &lt;strong&gt;not a backup&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Common commands at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Removes containers&lt;/th&gt;
&lt;th&gt;Removes Compose-managed named volumes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose stop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose up -d --build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Recreates when needed&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose down -v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bind mounts (&lt;code&gt;./data:/var/lib/app&lt;/code&gt;) are a different mechanism. Compose never deletes the host directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Production checklist
&lt;/h2&gt;

&lt;p&gt;Before updating or removing any stateful stack:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;List volumes with &lt;code&gt;docker volume ls&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check what each container actually mounts with &lt;code&gt;docker inspect &amp;lt;container&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Keep deployment (the Compose file) and data (the volume) separate where possible.&lt;/li&gt;
&lt;li&gt;Keep independent, &lt;strong&gt;tested&lt;/strong&gt; backups of databases and application data.&lt;/li&gt;
&lt;li&gt;Never use &lt;code&gt;down -v&lt;/code&gt; as a routine update command.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Pitfall: changing the project name
&lt;/h3&gt;

&lt;p&gt;Compose prefixes managed volume names with the project name, so &lt;code&gt;app-data&lt;/code&gt; becomes &lt;code&gt;myproject_app-data&lt;/code&gt;. If you rename the project directory or set a different &lt;code&gt;-p&lt;/code&gt; / &lt;code&gt;name:&lt;/code&gt;, Compose creates a &lt;strong&gt;new, empty&lt;/strong&gt; volume and your data appears to vanish. The old volume still exists; find it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mount it again by restoring the original project name, or reference it explicitly with &lt;code&gt;external: true&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A container is not your data.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;docker compose down&lt;/code&gt; to remove the stack and keep its volumes.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;docker compose down -v&lt;/code&gt; only when you deliberately want to destroy Compose-managed data.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;external: true&lt;/code&gt; when storage should have its own lifecycle.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Knowing the difference can save you from one of the most expensive mistakes in container administration: deleting production data with a single flag.&lt;/p&gt;




</description>
      <category>docker</category>
      <category>containers</category>
      <category>devops</category>
      <category>data</category>
    </item>
    <item>
      <title>Docker Compose: Reuse Existing Volumes with external: true</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Thu, 29 Oct 2026 04:55:13 +0000</pubDate>
      <link>https://dev.to/frankzhang/docker-compose-reuse-existing-volumes-with-external-true-2cl1</link>
      <guid>https://dev.to/frankzhang/docker-compose-reuse-existing-volumes-with-external-true-2cl1</guid>
      <description>&lt;h1&gt;
  
  
  Docker Compose: Reuse Existing Volumes with &lt;code&gt;external: true&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Have you ever deployed a Docker Compose project, only to discover that it created a new volume instead of reusing your existing data?&lt;/p&gt;

&lt;p&gt;The solution is simple: &lt;code&gt;external: true&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does it happen?
&lt;/h2&gt;

&lt;p&gt;Consider this configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:alpine&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-data:/usr/share/nginx/html&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, Docker Compose manages named volumes as project resources. Depending on the project name, it may create &lt;code&gt;website_app-data&lt;/code&gt; instead of using your existing &lt;code&gt;app-data&lt;/code&gt; volume.&lt;/p&gt;

&lt;p&gt;Your container starts, but the expected data is missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution
&lt;/h2&gt;

&lt;p&gt;Declare the volume as external:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Compose uses the existing Docker volume named &lt;code&gt;app-data&lt;/code&gt; rather than creating a project-managed replacement.&lt;/p&gt;

&lt;p&gt;Key points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No automatic creation:&lt;/strong&gt; The volume must already exist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No project-name prefix:&lt;/strong&gt; Compose uses the specified external volume name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Independent lifecycle:&lt;/strong&gt; Compose does not manage the volume as its own resource.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the volume doesn't exist, Compose reports an error.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify your configuration
&lt;/h2&gt;

&lt;p&gt;Create the volume if necessary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create app-data
docker volume inspect app-data
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the existing volume has a different name, specify it explicitly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;legacy_website_data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows Compose to reference &lt;code&gt;legacy_website_data&lt;/code&gt; through the logical key &lt;code&gt;app-data&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistake
&lt;/h2&gt;

&lt;p&gt;Using &lt;code&gt;name&lt;/code&gt; alone is not equivalent to &lt;code&gt;external: true&lt;/code&gt;. The &lt;code&gt;name&lt;/code&gt; property specifies the actual volume name; &lt;code&gt;external: true&lt;/code&gt; declares that the volume already exists and is managed outside the current Compose project.&lt;/p&gt;

&lt;p&gt;Remember: external volumes are not backups. They can still be deleted manually or lost through storage failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;When you need Docker Compose to reuse an existing named volume, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One small configuration change can prevent unexpected volume duplication and help preserve data continuity across deployments.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>homelab</category>
    </item>
    <item>
      <title>Monitoring a Private Homelab Without Opening a Single Inbound Port</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Wed, 28 Oct 2026 07:00:58 +0000</pubDate>
      <link>https://dev.to/frankzhang/monitoring-a-private-homelab-without-opening-a-single-inbound-port-4i38</link>
      <guid>https://dev.to/frankzhang/monitoring-a-private-homelab-without-opening-a-single-inbound-port-4i38</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I'm the developer of OpsHome NOC, an iOS app and service for monitoring homelabs and small self-hosted environments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most monitoring tools ask for something uncomfortable: a port-forward, a VPN, or a publicly exposed management interface. For a homelab, that trade-off is usually the wrong one. This post summarizes how OpsHome NOC approaches it, based on our public security whitepaper.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  1. Outbound-only by design
&lt;/h2&gt;

&lt;p&gt;The Docker Probe runs inside a network you authorize and &lt;strong&gt;initiates outbound HTTPS connections&lt;/strong&gt;. In normal operation it needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no inbound firewall ports&lt;/li&gt;
&lt;li&gt;no router port forwarding&lt;/li&gt;
&lt;li&gt;no published internal management interface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your private infrastructure stays behind your network boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Least-privilege Probe
&lt;/h2&gt;

&lt;p&gt;Permissions follow the monitoring features you enable, and the requested access is shown before deployment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reaches only targets you authorize&lt;/li&gt;
&lt;li&gt;Host data paths mounted &lt;strong&gt;read-only&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No inbound service port published&lt;/li&gt;
&lt;li&gt;No remote shell, Docker Exec, or container-control feature&lt;/li&gt;
&lt;li&gt;No customer credential embedded in the published image&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Credentials and transport
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Client and Probe traffic uses encrypted HTTPS&lt;/li&gt;
&lt;li&gt;Probe requests are authenticated with replay protection&lt;/li&gt;
&lt;li&gt;Supported server-side credentials are encrypted before storage&lt;/li&gt;
&lt;li&gt;iOS authentication data is protected by Apple Keychain Services&lt;/li&gt;
&lt;li&gt;Full secrets are excluded from application logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We still recommend dedicated, least-privilege accounts for every integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. What data is (and isn't) kept
&lt;/h2&gt;

&lt;p&gt;Monitoring records (status, events, trends) are limited to the history window of the active plan and removed automatically when it expires. Application secrets and business-file contents are outside the telemetry scope and are not retained as monitoring records. Account deletion triggers an automated deletion process.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Don’t take our word for it. Verify it yourself
&lt;/h2&gt;

&lt;p&gt;The whitepaper ties its scan result to an exact image digest, so you can check what you're running. You can also watch the Probe's traffic yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; any host app.opshome.run &lt;span class="nt"&gt;-nn&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the digest, published ports, read-only mounts, and outbound connections against the published evidence. The service also publishes SSL Labs A+ and SecurityHeaders.com Grade A results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full whitepaper (document OPS-NOC-SEC-2026-V1):&lt;/strong&gt; &lt;a href="https://noc.opshome.run/security.html" rel="noopener noreferrer"&gt;https://noc.opshome.run/security.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Found a problem? The whitepaper lists a security contact, and I'd like to hear about it.&lt;/p&gt;

</description>
      <category>security</category>
      <category>docker</category>
      <category>homelab</category>
      <category>devops</category>
    </item>
    <item>
      <title>Monitoring your homelab from inside the LAN: public checks, a Docker Probe, and no port forwarding</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Wed, 28 Oct 2026 04:56:05 +0000</pubDate>
      <link>https://dev.to/frankzhang/monitoring-your-homelab-from-inside-the-lan-public-checks-a-docker-probe-and-no-port-forwarding-f5o</link>
      <guid>https://dev.to/frankzhang/monitoring-your-homelab-from-inside-the-lan-public-checks-a-docker-probe-and-no-port-forwarding-f5o</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyh4dtuy8dc4lsegykl9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyh4dtuy8dc4lsegykl9p.png" alt=" " width="800" height="1034"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An IT environment doesn't have to be large to be complicated.&lt;/p&gt;

&lt;p&gt;A homelab might run Proxmox VE, Docker, a NAS, and a handful of self-hosted apps. A small office might depend on internal servers, business websites, and cloud services. An IT administrator might need to keep an eye on several hosts, many service endpoints, and infrastructure spread across different networks.&lt;/p&gt;

&lt;p&gt;The scale differs, but the daily questions are the same: Is the service up right now? Can people reach the internal app? Is the infrastructure healthy? After an outage, can I quickly see what changed? And when users can't reach a service, is there somewhere they can check its status?&lt;/p&gt;

&lt;p&gt;OpsHome NOC is a lightweight monitoring and operations platform built around those questions. It combines public service checks, private network monitoring, Docker and infrastructure integrations, incident history, a browser-based Web Console, and Status Pages for external visitors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Whatever the size of your environment, OpsHome NOC does one thing: it lets you see the state of your services and infrastructure at a glance.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product website: &lt;a href="https://app.opshome.run/" rel="noopener noreferrer"&gt;https://app.opshome.run/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href="https://docs.opshome.run/" rel="noopener noreferrer"&gt;https://docs.opshome.run/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Is OpsHome NOC?
&lt;/h2&gt;

&lt;p&gt;OpsHome NOC is a lightweight network and infrastructure monitoring platform for homelabs, self-hosted services, home offices, small businesses, and any other setting where you need to watch network services and IT infrastructure.&lt;/p&gt;

&lt;p&gt;It is built around these capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service monitoring:&lt;/strong&gt; Check public services, plus HTTP, HTTPS, and TCP endpoints inside private networks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure visibility:&lt;/strong&gt; View Proxmox VE, VMware, Synology NAS, Linux, and Docker environments through integrations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Events and history:&lt;/strong&gt; Review state changes, alerts, recoveries, and event timelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile operations:&lt;/strong&gt; Check status anywhere from the iPhone app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser-based operations:&lt;/strong&gt; Use the Web Console to view monitoring and infrastructure information on a larger screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service status sharing:&lt;/strong&gt; Show selected service status to users, customers, or other visitors through Status Pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpsHome NOC does not try to replace dedicated log analysis, observability, or infrastructure management platforms. It adds a unified monitoring and status layer on top of the systems you already run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current version:&lt;/strong&gt; OpsHome NOC v1.16 (as of October 2026).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Available metrics and features depend on the platform, connection method, permissions, and the scope of each integration. Please refer to the official documentation and your actual deployment. The sections below describe capabilities directly and do not repeat this caveat.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. Public Monitoring and Private Network Monitoring
&lt;/h2&gt;

&lt;p&gt;The two kinds of checks answer different questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public monitoring&lt;/strong&gt; verifies that websites, APIs, and other public endpoints are reachable from the outside. It suits business websites, public services, and SSL certificate checks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private network monitoring&lt;/strong&gt; answers another question: from inside the network where the service actually runs, can it be reached? Typical scenarios include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Virtualization hosts and self-hosted apps in a homelab;&lt;/li&gt;
&lt;li&gt;File servers and internal business apps in a small office;&lt;/li&gt;
&lt;li&gt;Websites exposed through a reverse proxy whose backends stay on a private network.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Private network monitoring supports distributed deployment. As long as they belong to the same account, you can run Probes in different places, such as home, the office, a server room, or a VPS, and view them together in one place.&lt;/p&gt;

&lt;p&gt;A successful public check doesn't mean your internal apps and infrastructure are healthy. And opening management interfaces just so an external system can monitor internal services creates security risk. The two approaches complement each other, giving you both an outside view and an inside view of your services.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Docker Probe: Connecting Private Networks
&lt;/h2&gt;

&lt;p&gt;Docker Probe is the key component of private network monitoring. You deploy it on a Docker host that can reach your target services. It checks the configured services from inside the network and works with infrastructure integrations to collect data.&lt;/p&gt;

&lt;p&gt;The Probe connects to OpsHome Cloud over outbound HTTPS. In general you don't need inbound port forwarding, and you don't need to expose internal services to the internet just to monitor them from the cloud.&lt;/p&gt;

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

&lt;p&gt;Typical uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checking internal HTTP and HTTPS services;&lt;/li&gt;
&lt;li&gt;Testing TCP service reachability;&lt;/li&gt;
&lt;li&gt;Monitoring Docker container status and container events;&lt;/li&gt;
&lt;li&gt;Collecting infrastructure information.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Security recommendation:&lt;/strong&gt; When deploying a Probe, mount the Docker Socket read-only, and use dedicated least-privilege accounts or API tokens for integrations such as Proxmox and Synology.&lt;/p&gt;

&lt;p&gt;Related documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker Probe installation: &lt;a href="https://docs.opshome.run/docs/docker-probe/install/" rel="noopener noreferrer"&gt;https://docs.opshome.run/docs/docker-probe/install/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Private HTTP, HTTPS, and TCP monitors: &lt;a href="https://docs.opshome.run/docs/private-monitors/http-https-tcp/" rel="noopener noreferrer"&gt;https://docs.opshome.run/docs/private-monitors/http-https-tcp/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Synology integration: &lt;a href="https://docs.opshome.run/docs/synology/add-synology/" rel="noopener noreferrer"&gt;https://docs.opshome.run/docs/synology/add-synology/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Infrastructure Monitoring: More Than Checking Whether a Port Is Up
&lt;/h2&gt;

&lt;p&gt;A service that answers requests isn't necessarily running on healthy infrastructure. A virtualization host may still be reachable while its storage or virtual machines have problems. A NAS may be online while some of its resources are already abnormal. So besides availability checks, OpsHome NOC provides infrastructure information through integrations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Proxmox VE:&lt;/strong&gt; View nodes, virtual machines, LXC containers, storage, and resource metrics. Connect with a dedicated API token and scope its permissions as needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VMware ESXi / vSphere:&lt;/strong&gt; View hosts, virtual machines, datastores, and resource information. The exact fields depend on your actual deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synology NAS:&lt;/strong&gt; Depending on DSM version and collection method, view system status, resources, storage, disks, and network information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux and Docker:&lt;/strong&gt; Combine host information, container status, and service checks to understand the basic health of your runtime environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apply the principle of least privilege to monitoring credentials, and avoid granting unnecessary administrative rights.&lt;/p&gt;

&lt;p&gt;Related documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infrastructure assets: &lt;a href="https://docs.opshome.run/assets.html" rel="noopener noreferrer"&gt;https://docs.opshome.run/assets.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Proxmox API token guide: &lt;a href="https://docs.opshome.run/articles/proxmox-opshome-api-token-guide.html" rel="noopener noreferrer"&gt;https://docs.opshome.run/articles/proxmox-opshome-api-token-guide.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Incident History and Troubleshooting
&lt;/h2&gt;

&lt;p&gt;The value of monitoring lies not only in spotting problems but also in keeping enough information to see how a problem unfolded.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2tq4547vhikn6yp5o6x0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2tq4547vhikn6yp5o6x0.png" alt=" " width="800" height="561"&gt;&lt;/a&gt;&lt;br&gt;
OpsHome NOC provides an Incident Workspace that links events from monitors and infrastructure assets. It shows active and resolved incidents, severity, duration, affected resources, an evidence timeline, and recovery information. Combined with Docker container events, it helps you tell apart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A public endpoint that is unreachable;&lt;/li&gt;
&lt;li&gt;A private service that failed an internal check;&lt;/li&gt;
&lt;li&gt;A container that restarted or entered an abnormal state;&lt;/li&gt;
&lt;li&gt;Infrastructure that is reporting an anomaly;&lt;/li&gt;
&lt;li&gt;A brief outage that has since recovered on its own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the specifics of how much history is kept, see the official documentation: &lt;a href="https://docs.opshome.run/" rel="noopener noreferrer"&gt;https://docs.opshome.run/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These records help narrow down your investigation, but they cannot automatically diagnose every failure. Root-cause analysis still requires infrastructure management tools and application logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Web Console: Browser-Based Operations
&lt;/h2&gt;

&lt;p&gt;The mobile app is ideal for quick status checks and receiving alerts. The Web Console is built for viewing your whole environment on a desktop, tablet, or wall display.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monitor matrix:&lt;/strong&gt; Public checks and private Probe targets in a single matrix, showing availability, latency, protocol, and current state at a glance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assets topology:&lt;/strong&gt; Compute, storage, utilization, and workloads across Synology, Proxmox, VMware, and Linux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident context:&lt;/strong&gt; Start from an active risk and trace it to affected resources, evidence, and incident history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wall display mode:&lt;/strong&gt; Turn a browser into a long-running status board.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experience:&lt;/strong&gt; Light and dark themes, adapted to large desktop displays, iPad, and mobile browsers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Web Console is read-only by design. It is for reviewing state and investigating incidents. It provides no infrastructure control and does not replace the management interfaces of Proxmox, VMware, Synology, or Docker. Sign-in uses the same Apple account as the app (Sign in with Apple), and OpsHome never receives or stores your Apple Account password.&lt;/p&gt;

&lt;p&gt;What the Web Console displays depends on your plan tier. See Section 9 for the limits of each plan.&lt;/p&gt;

&lt;p&gt;To get started, add monitors and assets in the iPhone app, then open &lt;a href="https://console.opshome.run/" rel="noopener noreferrer"&gt;https://console.opshome.run/&lt;/a&gt; in a browser. Your data syncs automatically.&lt;/p&gt;

&lt;p&gt;Learn more: &lt;a href="https://noc.opshome.run/console/" rel="noopener noreferrer"&gt;https://noc.opshome.run/console/&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  6. Status Pages: Showing Service Status to Users and Customers
&lt;/h2&gt;

&lt;p&gt;Internal monitoring answers "how do operators understand the state of the system?" Service users have a simpler need: &lt;strong&gt;Is the service working right now, and is there a known outage?&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;A Status Page is a public-facing page. You choose which monitors to publish, and visitors can see the following without opening your monitoring dashboard:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The current online state of each service and its latest check;&lt;/li&gt;
&lt;li&gt;24-hour, 7-day, and 30-day uptime summaries;&lt;/li&gt;
&lt;li&gt;Response times;&lt;/li&gt;
&lt;li&gt;Recent incidents and recovery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sharing and control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Share by link or QR code. Scanning the QR code in the OpsHome app verifies that the page was issued by OpsHome.&lt;/li&gt;
&lt;li&gt;Access code protection is supported, and sharing duration can be set from 24 hours to permanent.&lt;/li&gt;
&lt;li&gt;Public pages never expose real IPs, domains, or internal network details.&lt;/li&gt;
&lt;li&gt;You can disable or delete a Status Page at any time from the app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Typical scenarios: a small business showing customers the status of key services; a self-hosted app operator sharing a status page with users; a homelab owner giving family a single place to check. Meanwhile, administrators keep investigating with their internal tools.&lt;/p&gt;

&lt;p&gt;You control what is public. Publish only services that are appropriate to share.&lt;/p&gt;

&lt;p&gt;Learn more: &lt;a href="https://noc.opshome.run/status-pages/" rel="noopener noreferrer"&gt;https://noc.opshome.run/status-pages/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Three Entry Points, Three Roles
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Entry point&lt;/th&gt;
&lt;th&gt;Main audience&lt;/th&gt;
&lt;th&gt;Core purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;iPhone app (iPad supported)&lt;/td&gt;
&lt;td&gt;Operators&lt;/td&gt;
&lt;td&gt;Configure monitoring, check status on the go, follow up on alerts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Console&lt;/td&gt;
&lt;td&gt;Operators&lt;/td&gt;
&lt;td&gt;Read-only browser monitoring, asset viewing, wall display&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status Pages&lt;/td&gt;
&lt;td&gt;Users, customers, and other visitors&lt;/td&gt;
&lt;td&gt;Show the service status the operator chooses to make public&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The iPhone app is available anywhere, the Web Console is for deeper observation, and Status Pages handle external communication. Together they cover the whole path from spotting a problem to understanding it to telling others.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Scope and Limits
&lt;/h2&gt;

&lt;p&gt;OpsHome NOC suits individuals, small offices, business teams, and IT administrators who want a clear view of how their services are running. How well it fits depends on your devices, integrations, and actual needs.&lt;/p&gt;

&lt;p&gt;It is not a replacement for log analysis, metrics platforms, distributed tracing, or security analytics systems, and it doesn't replace sound network segmentation, permission management, and credential protection. Its role is to add a layer of monitoring, observation, and status communication on top of your existing systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Getting Started
&lt;/h2&gt;

&lt;p&gt;You don't need to connect everything at once. Start with your most important services and expand from there:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add public monitors for your key websites and APIs.&lt;/li&gt;
&lt;li&gt;Deploy a Docker Probe on a host that can reach your private network.&lt;/li&gt;
&lt;li&gt;Add Private Monitors for internal apps.&lt;/li&gt;
&lt;li&gt;Connect integrations such as Proxmox, VMware, and Synology as your environment requires.&lt;/li&gt;
&lt;li&gt;Check status and operations information in the iPhone app or the Web Console.&lt;/li&gt;
&lt;li&gt;When you need to communicate externally, set up a Status Page.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Get the App
&lt;/h3&gt;

&lt;p&gt;OpsHome NOC is a free download on the App Store (requires iOS 17.6 or later). Core monitoring works without a subscription and without a credit card:&lt;br&gt;
&lt;a href="https://apps.apple.com/us/app/opshome-noc/id6763890679" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/opshome-noc/id6763890679&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Plans
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Free&lt;/th&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;th&gt;Studio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$2.99/month or $24.99/year&lt;/td&gt;
&lt;td&gt;$5.99/month or $49.99/year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public monitor targets&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitor types&lt;/td&gt;
&lt;td&gt;HTTP / HTTPS / TCP / SSL / ICMP&lt;/td&gt;
&lt;td&gt;All types, including UDP, DNS, Domain&lt;/td&gt;
&lt;td&gt;All types and infrastructure integrations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker Probes&lt;/td&gt;
&lt;td&gt;1 (Synology)&lt;/td&gt;
&lt;td&gt;12 (multi-platform)&lt;/td&gt;
&lt;td&gt;25 (multi-platform)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private Monitors&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asset sources&lt;/td&gt;
&lt;td&gt;Synology assets&lt;/td&gt;
&lt;td&gt;12 (Proxmox VE, VMware vSphere, Linux, Synology)&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status Pages&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;5, with 20 monitors per page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minimum check interval&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;3 minutes&lt;/td&gt;
&lt;td&gt;3 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telegram push alerts&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Custom Telegram setup&lt;/td&gt;
&lt;td&gt;Custom Telegram setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Also included&lt;/td&gt;
&lt;td&gt;Push alerts, SSL expiry reminders&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prices are shown in USD. Your App Store may display a different local price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Founder Benefit:&lt;/strong&gt; Eligible early accounts registered before May 1, 2027 permanently keep 30 public monitors, 3 Synology Docker Probes, 6 Private Monitors, and 1 Status Page.&lt;/p&gt;

&lt;p&gt;Official resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product website: &lt;a href="https://app.opshome.run/" rel="noopener noreferrer"&gt;https://app.opshome.run/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Web Console: &lt;a href="https://noc.opshome.run/console/" rel="noopener noreferrer"&gt;https://noc.opshome.run/console/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Status Pages: &lt;a href="https://noc.opshome.run/status-pages/" rel="noopener noreferrer"&gt;https://noc.opshome.run/status-pages/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href="https://docs.opshome.run/" rel="noopener noreferrer"&gt;https://docs.opshome.run/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docker Probe installation: &lt;a href="https://docs.opshome.run/docs/docker-probe/install/" rel="noopener noreferrer"&gt;https://docs.opshome.run/docs/docker-probe/install/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Private HTTP, HTTPS, and TCP monitors: &lt;a href="https://docs.opshome.run/docs/private-monitors/http-https-tcp/" rel="noopener noreferrer"&gt;https://docs.opshome.run/docs/private-monitors/http-https-tcp/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;IT environments differ in size and purpose, but the core of monitoring is the same: know whether your services are healthy, understand the state of your infrastructure, and get useful information when something goes wrong.&lt;/p&gt;

&lt;p&gt;Through public monitoring, Docker Probe, infrastructure integrations, and incident history, OpsHome NOC helps you keep track of how your services and infrastructure are running. The iPhone app and Web Console serve operators, and Status Pages serve external visitors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your Infrastructure. One Glance Away.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>ios</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Traceroute, Visualized: Turning Raw MTR Hops into a Route You Can Explore</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Tue, 27 Oct 2026 08:52:18 +0000</pubDate>
      <link>https://dev.to/frankzhang/traceroute-visualized-turning-raw-mtr-hops-into-a-route-you-can-explore-1dfk</link>
      <guid>https://dev.to/frankzhang/traceroute-visualized-turning-raw-mtr-hops-into-a-route-you-can-explore-1dfk</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmx32f2blgw0ulrdksg4w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmx32f2blgw0ulrdksg4w.gif" alt=" " width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A traceroute can tell you which hops responded along a network path. MTR&lt;br&gt;
goes further by repeating probes and collecting latency statistics over&lt;br&gt;
time.&lt;/p&gt;

&lt;p&gt;But raw hop data is only part of the story.&lt;/p&gt;

&lt;p&gt;When troubleshooting a network, I often want to answer several questions&lt;br&gt;
quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Which network organizations do these hops belong to?&lt;/li&gt;
&lt;li&gt;  Where does latency change along the route?&lt;/li&gt;
&lt;li&gt;  Has the path changed since the last test?&lt;/li&gt;
&lt;li&gt;  Can I understand the route without digging through a long list of IP
addresses?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions inspired the latest round of improvements to &lt;strong&gt;Visual&lt;br&gt;
MTR&lt;/strong&gt;, a native traceroute and network path diagnostics app for iPhone&lt;br&gt;
and iPad.&lt;/p&gt;

&lt;p&gt;The goal is not to turn network troubleshooting into a pretty animation.&lt;br&gt;
It is to make route information easier to explore while preserving the&lt;br&gt;
underlying diagnostic evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Preserve the original hop order
&lt;/h2&gt;

&lt;p&gt;A network path should not lose its sequence simply because we want to&lt;br&gt;
visualize it.&lt;/p&gt;

&lt;p&gt;In the latest interface, the AS Route view uses a vertical timeline&lt;br&gt;
ordered by the original TTL sequence rather than a row of horizontally&lt;br&gt;
arranged cards.&lt;/p&gt;

&lt;p&gt;Each entry provides a compact summary, including the ASN, network&lt;br&gt;
operator, hop number, and average RTT. Expand an entry to inspect more&lt;br&gt;
detailed information, such as the hop IP address, response times, and&lt;br&gt;
estimated geographic location.&lt;/p&gt;

&lt;p&gt;This creates two useful levels of detail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;At a glance:&lt;/strong&gt; Follow the sequence of network organizations and
compare latency along the path.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;On demand:&lt;/strong&gt; Drill down into individual hops without losing their
position in the original trace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is an important distinction here: an ASN-oriented view derived&lt;br&gt;
from observed hops is not the same as a complete BGP AS_PATH. It is a&lt;br&gt;
way to organize the evidence collected by the traceroute, not a claim to&lt;br&gt;
reconstruct every routing decision made by the network.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Separate live results from deeper analysis
&lt;/h2&gt;

&lt;p&gt;A diagnostic tool becomes harder to use when every result, chart, and&lt;br&gt;
saved report competes for attention.&lt;/p&gt;

&lt;p&gt;Visual MTR now separates the workflow into three areas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current Test&lt;/strong&gt; - Live Hops - Trace Report&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advanced Analysis&lt;/strong&gt; - MTR Analysis - Globe Report - Route Diff&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Archive&lt;/strong&gt; - Test History&lt;/p&gt;

&lt;p&gt;The distinction is intentional.&lt;/p&gt;

&lt;p&gt;Live results help answer what is happening in the current test. Advanced&lt;br&gt;
analysis helps investigate patterns or compare routes. The archive makes&lt;br&gt;
it easier to revisit previous measurements.&lt;/p&gt;

&lt;p&gt;Instead of treating every screen as another version of the same report,&lt;br&gt;
each area has a specific job.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  3. Look at latency over multiple rounds
&lt;/h2&gt;

&lt;p&gt;A single traceroute is a snapshot. Network conditions can change between&lt;br&gt;
measurements, and one unusually high RTT does not necessarily indicate&lt;br&gt;
persistent congestion.&lt;/p&gt;

&lt;p&gt;Multi-round MTR provides a more useful basis for comparison.&lt;/p&gt;

&lt;p&gt;Visual MTR's Pro analysis includes independent statistics for individual&lt;br&gt;
rounds, alongside aggregated results. RTT summaries, trends, and&lt;br&gt;
hop-by-round heatmaps help reveal whether a delay is persistent,&lt;br&gt;
intermittent, or limited to a particular measurement period.&lt;/p&gt;

&lt;p&gt;This changes the questions we can ask.&lt;/p&gt;

&lt;p&gt;Rather than looking only at the average, we can investigate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Does latency remain elevated across multiple rounds?&lt;/li&gt;
&lt;li&gt;  Does the variation appear consistently at the same hop?&lt;/li&gt;
&lt;li&gt;  Are individual rounds behaving differently from the overall result?&lt;/li&gt;
&lt;li&gt;  Does a change in the route coincide with a change in observed
latency?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These views do not automatically identify the root cause. They make it&lt;br&gt;
easier to determine which part of the path deserves further&lt;br&gt;
investigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Compare routes instead of relying on memory
&lt;/h2&gt;

&lt;p&gt;Two traces to the same destination may not look identical.&lt;/p&gt;

&lt;p&gt;A later test can reveal a different sequence of responding hops, changes&lt;br&gt;
in observed network organizations, or differences in latency&lt;br&gt;
measurements.&lt;/p&gt;

&lt;p&gt;The Route Diff view helps make those changes easier to investigate.&lt;/p&gt;

&lt;p&gt;Instead of manually comparing two long reports, you can use the&lt;br&gt;
comparison workflow to focus on what changed and then return to the&lt;br&gt;
relevant hop-level details.&lt;/p&gt;

&lt;p&gt;This is especially useful when investigating intermittent connectivity,&lt;br&gt;
changes after network maintenance, or differences between tests taken at&lt;br&gt;
different times.&lt;/p&gt;

&lt;p&gt;A route difference is evidence, not a diagnosis. Routing policies, load&lt;br&gt;
balancing, transient conditions, and probe-response behavior can all&lt;br&gt;
affect what a trace shows. The next step is to correlate the observed&lt;br&gt;
change with the actual connectivity problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Explore the route on a 3D globe
&lt;/h2&gt;

&lt;p&gt;The new Globe Report provides another way to inspect a route.&lt;/p&gt;

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

&lt;p&gt;Rather than presenting only a list of hops, it places geographically&lt;br&gt;
locatable hops on an interactive 3D globe. You can rotate and zoom the&lt;br&gt;
globe, select points, and reset the view to explore the displayed route.&lt;/p&gt;

&lt;p&gt;The visualization is designed to complement the original trace, not&lt;br&gt;
replace it.&lt;/p&gt;

&lt;p&gt;There are two important implementation details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, hop order must remain meaningful.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The globe uses a single selected trace round with usable geographic&lt;br&gt;
information. It does not combine hops from different rounds into a&lt;br&gt;
synthetic route. This avoids presenting a visually complete path that&lt;br&gt;
was never observed in any individual round.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, geographic information has limits.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IP geolocation provides estimates, not verified physical router&lt;br&gt;
coordinates. The displayed connections represent logical hop order; they&lt;br&gt;
are not verified physical cable routes.&lt;/p&gt;

&lt;p&gt;A globe view is useful for understanding the broad geographic context of&lt;br&gt;
a path. Exact latency measurements and the original hop sequence remain&lt;br&gt;
essential for technical analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Network diagnostics that fit in your pocket
&lt;/h2&gt;

&lt;p&gt;Visual MTR is designed for situations where opening a laptop is&lt;br&gt;
inconvenient or impossible.&lt;/p&gt;

&lt;p&gt;The app provides native IPv4 and IPv6 tracing, per-hop response&lt;br&gt;
information, offline ASN lookup, and configurable DNS settings.&lt;/p&gt;

&lt;p&gt;Pro extends the workflow with multi-round MTR, advanced visual analysis,&lt;br&gt;
the 3D Globe Report, Route Diff, and PDF, JSON, and text report exports.&lt;br&gt;
Saved diagnostic history also makes it easier to revisit previous tests.&lt;/p&gt;

&lt;p&gt;The app uses a free core workflow with a one-time Pro in-app purchase&lt;br&gt;
rather than a subscription.&lt;/p&gt;

&lt;p&gt;The objective is straightforward: make it possible to start with a&lt;br&gt;
simple trace and move into deeper analysis when the problem warrants it,&lt;br&gt;
without forcing every user to navigate the same level of complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Visualization should clarify evidence, not overstate it
&lt;/h2&gt;

&lt;p&gt;A good network visualization should make technical information easier to&lt;br&gt;
understand without suggesting more certainty than the measurements&lt;br&gt;
support.&lt;/p&gt;

&lt;p&gt;For traceroute and MTR, that means keeping a few principles in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  A hop that does not respond to probes is not automatically dropping
forwarded traffic.&lt;/li&gt;
&lt;li&gt;  An ASN summary does not reveal the complete BGP routing state.&lt;/li&gt;
&lt;li&gt;  An estimated IP location is not the physical location of a router.&lt;/li&gt;
&lt;li&gt;  A difference between two traces does not, by itself, prove the cause
of an incident.&lt;/li&gt;
&lt;li&gt;  A visual route should remain traceable to the measurements from
which it was derived.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These constraints are not limitations to hide. They are part of building&lt;br&gt;
a diagnostic tool that network engineers can trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Visual MTR
&lt;/h2&gt;

&lt;p&gt;Visual MTR brings native route tracing and visual network path analysis&lt;br&gt;
to iPhone and iPad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App Store:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://apps.apple.com/app/visual-mtr-traceroute/id6821332849" rel="noopener noreferrer"&gt;https://apps.apple.com/app/visual-mtr-traceroute/id6821332849&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The product is still evolving, but the direction is clear: preserve the&lt;br&gt;
original measurements, organize the route intelligently, and give users&lt;br&gt;
better ways to investigate what they see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you troubleshoot networks on a mobile device, which view would help&lt;br&gt;
you most: an ordered hop timeline, multi-round latency analysis, route&lt;br&gt;
comparison, or a 3D globe?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd be interested to hear how other network engineers approach route&lt;br&gt;
analysis when they are away from their usual workstation.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>devops</category>
      <category>troubleshooting</category>
      <category>ios</category>
    </item>
    <item>
      <title>How to Read MTR Results: Why Packet Loss at One Hop Often Isn't a Problem</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Sun, 25 Oct 2026 12:33:19 +0000</pubDate>
      <link>https://dev.to/frankzhang/how-to-read-mtr-results-why-packet-loss-at-one-hop-often-isnt-a-problem-4g76</link>
      <guid>https://dev.to/frankzhang/how-to-read-mtr-results-why-packet-loss-at-one-hop-often-isnt-a-problem-4g76</guid>
      <description>&lt;p&gt;Have you ever run an MTR, seen 40% packet loss on a router halfway to&lt;br&gt;
your destination, and assumed you had found the culprit?&lt;/p&gt;

&lt;p&gt;Often, you haven't. One of the most common mistakes in network&lt;br&gt;
troubleshooting is treating the first unusual number as the root cause.&lt;br&gt;
This guide explains how traceroute and MTR work, how to interpret their&lt;br&gt;
output, and how to avoid blaming the wrong hop.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. What Does Traceroute Actually Tell You?
&lt;/h2&gt;

&lt;p&gt;Traceroute identifies the intermediate network hops between your device&lt;br&gt;
and a destination.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;traceroute example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;tracert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A typical result looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1   192.168.1.1       1.2 ms
2   10.20.0.1         8.4 ms
3   203.0.113.10     18.7 ms
4   * * *
5   198.51.100.20    42.1 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each numbered line represents a hop. The time shows how long it took to&lt;br&gt;
receive a response to a probe from that hop. &lt;code&gt;* * *&lt;/code&gt; means no response&lt;br&gt;
arrived before the timeout; it does &lt;strong&gt;not&lt;/strong&gt; automatically mean that the&lt;br&gt;
hop is dropping forwarded traffic.&lt;/p&gt;

&lt;p&gt;Traceroute has two important limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;A single run is only a snapshot.&lt;/strong&gt; Congestion, routing changes,
and wireless interference can produce different results from one run
to the next.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;It does not reveal the full return path.&lt;/strong&gt; The route taken by
replies from a hop back to your device may differ from the outbound
path. A slow response from an intermediate hop does not necessarily
mean that ordinary traffic is being forwarded slowly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  2. Why MTR Is More Useful for Troubleshooting
&lt;/h2&gt;

&lt;p&gt;MTR combines traceroute-style path discovery with repeated measurements.&lt;br&gt;
Instead of collecting only one response per hop, it repeatedly probes&lt;br&gt;
the route and accumulates statistics.&lt;/p&gt;

&lt;p&gt;Common metrics include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Loss%:&lt;/strong&gt; The percentage of probes to that hop that did not receive
a response.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Last:&lt;/strong&gt; The most recent response time.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Avg:&lt;/strong&gt; The average response time.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Best / Wrst:&lt;/strong&gt; The lowest and highest response times.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;StDev:&lt;/strong&gt; A measure of how much response times vary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These numbers help you ask better questions. Is latency consistently&lt;br&gt;
high or only occasionally high? Does response-time variability appear at&lt;br&gt;
a particular hop? Does apparent loss continue all the way to the&lt;br&gt;
destination?&lt;/p&gt;

&lt;p&gt;For a shareable text report from a desktop, try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mtr &lt;span class="nt"&gt;-rw&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 100 example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;-r&lt;/code&gt; prints a report, &lt;code&gt;-w&lt;/code&gt; uses wide output, and &lt;code&gt;-c 100&lt;/code&gt; runs 100&lt;br&gt;
probe cycles. Options for displaying IP addresses or ASN information&lt;br&gt;
vary by MTR version; consult the installed version's manual if you want&lt;br&gt;
to include them.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. How to Interpret MTR Results Correctly
&lt;/h2&gt;

&lt;p&gt;Consider this simplified example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host          Loss%    Avg
Gateway        0%      1.5 ms
Router A       0%      8.2 ms
Router B      35%     12.4 ms
Router C       0%     18.6 ms
Destination    0%     25.1 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Router B shows 35% probe loss, but the later hops and destination show&lt;br&gt;
none. This pattern is more consistent with ICMP response rate limiting&lt;br&gt;
or deprioritization than with end-to-end packet loss. Many routers&lt;br&gt;
prioritize forwarding traffic over responding to diagnostic probes, so&lt;br&gt;
they may ignore or delay some replies while continuing to forward&lt;br&gt;
ordinary traffic.&lt;/p&gt;

&lt;p&gt;However, this is a diagnostic clue, not definitive proof. Probe&lt;br&gt;
behavior, return paths, and load balancing can complicate the results.&lt;/p&gt;
&lt;h3&gt;
  
  
  Scenario A: Loss appears at one intermediate hop only
&lt;/h3&gt;

&lt;p&gt;Loss appears at one intermediate hop, while later hops and the&lt;br&gt;
destination are clean. ICMP response rate limiting or deprioritization&lt;br&gt;
is one likely explanation. Do not conclude that the router is faulty&lt;br&gt;
based on that hop alone.&lt;/p&gt;
&lt;h3&gt;
  
  
  Scenario B: Loss continues to the destination
&lt;/h3&gt;

&lt;p&gt;Compare the previous result with this example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host          Loss%    Avg
Gateway        0%      1.5 ms
Router A       0%      8.2 ms
Router B      22%     12.4 ms
Router C      21%     18.6 ms
Destination   23%     25.1 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, loss begins at Router B and remains visible through subsequent&lt;br&gt;
hops and at the destination. That pattern deserves closer investigation.&lt;br&gt;
Repeat the test at different times and check whether real application&lt;br&gt;
traffic is affected.&lt;/p&gt;

&lt;p&gt;Even this pattern does not, by itself, prove that Router B is the cause.&lt;br&gt;
It identifies a point from which further investigation is warranted.&lt;/p&gt;
&lt;h3&gt;
  
  
  Scenario C: Latency rises and stays high
&lt;/h3&gt;

&lt;p&gt;Response times are low for the first few hops, then increase and remain&lt;br&gt;
elevated. This may point to a longer-distance segment, congestion, or a&lt;br&gt;
routing change. It is a useful lead, not proof of a fault at the first&lt;br&gt;
hop where the increase appears. Remember that response times from&lt;br&gt;
intermediate hops can be affected by their return paths and by how they&lt;br&gt;
prioritize diagnostic traffic.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The key principle: diagnose patterns across the path, not isolated&lt;br&gt;
numbers.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  4. A Practical Workflow
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Establish a baseline.&lt;/strong&gt; Run a trace to a known destination and&lt;br&gt;
record the route and typical latency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Repeat the measurement.&lt;/strong&gt; Multiple rounds help distinguish&lt;br&gt;
persistent behavior from short-lived variation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Check the first few hops.&lt;/strong&gt; If latency or loss appears near&lt;br&gt;
your gateway, investigate Wi-Fi, cabling, and your router. If the local&lt;br&gt;
path looks stable, continue upstream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Compare the suspicious hop with the hops after it.&lt;/strong&gt; A hop&lt;br&gt;
that fails to answer probes is not necessarily dropping forwarded&lt;br&gt;
traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Try a different probe type.&lt;/strong&gt; Some networks treat ICMP&lt;br&gt;
differently from TCP or UDP. If you suspect ICMP is being limited, try a&lt;br&gt;
TCP-based test toward the port your application actually uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mtr &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; 443 &lt;span class="nt"&gt;-rw&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 100 example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example uses TCP probes toward port 443. If TCP-based MTR shows no&lt;br&gt;
loss while ICMP-based MTR shows loss, that supports the ICMP&lt;br&gt;
rate-limiting hypothesis, but does not prove it. Different probe types&lt;br&gt;
may follow different ECMP paths or be treated differently by firewalls&lt;br&gt;
and network devices. TCP mode and supported options can also vary by MTR&lt;br&gt;
version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Match the results to the symptom.&lt;/strong&gt; If SSH sessions drop or an&lt;br&gt;
app slows down, check whether the timing lines up with the trace.&lt;br&gt;
Application logs and other targeted tests can provide additional&lt;br&gt;
evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7: Save the results.&lt;/strong&gt; Recorded reports make it easier to spot&lt;br&gt;
recurring patterns and explain the problem to an ISP or colleague.&lt;/p&gt;

&lt;p&gt;This workflow applies to home networks, cloud servers, remote&lt;br&gt;
administration, and homelabs.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Running MTR from an iPhone or iPad
&lt;/h2&gt;

&lt;p&gt;Desktop tools are excellent for deep diagnostics, but problems do not&lt;br&gt;
always happen next to a laptop. You might be at a customer site, using&lt;br&gt;
guest Wi-Fi, or away from your desk and need a quick answer: is the&lt;br&gt;
problem local, or is it farther upstream?&lt;/p&gt;

&lt;p&gt;That is why I built &lt;strong&gt;Visual MTR: Traceroute&lt;/strong&gt;, a native iOS and iPadOS&lt;br&gt;
app for route tracing and path analysis.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Free
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  IPv4 and IPv6 route tracing&lt;/li&gt;
&lt;li&gt;  Per-hop IP addresses and response times&lt;/li&gt;
&lt;li&gt;  Adjustable hop limit and probe timeout&lt;/li&gt;
&lt;li&gt;  Offline IPv4 and IPv6 ASN lookup, so you can see which network each
hop belongs to&lt;/li&gt;
&lt;li&gt;  Up to three configurable DNS servers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pro Lifetime --- one-time purchase, no subscription
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Multi-round MTR with independent statistics for each round&lt;/li&gt;
&lt;li&gt;  Minimum, average, and maximum RTT, plus RTT variation&lt;/li&gt;
&lt;li&gt;  RTT trends and hop-by-round heatmaps&lt;/li&gt;
&lt;li&gt;  Visual ASN route topology&lt;/li&gt;
&lt;li&gt;  Unlimited saved diagnostic history&lt;/li&gt;
&lt;li&gt;  PDF, JSON, and text report export&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These Pro features map directly to the workflow above. Multiple rounds&lt;br&gt;
and heatmaps help distinguish a one-off spike from a persistent pattern&lt;br&gt;
(Steps 2 and 4), while report export makes it easier to save evidence&lt;br&gt;
and share it (Step 7).&lt;/p&gt;

&lt;p&gt;Diagnostic history stays on your device, and ASN lookup works offline&lt;br&gt;
without a cloud account. One important caveat: ASN country labels&lt;br&gt;
reflect registration data, not necessarily the physical location of a&lt;br&gt;
router.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Try Visual MTR
&lt;/h2&gt;

&lt;p&gt;A route trace tells you where your probes travel. Repeated measurements&lt;br&gt;
help you understand how the path behaves. The difference between those&lt;br&gt;
two is the difference between guessing and troubleshooting.&lt;/p&gt;

&lt;p&gt;A route trace tells you where your probes travel. Repeated measurements help you understand how that path behaves. The difference between those two is the difference between guessing and troubleshooting.&lt;/p&gt;

&lt;p&gt;Try Visual MTR: Traceroute for iPhone and iPad.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/us/app/visual-mtr-traceroute/id6821332849" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/visual-mtr-traceroute/id6821332849&lt;/a&gt;&lt;/p&gt;

</description>
      <category>traceroute</category>
      <category>networktroubleshooting</category>
      <category>networking</category>
      <category>mtr</category>
    </item>
    <item>
      <title>Do You Know What’s Connected to Your Wi-Fi?</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Sun, 25 Oct 2026 05:48:33 +0000</pubDate>
      <link>https://dev.to/frankzhang/do-you-know-whats-connected-to-your-wi-fi-1bc6</link>
      <guid>https://dev.to/frankzhang/do-you-know-whats-connected-to-your-wi-fi-1bc6</guid>
      <description>&lt;p&gt;You can probably name every phone and computer in your home without thinking twice.&lt;/p&gt;

&lt;p&gt;But what about the TV, printer, cameras, smart speakers, NAS, and that old tablet you occasionally pull out of a drawer?&lt;/p&gt;

&lt;p&gt;As more devices get connected, your home network becomes a small collection of systems quietly working in the background. Then one day, you want to identify an unfamiliar device or troubleshoot a connection—and realize you could use a clearer picture of what’s there.&lt;/p&gt;

&lt;p&gt;WiFi Health Check brings device discovery, network diagnostics, walk tests, and stability testing to iPhone and iPad, so you can explore your network directly from your mobile device.&lt;/p&gt;

&lt;h2&gt;
  
  
  01 | Start by Seeing Who’s on Your Network
&lt;/h2&gt;

&lt;p&gt;Running a LAN scan and watching devices appear in the list is one of the most direct ways to get to know your network.&lt;/p&gt;

&lt;p&gt;Phones, computers, printers, cameras, network equipment—devices scattered across different rooms and management interfaces can now be viewed in one place. Device category counts also make it easier to see how your network is made up.&lt;/p&gt;

&lt;p&gt;If you have a NAS, virtualization hosts, or smart home devices, this inventory is especially useful. After connecting a new device, you can check whether it has been discovered and view its IP address and identification details.&lt;/p&gt;

&lt;h2&gt;
  
  
  02 | What Exactly Is That Unfamiliar Device?
&lt;/h2&gt;

&lt;p&gt;The entries that make you pause are often the ones with names you don’t recognize: an unfamiliar hostname, an IP address, or a record that shows only a manufacturer.&lt;/p&gt;

&lt;p&gt;WiFi Health Check combines multiple clues to help identify devices, including their manufacturer, device category, model, and discoverable services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multicast Discovery&lt;/strong&gt; is particularly useful here. Devices can announce information through local discovery protocols, and the app combines those details with other probe results to build a more informative device list.&lt;/p&gt;

&lt;p&gt;For example, mDNS / Bonjour, SSDP, and WS-Discovery can provide useful clues for identifying Apple devices, printers, media devices, and cameras.&lt;/p&gt;

&lt;p&gt;Once you’ve identified a device, you can give it a memorable alias. The next time you see “Office Printer” or “Living Room TV,” you won’t have to work out what it is all over again.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  03 | What Has Changed Since the Last Scan?
&lt;/h2&gt;

&lt;p&gt;You’ve installed a new camera, replaced a phone, or rearranged your network equipment. What’s different from your previous scan?&lt;/p&gt;

&lt;p&gt;Scan history and device change comparisons let you review results from different points in time, see newly discovered devices, and check which devices were not found in the current scan.&lt;/p&gt;

&lt;p&gt;For a home network with plenty of devices—or a small studio—this saves you from repeatedly scrolling through lists and manually comparing addresses. Giving important devices recognizable aliases makes the changes even easier to follow.&lt;/p&gt;

&lt;p&gt;Your network inventory now has a timeline: you can inspect the current results and look back at earlier records.&lt;/p&gt;

&lt;h2&gt;
  
  
  04 | Same Wi-Fi, Different Room—Why Does It Feel Different?
&lt;/h2&gt;

&lt;p&gt;Video streams smoothly in the living room but occasionally stutters in the office. Meetings work well at your desk, yet moving to another room makes the connection feel less dependable.&lt;/p&gt;

&lt;p&gt;Start with a network diagnostic to check the current connection. Then use a walk test to test the same target from different locations and compare the results.&lt;/p&gt;

&lt;p&gt;You can take measurements in the living room, office, and bedroom, then use those results alongside your everyday needs to decide which location works best for video calls, remote work, or accessing your NAS.&lt;/p&gt;

&lt;p&gt;Instead of relying only on “the connection feels unstable here,” you have test records you can revisit when making changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  05 | It Connects Now. Will It Stay Stable?
&lt;/h2&gt;

&lt;p&gt;A webpage loading successfully tells you that it’s reachable at that moment. For a long video call, a remote connection, or access to services at home, you may also want to know how the connection behaves over time.&lt;/p&gt;

&lt;p&gt;Stability testing repeatedly checks a chosen target and tracks metrics such as connection success rate, latency, and jitter.&lt;/p&gt;

&lt;p&gt;You can test a service you use regularly or specify an IP address and port to see whether connections keep succeeding and whether latency fluctuates noticeably.&lt;/p&gt;

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

&lt;p&gt;Run a test before and after a network adjustment, and the difference becomes easier to see.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Knowing Your Devices to Understanding Your Connection
&lt;/h2&gt;

&lt;p&gt;A device inventory helps you get to know your local network. A diagnostic check, a set of walk test results, and a stability test help you understand how it performs in everyday use.&lt;/p&gt;

&lt;p&gt;WiFi Health Check brings these tools together on iPhone and iPad, so you can discover devices, explore identification details, review network changes, and check connection performance.&lt;/p&gt;

&lt;p&gt;Curious about what’s connected to your own Wi-Fi? Open the app and start with a LAN scan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wifi.opshome.run" rel="noopener noreferrer"&gt;Explore WiFi Health Check&lt;/a&gt; · &lt;a href="https://apps.apple.com/app/id6791147190" rel="noopener noreferrer"&gt;View on the App Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You know your Wi-Fi password. How well do you know the devices behind it?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>wifi</category>
      <category>networking</category>
      <category>iphone</category>
    </item>
    <item>
      <title>How to Use Subnet CIDR Pro to Plan IPv4 Networks</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Mon, 19 Oct 2026 04:56:08 +0000</pubDate>
      <link>https://dev.to/frankzhang/how-to-use-subnet-cidr-pro-to-plan-ipv4-networks-1i23</link>
      <guid>https://dev.to/frankzhang/how-to-use-subnet-cidr-pro-to-plan-ipv4-networks-1i23</guid>
      <description>&lt;p&gt;Subnetting is one of those everyday networking tasks that looks simple until you need to plan multiple VLANs, check address boundaries, or fit several networks into a limited IP range.&lt;/p&gt;

&lt;p&gt;A subnet calculator helps with the arithmetic. A good workflow should also help you understand the results and turn them into a usable addressing plan.&lt;/p&gt;

&lt;p&gt;In this guide, we'll walk through practical IPv4 subnet calculations, CIDR notation, VLSM planning, and wildcard masks using &lt;strong&gt;Subnet CIDR Pro&lt;/strong&gt;, an offline subnetting tool for iPhone and iPad.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://subnet.opshome.run/" rel="noopener noreferrer"&gt;https://subnet.opshome.run/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;App Store: &lt;a href="https://apps.apple.com/us/app/subnet-cidr-pro/id6816397989" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/subnet-cidr-pro/id6816397989&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Calculate a subnet from an IP address
&lt;/h2&gt;

&lt;p&gt;Let's start with a common example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;192.168.1.100/26&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;/26&lt;/code&gt; prefix means that 26 bits identify the network, leaving 6 bits for host addresses.&lt;/p&gt;

&lt;p&gt;That gives us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total addresses: 64&lt;/li&gt;
&lt;li&gt;Conventionally usable host addresses: 62&lt;/li&gt;
&lt;li&gt;Subnet mask: &lt;code&gt;255.255.255.192&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Using Subnet CIDR Pro
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the subnet calculator.&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;192.168.1.100&lt;/code&gt; and select the &lt;code&gt;/26&lt;/code&gt; prefix.&lt;/li&gt;
&lt;li&gt;Review the calculated network information.&lt;/li&gt;
&lt;li&gt;Copy the individual values you need or copy the complete summary.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result should look like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.64/26&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet mask&lt;/td&gt;
&lt;td&gt;&lt;code&gt;255.255.255.192&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First usable address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.65&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last usable address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.126&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broadcast address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.127&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wildcard mask&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.0.0.63&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usable hosts&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice that the entered address, &lt;code&gt;192.168.1.100&lt;/code&gt;, is a host address inside the subnet. It is not the network address itself.&lt;/p&gt;

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

&lt;p&gt;This distinction matters when configuring VLAN interfaces, DHCP scopes, firewall rules, and static routes.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Understand what happens when the prefix changes
&lt;/h2&gt;

&lt;p&gt;The prefix determines how much address space belongs to a subnet.&lt;/p&gt;

&lt;p&gt;For example, compare &lt;code&gt;/24&lt;/code&gt;, &lt;code&gt;/26&lt;/code&gt;, and &lt;code&gt;/28&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Total addresses&lt;/th&gt;
&lt;th&gt;Conventional usable hosts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/24&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;254&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/26&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/28&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A &lt;code&gt;/24&lt;/code&gt; provides a larger address pool, while a &lt;code&gt;/28&lt;/code&gt; is better suited to a smaller network segment.&lt;/p&gt;

&lt;p&gt;In Subnet CIDR Pro, adjust the prefix and review the updated network boundaries, mask, address range, and host capacity.&lt;/p&gt;

&lt;p&gt;This is useful when deciding whether a subnet has enough room for the devices you expect to connect.&lt;/p&gt;

&lt;p&gt;For example, a VLAN requiring 40 host addresses needs at least a &lt;code&gt;/26&lt;/code&gt; under conventional IPv4 subnetting rules. A &lt;code&gt;/27&lt;/code&gt; only provides 30 usable host addresses.&lt;/p&gt;

&lt;p&gt;Don't choose a prefix based only on how many devices are connected today. Leave reasonable room for growth.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Plan multiple VLANs with VLSM
&lt;/h2&gt;

&lt;p&gt;Calculating individual subnets is straightforward. Designing an entire addressing plan is more challenging.&lt;/p&gt;

&lt;p&gt;Imagine a homelab or small office using the parent network:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;10.20.0.0/24&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You need separate networks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servers: 100 hosts&lt;/li&gt;
&lt;li&gt;Workstations: 50 hosts&lt;/li&gt;
&lt;li&gt;Management: 20 hosts&lt;/li&gt;
&lt;li&gt;Printers and other devices: 10 hosts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Allocating the same subnet size to every VLAN would waste address space.&lt;/p&gt;

&lt;p&gt;This is where Variable Length Subnet Masking (VLSM) becomes useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  A practical allocation
&lt;/h3&gt;

&lt;p&gt;Start with the largest host requirement and work downward.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Network&lt;/th&gt;
&lt;th&gt;Required hosts&lt;/th&gt;
&lt;th&gt;Allocation&lt;/th&gt;
&lt;th&gt;Usable range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Servers&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.20.0.0/25&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.1–.126&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workstations&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.20.0.128/26&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.129–.190&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Management&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.20.0.192/27&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.193–.222&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Printers&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.20.0.224/28&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.225–.238&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The remaining block is &lt;code&gt;10.20.0.240/28&lt;/code&gt;, which can be reserved for future use.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to use the VLSM planner
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the VLSM planning feature.&lt;/li&gt;
&lt;li&gt;Specify the parent network and the required host counts.&lt;/li&gt;
&lt;li&gt;Add meaningful labels for each network.&lt;/li&gt;
&lt;li&gt;Generate the allocation plan.&lt;/li&gt;
&lt;li&gt;Review the proposed prefixes and address boundaries before deploying them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The important principle is to allocate the largest requirements first, then fit smaller networks into the remaining address space.&lt;/p&gt;

&lt;p&gt;Always verify that every allocated subnet fits within the parent network and that no two allocations overlap.&lt;/p&gt;

&lt;p&gt;A structured plan is easier to maintain than a collection of manually calculated addresses.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Convert subnet masks and wildcard masks
&lt;/h2&gt;

&lt;p&gt;Subnet masks and wildcard masks are closely related, but they serve different purposes.&lt;/p&gt;

&lt;p&gt;For example, a &lt;code&gt;/26&lt;/code&gt; subnet uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subnet mask: &lt;code&gt;255.255.255.192&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Wildcard mask: &lt;code&gt;0.0.0.63&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A wildcard mask is the bitwise inverse of a subnet mask. It is commonly used in Cisco-style access control lists and routing configurations.&lt;/p&gt;

&lt;p&gt;Instead of calculating each octet manually, use the mask converter to move between subnet masks, wildcard masks, and CIDR prefixes.&lt;/p&gt;

&lt;p&gt;This is especially useful when translating an IP addressing plan into device configurations.&lt;/p&gt;

&lt;p&gt;Remember that a wildcard mask is not interchangeable with a subnet mask in every command. Always check the syntax required by the target network device.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Use the CIDR reference for quick checks
&lt;/h2&gt;

&lt;p&gt;Sometimes you don't need to calculate a complete subnet. You simply need to answer a question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many addresses does &lt;code&gt;/27&lt;/code&gt; contain?&lt;/li&gt;
&lt;li&gt;Which subnet mask corresponds to &lt;code&gt;/29&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;What wildcard mask should I use for &lt;code&gt;/24&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;How many usable hosts are available in a particular prefix?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The built-in CIDR reference lets you look up prefixes from &lt;code&gt;/0&lt;/code&gt; through &lt;code&gt;/32&lt;/code&gt; without repeatedly opening a separate browser-based calculator.&lt;/p&gt;

&lt;p&gt;It's useful during troubleshooting, certification study, network planning, and configuration reviews.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Pay attention to special prefixes
&lt;/h2&gt;

&lt;p&gt;Not every IPv4 subnet follows the conventional usable-host calculation.&lt;/p&gt;

&lt;p&gt;Two important examples are &lt;code&gt;/31&lt;/code&gt; and &lt;code&gt;/32&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/31&lt;/code&gt; — Point-to-point links&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;RFC 3021 defines the use of &lt;code&gt;/31&lt;/code&gt; prefixes on IPv4 point-to-point links. Both addresses can be used as endpoint addresses in that context, without reserving a traditional network and broadcast address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/32&lt;/code&gt; — Single-host routes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;/32&lt;/code&gt; identifies one IPv4 address. It is commonly used for host routes and other configurations that refer to a single address.&lt;/p&gt;

&lt;p&gt;Subnet CIDR Pro handles these prefix boundaries explicitly, helping avoid incorrect assumptions when working with point-to-point links or single-host routes.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Why use an offline subnet calculator?
&lt;/h2&gt;

&lt;p&gt;Network addressing information often appears in internal documentation, private infrastructure plans, and troubleshooting notes.&lt;/p&gt;

&lt;p&gt;Subnet CIDR Pro performs its subnet calculations locally on the device. The calculation workflow does not require an account or a backend service, and results are copied only when you choose to copy them.&lt;/p&gt;

&lt;p&gt;That makes it convenient when working in a lab, on-site, or in environments where connectivity is limited.&lt;/p&gt;

&lt;p&gt;It also means you can calculate subnets without depending on an external website being available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Subnetting is not just about finding a network address. It is about making reliable decisions about address capacity, network boundaries, and future growth.&lt;/p&gt;

&lt;p&gt;A practical workflow is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calculate the subnet for an individual IP address.&lt;/li&gt;
&lt;li&gt;Adjust the prefix to evaluate address capacity.&lt;/li&gt;
&lt;li&gt;Use VLSM to plan multiple networks efficiently.&lt;/li&gt;
&lt;li&gt;Convert masks when working with routing or ACL configurations.&lt;/li&gt;
&lt;li&gt;Verify special prefixes before deploying the configuration.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Subnet CIDR Pro brings these IPv4 calculation and planning tasks into one focused iPhone and iPad workflow.&lt;/p&gt;

&lt;p&gt;If you regularly work with VLANs, homelabs, routing, or small-office networks, having these calculations available offline can make address planning quicker and less error-prone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; Subnet CIDR Pro is my app. This article focuses on practical subnetting workflows rather than a complete feature review.&lt;/p&gt;

&lt;p&gt;#devops #homelab  #cidr&lt;/p&gt;

</description>
      <category>networking</category>
      <category>ipv4</category>
    </item>
    <item>
      <title>Does `docker compose down` Delete Your Data?</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Fri, 16 Oct 2026 14:06:02 +0000</pubDate>
      <link>https://dev.to/frankzhang/does-docker-compose-down-delete-your-data-154d</link>
      <guid>https://dev.to/frankzhang/does-docker-compose-down-delete-your-data-154d</guid>
      <description>&lt;p&gt;Two commands can have very different consequences for your database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down
docker compose down &lt;span class="nt"&gt;--volumes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference comes down to how Docker Compose manages volumes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Containers are temporary. Named volumes persist.
&lt;/h2&gt;

&lt;p&gt;Consider this PostgreSQL configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:17&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${POSTGRES_PASSWORD:?Set a password}&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db_data:/var/lib/postgresql/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The database files live in &lt;code&gt;db_data&lt;/code&gt;, a named volume with a lifecycle separate from the container.&lt;/p&gt;

&lt;p&gt;Running &lt;code&gt;docker compose down&lt;/code&gt; removes the containers and project networks, but keeps the named volume. Starting the same project again with &lt;code&gt;docker compose up -d&lt;/code&gt; reuses the existing data.&lt;/p&gt;

&lt;p&gt;Adding &lt;code&gt;--volumes&lt;/code&gt; requests removal of the project’s managed volumes too.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Containers&lt;/th&gt;
&lt;th&gt;Managed named volumes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose stop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stopped&lt;/td&gt;
&lt;td&gt;Kept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;Kept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose down --volumes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;Removed if possible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Treat &lt;code&gt;--volumes&lt;/code&gt; as an intentional data reset.&lt;/p&gt;

&lt;h2&gt;
  
  
  External volumes are handled differently
&lt;/h2&gt;

&lt;p&gt;To manage storage independently of the Compose stack, create it first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create postgres_data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then update the volume declaration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres_data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compose now expects &lt;code&gt;postgres_data&lt;/code&gt; to exist and will leave it untouched—even during &lt;code&gt;down --volumes&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;However, external volumes can still be deleted manually. Also, pointing an existing application at a new volume does not migrate its old data.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Empty database” does not always mean deleted data
&lt;/h2&gt;

&lt;p&gt;Compose normally prefixes managed volume names with the project name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;homelab_db_data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Changing the project name—or moving the Compose file when the directory determines that name—can cause the application to use a different volume.&lt;/p&gt;

&lt;p&gt;Before assuming data loss, check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume &lt;span class="nb"&gt;ls
&lt;/span&gt;docker volume inspect homelab_db_data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The original data may still exist in the previous volume.&lt;/p&gt;

&lt;p&gt;For routine shutdowns, use &lt;code&gt;stop&lt;/code&gt; or &lt;code&gt;down&lt;/code&gt;. Reserve &lt;code&gt;down --volumes&lt;/code&gt; for deliberate cleanup, and maintain backups for anything you cannot afford to lose.&lt;/p&gt;

</description>
      <category>docker</category>
    </item>
  </channel>
</rss>
