原文来自我的个人博客:发了又删,删了又发:用 15 分钟给自己搭一个没有观众压力的朋友圈 - 叹惋博客
一、一个挺常见的困境
朋友圈里越来越多人的主页变成了“三天可见”,点进去一片空白。问过几个朋友,回复出奇一致——“没什么好发的”或者“发了也不知道给谁看”。哈哈哈哈哈哈有时候想想挺搞笑的。
仔细想想,不是不想发,是发之前要想的事情太多了:同学看到会怎么想?亲戚会不会来问东问西?前任还在列表里,这条会不会显得我过得不好?最后编辑好的文字删了又删,干脆不发了。
分享欲就是这样被一点点消磨掉的。
之前在 GitHub 看到一个项目叫 Ech0,作者是 lin-snow,有 2K 的 Star。看了一圈介绍,大概就是个自己说了算的微博或者朋友圈。试了一下,觉得挺对味,记录一下完整的折腾过程。
二、Ech0 到底是干什么的
Ech0 是一个开源的自托管内容发布平台。官方定位是“个人微博/时间线”——你自己的内容、你自己的数据、你自己的规则。
作者自己说,像 Memos 这类工具适合快速记录想法,而 Ech0 是下一步——把这些想法发布到个人时间线上,让别人也能关注和互动。
核心功能大概这些:
发动态:文字、图片、链接、Markdown 都支持
待办清单:集成了 Todo 功能,随手记任务
音乐播放器:可以上传自己的音乐,边看边听
视频解析:B站、YouTube 链接自动转成可播放的卡片
评论系统:可以接入 Twikoo 等第三方评论服务
联邦协议:支持 ActivityPub,可以和 Mastodon、Misskey 等其他实例互通
几个比较实在的特点:
资源占用极低。放在一台最低配的服务器上几乎感觉不到它的存在。
数据完全在你手里。所有内容存在一个 SQLite 文件里。服务器不要了直接把文件拷走,换个地方照样跑。不像某些平台,想导出数据还得走审批流程。
部署真的简单。一条 Docker 命令就搞定,不需要配数据库、不需要装 PHP 环境、不需要折腾 Nginx。
跨平台。x86 和 ARM 架构都支持,Linux、Windows 甚至树莓派都能跑。
三、它不适合什么人
Ech0 的定位很明确,就是个发动态的地方。如果你需要 Obsidian 那样的双向链接知识库,或者 Notion 那种团队协作文档,那它不适合你。
它就是一个“想说点什么”的地方,别指望它能干别的。
四、准备工作
你需要一台有公网 IP 的服务器,配置要求极低——1 核 1GB 内存完全够用。我这里用的是雨云服务器。
系统建议 Ubuntu 22.04 或 24.04。
然后确保服务器上装了 Docker,版本 20.10 以上。没有装的话一行命令搞定:
curl -fsSL https://get.docker.com | bash
装完用 docker --version 确认一下版本。
![]()
五、部署
Ech0 官方提供了 Docker 镜像,部署命令就一条:
docker run -d \
--name ech0 \
-p 6277:6277 \
-v /opt/ech0/data:/app/data \
-v /opt/ech0/backup:/app/backup \
-e JWT_SECRET="Hello Echos" \
sn0wl1n/ech0:latest
参数解释:
-d:后台运行--name ech0:给容器起个名字,方便管理-p 6277:6277:把服务器的 6277 端口映射到容器里-v两行:挂载数据目录和备份目录,容器删了数据还在JWT_SECRET:登录认证用的密钥
但这里有个安全细节要注意:上面命令里的 JWT_SECRET="Hello Echos" 是官方示例的默认值。强烈建议改成自己生成的随机字符串,不然有安全风险。
Linux 下可以这样生成:
openssl rand -base64 32
然后把输出的长字符串替换掉 "Hello Echos",再执行 docker run 命令。
跑完之后 docker ps 看一下容器状态,如果是 Up 就说明成功了。
六、第一次登录
浏览器打开 http://你的服务器IP:6277。
第一次访问会看到注册页面。
注册的第一个账号自动成为管理员。
注册完登录进去,界面很干净。
左侧可以发动态,支持三种模式切换:
1.时间轴模式:正常发动态、刷动态
2.Todo 模式:待办事项清单
3.音乐模式:上传并播放音乐
发完的内容会按时间线展示,GitHub 链接之类的会自动转成可视化卡片。
默认情况下,只有管理员账号能发布内容,普通用户只能看。如果想让多个账号都能发,可以在后台调整权限设置。
七、几个可以继续折腾的方向
上面只是把 Ech0 跑起来了,能发能看。但真要长期用,还有几个地方值得弄一下。
1.配个域名,加上 HTTPS
用 IP 加端口访问终究不是长久之计——一方面每次要记端口号,另一方面如果要开启联邦功能(后面会讲),必须要有域名和 HTTPS。
第一步:安装 Nginx
apt update
apt install nginx -y
第二步:准备域名解析
去你的域名服务商那里,添加一条 A 记录,把域名指向服务器的公网 IP。
第三步:申请 SSL 证书
用 Let’s Encrypt 免费证书,配合 Certbot 自动申请和续期,your-domain.com改成你自己的域名:
apt install certbot python3-certbot-nginx -y
certbot --nginx -d your-domain.com
按照提示输入邮箱、同意协议,Certbot 会自动帮你申请证书并修改 Nginx 配置。
第四步:配置 Nginx 反向代理
用 IP 加端口访问终究不是长久之计——每次要记端口号不说,如果要开启联邦功能,必须要有域名和 HTTPS。下面把 Nginx 反代这部分掰开揉碎说一下。
<1>先把 Nginx 装上
apt update
apt install nginx -y
装完可以看一下 Nginx 的版本和运行状态:
nginx -v
systemctl status nginx
如果防火墙开着,记得把 80 和 443 端口放行。以 UFW 为例:
ufw allow 80/tcp
ufw allow 443/tcp
<2>域名解析怎么做
去你的域名服务商(阿里云、腾讯云、Cloudflare 等都一样)的控制台,找到 DNS 解析设置,添加一条 A 记录:
| 记录类型 | 主机记录 | 记录值 | TTL |
|---|---|---|---|
| A | 比如 ech0 或者 @ |
你服务器的公网 IP | 默认即可 |
如果你想让最终的访问地址是 ech0.your-domain.com,主机记录就填 ech0;如果想直接用 your-domain.com 访问,主机记录填 @。
添加完之后等几分钟到几十分钟不等,用下面命令检查是否生效:
ping ech0.your-domain.com
如果能 ping 通,返回的 IP 是你服务器的 IP,说明解析已经生效了。
<3>申请 SSL 证书
用 Let’s Encrypt 的免费证书,配合 Certbot 自动申请和续期。
先装 Certbot 和 Nginx 插件:
apt install certbot python3-certbot-nginx -y
然后申请证书(注意把域名换成你自己的):
certbot --nginx -d ech0.your-domain.com
如果同一个域名下还有多个子域名要一并申请,可以这样:
certbot --nginx -d ech0.your-domain.com -d www.ech0.your-domain.com
执行之后会问你几个问题:
输入邮箱地址(用于证书到期提醒)
同意服务条款(按 A 键同意)
是否愿意把邮箱分享给 EFF 基金会(选 N 就行)
是否自动把 HTTP 跳转到 HTTPS(选 2,让 Certbot 帮你自动配置重定向)
一切顺利的话,Certbot 会自动完成证书申请并写入 Nginx 配置。证书文件会存放在 /etc/letsencrypt/live/ech0.your-domain.com/ 目录下。
Certbot 还会自动添加一个定时任务,证书快到期的时候自动续期,不用手动操心。
<4>配置反向代理
Nginx 的配置文件放在 /etc/nginx/sites-available/ 目录下,这个目录可以理解为“备用的配置文件仓库”。真正生效的配置文件在 /etc/nginx/sites-enabled/ 目录里,可以把它理解成“启用的配置文件”。
先在 sites-available 里新建一个配置文件:
vim /etc/nginx/sites-available/ech0
把下面内容粘进去,注意把域名全部换成你自己的:
server {
listen 80;
listen [::]:80;
server_name ech0.your-domain.com; # 换成你自己的域名
return 301 https://$server_name$request_uri;
}
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ech0.your-domain.com; # 换成你自己的域名
ssl_certificate /etc/letsencrypt/live/ech0.your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ech0.your-domain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:6277;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
解释一下 proxy_set_header 这四行是干什么的:
| 头部 | 作用 |
|---|---|
Host $host |
把客户端请求的域名传给后端,Ech0 需要知道用户是用哪个域名访问的 |
X-Real-IP $remote_addr |
把客户端的真实 IP 传给后端,不然 Ech0 日志里看到的全是 127.0.0.1 |
X-Forwarded-For $proxy_add_x_forwarded_for |
记录代理链上所有 IP,方便排查问题 |
X-Forwarded-Proto $scheme |
告诉后端客户端用的是 HTTP 还是 HTTPS,Ech0 根据这个判断是否要生成 HTTPS 链接 |
这几行不加的话,Ech0 可能会把链接生成成 http:// 而不是 https://,导致页面样式加载失败或者联邦功能不正常。
<5>让配置生效
先把配置文件“启用”——在 sites-enabled 里建一个软链接指向 sites-available 里的文件:
ln -s /etc/nginx/sites-available/ech0 /etc/nginx/sites-enabled/
然后测试一下 Nginx 配置有没有语法错误:
nginx -t
如果输出是:
nginx: configuration file /etc/nginx/nginx.conf test is successful
说明没问题。如果报错,检查一下是不是域名或者证书路径写错了。
测试通过之后重载 Nginx 配置:
systemctl reload nginx
<6>在 Ech0 后台更新站点地址
打开 Ech0 管理后台 → 系统设置 → 服务地址,填上 https://ech0.your-domain.com,保存。
这一步如果不做,Ech0 生成的链接可能还是 http://IP:6277 那种格式,和反代配的 HTTPS 对不上,访问会出问题。
<7>常见问题排查
访问域名看到 Nginx 默认欢迎页:
说明配置文件没有生效。检查软链接是否创建成功、Nginx 是否重载、以及是否有其他配置文件占用相同的 server_name。
浏览器提示 SSL 证书不安全:
检查证书是否申请成功,或者访问的域名和证书的域名是否一致。
页面能打开,但样式全是乱的,没有 CSS:
打开浏览器开发者工具(F12),看网络请求那一栏,有没有请求被拦截或者返回 404。大概率是后台“服务地址”没改成 HTTPS 开头的地址,或者反代配置里漏了 X-Forwarded-Proto 那行。
访问时出现 502 Bad Gateway:
说明 Nginx 无法连接到 Ech0 服务。检查 Ech0 容器是否正常运行(docker ps),以及 proxy_pass 后面的端口号是否写对了(应该是 6277)。
配置修改后没生效:
有可能是 Nginx 配置没有重载,执行 systemctl reload nginx。如果还不行,执行 nginx -t 检查语法,或者用 systemctl restart nginx 完全重启试试。
2.评论功能
Ech0 内置了原生评论系统,开箱即用。每一条动态下面自带评论框,支持评论的展示和管理,不需要额外部署任何第三方服务。
管理员可以在后台对评论进行管理——审核、删除、屏蔽等操作都支持。
3.OAuth2第三方登录
Ech0 支持 OAuth2 协议,可以接入 GitHub、Google、QQ 等第三方登录。配置好之后,登录界面就会出现“使用 GitHub 登录”之类的按钮。
下面以 GitHub 为例,说一下怎么配。
第一步:在 GitHub 创建 OAuth App
1.登录 GitHub,点击右上角头像 → Settings → 左侧菜单最下面找到 Developer settings
或者直接点击Your profile
2.进入 OAuth Apps → 点击 New OAuth App
填写信息:
Application name:随便填,比如 “Ech0”
Homepage URL:填你 Ech0 的访问地址,比如 https://ech0.your-domain.com
Authorization callback URL:填 https://ech0.your-domain.com/oauth/github/callback
3.点击 Register application
4.生成并记下 Client ID 和 Client Secret
第二步:在 Ech0 后台配置
1.登录 Ech0 管理后台 → 单点登陆 → OAuth2
2.找到 OAuth2 配置区域:
1.启用:打开开关
2.提供商:选择 GitHub(之后后面的很多系统已经填上了)
3.Client ID:填刚才记下的 Client ID
4.Client Secret:填刚才记下的 Client Secret
5.Callback URL:系统已经自动填好,确认是 https://ech0.your-domain.com/oauth/github/callback
6.Redirect Allowlist:填入和上面Callback URL一样的链接
7.CORS Origins:填入你的网站域名https://ech0.your-domain.com
8..保存
第三步:测试
退出登录,回到登录页面,应该能看到“使用 GitHub 登录”的按钮。点击后会跳转到 GitHub 授权页面,授权完成后自动跳回 Ech0 并完成登录。
接入 Google 或 QQ 的流程类似,区别在于需要在 Google Cloud Console 或 QQ 互联后台创建应用,获取对应的 Client ID 和 Secret,然后在 Ech0 后台的提供商下拉框里选择对应的选项即可
4.数据备份
Ech0 的所有数据都存在一个 SQLite 文件里。数据量不大的情况下,备份其实就是把这个文件拷走。
在管理后台的“设置”里面可以配置自动备份计划:
配置好之后 Ech0 会按计划自动执行备份。
当然下面也能选择手动备份
八、其他可以关注的功能
1.PWA 支持:Ech0 支持渐进式 Web 应用。手机浏览器打开后,菜单里会有“添加到主屏幕”的选项,点一下就会生成一个类似 App 的图标,打开后跟原生应用体验差不多。
2.TUI 终端界面:Ech0 除了 Web 界面和命令行工具,还提供了一个终端用户界面。在服务器上不用开浏览器也能管理内容,对习惯用命令行的用户比较友好。
3.RSS 输出:Ech0 支持 RSS,可以用 RSS 阅读器订阅自己的动态流。
4.Webhook:Ech0 支持配置 Webhook,当有新内容发布时可以触发外部系统的回调。
5.VireFS 统一存储层:Ech0 用 VireFS 统一了本地存储和 S3 兼容对象存储的挂载和管理,如果需要存大量图片视频,可以配置 S3。
九、这段时间用下来的感受
我把它当成一个“碎碎念收集器”。想到什么随手记一笔,不用考虑排版、不用考虑谁看到会怎么想、不用纠结要不要分组可见。
没有点赞数、没有评论通知、没有算法推荐——这些东西在别的平台上是一种“社交货币”,但有时候也是一种负担。Ech0 把这些都去掉了,剩下的是一个很纯粹的记录空间。
如果你也有“想发点什么又算了”的时刻,可以试试。花十几分钟搭一个,不行就删了,反正不花钱。








