<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Docs on HappyRock</title>
    <link>/docs/</link>
    <description>Recent content in Docs on HappyRock</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Thu, 09 Jul 2026 00:23:18 +0800</lastBuildDate>
    <atom:link href="/docs/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Hermes Web Chat MVP in Action: Building Your Own AI Web Chat System from Scratch (Full Version)</title>
      <link>/docs/hermes-web-chat-mvp/</link>
      <pubDate>Thu, 09 Jul 2026 00:23:18 +0800</pubDate>
      <guid>/docs/hermes-web-chat-mvp/</guid>
      <description>&lt;hr&gt;&#xA;&lt;h1 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h1&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Chapter 1 Why Build Hermes Web Chat&#xA;&#xA;Chapter 2 Overall Architecture Design&#xA;&#xA;Chapter 3 Project Directory&#xA;&#xA;Chapter 4 Frontend Page Development&#xA;&#xA;Chapter 5 FastAPI Backend&#xA;&#xA;Chapter 6 DeepSeek Integration&#xA;&#xA;Chapter 7 API Design&#xA;&#xA;Chapter 8 OpenResty Proxy Configuration&#xA;&#xA;Chapter 9 HTTPS Deployment&#xA;&#xA;Chapter 10 Systemd Deployment&#xA;&#xA;Chapter 11 Common Troubleshooting&#xA;&#xA;Chapter 12 Performance Optimization&#xA;&#xA;Chapter 13 Next Upgrade Directions&#xA;&#xA;Appendix A Full Source Code&#xA;&#xA;Appendix B Complete nginx Configuration&#xA;&#xA;Appendix C Complete systemd Configuration&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;h1 id=&#34;chapter-1-why-build-hermes-web-chat&#34;&gt;Chapter 1 Why Build Hermes Web Chat&lt;/h1&gt;&#xA;&lt;p&gt;Previously, our Hermes Agent could already:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enterprise WeChat AI Auto-Reply System Troubleshooting Record (Docker &#43; FastAPI &#43; Redis)</title>
      <link>/docs/wechatautoreplay/</link>
      <pubDate>Thu, 02 Jul 2026 04:23:18 +0800</pubDate>
      <guid>/docs/wechatautoreplay/</guid>
      <description>&lt;p&gt;This troubleshooting journey covered a typical &amp;ldquo;enterprise‑level AI message‑processing pipeline&amp;rdquo; — from Webhook → Redis queue → Worker → AI → Enterprise WeChat sending. Almost every layer of the chain presented a pitfall.&lt;/p&gt;&#xA;&lt;p&gt;The entire set of issues can be summarised in one sentence:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;It wasn’t that the system wasn’t running, but rather that the combination of &amp;ldquo;multi‑layer structure + configuration + indentation + imports + startup methods&amp;rdquo; broke the entire chain.&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Complete Implementation Plan for Enterprise WeChat AI Auto-Reply System (Runable Version)</title>
      <link>/docs/wechatai/</link>
      <pubDate>Thu, 02 Jul 2026 01:23:18 +0800</pubDate>
      <guid>/docs/wechatai/</guid>
      <description>&lt;p&gt;Below is a &lt;strong&gt;complete, production-ready implementation plan for an &amp;ldquo;Enterprise WeChat AI Bot (DeepSeek + Redis + Worker Architecture)&amp;rdquo;&lt;/strong&gt; that integrates all the pitfalls I have already encountered (callback, queue, worker, IP whitelist, send failures, etc.) into a standardized step‑by‑step guide.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;i-overall-architecture-design&#34;&gt;I. Overall Architecture Design&lt;/h2&gt;&#xA;&lt;p&gt;This is a typical &amp;ldquo;event‑driven + queue‑decoupled + AI‑processing&amp;rdquo; architecture:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enterprise WeChat User&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enterprise WeChat Server&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Nginx / OpenResty (Reverse Proxy + HTTPS)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FastAPI (Callback Reception / Decryption / Enqueue)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Redis Queue (wecom_queue)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Worker (Task Consumer)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ├── Calls DeepSeek (AI Generation)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enterprise WeChat Message Send API&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;User Receives Reply&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;ii-environment-setup&#34;&gt;II. Environment Setup&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-install-base-dependencies&#34;&gt;1. Install Base Dependencies&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y docker docker-compose&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h3 id=&#34;2-create-project-directory&#34;&gt;2. Create Project Directory&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p /opt/ai/wecom-bot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /opt/ai/wecom-bot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h3 id=&#34;3-basic-docker-compose-services&#34;&gt;3. Basic Docker Compose Services&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;wecom-bot&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;build&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;wecom-bot&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8000:8000&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;redis&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;worker&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;build&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;wecom-worker&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;command&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;python -m app.worker&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;redis&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;redis&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;redis:7-alpine&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ai-redis&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;iii-fastapi-callback-service-core-entry&#34;&gt;III. FastAPI Callback Service (Core Entry)&lt;/h2&gt;&#xA;&lt;h3 id=&#34;file-appmainpy&#34;&gt;File: &lt;code&gt;app/main.py&lt;/code&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Core responsibilities:&lt;/p&gt;</description>
    </item>
    <item>
      <title>WeCom &#43; DeepSeek: A Practical Record of Building a Usable AI Agent from 0 to 1</title>
      <link>/docs/wecomdeepseekaiagent/</link>
      <pubDate>Wed, 01 Jul 2026 08:23:18 +0800</pubDate>
      <guid>/docs/wecomdeepseekaiagent/</guid>
      <description>&lt;p&gt;When doing AI automation within an enterprise, many people get stuck on the most basic problem:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;The WeCom callback works fine, but it just doesn&amp;rsquo;t reply.&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This article is a complete record of the practical process: from integrating the WeCom callback, to driving AI replies with DeepSeek, and finally getting a usable AI Agent up and running.&lt;/p&gt;&#xA;&lt;p&gt;This is not a concept, but a system that actually runs in production.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use Let’s Encrypt to Apply for a Free HTTPS Certificate for Your Website (Complete Tutorial)</title>
      <link>/docs/ssl/</link>
      <pubDate>Thu, 25 Jun 2026 22:42:54 +0800</pubDate>
      <guid>/docs/ssl/</guid>
      <description>&lt;p&gt;📌 This article explains how to configure a free HTTPS certificate for your domain on a Linux (Ubuntu / Debian / CentOS) server, with automatic renewal.&lt;/p&gt;&#xA;&lt;p&gt;Suitable for:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Nginx / OpenResty&lt;/li&gt;&#xA;&lt;li&gt;PHP websites (e.g., forums, Flarum)&lt;/li&gt;&#xA;&lt;li&gt;Static sites (Hugo / Vue SPA)&lt;/li&gt;&#xA;&lt;li&gt;API services&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h1 id=&#34;1-prerequisites&#34;&gt;1. Prerequisites&lt;/h1&gt;&#xA;&lt;h2 id=&#34;1-must-have&#34;&gt;1️⃣ Must have&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A properly resolved domain name (A record pointing to your server IP)&lt;/li&gt;&#xA;&lt;li&gt;Server ports 80 / 443 accessible&lt;/li&gt;&#xA;&lt;li&gt;root or sudo privileges&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;2-verify-domain-resolution&#34;&gt;2️⃣ Verify domain resolution&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ping forum.happyrock.cloud&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Complete Tutorial: Docker Desktop &#43; n8n &#43; Qdrant &#43; Embedding Auto-Ingestion Pipeline</title>
      <link>/docs/workfollow/</link>
      <pubDate>Fri, 19 Jun 2026 16:19:24 +0800</pubDate>
      <guid>/docs/workfollow/</guid>
      <description>&lt;hr&gt;&#xA;&lt;h1 id=&#34;-complete-tutorial-docker-desktop--n8n--qdrant--embedding-auto-ingestion-pipeline&#34;&gt;🚀 Complete Tutorial: Docker Desktop + n8n + Qdrant + Embedding Auto-Ingestion Pipeline&lt;/h1&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A fully local AI knowledge base system you can run right away:&#xA;Webhook → Embedding → n8n processing → Qdrant vector database → searchable knowledge base&#xA;Including all the pitfalls I personally encountered (Webhook parsing, vector format, HTTP JSON errors, payload structure, etc.) — this is the &amp;ldquo;bug-proof&amp;rdquo; edition.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h1 id=&#34;-1-overall-architecture&#34;&gt;🧱 1. Overall Architecture&lt;/h1&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;User Request (Webhook)&#xA;        ↓&#xA;n8n Workflow&#xA;        ↓&#xA;Embedding Model (Ollama / OpenAI)&#xA;        ↓&#xA;Set Node (standardize structure)&#xA;        ↓&#xA;HTTP Request (write to Qdrant)&#xA;        ↓&#xA;Qdrant Vector DB&#xA;        ↓&#xA;Subsequent retrieval / RAG&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;h1 id=&#34;-2-launch-qdrant--n8n-with-docker-desktop&#34;&gt;🐳 2. Launch Qdrant + n8n with Docker Desktop&lt;/h1&gt;&#xA;&lt;h2 id=&#34;1-docker-composeyml&#34;&gt;1️⃣ docker-compose.yml&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;3.9&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;qdrant&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;qdrant/qdrant&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;6333:6333&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./qdrant_data:/qdrant/storage&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;n8n&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;n8nio/n8n&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;5678:5678&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;N8N_HOST=localhost&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;N8N_PORT=5678&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;N8N_PROTOCOL=http&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;NODE_ENV=production&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./n8n_data:/home/node/.n8n&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Start up:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building an AI News Automation System from Scratch: A Hands-On Tutorial for Deploying n8n &#43; DeepSeek &#43; Hugo on Ubuntu</title>
      <link>/docs/n8n/</link>
      <pubDate>Sun, 07 Jun 2026 00:23:18 +0800</pubDate>
      <guid>/docs/n8n/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Author: HappyRock&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Target Audience: Developers, Indie Developers, Technical Managers, AI Enthusiasts&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Tech Stack: Ubuntu + Docker + n8n + DeepSeek + Hugo&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;preface&#34;&gt;Preface&lt;/h3&gt;&#xA;&lt;p&gt;In the past few years, we’ve been used to:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Open RSS&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Browse News&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Filter Hot Topics&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Summarize&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Write WeChat Article&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Publish Blog Post&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The whole process often takes 1–2 hours.&lt;/p&gt;&#xA;&lt;p&gt;But in the era of AI Agents, these tasks can already be handed over to AI.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
