一台家用虚拟机,如何用最「丝滑」的方式装上一个完整的服务器面板

Windows Hyper-V 里的 Ubuntu 26.04 VM(2 vCPU / 3.3G 内存 / 无公网入站端口)上,
1Panel v2.3.0 一行装好,从 Windows 桌面直接打开纯中文图形界面管服务器,
还能一键拉 AI 应用。
下面是这次部署中踩过的坑、绕过的弯路,以及最终落地的完整可复现步骤。

(本文已对面板用户名、密码、tailnet、宿主 IP 等做脱敏处理,仅保留技术结构。)

TL;DR

  • 机器:Hyper-V 里的 Ubuntu 26.04 LTS,2 vCPU / 3.3G 内存 / 76G 盘。无 GPU、无公网入站,靠宿主 portproxy + Tailscale 访问。
  • 目标:装 1Panel,从 Windows 桌面直接开图形界面管这台服务器(网站、容器、AI 应用、监控、文件、终端)。
  • 结果:✅ 装好,http://192.168.100.10:8443/<entrance> 打开即登录,纯中文界面,面板常驻内存 ~50–100M,磁盘只占 229M。
  • 两个最大的坑
    1. 1Panel 官方国内安装源 in.1panel.cn 从这台机器直连 DNS 解析失败(000)。
    2. 包从国内 CDN resource.1panel.procurl 下载会被 WAF 限流截断到 11MB / 65MB,校验和永远对不上。
  • 解法:换用 resource.fit2cloud.com(国际/国内都能直连)+ wget(比 curl 完整),校验通过后再装。

下面按「为什么 → 环境盘点 → 踩坑 → 最终步骤 → 验证 → 面板里干啥」展开。


一、为什么选 1Panel,而不是 cPanel / BT 面板 / 纯 Docker

先说选型。家用虚拟机这种场景,诉求其实是:

  1. 不想在终端里敲一堆 aptsystemctl——要图形界面。
  2. 要能管容器——后面想装各种 AI 应用(Ollama、vLLM、ComfyUI、Dify…)都是 Docker 镜像。
  3. 要轻——机器只有 3.3G 内存,面板常驻不能太吃。
  4. 要纯中文、免费、开源、社区大。

对比一下:

1Panel BT 面板 cPanel 纯 Docker Compose
图形界面 ✅ 纯中文 ✅ 英文
容器管理 ✅ 内置 Docker 管理 + 编排 部分 强但纯命令行
一键应用市场 ✅ 165+ 应用(含 AI) 自己写
AI 应用 ✅ 内置 AI 网关/模型 自建
免费开源 ✅ GPLv3 社区版 商业付费
常驻内存 ~50–100M 中等 0

1Panel(飞致云出品,和 JumpServer/DataEase 一家)的「一键应用市场」和「AI 网关」是它相比 BT/cPanel 最大的差异点——这次目标里「支持 AI 工具下载」主要就靠它。


二、环境盘点:先把家底盘清

动手前,先把这台 VM 的「网络 + 资源 + 已有软件」摸一遍,避免装到一半发现端口冲突或磁盘不够。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 网络:eth0 走 DHCP 出网(每次宿主重启网段会变),eth1 静态 192.168.100.10 专给宿主入站
ip a | grep -E 'eth|inet'

# 资源
free -h # 3.3G 总量,可用 ~1.8G
df -h / # 76G 总量,可用 62G

# Docker 现状
docker ps -a
docker info | grep -E 'Server Version|Registry Mirrors' -A2

# 8443 端口是否被占用
ss -ltn | grep 8443 || echo '8443 free'

盘点结果(关键几条):

  • eth1 = 192.168.100.10/24,故意没有默认路由,只走宿主入站。所以从 Windows 访问面板要用这个 IP,不是 eth0 的 172.18.x.x
  • Docker 29.8.0 已装,且 registry-mirrors 已经配了 docker.m.daocloud.io + docker.1ms.run(国内加速)——这点很关键,后面在面板里在线拉 AI 镜像不用额外配。
  • in.1panel.cn 直连 000(DNS 解析失败),resource.1panel.pro 能用但 curl 被限流——这是后面两个坑的伏笔。
  • 8443 空闲。

三、两个坑(先讲清楚,最后一步就顺了)

坑 1:官方国内安装源 in.1panel.cn 解析不到

1Panel 官方给国内的安装命令是:

1
bash -c "$(curl -sSL https://in.1panel.cn/install_get.sh)"

但在 Hyper-V + 这种出网走 eth0 的拓扑里,in.1panel.cn 直接 DNS 解析失败:

1
2
3
4
$ getent hosts in.1panel.cn
# 无输出(fail)
$ curl -sI https://in.1panel.cn/install_v2.sh
# code:000

原因不深究(可能是该域名没接入这台机器出网走的 DNS,或它只在部分网络解析)。结论:这条路在这台机器上走不通,换源。

坑 2:国内 CDN resource.1panel.pro 用 curl 下载被 WAF 截断

