{"id":2155,"date":"2020-07-06T08:52:47","date_gmt":"2020-07-06T05:52:47","guid":{"rendered":"https:\/\/upcloud.com\/global\/us\/resources\/tutorials\/storage-import-api\/"},"modified":"2020-07-06T08:52:47","modified_gmt":"2020-07-06T05:52:47","slug":"storage-import-api","status":"publish","type":"tutorial","link":"https:\/\/upcloud.com\/global\/resources\/tutorials\/storage-import-api\/","title":{"rendered":"How to upload data using the Storage Import API"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">If you are looking to migrate to UpCloud or want to use your own media, get started quickly using Storage Import. The Storage Import API allows you to easily import installation media or even entire virtual machine images.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Migrate servers from on-premise or any other cloud quickly and easily by simply creating new storage out of your server image and deploying it to a cloud server.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/signup.upcloud.com\/\">Test hosting on UpCloud!<\/a><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">How Storage Import Works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Storage Import creates a new installation media or server storage out of any system or server image available online by fetching the requested file and uploading it onto a new storage device. It can be useful for migrating existing server images from on-premise hosting or from other cloud providers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Storage Import is also handy for using custom installation media if your favourite Linux distribution is not yet available as a public template or ready-made install disk.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Supported file types:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RAW storage images<\/li>\n\n\n\n<li>IMG storage images<\/li>\n\n\n\n<li>ISO archive files<\/li>\n\n\n\n<li>GZIP compressed files<\/li>\n\n\n\n<li>XZ compressed files<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The target storage needs to be free and not in operation, either;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>detached from any cloud server<\/li>\n\n\n\n<li>if attached, the cloud server needs to be shutdown<\/li>\n\n\n\n<li>not in a maintenance state<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Note that the system image or installation media you wish to upload needs to be made available for download for Storage Import to be able to retrieve it. The process supports the use of HTTPS and Basic Auth for secure upload.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setting password protection using Basic Auth<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We recommend using Basic Auth password protection when preparing files and images for upload. This needs to be done on the webserver that is hosting your files and the steps will differ depending on the operating system and web server in use. Here we\u2019ve outlined some of the options you have for setting password protection on files and folders on your web server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Start by installing Apache2 utils. The utils package includes a password generator tool which we\u2019ll be using to encode the credentials.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo apt install apache2-utils<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Afterwards, continue below with the instructions applicable to your web server.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Apache2<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Generate a password file using the <tt>htpasswd<\/tt> command as shown below. Replace the <span style=\"color: #ff0000;\">username<\/span> with whatever you want to use. On running the command, you will be asked to set the password, and enter it twice when prompted.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo htpasswd -c \/etc\/apache2\/.htpasswd <span style=\"color: #ff0000;\">username<\/span><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">New password:\nRe-type new password:\nAdding password for user username<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Next, edit your site configuration. The file name will differ depending on your set up but it\u2019s generally stored in <tt>\/etc\/apache2\/sites-available\/<\/tt> and ends in <tt>.conf<\/tt> file type notation.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo nano \/etc\/apatche2\/sites-available\/<span style=\"color: #ff0000;\">example.conf<\/span><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once you\u2019ve opened the file for editing, add the following authentication parameters as shown below if not already present. You may need to add the <em>&lt;Directory \u201c\/path\/to\/html\u201d&gt;<\/em> segment if your configuration does not contain one. You can set the path to your webroot to enable authentication site-wide.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">VirtualHost *:80&gt;\n    ...\n    &lt;Directory \"\/var\/www\/html\"&gt;\n        AuthName \"Restricted\"\n        AuthType Basic\n        AuthBasicProvider file\n        AuthUserFile \"\/etc\/apache2\/.htpasswd\"\n        Require valid-user\n        ...\n    &lt;\/Directory&gt;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Alternatively, if you want to only enable authentication for a specific folder, set the directory with the path to the folder containing your private files. Otherwise include the same parameters.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">VirtualHost *:80&gt;\n    ...\n    &lt;Directory \"\/var\/www\/html<span style=\"color: #ff0000;\">\/files<\/span>\"&gt;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">When done, save the file and exit the editor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then reload the webserver.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo systemctl reload apatche2<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Done! You should now be prompted for credentials when browsing to the password-protected URL.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Nginx<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">We\u2019ll use the <em>htpasswd<\/em> installed above also with nginx web servers. Run the following command to generate a password file. Replace the <span style=\"color: #ff0000;\">username<\/span> with whatever you wish. When\u00a0running the command, you will be asked to set the password and enter it twice when prompted.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo htpasswd -c \/etc\/nginx\/.htpasswd <span style=\"color: #ff0000;\">username<\/span><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">New password:\nRe-type new password:\nAdding password for user username<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once you\u2019ve generated the password file, you\u2019ll need to set it in your web server configuration file. The file name will differ depending on your website but it\u2019s generally stored in <tt>\/etc\/nginx\/sites-available\/<\/tt> and ends in <tt>.conf<\/tt> file type notation.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo nano \/etc\/nginx\/sites-available\/<span style=\"color: #ff0000;\">example.conf<\/span><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With the website configuration open for edit, set enables authentication by adding the two parameters as shown below. Adding these two lines directly to the server section will enable password protection for the whole site.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">server {\n        ...\n        auth_basic \"Restricted access\";\n        auth_basic_user_file \/etc\/nginx\/.htpasswd;\n        ...\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Alternatively, you can include the authentication parameters within a location segment to set the password for a specific directory.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">server {\n        ...\n        location <span style=\"color: #ff0000;\">\/files<\/span> {\n                auth_basic \"Restricted access\";\n                auth_basic_user_file \/etc\/nginx\/.htpasswd;\n        }\n        ...\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once done, save the file and exit the editor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can test that the syntax is correct before applying the changes by using the next command.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo nginx -t<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">nginx: the configuration file \/etc\/nginx\/nginx.conf syntax is ok\nnginx: configuration file \/etc\/nginx\/nginx.conf test is successful<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If you get a confirmation such as the one shown above, you are ready to enable the new configuration by reloading the nginx service.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo systemctl reload nginx<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That\u2019s it! Your files are now set to require authentication to access and be safe from prying eyes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Accessing password-protected files<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When fetching password-protected files, add your credentials at the beginning of the URL separated from the rest by an @ sign.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">https:\/\/<span style=\"color: #ff0000;\">username:password@<\/span>example.com\/files\/system.img<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Storage Import API should then be able to access your target file and begin uploading it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Create new storage for import<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The UpCloud API allows users to run programmable requests to manage and operate their cloud resources. It\u2019s a quick way to get started by using the Storage Import API with just a couple of commands instead of going through the steps in the control panel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you are not yet familiar with the UpCloud API, learn more in our <a href=\"https:\/\/upcloud.com\/global\/community\/\n\/tutorials\/getting-started-upcloud-api\/\" target=\"_blank\" rel=\"noopener\">getting started tutorial<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Create new storage for import<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">First, you will need a storage device of the same size or larger than the file you want to import. If you do not already have free storage, create a new one with the following request.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">POST \/1.3\/storage\/<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n  \"storage\": {\n    \"size\": \"10\",\n    \"tier\": \"maxiops\",\n    \"title\": \"storage-import\",\n    \"zone\": \"fi-hel1\"\n  }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">When done, you\u2019ll see a response similar to the example below. Note down your storage UUID as you will need it for the other API operations.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"storage\": {\n      \"access\": \"private\",\n      \"backup_rule\": {},\n      \"backups\": {\n         \"backup\": []\n      },\n      \"license\": 0,\n      \"servers\": {\n         \"server\": []\n      },\n      \"size\": 10,\n      \"state\": \"online\",\n      \"tier\": \"maxiops\",\n      \"title\": \"import-test-ubuntu-20-04\",\n      \"type\": \"normal\",\n      \"uuid\": \"<span style=\"color: #99cc00;\">0108427c-aff8-4ce9-9897-849fb89feae0<\/span>\",\n      \"zone\": \"fi-hel1\"\n   }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once you have a suitable storage device available, continue with one of the two import methods below.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Create Storage Import<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Storage Import API offers two methods for importing data: <strong>HTTP import<\/strong> or <strong>direct upload<\/strong>. Depending on your file size and where it\u2019s stored, you may wish to use one over the other.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It\u2019s also possible to <a href=\"https:\/\/upcloud.com\/global\/resources\/tutorials\/storage-import\">use Storage Import via your UpCloud Control Panel<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>HTTP Import<\/strong> is used to upload files made available on a web server. This is often more convenient for uploading larger files such as storage images between cloud servers. It can also be used to upload installation media directly from the OS provider\u2019s download link.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Direct upload<\/strong> allows uploading straight from your local computer without the need for setting up a web server. This requires the use of a tool such as <tt>curl<\/tt> to run the upload and which needs to remain open until the import has finished.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">HTTP Import<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When you have a storage device ready for import, begin the upload by sending the following request. Set the UUID of your target storage device in the request and the URL of the file you want to import in the body text as shown in the example below.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">POST \/1.3\/storage\/<span style=\"color: #ff0000;\">{uuid}<\/span>\/import<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n  \"storage_import\": {\n    \"source\": \"http_import\",\n    \"source_location\": \"<span style=\"color: #ff0000;\">https:\/\/user:password@example.com\/files\/system.img<\/span>\"\n  }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On successful request, you\u2019ll see a response similar to the following example. The initial state of the upload will show preparing or prepared.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"storage_import\": {\n      \"client_content_length\": 0,\n      \"client_content_type\": \"\",\n      \"completed\": \"\",\n      \"created\": \"2020-06-23T19:13:15Z\",\n      \"error_code\": \"\",\n      \"error_message\": \"\",\n      \"md5sum\": \"\",\n      \"read_bytes\": 0,\n      \"sha256sum\": \"\",\n      \"source\": \"http_import\",\n      \"source_location\": \"https:\/\/[REDACTED]@example.com\/files\/system.img\",\n      <span style=\"color: #99cc00;\">\"state\": \"prepared\"<\/span>,\n      \"uuid\": \"0747a8c1-3a34-4908-925e-9ef9a369af51\",\n      \"written_bytes\": 0\n   }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The import operation will then commence granted the URL you submitted is accessible.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Direct upload<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To begin direct upload, use the following request to create the import task. Set the UUID of your target storage device in the request and the source as <tt>direct_upload<\/tt> like in the example underneath.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">POST \/1.3\/storage\/<span style=\"color: #ff0000;\">{uuid}<\/span>\/import<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n  \"storage_import\": {\n    \"source\": \"direct_upload\"\n  }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You will then see a response such as an example output below. The response includes the <em>direct_upload_url<\/em> that can be used to start the upload itself.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"storage_import\": {\n      \"client_content_length\": 0,\n      \"client_content_type\": \"\",\n      \"completed\": \"\",\n      \"created\": \"2020-06-26T16:06:59Z\",\n      \"error_code\": \"\",\n      \"error_message\": \"\",\n      \"md5sum\": \"\",\n      \"read_bytes\": 0,\n      \"sha256sum\": \"\",\n      \"source\": \"direct_upload\",\n      \"direct_upload_url\": \"<span style=\"color: #99cc00;\">https:\/\/fi-hel1.img.upcloud.com\/uploader\/session\/0747a8c1-3a34-4908-925e-9ef9a369af51<\/span>\",\n      \"state\": \"prepared\",\n      \"uuid\": \"0747a8c1-3a34-4908-925e-9ef9a369af51\",\n      \"written_bytes\": 0\n   }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can then import files straight from your local computer by using the direct upload method. Note that the link will expire after 10 minutes if the direct upload is not started.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">curl --data-binary @\/path\/to\/files\/system.img --fail -XPUT https:\/\/fi-hel1.img.upcloud.com\/uploader\/session\/0747a8c1-3a34-4908-925e-9ef9a369af51<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">When using something other than raw images (for example, a gzipped image), you need to also supply the Content-Type header.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">curl -H 'Content-Type: application\/gzip' --data-binary @\/path\/to\/files\/system.img.gz --fail -XPUT https:\/\/fi-hel1.img.upcloud.com\/uploader\/session\/0747a8c1-3a34-4908-925e-9ef9a369af51<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once the upload has finished, you\u2019ll see an output similar to the example underneath.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"written_bytes\":9521070080,\n   \"md5sum\":\"f03d31c11136e24c10c705b7b3efc39f\",\n   \"sha256sum\":\"caf3fd69c77c439f162e2ba6040e9c320c4ff0d69aad1340a514319a9264df9f\"\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That\u2019s it! The data you imported is then available on the target storage devices for you to use as you wish.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Storage Import status<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The import process will take time depending on the size of the file and the speed of the network connectivity. Especially system storage images are often large and require more time to upload.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can check the state of the process using the following request. Set the UUID of your import storage device in the request URL.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">GET \/1.3\/storage\/<span style=\"color: #ff0000;\">{uuid}<\/span>\/import<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The response will show the current state of the importing process and the progress made in writing to the storage so far.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"storage_import\": {\n      \"client_content_length\": 10737418240,\n      \"client_content_type\": \"\",\n      \"completed\": \"\",\n      \"created\": \"2020-06-23T19:15:57Z\",\n      \"error_code\": \"\",\n      \"error_message\": \"\",\n      \"md5sum\": \"\",\n      \"read_bytes\": 1661214003,\n      \"sha256sum\": \"\",\n      \"source\": \"http_import\",\n      \"source_location\": \"https:\/\/[REDACTED]@example.com\/files\/system.img\",\n      <span style=\"color: #99cc00;\">\"state\": \"importing\"<\/span>,\n      \"uuid\": \"0734ad68-e715-4687-89c5-774d708b9515\",\n      \"written_bytes\": 1661214003\n   }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Feel free to check the import status again later to see how the operation is progressing.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cancelling Storage Import<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When the upload is started via the Storage Import API to a stand-alone storage device, the process will continue in the background without interruption to other operations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">However, if you wish to stop the import, you can cancel the operation using the following API request. Set the UUID of your import storage device in the request URL.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">POST \/1.3\/storage\/<span style=\"color: #ff0000;\">{uuid}<\/span>\/import\/cancel<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You will then get a response something along the lines of the example underneath. The state of the import will first show cancelling.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n   \"storage_import\": {\n      \"client_content_length\": 10737418240,\n      \"client_content_type\": \"\",\n      \"completed\": \"2020-06-23T19:19:09Z\",\n      \"created\": \"2020-06-23T19:15:57Z\",\n      \"error_code\": \"CLIENT_FAILURE\",\n      \"error_message\": \"import task was cancelled\",\n      \"md5sum\": \"6b2bfc737ef922f47ed4751d474170c6\",\n      \"read_bytes\": 2494455091,\n      \"sha256sum\": \"19567e0a4c83ae010c35fa094e5832e09ac20655912141138df38354ef51d030\",\n      \"source\": \"http_import\",\n      \"source_location\": \"https:\/\/[REDACTED]@example.com\/files\/system.img\",\n      <span style=\"color: #99cc00;\">\"state\": \"cancelling\"<\/span>,\n      \"uuid\": \"0734ad68-e715-4687-89c5-774d708b9515\",\n      \"written_bytes\": 2494455091\n   }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">After cancelling, the storage device will return to the normal online state and again allow new storage import or other requests.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Making use of new storage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once your upload has finished, you can put the new storage device to use the way you wish.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Storage image with a boot partition<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If your storage image contains a boot partition, you can set it as the main device for a standalone cloud server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depending on your system storage and the previous networking setup, you may not have network access out of the box. You can use the web console at your UpCloud Control Panel or any VNC viewer to <a href=\"https:\/\/upcloud.com\/global\/resources\/tutorials\/connecting-to-your-server\">reach your cloud server<\/a> to restore connectivity.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The default network interfaces on our cloud servers include the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Public IPv4 for Internet access<\/li>\n\n\n\n<li>Private utility network<\/li>\n\n\n\n<li>Public IPv6 network connection<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If you do not need all of the default network interfaces, you can detach unwanted networks to simplify your setup. Then <a href=\"https:\/\/upcloud.com\/global\/resources\/tutorials\/attaching-new-ip-addresses\">configure the network connection<\/a> you want to use.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">File storage<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Storage images that contain a file system can be mounted to any cloud server to access the files. Uploaded storage will work much the same as any other storage device allowing you to <a href=\"https:\/\/upcloud.com\/global\/resources\/tutorials\/adding-removing-storage-devices\">mount it at the directory point<\/a> you wish.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Installation media<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you uploaded <a href=\"https:\/\/upcloud.com\/global\/resources\/tutorials\/using-own-install-media\">installation media<\/a>, change the boot order to select CDROM as the first device and get started with the installation process at the next startup.<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","community-category":[271,265,247],"class_list":["post-2155","tutorial","type-tutorial","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/tutorial\/2155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/tutorial"}],"about":[{"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/types\/tutorial"}],"author":[{"embeddable":true,"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/comments?post=2155"}],"version-history":[{"count":0,"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/tutorial\/2155\/revisions"}],"wp:attachment":[{"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/media?parent=2155"}],"wp:term":[{"taxonomy":"community-category","embeddable":true,"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/community-category?post=2155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}