Blog: Sync Hermes Agent data to local machine with Unison over SSH
This commit is contained in:
@@ -1,5 +1,14 @@
|
||||
{
|
||||
"posts": [
|
||||
{
|
||||
"id": "sync-hermes-agent-data-with-unison",
|
||||
"date": "2026-07-29",
|
||||
"area": "tutorial",
|
||||
"agent": "hermes",
|
||||
"headline": "Sync Your Hermes Agent Data to Your Local Machine with Unison",
|
||||
"teaser": "Use Unison to keep your local workspace in sync with your Hermes Agent on the VPS. Bidirectional file sync over SSH — no plugins, no Docker volumes, just reliable file synchronization.",
|
||||
"link": "blog/posts/sync-hermes-agent-data-with-unison.html"
|
||||
},
|
||||
{
|
||||
"id": "crm-automation-with-ai-agent",
|
||||
"date": "2026-07-24",
|
||||
|
||||
@@ -0,0 +1,226 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<link rel="canonical" href="https://derez.ai/blog/posts/sync-hermes-agent-data-with-unison.html" />
|
||||
<title>Sync Your Hermes Agent Data to Your Local Machine — derez.ai Blog</title>
|
||||
<meta name="description" content="Use Unison to sync your Hermes Agent workspace from derez.ai VPS to your local workstation. Cron-based, SSH, no plugins — just reliable file synchronization." />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:url" content="https://derez.ai/blog/posts/sync-hermes-agent-data-with-unison.html" />
|
||||
<meta property="og:title" content="Sync Your Hermes Agent Data to Your Local Machine" />
|
||||
<meta property="og:description" content="Use Unison to sync your Hermes Agent workspace from derez.ai VPS to your local workstation. Cron-based, SSH, no plugins — just reliable file synchronization." />
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="twitter:title" content="Sync Your Hermes Agent Data to Your Local Machine" />
|
||||
<script defer data-domain="derez.ai" src="https://plausible.odoo4projects.com/js/script.file-downloads.outbound-links.tagged-events.js"></script>
|
||||
<script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,400;14..32,500;14..32,600;14..32,700&display=swap" rel="stylesheet" />
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body { background: #08080c; color: #e8e8f0; font-family: 'Inter', sans-serif; line-height: 1.7; padding: 40px 20px; }
|
||||
.container { max-width: 720px; margin: 0 auto; }
|
||||
a { color: #00f5ff; text-decoration: none; }
|
||||
a:hover { text-decoration: underline; }
|
||||
.back { margin-bottom: 32px; display: inline-block; font-size: 0.9rem; color: #888; }
|
||||
.back:hover { color: #00f5ff; }
|
||||
h1 { font-size: 1.9rem; font-weight: 700; line-height: 1.3; margin-bottom: 12px; }
|
||||
.meta { font-size: 0.85rem; color: #888; margin-bottom: 40px; display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
|
||||
.area-tag { display: inline-block; background: #f472b6; color: #000; font-size: 0.75rem; font-weight: 700; padding: 2px 10px; border-radius: 20px; text-transform: uppercase; letter-spacing: 0.5px; }
|
||||
.chip-tag { display: inline-block; background: rgba(0,245,255,0.1); color: #00f5ff; border: 1px solid rgba(0,245,255,0.3); font-size: 0.75rem; font-weight: 600; padding: 2px 10px; border-radius: 20px; text-transform: uppercase; letter-spacing: 0.5px; }
|
||||
h2 { font-size: 1.3rem; font-weight: 600; margin: 36px 0 12px; color: #f0f0ff; }
|
||||
h3 { font-size: 1.1rem; font-weight: 600; margin: 24px 0 8px; color: #e0e0f0; }
|
||||
p { margin-bottom: 16px; color: #c8c8d8; }
|
||||
ul, ol { margin: 0 0 16px 24px; color: #c8c8d8; }
|
||||
li { margin-bottom: 6px; }
|
||||
code { background: #0e0e14; padding: 2px 6px; border-radius: 4px; font-size: 0.9em; color: #00f5ff; }
|
||||
pre { background: #0e0e14; border: 1px solid #1a1a24; border-radius: 10px; padding: 16px 20px; margin: 0 0 20px; overflow-x: auto; font-size: 0.85rem; color: #c8f0ff; }
|
||||
pre code { background: none; padding: 0; color: inherit; }
|
||||
strong { color: #f0f0ff; }
|
||||
.pro-tip { background: rgba(0,245,255,0.06); border-left: 3px solid #00f5ff; border-radius: 8px; padding: 16px 20px; margin: 20px 0; font-size: 0.92rem; color: #d0d0e0; }
|
||||
.pro-tip strong { color: #00f5ff; }
|
||||
.code-block { background: #0e0e14; border: 1px solid #1a1a24; border-radius: 10px; padding: 20px 24px; margin: 20px 0; }
|
||||
.code-block .label { color: #00f5ff; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; }
|
||||
.code-block pre { margin: 0; }
|
||||
@media (max-width: 600px) { body { padding: 24px 16px; } h1 { font-size: 1.5rem; } }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<a class="back" href="https://derez.ai/#blog">← Back to Blog</a>
|
||||
<h1>Sync Your Hermes Agent Data to Your Local Machine</h1>
|
||||
<div class="meta">
|
||||
<span>July 29, 2026</span>
|
||||
<span class="area-tag">tutorial</span>
|
||||
<span class="chip-tag">hermes</span>
|
||||
<span class="chip-tag">devops</span>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Your Hermes Agent lives on a remote VPS. It works, it writes blog posts, sends cold emails, manages your Odoo — but when you want to review its work, edit its files, or inspect its state, you either SSH in or use the dashboard file manager.
|
||||
</p>
|
||||
<p>
|
||||
There's a better way. <strong>Unison</strong> syncs files bidirectionally between machines over SSH — no plugins, no cron hacks, no Docker volumes. Just two directories staying in sync.
|
||||
</p>
|
||||
|
||||
<h2>Why Unison?</h2>
|
||||
|
||||
<p>
|
||||
rsync is great for one-way copies. But your agent modifies files on the VPS — it writes blog posts, updates CRM data, runs workflows. If you only rsync <em>from</em> the VPS, you lose local changes. If you only rsync <em>to</em> the VPS, you overwrite what the agent did.
|
||||
</p>
|
||||
<p>
|
||||
Unison solves this by merging changes from <strong>both sides</strong>. It's bidirectional, conflict-aware, and runs over SSH. Perfect for keeping your local workspace in sync with a remote agent.
|
||||
</p>
|
||||
|
||||
<h2>The Setup</h2>
|
||||
|
||||
<h3>1. Install Unison on Both Machines</h3>
|
||||
|
||||
<div class="code-block">
|
||||
<div class="label">Server (VPS)</div>
|
||||
<pre><code># On derez.ai or your VPS
|
||||
apt install unison # Debian/Ubuntu
|
||||
# or
|
||||
yum install unison # RHEL/CentOS</code></pre>
|
||||
</div>
|
||||
|
||||
<div class="code-block">
|
||||
<div class="label">Local Workstation (macOS)</div>
|
||||
<pre><code>brew install unison</code></pre>
|
||||
</div>
|
||||
|
||||
<div class="code-block">
|
||||
<div class="label">Local Workstation (Linux)</div>
|
||||
<pre><code>apt install unison # Debian/Ubuntu
|
||||
# or
|
||||
sudo dnf install unison # Fedora</code></pre>
|
||||
</div>
|
||||
|
||||
<h3>2. Test the Connection</h3>
|
||||
|
||||
<p>
|
||||
Before setting up cron, verify Unison can connect over SSH:
|
||||
</p>
|
||||
|
||||
<div class="code-block">
|
||||
<div class="label">Run from your local machine</div>
|
||||
<pre><code>unison -testservercmd 'ssh root@hood.derez.ai "unison"' /path/to/local/dir ssh://root@hood.derez.ai:2281//path/to/remote/dir
|
||||
|
||||
# You should see:
|
||||
# No changes. The two roots are in sync.</code></pre>
|
||||
</div>
|
||||
|
||||
<h3>3. Set Up the Sync</h3>
|
||||
|
||||
<p>
|
||||
Here's the production sync command I use daily. It syncs my entire Hermes workspace — skills, profiles, blog posts, CRM data, scripts — every minute:
|
||||
</p>
|
||||
|
||||
<div class="code-block">
|
||||
<div class="label">Local machine cron (~/.bashrc or crontab)</div>
|
||||
<pre><code>* * * * * unison /home/user/Agents/pa ssh://root@hood.derez.ai:2281//root/workspace -auto -batch 2>&1 | tail -n 5</code></pre>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Let's break this down:
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>/home/user/Agents/pa</code> — the local directory to sync <em>from</em></li>
|
||||
<li><code>ssh://root@hood.derez.ai:2281//root/workspace</code> — the remote directory to sync <em>to</em> (note the double slash after the host)</li>
|
||||
<li><code>:2281</code> — SSH port (if using a non-standard port)
|
||||
<li><code>-auto</code> — automatically accept the default action for each file (no interactive prompts)</li>
|
||||
<li><code>-batch</code> — suppress progress output, only show errors</li>
|
||||
</ul>
|
||||
|
||||
<h3>4. Set Up SSH Keys</h3>
|
||||
|
||||
<p>
|
||||
For cron to work without a password prompt, set up SSH key authentication:
|
||||
</p>
|
||||
|
||||
<div class="code-block">
|
||||
<div class="label">On your local machine</div>
|
||||
<pre><code># Generate a key if you don't have one
|
||||
ssh-keygen -t ed25519 -C "hermes-sync"
|
||||
|
||||
# Copy to server
|
||||
ssh-copy-id -p 2281 root@hood.derez.ai</code></pre>
|
||||
</div>
|
||||
|
||||
<h2>What Gets Synced</h2>
|
||||
|
||||
<p>
|
||||
Here's what I typically sync:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>/root/workspace</strong> — My main working directory on the VPS</li>
|
||||
<li><strong>~/Agents/pa</strong> — The agent profiles and skills directory</li>
|
||||
<li><strong>~/derez.ai/blog</strong> — Blog posts (so I can edit them in VS Code locally)</li>
|
||||
<li><strong>~/derez.ai/data</strong> — CRM data, analytics, and configuration files</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
You can adjust the paths to match your setup. The key is picking the directories that contain files you want to work with locally.
|
||||
</p>
|
||||
|
||||
<div class="pro-tip">
|
||||
<strong>Pro tip:</strong> Use <code>-ignore "Name *.pyc"</code> and <code>-ignore "Name __pycache__"</code> to skip Python cache files. They sync fast but clutter your local directory.
|
||||
</div>
|
||||
|
||||
<h2>Common Issues</h2>
|
||||
|
||||
<h3>"Connection refused" — SSH port</h3>
|
||||
<p>
|
||||
If your server uses a non-standard SSH port (like 2281), you <strong>must</strong> specify it in the Unison URL:
|
||||
</p>
|
||||
<div class="code-block">
|
||||
<pre><code># Wrong (uses port 22):
|
||||
ssh://root@hood.derez.ai//root/workspace
|
||||
|
||||
# Right (uses port 2281):
|
||||
ssh://root@hood.derez.ai:2281//root/workspace</code></pre>
|
||||
</div>
|
||||
|
||||
<h3>"Permission denied" — SSH key</h3>
|
||||
<p>
|
||||
Make sure your SSH key is in <code>~/.ssh/id_ed25519</code> on the local machine, and the corresponding <code>id_ed25519.pub</code> is in the server's <code>~/.ssh/authorized_keys</code>.
|
||||
</p>
|
||||
|
||||
<h3>"Conflict detected"</h3>
|
||||
<p>
|
||||
If both sides have changed the same file, Unison will pause and ask what to do. Add <code>-auto</code> to accept the default (usually "Newer on the VPS"), or use <code>-force</code> to always prefer one side:
|
||||
</p>
|
||||
<div class="code-block">
|
||||
<pre><code># Always prefer VPS version for conflicting files
|
||||
unison /local/path ssh://root@server//remote/path -auto -force ssh</code></pre>
|
||||
</div>
|
||||
|
||||
<h2>Why This Matters for Your Agent</h2>
|
||||
|
||||
<p>
|
||||
When your agent writes a blog post, it saves it to the VPS. With Unison, that post appears on your local machine within a minute — ready to preview, edit, or share. When you tweak a skill file locally, it syncs up to the agent.
|
||||
</p>
|
||||
<p>
|
||||
It's the missing piece in the remote-agent workflow: <strong>seeing what the agent did, when it did it, without SSHing in.</strong>
|
||||
</p>
|
||||
|
||||
<div class="pro-tip">
|
||||
<strong>For derez.ai users:</strong> Your instance already has SSH access. Use the same SSH key from your local machine, adjust the hostname to your instance, and you're syncing in under 2 minutes. No plugins, no Docker, no extra configuration.
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Use coupon code <strong>BLOG950</strong> at checkout to get your first month free — zero risk, full access.
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://derez.ai/#pricing">Deploy your own agent — and sync its data to your machine.</a>
|
||||
</p>
|
||||
|
||||
<p style="margin-top:48px;padding-top:24px;border-top:1px solid #1a1a24;font-size:0.85rem;color:#666;">
|
||||
<a href="https://derez.ai" style="color:#00f5ff">derez.ai</a> — Deploy your AI agent in 10 Minutes.
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user