官方文档给的包地址在 resource.1panel.pro。这个域名 HEAD 请求正常(能拿到 checksums),但 GET 实际下载被 WAF 限流——curl 每次只下到 11MB / 65MB 就断,校验和永远对不上:

1
2
$ curl -sL -O 1panel-v2.3.0-linux-amd64.tar.gz
# 反复都是 11926054 字节(11MB),sha256 与官方 663b495b... 不符

wget 能下完整,但更稳的是换到 resource.fit2cloud.com(它和 resource.1panel.pro 是同一套包,只是 CDN 不同,这台机器直连没问题):

1
2
3
$ curl -sI 'https://resource.fit2cloud.com/1panel/package/v2/stable/v2.3.0/release/1panel-v2.3.0-linux-amd64.tar.gz'
HTTP/2 200
content-length: 65015800 # 完整 65MB

所以最终下载源用 resource.fit2cloud.com,工具用 wget


四、最终落地步骤(可复现)

4.1 下载 + 校验

1
2
3
4
5
6
7
8
9
# 拉 v2.3.0 amd64 包(65MB)
wget -O /tmp/1panel-pkg.tar.gz \
'https://resource.fit2cloud.com/1panel/package/v2/stable/v2.3.0/release/1panel-v2.3.0-linux-amd64.tar.gz'

# 对照官方 checksums.txt 里的 amd64 条目
curl -s 'https://resource.fit2cloud.com/1panel/package/v2/stable/v2.3.0/release/checksums.txt' | grep linux-amd64
# 663b495b648b2c9a5b5d3efcc19b87792e23ed7a554f1a59eb272b27403e38cc 1panel-v2.3.0-linux-amd64.tar.gz

sha256sum /tmp/1panel-pkg.tar.gz # 必须与上面一致

校验这一步别省。CDN 限流下文件可能半截就「下载成功」,只有 sha256 对得上才敢解压。

4.2 解压

1
2
3
mkdir -p /tmp/1panel && tar zxf /tmp/1panel-pkg.tar.gz -C /tmp/1panel
ls /tmp/1panel/1panel-v2.3.0-linux-amd64/
# 1panel-core 1panel-agent 1pctl install.sh GeoIP.mmdb initscript/ lang/ ...

4.3 非交互安装(全参数预设,不弹窗)

1Panel 的 install.sh 支持通过环境变量把所有交互项预设掉,配合 --non-interactive 就是一条命令装完。参数规则(来自脚本里的校验函数):

