From 208b07f3caeee7ce79f577246cf2f3b1cb866c8a Mon Sep 17 00:00:00 2001 From: Viktor Scharf Date: Fri, 7 Mar 2025 18:45:50 +0100 Subject: [PATCH] add upgrade guide --- .../20-getting-started/50-raspberry-pi.md | 2 +- docs/admin/40-maintenance/10-update.md | 6 -- docs/admin/40-maintenance/10-upgrade.md | 95 ++++++++++++++++++ docs/admin/40-maintenance/img/init-diff.png | Bin 0 -> 13502 bytes 4 files changed, 96 insertions(+), 7 deletions(-) delete mode 100644 docs/admin/40-maintenance/10-update.md create mode 100644 docs/admin/40-maintenance/10-upgrade.md create mode 100644 docs/admin/40-maintenance/img/init-diff.png diff --git a/docs/admin/20-getting-started/50-raspberry-pi.md b/docs/admin/20-getting-started/50-raspberry-pi.md index cfe69cee..b2eeb94e 100644 --- a/docs/admin/20-getting-started/50-raspberry-pi.md +++ b/docs/admin/20-getting-started/50-raspberry-pi.md @@ -215,7 +215,7 @@ How to set up DDNS in the router: - Search for the DDNS settings - these are usually located under Network, Internet or Dynamic DNS. - Select No-IP as your provider from the list of supported DDNS services. - Enter your No-IP credentials (username & password). -- Enter the hostname you previously created with No-IP (e.g. ocis-at-home.ddns.net). +- Enter the hostname you previously created with No-IP (e.g. opencloud-at-home.ddns.net). - Save the settings and test the connection. The router will now automatically update your public IP address at No-IP so that your Raspberry Pi always remains accessible under the selected subdomain. diff --git a/docs/admin/40-maintenance/10-update.md b/docs/admin/40-maintenance/10-update.md deleted file mode 100644 index 1ca83816..00000000 --- a/docs/admin/40-maintenance/10-update.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -sidebar_position: 1 -id: update -title: "Update" -draft: true ---- \ No newline at end of file diff --git a/docs/admin/40-maintenance/10-upgrade.md b/docs/admin/40-maintenance/10-upgrade.md new file mode 100644 index 00000000..071a5d1d --- /dev/null +++ b/docs/admin/40-maintenance/10-upgrade.md @@ -0,0 +1,95 @@ +--- +sidebar_position: 1 +id: update +title: "Upgrade" +description: "🔄 Keep your setup up to date with the latest features!" +--- + +import Tabs from '@theme/Tabs' +import TabItem from '@theme/TabItem' + +This guide provides steps to upgrade OpenCloud for both [docker](docs/admin/20-getting-started/30-docker.md) and [docker compose](docs/admin/20-getting-started/20-docker-compose.md) + +### 1. Stop OpenCloud + +Stop the currently running OpenCloud instance: + + + + ```Shell + docker stop opencloud + ``` + + + ```Shell + docker compose stop + ``` + + + +--- + +### 2. Backup Config and Data + +It is recommended to create a backup before proceeding with the upgrade. + +TODO: put backup link #103. + +--- + +### 3. Pull the new Opencloud version + +```Shell +docker pull opencloudeu/opencloud:{tag} +``` + +--- + +### 4. Verify Configuration Changes + +If upgrading from an older release, check for required configuration changes: + +Go to inside the container: +```Shell +docker run --rm -it --entrypoint /bin/sh -v $HOME/opencloud/opencloud-config:/etc/opencloud opencloudeu/opencloud:{tag} +``` + +```Shell +opencloud init --diff +``` + +If you see `no changes, your config is up to date`, no further action is needed. Otherwise, update your `opencloud.yaml` file accordingly and start OpenCloud. + +init -diff + +--- + +### 5. Start OpenCloud with updated image + + + + ```Shell + docker run \ + --name opencloud \ + --rm \ + -it \ + -p 9200:9200 \ + -v $HOME/opencloud/opencloud-config:/etc/opencloud \ + -v $HOME/opencloud/opencloud-data:/var/lib/opencloud \ + -e OC_INSECURE=true \ + -e PROXY_HTTP_ADDR=0.0.0.0:9200 \ + -e OC_URL=https://localhost:9200 \ + opencloudeu/opencloud:{tag} + ``` + + + ```Shell + OC_DOCKER_IMAGE=opencloudeu/opencloud OC_DOCKER_TAG=tag docker compose up -d + ``` + + + +--- + +### 6. Conclusion +Make sure that all previously created data, users, shared files, public links exist. diff --git a/docs/admin/40-maintenance/img/init-diff.png b/docs/admin/40-maintenance/img/init-diff.png new file mode 100644 index 0000000000000000000000000000000000000000..94b6f0a058bf2b95d72bb4b2856d3269aa16507e GIT binary patch literal 13502 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 literal 0 HcmV?d00001