介绍
ConvoyPanel是一个可以与Proxmox VE集成的高性能KVM服务器管理面板。
简而言之,PVE默认的Web UI不适合拿来卖VPS,这个面板就是用来解决这个问题的,说白了就是给VPS商家用的。同类型的产品还有Virtfusion、Virtualizor等等。ConvoyPanel这个程序比较冷门,网上介绍的不多,我之前送的免费小鸡其实就是用的这个面板,我觉得ConvoyPanel还挺好用的,只是一直没机会写篇完整的部署文章向大伙介绍一下。。。
ConvoyPanel主打一个便宜,个人非商业用途直接免费,免费,免费!商用的话一个节点每月也就6刀(注意是节点,也就是一台独服。说详细点免得又有杠精说我误导人。)别的程序虽然也谈不上贵,但ConvoyPanel是真的白菜价了。
当然这么低的价格,我感觉作者也是用爱发电,很佛系,开发进度非常缓慢,时间基本可以说是以年为单位,不过这种程序更的快也未必是个好事,功能够用的前提下,不折腾稳定才是王道,只要安全更新能够及时更上就行=-=
准备工作:
1.至少两台服务器,一台用于计算节点(Proxmox VE),一台用于部署ConvoyPanel。
2.做好域名解析:
pve-buf.example.com # Proxmox VE主机 console.example.com # ConvoyPanel vnc-buf.example.com # Coterm控制台代理,可选
部署ConvoyPanel
我这里没有采用官方的Docker部署方式,简单说下原因。
1.考虑到官方的Docker部署方式需要占用80/443端口,且这个面板程序本身占用资源不大,我觉得单独拿一台服务器出来只部署它太浪费了,我把系统的80/443端口留给NGINX还能干点别的事。
2.我正好有一台机器部署了Paymenter,这个Paymenter运行所需的环境不能说与ConvoyPanel一模一样吧,但大差不差,都是Laravel框架写出来的程序,而且最后我也是把ConvoyPanel与Paymenter对接起来一起用,所以干脆就直接把这两个程序装在一台服务器内了,也就是说这篇文章的步骤我根本不用全部重新再来一遍,我装一遍可以跑两个程序=-=
以下部署步骤基于Debian13。添加sury存储库,安装PHP8.3:
apt update apt -y install curl gnupg2 lsb-release ca-certificates echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/sury-php.list curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/sury-keyring.gpg apt update apt -y install php8.3 php8.3-{common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip,intl,redis,gmp}
安装NGINX/Mariadb/Redis以及其他需要用到的包:
apt -y install nginx mariadb-server redis-server tar unzip
设置开机自启:
systemctl enable nginx.service mariadb.service redis-server.service php8.3-fpm.service
安装composer:
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
登录到Mariadb,不需要输入root密码直接回车:
mysql -u root -p
创建用户和数据库:
CREATE USER 'convoy'@'127.0.0.1' IDENTIFIED BY 'yourdbpassword'; CREATE DATABASE convoy; GRANT ALL PRIVILEGES ON convoy.* TO 'convoy'@'127.0.0.1' WITH GRANT OPTION;
创建站点目录:
mkdir -p /var/www/convoy && cd /var/www/convoy
下载程序解压,设置正确的文件权限:
curl -Lo panel.tar.gz https://github.com/convoypanel/panel/releases/latest/download/panel.tar.gz tar -xzvf panel.tar.gz chmod -R o+w storage/* bootstrap/cache/
复制一份配置文件:
cp .env.example .env
编辑配置文件:
nano .env
需要修改的配置如下,其他没有列出的内容可以保持默认:
APP_ENV=production APP_DEBUG=false APP_URL=https://console.example.com DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=convoy DB_USERNAME=convoy DB_PASSWORD=yourdbpassword REDIS_HOST=127.0.0.1
安装依赖:
composer install --no-dev --optimize-autoloader
生成Application Key:
php artisan key:generate --force php artisan optimize
初始化数据库:
php artisan migrate --force
创建管理员账号:
php artisan c:user:make
设置正确的所有者权限:
chown -R www-data:www-data /var/www/convoy/
添加计划任务:
crontab -u www-data -e
写入如下内容:
* * * * * php /var/www/convoy/artisan schedule:run --verbose --no-interaction
新建systemd服务:
nano /etc/systemd/system/convoy.service
写入如下内容:
[Unit] Description=Convoy Horizon [Service] User=www-data Group=www-data Restart=always ExecStart=/usr/bin/php /var/www/convoy/artisan horizon StartLimitInterval=180 StartLimitBurst=30 RestartSec=5s [Install] WantedBy=multi-user.target
启动:
systemctl enable --now convoy.service
新建NGINX配置文件:
nano /etc/nginx/sites-available/convoy.conf
写入如下内容:
server { listen 80; listen [::]:80; server_name console.example.com; root /var/www/convoy/public; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.3-fpm.sock; } }
启用站点:
ln -s /etc/nginx/sites-available/convoy.conf /etc/nginx/sites-enabled/
签发SSL证书:
certbot --nginx
访问console.example.com,如一切正常就可以使用之前创建的管理员账号登录到后台了:
Proxmox VE配置使用HE IPv6 Tunnel
ConvoyPanel是不支持NAT网络的(没有端口转发的功能,也就是没有DNAT的功能)在这种情况下我们要保证创建的虚拟机至少拥有一个独立IP地址,IPv4或者IPv6均可。IPv4太贵买不起,甚至我用于写文章的这台服务器连IPv6都没有,所以这里介绍一下使用HE IPv6 Tunnel的方法。
访问HE IPv6 Tunnel网站(tunnelbroker),注册账号。
点击Create Regular Tunnel创建隧道,IPv4 Endpoint (Your side)填写你的服务器公网IPv4地址,选择一个离你服务器延迟低的区域:
默认情况下,HE只提供一个/64,你还可以申请一个/48,后续我们使用这个/48来给虚拟机分配IPv6地址:
转到Example Configurations,找到Debian的配置示例,类似下图这样的配置:
由于现在的Proxmox VE 8/9都使用ifupdown2,而非Debian发行版默认的ifupdown,HE提供的这个配置是基于ifupdown的,不能直接用在Proxmox VE 8/9上面,需要稍加修改,下面是修改后的配置:
auto he-ipv6 iface he-ipv6 inet6 tunnel mode sit address 2001:470:x:x::x netmask 64 endpoint 216.x.x.x local 23.x.x.x ttl 255 gateway 2001:470:x:x::x
另外如果你使用的是Proxmox VE 8并且使用了SDN网络,Proxmox VE 8的ifupdown2有个BUG会导致SDN无法正常工作,你可以编辑如下文件:
nano /usr/share/ifupdown2/ifupdown/iface.py
找到325行的:
retconfig[k] = v[0] if len(v) == 1 else v
将其改成:
retconfig[k] = str(v[0] if len(v) == 1 else v)
Proxmox VE 9的ifupdown2无此问题,并且ifupdown2官方就是使用这个帖子里的方法来修复的。
编辑interfaces文件:
nano /etc/network/interfaces
完整的配置如下,在这个配置中vmbr0桥接eth1,并为其配置了HE隧道的/48 IPv6:
auto lo iface lo inet loopback iface eth1 inet manual auto vmbr0 iface vmbr0 inet static address 23.x.x.x/30 gateway 23.x.x.x bridge-ports eth1 bridge-stp off bridge-fd 0 iface vmbr0 inet6 static address 2001:470:x::x/48 auto he-ipv6 iface he-ipv6 inet6 tunnel mode sit address 2001:470:x:x::x netmask 64 endpoint 216.x.x.x local 23.x.x.x ttl 255 gateway 2001:470:x:x::x
使修改后的配置生效:
ifreload -a
还需要启用IPv6转发:
cd /etc/sysctl.d/ nano 99-custom.conf
写入如下内容:
net.ipv6.conf.all.forwarding = 1
使IPv6转发生效:
sysctl --system
HE IPv6 Tunnel的IPv6无论是/64还是/48都是全段路由,不需要使用NDP代理,所以到这里就全部配置完成了。
制作Debian/Ubuntu系统模板
ConvoyPanel创建虚拟机必须用到系统模板,现在来介绍一下如何制作可用于ConvoyPanel的Debian/Ubuntu系统模板。
ConvoyPanel官方其实提供了很多系统模板,但是这些模板太旧了,而且配置的不太好,所以这里我制作了两个系统模板:Debian13、Ubuntu24.04。
[提醒]不建议使用Debian cloud image制作Debian13以下的系统模板,因为内置的cloud-init版本太旧有各种BUG。
[警告]接下来的操作不要在PVE主机上进行!需要用到的libguestfs-tools软件包与PVE不兼容!最好找一台别的服务器安装,这里我在部署ConvoyPanel的服务器上操作。
安装libguestfs-tools:
apt install libguestfs-tools
下载系统Debian13、Ubuntu24.04的系统image:
mkdir /root/convoy-temp && cd /root/convoy-temp wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2 wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
我们先来定制Debian13的系统image,修改SSH配置允许root用户使用密码登录,这个必须要改,因为ConvoyPanel在创建虚拟机时设置的密码只能是root用户的。使用virt-edit工具来编辑系统image内的SSH配置文件:
virt-edit -a debian-13-genericcloud-amd64.qcow2 /etc/ssh/sshd_config
允许root用户登录:
#PermitRootLogin prohibit-password
改为:
PermitRootLogin yes
允许使用密码登录:
PasswordAuthentication no
改为:
PasswordAuthentication yes
更新系统到最新/设置时区/预装软件,注意这里一定要安装qemu-guest-agent并设置开机自启:
virt-customize -a debian-13-genericcloud-amd64.qcow2 --update virt-customize -a debian-13-genericcloud-amd64.qcow2 --timezone 'Asia/Shanghai' virt-customize -a debian-13-genericcloud-amd64.qcow2 --install qemu-guest-agent,wget,curl,git,net-tools virt-customize -a debian-13-genericcloud-amd64.qcow2 --run-command "systemctl enable qemu-guest-agent"
这样一个Debian13的系统image就修改好了,当然你还可以进行更多的定制化操作。
接下来是Ubuntu24.04的系统image,还是一样需要修改SSH的配置,Ubuntu24.04这个系统与Debian13有一些区别,我们需要编辑如下路径的配置文件:
virt-edit -a noble-server-cloudimg-amd64.img /etc/ssh/sshd_config.d/60-cloudimg-settings.conf
在这个配置文件内增加如下配置:
PermitRootLogin yes PasswordAuthentication yes
更新系统到最新/设置时区/预装软件,注意这里一定要安装qemu-guest-agent并设置开机自启:
virt-customize -a noble-server-cloudimg-amd64.img --update virt-customize -a noble-server-cloudimg-amd64.img --timezone 'Asia/Shanghai' virt-customize -a noble-server-cloudimg-amd64.img --install qemu-guest-agent,wget,curl,git,net-tools virt-customize -a noble-server-cloudimg-amd64.img --run-command "systemctl enable qemu-guest-agent"
将修改好的系统image传到PVE主机内:
scp debian-13-genericcloud-amd64.qcow2 root@23.94.x.x:/root/convoy-temp scp noble-server-cloudimg-amd64.img root@23.94.x.x:/root/convoy-temp
在PVE主机使用qm命令行工具创建一台虚拟机,我使用下面的这些参数来创建,这是目前在PVE创建KVM虚拟机最佳的配置,在这个配置中使用了virtio-scsi-single作为控制器:
qm create 20000 \ --name Convoy-Debian-13 \ --cpu host \ --cores 1 \ --memory 1024 \ --machine q35 \ --bios ovmf \ --efidisk0 local-lvm:0,format=raw,efitype=4m,pre-enrolled-keys=1,size=528K \ --net0 virtio,bridge=vmbr0 \ --scsihw virtio-scsi-single \ --agent enabled=1,freeze-fs-on-backup=1,fstrim_cloned_disks=1 \ --serial0 socket \ --vga serial0
导入之前修改好的Debian13系统image/添加cloud-init设备/修改虚拟机引导顺序/配置cloud-init创建的默认用户为root/转换虚拟机为模板:
qm set 20000 --scsi0 local-lvm:0,import-from=/root/convoy-temp/debian-13-genericcloud-amd64.qcow2,cache=writeback,iothread=1,discard=on,format=raw qm set 20000 --scsi1 local-lvm:cloudinit qm set 20000 --boot order=scsi0 qm set 20000 --ciuser=root qm template 20000
说明:
1.以上执行的命令假设为你的PVE存储使用的是local-lvm,如果不是请自行修改。
2.lvm设备不允许使用qcow2格式,所以这里将image的硬盘格式统一转换为raw了。
3.将iothread开启,与virtio-scsi-single进行配合以达到最佳的硬盘性能。当然cache=writeback也必不可少。
4.我这里没有使用cloud-init设置root用户的密码,这是因为后续在创建虚拟机时密码是交给ConvoyPanel来设置的。
Ubuntu24.04的系统也是一样的步骤,只是要注意使用不同的vmid和name:
qm create 20001 \ --name Convoy-Ubuntu-2404 \ --cpu host \ --cores 1 \ --memory 1024 \ --machine q35 \ --bios ovmf \ --efidisk0 local-lvm:0,format=raw,efitype=4m,pre-enrolled-keys=1,size=528K \ --net0 virtio,bridge=vmbr0 \ --scsihw virtio-scsi-single \ --agent enabled=1,freeze-fs-on-backup=1,fstrim_cloned_disks=1 \ --serial0 socket \ --vga serial0
导入之前修改好的Ubuntu24.04系统image/添加cloud-init设备/修改虚拟机引导顺序/配置cloud-init创建的默认用户为root/转换虚拟机为模板:
qm set 20001 --scsi0 local-lvm:0,import-from=/root/convoy-temp/noble-server-cloudimg-amd64.img,cache=writeback,iothread=1,discard=on,format=raw qm set 20001 --scsi1 local-lvm:cloudinit qm set 20001 --boot order=scsi0 qm set 20001 --ciuser=root qm template 20001
有人可能会觉得有点奇怪,既然都用cloud-init了,为什么还要要用libguestfs-tools去修改系统image,cloud-init不是也可以支持这些操作吗?确实如此,cloud-init完全可以胜任这些操作,并且PVE本身也支持通过snippet(片段)配置文件来加载cloud-init的配置数据,我之前写的这篇文章中就详细说明过这种配置方法。但你要知道的是ConvoyPanel不支持PVE的这种snippet(片段)配置文件,ConvoyPanel在创建虚拟机时只调用cloud-init来配置系统root用户的密码以及网络配置,其他的东西是不管的。
当然,作为一种变通办法,你可以尝试使用cicustom将snippet(片段)配置文件直接附加到刚创建的系统模板内,这样在虚拟机创建的时候应该会自动应用snippet(片段)配置文件内的内容,但是我这里没有试这种方法,不确定是否可行,可能后续我会试试看。
对接Proxmox VE的准备工作
制作好系统模板后,现在就可以尝试与Proxmox VE进行集成了。步骤有点多,有点杂,我尽量写的详细一点。
首先需要在PVE主机上安装一个ConvoyPanel的终端(控制台)代理:
cd / curl -fsSL https://github.com/convoypanel/broker/releases/latest/download/broker.tar.gz | tar -xzv
注意:必须在/目录运行上述命令,否则安装的路径不对,会导致最终用户无法使用终端(控制台)。
我是要创建IPv6 Only虚拟机,所以这里给Proxmox VE主机配置一个IPv6 DNS,后续虚拟机的cloud-init都可以直接用主机的这个DNS,不需要单独修改了:
Proxmox VE配置SSL证书、生成API Token
在生产环境中,ConvoyPanel要求Proxmox VE主机必须拥有有效的SSL证书。
转到系统–>凭证–>添加ACME账户:
填写账户名和邮箱地址,随便起个名字:
质询类型HTTP,然后填写你解析到Proxmox VE的域名(本文假设域名为pve-buf.example.com):
点击立即预定凭证来申请SSL证书:
后续就可以通过https://pve-buf.example.com:8006来访问Proxmox VE的Web UI了。
现在我们需要创建一个API令牌,转到数据中心–>权限–>API令牌–>添加:
用户选择:root@pam,取消勾选“特权分离”,有效期设置为永久:
会回显给你一个密钥,复制保存下来待会需要用到。
启用Proxmox VE的防火墙
ConvoyPanel在创建虚拟机时会使用ipset对虚拟机的网络进行限制,目的是为了防止MAC地址欺骗、IPv4/v6地址欺骗。为了让这个功能能够生效,我们需要启用PVE的防火墙功能。
首先是启用Proxmox VE数据中心级别的防火墙,为了避免把自己关在外面这种事情发生,请务必先把输入策略改为ACCEPT,或者至少先添加22、8006端口的ACCEPT规则:
然后启用对应节点级别的防火墙:
至于特定于虚拟机级别的防火墙不需要我们手动开启,ConvoyPanel在克隆系统模板创建虚拟机时会自动启用虚拟机的防火墙并添加相应的ipset规则。
在ConvoyPanel添加节点
至此所有需要在Proxmox VE上配置的内容就全部完成了。接下来转到ConvoyPanel,创建一个Location,这里演示我设置为BUF:
创建一个新的节点:
1.Display Name:输入一个名称来标识你的节点。
2.Location Group:选择之前创建的Location。
3.Node Name In Proxmox:输入与Proxmox VE节点名称相同的名称,例如我在Proxmox VE WebUI上看到的是pve,那么这里就填写pve:
4.Verify TLS Certificates:勾选此项验证TLS证书
5.Token ID:填写之前在Proxmox VE WebUI上的创建的API Token名称
6.Secret:填写之前在Proxmox VE WebUI上生成的API Token Secret
7.FQDN:输入你的Proxmox VE域名(FQDN)(不要带http/https前缀)
8.Port:输入你的Proxmox VE的端口。默认情况下为:8006
配置内存、存储、网络等信息:
9.Memory Allocation:输入ConvoyPanel管理的内存分配量(以MiB为单位)
10.Memory Overallocation:输入可以过度分配的内存百分比(%)
11.Disk Allocation:输入ConvoyPanel管理的硬盘分配大小(以MiB为单位)
12.Disk Overallocation:输入可以过度分配的硬盘空间(以MiB为单位)
13.VM Storage:填写用于保存磁盘映像的存储名称,在Proxmox VE WebUI可以看到对应的存储可以用于存储什么内容:
14.Backup Storage:输入要保存备份的存储名称。
15.ISO Storage:输入用于保存ISO文件的存储名称。
16.Network:输入你的网桥名称,本文在之前的Proxmox VE网络配置环节配置的网桥名是vmbr0。
配置IPAM
IPAM是ConvoyPanel的IP地址管理功能,ConvoyPanel会使用IPAM池里面的地址为虚拟机分配IP地址。
我们首先要创建一个Pool,指定可用的节点为刚才添加的:
填写具体的内容:
选择Multiple可以一次性创建多个地址,类型选择IPv6,填写Starting Address(开始地址)和Ending Address(结束地址)。
地址范围可以使用这个网址计算:http://www.gestioip.net/cgi-bin/subnet_calculator.cgi
例如HE IPv6 Tunnel分配给你的/48子网是2001:470:152f::1/48,那么你在网页上按下图所示填写:
然后点击如图所示位置,会列出可用的前256个地址(2001:470:152f:10::1-2001:470:152f:10::100)
把第一个地址(2001:470:152f:10::1)和最后一个地址(2001:470:152f:10::100)分别填写到Starting Address(开始地址)和Ending Address(结束地址)。
[注意]不要把整个/48子网的地址都填写上去,因为地址太多了会导致ConvoyPanel报错无法添加,并且也不方便后续管理。256个地址一般情况下足够使用了,如果还不够,可以直接在这个网页内拆分子网(subnet-level I),例如一个/48可以拆分出65536个/64:
拆分出的/64子网随便选择一个,然后重复之前的步骤即可计算出新的可用地址:
CIDR对于本文而言填写48,因为我们刚才申请的HE Tunnel IPv6子网就是/48。请注意这个CIDR不代表最终虚拟机实际可用的IPv6地址,默认情况下ConvoyPanel只会给虚拟机分配一个可用IPv6。
Gateway(网关)填写之前在vmbr0上配置的IPv6地址。
Mac Address留空,让Proxmox VE随机生成。Assigned Server留空。
配置ConvoyPanel使用Proxmox VE系统模板
转到Node–>Templates创建两个新的模板组:
在对应的模板组里面添加之前创建好的系统模板,ConvoyPanel使用vmid来匹配Proxmox VE的系统模板:
创建一台虚拟机
现在程序对接了,IPAM配置了,系统模板也配置了,是时候创建一台虚拟机了:
成功开机了:
从控制台登录进去简单测试下虚拟机的各项配置是否按预期工作:
配置Coterm隐藏Proxmox VE真实域名和IP
在刚才通过控制台访问虚拟机的时候不难发现浏览器中的URL是直接指向了Proxmox VE的真实域名的,这在生产环境中不太安全,此时Coterm就派上用场了,Coterm相当于是一个控制台代理,最终用户通过Coterm的域名来访问控制台,从而避免暴露Proxmox VE的真实域名。这是可选的,只是为了安全起见,但最好还是配置一下。如果你决定要配置Coterm,最好单独使用一台服务器进行配置。
首先在ConvoyPanel创建一个Coterm实例:
其中FQDN是一个用于提供给最终用户访问的“前端域名”,本文示例vnc-buf.example.com。当用户在前端访问vnc-buf.example.com时,请求会转发到pve-buf.example.com。
创建完成后会回显一个TOKEN,复制保存下来后续需要用到。
安装Docker和NGINX:
apt -y update apt -y install curl nginx python3-certbot-nginx curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh
创建目录新建compose文件:
mkdir /opt/coterm && cd /opt/coterm && nano docker-compose.yml
写入如下内容:
services: coterm: image: ghcr.io/convoypanel/coterm:latest restart: unless-stopped ports: - 127.0.0.1:2115:2115 env_file: - .env
再创建一个env文件:
nano .env
写入如下内容,CONVOY_URL配置为你的ConvoyPanel面板域名,COTERM_TOKEN修改为之前你复制的值:
CONVOY_URL=https://console.example.com COTERM_TOKEN=yourtoken DANGEROUS_DISABLE_TLS_VERIFICATION=false
配置NGINX反向代理:
nano /etc/nginx/sites-available/coterm.conf
写入如下内容:
server { listen 80; server_name vnc-buf.example.com; # 配置Coterm的域名 client_max_body_size 0; location / { proxy_pass http://127.0.0.1:2115; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
启用站点:
ln -s /etc/nginx/sites-available/coterm.conf /etc/nginx/sites-enabled/
签发SSL证书:
certbot --nginx
这篇文章不关心你的Proxmox VE是如何安装的,只要你的Proxmox VE能够按照这篇文章配置好HE IPv6 Tunnel,能够知道自己的Proxmox VE用的存储名是什么,那就能够按照文章里面的步骤来开小鸡,所以这篇文章没有记录Proxmox VE的安装步骤。有关ConvoyPanel与Paymenter、WHMCS等计费程序集成的步骤放到后面的文章写了。
另外ConvoyPanel的作者目前正在开发V10版本,到时候发布V10了估计有很多更新和改动,还是值得期待一下的。