An extensible universal virtualization management platform that supports LXD, Incus, Docker, Podman, Containerd, Proxmox VE, QEMU/KVM, and KubeVirt.
The automated integration test report is available at: oneclickvirt.github.io/oneclickvirt
The report supports bilingual display (Chinese/English) and light/dark theme switching, covering 200+ API endpoint tests including functional, permission, boundary, and security tests. See action_tests/ for details.
| 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 |
Avoid compiling from source whenever possible. We recommend deploying using separate binary files or directly pulling the Docker image for deployment.
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:20260417 | All-in-one version with specific date | Fixed version requirement |
spiritlhl/oneclickvirt:no-db | Standalone database version | Without database |
spiritlhl/oneclickvirt:no-db-20260417 | Standalone database version with date | Without database |
All images support both linux/amd64 and linux/arm64 architectures.
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
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 passwordNote:
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.
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
docker-compose up -d --build || docker compose up -d --build
Default Configuration:
http://localhost:8888oneclickvirt, no password./data/mysql./data/app/Initialization Configuration:
When accessing for the first time, you will enter the initialization interface. Please fill in the database configuration as follows:
mysql (container name, not 127.0.0.1)3306oneclickvirtrootCustom 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
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
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
cd web
npm i
npm run serve
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 oneclickvirt in 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.
After system initialization, the following default accounts will be generated:
admin / Admin123!@#Tip: Please change the default passwords immediately after first login.
The main configuration file is located at server/config.yaml
Thank the following platforms for providing testing:
