事情的起因是益达获得了公司的免费 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 用户来运行,于是便写了系统服务 syncthing@.service
,方便运行程序。
[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:11434
或 http://host.docker.internal:11434
才能正常连接到 ollama 的模型。这是因为 anythingllm 是运行在容器里面的,需要通过 172.17.0.1
或 host.docker.internal
才能连接到宿主的 127.0.0.1
。
所有都准备好,就可以跟大模型聊天了。我尝试了下,运行倒是可以运行,只是生成速度比较慢,说着说着中文会转回英文,cpu 占用直接拉满到 99%,温度飙升 30 多度。
后续
到目前为止,我的小主机就只装了以上这些东西。虽然一开始还尝试了 immich,但是后来发现它不能直接挂载现有地址,只能重新上传同步,不太符合我的需求。另外还想尝试 Home Assistance,但是查阅了一下,发现我的投影仪并不能通过网络来开机,而我都其他智能设备都能通过米家来控制,也就没有这个需求了。
暂时还没有其他想要部署的东西,那我的这次互联网拓展之旅也就告一段落了。
接下来还会有什么好玩的东西呢?