It is now possible to upload qcow2 images. These images will be converted to raw disk images on the cloud server. In the CLI you can use the new `--format=qcow2` flag to upload qcow2 images. In the library you can set `UploadOptions.ImageFormat` to `FormatQCOW2`. Because of the underlying process, qcow2 images need to be written to a file first. This limits their size to 960 MB at the moment. The CLI automatically checks the file size (if possible) and shows a warning if this limit would be triggered. The library accepts an input with the file size and logs a warning if the limit would be triggered. Closes #44 |
||
|---|---|---|
| .github | ||
| cmd | ||
| docs/cli | ||
| hcloudimages | ||
| internal | ||
| scripts | ||
| .gitignore | ||
| .goreleaser.yaml | ||
| CHANGELOG.md | ||
| go.mod | ||
| go.sum | ||
| go.work | ||
| go.work.sum | ||
| LICENSE | ||
| main.go | ||
| README.md | ||
| renovate.json | ||
hcloud-upload-image
Quickly upload any raw disk images into your Hetzner Cloud projects!
About
The Hetzner Cloud API does not support uploading disk images directly, and it only provides a limited set of default images. The only option for custom disk images that users have is by taking a "snapshot" of an existing servers root disk. These can then be used to create new servers.
To create a completely custom disk image, users have to follow these steps:
- Create server with the correct server type
- Enable rescue system for the server
- Boot the server
- Download the disk image from within the rescue system
- Write disk image to servers root disk
- Shut down the server
- Take a snapshot of the servers root disk
- Delete the server
This is an annoyingly long process. Many users have automated this with Packer &
packer-plugin-hcloud before, but Packer offers a lot of
additional complexity to wrap your head around.
This repository provides a simple CLI tool & Go library to do the above.
Getting Started
CLI
Binary
We provide pre-built deb, rpm and apk packages. Alternatively we also provide the binaries directly.
Check out the GitHub release artifacts for all of these files and archives.
Arch Linux
You can get hcloud-upload-image-bin from the AUR.
Use your preferred wrapper to install:
yay -S hcloud-upload-image-bin
go install
If you already have a recent Go toolchain installed, you can build & install the binary from source:
go install github.com/apricote/hcloud-upload-image@latest
Usage
export HCLOUD_TOKEN="<your token>"
hcloud-upload-image upload \
--image-url "https://example.com/disk-image-x86.raw.bz2" \
--architecture x86 \
--compression bz2
To learn more, you can use the embedded help output or check out the CLI help pages in this repository.:
hcloud-upload-image --help
hcloud-upload-image upload --help
hcloud-upload-image cleanup --help
Go Library
The functionality to upload images is also exposed in the library hcloudimages! Check out the reference documentation for more details.
Install
go get github.com/apricote/hcloud-upload-image/hcloudimages
Usages
package main
import (
"context"
"fmt"
"net/url"
"github.com/hetznercloud/hcloud-go/v2/hcloud"
"github.com/apricote/hcloud-upload-image/hcloudimages"
)
func main() {
client := hcloudimages.NewClient(
hcloud.NewClient(hcloud.WithToken("<your token>")),
)
imageURL, err := url.Parse("https://example.com/disk-image-x86.raw.bz2")
if err != nil {
panic(err)
}
image, err := client.Upload(context.TODO(), hcloudimages.UploadOptions{
ImageURL: imageURL,
ImageCompression: hcloudimages.CompressionBZ2,
Architecture: hcloud.ArchitectureX86,
})
if err != nil {
panic(err)
}
fmt.Printf("Uploaded Image: %d", image.ID)
}
Contributing
If you have any questions, feedback or ideas, feel free to open an issue or pull request.
License
This project is licensed under the MIT license, unless the file explicitly specifies another license.
Support Disclaimer
This is not an official Hetzner Cloud product in any way and Hetzner Cloud does not provide support for this.