基于 Frp 的一系列更新

Posted by Xiphoray on May 23, 2024

事情的起因是益达获得了公司的免费 VPS 额度,于是他就贡献出来供我们搭建 Frp 服务。而我则因为苦旧树莓派性能久已,于是接下了重围淘汰下来的一台华硕 UN66 迷你主机。借助着软硬件大升级,我的互联网拓展之旅又迎来了大更新。

点亮硬件

除了 UN66,我又额外买了一条 128G 的固态硬盘和一条 8G 的 DDR4 内存条。等硬件都到齐后,经过简单的装配,设备顺利进入 Bios 界面。

接下来就是漫长的 Ubuntu 安装过程了,步骤也是单纯无趣,就不赘述了。说是简单无趣,但其实我第一次装的时候遇到了引导报错,完全进不去系统,只得又重新装了一次。

当 SSH 成功登录上系统,基础部分就完成了,接下来就是软件百花齐放的时刻。

噢,而外提一嘴,当我按以前的旧套路准备将镜像源更新为国内的时候,竟然发现现在 Ubuntu 出厂就自带了国内清华的镜像源,着实是提高了不少体验感。

Frp 内网穿透 & 博客搭建

相关资料已经在 树莓派 + Jekyll + Frp 建站经历 一文中有详细的介绍了。

cockpit

cockpit 是一个 Linux 的 Web 管理面板,对于远程管理 Linux 来说及其方便。

使用 APT 包管理器安装 cockpit 本体和官方组件

sudo apt install cockpit
sudo apt install cockpit-machines cockpit-podman

以及一些第三方组件:

curl -sSL https://repo.45drives.com/setup | sudo bash
sudo apt update

sudo apt install cockpit-navigator
sudo apt install cockpit-file-sharing
sudo apt install cockpit-identities 
  • navigator 是一个文件浏览器,可以当图像界面一样直接查看系统内的文件;
  • file sharing 可以管理 Samba 和 NFS 文件共享;
  • identities 可以管理系统内的用户和组。

这时候通过 9090 端口,就能在局域网内打开 Web 控制面板了。

但是想要通过外网域名访问,则需要另外做一些操作。

首先则是搭建 Frp 通道,在原来的 frpc.ini 后面加上相应的模块,cockpit 默认端口为 9090

[cockpit]
type = http
local_port = 9090
custom_domains = yourcockpitdomain.com

重启 Frp 服务,通过 yourcockpitdomain.com 就能成功访问到 Web 控制面板了。

但此时若要登录,则会弹出认证失败的报错,还需要继续配置。

用习惯的文本编辑器,在 /etc/cockpit/ 目录中打开或创建 cockpit.conf 文件:

sudo vim /etc/cockpit/cockpit.conf

在文件中添加以下文本:

[WebService]
Origins = https://yourcockpitdomain.com https://127.0.0.1:9090
ProtocolHeader = X-Forwarded-Proto
AllowUnencrypted = true

保存文件,重启 Cockpit Web 控制台以使更改生效:

sudo systemctl try-restart cockpit 

这样一来,就大功告成了。

注意:更改完此项之后,将无法使用内网 IP 登陆 Cockpit web 管理面板,如需使用内网登陆,需将此项删除掉。

alist

alist 是一个云盘系统,十分重要的一点是,它不仅可以挂载本地的文件,还支持互联网上的各类云盘。这意味着,我可以绕开云盘限速的设置,近乎满速使用各类云盘。

安装甚是简单,直接运行官方脚本即可:

curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install

同步将 Frp 也配置好,就能直接外网访问了,alist 默认端口为 5244:

[alist-a]
type = http
local_port = 5244
custom_domains = youralistdomain.com

这里若是名称也用 alist,会报名称冲突,也许是安装的时候哪里占用了,所以这里改成 alist-a

登录之后可以配置各类网盘,这些在官网里都有详细教程。

syncthing

我搭建 alist 是因为有两个需求,其中一个需求就是希望能够随时随地查看我的一些照片。

我同步照片原来的工作流是这样的:先把最新的照片从相机下载到电脑里,然后用同步软件同步到我的备份移动盘里。

