<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Docker on Colinx Blog</title>
    
    
    
    <link>/tags/docker/</link>
    <description>Recent content in Docker on Colinx Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 13 Oct 2024 00:00:00 +0000</lastBuildDate>
    
	<atom:link href="/tags/docker/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>来谈谈日志集中管理方案 - syslog 是你的好伙伴</title>
      <link>/posts/%E6%9D%A5%E8%B0%88%E8%B0%88%E6%97%A5%E5%BF%97%E9%9B%86%E4%B8%AD%E7%AE%A1%E7%90%86%E6%96%B9%E6%A1%88-syslog%E6%98%AF%E4%BD%A0%E7%9A%84%E5%A5%BD%E4%BC%99%E4%BC%B4/</link>
      <pubDate>Sun, 13 Oct 2024 00:00:00 +0000</pubDate>
      
      <guid>/posts/%E6%9D%A5%E8%B0%88%E8%B0%88%E6%97%A5%E5%BF%97%E9%9B%86%E4%B8%AD%E7%AE%A1%E7%90%86%E6%96%B9%E6%A1%88-syslog%E6%98%AF%E4%BD%A0%E7%9A%84%E5%A5%BD%E4%BC%99%E4%BC%B4/</guid>
      <description>
        
          
          
          
        
        
        

&lt;p&gt;身为一个数码宅，家里总是会有越来越多的数码设备，智能化的设备多起来，总是难免会遇到各种各样的问题，排查问题的时候日志就很重要了，对于一些偶发的 case, 比如偶发网络卡顿，能够看到足够完整清晰的日志，就很方便了。&lt;/p&gt;

&lt;p&gt;对于一些低功耗设备，比如路由器，其磁盘资源很紧张，日志通常不会保存很久。这个时候要排查一些偶发的持续时间长的小 bug 就很头痛了。好在 openwrt 原生就支持将日志通过 syslog 协议发送到远程服务器。不过看了一圈，发送是发送过去了，但是看日志还得命令行一个个看，要想有个方便的地方看的话就得上 ELK 那一套非常繁琐且吃资源的那一套，我的需求是这样的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;免费，可以持续使用&lt;/li&gt;
&lt;li&gt;能够通过 syslog 协议收集日志&lt;/li&gt;
&lt;li&gt;能够自部署最佳，但是不希望是 ELK 那种繁琐且非常消耗资源的&lt;/li&gt;
&lt;li&gt;有个 web 界面能方便的查找日志&lt;/li&gt;
&lt;li&gt;能够配置监控，那样的话如果设备有 fatal 日志我可以立即知道&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;搜寻了一番，发现有个 datalust 公司出的 seq 看起来挺不错，在自己服务器上部署了一套，完美符合我的需求，分享一下。&lt;/p&gt;

&lt;p&gt;seq 不仅支持 syslog, 还支持程序主动上报、采集容器日志等很多功能，这里只主要围绕 syslog, 收集各种终端设备日志做介绍&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202410132128864.png&#34; alt=&#34;Pasted image 20241013170403&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202410132128865.png&#34; alt=&#34;Pasted image 20241013170340&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;安装-通过-docker-compose-部署-seq&#34;&gt;安装：通过 docker compose 部署 seq&lt;/h2&gt;

&lt;p&gt;首先生成下默认密码，这里需要通过程序自身的指令生成明文密码对应的密文才行。比如我这里指定初始密码的明文为&lt;code&gt;initP@ss&lt;/code&gt;, 运行这个指令，就会输出对应的密文，这个待会部署的时候需要使用&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;➜ echo &#39;initP@ss&#39; | sudo docker run --rm -i datalust/seq config hash


QE6k2bZLWkh7BwWYRNsG3h9sZPcLskSLKJGii4mvU0rsDyN0/UqW1TwEZp43O09wvOCjbOgswZxHX7FeNo05cfiv3KkB8/q/Msj8nlXL4TGd
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;之后通过 docker compose 进行部署，下面为 compose 文件示例&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;services:
  seq-input-syslog:
    image: datalust/seq-input-syslog:latest
    container_name: seq_syslog_input
    depends_on:
      - seq
    ports:
      - &amp;quot;20014:514/udp&amp;quot; # 接收 syslog 协议请求的端口，这里配置的是 20014, 可以自定义，后面需要用到
    environment:
      SEQ_ADDRESS: &amp;quot;http://seq:5341&amp;quot; # 要转发到主程序进行处理，端口为默认的 5341, 不用改
    restart: unless-stopped

  seq:
    image: datalust/seq:latest
    container_name: seq_log
    ports:
      - &amp;quot;20054:80&amp;quot; # web ui
    environment:
      ACCEPT_EULA: Y
      SEQ_FIRSTRUN_ADMINPASSWORDHASH: QE6k2bZLWkh7BwWYRNsG3h9sZPcLskSLKJGii4mvU0rsDyN0/UqW1TwEZp43O09wvOCjbOgswZxHX7FeNo05cfiv3KkB8/q/Msj8nlXL4TGd # 这里填写刚生成的密文
    restart: unless-stopped
    volumes:
      - /data/seq-data:/data
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;之后执行 sudo docker compose up -d , 顺利的话，在配置的 web ui 端口，就可以看到管理台了。默认账户为 admin, 密码为刚才设置的密码的原始明文。&lt;/p&gt;

&lt;h2 id=&#34;使用-syslog-配置&#34;&gt;使用：syslog 配置&lt;/h2&gt;

&lt;p&gt;基本上所有 Linux-base 系统都支持将系统日志通过 syslog 协议发送到远端服务器。我手头主要的 openwrt 路由器、运行 truenas 系统的 nas、树莓派上跑的 debian, 以及其他 linux 云服务器都可以无缝接入，这里简单介绍下&lt;/p&gt;

&lt;h3 id=&#34;openwrt-配置远程-log&#34;&gt;openwrt 配置远程 log&lt;/h3&gt;

&lt;p&gt;在 system -&amp;gt; system 菜单下，有个 logging 的 tab, 里面配置好服务器 ip、端口就可以使用了。协议记得选 udp&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202410132128867.png&#34; alt=&#34;Pasted image 20241013165852&#34; /&gt;&lt;/p&gt;

&lt;h3 id=&#34;truenas-配置远程-log&#34;&gt;truenas 配置远程 log&lt;/h3&gt;

&lt;p&gt;在 system setting -&amp;gt; advaned -&amp;gt; syslog 菜单下，配置远程服务器地址和端口，协议选择 udp, 保存就可以了&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202410132128868.png&#34; alt=&#34;Pasted image 20241013171725&#34; /&gt;&lt;/p&gt;

&lt;h3 id=&#34;linux-服务器配置远程-log&#34;&gt;linux 服务器配置远程 log&lt;/h3&gt;

&lt;p&gt;大多数 Linux 发行版已经预装了 rsyslog。可以通过以下命令检查是否已安装：
&lt;code&gt;rsyslogd -version&lt;/code&gt;
如果未安装，可以使用以下命令安装：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;# Debian/Ubuntu:
sudo apt update
sudo apt install rsyslog

# CentOS/RHEL:
sudo yum install rsyslog
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;步骤 2：配置客户端的 rsyslog
编辑 rsyslog 配置文件：打开配置文件进行编辑，通常位于 &lt;code&gt;/etc/rsyslog.conf&lt;/code&gt; 或 &lt;code&gt;/etc/rsyslog.d/&lt;/code&gt; 目录下。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;sudo nano /etc/rsyslog.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;添加远程服务器配置：在文件末尾，添加以下行以指定远程服务器的 IP 地址和端口（默认是 UDP 514 或 TCP 514）：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-conf&#34;&gt;*.* @remote-server-ip:514    # 使用 UDP
*.* @@remote-server-ip:514   # 使用 TCP
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里我们需要使用 udp 协议的。
将 remote-server-ip 替换为远程 Syslog 服务器的实际 IP 地址或者域名，保存并关闭文件。&lt;/p&gt;

&lt;p&gt;比如&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-conf&#34;&gt;*.* @syslog.myserver.com:20014
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;步骤 3：重启 rsyslog 服务
在进行更改后，重启 rsyslog 服务以应用新配置：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;sudo systemctl restart rsyslog
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;其他配置&#34;&gt;其他配置&lt;/h2&gt;

&lt;h3 id=&#34;配置日志定期清理&#34;&gt;配置日志定期清理&lt;/h3&gt;

&lt;p&gt;默认情况下，是没有配置日志清理规则的，时间一长服务器硬盘可能直接满了，所以这里一定不要忘记配置自动清理。在菜单里的 retention 可以配置过多少天删除&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202410132128869.png&#34; alt=&#34;Pasted image 20241013170659&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202410132128870.png&#34; alt=&#34;Pasted image 20241013170654&#34; /&gt;&lt;/p&gt;

&lt;h3 id=&#34;配置告警通知&#34;&gt;配置告警通知&lt;/h3&gt;

