<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Notes on Jing Online</title>
    <link>https://jing-online.com/posts/</link>
    <description>Recent content in Notes on Jing Online</description>
    <generator>Hugo -- 0.164.0</generator>
    <language>en-us</language>
    <copyright>2026 Jing Online</copyright>
    <lastBuildDate>Sat, 18 Jul 2026 09:30:00 +0800</lastBuildDate>
    <atom:link href="https://jing-online.com/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Building a Small Home Lab That Stays Boring</title>
      <link>https://jing-online.com/posts/building-a-small-home-lab/</link>
      <pubDate>Sat, 18 Jul 2026 09:30:00 +0800</pubDate>
      <guid>https://jing-online.com/posts/building-a-small-home-lab/</guid>
      <description>A few design choices that make a small personal server easier to understand and recover.</description>
      <content:encoded><![CDATA[<p>The best home lab is not the one with the most services. It is the one whose owner can explain what is running, why it is running, and how to restore it after a long break.</p>
<p>I keep the foundation deliberately small: a current operating system, a short list of long-lived services, explicit configuration files, and one place for operational notes. Every service gets a local health check and a restart policy. Every public entry point has a clear owner.</p>
<p>The most useful habit is to write down the dependency graph. A static site may depend on a local web server, which depends on a directory of generated files. A private application may depend on a tunnel, a local listener, and an outbound connection. When those relationships are documented, a failure becomes a checklist instead of a guessing game.</p>
<p>Backups are tested, not merely created. A backup that has never been restored is an assumption. Once a month, I restore a small sample into a temporary directory and verify that the files are readable, the permissions are sensible, and the documented recovery command still works.</p>
<p>The result is pleasantly unremarkable: fewer moving parts, fewer surprises, and enough observability to know when something changes.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A Short Checklist for Long-Lived Linux Services</title>
      <link>https://jing-online.com/posts/linux-service-hygiene/</link>
      <pubDate>Sun, 12 Jul 2026 10:15:00 +0800</pubDate>
      <guid>https://jing-online.com/posts/linux-service-hygiene/</guid>
      <description>A compact service review checklist for small Linux hosts.</description>
      <content:encoded><![CDATA[<p>When a Linux host runs for months, the service definition becomes more important than the initial installation command. I review long-lived services with five questions.</p>
<h3 id="what-does-it-listen-on">What does it listen on?</h3>
<p>Local-only listeners should bind to loopback or a private interface. Public listeners should be intentional, documented, and covered by the firewall. A quick socket listing often reveals more than a configuration file search.</p>
<h3 id="what-user-does-it-run-as">What user does it run as?</h3>
<p>There is rarely a good reason for a static site or a metrics endpoint to run as root. A dedicated account, a read-only content directory, and a narrow working directory make mistakes less expensive.</p>
<h3 id="what-happens-after-a-restart">What happens after a restart?</h3>
<p>The unit should have a clear dependency order, a bounded restart policy, and logs that explain the first failure. Restarting forever is not recovery; it can hide a broken configuration and fill a disk.</p>
<h3 id="can-it-be-updated-safely">Can it be updated safely?</h3>
<p>Pinning a known-good version, keeping a small change record, and testing configuration syntax before restarting are inexpensive safeguards. I prefer a reversible deployment directory over editing files in place.</p>
<h3 id="can-i-remove-it-later">Can I remove it later?</h3>
<p>An installation note should say where files, users, sockets, and systemd units live. Clean removal is a useful test of whether the original installation was understood.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why Static Sites Still Feel Like a Superpower</title>
      <link>https://jing-online.com/posts/static-sites-at-the-edge/</link>
      <pubDate>Sun, 05 Jul 2026 14:00:00 +0800</pubDate>
      <guid>https://jing-online.com/posts/static-sites-at-the-edge/</guid>
      <description>The operational advantages of generating pages ahead of time.</description>
      <content:encoded><![CDATA[<p>A static site turns a web request into a file lookup. That sounds modest, but it removes an entire class of runtime problems: database connection pools, application processes, migrations, and session state.</p>
<p>The trade is that content must be generated before it is served. For a personal blog or project notebook, that is usually an advantage. The build becomes a reproducible artifact, and the production server only needs to deliver files.</p>
<p>I like to keep the boundary visible. Source content lives in version control. The build output is generated in a clean directory. The web server points at the output, not at the source tree. A deployment is then a copy plus a service reload, and rollback means pointing the server at the previous directory.</p>
<p>Static delivery also works well with an edge cache. HTML can remain short-lived while images, stylesheets, and scripts use long cache lifetimes with fingerprinted filenames. Even without elaborate infrastructure, this gives a small site fast global delivery and a pleasantly small failure surface.</p>
<p>The important part is not the framework. It is the discipline of treating the generated site as an immutable release.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Maintenance Budget of a Personal Project</title>
      <link>https://jing-online.com/posts/maintaining-personal-projects/</link>
      <pubDate>Sun, 28 Jun 2026 11:20:00 +0800</pubDate>
      <guid>https://jing-online.com/posts/maintaining-personal-projects/</guid>
      <description>A personal project becomes useful when maintenance is part of its design.</description>
      <content:encoded><![CDATA[<p>Starting a project is usually easy. Returning to it after six weeks is the real test.</p>
<p>I now treat maintenance as a first-class feature. Every project has a short README with the purpose, the local development command, the production entry point, and the recovery path. Configuration is kept close to the code, while credentials stay outside version control. Logs are useful only when they include enough context to answer what failed and when.</p>
<p>Small release notes are surprisingly valuable. They record the reason for a change, not just the list of files touched. That makes it easier to decide whether an update is still needed later, and it gives future debugging sessions a timeline.</p>
<p>The other important constraint is scope. A personal service should earn its operational cost. If a feature adds another database, background worker, or external dependency, it should also remove a real limitation. Otherwise it is probably a demo, not a service worth maintaining.</p>
<p>The goal is not to eliminate all failure. It is to make failure legible, recovery repeatable, and the next change smaller than the last one.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