有了 alist,我就将工作流延申了一步:将备份移动盘的图片单向同步到迷你主机上,方便我通过 alist 来访问。

于是我找到了 syncthing 这款同步软件。它的优点是,可以提前分析本地的文件情况,这样我一插上备份移动盘,稍微花点时间对比分析一下,就能进行传输。

安装也很简单,直接上命令:

sudo apt install syncthing

我在用的时候发现用其他用户运行这个程序会报权限错误,必须使用 root 用户来运行,于是便写了系统服务 [email protected],方便运行程序。

[Unit]
Description=Syncthing - Open Source Continuous File Synchronization for %I
Documentation=man:syncthing(1)
After=network.target
StartLimitIntervalSec=60
StartLimitBurst=4
[Service]
User=%i
ExecStart=/usr/bin/syncthing serve --no-browser --gui-address="0.0.0.0:8384" --no-restart --logflags=0
Restart=on-failure
RestartSec=1
SuccessExitStatus=3 4
RestartForceExitStatus=3 4
# Hardening
ProtectSystem=full
PrivateTmp=true
SystemCallArchitectures=native
MemoryDenyWriteExecute=true
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target

服务启动之后,就可以通过 8384 端口访问了。因为我使用文件同步都是通过局域网来完成,因此就没有搭建 Frp 了。

而剩下的就是通过 Web 端的图像界面来完成了。

qbittorrent

alist 的另外一个需求就是离线下载了。有了网盘,上班的时候将链接往上面一挂,下班的时候就能美滋滋地看已经下好的电影。

而下载自然就离不开大名鼎鼎的磁力链接了,这样一来,软件自然就是选 qbittorrent。

安装也不算难,就是要额外导入源:

sudo add-apt-repository ppa:qbittorrent-team/qbittorrent-stable
sudo apt update
sudo apt install qbittorrent-nox

同时加上一个系统服务,原来的 WebUI 默认端口是 8080,十分地不友好,因此我改用了 12453

[Unit]
Description=qBittorrent Command Line Client
After=network.target
[Service]
#Do not change to "simple"
Type=forking
UMask=007
ExecStart=/usr/bin/qbittorrent-nox -d --webui-port=12453
Restart=on-failure
[Install]
WantedBy=multi-user.target

照例配上 Frp:

[qbt-a]
type = http
local_port = 12453
custom_domains = yourqbtdomain.com

访问 yourqbtdomain.com 就能打开 WebUI 了,但是还需要登录。

这里就有一个坑了。qbittorrent v4.6.1 之后,原来的默认密码被干掉了,变成了一个随机密码,会随着安装 log 显示。但是,这个所谓的 log,我查遍全文,发现只有用 Docker 安装的时候才能查到,别无他法。

找了很久,终于找到一个邪道方法:qbittorrent 是用 PBKDF2 加密密码的,于是只需要将某个密码加密好后,写在配置里,就可以成功登录了。

先关闭 qbittorrent 程序,打开文件 /.config/qBittorrent/qBittorrent.conf,在 [Preferences] 下面写入:

WebUI\Password_PBKDF2 = "@ByteArray(ARQ77eY1NUZaQsuDHbIMCA==:0WMRkYTUWVT9wVvdDtHAjU9b3b7uB8NR1Gur2hmQCvCDpm39Q+PsJRJPaCU51dEiz+dTzh8qbPsL8WkFljQYFQ==)"

重新打开程序,再回到 WebUI 上,使用用户名 admin 和密码 adminadmin 就能成功登录了。登录之后别忘了赶快改密码。

最后在 alist 中配置 qbittorrent,在 管理-设置-其他-qBittorrent-qBittorrent链接 下写入 http://admin:password@localhost:12453/,把用户名密码和端口替换一下保存即可。

docker

其实在安装 cockpit 的时候安装插件可以选装 podman,网上也有一大堆人鼓吹 podman 多便捷多优秀,但是先来者积累的资源实在太庞大,要减少繁杂的调试折腾,还得老牌 docker。

Docker 在 Ubuntu 上依赖一些软件包。执行以下命令来安装这些依赖:

sudo apt install ca-certificates curl gnupg lsb-release

添加 Docker 官方的 GPG 密钥,这里用的是阿里云的源:

curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

