<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Operations on Margrop Blog</title>
    <link>https://blog.margrop.net/en/tag/operations/</link>
    <description>Recent content in Operations on Margrop Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-US</language>
    <lastBuildDate>Wed, 29 Jul 2026 08:00:00 +0800</lastBuildDate>
    <atom:link href="https://blog.margrop.net/en/tag/operations/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Restart Is Not Magic: Why Turning a Computer Off and On Seems to Fix 99% of Its Problems</title>
      <link>https://blog.margrop.net/en/post/why-restart-fixes-99-percent-%E9%87%8D%E5%90%AF/</link>
      <pubDate>Wed, 29 Jul 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/why-restart-fixes-99-percent-%E9%87%8D%E5%90%AF/</guid>
      <description>The short version&#xA;A restart is not magic, and it does not repair every fault. It is closer to emptying a room that has been used for months without cleaning: borrowed items are collected, people take fresh queue numbers, temporary notes disappear, and doors and appliances are initialized again. The system returns to a cleaner and more predictable starting point.&#xA;When “restart fixed it” is true, the fault is often in volatile state, not in permanently damaged hardware, a configuration that is always wrong, or an application whose root cause has disappeared.</description>
    </item>
    <item>
      <title>Take Back Your Remote Desktop: Deploying an All-in-One RustDesk Server Safely</title>
      <link>https://blog.margrop.net/en/post/rustdesk-all-in-one-server-guide/</link>
      <pubDate>Fri, 10 Jul 2026 22:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/rustdesk-all-in-one-server-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;RustDesk is an open-source remote desktop application designed with self-hosting in mind. When two clients can reach each other directly, screen and input traffic can use a peer-to-peer path. When that direct path fails, a relay server forwards the encrypted traffic. Hosting the server yourself does not eliminate servers; it puts device registration, relay routing, keys, accounts, and logs back under your control.&lt;/p&gt;&#xA;&lt;p&gt;This guide uses the community-maintained &lt;code&gt;lejianwen/rustdesk-server-s6&lt;/code&gt; image to place the RustDesk OSS &lt;code&gt;hbbs&lt;/code&gt; and &lt;code&gt;hbbr&lt;/code&gt; services together with a community API and web administration layer in one container. It is a convenient option for homes, labs, and small teams, but it is &lt;strong&gt;not an official RustDesk all-in-one distribution&lt;/strong&gt;. Evaluate the community image, pin a tested tag or digest, back up its persistent data, and rehearse upgrades and rollbacks before treating it as production infrastructure.&lt;/p&gt;&#xA;&lt;p&gt;Every address in this article uses &lt;code&gt;example.com&lt;/code&gt;. No real IP address, private domain, hostname, device ID, account, key, token, cookie, or private registry is shown. The screenshots come from public official or community project pages.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>I Put Docker in a Control Room: Portainer CE 2.39.4 Deployment, Daily Use, and Real Traps</title>
      <link>https://blog.margrop.net/en/post/portainer-ce-docker-deployment-guide/</link>
      <pubDate>Fri, 10 Jul 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/portainer-ce-docker-deployment-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line first&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Portainer does not replace Docker. It is a control room for a Docker host. Docker Engine remains the machinery; Portainer organizes containers, images, networks, volumes, and Compose stacks into a web dashboard.&lt;/p&gt;&#xA;&lt;p&gt;I ran an isolated deployment of &lt;code&gt;portainer/portainer-ce:2.39.4&lt;/code&gt;, initialized it, connected the local Docker environment, inspected the dashboard, filtered a disposable container, and created a demonstration stack. The installation is one &lt;code&gt;docker run&lt;/code&gt; command. The important lessons are broader: persist &lt;code&gt;/data&lt;/code&gt;, understand that &lt;code&gt;/var/run/docker.sock&lt;/code&gt; is highly privileged, and never expose the management interface to an untrusted network without protection.&lt;/p&gt;&#xA;&lt;p&gt;This article contains no complete IP address, real host name, private domain, administrator password, token, cookie, private registry address, or production container name. The screenshots use disposable names, and the container address is redacted.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>The Self-Hosted Web Clipboard I Kept Is Just One Text Box</title>
      <link>https://blog.margrop.net/en/post/minimalist-web-notepad-lightweight-clipboard/</link>
      <pubDate>Fri, 10 Jul 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/minimalist-web-notepad-lightweight-clipboard/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;After trying many cross-device clipboard and note tools, the one I kept for personal use is almost embarrassingly small: &lt;code&gt;minimalist-web-notepad&lt;/code&gt;. When you open it, there is essentially one text box. It supports plain text only. There is no account system, no rich text editor, no image upload, no folder tree, no dashboard, and no collaboration layer.&lt;/p&gt;&#xA;&lt;p&gt;That is exactly why it works as a lightweight self-hosted web clipboard. It is good for moving a short command from one device to another, dropping a temporary note into a browser, reading or writing a tiny text value with &lt;code&gt;curl&lt;/code&gt;, or keeping a disposable piece of text for a few minutes. It is not a knowledge base. It is not a password vault. It is a piece of scratch paper on the network.&lt;/p&gt;&#xA;&lt;p&gt;This post uses the &lt;code&gt;ahfeil/minimalist-web-notepad:latest&lt;/code&gt; image with Docker Compose. It also includes one-click scripts for Windows 11, Ubuntu 26.04, and macOS 26, plus two operating modes: manual automatic execution and agent-driven configuration. No private network address, private domain, full machine name, or real secret is shown in this article.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Do Not Just Copy QingLong Into BaiHu: A Real Safe Migration Drill</title>
      <link>https://blog.margrop.net/en/post/qinglong-to-baihu-safe-migration/</link>
      <pubDate>Thu, 09 Jul 2026 10:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/qinglong-to-baihu-safe-migration/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line first&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Migrating from QingLong Panel to BaiHu Panel is not a directory-copy exercise. I ran a real migration drill in an isolated Docker environment: a fresh QingLong instance with sample environment variables, scripts, labels, and cron jobs; then a fresh BaiHu instance; then an actual conversion and verification pass.&lt;/p&gt;&#xA;&lt;p&gt;The reliable migration unit is not the whole QingLong data directory. It is a set of assets: script files, environment variables, scheduled tasks, tags, enabled/disabled state, and task-variable relations. QingLong uses numeric IDs; BaiHu uses string IDs and relation tables. QingLong commands such as &lt;code&gt;task daily_check.py&lt;/code&gt; also need to become executable BaiHu commands such as &lt;code&gt;python /app/data/scripts/qinglong-migrated/daily_check.py&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This article contains no full private IP address, private registry address, host name, token, cookie, or production secret. The screenshots come from a disposable lab, and the variables are redacted sample data.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Should QingLong Panel Still Face the Public Internet? After the 2026 Bypass, I Would Start With BaiHu</title>
      <link>https://blog.margrop.net/en/post/qinglong-baihu-panel-security/</link>
      <pubDate>Thu, 09 Jul 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/qinglong-baihu-panel-security/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line first&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;QingLong Panel used to be the default answer for many self-hosted scheduled-script setups. It can run scripts, manage environment variables, show logs, synchronize repositories, and wrap crontab-like workflows in a friendly web UI. But the critical QingLong issues publicly discussed in early 2026 changed the risk calculation: &lt;strong&gt;a task scheduler panel is not just another web admin page. It often holds scripts, secrets, notification tokens, and execution privileges. If authentication can be bypassed, the attacker is not merely viewing a dashboard; they may be standing in front of a machine that can run jobs.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;For new lightweight deployments, I would now evaluate BaiHu Panel first. BaiHu is a Go + Vue3 automation task scheduling platform focused on low overhead and high performance. Its public README describes Docker / Docker Compose deployment, Mise-based runtime management, repository task synchronization, logs, notifications, and secret handling. It is not a perfect one-to-one replacement for every QingLong workflow, but it is a better starting point for many personal script-hosting cases.&lt;/p&gt;&#xA;&lt;p&gt;If you must keep using QingLong temporarily because of old jobs, migration cost, or compatibility constraints, do not expose it directly to the public Internet. Put a protection layer in front of it: VPN, zero-trust access, reverse-proxy Basic Auth, an allowlist, WAF rules, or equivalent access control. This article includes one-click scripts for Windows 11, Ubuntu 26.04, and macOS 26. They deploy BaiHu by default, require an explicit switch to deploy QingLong, and put either panel behind Caddy Basic Auth.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Is Your Computer Always Full? Use an AI Agent to Safely Clean Junk Files on Windows 11, Ubuntu 26.04, and macOS 26</title>
      <link>https://blog.margrop.net/en/post/ai-agent-cleanup-windows11-ubuntu2604-macos26/</link>
      <pubDate>Sun, 28 Jun 2026 07:15:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ai-agent-cleanup-windows11-ubuntu2604-macos26/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Junk cleanup is risky not because it is hard to delete files, but because it is easy to delete too much. On Windows 11, Ubuntu 26.04, and macOS 26, the safe cleanup targets are usually temporary directories, package caches, old logs, recycle bin or trash contents, and files that can be regenerated. A cleanup script should not casually touch documents, photos, browser profiles, keys, certificates, virtual machine images, or application data.&lt;/p&gt;&#xA;&lt;p&gt;This article gives you two paths: &lt;strong&gt;manual automation&lt;/strong&gt;, where you run the scripts yourself, inspect the dry-run output, and then explicitly enable deletion; and &lt;strong&gt;Agent-driven automation&lt;/strong&gt;, where Codex, Claude, OpenClaw, HermesAgent, or another AI Agent performs the same scan, review, execution, and verification flow for you. The three scripts cover Windows 11, Ubuntu 26.04, and macOS 26. They do not depend on third-party services, do not download cleanup utilities, and do not contain real private addresses, computer names, private domains, or secrets.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>macOS 26 Boot Daemons: Put frp and EasyTier in LaunchDaemons, Not Login Items</title>
      <link>https://blog.margrop.net/en/post/macos-26-launchdaemon-boot-service-frp-easytier/</link>
      <pubDate>Sat, 27 Jun 2026 17:12:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/macos-26-launchdaemon-boot-service-frp-easytier/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you want &lt;code&gt;frp&lt;/code&gt;, &lt;code&gt;EasyTier&lt;/code&gt;, a sync agent, a collector, a bot, or a proxy daemon to start automatically on macOS 26, the key is not “where can I hide this command?” The key is “which native service manager owns its lifecycle?” This article is about unattended background services, not ordinary desktop login apps.&lt;/p&gt;&#xA;&lt;p&gt;On macOS 26, a daemon that must start before user login belongs in /Library/LaunchDaemons. Login items and LaunchAgents are tools opened after a person enters the room. LaunchDaemons are more like the building&amp;rsquo;s elevator or water pump: they should run as the machine comes up.&lt;/p&gt;&#xA;&lt;p&gt;I will show two paths: &lt;strong&gt;manual configuration&lt;/strong&gt;, for understanding every moving part, and &lt;strong&gt;agent / one-click automation&lt;/strong&gt;, for cases where you already know where the binary and config file live. The scripts are self-contained, use built-in OS mechanisms, do not download third-party wrappers, and do not include real addresses, hostnames, private domains, or secrets.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Windows 11/10 Background Autostart: Run frp and EasyTier Unattended Without Third-Party Wrappers</title>
      <link>https://blog.margrop.net/en/post/windows-11-10-background-service-autostart-frp-easytier/</link>
      <pubDate>Sat, 27 Jun 2026 17:11:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/windows-11-10-background-service-autostart-frp-easytier/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you want &lt;code&gt;frp&lt;/code&gt;, &lt;code&gt;EasyTier&lt;/code&gt;, a sync agent, a collector, a bot, or a proxy daemon to start automatically on Windows 11/10, the key is not “where can I hide this command?” The key is “which native service manager owns its lifecycle?” This article is about unattended background services, not ordinary desktop login apps.&lt;/p&gt;&#xA;&lt;p&gt;On Windows, the first decision is whether the executable is a real Windows Service. Common command-line daemons such as frp and EasyTier are usually better handled by Task Scheduler at system startup, because it is built in and does not require NSSM, WinSW, or another wrapper.&lt;/p&gt;&#xA;&lt;p&gt;I will show two paths: &lt;strong&gt;manual configuration&lt;/strong&gt;, for understanding every moving part, and &lt;strong&gt;agent / one-click automation&lt;/strong&gt;, for cases where you already know where the binary and config file live. The scripts are self-contained, use built-in OS mechanisms, do not download third-party wrappers, and do not include real addresses, hostnames, private domains, or secrets.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Ubuntu 26.04 Boot Services Done Right: Let systemd Run frp and EasyTier for You</title>
      <link>https://blog.margrop.net/en/post/ubuntu-2604-systemd-boot-service-frp-easytier/</link>
      <pubDate>Sat, 27 Jun 2026 17:10:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-2604-systemd-boot-service-frp-easytier/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you want &lt;code&gt;frp&lt;/code&gt;, &lt;code&gt;EasyTier&lt;/code&gt;, a sync agent, a collector, a bot, or a proxy daemon to start automatically on Ubuntu 26.04, the key is not “where can I hide this command?” The key is “which native service manager owns its lifecycle?” This article is about unattended background services, not ordinary desktop login apps.&lt;/p&gt;&#xA;&lt;p&gt;On Ubuntu 26.04, the standard answer for a background daemon is not a shell startup hack. It is a systemd unit. systemd can wait for the network, start the process before login, collect logs, restart on failure, and stop it in order during shutdown.&lt;/p&gt;&#xA;&lt;p&gt;I will show two paths: &lt;strong&gt;manual configuration&lt;/strong&gt;, for understanding every moving part, and &lt;strong&gt;agent / one-click automation&lt;/strong&gt;, for cases where you already know where the binary and config file live. The scripts are self-contained, use built-in OS mechanisms, do not download third-party wrappers, and do not include real addresses, hostnames, private domains, or secrets.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Letting Agents Burn Tokens: Wiring Headroom into NewAPI, OpenClaw, and HermesAgent</title>
      <link>https://blog.margrop.net/en/post/headroom-newapi-openclaw-hermesagent-token-compression-guide/</link>
      <pubDate>Sat, 20 Jun 2026 12:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/headroom-newapi-openclaw-hermesagent-token-compression-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I did not replace NewAPI, and I did not point OpenClaw or HermesAgent at an unproven gateway. The actual design is simpler: place Headroom in front of NewAPI, then move only the already validated OpenAI-compatible providers to &lt;code&gt;http://&amp;lt;headroom-host&amp;gt;:8787/v1&lt;/code&gt;. The original NewAPI endpoint stays available. Long agent context now goes through Headroom first, gets compressed, then continues to NewAPI for the same routing and model management as before.&lt;/p&gt;&#xA;&lt;p&gt;The rule that kept the rollout boring was: &lt;strong&gt;test first, edit second; migrate only OpenAI-compatible providers that pass; leave non-OpenAI fallbacks alone.&lt;/strong&gt; This post is both a write-up and a runbook you can hand to an Agent or follow manually.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Ubuntu shutdown stuck for 90 seconds? A Python asyncio service that won&#39;t honour SIGTERM, and how to fix it</title>
      <link>https://blog.margrop.net/en/post/ubuntu-shutdown-stuck/</link>
      <pubDate>Fri, 19 Jun 2026 10:58:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-shutdown-stuck/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;After upgrading my home proxy box to Ubuntu 24.04, &lt;code&gt;systemctl reboot&lt;/code&gt; stopped being fast: SSH would hang on for &lt;strong&gt;90 seconds&lt;/strong&gt; before the box actually shut down. &lt;code&gt;journalctl&lt;/code&gt; made it obvious: &lt;code&gt;smart-proxy.service: State &#39;stop-sigterm&#39; timed out. Killing.&lt;/code&gt; — systemd sent SIGTERM, waited 90 seconds, nobody reacted, and SIGKILL was the only option left.&lt;/p&gt;&#xA;&lt;p&gt;The root cause is not systemd&amp;rsquo;s fault and not Ubuntu&amp;rsquo;s fault. It is &lt;strong&gt;Python&amp;rsquo;s asyncio runtime not actually ending its child tasks when SIGTERM arrives&lt;/strong&gt; — it is parked on a &lt;code&gt;socket.recv&lt;/code&gt; and never voluntarily looks at the signal queue.&lt;/p&gt;&#xA;&lt;p&gt;The fix has two halves, both required: &lt;strong&gt;(1)&lt;/strong&gt; a systemd drop-in that lowers &lt;code&gt;TimeoutStopSec&lt;/code&gt; from the default 90s down to 20s on the affected Python units; &lt;strong&gt;(2)&lt;/strong&gt; inside the Python service itself, walk &lt;code&gt;asyncio.all_tasks()&lt;/code&gt;, &lt;code&gt;.cancel()&lt;/code&gt; the in-flight connection handlers on SIGTERM, and wrap &lt;code&gt;self.stop()&lt;/code&gt; in &lt;code&gt;asyncio.wait_for(..., timeout=10)&lt;/code&gt; as a safety net. After both halves, the same &lt;code&gt;reboot&lt;/code&gt; drops from 90 seconds to one second.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Why HermesAgent Would Not Reply in WeChat or WeCom: The Real Culprit Was a Local Relay With a 3-Second Timeout</title>
      <link>https://blog.margrop.net/en/post/hermesagent-wechat-wecom-relay-timeout-debugging/</link>
      <pubDate>Sun, 31 May 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/hermesagent-wechat-wecom-relay-timeout-debugging/</guid>
      <description>The short version This incident looked like a model problem or a broken messaging channel, but the real failure happened one layer lower: my local relay cut the upstream request off after 3 seconds. That was fine for quick health checks, but it was wrong for real WeChat and WeCom turns, which often take longer to produce a complete answer from the NewAPI gateway. Once the relay disconnected too early, HermesAgent could only see Connection error, RemoteProtocolError, and then exhausted fallback attempts.</description>
    </item>
    <item>
      <title>OpenClaw Upgrade Guide: From Beginner to Expert</title>
      <link>https://blog.margrop.net/en/post/openclaw-hermesagent-upgrade-guide/</link>
      <pubDate>Fri, 29 May 2026 09:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/openclaw-hermesagent-upgrade-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;OpenClaw is a powerful personal AI assistant that supports multiple messaging channels and AI models. Upgrading OpenClaw is actually very simple — the most recommended way is to use the &lt;code&gt;openclaw update&lt;/code&gt; command. This article will详细介绍 various upgrade methods, including switching from npm package installation to git source installation, as well as verification and rollback strategies after upgrading.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;All examples in this article use public projects, public links, and placeholders. No real server addresses, accounts, tokens, business configuration, or private network details are included. The figures are taken from the official OpenClaw repository and documentation, and are referenced under the project&amp;rsquo;s MIT license.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmox VE 9.2 Is Out: Not Just a New Kernel, but a Cluster That Can Start Balancing Itself</title>
      <link>https://blog.margrop.net/en/post/proxmox-ve-9-2-dynamic-load-balancer-release/</link>
      <pubDate>Sat, 23 May 2026 12:46:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/proxmox-ve-9-2-dynamic-load-balancer-release/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Proxmox VE 9.2 was officially released on May 21, 2026. On the surface it is a platform refresh: Debian 13.5 Trixie, Linux kernel 7.0, QEMU 11.0, LXC 7.0, ZFS 2.4, and updated Ceph options. The more interesting story is operational: dynamic load balancing through CRS, safer HA maintenance with arm/disarm, a much stronger SDN fabric story, web-based custom CPU model management, and many smaller fixes around guests, storage, security, and automation.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;If you run a single-node homelab, Proxmox VE 9.2 may not feel dramatic on day one. If you operate a multi-node cluster with HA resources, Ceph, software-defined networking, custom CPU compatibility requirements, Windows secure boot, external automation, or strict maintenance windows, this release deserves a careful read.&lt;/p&gt;&#xA;&lt;p&gt;This article summarizes the official Proxmox VE 9.2 release and adds an operator’s view: what changed, what problem each change addresses, what to test before upgrading, and when it is reasonable to wait. All hostnames, addresses, cluster names, accounts, and command outputs are placeholders. No private environment details are included.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Upgrading PVE 8 to 9 Without Brute Force: Let an Agent Drive It, or Follow This Manual Checklist</title>
      <link>https://blog.margrop.net/en/post/pve8-to-pve9-agent-manual-upgrade-guide/</link>
      <pubDate>Tue, 12 May 2026 19:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/pve8-to-pve9-agent-manual-upgrade-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Upgrading Proxmox VE 8 to 9 is not just copying a few commands. It is a major system upgrade from Debian Bookworm to Trixie, from PVE 8.4 to PVE 9.x, with kernel, storage, networking, Ceph, and HA behavior in the blast radius. The fastest practical path is to let Codex, Claude, OpenClaw, HermesAgent, or a similar Agent handle checks, command sequencing, logging, and post-upgrade verification. The human operator still needs to approve repository changes, package removals, configuration prompts, reboot timing, and recovery decisions. If you prefer doing everything by hand, the second half of this article gives a concrete manual checklist.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This article is for two groups of operators. The first group already uses Agents over SSH and wants a scoped one-sentence task for upgrading PVE. The second group prefers typing every command manually and wants a clear, ordered procedure with the main risk points called out.&lt;/p&gt;&#xA;&lt;p&gt;All hostnames, addresses, repositories, tokens, and accounts in this article are placeholders. Replace values such as &lt;code&gt;&amp;lt;PVE_NODE&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;BACKUP_TARGET&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;ADMIN_CONSOLE&amp;gt;&lt;/code&gt; with your own environment. Before touching a production host, read the official Proxmox documentation and verify that your backups are restorable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[Transfer] Installing and Configuring an ImmortalWrt Bypass Router</title>
      <link>https://blog.margrop.net/en/post/zhuan-immortalwrt-pang-lu-you-install-config/</link>
      <pubDate>Mon, 11 May 2026 21:10:55 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/zhuan-immortalwrt-pang-lu-you-install-config/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;This article is a full English translation of Egg Targaryen&amp;rsquo;s &amp;ldquo;ImmortalWrt旁路由安装与配置&amp;rdquo;. The original article is published under the &lt;code&gt;CC BY-NC-SA 4.0&lt;/code&gt; license. The operation order and screenshots are preserved, with minor formatting adjustments for this site.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>[Transfer] Synology DiskStation Administration CLI Guide: Reading Notes and Command Cheatsheet</title>
      <link>https://blog.margrop.net/en/post/zhuan-synology-diskstation-administration-cli-guide/</link>
      <pubDate>Thu, 30 Apr 2026 18:14:05 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/zhuan-synology-diskstation-administration-cli-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Synology&amp;rsquo;s official CLI administration guide is not a beginner manual for the DSM web interface. It is a compact reference for scripting, automation, and system integration. The useful parts cover local users, local groups, shared folders, network configuration, service management, Windows workgroup or ADS domain settings, and DSM error numbers.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post is an English reading note and command cheatsheet based on Synology&amp;rsquo;s official PDF, &lt;em&gt;CLI Administrator Guide for Synology NAS&lt;/em&gt;. Because the original PDF is a copyrighted Synology document, this post does not reproduce or translate the full document verbatim. Instead, it reorganizes the material into a bilingual blog-friendly guide for quick reading and daily operations. For exact wording, parameter definitions, version-specific behavior, and legal notices, use the official PDF linked at the end.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Resize the disk of an Ubuntu VM in PVE — the complete workflow from Web UI to guest OS</title>
      <link>https://blog.margrop.net/en/post/pve-ubuntu-vm-disk-resize/</link>
      <pubDate>Mon, 23 Mar 2026 10:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/pve-ubuntu-vm-disk-resize/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Preface&lt;/strong&gt;&#xA;When you manage a virtualized environment with Proxmox VE, running out of disk space is only a matter of time. Maybe your Ubuntu VM keeps pulling more Docker images, or maybe database logs fill up the root partition. In short, disk expansion is a must-have skill for PVE operations. This article walks through the entire process, from resizing the virtual disk in the PVE Web UI to expanding LVM inside the Ubuntu guest, step by step.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-why-do-we-need-to-resize&#34;&gt;1 Why do we need to resize?&lt;/h2&gt;&#xA;&lt;p&gt;PVE usually allocates a fixed-size virtual disk when a VM is created, for example 32 GB. As the workload grows, that space may no longer be enough. Fortunately, PVE supports online disk expansion, and Ubuntu&amp;rsquo;s default LVM setup also supports dynamic logical volume expansion. Together, they make the process very convenient.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The past and present life of SSH key algorithm Ed25519 and RSA, and how to use it today</title>
      <link>https://blog.margrop.net/en/post/ssh-ed25519-and-rsa-history-and-best-practices/</link>
      <pubDate>Mon, 02 Mar 2026 09:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ssh-ed25519-and-rsa-history-and-best-practices/</guid>
      <description>Many people’s first contact with SSH starts with a line of commands:&#xA;There is nothing wrong with this command, but there is an often overlooked issue behind it: Are we talking about &amp;ldquo;RSA key type&amp;rdquo; or ssh-rsa &amp;ldquo;signature algorithm&amp;rdquo;?&#xA;These two concepts are used interchangeably in many old tutorials, leading many people to think that they are &amp;ldquo;still using old and unsafe solutions&amp;rdquo; and at the same time don&amp;rsquo;t know how to migrate, and even repeatedly step into pitfalls between new systems and old devices.</description>
    </item>
  </channel>
</rss>
