n8n 自托管:搭建你的工作流自动化中心

如果你用过 IFTTT、Zapier 这类自动化工具,但又对把数据交给第三方服务感到不安,n8n 是最值得考虑的开源替代。它支持可视化拖拽搭建工作流,400+ 服务集成,而且可以完全自托管,数据不出自己的服务器。 提示:n8n 采用 fair-code 协议,核心功能开源免费,自托管不收任何费用。官方也提供付费的 n8n Cloud 托管版,本文不涉及,只讲自部署。 准备工作 你需要: 一台能跑 Docker 的机器(VPS、NAS、或者本地 WSL 都行) Docker 和 Docker Compose 如果你还没有 Docker 环境,可以直接在 Linux/WSL 下安装 Docker Engine,或者用 Rancher Desktop 这类带 GUI 的方案。 部署 n8n 最简单的方式是用 Docker Compose,新建一个目录,写入 docker-compose.yml: version: '3' services: n8n: image: n8nio/n8n restart: unless-stopped ports: - "5678:5678" environment: - GENERIC_TIMEZONE=Asia/Shanghai - TZ=Asia/Shanghai - N8N_SECURE_COOKIE=false volumes: - ./n8n_data:/home/node/.n8n 注意:N8N_SECURE_COOKIE=false 是因为没有配置 HTTPS 时,n8n 默认的安全 Cookie 策略会导致登录失败。如果你后续用 Nginx/Caddy 反代加了 HTTPS,可以去掉这行。 ...

June 30, 2026 · 2 min

只改一个文件,README 自动同步——用 GitHub Actions 告别手动维护

维护开源项目或工具清单时,经常会遇到一个问题:数据文件改了,README 忘记同步。时间一长,两边对不上,要么手动逐条复制,要么干脆摆烂。 这篇文章用一个真实场景——书签工具清单——来演示怎么用 GitHub Actions + Python 脚本,实现「只改 bookmarks.yaml,README 自动更新」的工作流。 思路 整个方案分两部分: Python 脚本:读取 bookmarks.yaml,按固定格式生成 README.md GitHub Actions:监听 bookmarks.yaml 的变动,自动触发脚本并提交结果 改动 bookmarks.yaml 之后,不管是本地 push 还是直接在 GitHub 网页上编辑,都会自动触发,不需要手动运行任何命令。 数据文件结构 bookmarks.yaml 的结构很简单,每个分类包含图标、名称和工具列表: - category: 编程工具 icon: 🛠️ items: - name: Zed url: https://zed.dev/ desc: 轻量极速的现代代码编辑器 opensource: true - name: WezTerm url: https://wezfurlong.org/wezterm desc: 高性能跨平台终端模拟器 opensource: true opensource: true 是可选字段,没有这个字段默认视为非开源。 Python 脚本 新建 gen_readme.py,放在仓库根目录: #!/usr/bin/env python3 import yaml HEADER = """# 🛠️ tools > 精选隐私友好、开源优先的实用工具清单。 > A curated list of privacy-friendly, open-source tools I actually use. 🔓 = 开源 / Open Source --- """ FOOTER = """ --- 欢迎提 Issue 或 PR 推荐新工具。 """ def generate_readme(yaml_path="bookmarks.yaml", output_path="README.md"): with open(yaml_path, "r", encoding="utf-8") as f: data = yaml.safe_load(f) lines = [HEADER] for category in data: icon = category.get("icon", "") name = category.get("category", "") items = category.get("items", []) lines.append(f"## {icon} {name}\n") lines.append("| 工具 | 描述 | 开源 |") lines.append("|------|------|------|") for item in items: tool_name = item.get("name", "") url = item.get("url", "") desc = item.get("desc", "") opensource = "🔓" if item.get("opensource") else "" lines.append(f"| [{tool_name}]({url}) | {desc} | {opensource} |") lines.append("") lines.append(FOOTER.strip()) with open(output_path, "w", encoding="utf-8") as f: f.write("\n".join(lines)) print(f"✅ README.md 已生成,共 {len(data)} 个分类") if __name__ == "__main__": generate_readme() 几个关键点: ...

June 8, 2026 · 3 min
本站累计访问 次 · 访客