&lt;p&gt;各种通知渠道的支持是通过插件形式提供的，在 设置里可以自行安装。可以支持 email、http webhook, 钉钉机器人、telegram 机器人等多种渠道。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.nuget.org/packages?q=Tags%3A%22seq-app%22&#34;&gt;插件市场链接&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

        
        </description>
    </item>
    
    <item>
      <title>解决安装 Plex 时无法进入安装页面的问题</title>
      <link>/posts/%E8%A7%A3%E5%86%B3%E5%AE%89%E8%A3%85plex%E6%97%B6%E6%97%A0%E6%B3%95%E8%BF%9B%E5%85%A5%E5%AE%89%E8%A3%85%E9%A1%B5%E9%9D%A2%E7%9A%84%E9%97%AE%E9%A2%98/</link>
      <pubDate>Sun, 31 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>/posts/%E8%A7%A3%E5%86%B3%E5%AE%89%E8%A3%85plex%E6%97%B6%E6%97%A0%E6%B3%95%E8%BF%9B%E5%85%A5%E5%AE%89%E8%A3%85%E9%A1%B5%E9%9D%A2%E7%9A%84%E9%97%AE%E9%A2%98/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Plex 是一款非常好用的影音库，可自托管，支持 Web, 颜值在线。近期在部署 Plex 的时候死活找不到安装初始化的页面，看了几遍安装文档和官网的流程，都没找到问题在哪。后来 Google 了一圈，才意识到自己这次不是局域网环境部署，Plex 为了安全性考虑，每个新实例的安装部署页面是只对局域网访问的 IP 开放的，甚至不是全部局域网 IP, 只有本机 (Localhost). 这里简单记录下排查和解决的流程，其他朋友在这块可以少踩些坑。&lt;/p&gt;

&lt;p&gt;问题页面如图所示，正常来说新 Plex 服务器是要设定电影资料库，电视节目资料库的文件夹位置，绑定 Plex 账号等。官方文档和其他人的流程都大致如此。但是我访问这个新 Plex 实例对应的初始化 URL, 进来怎么也找不到配置文件夹位置的入口。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254779.png&#34; alt=&#34;Pasted image 20221216213737&#34; /&gt;
后来在这两个地方的资料才发现一些端倪，人家一般都是在 NAS 本机安装，然后访问本机地址进入初始化页面，但是我这个就不是。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://askubuntu.com/questions/1321062/plex-installation-doesnt-give-option-to-setup-server&#34;&gt;https://askubuntu.com/questions/1321062/plex-installation-doesnt-give-option-to-setup-server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.linode.com/docs/guides/install-plex-media-server-on-ubuntu-18-04/#configuring-plex-media-server-on-ubuntu-1804&#34;&gt;https://www.linode.com/docs/guides/install-plex-media-server-on-ubuntu-18-04/#configuring-plex-media-server-on-ubuntu-1804&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;知道了问题所在，解决方案还是比较简单的，那就是 SSH 连接使用端口转发，将目标服务器 Plex 网页服务的端口，映射到本机的一个端口。这样访问本机的这个端口，就能访问到 Plex 服务了，而对于 Plex 服务器的 Web 端来说，我们就是访问的本机地址。&lt;/p&gt;

&lt;p&gt;访问 &lt;a href=&#34;http://localhost:8888/web/&#34;&gt;http://localhost:8888/web/&lt;/a&gt; 即可看到 Plex 的页面。如果没有带上后面的&lt;code&gt;web&lt;/code&gt; 后缀的话，直接访问可能会显示一个 XML 页面。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;ssh user@192.0.2.1 -L 8888:localhost:32400
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;上面这句话就是 ssh 连接到 192.0.2.1 这个远端，然后在本地，即 ssh 客户端的机器，监听 8888 端口，本地所有访问 8888 端口的请求都会被重定向，等同为远端机器访问自身的 32400 端口，即为上文提到的，部署 plex 服务的端口&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254781.png&#34; alt=&#34;Pasted image 20221216213514&#34; /&gt;
如下是正常的初始化页面：
&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254782.png&#34; alt=&#34;Pasted image 20221216214020&#34; /&gt;
有些情况下可能会遇到需要额外执行关联操作的情况，不过问题不大&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254783.png&#34; alt=&#34;Pasted image 20221216214456&#34; /&gt;
&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254784.png&#34; alt=&#34;Pasted image 20221216214521&#34; /&gt;&lt;/p&gt;

&lt;p&gt;配置成功后就可以正常享受影音资源啦 😎&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254785.png&#34; alt=&#34;Pasted image 20231231225353&#34; /&gt;&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>安全不是特权 - 雷池 WAF 使用体验及部署安装教程</title>
      <link>/posts/%E5%AE%89%E5%85%A8%E4%B8%8D%E6%98%AF%E7%89%B9%E6%9D%83-%E9%9B%B7%E6%B1%A0waf%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C%E5%8F%8A%E9%83%A8%E7%BD%B2%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/</link>
      <pubDate>Mon, 18 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>/posts/%E5%AE%89%E5%85%A8%E4%B8%8D%E6%98%AF%E7%89%B9%E6%9D%83-%E9%9B%B7%E6%B1%A0waf%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C%E5%8F%8A%E9%83%A8%E7%BD%B2%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/</guid>
      <description>
        
          
          
          
        
        
        

&lt;p&gt;自从开始倒腾服务器，部署各种各样服务以来，网站安全一直是那个令我焦虑的一个话题。暴露了那么多服务在公网，总免不了有无聊的人或者别有用心的人在搞事。(当然也有可能不是人类 hhh) 之前也有几次被攻击的历史，比如阿里云控制台一堆 SSH 爆破攻击记录，还有 Wordpress 被攻陷，出现一堆奇怪的文章和评论。虽然损失不是很大，但是处理起来还是有点麻烦的。(被攻击之后学乖了，老老实实定期备份) 况且我在明敌在暗，我们总是处于被动的那个，时间一长，网站的风险和潜在的损失还是不小的，最好是可以有一些防火墙和策略能够拦截点大部分不友好的请求。&lt;/p&gt;

&lt;p&gt;很早以前就有调研过世面上的网站防火墙类产品，主要就几种类型：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;各大云厂商配套的 WAF, 不过收费都很贵&lt;/li&gt;
&lt;li&gt;Cloudflare 等 CDN 服务商提供的服务，不过必须要接入其 CDN 反代才能用。而且大陆地区联通性并不好&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/SpiderLabs/ModSecurity&#34;&gt;ModSecurity&lt;/a&gt; 等开源方案，开源免费可自托管，不过配置比较麻烦，而且没有好用的 web 页面&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;近期刚好关注到雷池 WAF 这个项目比较火，看了下是国内一个安全公司搞得，看 Github Repo 和官方文档像模像样的，虽然文档跟大多数中文项目一样，很多地方写的不够清晰，一些小细节没有跟最新的版本同步，但是&lt;strong&gt;总体而言，可用，不难用。值得一试&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs/202312182326408.png&#34; alt=&#34;Pasted image 20231218222249&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;使用体验&#34;&gt;使用体验&lt;/h2&gt;

&lt;p&gt;谈一谈我为什么选择使用雷池 WAF:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;免费，开源 (这点存疑，没有详细审计过所有 submoudule, 目前看起来只有部分开源，仓库里大部分都是文档啥的。不过有有安全厂商实名，应该不会做出来一些自毁招牌的操作)&lt;/li&gt;
&lt;li&gt;支持通过 &lt;code&gt;docker compose&lt;/code&gt; 自部署&lt;/li&gt;
&lt;li&gt;功能够用。基本反代站点配置，SSL, 多种规则的黑白名单，频率限制，人机验证，攻击历史看板&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;目前已经使用了有几个月了，来谈一谈一些个人感受&lt;/p&gt;

