Profile
Back to NewsBack
GitHub Trending 5 min
Reader Mode
subuk/vmango: Your own personal IaaS cloud

subuk/vmango: Your own personal IaaS cloud

16 hours ago

vmango

Vmango is a virtual machines management web interface written using Go.

The main goal of project is not to provide a hypervisor configuration tool, because that problem already solved by many configuration management systems like Ansible or Puppet, but provide a convenient way to manage virtual machines on existing hypervisors.

Current features:

  • SSH keys management and injection
  • Volume management
  • KVM machines via libvirt
  • Web console
  • Support for cloud OS images (with cloud-init installed)
  • Custom userdata for cloud-init
  • Bridged network

Binary quick start

Download a ready-built archive for Linux x64, Windows x64 or macOS arm64 from GitHub Releases, then follow the binary quick-start guide (website). It covers runtime dependencies, checksums, libvirt connectivity, an administrator password and zero-node troubleshooting. No Docker or Go compiler is needed. Windows includes libvirt DLLs for remote hosts; ISO tools are separate.

See HOWTO-RELEASE.md for CI and the manually triggered release workflow, its inputs and verification scope.

Installation

Stable packages are published from tagged releases.

RHEL 8, 9 and 10 (x86_64)

Enable the release COPR repository and install the package:

sudo dnf install -y dnf-plugins-core
sudo dnf copr enable subuk/vmango
sudo dnf install vmango

Edit /etc/vmango.conf, then enable the service:

sudo systemctl enable --now vmango

Ubuntu 22.04, 24.04 and 26.04 LTS (amd64)

Use the release PPA:

sudo add-apt-repository ppa:subuk/vmango
sudo apt-get update
sudo apt-get install vmango

Edit /etc/vmango.conf before starting the service. The PPA packages target Ubuntu; they are not Debian distribution builds.

Debian 12 and 13 (amd64)

Use the Ubuntu 22.04 Jammy package from the release PPA, following the Debian package instructions. The repository suite must remain jammy, not the Debian codename. Package validation checks installation and startup on both Debian versions.

Hypervisor configuration

Install libvirt and qemu-kvm.

Ubuntu:

sudo apt-get install libvirt-bin qemu-kvm qemu-system

Centos:

yum install -y libvirt qemu-kvm systemctl enable --now libvirtd

Allow your user to access libvirt socket:

sudo usermod -aG libvirtd [username] newgrp libvirtd

Download vm images to default libvirt pool location:

cd /var/lib/libvirt/images/ wget https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-1901.qcow2 wget https://cloud-images.ubuntu.com/minimal/releases/bionic/release/ubuntu-18.04-minimal-cloudimg-amd64.img

Define default volume pool (if not exists) and start it:

virsh pool-define-as default dir --target /var/lib/libvirt/images/ virsh pool-start default virsh pool-autostart default

Local run

Building requires Go 1.26 or newer and the libvirt development libraries.

Copy vmango.dist.conf to vmango.conf and change configuration if needed.

Run app

make && ./bin/vmango web

View it on http://localhost:8080 (login with admin / admin by default)

The VNC console uses noVNC 1.7 and requires a modern browser. For remote access, serve Vmango over HTTPS; browser APIs used by noVNC require a secure context (localhost is also supported).

CSRF protection uses Go's net/http.CrossOriginProtection: browser requests are checked using Sec-Fetch-Site and Origin, without form tokens. Reverse proxies must preserve these headers and the public Host. Set web.base_url to the public HTTPS URL and enable web.session_secure behind a TLS proxy. Requests without either browser header are treated as non-browser requests; session authentication is still required for protected routes.

Dependencies for Ubuntu 14.04+

Install libvirt and kvm

sudo apt-get install libvirt-dev libvirt-bin qemu-kvm qemu-system genisoimage

Install Go compiler. Configure libvirt as described above. Now you can use your own computer as hypervisor.

Dependencies for MacOS

Install Go compiler, libvirt C library and mkisofs util (for configdrive creation)

brew install go brew install libvirt brew install dvdrtools

For local VMs, install QEMU (brew install qemu) and use libvirt's qemu:///session connection with HVF acceleration and a matching guest architecture. A remote Linux/KVM host is also supported.

See local acceptance testing for a real VM lifecycle test on macOS or Linux. Ordinary tests run with make test.

Documentation development

The homepage uses a standalone HTML template in docs/layouts/home.html and plain CSS in docs/static/landing/style.css. It does not load Docsy styles or JavaScript. Hugo still builds the complete site, with Docsy reserved for the documentation routes. The homepage is a compact project overview with package links and source build instructions.

The documentation in docs/ uses Docsy 0.18. It requires Hugo Extended 0.163.0 or newer, Node.js 22 or newer, and the native Dart Sass executable (sass) on PATH. Install Dart Sass outside the project directory; the JavaScript-only npm sass package does not support Hugo's embedded protocol. See the Hugo Sass setup guide.

cd docs
npm ci
npm run hugo -- server

After updating the Docsy module, run hugo mod npm pack and npm install to refresh its npm workspace and lockfile. Commit docs/packages/hugoautogen/ along with the dependency manifests.

Build RPM

In an RPM build environment providing Go 1.26 or newer and libvirt-devel:

make rpm

The legacy CentOS 7/8 Docker images in dockerbuild/ are not maintained; use a supported distribution with the required compiler or the COPR builders.

Build DEB

With Docker for Ubuntu 24.04:

./dockerbuild.sh ubuntu-2404 make deb

Locally:

make deb

DEB builds require golang-1.26-go; debian/rules selects /usr/lib/go-1.26/bin explicitly. Ubuntu 22.04, 24.04 and 26.04 provide this compiler through their standard repositories with updates/security enabled. RPM and DEB builds use vendored modules and GOTOOLCHAIN=local, so the compiler must be installed before building. Both package builds run make test.

Package validation and releases

Maintainer instructions for manual package validation and release publication are in HOWTO-RELEASE.md. Pushing a branch does not publish distribution packages.

Chat with me