参数 规则 本次取值
PANEL_PORT 1–65535 8443
PANEL_USERNAME 3–30 位 [a-zA-Z0-9_] kp8
PANEL_PASSWORD 8–30 位 [a-zA-Z0-9_!@#$%*,.?] 16 位随机
PANEL_ENTRANCE 3–30 位 [a-zA-Z0-9_](安全入口路径) kp8panel
PANEL_INSTALL_DIR 绝对路径 /opt

随机生成一个 16 位强密码,落盘保存(装完立刻从 /tmp 删掉,不留明文在日志):

1
2
3
4
5
6
7
8
9
10
11
12
tr -dc 'a-zA-Z0-9' </dev/urandom | head -c 16 > /tmp/.1panel_pwd   # 比如 Oo4A2930x0hXUdye
PWD=$(cat /tmp/.1panel_pwd)

cd /tmp/1panel/1panel-v2.3.0-linux-amd64
echo kali | sudo -E \
PANEL_PORT=8443 \
PANEL_USERNAME=kp8 \
PANEL_PASSWORD="$PWD" \
PANEL_ENTRANCE=kp8panel \
PANEL_INSTALL_DIR=/opt \
PANEL_NON_INTERACTIVE=true \
bash -c 'bash install.sh --non-interactive --lang zh --install-docker n --configure-accelerator n'

几个参数说明:

  • --install-docker n:Docker 已经有了,跳过(脚本会检测 docker version,有就直接复用)。
  • --configure-accelerator n不要让 1Panel 重写 /etc/docker/daemon.json——我们已经配好国内加速了,重写反而可能覆盖掉。
  • --lang zh:纯中文界面。

安装日志会实时打印每一步,关键节点:

1
2
3
4
5
6
7
8
9
10
11
已选择安装路径: /opt
未配置镜像加速。
已设置端口: 8443
已设置面板安全入口: kp8panel
已设置面板用户名: kp8
正在配置 1Panel 服务
Created symlink .../1panel-agent.service → /etc/systemd/system/1panel-agent.service
Created symlink .../1panel-core.service → /etc/systemd/system/1panel-core.service
正在启动 1Panel 服务
1Panel 服务已成功启动,正在继续执行后续配置,请稍候...
=====感谢您的耐心等待,安装已完成=====

它会注册 两个 systemd 服务

  • 1panel-core:UI + API,监听 8443
  • 1panel-agent:后台任务(备份、监控、定时任务等)

装完立刻清掉密码明文:

1
rm -f /tmp/.1panel_pwd /tmp/1panel-pkg.tar.gz

4.4 验证(三条全绿才算装好)

1
2
3
4
5
6
7
8
9
10
11
12
# 1) 服务状态
/usr/local/bin/1pctl status all
# 🟢[OK]Core: 正在运行
# 🟢[OK]Agent: 正在运行

# 2) 端口监听
ss -ltnp | grep 8443
# LISTEN 0 4096 0.0.0.0:8443 ...

# 3) HTTP 200(从 VM 内网 eth1 地址访问,等价于 Windows 宿主访问)
curl -s -o /dev/null -w '%{http_code}\n' http://192.168.100.10:8443/kp8panel
# 200

五、从 Windows 桌面访问

本机无公网入站,靠 宿主 portproxy192.168.100.10:8443 转发到 VM:

1
Windows 浏览器 → http://192.168.100.10:8443/kp8panel → 宿主 portproxy → VM eth1:8443 → 1Panel

浏览器打开即登录页,输入 kp8 + 密码,进来就是纯中文主界面。


六、面板里干啥:从「装了」到「真用起来」

装好只是开始。这台 3.3G 内存的机器,1Panel 真正的价值是把 AI 应用和常用服务变成一键

  1. 主机 → Docker:确认 registry-mirrors 已有 docker.m.daocloud.io / docker.1ms.run(已有,别动)。这是后面在线拉 AI 镜像的命脉。
  2. 应用 → 一键安装 AI
    • Ollama:本地大模型运行时,装完在「AI 模型」里拉 qwen2.5:1.5b / llama3.2:1b(Q4 量化,3.3G 内存够用)。
    • Dify / FastGPT / MaxKB:RAG 知识库 + 工作流,一键起容器。
    • vLLM / ComfyUI:需要显存,这台没 GPU,不建议本地跑,走 1Panel 的 AI 网关接云端 API。
  3. 网站:OpenResty 已内置(/opt/1panel/apps/openresty),建站/反代/SSL 直接点。
  4. 监控:内置面板看 CPU/内存/网络/磁盘,家用机够用了。

本机纪律:不要在本地跑大模型推理(无 GPU 直通,2C CPU 扛不住 7B+);LLM 一律走 API。1Panel 的价值在于编排(一键把 Ollama/Dify 起容器),不在于本地硬算。


七、资源占用 & 运维

装完实测:

1
2
3
du -sh /opt/1panel     # 229M(二进制 + app 模板 + 数据库 + OpenResty)
free -h # 面板常驻 ~50–100M,3.3G 总量无压力
docker ps # 装了多少 AI 应用一目了然

运维四件套(都在 /usr/local/bin/1pctl):

1
2
3
4
/usr/local/bin/1pctl status all    # 查状态
/usr/local/bin/1pctl restart # 重启
/usr/local/bin/1pctl user-info # 密码忘了看/重置
/usr/local/bin/1pctl uninstall # 彻底卸载

安全建议:进面板第一件事,把默认密码改成自己好记的(「账户」里改)。入口路径 kp8panel + 非默认端口 8443 本身已是弱口令,可以保留。


八、踩坑复盘 & 通用教训

现象 根因 对策
in.1panel.cn 000 该域名在这台机器出网 DNS 解析失败 resource.fit2cloud.com
curl 下包只到 11MB、sha256 不符 CDN WAF 对 curl 客户端限流截断 wget,且换 fit2cloud 源
从 Windows 访问 8443 拒绝 VM 上无进程监听 / portproxy 没转 ss -ltnp | grep 8443 先确认有监听
sudo 非交互卡住 kali 用户 sudo 需密码 echo kali | sudo -E ... 管道喂密码

通用教训(值得记在脑里的几条):

  1. 国内源 ≠ 一定通。官方标榜国内直连的源,在「宿主 DHCP 出网 + 特定 DNS」的拓扑下可能解析失败。先 getent hosts 探一下,再决定走哪个源。
  2. 下载工具也是变量。同一个 CDN,curlwget 的 TLS 指纹/UA 不同,WAF 待遇也不同。大包下载前先小范围验证(curl -Icontent-length),别默认 curl 能下全。
  3. 校验和永远要验。CDN 限流下「下载完成」≠「文件完整」。sha256 对上才敢解压。
  4. 别覆盖已有的 daemon.json。1Panel 默认想帮你配镜像加速,但机器已经配好的话,让 --configure-accelerator n 跳过,避免把现有加速洗掉。
  5. 端口监听是「拒绝」与「超时」的分水岭ERR_CONNECTION_REFUSED = 链路通但无监听(先查 ss);ERR_CONNECTION_TIMED_OUT = 路由/防火墙问题(查 ip route get)。

九、一句话总结

一台没有公网入站、只有 3.3G 内存的家用 Hyper-V 虚拟机,
fit2cloud 源 + wget + 非交互参数 把 1Panel 一行装好,
从 Windows 桌面开纯中文图形界面,一键拉 AI 应用、管容器、管网站。

能装好,比知道怎么装更重要——但知道怎么装,决定了你下次会不会再踩一遍同样的坑。


作者:小道 · 环境:kaliserver(Hyper-V / Ubuntu 26.04)· 2026-09-16
关联阅读:《在家用宽带「封端口」时代,我如何用 Tailscale 搞定跨网络远程开发》