A native JavaScript integration for the Hetzner cloud to easily manage your resources.
Import library from the ESM.SH CDN for fast and easy setup:
Simply include hetzner-cloud in your html <header> tag.
<scripttype="module">import*ashetznerAPIfrom"//esm.sh/gh/rahatool/hetzner-cloud";</script>In order to be able to use hetzner-cloud in web workers, you need to import the source file as an ES6 module using:
import*ashetznerAPIfrom"//esm.sh/gh/rahatool/hetzner-cloud";Use the package manager npm to install hetzner-cloud.
$ npm install github:rahatool/hetzner-cloud
$ npm install npm:node-fetchIf you want to run examples in Node.js runtime environment, you need to add below lines of code at the top of them.
importfetchfrom'node-fetch';global.fetch=fetch;Grab the latest release file.
First of all you have to register your api token. To obtain an api token go to your project on Hetzner Cloud Console and navigate to access.
import{setAccessToken,Server,FloatingIP,SSHKey,Image,Volume,Network,ISO,Pricing,ServerType,Location,Datacenter,Action}from"@raha.group/hetzner-cloud";setAccessToken('your api token');classServer{staticgetAll(options?: {status?: enum{initializing,starting,running,stopping,off,deleting,rebuilding,migrating,unknown},sort?: enum{id,name,created},name?: String,label_selector?: Array}}): AsyncGeneratorFunction<Server>;staticget(identifier: Number): Promise<Server>;/*includes root_password@throws Error if placement_error*/save(): Promise<Server>;destroy(): Promise<Action>;metrics(options: {type: enum{cpu, disk, network},start: String,end: String,step?: Number}): Promise<Object>;powerOn(): Promise<Action>;/*soft-reboot*/reboot(): Promise<Action>;/*Cuts power to a server and starts it again. This forcefully stops it without giving the server operating system time to gracefully stop. This may lead to data loss, it’s equivalent to pulling the power cord and plugging it in again. Reset should only be used when reboot does not work.*/reset(): Promise<Action>;shutdown(): Promise<Action>;/*Cuts power to the server. This forcefully stops it without giving the server operating system time to gracefully stop. May lead to data loss, equivalent to pulling the power cord. Power off should only be used when shutdown does not work.*/powerOff(): Promise<Action>;resetPassword(): Promise<{root_password: String,action: Action}>;/*@throws Error if rescue_already_enabled.*/enableRescue(options?: {type?: enum{linux64,linux32,freebsd64},ssh_keys?: Array}): Promise<{root_password: String,action: Action}>;/*@throws Error if rescue_already_disabled*/disableRescue(): Promise<Action>;createImage(options?: {description?: String,type?: enum{snapshot,backup},labels?: Object}): Promise<{image: Image,action: Action}>;enableBackup(): Promise<Action>;disableBackup(): Promise<Action>;rebuild(options: {image: String}): Promise<{root_password: String,action: Action}>;/*@throws Error if server_not_stopped or invalid_server_type.*/changeType(options: {upgrade_disk: Boolean,server_type: String}): Promise<Action>;attachISO(options: {iso: String}): Promise<Action>;detachISO(): Promise<Action>;changeReverseDNS(options: {ip: String,dns_ptr: String}): Promise<Action>;changeProtection(options: {delete?: Boolean,rebuild?: Boolean}): Promise<Action>;requestConsole(): Promise<{wss_url: String,password: String,action: Action}>;attachToNetwork(options: {network: Number,ip?: String,alias_ips?: Array}): Promise<Action>;detachFromNetwork(options: {network: Number}): Promise<Action>;changeAliasIPs(options: {network, Number,alias_ips: Array}): Promise<Action>;actions(options?: {status: enum{running,success,error},sort: enum{id, command, status, progress, started, finished}}): AsyncGeneratorFunction<Action>;}// Create a Serverletresource=newServer;resource.populate({name: String,server_type: String,start_after_create?: Boolean,image: String,ssh_keys?: Array,volumes?: Array,networks?: Array,user_data?: String,labels?: Object,automount?: Boolean,location?: String,datacenter?: String,});awaitresource.save();// Update a Serverletresource=newServer;resource.populate({id: Number,name?: String,labels?: Object,}).save();// Delete a Serverletresource=awaitServer.get(id);awaitresource.destroy();// Get a Serverletresource=awaitServer.get(id);// await resource.action(parameters);// Get all Serversforawait(letresourceofServer.getAll({name: 'test',label_selector: ['k','!k','k in (v1,v2,v3)','k notin (v1,v2,v3)']})){console.log(resource);forawait(letactionofresource.actions({status: 'error',sort: 'started:desc'})){console.log(action);}}classFloatingIP{staticgetAll(options?: {sort?: enum{id,created},label_selector?: String}): AsyncGeneratorFunction<FloatingIP>;staticget(identifier: Number): Promise<FloatingIP>;save(): Promise<FloatingIP>;destroy(): Promise<Action>;assign(options?: {server: Number}): Promise<Action>;unassign(): Promise<Action>;changeReverseDNS(options?: {ip: String,dns_ptr: String}): Promise<Action>changeProtection(options: {delete?: Boolean}): Promise<Action>;actions(options?: {status: enum{running,success,error},sort: enum{id,command,status,progress,started,finished}}): AsyncGeneratorFunction<Action>;}// Create a FloatingIPletresource=newFloatingIP;resource.populate({type: enum{ipv4, ipv6},server?: Number,home_location?: String,description?: String,labels?: Object,});awaitresource.save();// Update a FloatingIPletresource=newFloatingIP;resource.populate({id: Number,description?: String,labels?: Object}).save();// Delete a FloatingIPletresource=awaitFloatingIP.get(id);awaitresource.destroy();// Get a FloatingIPletresource=awaitFloatingIP.get(id);// await resource.action(parameters);classSSHKey{staticgetAll(options?: {sort?: enum{id,name},name?: String,fingerprint?: String,label_selector?: String}): AsyncGeneratorFunction<SSHKey>;staticget(identifier: Number): Promise<SSHKey>;save(): Promise<SSHKey>;destroy(): Promise<Void>;}// Create a SSHKeyletresource=newSSHKey;resource.populate({name: String,public_key: String});awaitresource.save();// Update a SSHKeyletresource=newSSHKey;resource.populate({id: Number,name?: String,labels?: Object}).save();// Delete a SSHKeyletresource=awaitSSHKey.get(id);awaitresource.destroy();// Get a SSHKeyletresource=awaitSSHKey.get(id);// await resource.action(parameters);classImage{staticgetAll(options?: {sort?: enum{id,name,created},type?: {system,snapshot,backup},status?: {available,creating},bound_to?: String,name?: String,label_selector?: String}): AsyncGeneratorFunction<Image>;staticget(identifier: Number): Promise<Image>;/*@throws Error if request create image*/save(): Promise<Image>;destroy(): Promise<Action>;changeProtection(options: {delete?: Boolean}): Promise<Action>;actions(options?: {status: enum{running,success,error},sort: enum{id,command,status,progress,started,finished}}): AsyncGeneratorFunction<Action>;}// Note: The operation "Create an Image" is not available// Update an Imageletresource=newImage;resource.populate({id: Number,description?: String,type?,enum{snapshot},labels?: Object,}).save();// Delete an Imageletresource=awaitImage.get(id);awaitresource.destroy();// Get an Imageletresource=awaitImage.get(id);// await resource.action(parameters);classVolume{staticgetAll(options?: {status?: enum{available,creating},sort: enum{id, name, created},name?: String,label_selector?: String}): AsyncGeneratorFunction<Volume>;staticget(identifier: Number): Promise<Volume>;save(): Promise<Volume>;destroy(): Promise<Action>;attach(options: {server: Number,automount?: Boolean}): Promise<Action>;detach(): Promise<Action>;resize(options: {size: Number}): Promise<Action>;changeProtection(options: {delete?: Boolean}): Promise<Action>;actions(options?: {status: enum{running,success,error},sort: enum{id,command,status,progress,started,finished}}): AsyncGeneratorFunction<Action>;}// Create a Volumeletresource=newVolume;resource.populate({size: Number,name: String,labels?: Object,automount?: Boolean,format?: String,location?: String,server?: Number});awaitresource.save();// Update a Volumeletresource=newVolume;resource.populate({id: Number,name: String,labels?: Object}).save();// Delete a Volumeletresource=awaitVolume.get(id);awaitresource.destroy();// Get a Volumeletresource=awaitVolume.get(id);// await resource.action(parameters);classNetwork{staticgetAll(options?: {name?: String,label_selector?: String}): AsyncGeneratorFunction<Network>;staticget(identifier: Number): Promise<Network>;save(): Promise<Network>;destroy(): Promise<Action>;addSubnet(options: {type: String,ip_range?: String,network_zone?: String}): Promise<Action>;deleteSubnet(options: {ip_range: String}): Promise<Action>;addRoute(options: {destination: String,gateway,String}): Promise<Action>;deleteRoute(options: {destination: String,gateway: String}): Promise<Action>;changeIPRange(options: {ip_range: String}): Promise<Action>;changeProtection(options: {delete?: Boolean}): Promise<Action>;actions(options?: {status: enum{running,success,error},sort: enum{id,command,status,progress,started,finished}}): AsyncGeneratorFunction<Action>;}// Create a Networkletresource=newNetwork;resource.populate({name: String,ip_range: String,labels?: Object,subnets?: Array,routes?: Array,});awaitresource.save();// Update a Networkletresource=newNetwork;resource.populate({id: Number,name?: String,labels?: Object,}).save();// Delete a Networkletresource=awaitNetwork.get(id);awaitresource.destroy();// Get a Networkletresource=awaitNetwork.get(id);// await resource.action(parameters);ISOs are Read-Only images of DVDs
classISO{staticgetAll(options?: {name?: String}): AsyncGeneratorFunction<ISO>;staticget(identifier: Number): Promise<ISO>;}classPricing{staticgetAll(options?: {name?: String}): AsyncGeneratorFunction<Pricing>;}classServerType{staticgetAll(options?: {name?: String}): AsyncGeneratorFunction<ServerType>;staticget(identifier: Number): Promise<ServerType>;}classLocation{staticgetAll(options?: {name?: String}): AsyncGeneratorFunction<Location>;staticget(identifier: Number): Promise<Location>;}classDatacenter{staticgetAll(options?: {name?: String}): AsyncGeneratorFunction<Datacenter>;staticget(identifier: Number): Promise<Datacenter>;}classAction{staticgetAll(options?: {status?: enum{running,success,error},sort?: enum{id,command,status,progress,started,finished}}): AsyncGeneratorFunction<Action>;staticget(identifier: Number): Promise<Action>;}This project has been tested and works on the following engines:
- Chrome (desktop & Android)
- Firefox
- Opera
- Safari 12+ (desktop & iOS)
- Node.js 10+
This project by Raha Group is licensed under the CC-BY-SA-4.0 License.
Official Hetzner Cloud API documentation
Stay in touch with Raha’s community and keep track of development and community news by subscribing to the Raha’s Blog and YouTube channel.
The official docs are a great place to discover new things.
Are you experiencing problems with Raha? report issues and find solutions to your problems here.
You are always welcome to ask for more features to be added to Raha.
Stay up to date with meetups, conferences and more.
Looking for help? please first check out the official (mentioned above) and unofficial (e.g. Stack Overflow) resources. If you are still experiencing problems, feel free to create a new issue.
If you'd like Raha to grow even stronger, please become a sponsor today by donating via Paypal (Farnood) to support Raha's ongoing maintenance and development of new functionality.