添加 Docker 的软件源,若是有报错就重复执行一下添加密钥,覆盖掉有问题的密钥,这里用的同样是阿里云的软件源:

sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

正常安装 docker:

sudo apt install docker-ce docker-ce-cli containerd.io

这是常用软件,基本上也不会出啥差错。

portainer

docker 面板我选用的是 portainer,也是一个随大流的选择。既然已经装了 docker,那 portainer 也用 docker 来安装了。

在运行容器之前,创建一个持久的 docker 卷来存储 portainer 数据:

sudo docker volume create portainer_data

然后创建容器:

sudo docker run -d -p 9000:9000 -p 8000:8000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /srv/portainer:/data portainer/portainer-ce

照例开 Frp,portainer 的默认端口为 9000

[dockerUI]
type=http
local_port=9000
custom_domains = yourportainerdomain.com

通过 yourportainerdomain.com 就能正常访问面板了。但是对于我来说,docker 面板只是用来更方便地启停删除容器而已,真要创建容器,还是命令行来得方便。

ollama

接下来就是异想天开时刻了,我想在这台 i3 的小主机跑大模型。

ollama 富含各式大模型,还能够纯 cpu 运行,乃绝佳之选。

安装用的是脚本一键安装:

sudo curl -fsSL https://ollama.com/install.sh | sh

我选用的大模型是微软的 phi3 mini,为了减轻小主机的 cpu 压力。

ollama run phi3:mini

执行命令之后,程序会自动扒拉 phi3:mini 模型,下载完后就能进入对话模式了,而这个模型会保留下来,供我们后续使用。

使用 run 命令是对话模式,但同时在安装的时候,已经给 ollama 配置好了系统服务,直接开启就能用上它的服务器模式:

sudo systemctl start ollama
sudo systemctl enable ollama

接下来有一个坑。后续我使用 anythingllm 调用 ollama 模型的时候,出现了查找不到模型的问题。在持续翻找了用户文档之后,终于发现了解决方法。

使用命令打开系统服务编辑:

systemctl edit ollama.service

[Service] 下面写入 Environment 变量:

[Service]
Environment="OLLAMA_HOST=0.0.0.0"

保存后重启服务:

systemctl daemon-reload
systemctl restart ollama

这样就能在 anythingllm 查找到 ollama 对应的模型了。

anythingllm

anythingllm 提供了一个界面平台,对接各类大模型,不仅有本地模型,还可以接 OpenAI 或者 Gemini。

官方推荐使用 docker 来安装,先扒拉镜像:

docker pull mintplexlabs/anythingllm

再运行容器,我在原来的基础上增加了自动启动的命令:

mkdir -p $HOME/anythingllm
touch "$HOME/anythingllm/.env"
docker run -d -p 3001:3001 --restart=always --cap-add SYS_ADMIN -v $HOME/anythingllm:/app/server/storage -v $HOME/anythingllm/.env:/app/server/.env -e STORAGE_DIR="/app/server/storage" mintplexlabs/anythingllm

同样部署一个 Frp,默认端口 3001

[llm]
type=http
local_port=3001
custom_domains = yourllmdomain.com

打开 yourllmdomain.com,选择 ollama 后,要在 URL 处填写 http://172.17.0.1:11434http://host.docker.internal:11434 才能正常连接到 ollama 的模型。这是因为 anythingllm 是运行在容器里面的,需要通过 172.17.0.1host.docker.internal 才能连接到宿主的 127.0.0.1

所有都准备好,就可以跟大模型聊天了。我尝试了下,运行倒是可以运行,只是生成速度比较慢,说着说着中文会转回英文,cpu 占用直接拉满到 99%,温度飙升 30 多度。

后续

到目前为止,我的小主机就只装了以上这些东西。虽然一开始还尝试了 immich,但是后来发现它不能直接挂载现有地址,只能重新上传同步,不太符合我的需求。另外还想尝试 Home Assistance,但是查阅了一下,发现我的投影仪并不能通过网络来开机,而我都其他智能设备都能通过米家来控制,也就没有这个需求了。

暂时还没有其他想要部署的东西,那我的这次互联网拓展之旅也就告一段落了。

接下来还会有什么好玩的东西呢?




Share