OneClickVirt Virtualization Management Platform
An extensible universal virtualization management platform that supports LXD, Incus, Docker, Podman, Containerd, Proxmox VE, QEMU/KVM, and KubeVirt.
Language
Detailed Description
Integration Test Report
The automated integration test report is available at: oneclickvirt.github.io/oneclickvirt
The report supports bilingual display (Chinese/English), light/dark theme switching, Git ref/SHA/run metadata, and server log expansion for failed cases, covering 200+ API endpoint tests including functional, permission, boundary, and security tests. See action_tests/ for details.
Supported Virtualization Platforms
| Type ID | Platform | Instance Types | Repository |
|---|---|---|---|
lxd |
LXD | container, vm | oneclickvirt/lxd |
incus |
Incus | container, vm | oneclickvirt/incus |
docker |
Docker | container | oneclickvirt/docker |
podman |
Podman | container | oneclickvirt/podman |
containerd |
Containerd (nerdctl) | container | oneclickvirt/containerd |
proxmox |
Proxmox VE | container, vm | oneclickvirt/pve |
qemu |
QEMU | vm | oneclickvirt/qemu |
kubevirt |
KubeVirt | vm | oneclickvirt/kubevirt |
Quick Deployment
Avoid compiling from source whenever possible. We recommend deploying using separate binary files or directly pulling the Docker image for deployment.
Method 1: Using Pre-built Images
Use pre-built multi-architecture images that automatically downloads the appropriate version for your system architecture.
Image Tags:
| Image Tag | Description | Use Case |
|---|---|---|
spiritlhl/oneclickvirt:latest |
All-in-one version (built-in database) | Quick deployment |
spiritlhl/oneclickvirt:20260612 |
All-in-one version with specific date | Fixed version requirement |
spiritlhl/oneclickvirt:no-db |
Standalone database version | Without database |
spiritlhl/oneclickvirt:no-db-20260612 |
Standalone database version with date | Without database |
All images support both linux/amd64 and linux/arm64 architectures.
View All-in-One Version (Built-in Database)
Basic Usage (without domain configuration):
docker run -d \
--name oneclickvirt \
-p 80:80 \
-v oneclickvirt-data:/var/lib/mysql \
-v oneclickvirt-storage:/app/storage \
--restart unless-stopped \
spiritlhl/oneclickvirt:latest
Configure Domain Access:
If you need to configure a domain, set the FRONTEND_URL environment variable:
docker run -d \
--name oneclickvirt \
-p 80:80 \
-e FRONTEND_URL="https://your-domain.com" \
-v oneclickvirt-data:/var/lib/mysql \
-v oneclickvirt-storage:/app/storage \
--restart unless-stopped \
spiritlhl/oneclickvirt:latest
Or using GitHub Container Registry:
docker run -d \
--name oneclickvirt \
-p 80:80 \
-e FRONTEND_URL="https://your-domain.com" \
-v oneclickvirt-data:/var/lib/mysql \
-v oneclickvirt-storage:/app/storage \
--restart unless-stopped \
ghcr.io/oneclickvirt/oneclickvirt:latest
View Standalone Database Version
Use external database for smaller image size and faster startup:
docker run -d \
--name oneclickvirt \
-p 80:80 \
-e FRONTEND_URL="https://your-domain.com" \
-e DB_HOST="your-mysql-host" \
-e DB_PORT="3306" \
-e DB_NAME="oneclickvirt" \
-e DB_USER="root" \
-e DB_PASSWORD="your-password" \
-v oneclickvirt-storage:/app/storage \
--restart unless-stopped \
spiritlhl/oneclickvirt:no-db
Environment Variables:
FRONTEND_URL: Frontend access URL (required, supports http/https)DB_HOST: Database host addressDB_PORT: Database port (default 3306)DB_NAME: Database nameDB_USER: Database usernameDB_PASSWORD: Database password
Note:
FRONTEND_URLis used to configure the frontend access address, affecting features like CORS and OAuth2 callbacks. The system will automatically detect HTTP/HTTPS protocol and adjust configurations accordingly. The protocol prefix can be either http or https.
Method 2: Using Docker Compose
View Docker Compose Deployment
Use Docker Compose to deploy the complete development environment with one command, using multi-container deployment architecture with separate frontend, backend, and database containers:
git clone https://github.com/oneclickvirt/oneclickvirt.git
cd oneclickvirt
cat > .env << 'EOF'
MYSQL_ROOT_PASSWORD=change-this-root-password
MYSQL_PASSWORD=change-this-app-password
EOF
docker-compose up -d --build || docker compose up -d --build
Default Configuration:
- Frontend service:
http://localhost:8888 - Backend API: Accessed via frontend proxy
- MariaDB database: Port 3306, database name
oneclickvirt - Database credentials:
MYSQL_ROOT_PASSWORDandMYSQL_PASSWORDfrom.env - Data persistence:
- Database data: Docker volume
mysql_data - Application storage:
./data/app/
- Database data: Docker volume
Initialization Configuration:
When accessing for the first time, you will enter the initialization interface. Please fill in the database configuration as follows:
- Database Host:
mysql(container name, not 127.0.0.1) - Database Port:
3306 - Database Name:
oneclickvirt - Database User:
oneclickvirt - Database Password: Use the
MYSQL_PASSWORDvalue from.env
Custom Port (Optional):
To modify the frontend access port, edit the ports configuration in docker-compose.yaml:
services:
web:
ports:
- "your-port:80" # e.g., "80:80" or "8080:80"
Stop Services:
docker-compose down
View Logs:
docker-compose logs -f
Clean Data:
docker-compose down
rm -rf ./data
Method 3: Bare-metal Full Installer
View Full Installer
scripts/install_full.sh installs the database, reverse proxy, TLS configuration, frontend, backend, and system service in one flow. It supports MySQL-compatible local databases (MySQL or MariaDB) and Caddy, Nginx, or OpenResty.
The installer auto-detects common Linux and Unix-like targets, including Debian/Ubuntu, RHEL/CentOS/Rocky/Alma/Fedora/Amazon Linux, openSUSE/SLES, Arch/Manjaro, Alpine, and BSD package managers. It also detects systemd, OpenRC, rc.d/service, and no-init environments. On distributions where native MySQL packages are unavailable or unstable, the installer automatically falls back to MariaDB as the MySQL-compatible backend; use --no-db-fallback to disable this behavior. BSD installs require a matching release asset for the OS/architecture, otherwise use Docker/Linux or build the server from source.
The domain input auto-detects protocol prefixes: enter https://panel.example.com to auto-enable TLS, http://panel.example.com to auto-disable TLS, or a plain domain to be prompted interactively.
curl -fsSL https://raw.githubusercontent.com/oneclickvirt/oneclickvirt/main/scripts/install_full.sh -o install_full.sh
bash install_full.sh
For non-interactive deployment:
# HTTPS with auto TLS
bash install_full.sh \
--non-interactive \
--domain https://panel.example.com \
--email [email protected] \
--db-type mariadb \
--proxy caddy
# HTTP only, no TLS
bash install_full.sh \
--non-interactive \
--domain http://192.168.1.100 \
--proxy caddy
Useful automation flags:
bash install_full.sh --version v1.2.3 --db-wait-timeout 300
bash install_full.sh --db-type mysql --no-db-fallback
The installer requires at least 20 GB free disk and 4 GB memory by default. It writes the generated database password to the final installation summary; save it before closing the terminal.
Method 4: Build from Source
View Build Instructions
If you need to modify the source code or build custom images:
All-in-One Version (Built-in Database):
git clone https://github.com/oneclickvirt/oneclickvirt.git
cd oneclickvirt
docker build -t oneclickvirt .
docker run -d \
--name oneclickvirt \
-p 80:80 \
-v oneclickvirt-data:/var/lib/mysql \
-v oneclickvirt-storage:/app/storage \
--restart unless-stopped \
oneclickvirt
Docker builds embed scripts/install_agent.sh automatically. If you also want the controller image to serve local agent release archives instead of redirecting to GitHub Releases, place these files in server/assets/agent/ before docker build:
install_agent.sh
oneclickvirt-agent-linux-amd64.tar.gz
oneclickvirt-agent-linux-arm64.tar.gz
Standalone Database Version:
git clone https://github.com/oneclickvirt/oneclickvirt.git
cd oneclickvirt
docker build -f Dockerfile.no-db -t oneclickvirt:no-db .
docker run -d \
--name oneclickvirt \
-p 80:80 \
-e FRONTEND_URL="https://your-domain.com" \
-e DB_HOST="your-mysql-host" \
-e DB_PORT="3306" \
-e DB_NAME="oneclickvirt" \
-e DB_USER="root" \
-e DB_PASSWORD="your-password" \
-v oneclickvirt-storage:/app/storage \
--restart unless-stopped \
oneclickvirt:no-db
Direct source builds of the Go controller behave the same way: local agent assets in server/assets/agent/ are optional, and missing files fall back to the official GitHub installer/releases instead of breaking the build.
Development and Testing
View Development Setup
Environment Requirements
- Go 1.24.5
- Node.js 22+
- MySQL 5.7+
- npm or yarn
Environment Deployment
-
Build frontend
cd web npm i npm run serve -
Build backend
cd server go mod tidy go run main.go -
In development mode, there's no need to proxy the backend, as Vite already includes backend proxy requests.
-
Create an empty database named
oneclickvirtin MySQL, and record the corresponding account and password. -
Access the frontend address, which will automatically redirect to the initialization interface. Fill in the database information and related details, then click initialize.
-
After completing initialization, it will automatically redirect to the homepage, and you can start development and testing.
Local Development
- Frontend: http://localhost:8080
- Backend API: http://localhost:8888
- API Documentation: http://localhost:8888/swagger/index.html
Initial Account
The administrator account is created from the setup form during first initialization. The quick-fill action generates a random strong password each time; save the generated value before submitting the form.
Configuration File
The main configuration file is located at server/config.yaml
Thanks
Thank the following platforms for providing testing:
LICENSE
Demo Screenshots