&lt;p&gt;优点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;又要免费，又要能自部署，又要有方便使用的 web 页面，目前这个好像是唯一能选的&amp;hellip;&lt;/li&gt;
&lt;li&gt;支持 &lt;code&gt;docker compose&lt;/code&gt; 自部署，可以自行编排和自定义很多配置&lt;/li&gt;
&lt;li&gt;TOTP 认证，加分&lt;/li&gt;
&lt;li&gt;UI 简约清晰，加分&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;缺点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;有一些小 bug, 挺影响使用体验的，比如我最开始用的那个版本，那时候还不知道这个只能 TOTP 验证，又找不到地方和文档设置初始账号密码，但是进首页直接跳到了仪表盘，又一直刷报错。这种情况没登录就不应该显示仪表盘界面的，非常误导人，我还以为是强制开了 HTTPS 但是我没有上传 SSL 证书导致的后端请求一直报错。&lt;/li&gt;
&lt;li&gt;开源了但是又没有完全开。人家企业做这个的本意是推销自家的收费套餐，这个没毛病。但是请不要挂羊头卖狗肉，影响不好。GitHub Repo 都是些文档内容，有个所谓的语义检测引擎倒是放了一点代码，但是这个代码量级太少了，像个玩具项目，不像是正儿八经投入使用的引擎的源码。看了下这个社区版本的文档之类的，从头到尾就没有提过怎么参与项目贡献代码，挂了个 GitHub 链接似乎只是诱导大家去 star, 这样好做宣传。合着这个所谓的社区版就只是部署了之后有个按钮，可以共享攻击记录的 ip?&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose&lt;/code&gt; 写的方式令人费解。竟然需要在&lt;code&gt;.env&lt;/code&gt; 文件中自定义一个内网网段，然后用 docker compose 的时候自动创建一个子网，每个容器根据子网的前缀指定了一个 ip, 然后其他容器连接都是在环境变量里写死&amp;hellip;.明明可以用 compose 文件里定义的 service name 或者 container name 作为 alias 使用内置的 dns 轻松实现的服务发现，为什么搞得如此麻烦？而且有没有考虑过，如果要更新，再执行 compose up 的时候，先前的子网 ip 是被占用的，每次还得先看一下当前用了哪些子网，然后找个没用的，这操作也是没谁了&amp;hellip; 你说人家懂吧，他还通过 env 文件自定义 compose 创建的子网前缀，说人家不懂吧，用 container name 做 alias 自动实现服务发现这么简单的方式竟然不用。可能有安全或者性能方面的考量？不过我个人使用还是全部删掉了写死子网前缀的配置，这个使用方法真实太离谱了&lt;/li&gt;
&lt;li&gt;目前只会记录疑似恶意的请求，正常请求不会记录，没法通过这个来看网站总访问情况了，有点可惜&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;安装部署流程&#34;&gt;安装部署流程&lt;/h2&gt;

&lt;p&gt;简单分享下我调优后的安装流程，不使用写死的子网前缀做服务发现。&lt;/p&gt;

&lt;h3 id=&#34;1-获取-compose-文件&#34;&gt;1. 获取 compose 文件&lt;/h3&gt;

&lt;p&gt;官方文档默认提供的不是通过 &lt;code&gt;docker compose&lt;/code&gt; 安装，而是他们的一个脚本。可能是为了照顾广大墙内被 CSDN &amp;ldquo;惯坏&amp;rdquo;的用户吧，脚本里除了基本的环境检测，主要是提供 docker 的便捷安装，但是怎么说呢&amp;hellip;本意是给墙内用户便捷安装，但是为什么安装的操作还是到 docker 官方安装脚本，有没有一种可能，大部分大陆的服务器访问这个站点都很慢甚至连不上呢？但凡这里切一下 docker ce 镜像源都没这么离谱&amp;hellip;&lt;/p&gt;

&lt;p&gt;回到正题，这里还是大家通过 &lt;code&gt;docker compose&lt;/code&gt; 安装。没安装 docker 的建议先去安装，有条件的可以直接按照官方文档来，&lt;a href=&#34;https://docs.docker.com/engine/install/ubuntu/&#34;&gt;安装文档链接&lt;/a&gt;. 也可以参考我之前写的 RSSMAN 部署文档中 Docker 安装的部分，有讲解在国内环境下提前更换镜像源以更快完成下载安装。&lt;a href=&#34;https://rss101.colinx.one/deploy/rssman-full-guide/#1-docker&#34;&gt;Docker 安装-RSSMAN 部署指南 - RSS101&lt;/a&gt;
&lt;a href=&#34;https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/&#34;&gt;RSSMan 部署指南&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;之后获取官方最新的 compose 文件。文档里贴的链接是在离线安装的章节有个 compose 文件链接 &lt;a href=&#34;https://waf-ce.chaitin.cn/release/latest/compose.yaml&#34;&gt;https://waf-ce.chaitin.cn/release/latest/compose.yaml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;当然也可以直接去 Github 找，在 release 文件夹下。&lt;a href=&#34;https://github.com/chaitin/SafeLine/blob/main/release/latest/compose.yaml&#34;&gt;https://github.com/chaitin/SafeLine/blob/main/release/latest/compose.yaml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;之后需要按照文档指示，在 compose 文件同文件夹位置，创建一个&lt;code&gt;.env&lt;/code&gt;文件，并填写相关的变量。这里推荐使用我调整后的版本。后续如果官方对于整个架构有更新，以官方的为准，可以自行根据需要调整 compose 文件。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;services:
  safeline.manager:
    container_name: safeline-manager
    restart: always
    image: chaitin/safeline-mgt-api:${IMAGE_TAG:?image tag required}
    volumes:
      - ${SAFELINE_DIR?safeline dir required}/resources/management:/resources/management
      - ${SAFELINE_DIR}/resources/nginx:/resources/nginx
      - ${SAFELINE_DIR}/logs:/logs
      - /etc/localtime:/etc/localtime:ro
    ports:
      - ${MGT_PORT:-9443}:1443
    environment:
      - MANAGEMENT_RESOURCES_DIR=/resources/management
      - NGINX_RESOURCES_DIR=/resources/nginx
      - DATABASE_URL=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline-db/safeline-ce
      - MARIO_URL=http://safeline-mario:3335
      - FVM_MANAGER_URL=safeline.fvm-manager:9004
      - MANAGEMENT_LOGS_DIR=/logs/management
    dns:
      - 119.29.29.29
      - 223.5.5.5
      - 8.8.8.8
    networks:
      - safeline
    cap_drop:
      - net_raw
  safeline.detector:
    container_name: safeline-detector
    restart: always
    image: chaitin/safeline-detector:${IMAGE_TAG}
    volumes:
      - ${SAFELINE_DIR}/resources/detector:/resources/detector
      - ${SAFELINE_DIR}/logs/detector:/logs/detector
      - /etc/localtime:/etc/localtime:ro
    environment:
      - LOG_DIR=/logs/detector
    networks:
      - safeline
    cap_drop:
      - net_raw
  safeline.mario:
    container_name: safeline-mario
    restart: always
    image: chaitin/safeline-mario:${IMAGE_TAG}
    volumes:
      - ${SAFELINE_DIR}/resources/mario:/resources/mario
      - ${SAFELINE_DIR}/logs/mario:/logs/mario
      - /etc/localtime:/etc/localtime:ro
    environment:
      - LOG_DIR=/logs/mario
      - GOGC=100
      - DATABASE_URL=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline.postgres/safeline-ce
    networks:
      - safeline
    cap_drop:
      - net_raw
  safeline.tengine:
    container_name: safeline-gateway
    restart: always
    image: chaitin/safeline-tengine:${IMAGE_TAG}
    volumes:
      - ${SAFELINE_DIR}/resources/nginx:/etc/nginx
      - ${SAFELINE_DIR}/resources/management:/resources/management
      - ${SAFELINE_DIR}/resources/detector:/resources/detector
      - ${SAFELINE_DIR}/logs/nginx:/var/log/nginx
      - /etc/localtime:/etc/localtime:ro
      # - ${SAFELINE_DIR}/resources/cache:/usr/local/nginx/cache
      - tengine-cache:/usr/local/nginx/cache
    environment:
      - MGT_API=https://safeline.manager:1443/api/publish/server
    ulimits:
      nofile: 131072
    networks:
      - safeline
    ports:
      - 80:80
      - 443:443
  safeline.fvm-manager:
    container_name: safeline-fvm-manager
    restart: always
    image: chaitin/safeline-fvm-manager:${IMAGE_TAG}
    environment:
      - FVM_LOGS_DIR=/logs/management
      - DETECTOR_URL=http://safeline-detector:8001
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ${SAFELINE_DIR}/logs:/logs
    networks:
      - safeline
    cap_drop:
      - net_raw

  safeline.postgres:
    container_name: safeline-db
    restart: always
    image: postgres:15-alpine
    volumes:
      - ${SAFELINE_DIR}/resources/postgres/data:/var/lib/postgresql/data
      - /etc/localtime:/etc/localtime:ro
    environment:
      - POSTGRES_USER=safeline-ce
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?postgres password required}
    networks:
      - safeline
    cap_drop:
      - net_raw
    command: [postgres, -c, max_connections=200]

volumes:
  tengine-cache:

networks:
  safeline:
    name: safeline
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: safeline
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;2-安装部署&#34;&gt;2. 安装部署&lt;/h3&gt;

&lt;p&gt;部署成功后，第一次使用理论上会跳转到 TOTP 绑定页面。我之前这里卡到 bug, 第一次访问不是首页，没有看到那个绑定 TOTP 的二维码，后面就一直没法跳转到绑定页面了&amp;hellip;.不知道后面这个 bug 修复了没有，如果大家也遇到这个问题可以考虑全部清理干净，重新安装。&lt;/p&gt;

&lt;p&gt;TOTP 软件推荐和对比：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft Authenticator( 微软出品，支持云同步，国内可用，微软账户验证有单独的通道和验证方式，速度和体积一般)&lt;/li&gt;
&lt;li&gt;Google Authenticator (谷歌出品，简约好用，体积小速度快，可惜大陆地区没法云同步)&lt;/li&gt;
&lt;li&gt;BitWarden (支持使用自建实例，可惜 app 略卡)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;

