<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>指南 on Colinx Blog</title><link>/categories/%E6%8C%87%E5%8D%97/</link><description>Recent content in 指南 on Colinx Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 04 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="/categories/%E6%8C%87%E5%8D%97/index.xml" rel="self" type="application/rss+xml"/><item><title>OpenClaw 虽好，搭配沙箱才安心 - 使用 Lume 构建 mac 虚拟环境</title><link>/posts/openclaw%E8%99%BD%E5%A5%BD-%E6%90%AD%E9%85%8D%E6%B2%99%E7%AE%B1%E6%89%8D%E5%AE%89%E5%BF%83-%E4%BD%BF%E7%94%A8lume%E6%9E%84%E5%BB%BAmac%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83/</link><pubDate>Wed, 04 Feb 2026 00:00:00 +0000</pubDate><guid>/posts/openclaw%E8%99%BD%E5%A5%BD-%E6%90%AD%E9%85%8D%E6%B2%99%E7%AE%B1%E6%89%8D%E5%AE%89%E5%BF%83-%E4%BD%BF%E7%94%A8lume%E6%9E%84%E5%BB%BAmac%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83/</guid><description>
&lt;p>&lt;img src="https://openclaw.ai/og-image.png" alt="open-claw-img|700x368">&lt;/p>
&lt;p>近日 OpenClaw(原 Clawdbot, 曾用名 Moltbot) 爆火，独立自主操控电脑完成各种任务，一个挺 fancy 的 agent 应用。结合 moltbook 网站的新闻，在各种媒体的鼓吹下故事画风变得愈发科幻，巴不得明天就统治全人类。&lt;/p>
&lt;p>爆火没两天，就爆出不少安全新闻，要么是 agent 自作主张直接电脑删空，要么是大量小白用户把实例暴露在公网，别有用心的人可以直接通过 openclaw 的黑洞控制整个电脑。OpenClaw 这种应用最吸引人、最方便的地方在于 ta 可以成为「代理」, 去执行任何「你可以做」的事。你能做，ta 就能做。不过前提便是宽松的权限管理，超级多的权限。&lt;/p>
&lt;p>下面介绍一个 基于 lume 的 Mac OS 虚拟机方案，将其作为沙箱环境节点供 openclaw 调用。&lt;/p>
&lt;h2 id="openclaw-gateway-安装">
OpenClaw Gateway 安装
&lt;a href="#openclaw-gateway-%e5%ae%89%e8%a3%85" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>由于 gateway 节点负责与各个 channel 即 bot 通信，最好有公网 ip, 这里我在 linux 云服务器上进行部署。&lt;/p>
&lt;p>官方默认给的安装命令很简单，&lt;code>npm install -g openclaw&lt;/code> 就可以了。但是为了安全起见我还是偏好使用 docker 容器。官方对 docker 容器的支持并不是很好，文档也有点混乱，实际测下来从代码库自行构建镜像比较好&lt;/p>
&lt;p>首先是克隆仓库。注意默认的 main 分支可能不是很稳定，最好切换到某个 tag 或者 github actions 全部通过的 commit 再构建。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">&lt;span style="color:#75715e"># 示例: 切换到指定tag&lt;/span>
git pull --rebase
git fetch --tags
git checkout v2026.1.29
&lt;/code>&lt;/pre>&lt;/div>&lt;p>之后准备构建。很多教程包括官方文档是让用户直接在克隆后的 git 仓库里，修改 compose 和 env 文件。但是这样的话后续不方便更新，因为工作区有修改，每次都要 stash 再 pull 还要解决冲突的问题，太麻烦了。建议的方式是在代码库上级目录创建 compose 和 env, 这样下次要更新的话，直接到 repo 里面 git pull 再重新构建镜像就可以了。&lt;/p>
&lt;p>目录结构如下：&lt;/p>
&lt;pre tabindex="0">&lt;code>.
├── .env
├── docker-compose.yml
└── **openclaw-repo**
&lt;/code>&lt;/pre>&lt;p>compose 文件设置好构建的目录即可。示例如下&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="color:#f92672">services&lt;/span>:
  &lt;span style="color:#f92672">openclaw-gateway&lt;/span>:
    &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">${OPENCLAW_IMAGE:-openclaw:local}&lt;/span>
    &lt;span style="color:#f92672">container_name&lt;/span>: &lt;span style="color:#ae81ff">openclaw-gateway&lt;/span>
    &lt;span style="color:#f92672">build&lt;/span>: &lt;span style="color:#ae81ff">./openclaw-repo&lt;/span>
    &lt;span style="color:#f92672">environment&lt;/span>:
      &lt;span style="color:#ae81ff">xxx:xxx&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>准备好目录和 docker compose 之后，即可开始构建&lt;/p>
&lt;p>完整 docker compose&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="color:#f92672">services&lt;/span>:
  &lt;span style="color:#f92672">openclaw-gateway&lt;/span>:
    &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">${OPENCLAW_IMAGE:-openclaw:local}&lt;/span>
    &lt;span style="color:#f92672">container_name&lt;/span>: &lt;span style="color:#ae81ff">openclaw-gateway&lt;/span>
    &lt;span style="color:#f92672">build&lt;/span>: &lt;span style="color:#ae81ff">./openclaw-repo&lt;/span>
    &lt;span style="color:#f92672">environment&lt;/span>:
      &lt;span style="color:#f92672">HOME&lt;/span>: &lt;span style="color:#ae81ff">/home/node&lt;/span>
      &lt;span style="color:#f92672">TERM&lt;/span>: &lt;span style="color:#ae81ff">xterm-256color&lt;/span>
      &lt;span style="color:#f92672">OPENCLAW_GATEWAY_BIND&lt;/span>: &lt;span style="color:#ae81ff">${OPENCLAW_GATEWAY_BIND}&lt;/span>
      &lt;span style="color:#f92672">OPENCLAW_GATEWAY_PORT&lt;/span>: &lt;span style="color:#ae81ff">${OPENCLAW_GATEWAY_PORT}&lt;/span>
      &lt;span style="color:#f92672">XDG_CONFIG_HOME&lt;/span>: &lt;span style="color:#ae81ff">${XDG_CONFIG_HOME}&lt;/span>
      &lt;span style="color:#f92672">PATH&lt;/span>: &lt;span style="color:#ae81ff">/home/linuxbrew/.linuxbrew/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&lt;/span>
    &lt;span style="color:#f92672">volumes&lt;/span>:
      - &lt;span style="color:#ae81ff">${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw&lt;/span>
      - &lt;span style="color:#ae81ff">${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace&lt;/span>
    &lt;span style="color:#f92672">ports&lt;/span>:
      - &lt;span style="color:#e6db74">&amp;#34;${OPENCLAW_GATEWAY_PORT}:${OPENCLAW_GATEWAY_PORT}&amp;#34;&lt;/span>
      &lt;span style="color:#75715e"># - &amp;#34;${OPENCLAW_BRIDGE_PORT:-18790}:18790&amp;#34;&lt;/span>
    &lt;span style="color:#f92672">init&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
    &lt;span style="color:#f92672">restart&lt;/span>: &lt;span style="color:#ae81ff">unless-stopped&lt;/span>
    &lt;span style="color:#f92672">command&lt;/span>:
      [
        &lt;span style="color:#e6db74">&amp;#34;node&amp;#34;&lt;/span>,
        &lt;span style="color:#e6db74">&amp;#34;dist/index.mjs&amp;#34;&lt;/span>,
        &lt;span style="color:#e6db74">&amp;#34;gateway&amp;#34;&lt;/span>,
        &lt;span style="color:#e6db74">&amp;#34;--bind&amp;#34;&lt;/span>,
        &lt;span style="color:#e6db74">&amp;#34;${OPENCLAW_GATEWAY_BIND:-lan}&amp;#34;&lt;/span>,
        &lt;span style="color:#e6db74">&amp;#34;--port&amp;#34;&lt;/span>,
        &lt;span style="color:#e6db74">&amp;#34;${OPENCLAW_GATEWAY_PORT}&amp;#34;&lt;/span>,
      ]
     
  &lt;span style="color:#f92672">openclaw-cli&lt;/span>:
    &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">${OPENCLAW_IMAGE:-openclaw:local}&lt;/span>
    &lt;span style="color:#f92672">environment&lt;/span>:
      &lt;span style="color:#f92672">HOME&lt;/span>: &lt;span style="color:#ae81ff">/home/node&lt;/span>
      &lt;span style="color:#f92672">TERM&lt;/span>: &lt;span style="color:#ae81ff">xterm-256color&lt;/span>
      &lt;span style="color:#f92672">BROWSER&lt;/span>: &lt;span style="color:#ae81ff">echo&lt;/span>
      &lt;span style="color:#f92672">OPENCLAW_GATEWAY_BIND&lt;/span>: &lt;span style="color:#ae81ff">${OPENCLAW_GATEWAY_BIND}&lt;/span>
      &lt;span style="color:#f92672">OPENCLAW_GATEWAY_PORT&lt;/span>: &lt;span style="color:#ae81ff">${OPENCLAW_GATEWAY_PORT}&lt;/span>
      &lt;span style="color:#f92672">XDG_CONFIG_HOME&lt;/span>: &lt;span style="color:#ae81ff">${XDG_CONFIG_HOME}&lt;/span>
      &lt;span style="color:#f92672">PATH&lt;/span>: &lt;span style="color:#ae81ff">/home/linuxbrew/.linuxbrew/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&lt;/span>
    &lt;span style="color:#f92672">volumes&lt;/span>:
      - &lt;span style="color:#ae81ff">${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw&lt;/span>
      - &lt;span style="color:#ae81ff">${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace&lt;/span>
    &lt;span style="color:#f92672">stdin_open&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
    &lt;span style="color:#f92672">tty&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
    &lt;span style="color:#f92672">init&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
    &lt;span style="color:#f92672">entrypoint&lt;/span>: [&lt;span style="color:#e6db74">&amp;#34;node&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;dist/index.mjs&amp;#34;&lt;/span>]
    &lt;span style="color:#f92672">restart&lt;/span>: &lt;span style="color:#ae81ff">none&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>env 示例&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-ini" data-lang="ini">&lt;span style="color:#a6e22e">OPENCLAW_IMAGE&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">openclaw:latest&lt;/span>
&lt;span style="color:#a6e22e">OPENCLAW_GATEWAY_TOKEN&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">change-me&lt;/span>
&lt;span style="color:#a6e22e">OPENCLAW_GATEWAY_BIND&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">lan&lt;/span>
&lt;span style="color:#a6e22e">OPENCLAW_GATEWAY_PORT&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">8089&lt;/span>
&lt;span style="color:#a6e22e">OPENCLAW_CONFIG_DIR&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">/data/openclaw&lt;/span>
&lt;span style="color:#a6e22e">OPENCLAW_WORKSPACE_DIR&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">/data/openclaw/workspace&lt;/span>
&lt;span style="color:#a6e22e">XDG_CONFIG_HOME&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">/home/node/.openclaw&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">
&lt;span style="color:#75715e"># 镜像中的应用默认以uid 1000账户运行, 手动设置data数据目录的权限避免出现预期外的问题&lt;/span>
sudo chown -R 1000:1000 /data/openclaw
&lt;span style="color:#75715e"># 构建镜像&lt;/span>
sudo docker compose build
&lt;span style="color:#75715e"># 第一次使用, 初始化相关配置&lt;/span>
docker compose run --rm openclaw-cli onboard
&lt;span style="color:#75715e"># 之后启动gateway&lt;/span>
docker compose up -d openclaw-gateway
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果使用 tg channel ,创建完 bot 后需要配对才可以使用。&lt;/p>
&lt;pre tabindex="0">&lt;code>docker compose run --rm openclaw-cli pairing approve telegram &amp;lt;code&amp;gt;
&lt;/code>&lt;/pre>&lt;p>日常配置可以直接使用这个 cli 镜像后面加上需要的参数。或者直接到 Gateway 镜像中执行 &lt;code>node dist/index.mjs xxx&lt;/code> 代替 官方文档里 &lt;code>openclaw xxx&lt;/code> . (官方 Dockerfile 里面对 cli 工具名字的处理有问题，先曲线救国)&lt;/p>
&lt;pre tabindex="0">&lt;code>docker compose run --rm openclaw-cli xxx
&lt;/code>&lt;/pre>&lt;h2 id="macos-vm-via-lume">
MacOS VM via Lume
&lt;a href="#macos-vm-via-lume" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>接下来配置 mac os 的虚拟机。使用 lume 工具&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">brew install lume
brew services start lume
&lt;/code>&lt;/pre>&lt;/div>&lt;p>之后可以快捷安装 macos vm. 一般情况下，默认安装当前系统大版本下最新的小版本。你可以通过以下方式查询&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">&lt;span style="color:#75715e"># 查询`latest`参数对应默认的系统镜像和版本, 可以看到显示的url指向的系统版本为15.6.1&lt;/span>
~ » lume ipsw                                                                         
&lt;span style="color:#f92672">[&lt;/span>2026-01-31T12:23:12Z&lt;span style="color:#f92672">]&lt;/span> INFO: Fetching latest supported IPSW URL
&lt;span style="color:#f92672">[&lt;/span>2026-01-31T12:23:13Z&lt;span style="color:#f92672">]&lt;/span> INFO: Found latest IPSW URL url&lt;span style="color:#f92672">=&lt;/span>https://updates.cdn-apple.com/2025SummerFCS/fullrestores/093-10809/CFD6DD38-DAF0-40DA-854F-31AAD1294C6F/UniversalMac_15.6.1_24G90_Restore.ipsw
https://updates.cdn-apple.com/2025SummerFCS/fullrestores/093-10809/CFD6DD38-DAF0-40DA-854F-31AAD1294C6F/UniversalMac_15.6.1_24G90_Restore.ipsw
&lt;span style="color:#75715e"># 查询当前系统版本为15.2&lt;/span>
~ » sw_vers                                                                           
ProductName: macOS
ProductVersion: 15.2
BuildVersion: 24C101
&lt;/code>&lt;/pre>&lt;/div>&lt;p>也可以从这里获取指定版本的系统镜像下载地址，手动下载。https://ipsw.me/. 一般 mac os 的镜像大小在 15-20GB&lt;/p>
&lt;p>创建 vm&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">&lt;span style="color:#75715e"># 默认安装最新的版本&lt;/span>
lume create openclaw --os macos --ipsw latest
&lt;span style="color:#75715e"># 如果失败报错&amp;#34;Installation requires a software update.&amp;#34; 可以下载不高于当前系统运行的版本手动创建&lt;/span>
lume create openclaw --os macos --cpu &lt;span style="color:#ae81ff">2&lt;/span> --memory 8GB --disk-size 100GB --ipsw ./&amp;lt;YOUR-DOWNLOAD-IPSW-FILE&amp;gt;
&lt;span style="color:#75715e"># 启动vm&lt;/span>
lume run openclaw
&lt;/code>&lt;/pre>&lt;/div>&lt;p>之后会输出一个 vnc 地址，可以用 mac 自带的「屏幕共享」app 进行查看。菜单「连接」- 「新建」
&lt;img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20260205000147405.png" alt="">&lt;/p>
&lt;p>完成系统安装的几个必要步骤，然后到设置里把远程控制打开，后面 SSH 要用到。系统更新建议关掉。&lt;/p>
&lt;p>![[image-23.png]]&lt;/p>
&lt;p>![[image-24.png]]&lt;/p>
&lt;p>在 mac vm 上安装 openclaw&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">&lt;span style="color:#75715e"># 基础环境配置&lt;/span>
&lt;span style="color:#75715e">## brew 安装 (加速版本, 使用中科大镜像源)&lt;/span>
export HOMEBREW_BREW_GIT_REMOTE&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;https://mirrors.ustc.edu.cn/brew.git&amp;#34;&lt;/span>
export HOMEBREW_CORE_GIT_REMOTE&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;https://mirrors.ustc.edu.cn/homebrew-core.git&amp;#34;&lt;/span>
export HOMEBREW_BOTTLE_DOMAIN&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;https://mirrors.ustc.edu.cn/homebrew-bottles&amp;#34;&lt;/span>
export HOMEBREW_API_DOMAIN&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;https://mirrors.ustc.edu.cn/homebrew-bottles/api&amp;#34;&lt;/span>
/bin/bash -c &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>curl -fsSL https://mirrors.ustc.edu.cn/misc/brew-install.sh&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;span style="color:#75715e">## brew 镜像配置&lt;/span>
echo &lt;span style="color:#e6db74">&amp;#39;export HOMEBREW_BOTTLE_DOMAIN=&amp;#34;https://mirrors.ustc.edu.cn/homebrew-bottles&amp;#34;&amp;#39;&lt;/span> &amp;gt;&amp;gt; ~/.zshrc
echo &lt;span style="color:#e6db74">&amp;#39;export HOMEBREW_API_DOMAIN=&amp;#34;https://mirrors.ustc.edu.cn/homebrew-bottles/api&amp;#34;&amp;#39;&lt;/span> &amp;gt;&amp;gt; ~/.zshrc
echo &lt;span style="color:#e6db74">&amp;#39;export HOMEBREW_CORE_GIT_REMOTE=&amp;#34;https://mirrors.ustc.edu.cn/homebrew-core.git&amp;#34;&amp;#39;&lt;/span> &amp;gt;&amp;gt; ~/.zshrc
echo &lt;span style="color:#e6db74">&amp;#39;export HOMEBREW_BREW_GIT_REMOTE=&amp;#34;https://mirrors.ustc.edu.cn/brew.git&amp;#34;&amp;#39;&lt;/span> &amp;gt;&amp;gt; ~/.zshrc
source ~/.zshrc
&lt;span style="color:#75715e">## 安装基础环境&lt;/span>
brew install node
brew install pnpm
pnpm setup
source ~/.zshrc
echo &lt;span style="color:#e6db74">&amp;#34;registry=https://npmreg.proxy.ustclug.org/&amp;#34;&lt;/span> &amp;gt;&amp;gt; ~/.npmrc
pnpm install -g openclaw@latest
openclaw onboard --install-daemon
&lt;/code>&lt;/pre>&lt;/div>&lt;p>client 端配置好 gateway 地址和 token .第一次连接显示需要配对。在服务端执行&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">
openclaw devices list
openclaw devices apprve &amp;lt;复制的request id&amp;gt;
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20260205000019565.png" alt="image-25">&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">&lt;span style="color:#75715e"># 作为node注册&lt;/span>
openclaw node install --host &amp;lt;gateway-host&amp;gt; --port &lt;span style="color:#ae81ff">18789&lt;/span> --display-name &lt;span style="color:#e6db74">&amp;#34;Mac mini&amp;#34;&lt;/span>
&lt;span style="color:#75715e"># 然后在服务端approve&lt;/span>
&lt;span style="color:#75715e"># 查看状态&lt;/span>
openclaw node status
&lt;span style="color:#75715e"># 启动节点&lt;/span>
openclaw node start
&lt;/code>&lt;/pre>&lt;/div>&lt;p>之后就可以让 openclaw 调用这个节点啦&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/20260204235959805.png" alt="">&lt;/p>
&lt;p>THE END&lt;/p></description></item><item><title>Search-as-a-RSS! 把任何搜索查询转换为 RSS! FeedCraft 新功能速递</title><link>/posts/search-as-a-rss-%E6%8A%8A%E4%BB%BB%E4%BD%95%E6%90%9C%E7%B4%A2%E6%9F%A5%E8%AF%A2%E8%BD%AC%E6%8D%A2%E4%B8%BArss-feedcraft-%E6%96%B0%E5%8A%9F%E8%83%BD%E9%80%9F%E9%80%92/</link><pubDate>Mon, 22 Dec 2025 00:00:00 +0000</pubDate><guid>/posts/search-as-a-rss-%E6%8A%8A%E4%BB%BB%E4%BD%95%E6%90%9C%E7%B4%A2%E6%9F%A5%E8%AF%A2%E8%BD%AC%E6%8D%A2%E4%B8%BArss-feedcraft-%E6%96%B0%E5%8A%9F%E8%83%BD%E9%80%9F%E9%80%92/</guid><description>
&lt;h2 id="前言">
前言
&lt;a href="#%e5%89%8d%e8%a8%80" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>作为 RSS 5 年忠实用户，我非常享受 RSS 主动管理信息源给我带来的掌控感。但是传统 RSS 订阅方式只能基于站点或者频道，更多时候我其实是想关注某一个特定领域信息，比如 AI 领域世界模型有什么新的新闻，或者是想订阅一个特定的信息，比如我关注的 xxx 歌手有没有新的巡演规划。&lt;/p>
&lt;p>这些需求通过传统 RSS 方式难以实现，你只能定向的订阅某个新闻站点，然后过滤一下关键词。使用方式局限性很大。其实最理想的方式是直接把搜索引擎的结果拿来作为信息源。问题主要是噪声太多：&lt;/p>
&lt;ul>
&lt;li>搜索查询一般是按照关键词来的，不够灵活&lt;/li>
&lt;li>垃圾内容农场泛滥&lt;/li>
&lt;li>高质量的信息很多时候是多种语言的网页，直接阅读会很困难&lt;/li>
&lt;/ul>
&lt;p>好在我们有了 AI, 很多问题有了新的解决方法。在 FeedCraft 新版本中，我新增了一个 Search-as-a-RSS 的功能，用户只需要使用自然语言指定好要搜索什么，接下来就可以自动根据搜索结果生成一个 RSS 了。&lt;/p>
&lt;p>接下来简要介绍一下流程：&lt;/p>
&lt;h2 id="feedcraft-如何通过搜索结果创建-rss">
FeedCraft 如何通过搜索结果创建 RSS
&lt;a href="#feedcraft-%e5%a6%82%e4%bd%95%e9%80%9a%e8%bf%87%e6%90%9c%e7%b4%a2%e7%bb%93%e6%9e%9c%e5%88%9b%e5%bb%ba-rss" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>FeedCraft 本身是一个一站式处理 RSS 的工具，这里的搜索需要依赖第三方服务。首发支持的搜索服务是 LiteLLM Proxy(一个 AI 服务的代理转发平台，开源可自部署，可以方便对接各种第三方搜索服务比如 Exa, Tavily, Plexirity, Perplexity, Brave 等等)&lt;/p>
&lt;p>以 Tavily 为例，这个平台提供了每月 1000credits 的额度，可以执行上百次搜索，轻度使用绰绰有余了。前往官网注册个账号，生成一个 api key 即可。&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://www.tavily.com/">Tavily&lt;/a> 是一个专为人工智能代理（AI Agents）设计的搜索引擎，旨在优化 AI 在执行任务时的信息检索过程。它不同于传统的面向人类用户的搜索引擎（如 Google 或 Bing），而是专门为 AI 系统“理解”和“查找”所需信息而构建，强调高效、准确和上下文相关的搜索结果。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/202512220059928.png" alt="image-14">&lt;/p>
&lt;p>接下来到 LiteLLM 的后台，Tool - Search Tool 里面增加一个 search tool. 这里 search tool name 可以自定义，先记下来待会在 feed craft 的设置页面需要填入。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/202512220059929.png" alt="image-15">
在 LiteLLM 后台生成一个 API KEY, Key Name 可以随便写主要是备注。这个生成的 api key 可以用于请求 LLM, 也可以调用刚才配置的搜索工具。确认生成后，复制 api key.&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/202512220059930.png" alt="image-16">&lt;/p>
&lt;p>在 FeedCraft 后台，设置里面配置搜索服务，这里 API URL 是你的 LiteLLM 服务加上&lt;code>/search&lt;/code> 后缀。
例如你的 LiteLLM 服务部署在 &lt;code>https://my-litellm.example.com&lt;/code>, 那么这里就填写 &lt;code>https://my-litellm.example.com/search&lt;/code> . 工具填写刚才在 LiteLLM 后台接入 Tavily 的时候填写的 search tool name&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/202512220059931.png" alt="image-17">&lt;/p>
&lt;p>之后在「搜索转 RSS」页面，输入你想查询的东西即可。你可以直接用自然语言描述，比如「SpaceX 的最新新闻」. 之后点击下一步即可预览搜索结果。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/202512220059932.png" alt="image-18">&lt;/p>
&lt;p>你可以按需调整搜索语句。确认没问题一直下一步，可以保存为自定义的配方 (Custom Recipe) , 就可以生成一个唯一的 RSS 链接，在你喜欢的任意 RSS 阅读器里面查看啦&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/202512220059934.png" alt="image-19">&lt;/p>
&lt;p>更进一步，你可以使用 FeedCraft 的各种 Craft 来做进一步的处理。比如获取全文，添加总结、翻译文章、以及调用 AI 使用自然语言对文章进行筛选等等&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.cos.ap-shanghai.myqcloud.com/BlogImgs/202512220059935.png" alt="image-21">&lt;/p>
&lt;p>总体功能就是这样啦，欢迎试用 FeedCraft 和 Star 🌟! Have fun!&lt;/p>
&lt;p>&lt;a href="https://github.com/Colin-XKL/FeedCraft">https://github.com/Colin-XKL/FeedCraft&lt;/a>&lt;/p></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>Plex 是一款非常好用的影音库，可自托管，支持 Web, 颜值在线。近期在部署 Plex 的时候死活找不到安装初始化的页面，看了几遍安装文档和官网的流程，都没找到问题在哪。后来 Google 了一圈，才意识到自己这次不是局域网环境部署，Plex 为了安全性考虑，每个新实例的安装部署页面是只对局域网访问的 IP 开放的，甚至不是全部局域网 IP, 只有本机 (Localhost). 这里简单记录下排查和解决的流程，其他朋友在这块可以少踩些坑。&lt;/p>
&lt;p>问题页面如图所示，正常来说新 Plex 服务器是要设定电影资料库，电视节目资料库的文件夹位置，绑定 Plex 账号等。官方文档和其他人的流程都大致如此。但是我访问这个新 Plex 实例对应的初始化 URL, 进来怎么也找不到配置文件夹位置的入口。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254779.png" alt="Pasted image 20221216213737">
后来在这两个地方的资料才发现一些端倪，人家一般都是在 NAS 本机安装，然后访问本机地址进入初始化页面，但是我这个就不是。&lt;/p>
&lt;p>&lt;a href="https://askubuntu.com/questions/1321062/plex-installation-doesnt-give-option-to-setup-server">https://askubuntu.com/questions/1321062/plex-installation-doesnt-give-option-to-setup-server&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://www.linode.com/docs/guides/install-plex-media-server-on-ubuntu-18-04/#configuring-plex-media-server-on-ubuntu-1804">https://www.linode.com/docs/guides/install-plex-media-server-on-ubuntu-18-04/#configuring-plex-media-server-on-ubuntu-1804&lt;/a>&lt;/p>
&lt;p>知道了问题所在，解决方案还是比较简单的，那就是 SSH 连接使用端口转发，将目标服务器 Plex 网页服务的端口，映射到本机的一个端口。这样访问本机的这个端口，就能访问到 Plex 服务了，而对于 Plex 服务器的 Web 端来说，我们就是访问的本机地址。&lt;/p>
&lt;p>访问 http://localhost:8888/web/ 即可看到 Plex 的页面。如果没有带上后面的&lt;code>web&lt;/code> 后缀的话，直接访问可能会显示一个 XML 页面。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">ssh user@192.0.2.1 -L 8888:localhost:32400
&lt;/code>&lt;/pre>&lt;/div>&lt;p>上面这句话就是 ssh 连接到 192.0.2.1 这个远端，然后在本地，即 ssh 客户端的机器，监听 8888 端口，本地所有访问 8888 端口的请求都会被重定向，等同为远端机器访问自身的 32400 端口，即为上文提到的，部署 plex 服务的端口&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254781.png" alt="Pasted image 20221216213514">
如下是正常的初始化页面：
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254782.png" alt="Pasted image 20221216214020">
有些情况下可能会遇到需要额外执行关联操作的情况，不过问题不大&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254783.png" alt="Pasted image 20221216214456">
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254784.png" alt="Pasted image 20221216214521">&lt;/p>
&lt;p>配置成功后就可以正常享受影音资源啦 😎&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202312312254785.png" alt="Pasted image 20231231225353">&lt;/p></description></item><item><title>浅谈如何获得满血版互联网体验</title><link>/posts/%E6%B5%85%E8%B0%88%E5%A6%82%E4%BD%95%E8%8E%B7%E5%BE%97%E6%BB%A1%E8%A1%80%E7%89%88%E4%BA%92%E8%81%94%E7%BD%91%E4%BD%93%E9%AA%8C/</link><pubDate>Sat, 30 Dec 2023 00:00:00 +0000</pubDate><guid>/posts/%E6%B5%85%E8%B0%88%E5%A6%82%E4%BD%95%E8%8E%B7%E5%BE%97%E6%BB%A1%E8%A1%80%E7%89%88%E4%BA%92%E8%81%94%E7%BD%91%E4%BD%93%E9%AA%8C/</guid><description>
&lt;p>众所周知，国情所限，大家基本都是局域网玩家。在 AI 爆火的 2023, 我们甚至输在了起跑线上……GPT 不对大陆地区开放，普通银联卡无法注册，甚至有代理都不一定行。受够了二等公民的气，这篇文章来结合我自身的经历和经验探讨一下，身为互联网二等公民，我们缺失了什么，身在墙内如何通过一些手段，获得满血版互联网体验 🕶️&lt;/p>
&lt;p>&lt;strong>TLDR - 你需要解锁以下技能 (按照难度和依赖排序):&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>解锁基础版盾构机，能访问 Google 等站点&lt;/li>
&lt;li>解锁进阶版盾构机，海外 VPS, 可以玩一些进阶的操作，比如 Google Gemini 的话普通 HK 的 🐔 都是不行的，如果你有新加坡的 VPS，就可以转发一下解锁 Gemini&lt;/li>
&lt;li>解锁海外平台的账号，常用的有 Gmail, 美区 App Store, X(原 Twitter) 等&lt;/li>
&lt;li>解锁基础版海外支付，国内银行的支持外币支付有 Visa/MasterCard 标的，可以美区 App Store 付款购买 App 等&lt;/li>
&lt;li>解锁进阶版海外支付，无外汇限制，可以自由出入金，外币交易无障碍&lt;/li>
&lt;li>解锁可长久持有的海外手机号，很多平台都会通过手机号来决定你可以使用哪个地区的服务，重要性毋庸置疑。可长期持有是个重难点，不过在解锁上面的能力之后这一步稍微花点心思都能达到&lt;/li>
&lt;/ul>
&lt;h2 id="level-0-局域网和互联网差一个-google">
Level 0: 局域网和互联网差一个 Google
&lt;a href="#level-0-%e5%b1%80%e5%9f%9f%e7%bd%91%e5%92%8c%e4%ba%92%e8%81%94%e7%bd%91%e5%b7%ae%e4%b8%80%e4%b8%aa-google" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>🌍 &lt;strong>新手村 BOSS: Google&lt;/strong>
GFW List 成百上千，但是最具代表性的就是 Google. Google 在国外影响力之大，导致你可以在很多平台上看到，外国友人听说大陆地区不能用 Google 都表示无法理喻。不过解锁了 Google 你也就基本解锁其他 GFW List 里所有的项目&lt;/p>
&lt;p>&lt;strong>基础版：&lt;/strong>
通过各个奇怪的网站和搜索内容触发&lt;code>VPN&lt;/code> 或&lt;code>海外加速&lt;/code>或&lt;code>外贸电商助手&lt;/code> 等关键词，或者身边有朋友在用相关工具的找人家要一个安装包，然后先随便找一个试用，速度和可用性先不用关注，解锁 Google 后，你就可以自由的所有其他的产品，你可以挑选速度快，节点多，服务好，质量高，价格实惠的其他产品了。这里主要是有个鸡生蛋蛋生鸡的问题，只有通过某个突破点先能访问 Google 才能自由搜索其他的产品&lt;/p>
&lt;p>&lt;strong>进阶版：&lt;/strong>
购置一个海外的服务器，然后自行部署安装相关配套工具。这里服务商可以自行选择，国内厂商的可以作为跳板，但是不适宜长期使用。海外的搬瓦工，Vultr 等服务商都比较著名，不过价格偏贵，这些后期都可以慢慢比较选择。&lt;/p>
&lt;p>部署的话，2023 年 Clash 已经删库跑路，这里推荐 &lt;strong>singbox&lt;/strong>, 支持的协议众多，性能也不错，还有官方的 android, ios 客户端 (免费，划重点，隔壁小火箭虽然好用，风评也挺不错，但是需要付费，淘宝虽然很多卖的不过这里自行斟酌)&lt;/p>
&lt;p>如果家里，实验室等长期固定位置使用的话，建议通过旁路由方式接入，更为方便便捷。很多代理软件都支持 TUN 模式模拟出一个网关，只需要把局域网中设备的网关地址修改指向它即可，非常方便快捷。还可以通过修改 DHCP 设定，所有设备默认连接到该网关，无缝接管网络流量，解锁海外网站。&lt;/p>
&lt;h2 id="level-1-平台为王你需要账号作为敲门砖">
Level 1: 平台为王，你需要账号作为敲门砖
&lt;a href="#level-1-%e5%b9%b3%e5%8f%b0%e4%b8%ba%e7%8e%8b%e4%bd%a0%e9%9c%80%e8%a6%81%e8%b4%a6%e5%8f%b7%e4%bd%9c%e4%b8%ba%e6%95%b2%e9%97%a8%e7%a0%96" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>📒 众所周知，各个&lt;del>国家都有各个国家的国歌&lt;/del> (bushi) 平台都有各个平台的账号，很多小的产品和服务会选择通过依附于某些大平台的账号，减少开发适配成本，降低用户使用门槛等等。一些外网冲浪必备的平台账户：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Gmail 账号&lt;/strong>: 这个不仅仅是 Google 账号，邮箱也是必备品。很多海外的产品都是不认国内的邮箱的，有个 Gmail 账号会方便很多。不过近些年注册难度提高了，可能需要找些攻略突破一下&lt;/li>
&lt;li>&lt;strong>美区 App Store 账号，&lt;/strong> &lt;strong>美区 Google Play 账号&lt;/strong>: 很多 App 都是不在国区上架的，想用就必须到美区才能下载到。大多数时候这里注册需要生成虚拟海外地址，以及接码平台做一个临时的验证，不过总体难度不大。&lt;/li>
&lt;li>X(原 Twitter) 账号，Facebook 账号，Instagram 账号，Telegram 账号等：一些流行的社交平台，外网冲浪必备。这里按需去找攻略注册即可。不过要注意尽量不要在一些敏感问题上发言，不然容易被查水表。THE BIG BROTHER IS WATCHING YOU!&lt;/li>
&lt;/ul>
&lt;h2 id="level-2-shut-up-and-take-my-money">
Level 2: Shut up and take my money
&lt;a href="#level-2-shut-up-and-take-my-money" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>💰 海淘，买游戏，买 App, 这些都需要你有外币的卡可以进行这些交易&lt;/p>
&lt;p>这里一般去找个银行开一张支持 Visa/MasterCard 的外币卡即可，借机卡或者信用卡都行，这里简单谈一下可选项以及个人办卡的一些经验。&lt;/p>
&lt;ul>
&lt;li>中国银行的汇率应该是比较优惠的一个了，可以去办一个他家的 Visa/MasterCard 借记卡或者信用卡。App 里提供信用卡的申请，过了的直接邮寄到家。如果非常担心盗用盗刷或者单纯不想用信用卡的话，可以去申请借记卡。不过这个得去线下申请，而且一般级别比较低的网店也搞不了需要去分行。即便如此也最好提前打电话问一下可不可以办，以及有哪些种类和卡面。避免白跑一趟&lt;/li>
&lt;li>无论办哪家的，办信用卡还是借记卡，&lt;strong>要确认清楚收不收年费，年费多少&lt;/strong>. 很多活动推销说的免年费都只是首年免年费，或是消费达到多少笔，达到多少金额然后给你免下一年的年费。这里我们办的境外卡可能没法稳定的进行消费，消费满多少多少，所以一般要主要好年费的问题。有一些种类是基本上一直面年费的，可以留意下。&lt;/li>
&lt;li>小红书，B 站也有很多博主分享各家银行，各个卡种的区别和使用体验，可以了解下。注意部分活动有时效性，留意博主发布的时间&lt;/li>
&lt;li>信用卡到手最好限制下额度，避免一些不必要的麻烦。各大银行的 App 都可以设置，甚至如果使用频次很低可以用完先锁卡&lt;/li>
&lt;/ul>
&lt;p>国内银行开的外币卡都是要受外汇额度限制的，可以考虑办外资的卡。这里简要介绍几个比较容易获取到的类别&lt;/p>
&lt;p>&lt;strong>类别一：肉身去香港办理外资银行实体卡&lt;/strong>&lt;br>
汇丰，中银香港，招商永隆，渣打银行，新加坡南洋银行等都是不错的选择，其中：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>中银香港&lt;/strong>是中国银行的，最大的优势就是同名账户转账没有杂七杂八的手续费克扣，经常需要跨境转账的可以考虑。&lt;/li>
&lt;li>&lt;strong>招商永隆&lt;/strong>申请门槛相对较低，只需要提前在单独的 App 上填写申请资料，如果审核通过了你就可以去香港任意一家招商永隆的网店面签认证，即可当场下卡。这个好处就是你是在确定可以下卡的情况下再去香港，避免出现当天现场办卡没通过审核，开不了户拿不了卡的情况。额外注意招商永隆这个是对存款有要求的，卡里面没能持续保持至少一万港币的余额是要收年费的&lt;/li>
&lt;li>&lt;strong>汇丰&lt;/strong>, &lt;strong>渣打&lt;/strong>, &lt;strong>南洋&lt;/strong>等都是外资银行，相对来说比较独立不过审核也会更严格些，如果是专程去香港办卡最好不要在一棵树上吊死，提前准备 plan b, 避免一张卡都办不下来的尴尬局面。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>类别二：肉身去香港顺带办理虚拟银行&lt;/strong>&lt;br>
虚拟银行顾名思义就是没有实体网点的银行，好处就是高度数字化，很多流程手续都可以在线下完成，少了很多繁琐的步骤; 而且没有了线下网点的开支，一般他们的优惠力度啥的也会更大。除此之外他们的开户门槛也会低不少。香港有几家虚拟银行比较受欢迎，据说本地都有很多人日常在用。比较受欢迎的有&lt;strong>众安银行&lt;/strong>(ZA Bank), &lt;strong>理慧银行&lt;/strong>(Livi Bank), &lt;strong>Mox Bank&lt;/strong>, &lt;strong>天星银行&lt;/strong>, &lt;strong>蚂蚁银行&lt;/strong>的，这些后面基本都有国内的一线科技企业如腾讯，蚂蚁金服，小米，京东参与投资，或是背靠传统实力雄厚的传统银行，如渣打银行，中银香港等。即便如此还是不建议作为主力账户存放资金，毕竟哪天人家要是跑路了或者是强制破产了，你的钱不一定能全拿回来。&lt;/p>
&lt;p>这些虚拟银行一般申请都比较简单，审批也不会卡的很严。你在 App 上直接提交申请，填写相应资料，然后后台自动给你审核。不过因为政策法规的限制，你必须人在 HK 内，用的当地的 IP(手机流量，公共 WiFi 都可以), 才能正常走申请流程。&lt;/p>
&lt;p>&lt;strong>类别三：在家线上办理虚拟信用卡&lt;/strong>&lt;br>
DuPay, NodePay, OneKey Card 等专门搞虚拟信用卡的平台都是支持线上认证直接开卡的，不过这些有的充值渠道有限制，需要 USDT 加密货币才能转入不支持人民币直接转入，还有的需要月费年费，还有各种交易手续费，这些就见仁见智，各取所需了。这类门槛低，使用方便，可靠度也是最低的，像 OpenAI 之前大规模封过一波虚拟银行卡，上述这些账户都会被拦截了，相对而言传统的银行和有实体卡的那些账户就要稳不少。&lt;/p>
&lt;p>此外像 Wise 这类换汇平台在某书上也是挺火的，可以开虚拟信用卡，服务质量也有保证，不过默认不对大陆地区开放服务，得曲线救国，这个感兴趣的可以自行搜索攻略。&lt;/p>
&lt;h2 id="level-3-手机号-与-duck-typing">
Level 3: 手机号 与 Duck Typing
&lt;a href="#level-3-%e6%89%8b%e6%9c%ba%e5%8f%b7-%e4%b8%8e-duck-typing" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;blockquote>
&lt;p>如果一个东西走路像鸭子，叫的也像鸭子，那它就是一只鸭子&lt;/p>
&lt;/blockquote>
&lt;p>📱 当代互联网世界中，手机号几乎就是最通用的身份认证 id. 如果你有新加坡节点的梯子工具，有新加坡的手机号码，那么你就是一个新加坡用户，你就可以解锁所有新加坡地区的互联网服务。&lt;/p>
&lt;p>这里的主要难点&lt;/p>
&lt;ul>
&lt;li>需要先解锁海外支付技能&lt;/li>
&lt;li>很多找到可以保号，保号成本低的运营商和套餐&lt;/li>
&lt;li>&lt;strong>需要找到支持在大陆激活&lt;/strong>, 能在大陆长期漫游且能收到短信的运营商和套餐。很多淘宝卖的旅游流量卡，那种都是要在目标地区才能激活和使用的&lt;/li>
&lt;li>所在地区最好限制比较少，能解锁尽可能多的服务 (如 HK 的解锁不了 GPT), 最理想的 OpenAI, Tiktok 等都要能解锁&lt;/li>
&lt;li>最好不要是虚拟号码，不然很多平台会受限制&lt;/li>
&lt;/ul>
&lt;p>这里给几个参考，可自行搜索攻略选购&lt;/p>
&lt;ul>
&lt;li>Giffgaff 英国的&lt;/li>
&lt;li>haha SIM, club SIM ,香港的&lt;/li>
&lt;li>UltraMobile 美国&lt;/li>
&lt;li>Knowroaming 加拿大一家公司的&lt;/li>
&lt;li>Piranha Mobile 英国的&lt;/li>
&lt;/ul>
&lt;p>鉴于有些套餐并不是长期开放，政策也一直在变，一些详细套餐配置和购买途径，保号方式等此处不再详述&lt;/p>
&lt;h2 id="结语">
结语
&lt;a href="#%e7%bb%93%e8%af%ad" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>总的来说，梯子节点，海外信用卡，海外手机号这三个都集齐了，你基本就可以畅快体验满血版互联网了。当然更直接的方法是肉身翻墙 hhh. Anyway, 希望各位都能生活在一个开放，互联，自由的互联网，而不要被被迫做互联网的二等公民。&lt;/p></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 的错误使用姿势 -->
&lt;p>这篇文章记录几个 docker compose 使用过程中几个难以察觉的错误使用姿势&lt;/p>
&lt;h2 id="1-变量值使用符号开头">
1. 变量值使用&lt;code>@&lt;/code>符号开头
&lt;a href="#1-%e5%8f%98%e9%87%8f%e5%80%bc%e4%bd%bf%e7%94%a8%e7%ac%a6%e5%8f%b7%e5%bc%80%e5%a4%b4" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>我在 RSS MAN X 的 docker-compose 配置文件中，huignn 的环境变量出来时是这样写的&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="color:#f92672">environment&lt;/span>:
- &lt;span style="color:#ae81ff">DATABASE_ADAPTER=postgresql&lt;/span>
- &lt;span style="color:#ae81ff">DATABASE_HOST=database.huginn&lt;/span>
- &lt;span style="color:#ae81ff">DATABASE_USERNAME=postgres&lt;/span>
- &lt;span style="color:#ae81ff">DATABASE_PASSWORD=@pass_for_DB&lt;/span>
- &lt;span style="color:#ae81ff">DATABASE_PORT=5432&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>自己使用的时候没发现什么问题，别人从零创建容器的时候报错了。刚开始排查了很久，后面发现我默认密码这样写其实是有问题的。&lt;/p>
&lt;p>上面的使用列表来描述环境变量在 docker-compose 解析的时候没有任何报错信息。但是使用下面这种 key-value 的 map 的形式时，&lt;code>docker-compose up&lt;/code>命令报错了，说 YAML 解析时出现问题&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="color:#f92672">environment&lt;/span>:
&lt;span style="color:#f92672">DATABASE_ADAPTER&lt;/span>: &lt;span style="color:#ae81ff">postgresql&lt;/span>
&lt;span style="color:#f92672">DATABASE_HOST&lt;/span>: &lt;span style="color:#ae81ff">database.huginn&lt;/span>
&lt;span style="color:#f92672">DATABASE_USERNAME&lt;/span>: &lt;span style="color:#ae81ff">postgres&lt;/span>
&lt;span style="color:#f92672">DATABASE_PASSWORD&lt;/span>: @&lt;span style="color:#ae81ff">pass_for_DB&lt;/span>
&lt;span style="color:#f92672">DATABASE_PORT&lt;/span>: &lt;span style="color:#ae81ff">5432&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;pre tabindex="0">&lt;code>yaml: line 17: found character that cannot start any token
&lt;/code>&lt;/pre>&lt;p>删除前导&lt;code>@&lt;/code>符号则一切正常了。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="color:#f92672">DATABASE_PASSWORD&lt;/span>: &lt;span style="color:#ae81ff">pass_for_DB&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>后续测试了几次到底是什么原因导致的&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="color:#75715e"># error&lt;/span>
&lt;span style="color:#f92672">DATABASE_PASSWORD&lt;/span>: @&lt;span style="color:#ae81ff">pass_for_DB &lt;/span>
&lt;span style="color:#75715e"># correct&lt;/span>
&lt;span style="color:#f92672">DATABASE_PASSWORD&lt;/span>: &lt;span style="color:#ae81ff">pass_for_DB&lt;/span>
&lt;span style="color:#75715e"># correct&lt;/span>
&lt;span style="color:#f92672">DATABASE_PASSWORD&lt;/span>: &lt;span style="color:#ae81ff">${DB_Password:-&amp;#39;pass_for_DB&amp;#39;}&lt;/span>
&lt;span style="color:#75715e">## in .env&lt;/span>
&lt;span style="color:#ae81ff">DB_Password=www_123&lt;/span>
&lt;span style="color:#75715e"># correct&lt;/span>
&lt;span style="color:#f92672">DATABASE_PASSWORD&lt;/span>: &lt;span style="color:#ae81ff">${DB_Password:-&amp;#39;@pass_for_DB&amp;#39;}&lt;/span>
&lt;span style="color:#75715e">## in .env&lt;/span>
&lt;span style="color:#ae81ff">DB_Password=www_123&lt;/span>
&lt;span style="color:#75715e"># error&lt;/span>
&lt;span style="color:#f92672">DATABASE_PASSWORD&lt;/span>: &lt;span style="color:#ae81ff">${DB_Password:-&amp;#39;@pass_for_DB&amp;#39;}&lt;/span>
&lt;span style="color:#75715e">## no .env&lt;/span>
&lt;span style="color:#75715e"># error&lt;/span>
&lt;span style="color:#f92672">DATABASE_PASSWORD&lt;/span>: &lt;span style="color:#ae81ff">${DB_Password:-&amp;#39;@pass_for_DB&amp;#39;}&lt;/span>
&lt;span style="color:#75715e">## in .env&lt;/span>
&lt;span style="color:#ae81ff">DB_Password=@www_123&lt;/span>
&lt;span style="color:#75715e"># correct&lt;/span>
&lt;span style="color:#f92672">DATABASE_PASSWORD&lt;/span>: &lt;span style="color:#ae81ff">${DB_Password:-&amp;#39;@pass_for_DB&amp;#39;}&lt;/span>
&lt;span style="color:#75715e">## in .env&lt;/span>
&lt;span style="color:#ae81ff">DB_Password=A@www_123&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终发现无论是否使用 docker-compose 变量替换，只要最终设定值的时候，包含前导@符号，最终一定会失败。Huginn 的这边的报错为解析容器内的一个 YAML 文件时失败&lt;/p>
&lt;pre tabindex="0">&lt;code>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'
&lt;/code>&lt;/pre>&lt;p>后面我又进入容器查看了下容器内部读取到的环境变量到底是不是预期的值，发现了问题所在&lt;/p>
&lt;p>能正常使用的情况&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">~ » sudo docker exec -it huginn1 /bin/bash
default@3b652a8413fb:~$ echo $DATABASE_HOST
database.huginn
default@3b652a8413fb:~$ echo $DATABASE_PASSWORD
A@www_123
&lt;/code>&lt;/pre>&lt;/div>&lt;p>出错的情况&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">~ » sudo docker exec -it huginn1 /bin/bash
default@42e19e692b24:~$ echo $DATABASE_HOST
database.huginn
default@42e19e692b24:~$ echo $DATABASE_PASSWORD
&lt;span style="color:#e6db74">&amp;#39;@pass_for_DB&amp;#39;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以看到，如果以&lt;code>@&lt;/code>符号开头，最终的环境变量会加上引号，这对于某些应用来说会产生预期之外的结果，如此处测试的 Huginn。&lt;/p>
&lt;h2 id="2-使用-6000-或-6666-端口">
2. 使用 6000 或 6666 端口
&lt;a href="#2-%e4%bd%bf%e7%94%a8-6000-%e6%88%96-6666-%e7%ab%af%e5%8f%a3" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>这也是一定挺特殊的场景，虽然与 docker compose 关系不大，但是难免会遇到。在映射端口的时候有一个很坑的地方，如果你要部署一个 web 服务，然后映射的时候填写的是&lt;code>6000&lt;/code>端口或者是&lt;code>6666&lt;/code>端口，你会发现无论怎么重启容器、更改容器设置、更换 Edge/Chrome，浏览器就是访问不了页面。&lt;/p>
&lt;p>实在折腾地快疯了，点开 Chrome 的错误详情，才发现这么一句&lt;/p>
&lt;p>&lt;em>&lt;strong>ERR_UNSAFE_PORT&lt;/strong>&lt;/em>&lt;/p>
&lt;p>一查才发现，Chrome 等浏览器会限制部分特殊端口的网页访问，这些端口一般都已经有特殊的作用。&lt;/p>
&lt;p>&lt;a href="https://www.jianshu.com/p/40f79f584eae">https://www.jianshu.com/p/40f79f584eae&lt;/a>&lt;/p>
&lt;p>这里列出 1000 以上的部分会有相关问题的端口，别的不说，感觉&lt;code>6000&lt;/code>和&lt;code>6666&lt;/code>还是很容易一不小心就会设置的端口。。。。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-c" data-lang="c"> &lt;span style="color:#ae81ff">2049&lt;/span>, &lt;span style="color:#75715e">// nfs
&lt;/span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#ae81ff">3659&lt;/span>, &lt;span style="color:#75715e">// apple-sasl / PasswordServer
&lt;/span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#ae81ff">4045&lt;/span>, &lt;span style="color:#75715e">// lockd
&lt;/span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#ae81ff">6000&lt;/span>, &lt;span style="color:#75715e">// X11
&lt;/span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#ae81ff">6665&lt;/span>, &lt;span style="color:#75715e">// Alternate IRC
&lt;/span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#ae81ff">6666&lt;/span>, &lt;span style="color:#75715e">// Alternate IRC
&lt;/span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#ae81ff">6667&lt;/span>, &lt;span style="color:#75715e">// Standard IRC
&lt;/span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#ae81ff">6668&lt;/span>, &lt;span style="color:#75715e">// Alternate IRC
&lt;/span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#ae81ff">6669&lt;/span>, &lt;span style="color:#75715e">// Alternate IRC
&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Chrome、FireFox 等都会有类似的行为，换多少浏览器、换多少版本可能也都不行。。。&lt;/p>
&lt;p>根据网友描述，部分特殊情况下，其他可能会被拦截的端口也包括&lt;code>8080&lt;/code>，&lt;code>8443&lt;/code>，&lt;code>10080&lt;/code>。&lt;/p>
&lt;p>总之，日常映射端口还是选取&lt;code>10000&lt;/code>以上的高位端口吧，避免不必要的麻烦：）&lt;/p></description></item><item><title>论如何下载任意网站视频</title><link>/posts/%E8%AE%BA%E5%A6%82%E4%BD%95%E4%B8%8B%E8%BD%BD%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99%E8%A7%86%E9%A2%91/</link><pubDate>Mon, 09 May 2022 00:00:00 +0000</pubDate><guid>/posts/%E8%AE%BA%E5%A6%82%E4%BD%95%E4%B8%8B%E8%BD%BD%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99%E8%A7%86%E9%A2%91/</guid><description>
&lt;!-- # 论如何下载任意网站视频 -->
&lt;p>视频已然成为当今互联网上信息传播的一个重要载体，有时会需要下载一些网上某个站点的视频插入 PPT，或者视频素材，无论是自己用抑或单纯是给朋友帮个忙，掌握一些使用的下载视频的小技巧总是不会错的，这里分享一些自用的小技巧，包括热门站点下载工具，以及应对冷门网站视频下载的技巧，应该可以覆盖 99.9% 的视频下载场景&lt;/p>
&lt;h2 id="热门网站电影电视剧下载">
热门网站电影/电视剧下载
&lt;a href="#%e7%83%ad%e9%97%a8%e7%bd%91%e7%ab%99%e7%94%b5%e5%bd%b1%e7%94%b5%e8%a7%86%e5%89%a7%e4%b8%8b%e8%bd%bd" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>这种其实建议直接找对应资源而不是从源站点下载，百度云，阿里云盘等找资源的方式我就不再赘述了，网上教程多的是。如果是电影资源或者是欧美、日韩的剧，可以搜索 BT 资源自行下载。&lt;/p>
&lt;p>这里安利一个油猴脚本：&lt;a href="https://greasyfork.org/zh-CN/scripts/329484-%E8%B1%86%E7%93%A3%E8%B5%84%E6%BA%90%E4%B8%8B%E8%BD%BD%E5%A4%A7%E5%B8%88-1%E7%A7%92%E6%90%9E%E5%AE%9A%E8%B1%86%E7%93%A3%E7%94%B5%E5%BD%B1-%E9%9F%B3%E4%B9%90-%E5%9B%BE%E4%B9%A6%E4%B8%8B%E8%BD%BD">豆瓣资源下载大师&lt;/a>，可以在豆瓣的影视详情页右侧显示有资源的站点，非常方便&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205091548956.png" alt="image-20220509144533549">&lt;/p>
&lt;p>分享下个人常用的下载站点：&lt;/p>
&lt;ul>
&lt;li>欧美资源下载：&lt;a href="https://www.1337x.to/">1337X&lt;/a>&lt;/li>
&lt;li>欧美资源下载：&lt;a href="https://piratebay.live/">海盗湾&lt;/a>&lt;/li>
&lt;li>动漫资源下载：&lt;a href="https://acg.rip/?term=JOJO%E7%9A%84%E5%A5%87%E5%A6%99%E5%86%92%E9%99%A9">ACG RIP&lt;/a>&lt;/li>
&lt;li>中文字幕下载：&lt;a href="http://zimuku.org">字幕库&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>个人推荐的下载工具：&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.qbittorrent.org">qBittorrent&lt;/a>：强推，老牌专业 BT 工具，有图形化界面，&lt;a href="https://hub.docker.com/r/linuxserver/qbittorrent">支持 Docker 部署&lt;/a>且带 Web 界面&lt;/li>
&lt;li>&lt;a href="http://aria2.github.io">aria2&lt;/a>：强大的命令行下载工具，灵活但上手成本略高，可&lt;a href="https://ariang.mayswind.net/zh_Hans/">自行部署 Web GUI 界面&lt;/a>，也可使用&lt;a href="http://ariang.mayswind.net/latest">公开版本 demo&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://motrix.app">Motrix&lt;/a>：高颜值跨平台的下载工具，有漂亮的 GUI 界面，底层基于 aria2&lt;/li>
&lt;/ul>
&lt;p>Tracker 列表：&lt;/p>
&lt;ul>
&lt;li>一个独立的收集 trackerlist 的页面：&lt;a href="https://trackerslist.com/#/zh">https://trackerslist.com/#/zh&lt;/a>&lt;/li>
&lt;li>通用 tracker list：&lt;a href="https://github.com/ngosang/trackerslist">ngosang/trackerslist&lt;/a>&lt;/li>
&lt;li>动漫资源 tracker list：&lt;a href="https://github.com/DeSireFire/animeTrackerList">animeTrackerList&lt;/a> (๑•̀ㅂ•́)و✧&lt;/li>
&lt;/ul>
&lt;h2 id="热门站点普通视频资源下载">
热门站点普通视频资源下载
&lt;a href="#%e7%83%ad%e9%97%a8%e7%ab%99%e7%82%b9%e6%99%ae%e9%80%9a%e8%a7%86%e9%a2%91%e8%b5%84%e6%ba%90%e4%b8%8b%e8%bd%bd" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>如果是 UGC 内容，比如 B 站用户上传的视频，那么 BT 通常是没有资源的，需要单独从源网站下载。不过既然是热门站点，都有很多人造过轮子了，这里推荐几个&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://github.com/ytdl-org/youtube-dl">YouTube-DL&lt;/a>&lt;/strong>&lt;/p>
&lt;p>一款强大的命令行视频下载工具，别看人家名字只写了 youtube，但其实国内爱优腾都是支持的。命令行调用也非常简洁，&lt;a href="https://github.com/ytdl-org/youtube-dl">知乎也有教程&lt;/a>需要的话可以瞅瞅。&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://github.com/yt-dlp/yt-dlp">YT-DLP（YouTube DownLoader Plus）&lt;/a>&lt;/strong>&lt;/p>
&lt;p>YouTube-DL 的一个分支，包括一些 bug 修复和增强的特性&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://github.com/iawia002/lux">Lux（原名 Annie）&lt;/a>&lt;/strong>&lt;/p>
&lt;p>Golang 编写的一个视频下载工具，同样支持国内站点&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://www.flvcd.com/index.htm">硕鼠&lt;/a>&lt;/strong>&lt;/p>
&lt;p>很早之前就出的一款免费视频下载合并工具，主要针对国内视频网站，但是像腾讯视频这种之前发过律师函，人家就迫不得已取消了支持。Windows 版，有界面，对于不是那么热门但是稍微又有点名气的网站支持较好&lt;/p>
&lt;h2 id="冷门站点普通视频资源下载">
冷门站点普通视频资源下载
&lt;a href="#%e5%86%b7%e9%97%a8%e7%ab%99%e7%82%b9%e6%99%ae%e9%80%9a%e8%a7%86%e9%a2%91%e8%b5%84%e6%ba%90%e4%b8%8b%e8%bd%bd" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>冷门站点的资源得我们自己动手了，不过利用浏览器的开发人员工具还是很容易获取的资源的。右键找到开发人员选项打开开发人员工具，可以点击左上角的按钮选择网页元素，找到&lt;code>&amp;lt;video&amp;gt;&lt;/code>标签，里面一般会有一个链接地址，复制地址打开即可。&lt;/p>
&lt;p>这种简单的视频嵌入很容易下载，浏览器工具也很容易嗅探到。比如可以使用&lt;code>专业视频下载工具&lt;/code>插件，你可以&lt;a href="https://ext.chrome.360.cn/webstore/detail/noaehhegaeigebicejggjdecdkfphced">访问 360 插件中心下载&lt;/a>。这种工具很多，这里不再赘述&lt;/p>
&lt;p>链接后缀为&lt;code>mp4&lt;/code>的一般来说都是说明该网页上面的视频只是从那一个文件加载的，没有经过分片和其他处理。如果没有后缀名，或者是&lt;code>flv&lt;/code>、&lt;code>ts&lt;/code>或者链接含有&lt;code>m3u8&lt;/code>字样的，说明该网页的资源是经过分片的，需要我们动点手段。&lt;/p>
&lt;h2 id="冷门站点-m3u8-动态分片视频资源下载">
冷门站点 m3u8 动态分片视频资源下载
&lt;a href="#%e5%86%b7%e9%97%a8%e7%ab%99%e7%82%b9-m3u8-%e5%8a%a8%e6%80%81%e5%88%86%e7%89%87%e8%a7%86%e9%a2%91%e8%b5%84%e6%ba%90%e4%b8%8b%e8%bd%bd" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>以中国庭审网的庭审录像视频为例，打开开发者工具定位到视频的部分发现 video 标签里面的 url 很奇怪，访问该链接也并不能访问到有效的视频。这种网页一般都是通过 m3u8 来下发分片文件的信息&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205091548957.png" alt="image-20220509151813071">&lt;/p>
&lt;p>打开开发者工具的网络选项卡，监听网络活动，点击播放视频，会多出来很多条目分别代表每一个网络请求。在搜索框输入 m3u8 来进行过滤。定位到该请求后可以在新标签页打开，保存这个 m3u8 文件。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205091548958.png" alt="image-20220509144410278">&lt;/p>
&lt;p>之后我们可以利用 ffmpeg 载入这个 m3u8 文件并进行合并，如有需要可一并进行转码操作&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">ffmpeg -i xxxx.m3u8 -c xxxx.mp4
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果报错提示不支持的 protocol，那么需要再加个参数让 ffmpeg 使用 http 下载&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">ffmpeg -protocol_whitelist concat,file,http,https,tcp,tls,crypto -i xxxx.m3u8 -c copy xxxx.mp4
&lt;/code>&lt;/pre>&lt;/div>&lt;p>接下来等待命令跑完，我们就可以得到需要的视频文件了。&lt;/p>
&lt;p>其他常用处理命令&lt;/p>
&lt;p>使用&lt;code>-i&lt;/code>参数读取文件，查看详细参数&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">ffmpeg -i xxxx.mp4
&lt;/code>&lt;/pre>&lt;/div>&lt;p>使用 ffmepg 提取视频中的音频部分，方便后续处理。比如要生成字幕或是转写为文本，省的上传几百兆的视频文件。&lt;a href="https://jianwai.youdao.com/">网易见外工作台&lt;/a>做这些很方便，而且免费额度也很足，安利一波&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">ffmpeg -i xxxx.mp4 -vn -codec copy xxxx.aac
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205091548959.png" alt="image-20220509153021601">&lt;/p>
&lt;p>解析并下载 m3u8 视频的其他方案&lt;/p>
&lt;ul>
&lt;li>使用硕鼠解析：https://www.flvcd.com/index.htm&lt;/li>
&lt;li>使用 Chrome 插件：&lt;a href="https://chrome.google.com/webstore/detail/video-downloader-cococut/gddbgllpilhpnjpkdbopahnpealaklle">CoCoCut&lt;/a>，&lt;a href="https://github.com/xifangczy/cat-catch">猫抓 (cat-catch)&lt;/a>&lt;/li>
&lt;li>使用油猴脚本：&lt;a href="https://greasyfork.org/zh-CN/scripts/440577-m3u8-%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD-vip%E8%A7%A3%E6%9E%90%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD-%E7%BD%91%E7%AB%99%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD">m3u8-downloader&lt;/a>，配套工具&lt;a href="https://github.com/Momo707577045/m3u8-downloader">地址&lt;/a>&lt;/li>
&lt;li>使用软件：&lt;a href="http://www.neatdownloadmanager.com/index.php/en/">NeatDownloadManager&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>以上&lt;/p></description></item><item><title>Huginn 指南：为任意网站制作 RSS</title><link>/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/</link><pubDate>Sun, 08 May 2022 00:00:00 +0000</pubDate><guid>/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/</guid><description>
&lt;!-- # Huginn 指南：为任意网站制作 RSS -->
&lt;p>Huginn 使用多个不同功能的 Agent 组合搭配来实现一系列功能，一个 Agent 可以执行特定的操作，并产生一个 Event，你可以指定他产生的 Event 由哪个 Agent 接收处理。&lt;/p>
&lt;p>比如我们需要使用 WebSite Agent 来爬取某个网站上的列表内容，爬取后列表的每一项会生成一个 Event，我们可以指定一个 Output Agent 来接收这些 Event，并将其转换为 RSS 的格式进行输出，复制 Output Agent 返回给你的 URL 就可以进行订阅啦，Huginn 爬取网站生成 RSS 的基本原理就是这样。&lt;/p>
&lt;h2 id="huginn-爬取普通网页制作-rss">
Huginn 爬取普通网页制作 RSS
&lt;a href="#huginn-%e7%88%ac%e5%8f%96%e6%99%ae%e9%80%9a%e7%bd%91%e9%a1%b5%e5%88%b6%e4%bd%9c-rss" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>右键网页打开开发者工具，屏幕会分出一部分空间显示开发者工具窗口，点击左上角的按钮再把鼠标移动到页面上可以选择页面的某一个元素，比如这里我们要爬取推荐文章列表，推荐文章列表的每一项都有同样的样式，我们可以使用 CSS 选择器来指定爬取该项&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207138.png" alt="image-20220508160659378">&lt;/p>
&lt;p>该元素可以用 CSS 选择器&lt;code>.meiwen&lt;/code>选择到。&lt;/p>
&lt;p>&lt;strong>Tips:&lt;/strong> class=xxx 则使用&lt;code>.xxx&lt;/code>,如果为 id=xxx 则使用&lt;code>#xxx&lt;/code>&lt;/p>
&lt;p>该标签是 a 标签，我们可以继续限定一下条件，使用&lt;code>a.meiwen&lt;/code>&lt;/p>
&lt;p>如果要限制必须是 h2 标签下的带有 meiwen 的 class 属性的 a 标签，可以使用&lt;code>h2 a.meiwen&lt;/code>&lt;/p>
&lt;p>如果要再加一个限制，是列表元素 li 下面的 h2 标签里带有 meiwen 的 class 属性的 a 标签，可以使用&lt;code>li h2 a.meiwen&lt;/code>&lt;/p>
&lt;p>添加其他附加限定条件以此类推&lt;/p>
&lt;p>你也可以在右侧 Style 面板里点击加号添加一个自定义样式，输入 CSS 选择器，浏览器会自动高亮符合条件的网页元素，你可以使用这个功能来检验你写的 CSS 选择器是否正确以及是不是提取的你想要的内容&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207716.png" alt="image-20220508163359806">&lt;/p>
&lt;p>接下来在 Huginn 里创建一个 Scenario，然后点击新建一个 Agent，类型选择 WebSite Agent，填写一个名称，并在最下面的配置处指定你要爬取的网页元素&lt;/p>
&lt;blockquote>
&lt;h6 id="website-agent">
&lt;strong>Website Agent&lt;/strong>
&lt;a href="#website-agent" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h6>
&lt;p>The Website Agent scrapes a website, XML document, or JSON feed and creates Events based on the results.&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-json" data-lang="json">&lt;span style="color:#960050;background-color:#1e0010">url:&lt;/span> {
&lt;span style="color:#960050;background-color:#1e0010">css:&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">li&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">h2&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">a.meiwen&lt;/span>
&lt;span style="color:#960050;background-color:#1e0010">value:&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">@href&lt;/span>
}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>以爬取 url 为例，css 表示使用 css 选择器选择网页元素，value 表示从哪里获取对应的值，对于刚才我们选取的一个元素来说&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-html" data-lang="html">&amp;lt;&lt;span style="color:#f92672">a&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;meiwen&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">href&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;/article/58030.html&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">title&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;缘起则聚，缘灭则散&amp;#34;&lt;/span>&amp;gt;缘起则聚，缘灭则散&amp;lt;/&lt;span style="color:#f92672">a&lt;/span>&amp;gt;
&lt;/code>&lt;/pre>&lt;/div>&lt;p>href 属性里面的内容是他的链接，title 属性里面的内容则是他的标题。接下来在 value 中填写&lt;code>@href&lt;/code>指定从 href 属性提取内容，就可以取到链接地址了&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Pro Tips:&lt;/strong>&lt;/p>
&lt;p>如果是纯文本节点或是想提取标签内嵌的文本，value 里可以填写&lt;code>string(.)&lt;/code>&lt;/p>
&lt;p>如果想删除多余的空格，可以使用&lt;code>normalize-space(.)&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>&lt;strong>Pro Tips 2:&lt;/strong>&lt;/p>
&lt;p>字符串处理函数和标签属性值变量可以一起使用，如&lt;code>normalize-space(@title)&lt;/code>可以获取该标签的 title 属性值并删除多余的空白字符&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207717.png" alt="image-20220508163714342">&lt;/p>
&lt;p>接下来点击 Dry Run 按钮进行测试，不出意外我们会得到一个 json 的输出，里面包括我们爬取到的每一项他的 url 和 title。&lt;/p>
&lt;p>如果没有成功，你可能需要删掉上面没有使用到的 hovertext 节点，因为该项指定的内容在我们刚才的网页中并不存在。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207718.png" alt="image-20220508164259295">&lt;/p>
&lt;p>点击 Save 保存，我们开始下一步输出 RSS。在刚才的 Scenario 中再新建一个 Agent，选择 Data Output Agent，并设置他的名字和 Source Agent&lt;/p>
&lt;blockquote>
&lt;h6 id="data-output-agent">
Data output Agent
&lt;a href="#data-output-agent" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h6>
&lt;p>The Data Output Agent outputs received events as either RSS or JSON. Use it to output a public or private stream of Huginn data.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207719.png" alt="image-20220508164941647">&lt;/p>
&lt;p>&lt;strong>Propagate immediately&lt;/strong>是指即时处理来自 Source Agent 的 Event，启用他方便我们调试，但会略微增加服务器负载，你可以自行决定是否使用。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207720.png" alt="image-20220508165345792">&lt;/p>
&lt;p>在 secret 字段中为你的这个 RSS 标注一个英文的名字，修改 title 字段标注你的 RSS 的名字。item 字段是每条文章会有的属性，一般来说主要就 title 和 link，分别设置为上文我们提取的值的变量名。这里添加一个 guid 字段，这是一篇文章的唯一标识符，避免 RSS 阅读器读到的文章标题不同但是内容相同，常见于某篇文章的标题被修改，这会导致 RSS 阅读器内出现多篇重复文章。&lt;/p>
&lt;p>此外建议增加一个 link 字段，值设置为与爬取的网站的主域名一致，避免网站内使用相对链接开头的资源无法正常加载。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207721.png" alt="image-20220508170038722">&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207722.png" alt="image-20220508170115192">&lt;/p>
&lt;p>点击 Save 保存，回到 Scenario 界面，第一次需要手动点击运行一下刚才的 Website Agent。稍等片刻后台会进行爬取，右上角会显示产生了多少个 Event。再点开刚才设置的 Data Output Agent 查看详情，vola！右侧就会显示生成的 RSS 链接了，复制以 xml 结尾的链接到 RSS 阅读器中就可以订阅啦🎉&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207723.png" alt="image-20220508170212112">&lt;/p>
&lt;p>如果你的配置正确但是 WebSite Agent 又没有输出任何内容的话，那么你要爬取的站点的内容应该是通过 JavaScript 在你带开浏览器时动态生成的。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Pro Tips:&lt;/strong>&lt;/p>
&lt;p>你可以右键网页在开发人员菜单中点击显示源代码，然后用 Ctrl+F 搜索你在页面上见到的想爬取的某一条内容，如果有说明该网站的页面时静态的，否则说明你要爬取的内容并不是静态的。&lt;/p>
&lt;/blockquote>
&lt;p>要爬取这样的站点，我们需要模拟浏览器操作，执行页面上的 JavaScript 脚本，待数据生成完毕后再使用上面的方法去爬取内容。要模拟浏览器操作，这里介绍两个方案：一个是利用 browserless 的无头浏览器，另一个是使用在线 PhatomJS 服务。&lt;/p>
&lt;h2 id="使用-huginnbrowserless-为动态网页生成-rss">
使用 Huginn+Browserless 为动态网页生成 RSS
&lt;a href="#%e4%bd%bf%e7%94%a8-huginnbrowserless-%e4%b8%ba%e5%8a%a8%e6%80%81%e7%bd%91%e9%a1%b5%e7%94%9f%e6%88%90-rss" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>部署了&lt;a href="https://github.com/Colin-XKL/RSSmanX">RSS Man X&lt;/a>的完整版的话默认已经包含 huginn 和 browserless 服务，无需重复安装。且 huginn 可以通过&lt;code>service.browserless:3000&lt;/code>访问到 browserless 服务。&lt;/p>
&lt;p>总体步骤与上文一样，不过因为被抓取的内容是通过 JavaScript 动态生成的，所以直接使用 WebSite Agent 是抓取不到东西的，我们需要先使用 Post Agent 向 browserless 服务发送指令，让他帮我们模拟浏览器操作，再将最终完整的网页返回给我们，再使用 WebSite Agent 进行后续处理。&lt;/p>
&lt;blockquote>
&lt;h6 id="post-agent">
&lt;strong>Post Agent&lt;/strong>
&lt;a href="#post-agent" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h6>
&lt;p>A Post Agent receives events from other agents (or runs periodically), merges those events with the Liquid-interpolated contents of payload, and sends the results as POST (or GET) requests to a specified url. To skip merging in the incoming event, but still send the interpolated payload, set no_merge to true.&lt;/p>
&lt;/blockquote>
&lt;p>接下来以&lt;a href="https://pccz.court.gov.cn/pcajxxw/pcgg/ggdh?lx=0">这个网站&lt;/a>为例介绍一下，这个列表页的内容是由 JavaScript 动态生成的&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207724.png" alt="image-20220508205159783">&lt;/p>
&lt;p>按照以下内容设置你的 Post Agent&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-json" data-lang="json">{
&lt;span style="color:#f92672">&amp;#34;post_url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;http://service.browserless:3000/content&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;expected_receive_period_in_days&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;1&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;content_type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;json&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;method&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;post&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;payload&amp;#34;&lt;/span>: {
&lt;span style="color:#f92672">&amp;#34;url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://pccz.court.gov.cn/pcajxxw/pcgg/ggdh?lx=0&amp;#34;&lt;/span>
},
&lt;span style="color:#f92672">&amp;#34;headers&amp;#34;&lt;/span>: {
&lt;span style="color:#f92672">&amp;#34;Cache-Control&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;no-cache&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;Content-Type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;application/json&amp;#34;&lt;/span>
},
&lt;span style="color:#f92672">&amp;#34;emit_events&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;true&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;no_merge&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;false&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;output_mode&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;clean&amp;#34;&lt;/span>
}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中&lt;code>post_url&lt;/code>为你的 browserless 实例地址，如果你使用了 RSS MAN X 里的 Huginn 可以直接向上面一样填写。&lt;code>payload&lt;/code>中的&lt;code>url&lt;/code>字段填写你需要的网页地址。注意 emit_events 要设置为&lt;code>true&lt;/code>，这样才方便我们后续使用 WebSite Agent 操作。&lt;/p>
&lt;p>点击 Dry Run，如果能返回一个带有&lt;code>body&lt;/code>字段且里面有文本内容说明调用成功。&lt;/p>
&lt;p>调用不成功检查一下配置，以及是不是我们的爬虫被目标网站拦截了。若是爬虫被拦截可参考文末的解决方案。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207725.png" alt="image-20220508195731732">&lt;/p>
&lt;p>接下来点击 Save 保存，再新建一个 Website Agent，Source 设置为刚才的 Post Agent。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-json" data-lang="json">{
&lt;span style="color:#f92672">&amp;#34;expected_update_period_in_days&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;2&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;data_from_event&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{{ body }}&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;html&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;mode&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;on_change&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;extract&amp;#34;&lt;/span>: {
&lt;span style="color:#f92672">&amp;#34;url&amp;#34;&lt;/span>: {
&lt;span style="color:#f92672">&amp;#34;css&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ul#wslb li a&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;value&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;normalize-space(@href)&amp;#34;&lt;/span>
},
&lt;span style="color:#f92672">&amp;#34;title&amp;#34;&lt;/span>: {
&lt;span style="color:#f92672">&amp;#34;css&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ul#wslb li a&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;value&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;@title&amp;#34;&lt;/span>
},
&lt;span style="color:#f92672">&amp;#34;author&amp;#34;&lt;/span>: {
&lt;span style="color:#f92672">&amp;#34;css&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ul#wslb li div.center&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;value&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;normalize-space(.)&amp;#34;&lt;/span>
}
}
}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意修改&lt;code>data_from_event&lt;/code>的值，其他地方与爬取普通网站一样。再新建并配置一下 Output Agent，RSS 的链接就出来了&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207726.png" alt="image-20220508205856407">&lt;/p>
&lt;h2 id="使用-phantomjs-为动态页面生成-rss">
使用 PhantomJS 为动态页面生成 RSS
&lt;a href="#%e4%bd%bf%e7%94%a8-phantomjs-%e4%b8%ba%e5%8a%a8%e6%80%81%e9%a1%b5%e9%9d%a2%e7%94%9f%e6%88%90-rss" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>首先需要到&lt;a href="https://phantomjscloud.com">Phantom Js Cloud 的官网&lt;/a>注册一个账户，每个账户官方提供了一定的免费额度，每天大概可以爬取 500 个页面，对于做 RSS 来说妥妥的够用了。注册之后可以得到一个 API KEY，这个待会会使用到。&lt;/p>
&lt;p>接下来新建一个 Phantom JS Cloud Agent，填写基本的名称、API KEY 和目标 URL，render type 选择 html。底下 User Agent 建议改用真实的浏览器 UA，减少触发反爬虫的可能性。如果不知道自己的 UA 可以到这个网站查看当前浏览器的 UA，复制字符串即可。如果懒得查也可以用这个&lt;/p>
&lt;pre tabindex="0">&lt;code>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.81 Safari/537.36
&lt;/code>&lt;/pre>&lt;blockquote>
&lt;h6 id="phantom-js-cloud-agent">
Phantom JS Cloud Agent
&lt;a href="#phantom-js-cloud-agent" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h6>
&lt;p>This Agent generates PhantomJs Cloud URLs that can be used to render JavaScript-heavy webpages for content extraction.&lt;/p>
&lt;p>URLs generated by this Agent are formulated in accordance with the PhantomJs Cloud API. The generated URLs can then be supplied to a Website Agent to fetch and parse the content. Sign up to get an api key, and add it in Huginn credentials.&lt;/p>
&lt;/blockquote>
&lt;p>点击 Dry Run 后会返回一条 url，返回格式类似这样&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-json" data-lang="json">[
{
&lt;span style="color:#f92672">&amp;#34;url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://phantomjscloud.com/api/browser/xxxxxxx&amp;#34;&lt;/span>
}
]
&lt;/code>&lt;/pre>&lt;/div>&lt;p>之后创建一个 WebSite Agent，Source Agent 设置为上面的 Phantom JS Cloud Agent，然后稍微改一下 url 的部分&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-json" data-lang="json">{
&lt;span style="color:#f92672">&amp;#34;expected_update_period_in_days&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;2&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;url_from_event&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{{url}}&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;html&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;mode&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;on_change&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;extract&amp;#34;&lt;/span>: {&lt;span style="color:#960050;background-color:#1e0010">...&lt;/span>}
}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意将原来的&lt;code>url:??&lt;/code>的部分更改为&lt;code>&amp;quot;url_from_event&amp;quot;: &amp;quot;{{url}}&amp;quot;&lt;/code>,这样就指定使用 Phantom JS Cloud 为我们获取的完整网页，接下来的操作就大同小异了。配置好要爬取的字段和规则后点击 Dry Run 就可以看到结果&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207727.png" alt="image-20220508215636780">&lt;/p>
&lt;p>这里是刚才的 Agent 产生的一个 Event。这里除了 url 和 title 我还提取了 date 字段。在 Output Agent 中，可以配置为每一条文章输出发布时间的信息。对于这种规整的日期字母串，可以使用&lt;code>{{ date | date: %F }}&lt;/code>进行解析并格式化输出为 rss 规范的时间格式如果没有配置的话，每篇文章的发布时间显示的都是一样的，为 Huginn 爬虫更新的时间。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-json" data-lang="json">&lt;span style="color:#e6db74">&amp;#34;item&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">:&lt;/span> {
&lt;span style="color:#f92672">&amp;#34;title&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{{title}}&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{{url}}&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;pubDate&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{{ date | date: %F }}&amp;#34;&lt;/span>
}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>Pro Tips:&lt;/strong>&lt;/p>
&lt;p>Huginn 解析日期&lt;/p>
&lt;p>注意&lt;code>{{ date | date: %F }}&lt;/code>里面，第一个&lt;code>date&lt;/code>是上面的 Website Agent 产生的 Event 里面的变量名，第二个&lt;code>date&lt;/code>是 Huginn 使用的 Liquid 模版引擎语法里内置的一个 filter，可以理解为有特定功能的函数&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207637.png" alt="image-20220508220438696">&lt;/p>
&lt;h2 id="faq">
FAQ
&lt;a href="#faq" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>为什么启动 docker 容器后访问 Huginn 显示网络错误？&lt;/strong>&lt;/p>
&lt;p>Huignn 冷启动较慢，需要等待三五分钟。如果还是不行，检查端口映射和防火墙设置&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>为什么抓取到的包含相对路径的结果，网页上可以点击访问，但是生成的 RSS 不能正常使用？&lt;/strong>&lt;/p>
&lt;p>检查 link 的设置，有些网站只是域名，有些网站有子目录，具体查看该网页源码中 head 节点里 base url 的设置&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>如何对爬取到的某一项的字符串做更高级更复杂的处理？&lt;/strong>&lt;/p>
&lt;p>可以参考&lt;a href="https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid">Hugnn 官方对 Liquid 语法的文档&lt;/a>以及&lt;a href="https://shopify.dev/api/liquid">Shopify 官方关于 Liquid 模板的语法文档&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>为什么部署了 Huginn，等了很长时间都无法访问后台页面？&lt;/strong>&lt;/p>
&lt;p>若部署后某个应用一直无法通过浏览器访问，请检查是否绑定到了 6000/6666 等特殊端口，浏览器会拦截对这些端口的访问参见&lt;a href="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/">这里&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Huginn 爬虫访问目标网站被拦截了怎么解决&lt;/strong>&lt;br>
介绍几个基本的反反爬虫策略：&lt;/p>
&lt;ol>
&lt;li>带上 User Agent，要求是真实的浏览器 UA。&lt;/li>
&lt;li>Browserless 去掉默认会和请求一起发送的可以被识别为爬虫的特征参数，设置 browserless 的环境变量&lt;code>DEFAULT_HEADLESS=false&lt;/code>&lt;/li>
&lt;li>使用随机代理 IP，适用于因爬取频率达到爬虫阈值&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;h2 id="扩展阅读">
扩展阅读
&lt;a href="#%e6%89%a9%e5%b1%95%e9%98%85%e8%af%bb" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://github.com/huginn/huginn/wiki/">Huginn 官方文档&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://shopify.dev/api/liquid/filters/">Liquid 模板引擎语法官方文档&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/">RSS Man X 部署指南&lt;/a>&lt;/li>
&lt;li>&lt;a href="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/">docker compose 的错误使用姿势&lt;/a>&lt;/li>
&lt;/ul></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 安装部署指南 -->
&lt;p>RSS Man X 是我两年前入坑 RSS 后，为了方便更多人更方便地使用 RSS 所发起的一个项目，主要是用 docker-compose 整合了一些常用的服务如 TTRSS、RSSHub、Huginn、OpenCC 等并进行了一些优化调整，如自动更新，反反爬虫等。这篇文章会尽可能详尽地讲解安装部署的步骤以及安装过程中可能会遇到的一些问题。&lt;/p>
&lt;p>RSS Man X 会利用到 docker 和 docker-compose，首先需要确保你的服务器正确安装了这些软件&lt;/p>
&lt;h2 id="1-docker-环境准备">
1. Docker 环境准备
&lt;a href="#1-docker-%e7%8e%af%e5%a2%83%e5%87%86%e5%a4%87" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>检查服务器中是否已经安装了 docker 和 docker-compose，并检查他们的版本是否太老。比如输入&lt;code>docker --version&lt;/code>来检查 docker 的版本&lt;/p>
&lt;p>docker 的版本建议不要低于 19，docker-compose 的版本建议不要低于 1.20&lt;br>
(注：Docker 新版本可使用&lt;code>docker compose&lt;/code> 替代 &lt;code>docker-compose&lt;/code>)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">~ » docker --version
Docker version 20.10.12, build 20.10.12-0ubuntu2~20.04.1
&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">~ » docker-compose --version
docker-compose version 1.25.0, build unknown
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果上面命令执行后提示&lt;code>command not found&lt;/code>，那么说明并没有安装对应的软件包（或是安装的路径并不在当前用户的 PATH 变量中，尝试切换到 root 操作，详细的原因和解决方法见后文）&lt;/p>
&lt;h3 id="11-ubuntudebian-安装-docker">
1.1 Ubuntu/Debian 安装 Docker
&lt;a href="#11-ubuntudebian-%e5%ae%89%e8%a3%85-docker" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>ubuntu 和 debian 主要是用 apt 安装和管理软件包，可以使用以下命令来安装，根据实际情况选择是否要加 sudo。下面以 Ubuntu 为例。Debian 下的安装略有不同，可以参见&lt;a href="https://docs.docker.com/engine/install/debian/">Docker 官方文档&lt;/a>，以及&lt;a href="https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/">清华镜像源&lt;/a>。其中&lt;code>download.docker.com&lt;/code>连接不同的可以尝试讲域名部分更换为&lt;a href="https://mirrors.ustc.edu.cn/help/docker-ce.html">中科大提供的镜像&lt;/a>地址&lt;code>mirrors.ustc.edu.cn/docker-ce&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">&lt;span style="color:#75715e"># 首先移除老旧的软件包&lt;/span>
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
&lt;span style="color:#75715e"># 安装一些必要的依赖&lt;/span>
sudo apt-get install &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> ca-certificates &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> curl &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> gnupg &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> lsb-release
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果你的服务器在墙外，可以直接使用 docker 官方的软件源&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> &lt;span style="color:#e6db74">&amp;#34;deb [arch=&lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>dpkg --print-architecture&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74"> signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
&lt;/span>&lt;span style="color:#e6db74"> &lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>lsb_release -cs&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74"> stable&amp;#34;&lt;/span> | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果你的服务器在墙内，可以使用由中科大提供的镜像&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> &lt;span style="color:#e6db74">&amp;#34;deb [arch=&lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>dpkg --print-architecture&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74"> signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
&lt;/span>&lt;span style="color:#e6db74"> &lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>lsb_release -cs&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74"> stable&amp;#34;&lt;/span> | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/code>&lt;/pre>&lt;/div>&lt;p>导入 docker 软件源后即可开始安装 docker，安装完成后可以输入&lt;code>docker --version&lt;/code>来检查 docker 的版本&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="12-centosfedora-安装-docker">
1.2 CentOS/Fedora 安装 Docker
&lt;a href="#12-centosfedora-%e5%ae%89%e8%a3%85-docker" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>CentOS 和 Fedora 使用 yum 安装和管理软件包，新版本则是使用 dnf，不过两者功能一致且高度兼容。下面以 CentOS 为例，Fedora 可参见&lt;a href="https://docs.docker.com/engine/install/fedora/">官方文档&lt;/a>或&lt;a href="https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/">清华镜像源&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">&lt;span style="color:#75715e"># 1. 首先移除老旧的软件包&lt;/span>
sudo yum remove docker &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-client &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-client-latest &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-common &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-latest &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-latest-logrotate &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-logrotate &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-engine
&lt;span style="color:#75715e"># 2.&lt;/span>
sudo yum install -y yum-utils
&lt;span style="color:#75715e"># 3.A 之后使用官方docker软件库&lt;/span>
sudo yum-config-manager &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> --add-repo &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> https://download.docker.com/linux/centos/docker-ce.repo
&lt;span style="color:#75715e"># 3.B 墙内方案&lt;/span>
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo sed -i &lt;span style="color:#e6db74">&amp;#39;s+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+&amp;#39;&lt;/span> /etc/yum.repos.d/docker-ce.repo
&lt;span style="color:#75715e"># 4. 即可开始安装&lt;/span>
sudo yum update
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="13-安装或更新-docker-compose">
1.3 安装或更新 docker-compose
&lt;a href="#13-%e5%ae%89%e8%a3%85%e6%88%96%e6%9b%b4%e6%96%b0-docker-compose" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>docker-compose 目前有两个主要版本 V1 和 V2，都是可用的。V1 使用 Python 编写，使用时类似&lt;code>sudo docker-compose up -d&lt;/code>，V2 则是 Golang 编写，与前者高度兼容，但是是作为 docker 的插件安装的，使用时类似&lt;code>sudo docker compose up -d&lt;/code>，中间的短杠不需要了。&lt;/p>
&lt;p>如果是按照上文的步骤安装的 docker，那么默认已经安装了 docker compose v2，可以通过&lt;code>docker compose version&lt;/code>查看版本&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">~ » docker compose version
Docker Compose version v2.3.3
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果需要是安装的比较老的 v1 版本的 docker-compose，想要单纯更新 docker-compose 而又不想动其他东西的话，可以更新安装 v1 版本的 docker-compose。&lt;/p>
&lt;p>首先删除老旧版本（如果有的话）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">rm $DOCKER_CONFIG/cli-plugins/docker-compose
sudo rm /usr/local/lib/docker/cli-plugins/docker-compose
pip uninstall docker-compose
&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后使用 pip 来安装&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">pip3 install docker-compose
&lt;/code>&lt;/pre>&lt;/div>&lt;p>墙内也可以临时使用镜像源下载&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果提示 pip 命令不存在需要先安装一下&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">&lt;span style="color:#75715e"># Ubuntu/Debian&lt;/span>
sudo apt install python3-pip
&lt;span style="color:#75715e"># CentOS/Fedora&lt;/span>
sudo yum install python3-pip
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果 pip 报错试着升级一下 pip 的版本&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="14-为-docker-配置镜像源">
1.4 为 Docker 配置镜像源
&lt;a href="#14-%e4%b8%ba-docker-%e9%85%8d%e7%bd%ae%e9%95%9c%e5%83%8f%e6%ba%90" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>如果 Docker 下载镜像非常慢，你可能需要单独配置一下 Docker 的镜像源。==&lt;strong>注意：Docker 安装软件源的镜像和 Docker 镜像或者说映像的国内源并不是同一个，英文表述可能更准确一些：&lt;/strong>==&lt;/p>
&lt;ul>
&lt;li>上文安装 docker 时配置的是 docker 的 repo，repo 里含有 docker 的软件包，&lt;a href="https://mirrors.ustc.edu.cn/help/docker-ce.html">国内的镜像&lt;/a>为 Docker CE 安装软件包的镜像&lt;/li>
&lt;li>现在我们要配置的是 Docker Hub 的 Mirror，Docker 里拉取 Image 默认会访问&lt;a href="https://hub.docker.com">Docker Hub&lt;/a>，国内有多个 Docker Hub 镜像或是 Docker 镜像加速器，如&lt;a href="https://mirrors.ustc.edu.cn/help/dockerhub.html">中科大的源&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>在&lt;code>/etc/docker/daemon.json&lt;/code>文件中写入以下内容，如不存在可先行创建，注意 json 中列表的最后一项末尾是没有逗号的&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-json" data-lang="json">{
&lt;span style="color:#f92672">&amp;#34;registry-mirrors&amp;#34;&lt;/span>: [
&lt;span style="color:#e6db74">&amp;#34;https://hub-mirror.c.163.com&amp;#34;&lt;/span>,
&lt;span style="color:#e6db74">&amp;#34;https://mirror.baidubce.com&amp;#34;&lt;/span>,
&lt;span style="color:#e6db74">&amp;#34;https://docker.nju.edu.cn&amp;#34;&lt;/span>,
&lt;span style="color:#e6db74">&amp;#34;https://docker.mirrors.sjtug.sjtu.edu.cn&amp;#34;&lt;/span>,
&lt;span style="color:#e6db74">&amp;#34;https://dockerproxy.com&amp;#34;&lt;/span>,
&lt;span style="color:#e6db74">&amp;#34;https://docker.m.daocloud.io&amp;#34;&lt;/span>
]
}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>update 20230720: 部分镜像源不再可用，更新镜像源配置。参考 &lt;a href="https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6">https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6&lt;/a>&lt;/p>
&lt;p>配置完成后&lt;code>sudo systemctl restart docker&lt;/code>重启 docker 服务，然后输入&lt;code>sudo docker info&lt;/code>，在输出结果的末尾可以看到&lt;code>Registry Mirrors&lt;/code>里会出现我们刚刚配置的 Docker Hub 镜像&lt;/p>
&lt;p>群辉等 NAS 的系统并不是标准版 Linux，安装的也是魔改版 docker，上面的配置文件地址并不适用，建议自行搜索对应的文档或教程。&lt;/p>
&lt;h2 id="2-安装-rss-man-x">
2. 安装 RSS Man X
&lt;a href="#2-%e5%ae%89%e8%a3%85-rss-man-x" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>&lt;a href="https://github.com/Colin-XKL/RSSmanX">RSS MAN X 项目&lt;/a>旨在为 RSS 的同好提供一个方便地搭建自己的 RSS 服务的捷径，毕竟不是所有 RSS 爱好者都懂代码 😂。RSS Man X 能够有 RSS 订阅管理、RSS 在线阅读界面，进阶功能包括服务健康自检、海外站点 RSS 解锁等，提供不同的版本供选择，三个版本的 &lt;code>docker-compose&lt;/code> 文件对应不同的需求，包含的组件和服务有差异。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>组件 / 服务 / 功能名称&lt;/th>
&lt;th>标准版&lt;/th>
&lt;th>Lite 版&lt;/th>
&lt;th>Ultimate 版 ✨&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>TTRSS&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RSSHub&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Huginn&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mercury&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OpenCC&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Redis&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Browserless&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>数据持久化保存&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>容器自动更新&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>容器健康检查&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>海外站点加速&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>智能路由&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>反反爬虫&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="21-安装流程">
2.1 安装流程
&lt;a href="#21-%e5%ae%89%e8%a3%85%e6%b5%81%e7%a8%8b" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>安装好了 &lt;code>docker&lt;/code> 和 &lt;code>docker-compose&lt;/code> 后，可以使用&lt;code>git clone https://github.com/Colin-XKL/RSSmanX --depth=1&lt;/code>快速克隆本仓库，也可以通过&lt;a href="https://archive.fastgit.org/Colin-XKL/RSSmanX/archive/refs/heads/master.zip">这个镜像地址&lt;/a>下载仓库 zip 文件，&lt;a href="https://gitee.com/colin-xkl/RSSmanX">Gitee 上也有镜像&lt;/a>不过不经常更新。&lt;/p>
&lt;ol>
&lt;li>cd 进入文件夹，修改&lt;code>.env&lt;/code>中的值，如密码和 TTRSS 入口 URL 等&lt;/li>
&lt;li>运行 &lt;code>sudo docker-compose up -d&lt;/code>&lt;/li>
&lt;li>等待程序跑完&lt;/li>
&lt;li>安装完成 ✅&lt;/li>
&lt;/ol>
&lt;h3 id="22-相关事宜">
2.2 相关事宜
&lt;a href="#22-%e7%9b%b8%e5%85%b3%e4%ba%8b%e5%ae%9c" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>访问你设置的 &lt;code>SELF_URL&lt;/code> 即可看到 Tiny Tiny RSS 的登陆页面，使用默认账户 &lt;code>admin&lt;/code>，密码 &lt;code>password&lt;/code> 登陆即可开始使用&lt;/p>
&lt;/li>
&lt;li>
&lt;p>如开启海外站点解锁支持，第一次冷启动需要等待 3-5 分钟才能完全启动所有组件。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>数据默认保存位置&lt;code>~/.docker/Database&lt;/code>（注意以执行 docker 命令的用户为准，如使用 root 账户执行，则文件位于 root 用户 home 目录）&lt;/p>
&lt;/li>
&lt;li>
&lt;p>默认情况下只有 TTRSS 和 Huginn 可以从外部访问，其他组件互相可以访问但不能直接从外部访问以提高安全性。组件间互相访问可以使用&lt;code>容器名+指定端口&lt;/code>，端口默认为 80，如&lt;code>http://rsshub/xxxxx&lt;/code>即可访问到 RSS Man X 内的监听 80 端口的 rsshub 实例。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>在 TTRSS 中将原来订阅的 &lt;code>https://rsshub.app/*&lt;/code> 更改为 &lt;code>http://rsshub/*&lt;/code> 即可使用 RSS Man X 内的自建 RSSHub 实例，并激活反反爬虫和海外源加速等功能&lt;/p>
&lt;/li>
&lt;li>
&lt;p>如无法访问 rsshub 的官方文档站点，可以使用我维护的反代站点&lt;a href="https://rsshub-doc.azure.colinx.one/">https://rsshub-doc.azure.colinx.one/&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>关于 ARM 平台的支持可查阅&lt;a href="https://github.com/Colin-XKL/RSSmanX/issues/5">置顶的 issue&lt;/a>，替换部分不支持 arm 架构的 docker 镜像为支持 arm 的镜像即可。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>RSS Man X 的除 lite 以外的版本默认包含了自托管的 mercury 实例，你只需要在插件配置页面设置 mercury 实例地址为 &lt;code>service.mercury:3000&lt;/code> 即可，同理，OpenCC 实例地址为&lt;code>service.opencc:3000&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>如果部分 RSS 源不能订阅，检查是否使用了非常规端口。在&lt;code>.env&lt;/code>文件中设置&lt;code>RSS_ALLOW_PORTS&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>若部署后某个应用一直无法通过浏览器访问，请检查是否绑定到了&lt;code>6000&lt;/code>/&lt;code>6666&lt;/code>等特殊端口，浏览器会拦截对这些端口的访问参见&lt;a href="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/">这里&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>ls&lt;/code>没有显示&lt;code>.env&lt;/code>文件是因为以点开头的文件在 Linux 中都是默认隐藏的，可以使用&lt;code>ls -a&lt;/code>查看到&lt;/p>
&lt;/li>
&lt;li>
&lt;p>vi/vim 编辑文本太麻烦可以尝试使用 nano&lt;/p>
&lt;/li>
&lt;li>
&lt;p>RSS Man 里所有容器绑定了服务器的/etc/localtime，使用&lt;code>sudo timedatectl set-timezone Asia/Shanghai&lt;/code> 设定系统的时区为上海后，容器里的时区也可以同步，这样日志里的时间就是东八区了&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>获取帮助&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>For Tiny tiny RSS problems:&lt;/strong>
&lt;a href="https://tt-rss.org/wiki.php">https://tt-rss.org/wiki.php&lt;/a>
&lt;a href="http://ttrss.henry.wang/">http://ttrss.henry.wang/&lt;/a>&lt;/li>
&lt;li>&lt;strong>For RSSHub problems:&lt;/strong>
&lt;a href="https://docs.rsshub.app/faq.html">https://docs.rsshub.app/faq.html&lt;/a>&lt;/li>
&lt;li>&lt;strong>For Huginn problems:&lt;/strong>
&lt;a href="https://github.com/huginn/huginn#readme">https://github.com/huginn/huginn#readme&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="23-链接">
2.3 链接
&lt;a href="#23-%e9%93%be%e6%8e%a5" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="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/">我的 RSS 方案与心得&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Colin-XKL/RSSmanX">RSS Man X GitHub repo&lt;/a>&lt;/li>
&lt;li>&lt;a href="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/">Huginn 指南：为任意网站制作 RSS&lt;/a>&lt;/li>
&lt;li>&lt;a href="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/">docker compose 的错误使用姿势&lt;/a>&lt;/li>
&lt;/ul></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>&lt;img src="https://cdn.jsdelivr.net/gh/Colin-XKL/RSSmanX/.github/logo.png" alt="logo">&lt;/p>
&lt;p>&lt;img src="https://img.shields.io/github/license/Colin-XKL/RSSmanX" alt="license">&lt;br>
&lt;img src="https://img.shields.io/github/v/release/Colin-XKL/RSSmanX" alt="release">&lt;/p>
&lt;p>&lt;a href="https://github.com/Colin-XKL/RSSmanX/blob/master/README-zh_cn.md">中文说明&lt;/a> ｜ &lt;a href="https://github.com/Colin-XKL/RSSmanX/">English&lt;/a>&lt;/p>
&lt;p>&lt;strong>RSSman X is a project that composed several useful services to help you build an excellent RSS experience.&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://github.com/Colin-XKL/RSSmanX">RSSman X&lt;/a> 基于 docker-compsoe 提供容器化 TTRSS 与 RSSHUB 等组件的一键部署，整合实用组件为你带来最佳 RSS 体验&lt;/p>
&lt;p>&lt;strong>Feature：简单一键部署，常用组件支持，自动更新支持，服务健康自检支持，海外站点 RSS 解锁&lt;/strong>&lt;/p>
&lt;h3 id="快速开始">
快速开始
&lt;a href="#%e5%bf%ab%e9%80%9f%e5%bc%80%e5%a7%8b" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>(若已安装 &lt;code>docker&lt;/code> 和 &lt;code>docker-compose&lt;/code>)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">mkdir RSSmanX &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> cd $_ &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> wget https://cdn.jsdelivr.net/gh/Colin-XKL/RSSmanX/docker-compose.yml &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> sudo docker-compose up -d
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="说明">
说明
&lt;a href="#%e8%af%b4%e6%98%8e" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>本项目旨在为 RSS 的同好提供一个方便地搭建自己的 RSS 服务的捷径。毕竟不是所有 RSS 爱好者都懂代码 😂。如果你想快速地搭建自己的 RSS 服务，能够有 RSS 订阅管理、RSS 在线阅读界面，进阶功能包括服务健康自检、海外站点 RSS 解锁等。希望订阅国内外的各大网站的 RSS 信息源又不想跟着网上漫天飞的教程瞎折腾的话，那么你可以使用本仓库的脚本快速完成安装部署。&lt;/p>
&lt;h3 id="不同版本中包含的组件说明">
不同版本中包含的组件说明
&lt;a href="#%e4%b8%8d%e5%90%8c%e7%89%88%e6%9c%ac%e4%b8%ad%e5%8c%85%e5%90%ab%e7%9a%84%e7%bb%84%e4%bb%b6%e8%af%b4%e6%98%8e" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>三个版本的&lt;code>docker-compose&lt;/code>文件对应不同的需求，包含的组件和服务有差异。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>组件/服务/功能名称&lt;/th>
&lt;th>标准版&lt;/th>
&lt;th>Lite 版&lt;/th>
&lt;th>Ultimate 版 ✨&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>TTRSS&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RSSHub&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Huginn&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mercury&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OpenCC&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Redis&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Browserless&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>数据持久化保存&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>容器自动更新&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>容器健康检查&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>海外站点加速&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>智能路由&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>不同组件的功能描述见文末。不同版本对应的配置文件如下：&lt;/p>
&lt;p>&lt;strong>标准版&lt;/strong>：&lt;code>docker-compose.yml&lt;/code>&lt;/p>
&lt;p>&lt;strong>Lite 版&lt;/strong>：&lt;code>docker-compose-lite.yml&lt;/code>&lt;/p>
&lt;p>&lt;strong>Ultimate 版&lt;/strong>：&lt;code>docker-compose-ultimate.yml&lt;/code>和&lt;code>config.yaml&lt;/code>&lt;/p>
&lt;p>选择对应版本下载到本地后都 compose 文件需要重命名为标准的&lt;code>docker-compose.yml&lt;/code>才可使用&lt;/p>
&lt;h2 id="安装说明">
安装说明
&lt;a href="#%e5%ae%89%e8%a3%85%e8%af%b4%e6%98%8e" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;h3 id="需求">
需求
&lt;a href="#%e9%9c%80%e6%b1%82" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>一台 Linux 系统的服务器&lt;/p>
&lt;blockquote>
&lt;p>本文以腾讯云 Ubuntu 18.04 系统的服务器为例，其他云服务商的没差，系统为 CentOS 的会有点差异&lt;/p>
&lt;/blockquote>
&lt;/li>
&lt;/ul>
&lt;h3 id="依赖项">
依赖项
&lt;a href="#%e4%be%9d%e8%b5%96%e9%a1%b9" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>docker&lt;/li>
&lt;li>docker-compose&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>安装 Docker&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">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 &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> &lt;span style="color:#e6db74">&amp;#34;deb [arch=amd64] https://download.docker.com/linux/ubuntu \
&lt;/span>&lt;span style="color:#e6db74"> &lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>lsb_release -cs&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74"> \
&lt;/span>&lt;span style="color:#e6db74"> stable&amp;#34;&lt;/span>
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>安装 docker-compose&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">sudo apt install docker-compose
&lt;/code>&lt;/pre>&lt;/div>&lt;p>完整文档参见 📕&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://docs.docker.com/engine/install/">https://docs.docker.com/engine/install/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.docker.com/compose/install/">https://docs.docker.com/compose/install/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="如何安装">
如何安装
&lt;a href="#%e5%a6%82%e4%bd%95%e5%ae%89%e8%a3%85" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>安装好了 &lt;code>docker&lt;/code> 和 &lt;code>docker-compose&lt;/code> 后可以执行文章开头的快速开始的指令。或者可以按照下面的步骤手动操作：&lt;/p>
&lt;ol>
&lt;li>确定安装好了 &lt;code>docker&lt;/code> 和 &lt;code>docker-compose&lt;/code>&lt;/li>
&lt;li>克隆本仓库/下载你所需要的版本的 compose 文件，注意修改文件名&lt;/li>
&lt;li>cd 进入文件夹，编辑&lt;code>docker-compose&lt;/code>文件，修改密码及 ttrss 的&lt;code>SELF_URL&lt;/code>处的值&lt;/li>
&lt;li>运行 &lt;code>sudo docker-compose up -d&lt;/code>&lt;/li>
&lt;li>等待程序跑完&lt;/li>
&lt;li>安装完成 ✅&lt;/li>
&lt;/ol>
&lt;h4 id="使用相关事宜">
使用相关事宜：
&lt;a href="#%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%85%b3%e4%ba%8b%e5%ae%9c" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h4>
&lt;ol>
&lt;li>访问你设置的&lt;code>SELF_URL&lt;/code>即可看到 Tiny Tiny RSS 的登陆页面，使用默认账户&lt;code>admin&lt;/code>，密码&lt;code>password&lt;/code>登陆即可开始使用。&lt;/li>
&lt;li>如开启海外站点解锁支持，第一次冷启动需要等待 3-5 分钟才能完全启动所有组件。&lt;/li>
&lt;li>数据保存位置 ~/.dockerData/Database/&lt;/li>
&lt;/ol>
&lt;p>详细配置和使用事宜请参考对应应用的文档说明。&lt;/p>
&lt;ul>
&lt;li>TTRSS 相关文档 &lt;a href="https://ttrss.henry.wang/">https://ttrss.henry.wang/&lt;/a>&lt;/li>
&lt;li>RSSHub 相关文档 &lt;a href="https://docs.rsshub.app/">https://docs.rsshub.app/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="功能模块介绍">
功能模块介绍
&lt;a href="#%e5%8a%9f%e8%83%bd%e6%a8%a1%e5%9d%97%e4%bb%8b%e7%bb%8d" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>&lt;strong>Tiny Tiny RSS&lt;/strong>
RSS 订阅管理与在线阅读工具&lt;/p>
&lt;p>&lt;strong>RSShub&lt;/strong>
生成国内大部分网站的 RSS 信息源，同时自部署可以访问到那些严格防爬的站点的源（知乎、微博等）&lt;/p>
&lt;p>&lt;strong>Huginn&lt;/strong>
高级 IFTTT 工具，你可以用生成任何 RSS 源，但使用门槛略高&lt;/p>
&lt;p>&lt;strong>Postgres&lt;/strong>
数据库，用于存储 RSS 文章数据等。比 MySQL 更轻，性能更好&lt;/p>
&lt;p>&lt;strong>OpenCC&lt;/strong>
简繁体转换，如果你订阅了一些繁体的 RSS 源，可以用它来将文章转为简体&lt;/p>
&lt;p>&lt;strong>Mercury&lt;/strong>
用于获取 RSS 全文&lt;/p>
&lt;p>&lt;strong>Browserless&lt;/strong>
用于获取常规方式无法获取的网站 RSS，为 RSSHub 的可选组件&lt;/p>
&lt;p>&lt;strong>Redis&lt;/strong>
提供缓存，提升性能，为 RSSHub 的可选组件&lt;/p>
&lt;p>&lt;strong>WatchTower&lt;/strong>
用于自动更新 RSShub 等组件，可以更好地支持新添加的源以及更快的获得 bug 修复&lt;/p>
&lt;p>&lt;strong>Clash&lt;/strong>
智能路由与正向代理工具，用于解锁海外站点及提供海外 RSS 源的加速&lt;/p>
&lt;h2 id="acknowledgement">
Acknowledgement
&lt;a href="#acknowledgement" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://tt-rss.org/">Tiny tiny RSS&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/BYVoid/OpenCC">OpenCC&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/postlight/mercury-parser">Mercury&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/huginn/huginn">Huginn&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/DIYgod/RSSHub">RSShub&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/HenryQW/Awesome-TTRSS">Awesome TTRSS&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="license">
License
&lt;a href="#license" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>GPL-3.0&lt;/p>
&lt;h2 id="changelogs">
Changelogs
&lt;a href="#changelogs" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>2020-07-07 v1.0 First release&lt;/li>
&lt;li>2020-07-14 v1.1 Update quick start shell script&lt;/li>
&lt;li>2020-10-05 v1.2 Fix wrong environment variable.&lt;/li>
&lt;li>2020-11-08 v1.3 TTRSS now can update feeds with ports except 80/443, and our self-hosted rsshub works again.&lt;/li>
&lt;li>2020-11-13 v1.4 Several updates includes security and performance enhancements.&lt;/li>
&lt;li>2020-11-24 v1.5 Lock the docker image version of some services to avoid unexpected errors.&lt;/li>
&lt;li>2021-05-08 v2.0 Add container network isolation, health check, global proxy, smart routing etc.&lt;/li>
&lt;/ul></description></item><item><title>Minecraft 上云笔记 - MC 自定义皮肤并支持联机</title><link>/posts/minecraft%E4%B8%8A%E4%BA%91%E7%AC%94%E8%AE%B0-mc%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%AE%E8%82%A4%E5%B9%B6%E6%94%AF%E6%8C%81%E8%81%94%E6%9C%BA/</link><pubDate>Mon, 22 Feb 2021 00:00:00 +0000</pubDate><guid>/posts/minecraft%E4%B8%8A%E4%BA%91%E7%AC%94%E8%AE%B0-mc%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%AE%E8%82%A4%E5%B9%B6%E6%94%AF%E6%8C%81%E8%81%94%E6%9C%BA/</guid><description>
&lt;!-- # Minecraft 上云笔记 - MC 自定义皮肤并支持联机 -->
&lt;p>方案概述：&lt;/p>
&lt;ul>
&lt;li>仪表盘 - 红石皮肤站
&lt;a href="https://mcskin.cn/user">https://mcskin.cn/user&lt;/a>&lt;/li>
&lt;li>[CSL] 万用皮肤补丁 (CustomSkinLoader) - MC 百科 | 最大的 Minecraft 中文 MOD 百科
&lt;a href="https://www.mcmod.cn/class/883.html">https://www.mcmod.cn/class/883.html&lt;/a>&lt;/li>
&lt;li>全员安装皮肤 mod，即可保证所有人都可以看见对方的皮肤&lt;/li>
&lt;/ul>
&lt;p>使用：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>安装好 forge&lt;/p>
&lt;/li>
&lt;li>
&lt;p>安装好皮肤补丁的 mod&lt;/p>
&lt;/li>
&lt;li>
&lt;p>启动一次 MC，让他自动生成配置文件&lt;/p>
&lt;/li>
&lt;li>
&lt;p>在皮肤站注册，并建立与游戏中角色名字相同的角色并设定皮肤&lt;/p>
&lt;/li>
&lt;li>
&lt;p>修改&lt;code>&amp;quot;.minecraft\CustomSkinLoader\CustomSkinLoader.json&amp;quot;&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-json" data-lang="json">{
&lt;span style="color:#f92672">&amp;#34;version&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;14.12&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;loadlist&amp;#34;&lt;/span>: [
{
&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;红石皮肤站&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;root&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://mcskin.cn/csl/&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;CustomSkinAPI&amp;#34;&lt;/span>
},
{
&lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Mojang&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;MojangAPI&amp;#34;&lt;/span>
},
&lt;span style="color:#960050;background-color:#1e0010">......&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>注意&lt;/strong>：&lt;/p>
&lt;p>自定义皮肤站最好排在 Mojang API 的前面，不然的话如果有正版用户起的角色名字和你的一样，就会默认载入他的皮肤（巨坑 +1）&lt;/p>
&lt;/blockquote>
&lt;/li>
&lt;/ol></description></item><item><title>Minecraft 上云笔记 - MC 服务器快速搭建&amp;MOD 推荐&amp;性能优化</title><link>/posts/minecraft%E4%B8%8A%E4%BA%91%E7%AC%94%E8%AE%B0-mc%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BAmod%E6%8E%A8%E8%8D%90%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/</link><pubDate>Sun, 07 Feb 2021 00:00:00 +0000</pubDate><guid>/posts/minecraft%E4%B8%8A%E4%BA%91%E7%AC%94%E8%AE%B0-mc%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BAmod%E6%8E%A8%E8%8D%90%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/</guid><description>
&lt;!-- # Minecraft 上云笔记 - MC 服务器快速搭建&amp;MOD 推荐&amp;性能优化 -->
&lt;blockquote>
&lt;p>MC 快速上云，学生机轻松带动，三五好友，畅快联机&lt;/p>
&lt;/blockquote>
&lt;h2 id="前言踩坑">
前言&amp;amp;踩坑
&lt;a href="#%e5%89%8d%e8%a8%80%e8%b8%a9%e5%9d%91" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>距离上一次玩 MC 已有四年之久，上次玩的时候还用的是家里的老爷机，连独显都没有，玩个整合包都费劲。如今设备早已更新换代，B 站不少做 MC 的 UP 主的内容挺有趣，于是尝试重新拾起 MC。&lt;/p>
&lt;p>手机端国内只有网易代理，APP 卡顿严重，生态封闭，体验奇差。安卓下载的国际服倒是还不错，不过身为基岩版，与 Java 版的生态并不相通。Github 上找到了可以让基岩版进 Java 版服务器的轮子，不过手机端连接服务器又是一个麻烦事。连接远程服务器又需要登录 Xbox，但是登上了连接的时候又出现奇怪的问题。&lt;/p>
&lt;p>贴吧有人给出解决方案，搭建 VPN，形成局域网，那样服务器会被视为局域网内开放的 MC 服务端。但天朝政策收紧，搭建 PPTP、L2TP 等隧道均未果，严重怀疑云服务商干扰了对应服务的端口。几番权衡决定投归 PC 端的 Java 版，生态丰富而且可以充分利用好硬件性能。&lt;/p>
&lt;h2 id="mc-服务器快速搭建">
MC 服务器快速搭建
&lt;a href="#mc-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%bf%ab%e9%80%9f%e6%90%ad%e5%bb%ba" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;h3 id="mc-服务端选择">
MC 服务端选择
&lt;a href="#mc-%e6%9c%8d%e5%8a%a1%e7%ab%af%e9%80%89%e6%8b%a9" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>物色了很多 MC 服务端，但看了下主要可用且被应用广泛的就两类，&lt;/p>
&lt;ol>
&lt;li>Spigot、PaperSpigot 这类加装插件的&lt;/li>
&lt;li>SpongeForge 这类可以加装 Mod 的&lt;/li>
&lt;/ol>
&lt;p>前者生态目测更丰富些，MCBBS 上的开服板块大部分都是 PaperSpigot 搭建的。但是好像都是那种几十上百人的公用服务器，什么权限控制、小游戏、防作弊的插件居多，而我只是想要一个能够装 Mod 的可以供三五好友方便联机的服务器。我的选择是后者&lt;/p>
&lt;h3 id="mc-服务器快速搭建-1">
MC 服务器快速搭建
&lt;a href="#mc-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%bf%ab%e9%80%9f%e6%90%ad%e5%bb%ba-1" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>搭建方案千千万，不过 Docker 来的最实在。Github 找到一个非常方便的镜像，&lt;a href="https://github.com/itzg/docker-minecraft-server">itzg/minecraft-server&lt;/a>。这个镜像是运行时构建的，会根据指定的环境变量下载和安装对应的 MC 服务端程序。支持的服务端有 Bukkit、Spigot、PaperSpigot、SpongeForge 等等，MC 的版本和各项参数均支持通过环境变量自定义，非常方便。而且可以通过更换不同的 Tag 来使用不同的 JDK 版本，从 8 到 15，Hotspot 和 OpenJ9 都有，可以按需选用。有 arm 版本，树莓派也可食用。&lt;/p>
&lt;p>安装 Docker 和 docker-compose 后，可以方便地编写脚本来快速启动一个 MC 服务器。这里放上我的&lt;code>docker-compose.yml&lt;/code>文件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="color:#f92672">version&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;3&amp;#34;&lt;/span>
&lt;span style="color:#75715e"># Forge with Sponge API support. THIS REQUIRES DOWNLOADING SPONGEFORGE.&lt;/span>
&lt;span style="color:#75715e"># Place the SpongeForge jar file in /data/mods. Other Forge mods go here as well.&lt;/span>
&lt;span style="color:#75715e"># Place Sponge mods in /data/mods/plugins. Yes, this is a directory inside the Forge mod directory. Do NOT use /data/plugins.&lt;/span>
&lt;span style="color:#f92672">services&lt;/span>:
&lt;span style="color:#f92672">minecraft&lt;/span>:
&lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">itzg/minecraft-server&lt;/span>
&lt;span style="color:#f92672">container_name&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;MCServer&amp;#34;&lt;/span>
&lt;span style="color:#f92672">ports&lt;/span>:
- &lt;span style="color:#e6db74">&amp;#34;25565:25565&amp;#34;&lt;/span>
&lt;span style="color:#f92672">volumes&lt;/span>:
- &lt;span style="color:#e6db74">&amp;#34;mc:/data&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 主要数据，包括存档数据等&lt;/span>
- &lt;span style="color:#e6db74">&amp;#34;~/.minecraft/forgemods/:/data/mods/&amp;#34;&lt;/span> &lt;span style="color:#75715e">#Forge Mod 位置&lt;/span>
&lt;span style="color:#75715e"># - &amp;#34;~/.minecraft/sponegemods/:/data/mods/plugins&amp;#34;&lt;/span>
- &lt;span style="color:#e6db74">&amp;#34;~/.minecraft/tmp/:/tmp&amp;#34;&lt;/span> &lt;span style="color:#75715e"># Forge 下载失败可以自己放进去&lt;/span>
- &lt;span style="color:#ae81ff">/etc/timezone:/etc/timezone:ro&lt;/span> &lt;span style="color:#75715e">#绑定本机的时区，方便看日志&lt;/span>
&lt;span style="color:#f92672">environment&lt;/span>:
&lt;span style="color:#f92672">SERVER_NAME&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;MCServer&amp;#34;&lt;/span>
&lt;span style="color:#f92672">EULA&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;TRUE&amp;#34;&lt;/span>
&lt;span style="color:#f92672">VERSION&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;1.12.2&amp;#34;&lt;/span> &lt;span style="color:#75715e">#(Ensure this is compatbile with the version of SpongeForge you are using!)&lt;/span>
&lt;span style="color:#f92672">TYPE&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;FORGE&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 这里以 SpongeForge 的服务端为例，其他服务端也支持&lt;/span>
&lt;span style="color:#f92672">FORGEVERSION&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;RECOMMENDED&amp;#34;&lt;/span>
&lt;span style="color:#75715e"># FORGEVERSION: &amp;#34;14.23.5.2854&amp;#34;&lt;/span>
&lt;span style="color:#f92672">CONSOLE&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;false&amp;#34;&lt;/span>
&lt;span style="color:#f92672">ENABLE_RCON&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;true&amp;#34;&lt;/span>
&lt;span style="color:#f92672">RCON_PASSWORD&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;mcserver&amp;#34;&lt;/span>
&lt;span style="color:#f92672">RCON_PORT&lt;/span>: &lt;span style="color:#ae81ff">28016&lt;/span>
&lt;span style="color:#f92672">INIT_MEMORY&lt;/span>: &lt;span style="color:#ae81ff">512M&lt;/span>
&lt;span style="color:#f92672">MAX_MEMORY&lt;/span>: &lt;span style="color:#ae81ff">1536M&lt;/span> &lt;span style="color:#75715e"># 内存根据实际需要修改&lt;/span>
&lt;span style="color:#f92672">OVERRIDE_SERVER_PROPERTIES&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;true&amp;#34;&lt;/span>
&lt;span style="color:#f92672">SNOOPER_ENABLED&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;false&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 统计数据&lt;/span>
&lt;span style="color:#f92672">VIEW_DISTANCE&lt;/span>: &lt;span style="color:#ae81ff">8&lt;/span> &lt;span style="color:#75715e">#加载区块范围，默认 10，建议 4~8&lt;/span>
&lt;span style="color:#f92672">SEED&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;-505794890&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 初始生成世界的种子&lt;/span>
&lt;span style="color:#f92672">PVP&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;true&amp;#34;&lt;/span>
&lt;span style="color:#f92672">ONLINE_MODE&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;FALSE&amp;#34;&lt;/span> &lt;span style="color:#75715e">#正版校验开关&lt;/span>
&lt;span style="color:#f92672">ALLOW_FLIGHT&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;FALSE&amp;#34;&lt;/span>
&lt;span style="color:#f92672">USE_AIKAR_FLAGS&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;false&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 一些优化&lt;/span>
&lt;span style="color:#f92672">RESOURCE_PACK&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://blog-1301127393.file.myqcloud.com/MC/Distribution/VNR-1.0.1.zip&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 我自己会用的资源包，这里填 url&lt;/span>
&lt;span style="color:#f92672">NETWORK_COMPRESSION_THRESHOLD&lt;/span>: &lt;span style="color:#ae81ff">512&lt;/span> &lt;span style="color:#75715e"># 网络优化&lt;/span>
&lt;span style="color:#f92672">restart&lt;/span>: &lt;span style="color:#ae81ff">unless-stopped&lt;/span>
&lt;span style="color:#f92672">rcon&lt;/span>:
&lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">itzg/rcon &lt;/span> &lt;span style="color:#75715e"># 服务器远程管理面板，具体使用自行百度&lt;/span>
&lt;span style="color:#f92672">container_name&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;RCON&amp;#34;&lt;/span>
&lt;span style="color:#f92672">depends_on&lt;/span>:
- &lt;span style="color:#ae81ff">minecraft&lt;/span>
&lt;span style="color:#f92672">ports&lt;/span>: &lt;span style="color:#75715e">#这两个端口都需要防火墙放行&lt;/span>
- &lt;span style="color:#e6db74">&amp;#34;3000:4326&amp;#34;&lt;/span> &lt;span style="color:#75715e"># Web UI&lt;/span>
- &lt;span style="color:#e6db74">&amp;#34;4327:4327&amp;#34;&lt;/span> &lt;span style="color:#75715e"># Connection from Web UI&lt;/span>
&lt;span style="color:#f92672">volumes&lt;/span>:
- &lt;span style="color:#e6db74">&amp;#34;rcon:/opt/rcon-web-admin/db&amp;#34;&lt;/span>
- &lt;span style="color:#ae81ff">/etc/timezone:/etc/timezone:ro&lt;/span>
&lt;span style="color:#f92672">environment&lt;/span>:
&lt;span style="color:#f92672">RWA_ENV&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;TRUE&amp;#34;&lt;/span>
&lt;span style="color:#f92672">RWA_ADMIN&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;TRUE&amp;#34;&lt;/span>
&lt;span style="color:#f92672">RWA_PASSWORD&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;mcadmin&amp;#34;&lt;/span>
&lt;span style="color:#f92672">RWA_RCON_HOST&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;MCServer&amp;#34;&lt;/span>
&lt;span style="color:#f92672">RWA_RCON_PASSWORD&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;mcserver&amp;#34;&lt;/span> &lt;span style="color:#75715e"># RCON server to control&lt;/span>
&lt;span style="color:#f92672">RWA_RCON_PORT&lt;/span>: &lt;span style="color:#ae81ff">28016&lt;/span>
&lt;span style="color:#f92672">restart&lt;/span>: &lt;span style="color:#ae81ff">unless-stopped&lt;/span>
&lt;span style="color:#f92672">volumes&lt;/span>:
&lt;span style="color:#f92672">mc&lt;/span>:
&lt;span style="color:#f92672">rcon&lt;/span>:
&lt;/code>&lt;/pre>&lt;/div>&lt;p>环境变量可以设置的地方非常多，可以到项目主页的 README 查看。https://github.com/itzg/docker-minecraft-server&lt;/p>
&lt;p>&lt;code>docker-compose up -d&lt;/code> 启动，第一次启动他会下载 MC、下载 MC 服务端、初始化世界。之后就可以在 MC 客户端连接了。（启动完毕就测试一下，测试没问题再进行后面安装 mod、服务器调优（按需）的步骤！）&lt;/p>
&lt;h2 id="mc-客户端安装">
MC 客户端安装
&lt;a href="#mc-%e5%ae%a2%e6%88%b7%e7%ab%af%e5%ae%89%e8%a3%85" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;h3 id="mc-启动器选择">
MC 启动器选择
&lt;a href="#mc-%e5%90%af%e5%8a%a8%e5%99%a8%e9%80%89%e6%8b%a9" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>（正版玩家略过，现在貌似正版购买的只支持官方启动器）&lt;/p>
&lt;p>对于服务器选择，MCBBS 有一篇讲的挺详细，可以到这里挑选：&lt;/p>
&lt;blockquote>
&lt;p>我的世界 Minecraft Java 版 下载指南 | 文件结构说明 | 推荐启动器 - 软件资源 - Minecraft(我的世界) 中文论坛 -
&lt;a href="https://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=38297&amp;amp;page=1#pid547821">https://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=38297&amp;amp;page=1#pid547821&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>我推荐的启动器：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>HMCL&lt;/strong>（力荐！跨平台、颜值高、功能完备，不过需要先装 Java)&lt;/li>
&lt;li>&lt;strong>BMCL&lt;/strong>（次推荐，颜值略低，基于.Net，功能完备）&lt;/li>
&lt;/ul>
&lt;p>我不推荐的启动器：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Nsiso&lt;/strong> （页面倒是做的漂亮，但是我装完 mod 启动竟然启动不了，兼容性或者说功能完备性欠缺，不知道后续版本如何。当时出问题之后我换 HMCL 就可以完美启动）&lt;/li>
&lt;/ul>
&lt;p>上一张 HMCL 的主页的图：&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205913.png" alt="image-20210129172401421">&lt;/p>
&lt;p>其他没有使用过的启动器暂时不予评价。&lt;/p>
&lt;h3 id="mc-本体安装">
MC 本体安装
&lt;a href="#mc-%e6%9c%ac%e4%bd%93%e5%ae%89%e8%a3%85" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>（正版玩家略过、整合包玩家略过）&lt;/p>
&lt;p>推荐方式为启动器内安装，还可以顺带把 Forge 和 OptiFine 也安装了。&lt;/p>
&lt;ul>
&lt;li>Forge：安装第三方 Mod 需要&lt;/li>
&lt;li>OptiFine：游戏显示调优，有些光影会需要。&lt;/li>
&lt;/ul>
&lt;p>版本选择的话，我的选择是 1.12.2。目前 Mod 支持比较完备，生态也很丰富。很多 Mod 最高只支持 1.12.2，目测是后面官方更新了 API 啥的。当然倾向于原版的同学可以选择更新的 1.16，后面的版本有很多有意思的更新。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>踩坑笔记&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>这些启动器大多带有三个下载源：官方服务器、MCBBS 镜像和 BMCL 镜像。不过我当时安装的时候 BMCL 的镜像抽风了，下载一直没进度。建议选择 MCBBS 的源（虽然可能部分内容更新没有很勤）&lt;/li>
&lt;li>通过启动器自动安装 OptiFine 的时候一直报错，换版本也是一样。后来的解决方案是选择窗口上方的【从本地文件安装/升级】&lt;/li>
&lt;/ol>
&lt;/blockquote>
&lt;h2 id="mod-推荐">
Mod 推荐
&lt;a href="#mod-%e6%8e%a8%e8%8d%90" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>针对我实际使用和测试的情况做一些推荐。下文所有 Mod 均在 1.12.2 下测试并实际使用过，兼容性良好。&lt;/p>
&lt;h3 id="功能增强型-mod客户端必装">
功能增强型 Mod（客户端必装）
&lt;a href="#%e5%8a%9f%e8%83%bd%e5%a2%9e%e5%bc%ba%e5%9e%8b-mod%e5%ae%a2%e6%88%b7%e7%ab%af%e5%bf%85%e8%a3%85" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>这部分 Mod 主要是部分音效和部分不涉及多人游戏的功能的增强，可以随意安装，装不装都不影响好友联机与进服务器。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Mod 名称&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>DynamicSurroundings&lt;/td>
&lt;td>动态环境音效，比如草地有蟋蟀的声音，夜晚有狼的声音，使游戏很有沉浸感&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SoundFilters&lt;/td>
&lt;td>环绕音效，使得 MC 里所有的声音更真实，比如矿洞里的脚步声会有回音，房子里面听外面的声音会更小等等&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>BetterHUD&lt;/td>
&lt;td>加强版的 HUD 信息显示，比如方位信息、坐标信息、时间信息、人物护甲、健康状态信息等等很多功能，而且可自定义程度也很高。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>JEI&lt;/td>
&lt;td>可以方便地查看物品的合成表，一般整合包必备的插件&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>JustEnoughCharacters&lt;/td>
&lt;td>JEI 的扩展，支持按拼音、简拼搜索物品&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Journeymap&lt;/td>
&lt;td>旅行地图，貌似已经停更，但是功能上没有什么欠缺。支持小地图显示、快速传送等。也是一般整合包必备的插件&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>InventoryTweaks&lt;/td>
&lt;td>按 R 键整理背包&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="功能增强型-mod服务端客户端都必装">
功能增强型 Mod（服务端&amp;amp;客户端都必装）
&lt;a href="#%e5%8a%9f%e8%83%bd%e5%a2%9e%e5%bc%ba%e5%9e%8b-mod%e6%9c%8d%e5%8a%a1%e7%ab%af%e5%ae%a2%e6%88%b7%e7%ab%af%e9%83%bd%e5%bf%85%e8%a3%85" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Mod 名称&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>FTB-Ultimine&lt;/td>
&lt;td>超级挖掘，挖矿、清理场地好帮手&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Doubledoors&lt;/td>
&lt;td>双开门可以一键开关，不用挨个点击开关啦&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OpenGlider&lt;/td>
&lt;td>滑翔翼，经济实用的交通工具&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Quark&lt;/td>
&lt;td>对原版 MC 的很多地方进行了一些加强，我最喜欢的是他增加了纸墙和纸灯笼这类物品，可以建造一些日系的建筑（文末有图）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>KeepingInventory&lt;/td>
&lt;td>死亡不掉落，不解释，小白福音&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="内容增强型-mod服务端客户端都必装">
内容增强型 Mod（服务端&amp;amp;客户端都必装）
&lt;a href="#%e5%86%85%e5%ae%b9%e5%a2%9e%e5%bc%ba%e5%9e%8b-mod%e6%9c%8d%e5%8a%a1%e7%ab%af%e5%ae%a2%e6%88%b7%e7%ab%af%e9%83%bd%e5%bf%85%e8%a3%85" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Mod 名称&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Natura&lt;/td>
&lt;td>添加了很多有意思的植物，整个世界变得生机勃勃，可以种樱花树，初期没食物还可以野外采蓝莓吃&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>MrCrayfish`s Vehicle Mod&lt;/td>
&lt;td>载具 Mod，可以在 MC 开车哦&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Animania&lt;/td>
&lt;td>动物谷，更多的小动物、更加真实的动物喂养与繁殖&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Twilightforest&lt;/td>
&lt;td>鼎鼎有名的暮色森林，不解释&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="谨慎选用的-mod">
谨慎选用的 Mod
&lt;a href="#%e8%b0%a8%e6%85%8e%e9%80%89%e7%94%a8%e7%9a%84-mod" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Mod 名称&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>LootBags&lt;/td>
&lt;td>击杀怪物得到战利品带，随机开出各种物品。不过你的箱子很快就会被一堆奇奇怪怪的东西堆满（比如我有一大箱无用的钻石马铠）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cuisine&lt;/td>
&lt;td>中文名烹饪工艺，国人作者开发的 Mod，挺有趣，很好地还原了做菜的过程，做完之后的菜会获得药水一样的效果。不过目测已经停更，而且没有很好的教程&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>注意&lt;/strong>：上面列举的所有 Mod 都是 Mod 本体，有些 Mod 的功能还依赖于其他 Mod，在安装时必须同时安装 Mod 本体和他依赖的 Mod。具体的依赖关系可以参考 mcmod.cn 上对 Mod 介绍页的 Mod 关系选项卡，CurseForge 的 Mod 介绍页的 Relation 选项卡。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>踩坑笔记&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>R 键整理的快捷键与 JEI 的部分功能冲突，可自行修改快捷键&lt;/li>
&lt;li>R 键整理对烹饪工艺中生产出来的菜品没辙&lt;/li>
&lt;li>推荐仅将 FTB-Ultimine 用于挖泥巴和挖沙，实际使用时可能会出现挖了矿不掉东西的情况┭┮﹏┭┮&lt;/li>
&lt;li>不要用铁镐、钻石镐开 FTB-Ultimine 挖东西！耐久掉的飞快&lt;/li>
&lt;li>DynamicSurroundings 可以在设置里按需屏蔽特定的声音，比如装上后发现我家所在的地形会有乌鸦叫，就很烦。屏蔽之后整个世界都好起来了&lt;/li>
&lt;li>DynamicSurroundings 与 Animania 有 bug，对 Animania 的某些特有生物进行交互时会触发找不到特定媒体资源的 bug，导致游戏崩溃，重新进入又会触发这个 bug，只有在进去的一瞬间用指令将玩家杀死才能勉强逃离这个无尽的循环（血泪的教训）（最新版本已修复）&lt;/li>
&lt;li>Animania 会对每个维度的世界进行注入，比较耗费资源。在同时安装虚无世界 AoA 的情况下，每次服务器启动 Animania 需要对其包含的二十多的世界维度进行注入，严重拖慢启动速度&lt;/li>
&lt;li>Quark 模组对 1.12 的 MC 只有 1.6 版本而没有后续版本的内容更新和 bug 修复。实际使用中有点吃性能&lt;/li>
&lt;/ol>
&lt;/blockquote>
&lt;h2 id="mc-服务器优化">
MC 服务器优化
&lt;a href="#mc-%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%bc%98%e5%8c%96" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;blockquote>
&lt;p>我使用的是 SpongeForge，因此只对一些通用的优化手段和原版服务器的一些参数做介绍。使用 Spigot 等的可以参考 MCBBS 的帖子进行更加深入的调优：&lt;/p>
&lt;p>Minecraft 服务器优化教程 —— 让多带 50% 的玩家不再是梦 - 联机教程 - Minecraft(我的世界) 中文论坛
&lt;a href="https://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=478126">https://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=478126&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>对于一台长期运行的 MC 服务器，我们需要关注的主要是下面几点&lt;/p>
&lt;h3 id="1-稳定性">
1. 稳定性
&lt;a href="#1-%e7%a8%b3%e5%ae%9a%e6%80%a7" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>要保证服务的稳定，我们需要防范的是&lt;strong>内在的崩溃&lt;/strong>和&lt;strong>外在的影响&lt;/strong>。&lt;/p>
&lt;p>&lt;strong>防止服务端程序自己崩溃&lt;/strong>的方法有：&lt;/p>
&lt;ul>
&lt;li>尽量使用稳定版的 MC 和稳定版的 Forge&lt;/li>
&lt;li>避免使用评分较低的 Mod&lt;/li>
&lt;li>加载大量 Mod 前先在本地做好测试，避免冲突，同时保障所有依赖项已安装好&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>避免外在影响致 MC 服务器崩溃&lt;/strong>的方法有：&lt;/p>
&lt;ul>
&lt;li>为 JVM 设置合适的内存限制，避免因&lt;code>OutOfMemory&lt;/code>导致 MC 服务端进程被系统杀掉&lt;/li>
&lt;li>开放的服务器最好限制下权限并封堵一些游戏内的漏洞，避免熊孩子炸服&lt;/li>
&lt;/ul>
&lt;h3 id="2-可维护性">
2. 可维护性
&lt;a href="#2-%e5%8f%af%e7%bb%b4%e6%8a%a4%e6%80%a7" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>这一项的话其实见仁见智，有些人可能只会开个服务器玩几个星期，有些人会开几年。如果只是短期玩的话麻烦点就麻烦点咯，但是要长期玩的话，注意一下服务器的可维护性后面可以减少很多时间和精力。&lt;/p>
&lt;p>我的建议有以下几点：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>使用 Docker&lt;/strong>。这样可以方便地进行服务的停启与迁移、升级。&lt;/li>
&lt;li>&lt;strong>使用 Docker-Compose&lt;/strong>并保存&lt;code>docker-coompose.yml&lt;/code>文件，这样你可以方便地更改一些参数而不用每次都输入一串长长的&lt;code>docker run&lt;/code>指令。&lt;/li>
&lt;li>&lt;strong>经常备份&lt;/strong>。数据无价。&lt;/li>
&lt;li>&lt;strong>尽量避免使用已经停止维护的 Mod&lt;/strong>。到时候要是出了奇怪的 Bug，你就只能含泪把这个 Mod 所有相关的内容从你的世界剥离。&lt;/li>
&lt;/ul>
&lt;h3 id="3-响应及时性">
3. 响应及时性
&lt;a href="#3-%e5%93%8d%e5%ba%94%e5%8f%8a%e6%97%b6%e6%80%a7" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>响应及时性也体现在几个方面：&lt;/p>
&lt;ul>
&lt;li>CPU 运算能力够强，复杂的时间（战斗、爆炸）等能很快地处理过来&lt;/li>
&lt;li>存储设备 IO 速度快，服务启动、区块加载可以非常迅速&lt;/li>
&lt;li>网络连接稳定、延迟低，波动小&lt;/li>
&lt;/ul>
&lt;p>上面三点可以通过堆硬件来实现。不过有没有不辛苦钱包又能提高游戏体验的方法呢？&lt;/p>
&lt;p>自然是有的。我们可以通过修改服务端程序的部分配置来实现。不过本质上是牺牲一小部分游戏体验换取一大部分游戏体验，就看你能忍受的牺牲的部分能有多少咯。&lt;/p>
&lt;p>MC 服务器的优化主要聚焦在两个地方&lt;/p>
&lt;ol>
&lt;li>MC 服务端程序的参数优化&lt;/li>
&lt;li>JVM 参数调优&lt;/li>
&lt;/ol>
&lt;h4 id="mc-服务端优化">
MC 服务端优化
&lt;a href="#mc-%e6%9c%8d%e5%8a%a1%e7%ab%af%e4%bc%98%e5%8c%96" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h4>
&lt;p>&lt;strong>VIEW_DISTANCE: 8&lt;/strong>&lt;/p>
&lt;p>这一项可以更改加载的&lt;strong>区块&lt;/strong>的数量。这个数值越大，就会加载更多的区块，占用的内存和 CPU 就会更多。这个数值过小可能会导致你家的作物不长以及怪物刷不出来，会显著影响游戏体验。减小这一项的数值可以显著减少内存和 CPU 占用。&lt;/p>
&lt;p>默认值 10，建议值 4~8。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>注意&lt;/strong>：1 个&lt;em>&lt;strong>区块&lt;/strong>&lt;/em>并不是指一个方块，而是指一个&lt;code>16*16&lt;/code>的区域。这个数值对可视区域的影响并不会很大，你可以放心地减小这个数值。这一项的值每减小 1，你的服务器每次就可以少计算​&lt;code>16*16*256&lt;/code>个方块&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>NETWORK_COMPRESSION_THRESHOLD: 512&lt;/strong>&lt;/p>
&lt;p>这一项的含义是对大于特定大小的数据包进行压缩。压缩会消耗一定量的 CPU 资源，不过可以减缓网络的压力。如果你的网络条件较差，可以减小这一项的数值。&lt;/p>
&lt;p>默认值：256&lt;/p>
&lt;h4 id="jvm-调优">
JVM 调优
&lt;a href="#jvm-%e8%b0%83%e4%bc%98" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h4>
&lt;blockquote>
&lt;p>首先需要声明的是，我不是 JVM 调参专业户，下文的数据也并不是严格的评测。结论并不严谨，仅仅从一个技术人员的视角出发，结合我实际的使用体验，给出的一些建议，供大家参考。&lt;/p>
&lt;/blockquote>
&lt;h5 id="当我们在讨论-jvm-调优时我们在谈论什么">
当我们在讨论 JVM 调优时，我们在谈论什么？
&lt;a href="#%e5%bd%93%e6%88%91%e4%bb%ac%e5%9c%a8%e8%ae%a8%e8%ae%ba-jvm-%e8%b0%83%e4%bc%98%e6%97%b6%e6%88%91%e4%bb%ac%e5%9c%a8%e8%b0%88%e8%ae%ba%e4%bb%80%e4%b9%88" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h5>
&lt;p>&lt;strong>垃圾回收&lt;/strong>（&lt;strong>G&lt;/strong>arbage &lt;strong>C&lt;/strong>ollection）一直以来都是众多 JVM 调优教程的核心所在。Java 运行于 VM 上，运行过程中不可避免的垃圾回收是最影响应用整体性能的存在。&lt;/p>
&lt;p>这里我们不去纠结那些新生代、老年代的划分、各种比率、各种单元的大小，我们只需要明白几点：&lt;/p>
&lt;ol>
&lt;li>不要觉得你比 JVM 的开发人员牛 X&lt;/li>
&lt;li>不要觉得网上各路 JVM 调参大神的方法就适用于你&lt;/li>
&lt;/ol>
&lt;p>众多顶级公司都在使用 Java，其母公司 Oracle 自然会招聘全球最优秀的一批开发人员去开发，所以**JVM 的大部分设置都是开箱即用的，默认最佳的。**在你不了解某一项参数的含义、不知道更改某一项配置的目的时，最好是不要做改动。&lt;/p>
&lt;p>其次，网络上大部分 JVM 的调优教程都是应对“面试造火箭”的，即便是以实际应用为主的 JVM 优化教程，人家那都是几十核几百 G 内存的机器，一秒钟要承担几百万的访问量，他们做优化的出发点、目标都&lt;strong>不一定适用于你。&lt;/strong>&lt;/p>
&lt;h5 id="明确优化目标">
明确优化目标
&lt;a href="#%e6%98%8e%e7%a1%ae%e4%bc%98%e5%8c%96%e7%9b%ae%e6%a0%87" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h5>
&lt;p>明确了上面两点我们可以开始着手进行优化了。&lt;/p>
&lt;p>首先需要明确你开 MC 服务器的机器是什么配置。以我的为例，我使用的是腾讯云的&lt;strong>1 核 2G 的云服务器&lt;/strong>，&lt;strong>带宽 2M&lt;/strong>，即峰值速度为 256k/s。&lt;/p>
&lt;p>其次需要知道你的优化目标。网络上大多数 JVM 的优化教程都是追求更低的响应时间，以便能够承载更多的并发访问。&lt;/p>
&lt;p>以我的情况为例：我开这个 MC 服务器的目的，只是希望能够与&lt;strong>不超过 5 个好友&lt;/strong>联机，玩带一些暮色森林这样的&lt;strong>Mod&lt;/strong>的 MC。&lt;/p>
&lt;p>搭建完服务器后，观察了了一段时间后发现，&lt;/p>
&lt;ul>
&lt;li>只有在 MC 服务器刚启动的时候 CPU 占用率会达到 100%，空载（没有玩家在线，后台没有高负荷任务）只有 2% 左右，两人联机时 CPU 平均负载在 30% 左右。&lt;/li>
&lt;li>加装了十几个 Mod 的情况下，空载占用 CPU 资源在 1G 左右，两人联机 1.4G 左右。&lt;/li>
&lt;li>只有在客户端刚进入的时候会跑满带宽，之后正常游戏时，每台客户端需要占用 10K/s 左右的带宽。&lt;/li>
&lt;li>联机游戏间或卡顿，但很快恢复&lt;/li>
&lt;li>查看日志发现空载时时竟然仍会&lt;code>can't keep up&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205922.png" alt="服务器在空载">&lt;/p>
&lt;p>那么以我的情况来看&lt;/p>
&lt;ul>
&lt;li>CPU 性能富余&lt;/li>
&lt;li>内存吃紧&lt;/li>
&lt;li>带宽够用&lt;/li>
&lt;/ul>
&lt;p>那么&lt;strong>我的优化目标&lt;/strong>就是：利用好 CPU 资源，尽力减少内存占用，以便为其他程序让路，并且为未来可能要添加的新 Mod 留出空间。&lt;/p>
&lt;h5 id="优化">
优化
&lt;a href="#%e4%bc%98%e5%8c%96" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h5>
&lt;p>JVM 优化的大头是 GC。网上吹的漫天飞的 G1GC 的确有他的可取之处，一些腐竹的测试数据也表明其实际效果优秀。但是在我的案例中，使用 G1GC 是有问题的：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>G1GC 天生是为了现代互联网应用环境而设计的&lt;/strong>，需要开很多个线程协同来完成垃圾回收工作。他适用于多核处理器 + 大内存机器上的高负荷运算。而我的服务器是单核，内存也并不富裕。&lt;/li>
&lt;li>&lt;strong>多线程的 GC 模式跑在单核机器上&lt;/strong>时出现的问题就是：单核机器无法并行处理多个任务，其本质上只是在多个任务之间快速切换，来实现各个任务基本“实时”“并行”运行。但是线程之间的切换是有代价的，&lt;strong>性能损耗积少成多&lt;/strong>。&lt;/li>
&lt;li>&lt;strong>G1GC 追求在延迟可控的情况下达到更高的吞吐量&lt;/strong>。但他的**代价是&lt;a href="https://segmentfault.com/q/1010000021658061">更多的内存占用&lt;/a>。**小内存机器并不适合使用 G1GC。&lt;/li>
&lt;/ul>
&lt;p>物色了一番，我最终选择换用 Serial GC 代替原本的 G1GC。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Serial（-XX:+UseSerialGC）&lt;/strong>&lt;/p>
&lt;p>从名字我们可以看出，这是一个串行收集器。&lt;/p>
&lt;p>Serial 收集器是 Java 虚拟机中最基本、历史最悠久的收集器。在 JDK1.3 之前是 Java 虚拟机新生代收集器的唯一选择。目前也是 ClientVM、ServerVM 4 核 4GB 以下机器默认垃圾回收器。Serial 收集器并不是只能使用一个 CPU 进行收集，而是当 JVM 需要进行垃圾回收的时候，需暂停所有的用户线程，直到回收结束。&lt;/p>
&lt;/blockquote>
&lt;h5 id="优化前后对比">
优化前后对比
&lt;a href="#%e4%bc%98%e5%8c%96%e5%89%8d%e5%90%8e%e5%af%b9%e6%af%94" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h5>
&lt;ol>
&lt;li>优化前 MC 服务器的资源占用情况&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205932.jpg" alt="360 截图 20210129163301881">&lt;/p>
&lt;ol start="2">
&lt;li>SERIAL GC (1 ONLINE)&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205936.png" alt="image-20210202194034351">&lt;/p>
&lt;ol start="3">
&lt;li>进一步对 mod 优化后，2 online&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205939.png" alt="image-20210202221554906">&lt;/p>
&lt;h5 id="其他优化方法">
其他优化方法
&lt;a href="#%e5%85%b6%e4%bb%96%e4%bc%98%e5%8c%96%e6%96%b9%e6%b3%95" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h5>
&lt;p>更换 GC 只是众多优化方法中的一种，其他的诸如换用 OpenJ9 虚拟机也可以有不错的效果，可惜的是 Forge 对其的支持并不友好，只得作罢。还有启用指针压缩也可以获得不错的性能提升，不过 JDK6_u23 之后 &lt;code>UseCompressedOops&lt;/code> 就已经被默认启用了，使用新版本 Java 基本不用关注这方面的优化了。&lt;/p>
&lt;h2 id="写在最后">
写在最后
&lt;a href="#%e5%86%99%e5%9c%a8%e6%9c%80%e5%90%8e" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>晒几张图&lt;/p>
&lt;p>我家：&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205942.png" alt="屏幕截图 (13)">&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205946.png" alt="屏幕截图 (16)">&lt;/p>
&lt;p>我安装的光影 Sildurs Vibrant Shaders v1.281 High 效果图&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205949.png" alt="屏幕截图 (12)">&lt;/p>
&lt;p>Better HUD + 旅行地图效果图&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205953.png" alt="屏幕截图 (17)">&lt;/p>
&lt;h2 id="参考推荐阅读">
参考&amp;amp;推荐阅读
&lt;a href="#%e5%8f%82%e8%80%83%e6%8e%a8%e8%8d%90%e9%98%85%e8%af%bb" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>大家最推荐用哪种联机方式玩 Minecraft？ - 知乎
&lt;a href="https://www.zhihu.com/question/54048310">https://www.zhihu.com/question/54048310&lt;/a>&lt;/li>
&lt;li>View Distance: optimize your Minecraft server
&lt;a href="https://mtxserv.com/article/12535/view_distance_optimize_your_minecraft_server">https://mtxserv.com/article/12535/view_distance_optimize_your_minecraft_server&lt;/a>&lt;/li>
&lt;li>Minecraft 服务器优化教程 —— 让多带 50% 的玩家不再是梦 - 联机教程 - Minecraft(我的世界) 中文论坛
&lt;a href="https://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=478126">https://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=478126&lt;/a>&lt;/li>
&lt;li>itzg/docker-minecraft-server: Docker image that provides a Minecraft Server that will automatically download selected version at startup
&lt;a href="https://github.com/itzg/docker-minecraft-server">https://github.com/itzg/docker-minecraft-server&lt;/a>&lt;/li>
&lt;li>jvm G1 垃圾收集器有什么缺点？ - SegmentFault 思否
&lt;a href="https://segmentfault.com/q/1010000021658061">https://segmentfault.com/q/1010000021658061&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Win 10 配置 C 语言环境的正确姿势</title><link>/posts/win-10%E9%85%8D%E7%BD%AEc%E8%AF%AD%E8%A8%80%E7%8E%AF%E5%A2%83%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF/</link><pubDate>Sun, 27 Dec 2020 00:00:00 +0000</pubDate><guid>/posts/win-10%E9%85%8D%E7%BD%AEc%E8%AF%AD%E8%A8%80%E7%8E%AF%E5%A2%83%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF/</guid><description>
&lt;!-- # Win 10 配置 C 语言环境的正确姿势 -->
&lt;blockquote>
&lt;p>本系列教程旨在为刚入门的编程语言学习者做好指南工作，开始编码，本应很简单&lt;/p>
&lt;p>The PAINLESS way to start coding!&lt;/p>
&lt;/blockquote>
&lt;p>VC6.0 太古老，Dev C++ 没补全不友好，MinGW 安装太烦恼？&lt;/p>
&lt;p>你用着最新的电脑，最新的系统，却在用着上个世纪的软件开始你人生第一门编程课？&lt;/p>
&lt;p>你需要这篇指南：&lt;strong>在现代化的硬件和平台上使用现代化工具学习 C 语言&lt;/strong>&lt;/p>
&lt;p>&lt;em>aka&lt;/em>：&lt;strong>Win10 配置 C 语言环境的正确姿势&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>截止 2020 年末，Win10 配置 C 语言环境的常见方案有：&lt;/p>
&lt;ul>
&lt;li>使用 scoop 来便捷地安装所需的环境&lt;/li>
&lt;li>使用 Winget 来安装所需的环境 &lt;em>[不成熟]&lt;/em>&lt;/li>
&lt;li>使用国内镜像 Cygwin+VSCode 配置 C 语言环境【快速】&lt;/li>
&lt;li>使用 WSL+VSCode&lt;/li>
&lt;li>使用 WSL+Clion&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;p>综合考虑可行性与小白友好性，我们推荐的方案是：&lt;/p>
&lt;h2 id="使用国内镜像-cygwinvscode-快速配置-c-语言环境">
使用国内镜像 Cygwin+VSCode 快速配置 C 语言环境
&lt;a href="#%e4%bd%bf%e7%94%a8%e5%9b%bd%e5%86%85%e9%95%9c%e5%83%8f-cygwinvscode-%e5%bf%ab%e9%80%9f%e9%85%8d%e7%bd%ae-c-%e8%af%ad%e8%a8%80%e7%8e%af%e5%a2%83" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>C 语言编写的&lt;code>.c&lt;/code>源代码文件需要通过编译器编译生成可执行文件&lt;code>.exe&lt;/code>后才能运行。Windows 系统默认没有自带 C 语言的编译器，这里我们需要手动下载配置才行。&lt;/p>
&lt;p>C 语言编译器在 Win 平台下的选择多种多样，但要么配置麻烦，使用门槛高；要么就是下载源在国外，国内下载慢如龟，甚至直接下不成。这里给出基于国内镜像 Cygwin+VSCode 配置 C 语言环境的方案，&lt;strong>实测可用，步骤清晰易懂，国内网络也可在几分钟内配置好！&lt;/strong>&lt;/p>
&lt;h3 id="编译器的下载与配置">
编译器的下载与配置
&lt;a href="#%e7%bc%96%e8%af%91%e5%99%a8%e7%9a%84%e4%b8%8b%e8%bd%bd%e4%b8%8e%e9%85%8d%e7%bd%ae" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>Cygwin 的下载安装分为两个部分：&lt;/p>
&lt;ol>
&lt;li>Cygwin 安装程序的下载（～1MB）&lt;/li>
&lt;li>安装器来完整后续的编译器核心部分的安装（～100MB）&lt;/li>
&lt;/ol>
&lt;h4 id="cygwin-的下载安装">
Cygwin 的下载安装
&lt;a href="#cygwin-%e7%9a%84%e4%b8%8b%e8%bd%bd%e5%ae%89%e8%a3%85" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h4>
&lt;p>Cygwin 的安装程序可以&lt;a href="https://cygwin.com/install.html">从其官方站点下载&lt;/a>。不过站点为全英文且国内访问速度堪忧，这里给出快速下载链接&lt;/p>
&lt;blockquote>
&lt;p>Cygwin 安装程序&lt;strong>快速下载&lt;/strong>（不限速，免登陆）&lt;/p>
&lt;p>&lt;a href="https://wws.lanzous.com/iUpUKjojq5i">https://wws.lanzous.com/iUpUKjojq5i&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>下载完以后，双击打开，进入下图的界面&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164821.png" alt="image-20201224235413884" style="zoom:50%;" />
&lt;p>点击下一步，选择第一项，从网络下载并安装&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164829.png" alt="image-20201224235436360" style="zoom:50%;" />
&lt;p>如果让你选择安装路径的话，可以不用改，不过默认在 C 盘。自己改的话，一个尽量避免使用中文路径，还有一个就是要记住你自己自定义的路径，后面会用到。&lt;/p>
&lt;p>网络好的话，点击下一步会出来一个可用的国内镜像列表，那样的话随便选一个都可以直接进行后面的步骤。&lt;/p>
&lt;p>网络条件不好的情况下，半分钟以内就会报错说网络连接失败。不过不用担心，接下来可以自己填写国内镜像地址。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164833.png" alt="image-20201224235644342" style="zoom:50%;" />
&lt;p>在 User URL 的输入框输入&lt;code>https://mirrors.tuna.tsinghua.edu.cn/cygwin/&lt;/code>并点击 Add 添加。之后点击下一步继续。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164836.png" alt="image-20201224235719679" style="zoom:50%;" />
&lt;p>之后会进入一个选择界面。这里选择要安装的组件。我们只需要 C 语言的编译器，这里在搜索框内输入&lt;code>gcc&lt;/code>，然后在下方找到&lt;code>gcc-core&lt;/code> 和 &lt;code>gcc-g++&lt;/code>，点击右侧的三角形打开下拉菜单，选择 9 开头的版本。如下图所示。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164839.png" alt="image-20201225000518139" style="zoom:50%;" />
&lt;p>选择完成后，一路点击下一步安装。如果出现如下的警告信息，直接用默认的设置，点下一步继续就可以了。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164842.png" alt="image-20201225000604625" style="zoom:50%;" />
&lt;p>一般一到两分钟之内就可以下载完毕。如果过了很久还没有装完，要么是网络太垃圾，要么就是不小心勾了其他的软件，一直在安装。。。&lt;/p>
&lt;h4 id="配置-cygwin">
配置 Cygwin
&lt;a href="#%e9%85%8d%e7%bd%ae-cygwin" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h4>
&lt;p>下面要更改环境变量。如果你之前没有自定义安装目录的话，默认路径&lt;code>C:\cygwin64\bin&lt;/code>。否则下文对应的地方使用你自定义的目录。&lt;/p>
&lt;p>在开始菜单中找到&lt;code>Windows系统&lt;/code> - 控制面板。如果这里没有的话，按&lt;code>Windows徽标键&lt;/code>+&lt;code>S&lt;/code>可以呼出搜索面板，可以在此搜索控制面板菜单项。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164856.png" alt="image-20201227152139118" style="zoom:50%;" />
&lt;p>在控制面板主页找到系统与安全。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164859.png" alt="image-20201227152347064">&lt;/p>
&lt;p>或者如果你的控制面板打开不是上面的布局而是下面这种布局的话，找到系统菜单。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164903.png" alt="image-20201227152420458">&lt;/p>
&lt;p>进入如下的页面，点击高级系统设置。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164910.png" alt="image-20201225001127874" style="zoom:50%;" />
&lt;p>切换到高级选项卡，点击下方的环境变量菜单&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164913.png" alt="image-20201225000925342" style="zoom:50%;" />
&lt;p>在用户变量中，点击&lt;code>Path&lt;/code>，点击下方编辑按钮进行编辑&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164916.png" alt="image-20201225000949291" style="zoom:50%;" />
&lt;p>输入 Cygwin 安装路径下的 bin 目录。如果你之前没有自定义安装路径，直接设置如图即可。否则设置为你自定义的路径。&lt;/p>
&lt;p>&lt;strong>注意：这一步只要添加这一个就好&lt;/strong>，不要看我截图里面的很干净，就把其他的都删了&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164919.png" alt="image-20201225001045854" style="zoom:50%;" />
&lt;p>一路点击确定。修改完之后重启下电脑确保改动生效。&lt;/p>
&lt;p>在 PowerShell 中或者命令提示符中输入 gcc 并回车。如果显示 no input files 则表示安装成功。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164921.png" alt="image-20201225001234917" style="zoom:50%;" />
&lt;h3 id="配置编辑器">
配置编辑器
&lt;a href="#%e9%85%8d%e7%bd%ae%e7%bc%96%e8%be%91%e5%99%a8" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>安装完了编译器，可以先来 Hello world 了&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164924.png" alt="image-20201225001723920">&lt;/p>
&lt;p>按住 Shift 键，右键点击文件夹空白处，会出现在此处打开 Powershell 窗口的选项。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164932.png" alt="image-20201225001744160" style="zoom:50%;" />
&lt;p>&lt;code>gcc hello.c&lt;/code> 命令就会在当前目录下生成一个 exe 可执行文件。如果要指定文件名，可以&lt;code>gcc hello.c -o hello.exe&lt;/code>&lt;/p>
&lt;p>输入&lt;code>./hello.exe&lt;/code>即可执行该 exe 文件。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227164937.png" alt="image-20201225002338213">&lt;/p>
&lt;p>如果直接双击 exe 也可以，不过运行窗口会一闪而过，解决方案是在 main 函数末尾，return 语句前，加一句 getchar()。&lt;/p>
&lt;h2 id="配置-vscode-的作为-c-语言学习环境">
配置 VSCode 的作为 C 语言学习环境
&lt;a href="#%e9%85%8d%e7%bd%ae-vscode-%e7%9a%84%e4%bd%9c%e4%b8%ba-c-%e8%af%ad%e8%a8%80%e5%ad%a6%e4%b9%a0%e7%8e%af%e5%a2%83" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>VSCode 是由微软主导开发的一款开源免费、轻巧简单、功能强大的代码编辑器。配合各式各样的插件可以方便地实现各种你想得到和你想不到的功能。&lt;/p>
&lt;p>前往&lt;a href="https://code.visualstudio.com/">VSCode 官网&lt;/a>下载 Windows 版 VScode。并按照安装程序的指引进行安装。&lt;/p>
&lt;p>直接下载链接&lt;/p>
&lt;p>&lt;a href="https://code.visualstudio.com/sha/download?build=stable&amp;amp;os=win32-x64-user">https://code.visualstudio.com/sha/download?build=stable&amp;amp;os=win32-x64-user&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>如果下载速度太慢可以考虑如下方案。&lt;/p>
&lt;p>原下载链接：&lt;/p>
&lt;p>&lt;a href="https://az764295.vo.msecnd.net/stable/ea3859d4ba2f3e577a159bc91e3074c5d85c0523/VSCodeUserSetup-x64-1.52.1.exe">https://az764295.vo.msecnd.net/stable/ea3859d4ba2f3e577a159bc91e3074c5d85c0523/VSCodeUserSetup-x64-1.52.1.exe&lt;/a>&lt;/p>
&lt;p>将开头的 az764295.vo.msecnd.net 替换掉，如下。&lt;/p>
&lt;p>&lt;a href="https://vscode.cdn.azure.cn/stable/ea3859d4ba2f3e577a159bc91e3074c5d85c0523/VSCodeUserSetup-x64-1.52.1.exe">https://vscode.cdn.azure.cn/stable/ea3859d4ba2f3e577a159bc91e3074c5d85c0523/VSCodeUserSetup-x64-1.52.1.exe&lt;/a>&lt;/p>
&lt;p>速度直接起飞！&lt;/p>
&lt;/blockquote>
&lt;p>打开安装包进行安装，无脑下一步即可。不顾最后的页面可以考虑全部钩上。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165016.png" alt="image-20201227155805507" style="zoom:50%;" />
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165019.png" alt="image-20201227155937465" style="zoom:50%;" />
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165022.png" alt="image-20201227160036085">&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165026.png" alt="image-20201227160129001">&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165029.png" alt="image-20201227160209263">&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165032.png" alt="image-20201227160939375" style="zoom:50%;" />
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165035.png" alt="image-20201227161003478" style="zoom:50%;" />
&lt;p>在输入栏中，在当前选项卡为&lt;strong>用户&lt;/strong>的情况下，输入&lt;code>run&lt;/code>并按回车进行搜索。修改&lt;code>Run in Terminal&lt;/code>和 &lt;code>Save File Before Run&lt;/code>的设置项。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165038.png" alt="image-20201227161205762" style="zoom:50%;" />
&lt;p>完成了上述的设置，我们就可以来编写 C 语言的程序了。&lt;/p>
&lt;h3 id="helloc">
Hello，C！
&lt;a href="#helloc" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>点击左侧第一个按钮，来到文件管理面板。点击打开文件夹按钮，打开一个空白的文件夹（任意文件夹都可以，只是保存你代码的地方，一般一个干净整洁的新文件夹为宜）&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165059.png" alt="image-20201227163528187" style="zoom:50%;" />
&lt;p>打开文件夹后，在空白处单击右键，新建一个文件，文件名输入为&lt;code>hello.c&lt;/code>&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165107.png" alt="image-20201227164010460">&lt;/p>
&lt;p>点击右上角的三角形按钮即可自动编译运行你的 C 语言代码。在窗口下方的终端即可看到输出的&lt;code>Hello,C!&lt;/code>字样。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201227165112.png" alt="image-20201227164041803" style="zoom:50%;" />
&lt;h3 id="完成">
完成✅
&lt;a href="#%e5%ae%8c%e6%88%90" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>现在，开始你的 C 语言学习之旅吧！&lt;/p></description></item><item><title>Mac 平台配置 C/Python/Java 学习环境</title><link>/posts/mac%E5%B9%B3%E5%8F%B0%E9%85%8D%E7%BD%AE%E5%AD%A6%E4%B9%A0%E7%8E%AF%E5%A2%83/</link><pubDate>Fri, 18 Dec 2020 00:00:00 +0000</pubDate><guid>/posts/mac%E5%B9%B3%E5%8F%B0%E9%85%8D%E7%BD%AE%E5%AD%A6%E4%B9%A0%E7%8E%AF%E5%A2%83/</guid><description>
&lt;!-- # Mac 平台配置 C/Python/Java 学习环境 -->
&lt;blockquote>
&lt;p>本系列教程旨在为刚入门的编程语言学习者做好指南工作，开始编码，本应很简单&lt;/p>
&lt;p>The PAINLESS way to start coding!&lt;/p>
&lt;/blockquote>
&lt;h2 id="配置-c-语言环境">
配置 C 语言环境
&lt;a href="#%e9%85%8d%e7%bd%ae-c-%e8%af%ad%e8%a8%80%e7%8e%af%e5%a2%83" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>下面以 clang+VSCode+CodeRunner 为例，搭建一个简单的 C 语言学习环境。&lt;/p>
&lt;h3 id="检查编译器支持">
检查编译器支持
&lt;a href="#%e6%a3%80%e6%9f%a5%e7%bc%96%e8%af%91%e5%99%a8%e6%94%af%e6%8c%81" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>C 语言的编译需要编译器，一般可以选择 gcc 或是 clang。Mac 系统默认安装了 clang 同时兼容了 gcc 的指令。在终端中进行查看：&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015258.png" alt="screenshot">&lt;/p>
&lt;p>输入&lt;code>gcc -v&lt;/code>指令测试 gcc 命令是否可用并查看其版本，由上图输出可以看到，该命令可用，版本信息显示的则是 clang 的信息。一般来说，刚学习 C 语言无需关注两者的异同。&lt;/p>
&lt;h3 id="配置-vscode">
配置 VSCode
&lt;a href="#%e9%85%8d%e7%bd%ae-vscode" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>&lt;span id="vscode">VSCode&lt;/span>是由微软主导开发的一款开源免费、轻巧简单、功能强大的代码编辑器。配合各式各样的插件可以方便地实现各种你想得到和你想不到的功能。&lt;/p>
&lt;p>前往&lt;a href="https://code.visualstudio.com/">VSCode 官网&lt;/a>下载 Mac 版 VScode。并按照安装程序的指引进行安装。&lt;/p>
&lt;p>如果下载速度太慢，可以参考&lt;a href="https://zhuanlan.zhihu.com/p/112215618">这篇文章&lt;/a>。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015416.png" alt="截屏 2020-12-18 22.20.00">&lt;/p>
&lt;p>安装完毕后，打开会看到如下图所示的界面。默认界面为英文，下面对其进行汉化并安装一些必要的插件。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015546.png" alt="截屏 2020-12-18 22.21.59">&lt;/p>
&lt;p>单击方形图标，打开扩展面板。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015621.png" alt="image-20201218223234296" style="zoom:50%;" />
&lt;p>搜索&lt;code>chinese&lt;/code>安装汉化插件。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015622.png" alt="image-20201218222747511">&lt;/p>
&lt;p>搜索&lt;code>code runner&lt;/code>安装 Code Runner 插件。并按指示重启应用（Reload 字样）&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015620.png" alt="image-20201218222511011" style="zoom:50%;" />（截图中因为本地已安装故只显示了 Uninstall 卸载按钮。未安装的情况下会显示 Install 按钮可点击安装）&lt;/p>
&lt;p>其他插件可根据需要安装。此处推荐安装 C/C++ 插件以实现 C 代码的高亮和补全等功能。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015624.png" alt="image-20201218223432859" style="zoom:50%;" />
&lt;p>重启后进入应用，界面自动切换到中文。再点击扩展图标，展开扩展列表，在已安装扩展中找到&lt;strong>Code Runner&lt;/strong>，点击齿轮图标展开菜单，点击进入扩展设置。&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015627.png" alt="image-20201218224215676" style="zoom:50%;" />&lt;/p>
&lt;p>在输入栏中，在当前选项卡为&lt;strong>用户&lt;/strong>的情况下，输入&lt;code>run&lt;/code>并按回车进行搜索。修改&lt;code>Run in Terminal&lt;/code>和 &lt;code>Save File Before Run&lt;/code>的设置项。&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015626.png" alt="image-20201218224059150" style="zoom:50%;" />&lt;/p>
&lt;p>完成了上述的设置，我们就可以来编写 C 语言的程序了。&lt;/p>
&lt;h3 id="helloc">
Hello，C！
&lt;a href="#helloc" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>点击左侧第一个按钮，来到文件管理面板。点击打开文件夹按钮，打开一个空白的文件夹（任意文件夹都可以，只是保存你代码的地方，一般一个干净整洁的新文件夹为宜）&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
&lt;p>打开文件夹后，在空白处单击右键，新建一个文件，文件名输入为&lt;code>hello.c&lt;/code>&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
&lt;p>键入代码。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015628.png" alt="image-20201218224343393">&lt;/p>
&lt;p>点击右上角的三角形按钮即可自动编译运行你的 C 语言代码。在窗口下方的终端即可看到输出的&lt;code>Hello,C!&lt;/code>字样。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219021631.png" alt="image-20201219021624927">&lt;/p>
&lt;h3 id="完成">
完成✅
&lt;a href="#%e5%ae%8c%e6%88%90" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>现在，开始你的 C 语言学习之旅吧！&lt;/p>
&lt;h2 id="配置-python-语言学习环境">
配置 Python 语言学习环境
&lt;a href="#%e9%85%8d%e7%bd%ae-python-%e8%af%ad%e8%a8%80%e5%ad%a6%e4%b9%a0%e7%8e%af%e5%a2%83" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;h3 id="检查-python-环境">
检查 Python 环境
&lt;a href="#%e6%a3%80%e6%9f%a5-python-%e7%8e%af%e5%a2%83" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>Mac 系统会自带有 Python 环境。在终端中输入 python 并回车。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015630.png" alt="截屏 2020-12-18 22.54.54">&lt;/p>
&lt;p>可以看到系统已经安装有 Python，但是显示版本为 2.7。现在的主流版本是 Python3，Python2 与 Python3 的语法并不兼容。&lt;/p>
&lt;p>在&lt;code>&amp;gt;&amp;gt;&amp;gt;&lt;/code>后面键入&lt;code>exit()&lt;/code>退出 python2 的交互程序。再次在终端输入&lt;code>python3&lt;/code>&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015634.png" alt="image-20201218231954777">&lt;/p>
&lt;p>此时显示的版本为 3.8.6。&lt;/p>
&lt;h3 id="hello-python">
Hello, Python!
&lt;a href="#hello-python" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>在交互式命令行界面，我们可以直接输入 python 语句并执行。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219021016.png" alt="截屏 2020-12-18 23.00.54">&lt;/p>
&lt;p>一句一句地输入代码再执行显然太低效了。我们需要一个趁手的代码编辑器。&lt;/p>
&lt;p>下面以 VSCode 为例。&lt;/p>
&lt;p>&lt;strong>VSCode 的下载和基本配置&lt;/strong>请参考上文 C 语言环境配置中 VSCode 的配置环节。&lt;/p>
&lt;p>完成基本的设置后，来安装 Python 的专属插件，以实现 Python 代码的高亮、补全等功能。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015633.png" alt="image-20201218230442930">&lt;/p>
&lt;p>点击左侧第一个按钮，来到文件管理面板。点击打开文件夹按钮，打开一个空白的文件夹（任意文件夹都可以，只是保存你代码的地方，一般一个干净整洁的新文件夹为宜）&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
&lt;p>打开文件夹后，在空白处单击右键，新建一个文件，文件名输入为&lt;code>hello.py&lt;/code>&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
&lt;p>键入代码。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015631.png" alt="截屏 2020-12-18 22.58.44">&lt;/p>
&lt;p>点击右上角的三角形按钮开始运行我们编写的代码&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015632.png" alt="截屏 2020-12-18 23.00.54">&lt;/p>
&lt;p>可以看到，窗口下方的终端中已经出现了&lt;code>Hello,Python!&lt;/code>字样。代码运行成功。&lt;/p>
&lt;h3 id="完成-1">
完成✅
&lt;a href="#%e5%ae%8c%e6%88%90-1" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>现在，开始你的 Python 语言学习之旅吧！&lt;/p>
&lt;h2 id="配置-java-语言学习环境">
配置 Java 语言学习环境
&lt;a href="#%e9%85%8d%e7%bd%ae-java-%e8%af%ad%e8%a8%80%e5%ad%a6%e4%b9%a0%e7%8e%af%e5%a2%83" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;h3 id="安装-jdk">
安装 JDK
&lt;a href="#%e5%ae%89%e8%a3%85-jdk" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>Mac OS 并没有内置 Java 语言的支持，需要我们另外安装。&lt;/p>
&lt;p>直接在终端输入&lt;code>java&lt;/code>，系统会提示 Java 未安装并跳转到 Oracle 官方的下载页面。在官网下载会强制要求你注册并登陆 Oracle 账户，网站连接缓慢且步骤繁琐。此处我们到清华大学的 TUNA 开源软件镜像站下载相关软件。&lt;/p>
&lt;p>首先到 TUNA 开源软件镜像站，来到&lt;a href="https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/">AdoptOpenJDK 的下载页面&lt;/a>。在列表中找到你需要的版本，点击进入后依次选择处理器架构和平台。&lt;/p>
&lt;p>此处以 Java 11 为例，其 Mac OS 下安装程序的下载地址为&lt;a href="https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/11/jdk/x64/mac/OpenJDK11U-jdk_x64_mac_hotspot_11.0.9.1_1.pkg">https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/11/jdk/x64/mac/OpenJDK11U-jdk_x64_mac_hotspot_11.0.9.1_1.pkg&lt;/a>。需要其他版本的也可以自行选择。&lt;/p>
&lt;blockquote>
&lt;p>自行选择时请注意：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>jre 只是 java 运行环境，并不包括对 java 代码的编译功能。下载时请认准&lt;strong>jdk&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>选择处理器架构时，传统 Intel 内核 Mac 请选择&lt;strong>x86&lt;/strong>，对于 M1 内核的 Mac，截止本文写作，暂无相关支持，请关注后续更新。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>最内层下载资源的列表中，jdk 的资源文件名会有&lt;code>hotspot&lt;/code>和 &lt;code>openj9&lt;/code>两种字样。Java 入门请选择&lt;code>hotspot&lt;/code>，文件后缀名请选择&lt;code>.pkg&lt;/code>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;p>下载完成后点击打开，出现如下的安装界面。根据指引完成安装。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015635.png" alt="image-20201218232011039">&lt;/p>
&lt;p>安装完成后，在终端中输入&lt;code>java -version&lt;/code>并回车确认。看到如下输出说明已经正确安装且 Java 的版本为&lt;code>11.0.9.1&lt;/code>即 Java 11.&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015640.png" alt="image-20201218235233365">&lt;/p>
&lt;p>下面来为 Java 的学习配置一个趁手的代码编辑器，以 VSCode 为例。&lt;/p>
&lt;h3 id="为-java-语言学习配置-vscode">
为 Java 语言学习配置 VSCode
&lt;a href="#%e4%b8%ba-java-%e8%af%ad%e8%a8%80%e5%ad%a6%e4%b9%a0%e9%85%8d%e7%bd%ae-vscode" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>&lt;strong>VSCode 的下载和基本配置&lt;/strong>请参考上文 C 语言环境配置中 VSCode 的配置环节。&lt;/p>
&lt;p>完成基本的设置后，来安装 Java 的专属插件，以实现 Java 代码的高亮、补全等功能。&lt;/p>
&lt;p>在左侧扩展面板的搜索栏中搜索&lt;code>java&lt;/code>，选择&lt;code>Language Support for Java&lt;/code>并安装。&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015641.png" alt="image-20201218235514041" style="zoom:50%;" />
&lt;p>点击左侧第一个按钮，来到文件管理面板。点击打开文件夹按钮，打开一个空白的文件夹（任意文件夹都可以，只是保存你代码的地方，一般一个干净整洁的新文件夹为宜）&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015623.png" alt="image-20201218230901008" style="zoom:50%;" />
&lt;p>打开文件夹后，在空白处单击右键，新建一个文件，文件名输入为&lt;code>hello.java&lt;/code>&lt;/p>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015629.png" alt="image-20201218224536077" style="zoom:50%;" />
&lt;p>键入代码。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015639.png" alt="image-20201218235213233">&lt;/p>
&lt;p>可以看到，在窗口下方的终端面板中，已经成功出现了**Hello, Java!**字样，代码运行成功。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015637.png" alt="截屏 2020-12-19 00.05.33">&lt;/p>
&lt;h3 id="完成-2">
完成✅
&lt;a href="#%e5%ae%8c%e6%88%90-2" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>至此，Mac 平台下的 Java 语言学习环境配置完毕，开始你的 Java 学习之旅吧！&lt;/p>
&lt;h2 id="常见问题">
常见问题
&lt;a href="#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;h3 id="1-java-扩展安装弹出提示-jdk-版本过低">
1. Java 扩展安装弹出提示 JDK 版本过低
&lt;a href="#1-java-%e6%89%a9%e5%b1%95%e5%ae%89%e8%a3%85%e5%bc%b9%e5%87%ba%e6%8f%90%e7%a4%ba-jdk-%e7%89%88%e6%9c%ac%e8%bf%87%e4%bd%8e" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20201219015638.png" alt="image-20201218234917588" style="zoom:50%;" />
&lt;p>这是因为插件内置的一些功能需要 Java 来运行，而这些功能又依赖于一些较新的特性，这些特性最早出现在 Java 11 中。为了更好地学习和使用 Java，这里推荐安装 Java 11 或 Java 12。网站教程或学校授课常常以 Java 8 为例，但对于初学者来说，几者无太大区别，Java 8 的代码都可以被很好地支持。&lt;/p></description></item><item><title>云服务器入门指南</title><link>/posts/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/</link><pubDate>Sun, 15 Mar 2020 00:00:00 +0000</pubDate><guid>/posts/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/</guid><description>
&lt;!-- # 云服务器入门指南 -->
&lt;h2 id="前言">
前言
&lt;a href="#%e5%89%8d%e8%a8%80" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>各大厂商持续发力云计算，上云的门槛也越来越低。获取云服务器的门槛越来越低，但是真正使用好云服务器的难度一直都很高。本文旨在为新上云的小白提供方向性的指引并引导入坑  : )&lt;/p>
&lt;h2 id="云服务器相关的几个概念">
云服务器相关的几个概念
&lt;a href="#%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9b%b8%e5%85%b3%e7%9a%84%e5%87%a0%e4%b8%aa%e6%a6%82%e5%bf%b5" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;h3 id="服务器的操作系统">
服务器的操作系统
&lt;a href="#%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>主要分为两大阵营：Windows Server 和 Linux Server。前者一般自带可视化界面，基本兼容平时使用的 exe 程序，某种程度上也可以作为“云电脑”使用。后者一般不自带图形化界面，操作都通过特定命令完成，上手难度较高，但配置各种开发环境、安装各类高级工具比 win 平台更容易。没有 Linux 基础的用户建议先在本地建立虚拟机练习。&lt;/p>
&lt;p>Linux Server 主要的两个阵营为 Debian 系、RedHat 系。主要的发行版&lt;/p>
&lt;ul>
&lt;li>Debian 系：Debian, Ubuntu&lt;/li>
&lt;li>RedHat 系：RedHat, CentOS, Fedora&lt;/li>
&lt;/ul>
&lt;p>对于初学者来说，最明显的区别在于前者使用 &lt;code>apt install xxx&lt;/code>  来安装软件，而后者是通过 &lt;code>yum install xxx&lt;/code>  来安装。&lt;/p>
&lt;h3 id="公网-ip">
公网 IP
&lt;a href="#%e5%85%ac%e7%bd%91-ip" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>IP 可以理解为一台设备在互联网世界中的门牌号和地址，相当于知道某个具体的地址就能发快递包裹。IP 分为公网 IP 和内网 IP。顾名思义，内网 IP 一般用于公司或学校内部。一般来说，只知道一台设备的内网 IP 的情况下并不能准确定位这台设备，就类似于只知道你的朋友的名字，并不能直接给他寄快递，你必须要知道他学校/单位/家的地址才行。&lt;/p>
&lt;p>服务器拥有公网 IP 的好处在于，你可以直接通过这个 IP 定位到你的服务器，相当于你的服务器在互联网世界中拥有了响当当的名号，只要说出这个名号，互联网世界的公民都能知道他，给他发消息。&lt;/p>
&lt;p>&lt;em>*此处公网内网 IP 的叙述仅适用于 IPv4 地址。更多关于 IPv4 地址和 IPv6 地址的相关信息参见文末扩展阅读。&lt;/em>&lt;/p>
&lt;h3 id="端口">
端口 
&lt;a href="#%e7%ab%af%e5%8f%a3" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>端口的英文为 port，有港口的意思。一般来说，一台设备不同的端口运行着不同的服务，我们可以很好的控制特定端口的开放与关闭，从而控制不同的服务是否对外开放，正如开放一个通商口岸。常见的服务端口有 &lt;code>HTTP  80&lt;/code>   &lt;code>HTTPS  443&lt;/code>   &lt;code>DNS  53&lt;/code>   &lt;code>SSH 22&lt;/code>  &lt;/p>
&lt;p>一个服务也可能不是仅仅通过一个端口提供服务，他可能会将一个大的功能拆分为几个子功能，通过不同的端口与外界通讯。如 FTP，SMB 等。你可以通过关闭指定端口来详细控制特定服务。当然如果你想想外面提供像 FTP 这样通过多个端口与外界通讯的端口，就要注意要确保他使用的所有端口都要设置为开放才能保证外界的正常访问。&lt;/p>
&lt;p>&lt;em>*FTP 是一种文件传输协议，你可以在某些电影资源的下载链接里看见以 &lt;code>ftp://&lt;/code>  开头的链接。这说明这个电影资源是存放在某个 FTP 服务器上。&lt;/em>
&lt;em>*关于 FTP、SMB 的端口使用及配置参见文末扩展阅读&lt;/em>&lt;/p>
&lt;h3 id="防火墙">
防火墙
&lt;a href="#%e9%98%b2%e7%81%ab%e5%a2%99" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>防火墙（Firewall）某种程度上是控制本机与外界通讯的工具。下面以几个具体的实例来介绍下防火墙：&lt;/p>
&lt;ul>
&lt;li>你的服务器建了个网站，需要向外提供 HTTP 服务，那么你需要在防火墙中设置开放 80 端口，允许其他所有 IP 访问。&lt;/li>
&lt;li>公司有一台服务器搭载了一个仅面向公司员工的网站，希望仅允许公司内的员工访问。而公司内员工的内网 IP 个格式为 192.168.&lt;em>.&lt;/em>，那么就可以在防火墙中设置，仅允许来自 IP 为 192.168.*.*的设备访问这台服务器的 80 端口，其他一律禁止&lt;/li>
&lt;li>近期互联网上流行一种病毒 X 通过计算机的 1234 端口感染其他机器。那么为了保护本机不受病毒影响，你可以在防火墙中设置关闭 1234 端口，禁止任何来源访问 1234 端口，从而将病毒 X 阻挡在防火墙外。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>注意：对于云服务器来说，可能会存在多重防火墙。一般 Linux 系统自身会有一套防火墙（firewalld/ufw 等），云服务商会有一套网络防火墙（一般为网络安全组/网络访问控制等）&lt;/strong>&lt;/p>
&lt;h3 id="几种远程连接方式对比">
几种远程连接方式对比
&lt;a href="#%e5%87%a0%e7%a7%8d%e8%bf%9c%e7%a8%8b%e8%bf%9e%e6%8e%a5%e6%96%b9%e5%bc%8f%e5%af%b9%e6%af%94" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:center">&lt;strong>连接方式&lt;/strong>&lt;/th>
&lt;th style="text-align:center">SSH&lt;/th>
&lt;th style="text-align:center">VNC&lt;/th>
&lt;th style="text-align:center">RDP&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:center">&lt;strong>支援平台&lt;/strong>&lt;/td>
&lt;td style="text-align:center">Linux，Mac OS，BSD&amp;hellip;，Win 需额外安装软件&lt;/td>
&lt;td style="text-align:center">Linux,Win,Mac OS,iOS,Android 等，基本所有都需额外软件 *&lt;/td>
&lt;td style="text-align:center">Win 自带，其他需额外安装软件&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">&lt;strong>易用性&lt;/strong>&lt;/td>
&lt;td style="text-align:center">★&lt;/td>
&lt;td style="text-align:center">★★★&lt;/td>
&lt;td style="text-align:center">★★★*&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">&lt;strong>可视化界面&lt;/strong>&lt;/td>
&lt;td style="text-align:center">否&lt;/td>
&lt;td style="text-align:center">是&lt;/td>
&lt;td style="text-align:center">是&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">&lt;strong>网络要求&lt;/strong>&lt;/td>
&lt;td style="text-align:center">极低&lt;/td>
&lt;td style="text-align:center">高&lt;/td>
&lt;td style="text-align:center">较高&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">&lt;strong>配置难度&lt;/strong>&lt;/td>
&lt;td style="text-align:center">★&lt;/td>
&lt;td style="text-align:center">★★★&lt;/td>
&lt;td style="text-align:center">★★&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>1 部分 Linux 发行版自带 VNC 连接，不过大部分需手动启用&lt;/li>
&lt;li>2 RDP 连接对于同为 Win 的机器更为容易，对于平台不一样的情况，配置比较麻烦&lt;/li>
&lt;/ul>
&lt;h2 id="快速入门须知">
快速入门须知
&lt;a href="#%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8%e9%a1%bb%e7%9f%a5" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>当你拥有了一台属于自己的云服务器，你发现面对复杂的控制台手足无措，不知道怎么连接，不知道能拿来干什么。那么你可以参考一下的步骤。&lt;strong>下文仅适用于 Linux Server &amp;amp; 有一点点 Linux 操作经验的选手&lt;/strong>。&lt;/p>
&lt;h3 id="开启-ssh-远程连接">
开启 SSH 远程连接
&lt;a href="#%e5%bc%80%e5%90%af-ssh-%e8%bf%9c%e7%a8%8b%e8%bf%9e%e6%8e%a5" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;h4 id="服务器端设置">
服务器端设置
&lt;a href="#%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%ab%af%e8%ae%be%e7%bd%ae" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h4>
&lt;p>1.首先，登陆你的账户，打开云服务器的控制台，开机（不解释）  
2.定位到你的云服务器，一般新的账户只有一台云服务器实例，点击其菜单，找到远程连接选项  
3.接下来会打开一个网页端的黑框，根据其提示，设置实例密码等等。这里记录你的系统用户名和密码。
4.一般网页端会有提示，根据具体情况开启 SSH 服务，设置允许 root 权限远程登录。具体的操作因平台和操作系统不同而不同，此处不再赘述。
5.现在到服务器菜单里找到网络设置/防火墙设置/网络安全组设置，点击进入，&lt;strong>开启服务器 22 端口的访问权限&lt;/strong>。&lt;/p>
&lt;p>接下来在你的电脑上配置 SSH 远程访问。 &lt;/p>
&lt;h4 id="本地电脑设置">
本地电脑设置
&lt;a href="#%e6%9c%ac%e5%9c%b0%e7%94%b5%e8%84%91%e8%ae%be%e7%bd%ae" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h4>
&lt;p>1.1 Win10 用户和 Linux 用户、Mac OS 用户一般系统会预装 ssh 客户端。打开 CMD 命令控制符/PowerShell，输入 ssh 回车看是否有反应。&lt;strong>如果没有提示 xxx 找不到，可以直接到步骤 2.1&lt;/strong>。&lt;/p>
&lt;p>1.2 如果没有反应，你需要到 设置 - 应用 - 可选功能 中，安装 SSH 客户端。&lt;/p>
&lt;p>1.3 Windows 其他版本用户需要安装第三方 SSH 客户端。这里推荐使用 Putty。&lt;/p>
&lt;p>2.1 接下来使用 &lt;code>ssh 你的用户名@你的服务器IP&lt;/code> 来连接到你的服务器。注意&lt;strong>At 符号@前后没有空格，输完回车确认&lt;/strong>。正常情况下可以成功连接到。&lt;/p>
&lt;p>2.2 如果出现 Permission denied，可能的原因有&lt;code>用户名密码错误&lt;/code> / &lt;code>未开启root账户远程登录&lt;/code>。&lt;/p>
&lt;p>2.3 如果出现 Connection time out，则大概率是你&lt;code>IP地址填写错误&lt;/code>，也有可能是你的&lt;code>服务器没开机&lt;/code>/ &lt;code>你的服务器系统没有默认开启ssh服务 &lt;/code>/ &lt;code>防火墙未放行22端口&lt;/code>。&lt;/p>
&lt;p>排查相关问题请带上相关关键字去搜索引擎搜索。&lt;/p>
&lt;h3 id="安装软件">
安装软件
&lt;a href="#%e5%ae%89%e8%a3%85%e8%bd%af%e4%bb%b6" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;h4 id="安装软件的命令及常见问题">
安装软件的命令及常见问题
&lt;a href="#%e5%ae%89%e8%a3%85%e8%bd%af%e4%bb%b6%e7%9a%84%e5%91%bd%e4%bb%a4%e5%8f%8a%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h4>
&lt;p>参见上文介绍操作系统的部分。不过具体安装的时候，经常会遇到的问题为安装需要 root 权限。一般来说，日常使用时为了安全期间，我们不会直接用 root 账户进行操作。通常的做法为创建一个普通的账户，当执行需要高权限的指令时在命令前加上 sudo，或是使用 &lt;code>su root&lt;/code>  来临时切换为 root 用户*，并输入密码来进行二次确认，以确保安全性。此处涉及到的操作有：  &lt;/p>
&lt;ul>
&lt;li>添加一个普通用户 ( &lt;code>useradd NEWUSERNAME&lt;/code>  /  &lt;code>adduser NEWUSERNAME&lt;/code>  )&lt;/li>
&lt;li>设置新用户的密码  ( &lt;code>passwd USERNAME&lt;/code>  )&lt;/li>
&lt;li>将新用户添加到 sudoers 的列表中  ( 修改 &lt;code>/etc/sudoers&lt;/code>  ) &lt;/li>
&lt;/ul>
&lt;p>具体操作可以以  &lt;code>操作系统名称+操作关键字&lt;/code>  为关键字在搜索引擎中自行搜索详细教程。&lt;/p>
&lt;p>&lt;em>*临时切换为 root 用户，执行完命令后，记得用 exit 命令退出 root 账户&lt;/em>&lt;/p>
&lt;h4 id="镜像源的设置">
镜像源的设置
&lt;a href="#%e9%95%9c%e5%83%8f%e6%ba%90%e7%9a%84%e8%ae%be%e7%bd%ae" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h4>
&lt;p>执行完上述命令，当你尝试安装一个软件时，如果你云服务器提供商没有为你的系统进行“优化”的话，你会发现安装软件的速度非常慢。这是因为这些 Linux 系统基本都是由国外的厂商/组织进行开发，安装软件时需要到位于国外的服务器获取数据，你的网络请求可能会跨越大半个地球，网络速度也随着传输距离的增加不断减小*。国内有很多组织建立了公益性质的镜像站点，我们可以将安装程序的软件源设置为位于国内的镜像站点以大大提高软件安装下载的速度。
国内的镜像站点有&lt;strong>阿里云镜像站&lt;/strong>、&lt;strong>清华大学 tuna 镜像站&lt;/strong>、&lt;strong>中国科学技术大学开源镜像站&lt;/strong>等。这些站点提供多种主流 Linux 发行版的软件安装源的镜像。不同操作系统更换软件源的操作有所不同，可以到以上镜像站点中查找特定系统更换软件源的详细步骤。&lt;/p>
&lt;p>&lt;em>*请注意此处叙述并不准确，与一个站点通信的速度取决于很多因素。&lt;/em>&lt;/p>
&lt;h4 id="常用工具的安装">
常用工具的安装
&lt;a href="#%e5%b8%b8%e7%94%a8%e5%b7%a5%e5%85%b7%e7%9a%84%e5%ae%89%e8%a3%85" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h4>
&lt;p>更换好了软件源后，我们就可以愉快的安装软件了。你可以尝试安装一下 &lt;code>screenfetch&lt;/code>  的软件包进行测试，安装完成后输入 &lt;code>screenfetch&lt;/code>  命令，他会在你的屏幕上输出字符画形式的系统图标和系统配置信息。&lt;/p>
&lt;p>部分 Linux 发行版可能并没有预置很多的软件包，你可以根据自己的需要进行安装，如文本编辑工具 &lt;code>nano&lt;/code>  &lt;code>vim&lt;/code>  等*。C 编译工具 &lt;code>gcc&lt;/code>  ,C++ 编译工具 &lt;code>g++&lt;/code>  ，Java 开发组件 &lt;code>openjdk&lt;/code>  等。&lt;/p>
&lt;p>&lt;em>*推荐初学者使用易于上手的 &lt;code>nano&lt;/code>  文本编辑器。大部分 Linux 发行版都有预置。&lt;/em>&lt;/p>
&lt;h2 id="初级玩法">
初级玩法
&lt;a href="#%e5%88%9d%e7%ba%a7%e7%8e%a9%e6%b3%95" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>搭建 Wordpress 网站&lt;/strong>：为服务器安装好基础设施，部署 wordpress 服务。参见 &lt;a href="https://help.aliyun.com/document_detail/50774.html?spm=a2c4g.11186623.6.1134.26fc7ed9zbIv5a">服务器 LAMP 部署&lt;/a>，&lt;a href="https://segmentfault.com/a/1190000013035065">Wordpress 搭建&lt;/a>&lt;/li>
&lt;li>&lt;strong>作为远程开发环境&lt;/strong>：  &lt;a href="https://www.jianshu.com/p/0f2fb935a9a1">VSCode 进行远程开发&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="其他高级玩法">
其他高级玩法
&lt;a href="#%e5%85%b6%e4%bb%96%e9%ab%98%e7%ba%a7%e7%8e%a9%e6%b3%95" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>参见：&lt;a href="https://www.zhihu.com/question/40854395">知乎问答：自己拥有一台服务器可以做哪些很酷的事情？&lt;/a>&lt;/p>
&lt;h2 id="扩展阅读">
扩展阅读
&lt;a href="#%e6%89%a9%e5%b1%95%e9%98%85%e8%af%bb" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://zhuanlan.zhihu.com/p/36542469">IPv6 是什么？&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.jianshu.com/p/016ee3b7ff97">CentOS7 firewall 开放服务 / 端口&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://linux.cn/article-8087-1.html">在 Ubuntu 中用 UFW 配置防火墙&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.wpdaxue.com/make-your-wordpress-site-faster.html">让你的 WordPress 网站更快的 16 条建议&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.cnblogs.com/xiaohh/p/4789813.html">FTP 主动模式和被动模式的区别&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.5yun.org/15466.html">Samba 服务使用的端口和协议&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>