发了又删,删了又发:用 15 分钟给自己搭一个没有观众压力的朋友圈

原文来自我的个人博客:发了又删,删了又发:用 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 IDClient 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 把这些都去掉了,剩下的是一个很纯粹的记录空间。

如果你也有“想发点什么又算了”的时刻,可以试试。花十几分钟搭一个,不行就删了,反正不花钱。

1 个赞