&lt;p&gt;雷池 WAF 目前来看是一款够用，不难用的免费 WAF, 建议一试。&lt;/p&gt;

&lt;p&gt;此外重要数据还是要经常备份，多副本 + 多地存储，数据无价！&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>docker compose 的错误使用姿势</title>
      <link>/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/</link>
      <pubDate>Wed, 11 May 2022 00:00:00 +0000</pubDate>
      
      <guid>/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/</guid>
      <description>
        
          
          
          
        
        
        

&lt;!-- # docker compose 的错误使用姿势 --&gt;

&lt;p&gt;这篇文章记录几个 docker compose 使用过程中几个难以察觉的错误使用姿势&lt;/p&gt;

&lt;h2 id=&#34;1-变量值使用-符号开头&#34;&gt;1. 变量值使用&lt;code&gt;@&lt;/code&gt;符号开头&lt;/h2&gt;

&lt;p&gt;我在 RSS MAN X 的 docker-compose 配置文件中，huignn 的环境变量出来时是这样写的&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;environment:
	- DATABASE_ADAPTER=postgresql
	- DATABASE_HOST=database.huginn
	- DATABASE_USERNAME=postgres
	- DATABASE_PASSWORD=@pass_for_DB
	- DATABASE_PORT=5432
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;自己使用的时候没发现什么问题，别人从零创建容器的时候报错了。刚开始排查了很久，后面发现我默认密码这样写其实是有问题的。&lt;/p&gt;

&lt;p&gt;上面的使用列表来描述环境变量在 docker-compose 解析的时候没有任何报错信息。但是使用下面这种 key-value 的 map 的形式时，&lt;code&gt;docker-compose up&lt;/code&gt;命令报错了，说 YAML 解析时出现问题&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;environment:
	DATABASE_ADAPTER: postgresql
	DATABASE_HOST: database.huginn
	DATABASE_USERNAME: postgres
	DATABASE_PASSWORD: @pass_for_DB
	DATABASE_PORT: 5432
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;yaml: line 17: found character that cannot start any token
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;删除前导&lt;code&gt;@&lt;/code&gt;符号则一切正常了。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;DATABASE_PASSWORD: pass_for_DB
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;后续测试了几次到底是什么原因导致的&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;# error
DATABASE_PASSWORD: @pass_for_DB	

# correct
DATABASE_PASSWORD: pass_for_DB

