| cmd | ||
| hcloudimages | ||
| internal/ui | ||
| go.mod | ||
| go.sum | ||
| go.work | ||
| go.work.sum | ||
| LICENSE | ||
| main.go | ||
| README.md | ||
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
TODO
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
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:
hcloud-upload-image --help
hcloud-upload-image upload --help
hcloud-upload-image cleanup --help
Go Library
The functionality to upload images is also exposed as a library! Check out the reference documentation.
To install:
go get github.com/apricote/hcloud-upload-image
Example Usage:
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)
}
Support Disclaimer
This is not an official Hetzner Cloud product in any way and Hetzner Cloud does not provide support for this.