Unraid 上开一台 Ubuntu 虚拟机:从零到能干活的实录
这个站(stevenhome.com)就跑在家里 Unraid 上的一台 Ubuntu 虚拟机里。下面是从开箱到上线的完整过程,包括两个差点绊住人的坑。
虚拟机配置
| 项目 | 配置 |
|---|---|
| 系统 | Ubuntu 26.04 LTS |
| CPU / 内存 | 中等配置,跑网站绰绰有余 |
| 硬盘 | 几十 GB(开局只剩几 GB 可用,见下文) |
| 网络 | 桥接,内网 + Tailscale 双通道 |
跑个静态网站加一个小接口,这个配置绰绰有余。瓶颈不在 CPU 和内存,在硬盘 —— 一个全新的 Ubuntu 桌面镜像装完,几十 GB 的盘只剩几 GB。
坑一:12GB 的 snap 垃圾
查了一下磁盘占用:/snap 12GB,/usr 20GB。Ubuntu 桌面版预装了一堆 snap 应用:Firefox、Thunderbird、GNOME 组件、Snap Store……一台只跑网站的服务器根本用不上。处理办法:
for s in firefox thunderbird snap-store firmware-updater \
desktop-security-center gnome-42-2204 gnome-46-2404 \
gtk-common-themes mesa-2404 bare core18 core20 core22 core24; do
sudo snap remove --purge "$s"
done
sudo apt purge -y snapd
sudo rm -rf /snap /var/snap /var/lib/snapd ~/snap
再加上一轮 apt autoremove、清 apt 缓存、把系统日志压到 100MB、清 npm 缓存,硬盘从只剩几 GB 回到了十几 GB 空闲。
坑二:sudo 要密码
新建的用户默认 sudo 每次都要输密码,远程装软件很不方便。给这个用户免密 sudo,一行命令:
echo "你的用户名 ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/你的用户名
注意:这台虚拟机只在家庭内网 + Tailscale 里,风险可控。如果是直接暴露在公网的机器,别这么干。
SSH 密钥登录
密码登录又慢又不安全,改成密钥:把公钥写进虚拟机用户的 ~/.ssh/authorized_keys,之后登录不用输密码,自动化脚本也能连。公钥本身不是秘密(私钥才是),但也没必要贴出来 —— 生成自己的就行:ssh-keygen -t ed25519,把 .pub 那个文件的内容贴过去。
装网站:nginx + 一个小接口
网站本身是静态页面,nginx 托管;机票提醒的报名表单需要存数据,后面挂了一个 60 行的 Python 小服务(标准库 http.server,不依赖任何框架),只监听本机 127.0.0.1:8001,nginx 把 /api/ 转给它。报名数据写进一个 CSV 文件,没有数据库,没有外部依赖。
- nginx:
apt install nginx,开机自启,监听 0.0.0.0:80 - 接口服务:写成 systemd service,挂了自动重启
- 验证:本机 curl 全是 200,再从 Tailscale 外面访问也通了
对外发布是怎么接上的
家里出口有一台 Nginx Proxy Manager:域名解析到家里公网 IP,路由器把 80 端口转发到 NPM,NPM 再按域名转发到这台虚拟机的内网地址:80。HTTPS 证书也是 NPM 里一键申请的 Let's Encrypt。虚拟机本身不直接暴露在公网上。
如果你也在 Unraid 上跑服务,记住两点就行:桌面版 Ubuntu 镜像先清 snap 再干活;虚拟机只留内网和 Tailscale 两个入口,对外发布交给反代去做。
2026 年 11 月。命令以实测为准,不同 Ubuntu 版本的包名可能略有出入。