# correct
DATABASE_PASSWORD: ${DB_Password:-&#39;pass_for_DB&#39;}
## in .env
DB_Password=www_123

# correct
DATABASE_PASSWORD: ${DB_Password:-&#39;@pass_for_DB&#39;}
## in .env
DB_Password=www_123

# error
DATABASE_PASSWORD: ${DB_Password:-&#39;@pass_for_DB&#39;}
## no .env

# error
DATABASE_PASSWORD: ${DB_Password:-&#39;@pass_for_DB&#39;}
## in .env
DB_Password=@www_123

# correct
DATABASE_PASSWORD: ${DB_Password:-&#39;@pass_for_DB&#39;}
## in .env
DB_Password=A@www_123
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;最终发现无论是否使用 docker-compose 变量替换，只要最终设定值的时候，包含前导@符号，最终一定会失败。Huginn 的这边的报错为解析容器内的一个 YAML 文件时失败&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;huginn1     | foreman stderr | 
huginn1     | Caused by:
huginn1     | foreman stderr | Psych::SyntaxError: (&amp;lt;unknown&amp;gt;): found character that cannot start any token while scanning for the next token at line 8 column 13
huginn1     | foreman stderr | /app/vendor/bundle/ruby/2.6.0/gems/railties-6.0.4.4/lib/rails/application/configuration.rb:232:in `database_configuration&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;后面我又进入容器查看了下容器内部读取到的环境变量到底是不是预期的值，发现了问题所在&lt;/p&gt;

&lt;p&gt;能正常使用的情况&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;~ » sudo docker exec -it huginn1 /bin/bash
default@3b652a8413fb:~$ echo $DATABASE_HOST
database.huginn
default@3b652a8413fb:~$ echo $DATABASE_PASSWORD
A@www_123
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;出错的情况&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;~ » sudo docker exec -it huginn1 /bin/bash
default@42e19e692b24:~$ echo $DATABASE_HOST
database.huginn
default@42e19e692b24:~$ echo $DATABASE_PASSWORD
&#39;@pass_for_DB&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;可以看到，如果以&lt;code&gt;@&lt;/code&gt;符号开头，最终的环境变量会加上引号，这对于某些应用来说会产生预期之外的结果，如此处测试的 Huginn。&lt;/p&gt;

&lt;h2 id=&#34;2-使用-6000-或-6666-端口&#34;&gt;2. 使用 6000 或 6666 端口&lt;/h2&gt;

&lt;p&gt;这也是一定挺特殊的场景，虽然与 docker compose 关系不大，但是难免会遇到。在映射端口的时候有一个很坑的地方，如果你要部署一个 web 服务，然后映射的时候填写的是&lt;code&gt;6000&lt;/code&gt;端口或者是&lt;code&gt;6666&lt;/code&gt;端口，你会发现无论怎么重启容器、更改容器设置、更换 Edge/Chrome，浏览器就是访问不了页面。&lt;/p&gt;

&lt;p&gt;实在折腾地快疯了，点开 Chrome 的错误详情，才发现这么一句&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;ERR_UNSAFE_PORT&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;一查才发现，Chrome 等浏览器会限制部分特殊端口的网页访问，这些端口一般都已经有特殊的作用。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.jianshu.com/p/40f79f584eae&#34;&gt;https://www.jianshu.com/p/40f79f584eae&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这里列出 1000 以上的部分会有相关问题的端口，别的不说，感觉&lt;code&gt;6000&lt;/code&gt;和&lt;code&gt;6666&lt;/code&gt;还是很容易一不小心就会设置的端口。。。。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-c&#34;&gt;  2049, // nfs
  3659, // apple-sasl / PasswordServer
  4045, // lockd
  6000, // X11
  6665, // Alternate IRC
  6666, // Alternate IRC
  6667, // Standard IRC
  6668, // Alternate IRC
  6669, // Alternate IRC
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Chrome、FireFox 等都会有类似的行为，换多少浏览器、换多少版本可能也都不行。。。&lt;/p&gt;

&lt;p&gt;根据网友描述，部分特殊情况下，其他可能会被拦截的端口也包括&lt;code&gt;8080&lt;/code&gt;，&lt;code&gt;8443&lt;/code&gt;，&lt;code&gt;10080&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;总之，日常映射端口还是选取&lt;code&gt;10000&lt;/code&gt;以上的高位端口吧，避免不必要的麻烦：）&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>RSSManX 安装部署指南</title>
      <link>/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sat, 07 May 2022 00:00:00 +0000</pubDate>
      
      <guid>/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/</guid>
      <description>
        
          
          
          
        
        
        

&lt;!-- # RSSManX 安装部署指南 --&gt;

&lt;p&gt;RSS Man X 是我两年前入坑 RSS 后，为了方便更多人更方便地使用 RSS 所发起的一个项目，主要是用 docker-compose 整合了一些常用的服务如 TTRSS、RSSHub、Huginn、OpenCC 等并进行了一些优化调整，如自动更新，反反爬虫等。这篇文章会尽可能详尽地讲解安装部署的步骤以及安装过程中可能会遇到的一些问题。&lt;/p&gt;

&lt;p&gt;RSS Man X 会利用到 docker 和 docker-compose，首先需要确保你的服务器正确安装了这些软件&lt;/p&gt;

&lt;h2 id=&#34;1-docker-环境准备&#34;&gt;1. Docker 环境准备&lt;/h2&gt;

&lt;p&gt;检查服务器中是否已经安装了 docker 和 docker-compose，并检查他们的版本是否太老。比如输入&lt;code&gt;docker --version&lt;/code&gt;来检查 docker 的版本&lt;/p&gt;

&lt;p&gt;docker 的版本建议不要低于 19，docker-compose 的版本建议不要低于 1.20&lt;br /&gt;
(注：Docker 新版本可使用&lt;code&gt;docker compose&lt;/code&gt; 替代 &lt;code&gt;docker-compose&lt;/code&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;~ » docker --version
Docker version 20.10.12, build 20.10.12-0ubuntu2~20.04.1
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;~ » docker-compose --version
docker-compose version 1.25.0, build unknown
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果上面命令执行后提示&lt;code&gt;command not found&lt;/code&gt;，那么说明并没有安装对应的软件包（或是安装的路径并不在当前用户的 PATH 变量中，尝试切换到 root 操作，详细的原因和解决方法见后文）&lt;/p&gt;

&lt;h3 id=&#34;1-1-ubuntu-debian-安装-docker&#34;&gt;1.1 Ubuntu/Debian 安装 Docker&lt;/h3&gt;

&lt;p&gt;ubuntu 和 debian 主要是用 apt 安装和管理软件包，可以使用以下命令来安装，根据实际情况选择是否要加 sudo。下面以 Ubuntu 为例。Debian 下的安装略有不同，可以参见&lt;a href=&#34;https://docs.docker.com/engine/install/debian/&#34;&gt;Docker 官方文档&lt;/a&gt;，以及&lt;a href=&#34;https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/&#34;&gt;清华镜像源&lt;/a&gt;。其中&lt;code&gt;download.docker.com&lt;/code&gt;连接不同的可以尝试讲域名部分更换为&lt;a href=&#34;https://mirrors.ustc.edu.cn/help/docker-ce.html&#34;&gt;中科大提供的镜像&lt;/a&gt;地址&lt;code&gt;mirrors.ustc.edu.cn/docker-ce&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;# 首先移除老旧的软件包
sudo apt-get remove docker docker-engine docker.io containerd runc

sudo apt-get update
# 安装一些必要的依赖
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果你的服务器在墙外，可以直接使用 docker 官方的软件源&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  &amp;quot;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable&amp;quot; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果你的服务器在墙内，可以使用由中科大提供的镜像&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  &amp;quot;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable&amp;quot; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;导入 docker 软件源后即可开始安装 docker，安装完成后可以输入&lt;code&gt;docker --version&lt;/code&gt;来检查 docker 的版本&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;1-2-centos-fedora-安装-docker&#34;&gt;1.2 CentOS/Fedora 安装 Docker&lt;/h3&gt;

&lt;p&gt;CentOS 和 Fedora 使用 yum 安装和管理软件包，新版本则是使用 dnf，不过两者功能一致且高度兼容。下面以 CentOS 为例，Fedora 可参见&lt;a href=&#34;https://docs.docker.com/engine/install/fedora/&#34;&gt;官方文档&lt;/a&gt;或&lt;a href=&#34;https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/&#34;&gt;清华镜像源&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;# 1. 首先移除老旧的软件包

sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
# 2.
sudo yum install -y yum-utils

# 3.A 之后使用官方docker软件库
sudo yum-config-manager \
   --add-repo \
   https://download.docker.com/linux/centos/docker-ce.repo

# 3.B 墙内方案
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo sed -i &#39;s+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+&#39; /etc/yum.repos.d/docker-ce.repo


# 4. 即可开始安装
sudo yum update
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;1-3-安装或更新-docker-compose&#34;&gt;1.3 安装或更新 docker-compose&lt;/h3&gt;

&lt;p&gt;docker-compose 目前有两个主要版本 V1 和 V2，都是可用的。V1 使用 Python 编写，使用时类似&lt;code&gt;sudo docker-compose up -d&lt;/code&gt;，V2 则是 Golang 编写，与前者高度兼容，但是是作为 docker 的插件安装的，使用时类似&lt;code&gt;sudo docker compose up -d&lt;/code&gt;，中间的短杠不需要了。&lt;/p&gt;

&lt;p&gt;如果是按照上文的步骤安装的 docker，那么默认已经安装了 docker compose v2，可以通过&lt;code&gt;docker compose version&lt;/code&gt;查看版本&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;~ » docker compose version
Docker Compose version v2.3.3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果需要是安装的比较老的 v1 版本的 docker-compose，想要单纯更新 docker-compose 而又不想动其他东西的话，可以更新安装 v1 版本的 docker-compose。&lt;/p&gt;

&lt;p&gt;首先删除老旧版本（如果有的话）&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;rm $DOCKER_CONFIG/cli-plugins/docker-compose
sudo rm /usr/local/lib/docker/cli-plugins/docker-compose
pip uninstall docker-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;然后使用 pip 来安装&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;pip3 install docker-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;墙内也可以临时使用镜像源下载&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果提示 pip 命令不存在需要先安装一下&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;# Ubuntu/Debian
sudo apt install python3-pip

# CentOS/Fedora
sudo yum install python3-pip
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果 pip 报错试着升级一下 pip 的版本&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;1-4-为-docker-配置镜像源&#34;&gt;1.4 为 Docker 配置镜像源&lt;/h3&gt;

&lt;p&gt;如果 Docker 下载镜像非常慢，你可能需要单独配置一下 Docker 的镜像源。==&lt;strong&gt;注意：Docker 安装软件源的镜像和 Docker 镜像或者说映像的国内源并不是同一个，英文表述可能更准确一些：&lt;/strong&gt;==&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;上文安装 docker 时配置的是 docker 的 repo，repo 里含有 docker 的软件包，&lt;a href=&#34;https://mirrors.ustc.edu.cn/help/docker-ce.html&#34;&gt;国内的镜像&lt;/a&gt;为 Docker CE 安装软件包的镜像&lt;/li&gt;
&lt;li&gt;现在我们要配置的是 Docker Hub 的 Mirror，Docker 里拉取 Image 默认会访问&lt;a href=&#34;https://hub.docker.com&#34;&gt;Docker Hub&lt;/a&gt;，国内有多个 Docker Hub 镜像或是 Docker 镜像加速器，如&lt;a href=&#34;https://mirrors.ustc.edu.cn/help/dockerhub.html&#34;&gt;中科大的源&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在&lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;文件中写入以下内容，如不存在可先行创建，注意 json 中列表的最后一项末尾是没有逗号的&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-json&#34;&gt;{
  &amp;quot;registry-mirrors&amp;quot;: [
    &amp;quot;https://hub-mirror.c.163.com&amp;quot;,
    &amp;quot;https://mirror.baidubce.com&amp;quot;,
    &amp;quot;https://docker.nju.edu.cn&amp;quot;,
    &amp;quot;https://docker.mirrors.sjtug.sjtu.edu.cn&amp;quot;,
    &amp;quot;https://dockerproxy.com&amp;quot;,
    &amp;quot;https://docker.m.daocloud.io&amp;quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;update 20230720: 部分镜像源不再可用，更新镜像源配置。参考 &lt;a href=&#34;https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6&#34;&gt;https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;配置完成后&lt;code&gt;sudo systemctl restart docker&lt;/code&gt;重启 docker 服务，然后输入&lt;code&gt;sudo docker info&lt;/code&gt;，在输出结果的末尾可以看到&lt;code&gt;Registry Mirrors&lt;/code&gt;里会出现我们刚刚配置的 Docker Hub 镜像&lt;/p&gt;

&lt;p&gt;群辉等 NAS 的系统并不是标准版 Linux，安装的也是魔改版 docker，上面的配置文件地址并不适用，建议自行搜索对应的文档或教程。&lt;/p&gt;

&lt;h2 id=&#34;2-安装-rss-man-x&#34;&gt;2. 安装 RSS Man X&lt;/h2&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/Colin-XKL/RSSmanX&#34;&gt;RSS MAN X 项目&lt;/a&gt;旨在为 RSS 的同好提供一个方便地搭建自己的 RSS 服务的捷径，毕竟不是所有 RSS 爱好者都懂代码 😂。RSS Man X 能够有 RSS 订阅管理、RSS 在线阅读界面，进阶功能包括服务健康自检、海外站点 RSS 解锁等，提供不同的版本供选择，三个版本的 &lt;code&gt;docker-compose&lt;/code&gt; 文件对应不同的需求，包含的组件和服务有差异。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组件 / 服务 / 功能名称&lt;/th&gt;
&lt;th&gt;标准版&lt;/th&gt;
&lt;th&gt;Lite 版&lt;/th&gt;
&lt;th&gt;Ultimate 版 ✨&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TTRSS&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;RSSHub&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Huginn&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Mercury&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;OpenCC&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Browserless&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;数据持久化保存&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;容器自动更新&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;容器健康检查&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;海外站点加速&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;智能路由&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;反反爬虫&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&#34;2-1-安装流程&#34;&gt;2.1 安装流程&lt;/h3&gt;

&lt;p&gt;安装好了 &lt;code&gt;docker&lt;/code&gt; 和 &lt;code&gt;docker-compose&lt;/code&gt; 后，可以使用&lt;code&gt;git clone https://github.com/Colin-XKL/RSSmanX --depth=1&lt;/code&gt;快速克隆本仓库，也可以通过&lt;a href=&#34;https://archive.fastgit.org/Colin-XKL/RSSmanX/archive/refs/heads/master.zip&#34;&gt;这个镜像地址&lt;/a&gt;下载仓库 zip 文件，&lt;a href=&#34;https://gitee.com/colin-xkl/RSSmanX&#34;&gt;Gitee 上也有镜像&lt;/a&gt;不过不经常更新。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;cd 进入文件夹，修改&lt;code&gt;.env&lt;/code&gt;中的值，如密码和 TTRSS 入口 URL 等&lt;/li&gt;
&lt;li&gt;运行 &lt;code&gt;sudo docker-compose up -d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;等待程序跑完&lt;/li&gt;
&lt;li&gt;安装完成 ✅&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;2-2-相关事宜&#34;&gt;2.2 相关事宜&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;访问你设置的 &lt;code&gt;SELF_URL&lt;/code&gt; 即可看到 Tiny Tiny RSS 的登陆页面，使用默认账户 &lt;code&gt;admin&lt;/code&gt;，密码 &lt;code&gt;password&lt;/code&gt; 登陆即可开始使用&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如开启海外站点解锁支持，第一次冷启动需要等待 3-5 分钟才能完全启动所有组件。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;数据默认保存位置&lt;code&gt;~/.docker/Database&lt;/code&gt;（注意以执行 docker 命令的用户为准，如使用 root 账户执行，则文件位于 root 用户 home 目录）&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;默认情况下只有 TTRSS 和 Huginn 可以从外部访问，其他组件互相可以访问但不能直接从外部访问以提高安全性。组件间互相访问可以使用&lt;code&gt;容器名+指定端口&lt;/code&gt;，端口默认为 80，如&lt;code&gt;http://rsshub/xxxxx&lt;/code&gt;即可访问到 RSS Man X 内的监听 80 端口的 rsshub 实例。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;在 TTRSS 中将原来订阅的 &lt;code&gt;https://rsshub.app/*&lt;/code&gt; 更改为 &lt;code&gt;http://rsshub/*&lt;/code&gt; 即可使用 RSS Man X 内的自建 RSSHub 实例，并激活反反爬虫和海外源加速等功能&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如无法访问 rsshub 的官方文档站点，可以使用我维护的反代站点&lt;a href=&#34;https://rsshub-doc.azure.colinx.one/&#34;&gt;https://rsshub-doc.azure.colinx.one/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;关于 ARM 平台的支持可查阅&lt;a href=&#34;https://github.com/Colin-XKL/RSSmanX/issues/5&#34;&gt;置顶的 issue&lt;/a&gt;，替换部分不支持 arm 架构的 docker 镜像为支持 arm 的镜像即可。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;RSS Man X 的除 lite 以外的版本默认包含了自托管的 mercury 实例，你只需要在插件配置页面设置 mercury 实例地址为 &lt;code&gt;service.mercury:3000&lt;/code&gt; 即可，同理，OpenCC 实例地址为&lt;code&gt;service.opencc:3000&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如果部分 RSS 源不能订阅，检查是否使用了非常规端口。在&lt;code&gt;.env&lt;/code&gt;文件中设置&lt;code&gt;RSS_ALLOW_PORTS&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;若部署后某个应用一直无法通过浏览器访问，请检查是否绑定到了&lt;code&gt;6000&lt;/code&gt;/&lt;code&gt;6666&lt;/code&gt;等特殊端口，浏览器会拦截对这些端口的访问参见&lt;a href=&#34;https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/&#34;&gt;这里&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;code&gt;ls&lt;/code&gt;没有显示&lt;code&gt;.env&lt;/code&gt;文件是因为以点开头的文件在 Linux 中都是默认隐藏的，可以使用&lt;code&gt;ls -a&lt;/code&gt;查看到&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;vi/vim 编辑文本太麻烦可以尝试使用 nano&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;RSS Man 里所有容器绑定了服务器的/etc/localtime，使用&lt;code&gt;sudo timedatectl set-timezone Asia/Shanghai&lt;/code&gt; 设定系统的时区为上海后，容器里的时区也可以同步，这样日志里的时间就是东八区了&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;获取帮助&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;For Tiny tiny RSS problems:&lt;/strong&gt;
&lt;a href=&#34;https://tt-rss.org/wiki.php&#34;&gt;https://tt-rss.org/wiki.php&lt;/a&gt;
&lt;a href=&#34;http://ttrss.henry.wang/&#34;&gt;http://ttrss.henry.wang/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For RSSHub problems:&lt;/strong&gt;
&lt;a href=&#34;https://docs.rsshub.app/faq.html&#34;&gt;https://docs.rsshub.app/faq.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For Huginn problems:&lt;/strong&gt;
&lt;a href=&#34;https://github.com/huginn/huginn#readme&#34;&gt;https://github.com/huginn/huginn#readme&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;2-3-链接&#34;&gt;2.3 链接&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.colinx.one/posts/%E6%88%91%E7%9A%84rss%E6%96%B9%E6%A1%88%E4%B8%8E%E5%BF%83%E5%BE%97/&#34;&gt;我的 RSS 方案与心得&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Colin-XKL/RSSmanX&#34;&gt;RSS Man X GitHub repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.colinx.one/posts/huginn%E6%8C%87%E5%8D%97%E4%B8%BA%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99%E5%88%B6%E4%BD%9Crss/&#34;&gt;Huginn 指南：为任意网站制作 RSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/&#34;&gt;docker compose 的错误使用姿势&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
    <item>
      <title>我的 RSS 方案与心得</title>
      <link>/posts/%E6%88%91%E7%9A%84rss%E6%96%B9%E6%A1%88%E4%B8%8E%E5%BF%83%E5%BE%97/</link>
      <pubDate>Mon, 10 May 2021 00:00:00 +0000</pubDate>
      
      <guid>/posts/%E6%88%91%E7%9A%84rss%E6%96%B9%E6%A1%88%E4%B8%8E%E5%BF%83%E5%BE%97/</guid>
      <description>
        
          &lt;img src=&#34;https://www.gethow.org/wp-content/uploads/2013/07/feed-297x140.jpg&#34;/&gt;
          
        
        
        

&lt;!-- # 我的 RSS 方案与心得 --&gt;

&lt;p&gt;使用 RSS 已经一年有余，这种对信息的主动掌握让我获取信息的质量和密度都上升了一个台阶。最早是使用 TTRSS 做服务端，安卓手机使用 &lt;a href=&#34;https://github.com/seazon/FeedMe&#34;&gt;FeedMe&lt;/a&gt; 订阅，主要订阅的是有源的商业内容站点、个人博客以及其他人分享的使用 Feed43 或 Feedburner 压制的源。随着我逐渐加大 RSS 阅读在我闲暇、琐碎时间内的比重，我对 RSS 有了更高的期望和要求，便开始了对如何构建更高效、更易用的 RSS 方案的探索。&lt;/p&gt;

&lt;h2 id=&#34;0x01-借助-rsshub-订阅各种热门冷门网站&#34;&gt;0x01 借助 RSSHub 订阅各种热门冷门网站&lt;/h2&gt;

&lt;p&gt;&lt;a href=&#34;https://docs.rsshub.app/&#34;&gt;RSSHub&lt;/a&gt; 是个很赞的项目，它聚集了众多 RSS 爱好者来为现代的网站构建 RSS 订阅源。众所周知，网站提供 RSS 并不能为他的站点带来更高的收入，反而会减少主站的访客数。借助 RSSHub 可以方便地通过 RSS 订阅知乎、豆瓣、Facebook 等现代媒体社交平台。&lt;/p&gt;

&lt;h2 id=&#34;0x02-获取-feed-文章全文&#34;&gt;0x02 获取 Feed 文章全文&lt;/h2&gt;

&lt;p&gt;部分 RSS 源并不会在 xml 文件内提供文章全文，说白了是想让你点进他们的网站去浏览，这样网页上的广告才有可能被你点击。解决的方案有很多，方便起见我使用了 TTRSS 的插件 Readability 和 Mercury。两者都不能完美适配所有站点，同时启用这两者以实现互补。&lt;/p&gt;

&lt;h2 id=&#34;0x03-无障碍阅读繁体中文-feed&#34;&gt;0x03 无障碍阅读繁体中文 Feed&lt;/h2&gt;

&lt;p&gt;发现了几个质量不错的繁体中文信息源，主要是台湾的站点，如泛科学。由于文字和部分两岸文化差异，直接阅读繁体中文的文章有些困难。我的解决方案是使用 OpenCC 简繁转换服务，它能够对可映射的简繁汉字以及同一事物的两岸不同的表述进行翻译，输出的简体中文版文章基本可以无障碍阅读。Awesome-TTRSS 内有集成相应的插件和服务程序。&lt;/p&gt;

&lt;p&gt;不过原作者是使用 node.js 编写的服务端，翻译数据库得不到及时更新，如翻译后还是写的是&lt;code&gt;义大利&lt;/code&gt;而不是&lt;code&gt;意大利&lt;/code&gt;。而且 docker image 体积 100+M，内存占用也较大。我在考虑用 Go 语言重写 OpenCC 的服务端并兼容 TTRSS 的 OpenCC 插件，并加入 CI 自动从上游同步翻译数据库。&lt;/p&gt;

&lt;h2 id=&#34;0x04-为不支持-rss-的网站自制源&#34;&gt;0x04 为不支持 RSS 的网站自制源&lt;/h2&gt;

&lt;p&gt;繁茂如 RSSHub 也不能保证拥有所有站点的 RSS 源。对于自制源，网上的方案大多数为使用 Feed43 和 Feedburner，但是人家是商业服务，虽然使用确实方便，但说到底还是为了商业。白嫖用户限制多不说，天知道哪天会有 break change 或者直接被墙或者跑路。最稳妥的做法还是自建。&lt;/p&gt;

&lt;p&gt;手写爬虫程序简单灵活，不过后期维护难度较高而且难以复用。对于我想要订阅而有没有现成的源的网站，我的解决方案主要是两个：&lt;/p&gt;

&lt;h3 id=&#34;1-为-rsshub-编写目标站点的规则-并-pull-request-申请合并&#34;&gt;1. 为 RSSHub 编写目标站点的规则，并 Pull Request 申请合并&lt;/h3&gt;

&lt;p&gt;RSSHub 除了提供众多现成的各类站点的 RSS 规则之外，也提供了快速构建一个站点的 RSS 源的常用工具类和模板。需要对 JavaScript 和爬虫技术有一定了解。很荣幸能提交了几个 pr 并且已经合并进了主分支，如 CQUT 的教务处通知和&lt;a href=&#34;https://docs.rsshub.app/social-media.html#zhi-hu-yong-hu-wen-zhang&#34;&gt;知乎的用户文章列表&lt;/a&gt;。&lt;/p&gt;

&lt;h3 id=&#34;2-使用-huginn-为目标站点自制源&#34;&gt;2. 使用 Huginn 为目标站点自制源&lt;/h3&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/huginn/huginn&#34;&gt;Huginn&lt;/a&gt; 是一个强大的 &lt;a href=&#34;https://sspai.com/post/25270#!&#34;&gt;IFTTT&lt;/a&gt; 应用，用它来生成 RSS 源简直是大材小用（主要是他动辄 200M 的内存占用）。不过某些情况下我需要监视特定站点并在内容变化时得到通知，个人向为主，这类就不适合写 RSSHub 的规则。&lt;/p&gt;

&lt;p&gt;使用门槛比 RSSHub 略低，可视化界面还是比较友好的，不过新手上手还是会有点困难，了解了 Huginn 的工作原理和基本的 Liquid 语法之后就手到擒来了。&lt;/p&gt;

&lt;h3 id=&#34;3-使用-feed43-和-rss-proxy-这类可视化工具自助生成-rss-链接&#34;&gt;3. 使用 feed43 和 rss-proxy 这类可视化工具自助生成 RSS 链接&lt;/h3&gt;

&lt;p&gt;手写解析规则还是太麻烦，很多网页结构很简单根本没必要单独花时间写一堆解析规则，而且有些时候只是想临时订阅一段时间或是订阅个很小的网站，不想大费周章，选择 feed43 这类工具不失为一个轻量又便捷的选择。不过&lt;a href=&#34;https://feed43.com/&#34;&gt;feed43&lt;/a&gt;对免费账户创建的 RSS 并不保证稳定，时常无法连接甚至直接失效。在 Github 上发现一个不错的替代品&lt;a href=&#34;https://github.com/damoeb/rss-proxy/&#34;&gt;rss-proxy&lt;/a&gt;，一个可视化的，快速自助生成站点 RSS 链接的工具。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://cdn.jsdelivr.net/gh/damoeb/rss-proxy/docs/rssproxy-candidates.png&#34; alt=&#34;rss-proxy screenshot&#34; /&gt;&lt;/p&gt;

&lt;p&gt;填入目标网址就可以自动解析目标网页，程序会自动检测网页上的列表内容，可以自己选择要订阅哪个列表，然后就可以生成一个 RSS 链接。生成的 RSS 链接包括的信息有目标网址、要订阅的目标列表的节点信息和输出格式（RSS/ATOM）等，也就是说，rss-proxy 并不像 feed43 会把解析的规则存储在服务端，它是直接编码在 url 里面的！rss-proxy 开源支持自部署，不想用它提供的公用实例也可以自建，迁移零门槛。rss-proxy 也支持调用无头浏览器渲染异步获取数据的网页，可玩性很高。&lt;/p&gt;

&lt;p&gt;-&amp;gt;&amp;gt;&amp;gt;&amp;gt; &lt;a href=&#34;https://rssproxy-v1.migor.org/&#34;&gt;rss-proxy 公用实例&lt;/a&gt;，可以点击体验下，还是很方便的&lt;/p&gt;

&lt;p&gt;使用了一段时间体验挺不错，有个小问题就是对 UTF-8 以外的编码不太友好。&lt;/p&gt;

&lt;h2 id=&#34;0x05-解锁海外-rss-源&#34;&gt;0x05 解锁海外 RSS 源&lt;/h2&gt;

&lt;p&gt;由于众所周知的原因，我国的互联网是不「互联」的。rsshub.app 部署在国外，现已基本无法直接访问。国内服务器上自建的 RSSHub 订阅如 Facebook 等国外站点更是不可行。为此我使用了 Clash 代理，并添加了一些公开的机场订阅，虽然速度和稳定性不是很高，但对于 RSS 这种需求还是绰绰有余的。又完善了一些爬墙的规则，比如对 google、facebook，rsshub.app 走代理，内网地址和 CN 的 IP 直连，反爬严格的网站完全走随机节点。一番操作下来，基本可以实现全球 RSS 订阅自由了 😁&lt;/p&gt;

&lt;h2 id=&#34;0x06-rss-订阅破-cloudflare-五秒盾&#34;&gt;0x06 RSS 订阅破 CloudFlare 五秒盾&lt;/h2&gt;

&lt;p&gt;如上所述，海外 RSS 源走公用机场可以解决国内的网络问题。但是很多站点会使用 CloudFlare 做 CDN 和防火墙，我们使用的公用机场其实一大半都是被用作非法用途的，IP 很多都在人家的黑名单里面，但凡通过那个节点访问 CloudFlare 保护的网站都会触发五秒盾防御，浏览器访问倒是没什么，但是可苦了 RSS。&lt;/p&gt;

&lt;p&gt;google 了一番，没人写过我这个问题。。。人家都是爬虫绕过五秒盾，调包实现的破解。不过好在最终还是有了可行的解决方案：&lt;strong&gt;Clash 识别 CloudFlare 节点 IP 段，对于他家的节点，使用 Round-Robin 算法的 Load-Balance 策略走海内外随机节点，包括本机直连。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;上面一句话有三个技术要点：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;识别 CF 节点&lt;/strong&gt;：CF 的节点遍布全球，把 IP 列表加到 Clash 规则集里面肯定是不现实的。不过好在人家家大业大都是买的 IP 段，官网也给出了所有节点的 IP 段，也就十个左右。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Round-Robin&lt;/strong&gt;：一种常见的负载均衡算法，简单来说就是把所有节点组成一个圆环，每次访问选择一个环上的节点，之后沿环方向移动一个特定步长，作为下一个要使用的节点，每次访问所使用的节点都不一样。另一种常用的算法是 Consist-Hashing，一致性哈希，相同的 url 拥有相同的哈希值，根据哈希值来选择的节点是一样的，同一个 url 会使用同一个节点。对于上文提到的场景，要实现反反爬虫，那必须选择 Round-Robin 算法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;包括本机节点&lt;/strong&gt;：如上文所述，触发五秒盾的原因是那些公用机场的 IP 都不大干净，但是我用来部署 RSS 这些东西的自用的服务器没有这个问题，只有网络问题 😂。使用本机作为随机节点的兜底，即便特殊情况下所有的公共机场都是脏 IP，但是本机能直连东亚和美西的 CF 节点，还是可以保证 RSS 的可用性。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;可能的改进：匹配到 CF 节点，选择从本机连接东亚的连接较好的 CF 节点来请求目标站点的内容，可以一次解决那两个问题&lt;/p&gt;

&lt;p&gt;以上都被我整合进了我的 Github 项目 &lt;a href=&#34;https://github.com/Colin-XKL/RSSmanX&#34;&gt;RSSman X&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Colin-XKL/RSSmanX&#34;&gt;RSSman X&lt;/a&gt; 基于 docker-compsoe 提供容器化 TTRSS 与 RSSHUB 等组件的一键部署，整合实用组件为你带来最佳 RSS 体验&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature：简单一键部署，常用组件整合，自动更新支持，服务健康自检支持，海外站点 RSS 解锁&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&#34;https://blog-1301127393.file.myqcloud.com/BlogImgs20210512190819.png&#34; alt=&#34;image-20210512190732383&#34; /&gt;&lt;/p&gt;

&lt;p&gt;感兴趣的朋友可以关注一下 🍺&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>RSSManX - 一套 RSS 综合解决方案</title>
      <link>/posts/rssmanx/</link>
      <pubDate>Sat, 08 May 2021 00:00:00 +0000</pubDate>
      
      <guid>/posts/rssmanx/</guid>
      <description>
        
          
          
          
        
        
        

&lt;p&gt;&lt;img src=&#34;https://cdn.jsdelivr.net/gh/Colin-XKL/RSSmanX/.github/logo.png&#34; alt=&#34;logo&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://img.shields.io/github/license/Colin-XKL/RSSmanX&#34; alt=&#34;license&#34; /&gt;&lt;br /&gt;
&lt;img src=&#34;https://img.shields.io/github/v/release/Colin-XKL/RSSmanX&#34; alt=&#34;release&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/Colin-XKL/RSSmanX/blob/master/README-zh_cn.md&#34;&gt;中文说明&lt;/a&gt; ｜ &lt;a href=&#34;https://github.com/Colin-XKL/RSSmanX/&#34;&gt;English&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RSSman X is a project that composed several useful services to help you build an excellent RSS experience.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/Colin-XKL/RSSmanX&#34;&gt;RSSman X&lt;/a&gt; 基于 docker-compsoe 提供容器化 TTRSS 与 RSSHUB 等组件的一键部署，整合实用组件为你带来最佳 RSS 体验&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature：简单一键部署，常用组件支持，自动更新支持，服务健康自检支持，海外站点 RSS 解锁&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&#34;快速开始&#34;&gt;快速开始&lt;/h3&gt;

&lt;p&gt;(若已安装 &lt;code&gt;docker&lt;/code&gt; 和 &lt;code&gt;docker-compose&lt;/code&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;mkdir RSSmanX &amp;amp;&amp;amp; cd $_ &amp;amp;&amp;amp; wget https://cdn.jsdelivr.net/gh/Colin-XKL/RSSmanX/docker-compose.yml &amp;amp;&amp;amp; sudo docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;说明&#34;&gt;说明&lt;/h2&gt;

&lt;p&gt;本项目旨在为 RSS 的同好提供一个方便地搭建自己的 RSS 服务的捷径。毕竟不是所有 RSS 爱好者都懂代码 😂。如果你想快速地搭建自己的 RSS 服务，能够有 RSS 订阅管理、RSS 在线阅读界面，进阶功能包括服务健康自检、海外站点 RSS 解锁等。希望订阅国内外的各大网站的 RSS 信息源又不想跟着网上漫天飞的教程瞎折腾的话，那么你可以使用本仓库的脚本快速完成安装部署。&lt;/p&gt;

&lt;h3 id=&#34;不同版本中包含的组件说明&#34;&gt;不同版本中包含的组件说明&lt;/h3&gt;

&lt;p&gt;三个版本的&lt;code&gt;docker-compose&lt;/code&gt;文件对应不同的需求，包含的组件和服务有差异。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组件/服务/功能名称&lt;/th&gt;
&lt;th&gt;标准版&lt;/th&gt;
&lt;th&gt;Lite 版&lt;/th&gt;
&lt;th&gt;Ultimate 版 ✨&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TTRSS&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;RSSHub&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Huginn&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Mercury&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;OpenCC&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Browserless&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;数据持久化保存&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;容器自动更新&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;容器健康检查&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;海外站点加速&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;智能路由&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;不同组件的功能描述见文末。不同版本对应的配置文件如下：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;标准版&lt;/strong&gt;：&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lite 版&lt;/strong&gt;：&lt;code&gt;docker-compose-lite.yml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ultimate 版&lt;/strong&gt;：&lt;code&gt;docker-compose-ultimate.yml&lt;/code&gt;和&lt;code&gt;config.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;选择对应版本下载到本地后都 compose 文件需要重命名为标准的&lt;code&gt;docker-compose.yml&lt;/code&gt;才可使用&lt;/p&gt;

&lt;h2 id=&#34;安装说明&#34;&gt;安装说明&lt;/h2&gt;

&lt;h3 id=&#34;需求&#34;&gt;需求&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;一台 Linux 系统的服务器&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;本文以腾讯云 Ubuntu 18.04 系统的服务器为例，其他云服务商的没差，系统为 CentOS 的会有点差异&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&#34;依赖项&#34;&gt;依赖项&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;docker&lt;/li&gt;
&lt;li&gt;docker-compose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;安装 Docker&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;sudo apt-get update

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo
sudo add-apt-repository \
   &amp;quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable&amp;quot;
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;安装 docker-compose&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;sudo apt install docker-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;完整文档参见 📕&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.docker.com/engine/install/&#34;&gt;https://docs.docker.com/engine/install/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.docker.com/compose/install/&#34;&gt;https://docs.docker.com/compose/install/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;如何安装&#34;&gt;如何安装&lt;/h3&gt;

&lt;p&gt;安装好了 &lt;code&gt;docker&lt;/code&gt; 和 &lt;code&gt;docker-compose&lt;/code&gt; 后可以执行文章开头的快速开始的指令。或者可以按照下面的步骤手动操作：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;确定安装好了 &lt;code&gt;docker&lt;/code&gt; 和 &lt;code&gt;docker-compose&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;克隆本仓库/下载你所需要的版本的 compose 文件，注意修改文件名&lt;/li&gt;
&lt;li&gt;cd 进入文件夹，编辑&lt;code&gt;docker-compose&lt;/code&gt;文件，修改密码及 ttrss 的&lt;code&gt;SELF_URL&lt;/code&gt;处的值&lt;/li&gt;
&lt;li&gt;运行 &lt;code&gt;sudo docker-compose up -d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;等待程序跑完&lt;/li&gt;
&lt;li&gt;安装完成 ✅&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&#34;使用相关事宜&#34;&gt;使用相关事宜：&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;访问你设置的&lt;code&gt;SELF_URL&lt;/code&gt;即可看到 Tiny Tiny RSS 的登陆页面，使用默认账户&lt;code&gt;admin&lt;/code&gt;，密码&lt;code&gt;password&lt;/code&gt;登陆即可开始使用。&lt;/li&gt;
&lt;li&gt;如开启海外站点解锁支持，第一次冷启动需要等待 3-5 分钟才能完全启动所有组件。&lt;/li&gt;
&lt;li&gt;数据保存位置 ~/.dockerData/Database/&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;详细配置和使用事宜请参考对应应用的文档说明。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TTRSS 相关文档 &lt;a href=&#34;https://ttrss.henry.wang/&#34;&gt;https://ttrss.henry.wang/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;RSSHub 相关文档 &lt;a href=&#34;https://docs.rsshub.app/&#34;&gt;https://docs.rsshub.app/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;功能模块介绍&#34;&gt;功能模块介绍&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tiny Tiny RSS&lt;/strong&gt;
RSS 订阅管理与在线阅读工具&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RSShub&lt;/strong&gt;
生成国内大部分网站的 RSS 信息源，同时自部署可以访问到那些严格防爬的站点的源（知乎、微博等）&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Huginn&lt;/strong&gt;
高级 IFTTT 工具，你可以用生成任何 RSS 源，但使用门槛略高&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Postgres&lt;/strong&gt;
数据库，用于存储 RSS 文章数据等。比 MySQL 更轻，性能更好&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenCC&lt;/strong&gt;
简繁体转换，如果你订阅了一些繁体的 RSS 源，可以用它来将文章转为简体&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mercury&lt;/strong&gt;
用于获取 RSS 全文&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browserless&lt;/strong&gt;
用于获取常规方式无法获取的网站 RSS，为 RSSHub 的可选组件&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redis&lt;/strong&gt;
提供缓存，提升性能，为 RSSHub 的可选组件&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WatchTower&lt;/strong&gt;
用于自动更新 RSShub 等组件，可以更好地支持新添加的源以及更快的获得 bug 修复&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clash&lt;/strong&gt;
智能路由与正向代理工具，用于解锁海外站点及提供海外 RSS 源的加速&lt;/p&gt;

&lt;h2 id=&#34;acknowledgement&#34;&gt;Acknowledgement&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://tt-rss.org/&#34;&gt;Tiny tiny RSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/BYVoid/OpenCC&#34;&gt;OpenCC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/postlight/mercury-parser&#34;&gt;Mercury&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/huginn/huginn&#34;&gt;Huginn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DIYgod/RSSHub&#34;&gt;RSShub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/HenryQW/Awesome-TTRSS&#34;&gt;Awesome TTRSS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;license&#34;&gt;License&lt;/h2&gt;

&lt;p&gt;GPL-3.0&lt;/p&gt;

&lt;h2 id=&#34;changelogs&#34;&gt;Changelogs&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;2020-07-07 v1.0 First release&lt;/li&gt;
&lt;li&gt;2020-07-14 v1.1 Update quick start shell script&lt;/li&gt;
&lt;li&gt;2020-10-05 v1.2 Fix wrong environment variable.&lt;/li&gt;
&lt;li&gt;2020-11-08 v1.3 TTRSS now can update feeds with ports except &lt;sup&gt;80&lt;/sup&gt;&amp;frasl;&lt;sub&gt;443&lt;/sub&gt;, and our self-hosted rsshub works again.&lt;/li&gt;
&lt;li&gt;2020-11-13 v1.4 Several updates includes security and performance enhancements.&lt;/li&gt;
&lt;li&gt;2020-11-24 v1.5 Lock the docker image version of some services to avoid unexpected errors.&lt;/li&gt;
&lt;li&gt;2021-05-08 v2.0 Add container network isolation, health check, global proxy, smart routing etc.&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
  </channel>
</rss>