From 920cb640d93fb4106c50a3bdf7318ed859a206b0 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Sun, 27 Apr 2025 08:43:55 +0200 Subject: [PATCH 1/6] object-storage: Restructure documentation The getting started article was getting a little out of hand, including all sorts of information, not really necessary for getting started. --- ...onfigure-remote-storage-for-magento-2-x.md | 2 +- ...nfigure-remote-storage-for-shopware-6-x.md | 2 +- docs/hypernode-platform/object-storage.md | 13 ++ .../object-storage/cancellation.md | 15 +++ .../getting-started-with-object-storage.md | 125 ------------------ .../object-storage/getting-started.md | 68 ++++++++++ .../object-storage/managing-objects.md | 56 ++++++++ 7 files changed, 154 insertions(+), 127 deletions(-) create mode 100644 docs/hypernode-platform/object-storage/cancellation.md delete mode 100644 docs/hypernode-platform/object-storage/getting-started-with-object-storage.md create mode 100644 docs/hypernode-platform/object-storage/getting-started.md create mode 100644 docs/hypernode-platform/object-storage/managing-objects.md diff --git a/docs/ecommerce-applications/magento-2/how-to-configure-remote-storage-for-magento-2-x.md b/docs/ecommerce-applications/magento-2/how-to-configure-remote-storage-for-magento-2-x.md index 1ad73561..bd56c277 100644 --- a/docs/ecommerce-applications/magento-2/how-to-configure-remote-storage-for-magento-2-x.md +++ b/docs/ecommerce-applications/magento-2/how-to-configure-remote-storage-for-magento-2-x.md @@ -100,7 +100,7 @@ aws s3 sync var/import_export s3://my_bucket_name/import_export Both methods are significantly faster than Magento’s built-in sync, as aws s3 sync handles uploads concurrently. ```{tip} -More information about the `hypernode-object-storage` command can be found in the [Object Storage article](../../hypernode-platform/object-storage/getting-started-with-object-storage.md). +More information about the `hypernode-object-storage` commands can be found in the [Object Storage documentation](../../hypernode-platform/object-storage.md). ``` ## The storage flag file in the bucket diff --git a/docs/ecommerce-applications/shopware-6/how-to-configure-remote-storage-for-shopware-6-x.md b/docs/ecommerce-applications/shopware-6/how-to-configure-remote-storage-for-shopware-6-x.md index 30869f96..825cdd97 100644 --- a/docs/ecommerce-applications/shopware-6/how-to-configure-remote-storage-for-shopware-6-x.md +++ b/docs/ecommerce-applications/shopware-6/how-to-configure-remote-storage-for-shopware-6-x.md @@ -96,7 +96,7 @@ aws s3 sync public/media/ s3://bucket_name/media/ ``` ```{tip} -More information about the `hypernode-object-storage` command can be found in the [Object Storage article](../../hypernode-platform/object-storage/getting-started-with-object-storage.md). +More information about the `hypernode-object-storage` command can be found in the [Object Storage documentation](../../hypernode-platform/object-storage.md). ``` ## Serving assets from your S3 bucket diff --git a/docs/hypernode-platform/object-storage.md b/docs/hypernode-platform/object-storage.md index c18e8a3b..4851d89c 100644 --- a/docs/hypernode-platform/object-storage.md +++ b/docs/hypernode-platform/object-storage.md @@ -10,11 +10,24 @@ redirect_from: # Object Storage +Hypernode Object Storage provides an option to store media files, assets, backups, documents, etc in a persistent, remote storage container. + +Object storage eliminates redundancy and provides a centralized, scalable solution for storing application assets, session data, and backups. + +By default, media files are stored in the same filesystem that contains the application. This is inefficient for complex, multi-server configurations, and can result in degraded performance when sharing resources. + +With Object Storage you get: + +- Effortless Data Sharing – Seamless access across all Hypernodes +- Full Access Control & Security – Secure and manage your data with ease +- Safe Backup & Monitoring – Ensure reliability with built-in insights + ```{toctree} --- caption: Table of Contents maxdepth: 1 glob: --- +object-storage/getting-started object-storage/* ``` diff --git a/docs/hypernode-platform/object-storage/cancellation.md b/docs/hypernode-platform/object-storage/cancellation.md new file mode 100644 index 00000000..2dfa1ac2 --- /dev/null +++ b/docs/hypernode-platform/object-storage/cancellation.md @@ -0,0 +1,15 @@ +--- +myst: + html_meta: + description: Learn how to cancel Hypernode Object Storage + title: Hypernode Object Storage | Cancellation +--- + +# Cancellation + +To cancel an Object Storage Workspace, you can ssh into the Hypernode that is linked to that Object Storage and run `hypernode-object-storage cancel`. + +```{note} +The cancellation will be in effect from the end of the month. +Also if you change your mind or forgot to pull some data. It will still be available for 7 days after the cancellation. You can always reach out to the support team for help if that happens. +``` diff --git a/docs/hypernode-platform/object-storage/getting-started-with-object-storage.md b/docs/hypernode-platform/object-storage/getting-started-with-object-storage.md deleted file mode 100644 index 627d0827..00000000 --- a/docs/hypernode-platform/object-storage/getting-started-with-object-storage.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -myst: - html_meta: - description: Getting started with Object Storage - title: Hypernode Object Storage | Getting Started -redirect_from: - - /en/hypernode/object-storage/getting-started-with-object-storage/ ---- - -# What is Hypernode Object Storage? - -Hypernode Object Storage provides an option to store media files, assets, backups, documents, etc in a persistent, remote storage container. - -Object storage eliminates redundancy and provides a centralized, scalable solution for storing application assets, session data, and backups. - -By default, media files are stored in the same filesystem that contains the application. This is inefficient for complex, multi-server configurations, and can result in degraded performance when sharing resources. - -With Object Storage you get: - -- Effortless Data Sharing – Seamless access across all Hypernodes -- Full Access Control & Security – Secure and manage your data with ease -- Safe Backup & Monitoring – Ensure reliability with built-in insights - -# Getting started with Object Storage - -## CLI option - -You can run the CLI command with the `--help` command to find out about all the options and arguments. - -```bash -hypernode-object-storage --help -``` - -### Creating a Hypernode Object Storage Workspace - -1. SSH into your server. -1. Run `hypernode-object-storage create` -1. Fill in the prompts with a name and desired storage. -1. Confirm your order and give it a few minutes before your storage is ready. - -Note: You can use one object storage across multiple Hypernodes. But you can only use one object storage space per Hypernode. - -### Retrieve object storage - -1. Run `hypernode-object-storage info` -1. If you want to retrieve your credentials for the workspace pass in the flag `--with-credentials`. - -The output should look like the following: - -```console -app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage info -+--------------------------------------+--------------+--------+------------+----------------+---------------+---------------+ -| UUID | Name | Plan | Hypernodes | Management URL | Access Key | Secret Key | -+--------------------------------------+--------------+--------+------------+----------------+---------------+---------------+ -| d8770125-6c90-4770-b00f-1716f699990a | test-storage | OS50GB | testnode12 | **sensitive** | **sensitive** | **sensitive** | -+--------------------------------------+--------------+--------+------------+----------------+---------------+---------------+ -``` - -You can use the credentials and the URL now to configure remote storage for your application with the help of the following articles: - -1. [How to configure remote storage for Magento 2.x](../../ecommerce-applications/magento-2/how-to-configure-remote-storage-for-magento-2-x.md) -1. [How to configure remote storage for Shopware 6.x](../../ecommerce-applications/shopware-6/how-to-configure-remote-storage-for-shopware-6-x.md) - -### Cancel/Delete Object Storage - -To cancel an Object Storage, you can ssh into the Hypernode that is linked to that Object Storage and run `hypernode-object-storage cancel` - -```{note} -The cancellation will be in effect from the end of the month. -Also if you change your mind or forgot to pull some data. It will still be available for 7 days after the cancellation. You can always reach out to the support team for help if that happens. -``` - -### Managing objects in object storage - -You can manage your objects using the `hypernode-object-storage objects` subcommand. -It supports all common operations--listing, copying, moving, and deleting files--while also allowing you to sync files in the background and monitor the progress of an ongoing sync. - -```console -app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage objects --help -usage: hypernode-object-storage objects [-h] {sync,cp,ls,mv,rm,show} ... - -Manage objects in object storage - -positional arguments: - {sync,cp,ls,mv,rm,show} - sync Synchronize files between a local directory and an object storage location - cp Copy a file or object from one location to another - ls List objects in an S3 bucket or folder - mv Move or rename a file or object - rm Delete an object from S3 - show Display the current status of an ongoing sync process - -options: - -h, --help show this help message and exit -``` - -It is important to note that `hypernode-object-storage objects` supports all optional flags available in `aws s3`, allowing you to customize its behavior for advanced configurations. - -#### Syncing files and monitoring progress - -Syncing files between your local directory and object storage is simple. Run the following command: - -```console -app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage objects sync /example/local/path/ s3://example/bucket/uri/ -Syncing objects from /example/local/path/ to s3://example/bucket/uri/... -Sync process started with PID 1234 in the background. -``` - -The `sync` operation runs in the background, and you can monitor its progress by using the `show` command, for example: - -```console -app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage objects show 1234 -Completed 9.7 GiB/~30.0 GiB (118.2 MiB/s) with ~5 file(s) remaining (calculating...) -``` - -If you run the `show` command after the sync operation has finished, you’ll see output like this: - -```console -app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage objects show 1234 -Process 1234 does not exist anymore -``` - -## UI option - Control Panel - -Coming soon diff --git a/docs/hypernode-platform/object-storage/getting-started.md b/docs/hypernode-platform/object-storage/getting-started.md new file mode 100644 index 00000000..f2481d25 --- /dev/null +++ b/docs/hypernode-platform/object-storage/getting-started.md @@ -0,0 +1,68 @@ +--- +myst: + html_meta: + description: Getting started with Object Storage + title: Hypernode Object Storage | Getting Started +redirect_from: + - hypernode-platform/object-storage/getting-started-with-object-storage +--- + +# Getting started with Hypernode Object Storage + +You can run the CLI command with the `--help` command to find out about all the options and arguments. + +```bash +hypernode-object-storage --help +``` + +## Creating a Hypernode Object Storage Workspace + +**Command-line interface (CLI)** + +1. SSH into your server. +1. Run `hypernode-object-storage create` +1. Fill in the prompts with a name and desired storage. +1. Confirm your order and give it a few minutes before your storage is ready. + +**Control Panel** + +1. Go to the [Control Panel](https://my.hypernode.com). +1. Click the **Order a workspace** button in the top-right. +1. Select the desired options for your workspace and proceed to checkout. + + +```{note} +You can use one object storage across multiple Hypernodes. But you can only use one object storage space per Hypernode. +``` + +## Retrieve object storage information + +**Command-line interface (CLI)** + +1. Run `hypernode-object-storage info` +1. If you want to retrieve your credentials for the workspace pass in the flag `--with-credentials`. + +The output should look like the following: + +```console +app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage info +UUID | d8770125-6c90-4770-b00f-1716f699990a +Name | example-storage +Plan | OS50GB +Versioning | Disabled +Hypernodes | example +Endpoint URL | **sensitive** +Access Key | **sensitive** +Secret Key | **sensitive** +``` + +**Control Panel** +1. Go to the [Control Panel](https://my.hypernode.com). +1. Click on the **Object Storage** tab in the left sidebar. +1. Click your workspace. +1. Click the **Show credentials** button in the top-right corner. + +You can use the credentials and the URL now to configure remote storage for your application with the help of the following articles: + +1. [How to configure remote storage for Magento 2.x](../../ecommerce-applications/magento-2/how-to-configure-remote-storage-for-magento-2-x.md) +1. [How to configure remote storage for Shopware 6.x](../../ecommerce-applications/shopware-6/how-to-configure-remote-storage-for-shopware-6-x.md) diff --git a/docs/hypernode-platform/object-storage/managing-objects.md b/docs/hypernode-platform/object-storage/managing-objects.md new file mode 100644 index 00000000..b008cef5 --- /dev/null +++ b/docs/hypernode-platform/object-storage/managing-objects.md @@ -0,0 +1,56 @@ +--- +myst: + html_meta: + description: Learn how to manage objects in Hypernode Object Storage + title: Hypernode Object Storage | Managing Objects +--- + +# Managing Objects + +You can manage your objects using the `hypernode-object-storage objects` subcommand. +It supports all common operations--listing, copying, moving, and deleting files--while also allowing you to sync files in the background and monitor the progress of an ongoing sync. + +```console +app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage objects --help +usage: hypernode-object-storage objects [-h] {sync,cp,ls,mv,rm,show} ... + +Manage objects in object storage + +positional arguments: + {sync,cp,ls,mv,rm,show} + sync Synchronize files between a local directory and an object storage location + cp Copy a file or object from one location to another + ls List objects in an S3 bucket or folder + mv Move or rename a file or object + rm Delete an object from S3 + show Display the current status of an ongoing sync process + +options: + -h, --help show this help message and exit +``` + +It is important to note that `hypernode-object-storage objects` supports all optional flags available in `aws s3`, allowing you to customize its behavior for advanced configurations. + +## Syncing files and monitoring progress + +Syncing files between your local directory and object storage is simple. Run the following command: + +```console +app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage objects sync /example/local/path/ s3://example/bucket/uri/ +Syncing objects from /example/local/path/ to s3://example/bucket/uri/... +Sync process started with PID 1234 in the background. +``` + +The `sync` operation runs in the background, and you can monitor its progress by using the `show` command, for example: + +```console +app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage objects show 1234 +Completed 9.7 GiB/~30.0 GiB (118.2 MiB/s) with ~5 file(s) remaining (calculating...) +``` + +If you run the `show` command after the sync operation has finished, you’ll see output like this: + +```console +app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage objects show 1234 +Process 1234 does not exist anymore +``` From a70b619700c24d1c23ca461eca35926a4cb25668 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Sun, 27 Apr 2025 08:44:57 +0200 Subject: [PATCH 2/6] object-storage: Add object versioning article --- .../object-storage/_res/stu_screenshot.png | Bin 0 -> 41944 bytes .../object-storage/object-versioning.md | 54 ++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 docs/hypernode-platform/object-storage/_res/stu_screenshot.png create mode 100644 docs/hypernode-platform/object-storage/object-versioning.md diff --git a/docs/hypernode-platform/object-storage/_res/stu_screenshot.png b/docs/hypernode-platform/object-storage/_res/stu_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb560d5131cfea2ca3811e9b4bac31ab1896944 GIT binary patch literal 41944 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 literal 0 HcmV?d00001 diff --git a/docs/hypernode-platform/object-storage/object-versioning.md b/docs/hypernode-platform/object-storage/object-versioning.md new file mode 100644 index 00000000..efa98a9c --- /dev/null +++ b/docs/hypernode-platform/object-storage/object-versioning.md @@ -0,0 +1,54 @@ +--- +myst: + html_meta: + description: Learn how to enable and use Hypernode Object Storage Versioning + title: Hypernode Object Storage | Object Versioning +--- + +# Object Versioning + +With object versioning, you can keep track of changes made to your objects in the Object Storage workspace. This allows you to restore previous versions of your objects when needed. + +## Enabling Object Versioning + +To enable object versioning, you can use the `update` command with the `--enable-versioning` flag. This will enable versioning for all objects in your Object Storage workspace. + + +```console +app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage update --enable-versioning +Enabling versioning... +``` + +It's also possible to enable versioning in the Control Panel. To do this, go to the Object Storage workspace you want to enable versioning for, and flip the Object Versioning toggle. + +```{note} +Object versioning increases the storage space used by your objects. Each version of an object is stored separately, so if you have a lot of changes to your objects, you may need a bigger storage plan at some point. +``` + +## Restoring object revisions + +With the `restore` command, you can restore an object to the state it was in at a specific point in time. You can specify the date and time of the revision you want to restore, as well as the object path. + +The date and time should be in the format `YYYY-MM-DD HH:MM:SS`. The object path can be the full path to the object you want to restore or a path to a directory. If you specify a directory, all objects in that directory will be restored to the specified revision. + +```console +app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage restore main "2025-04-24 06:00:00" media/catalog/product/e/x/example.jpg +``` + +By default, the `restore` command will only show what it would do without actually restoring the objects. To actually restore the objects, you need to add the `--apply` flag. + +```{note} +The `restore` command restores objects in place. This means that the current version of the object will be replaced with the version you are restoring. If you want to keep the current version of the object (or directory), you should make a copy of it before running the `restore` command. +``` + +## Interactively exploring revisions + +You can also explore your objects and their revisions interactively using the `explore` subcommand. This will open a terminal UI file browser where you can navigate through your objects and their versions. + +```console +app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage explore +``` + +Here's an example of how the terminal UI looks when you run the `explore` command: + +![](_res/stu_screenshot.png) From 44231aca15bb9300339d53404840cd48db7ddfbd Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Sun, 27 Apr 2025 08:45:32 +0200 Subject: [PATCH 3/6] bin/watch: Allow build_docs to fail When build_docs fails, it doesn't matter. The error shows up, writer fixes the error and tries again. --- bin/watch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/watch b/bin/watch index dda345b6..8a2360b1 100755 --- a/bin/watch +++ b/bin/watch @@ -7,7 +7,7 @@ from time import sleep def build_docs(): - subprocess.check_call("bin/build_docs") + subprocess.run("bin/build_docs") def refresh_assets(): From 5b98c40742c8b8cd83e5c8b68f394e93619fbf57 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Sun, 27 Apr 2025 08:46:49 +0200 Subject: [PATCH 4/6] docs/conf.py: Fix weird HTML title suffix With this patch, the title now has a `- Hypernode Documentation` suffix instead of `- Docs dev documentation`. --- docs/conf.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index f0a19823..984c80e1 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -21,13 +21,14 @@ # -- Project information ----------------------------------------------------- -project = "Docs" +project = "Documentation" +html_title = "Hypernode Documentation" current_year = datetime.now().year copyright = f"{current_year}, Hypernode" author = "Hypernode" # The full version, including alpha/beta/rc tags -release = "dev" +release = "latest" # -- General configuration --------------------------------------------------- From fe4615a187cf5f60d195b0c98d28eb2966342a40 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Sun, 27 Apr 2025 08:54:14 +0200 Subject: [PATCH 5/6] object-storage: Fix formatting errors --- docs/hypernode-platform/object-storage/getting-started.md | 2 +- docs/hypernode-platform/object-storage/object-versioning.md | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/hypernode-platform/object-storage/getting-started.md b/docs/hypernode-platform/object-storage/getting-started.md index f2481d25..def89b3d 100644 --- a/docs/hypernode-platform/object-storage/getting-started.md +++ b/docs/hypernode-platform/object-storage/getting-started.md @@ -30,7 +30,6 @@ hypernode-object-storage --help 1. Click the **Order a workspace** button in the top-right. 1. Select the desired options for your workspace and proceed to checkout. - ```{note} You can use one object storage across multiple Hypernodes. But you can only use one object storage space per Hypernode. ``` @@ -57,6 +56,7 @@ Secret Key | **sensitive** ``` **Control Panel** + 1. Go to the [Control Panel](https://my.hypernode.com). 1. Click on the **Object Storage** tab in the left sidebar. 1. Click your workspace. diff --git a/docs/hypernode-platform/object-storage/object-versioning.md b/docs/hypernode-platform/object-storage/object-versioning.md index efa98a9c..de4b4e19 100644 --- a/docs/hypernode-platform/object-storage/object-versioning.md +++ b/docs/hypernode-platform/object-storage/object-versioning.md @@ -13,7 +13,6 @@ With object versioning, you can keep track of changes made to your objects in th To enable object versioning, you can use the `update` command with the `--enable-versioning` flag. This will enable versioning for all objects in your Object Storage workspace. - ```console app@abcdef-example-magweb-cmbl:~$ hypernode-object-storage update --enable-versioning Enabling versioning... From 68d179c1ebb2e8f4e25048634fd3e3067e317f5a Mon Sep 17 00:00:00 2001 From: Dominik Matic Date: Tue, 29 Apr 2025 10:45:01 +0200 Subject: [PATCH 6/6] small fixes --- docs/hypernode-platform/object-storage/cancellation.md | 2 +- docs/hypernode-platform/object-storage/getting-started.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/hypernode-platform/object-storage/cancellation.md b/docs/hypernode-platform/object-storage/cancellation.md index 2dfa1ac2..aa983931 100644 --- a/docs/hypernode-platform/object-storage/cancellation.md +++ b/docs/hypernode-platform/object-storage/cancellation.md @@ -7,7 +7,7 @@ myst: # Cancellation -To cancel an Object Storage Workspace, you can ssh into the Hypernode that is linked to that Object Storage and run `hypernode-object-storage cancel`. +To cancel an Object Storage Workspace, you can SSH into the Hypernode that is linked to that Object Storage and run `hypernode-object-storage cancel`. ```{note} The cancellation will be in effect from the end of the month. diff --git a/docs/hypernode-platform/object-storage/getting-started.md b/docs/hypernode-platform/object-storage/getting-started.md index def89b3d..80bb122b 100644 --- a/docs/hypernode-platform/object-storage/getting-started.md +++ b/docs/hypernode-platform/object-storage/getting-started.md @@ -9,7 +9,7 @@ redirect_from: # Getting started with Hypernode Object Storage -You can run the CLI command with the `--help` command to find out about all the options and arguments. +You can run the CLI command with the `--help` flag to find out about all the options and arguments. ```bash hypernode-object-storage --help