From 8b6accc7959c4b335ffc76d2826bbb8ddcf277fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= <1005065+DeepDiver1975@users.noreply.github.com> Date: Mon, 30 Mar 2026 16:19:54 +0200 Subject: [PATCH 01/38] feat: drop non-docker deployment docs --- .../server/security_setup_warnings.adoc | 2 +- .../deployment_considerations.adoc | 19 +--- .../deployment_recommendations.adoc | 35 ++------ .../pages/installation/index.adoc | 10 +-- .../installation/system_requirements.adoc | 87 ++++--------------- modules/admin_manual/partials/nav.adoc | 9 -- 6 files changed, 29 insertions(+), 133 deletions(-) diff --git a/modules/admin_manual/pages/configuration/server/security_setup_warnings.adoc b/modules/admin_manual/pages/configuration/server/security_setup_warnings.adoc index 682301697..4a842ba14 100644 --- a/modules/admin_manual/pages/configuration/server/security_setup_warnings.adoc +++ b/modules/admin_manual/pages/configuration/server/security_setup_warnings.adoc @@ -65,7 +65,7 @@ The following pages describe how to enable HTTPS on the Apache webserver. == The test with getenv("PATH") only returns an empty response Some environments are not passing a valid PATH variable to ownCloud. -The xref:installation/configuration_notes_and_tips.adoc#php-fpm[PHP FPM tips] provides the information about how to configure your environment. +For Docker-based installations, ensure that the PATH variable is correctly set in the container environment via your Docker Compose configuration. == The "Strict-Transport-Security" HTTP header is not configured diff --git a/modules/admin_manual/pages/installation/deployment_considerations.adoc b/modules/admin_manual/pages/installation/deployment_considerations.adoc index e07d1df64..a2daa7acd 100644 --- a/modules/admin_manual/pages/installation/deployment_considerations.adoc +++ b/modules/admin_manual/pages/installation/deployment_considerations.adoc @@ -64,22 +64,9 @@ deadlocks with high-level file locking. == Software -=== Operating System - -We are dependent on distributions that offer an easy way to install the -various components in up-to-date versions. ownCloud has a partnership -with RedHat and SUSE for customers who need commercial support. -Canonical, the parent company of Ubuntu Linux, also offers enterprise -service and support. Debian and Ubuntu are free of cost, and include -newer software packages. CentOS is the community-supported free-of-cost -Red Hat Enterprise Linux clone. openSUSE is community-supported, and -includes many of the same system administration tools as SUSE Linux -Enterprise Server. - -=== Web server - -Apache with mod_php is currently the best option. -Mod_php is recommended instead of PHP_FPM, because in scale-out deployments separate PHP pools are not necessary. +=== Docker Host + +ownCloud Server 11 runs exclusively in Docker containers. The host operating system only needs to provide Docker Engine and Docker Compose. The web server, PHP runtime, and application dependencies are all encapsulated within the ownCloud Docker images. === Relational Database diff --git a/modules/admin_manual/pages/installation/deployment_recommendations.adoc b/modules/admin_manual/pages/installation/deployment_recommendations.adoc index 1eaf1e85e..7f6301a21 100644 --- a/modules/admin_manual/pages/installation/deployment_recommendations.adoc +++ b/modules/admin_manual/pages/installation/deployment_recommendations.adoc @@ -44,11 +44,9 @@ This is because every ownCloud customer has their own particular needs and IT in The recommendations presented here are based on a standard ownCloud installation, one without any particular _apps_, _themes_, or _code changes_. But, server load is dependent upon the number of _clients_, _files_, and _user activity_, as well as other usage patterns. Therefore, these recommendations are only rules of thumb based on our experience and customer feedback. ==== -* Operating system: Linux. -* Web server: Apache 2.4. +* Docker Engine and Docker Compose on the host. See xref:installation/system_requirements.adoc[System Requirements]. * Database: MySQL/MariaDB with InnoDB storage engine (MyISAM is not supported, see: xref:configuration/database/linux_database_configuration.adoc#mysql-mariadb[MySQL / MariaDB storage engine]) -* And a recent PHP Version. See xref:installation/system_requirements.adoc[System Requirements] * Consider setting up a scale-out deployment, or using xref:classic_ui:files/federated_cloud_sharing.adoc[Federated Cloud Sharing] to keep individual ownCloud instances to a manageable size. NOTE: Whatever the size of your organization, always keep one thing in mind: + @@ -102,13 +100,13 @@ image:installation/deprecs-1.png[Network diagram for small enterprises.] One server with at least 2 CPU cores, 16GB RAM, and local storage as needed. -==== Operating system +==== Docker Host Operating System -Enterprise-grade Linux distribution with full support from an operating system vendor. We recommend Ubuntu 20.04, RedHat Enterprise Linux and SUSE Linux Enterprise Server 12+. +Any 64-bit Linux distribution capable of running Docker Engine 20.10 or later is supported. ==== SSL Configuration -The SSL termination is done in Apache. A standard SSL certificate is required to be installed. See the {apache-ssl-howto-url}[official Apache documentation] or our xref:installation/letsencrypt/index.adoc[Let's Encrypt SSL Certificates] documentation. +SSL termination is handled by a reverse proxy in front of the Docker deployment. A standard SSL certificate is required. See our xref:installation/letsencrypt/index.adoc[Let's Encrypt SSL Certificates] documentation. ==== Load Balancer @@ -194,13 +192,13 @@ image:installation/deprecs-2.png[Network diagram for a mid-sized enterprise.] * 1 {haproxy-and-load-balancing-url}[HAproxy load balancer] with two sockets and 16GB RAM. * NFS storage server as needed. -==== Operating System +==== Docker Host Operating System -Enterprise grade Linux distribution with full support from an operating system vendor. We recommend both RedHat Enterprise Linux and SUSE Linux Enterprise Server 12+. +Any 64-bit Linux distribution capable of running Docker Engine 20.10 or later is supported on each application server node. ==== SSL Configuration -The SSL termination is done in the {haproxy-load-balancer-url}[HAProxy load balancer]. A standard SSL certificate is needed, installed according to the {haproxy-documentation-url}[HAProxy documentation]. +SSL termination is done in the {haproxy-load-balancer-url}[HAProxy load balancer]. A standard SSL certificate is needed, installed according to the {haproxy-documentation-url}[HAProxy documentation]. ==== Load Balancer @@ -282,9 +280,9 @@ image:installation/deprecs-3.png[image] 2 Hardware load balancer, for example, {bigip-f5-url}[BIG IP from F5]. * NFS storage server as needed. -==== Operating system +==== Docker Host Operating System -RHEL 7+ with latest service packs. +Any 64-bit Linux distribution capable of running Docker Engine 20.10 or later is supported on each application server node. ==== SSL Configuration @@ -371,18 +369,3 @@ NOTE: This setting is disabled by default. See the {galera-cluster-wsrep-docs-ur * {db-high-availability-url}[Database High Availability] * {bitnami-perf-enhancements-url}[Performance enhancements for Apache and PHP] -== Local Session Management - -Local session management on the application server. PHP sessions are stored in a temporary filesystem, mounted at the operating system-specific session storage location. You can find out where that is by running - -[source,bash] ----- -grep -R 'session.save_path' /etc/php* ----- - -and then add it to the `/etc/fstab` file, for example: - -[source,bash,subs="attributes+"] ----- -include::example$installation/deployment_recommendations/set_session_path.sh[] ----- diff --git a/modules/admin_manual/pages/installation/index.adoc b/modules/admin_manual/pages/installation/index.adoc index 8a68cd5a0..5959e5d12 100644 --- a/modules/admin_manual/pages/installation/index.adoc +++ b/modules/admin_manual/pages/installation/index.adoc @@ -3,15 +3,7 @@ == Introduction -This is an overview about the possible installation options for ownCloud Server. You can install ownCloud Server manually or use a Docker-based installation. - -== Manual Installation - -* The xref:installation/manual_installation/manual_installation.adoc[Detailed Installation Guide] is a thorough guide for installing ownCloud, containing all the information needed for the prerequisites, the dependencies, the actual installation and the configuration afterwards. The example installation is based on Ubuntu Server. -+ -This guide covers Ubuntu server preparations like dependencies, required packages and other necessary components or configurations including Ubuntu upgrades if necessary, descriptions, explanations and easy copy and paste example commands where possible. You will also get directed to other necessary or recommended sections in the documentation to have a well working ownCloud Server base ready for production. - -* The xref:installation/quick_guides/ubuntu_20_04.adoc[Quick Installation Guide] is a quick guide for installing ownCloud. This guide cannot go into details and has its limits by nature. If you experience issues like with dependencies of PHP or other relevant things like the operating system, web server or database, you have to use the xref:installation/manual_installation/manual_installation.adoc[Detailed Installation Guide]. +Starting with ownCloud Server 11, the only supported installation method is a Docker-based installation. Manual installation on Linux is no longer supported. == Using a Docker-Based Installation diff --git a/modules/admin_manual/pages/installation/system_requirements.adoc b/modules/admin_manual/pages/installation/system_requirements.adoc index 4e42d051e..4f736cd6f 100644 --- a/modules/admin_manual/pages/installation/system_requirements.adoc +++ b/modules/admin_manual/pages/installation/system_requirements.adoc @@ -1,88 +1,41 @@ = System Requirements :toc: right :toclevels: 1 -:ppa-guide-url: https://itsfoss.com/ppa-guide/ :desktop-system-requirements-url: https://doc.owncloud.com/desktop/installing.html#system-requirements :ios-system-requirements-url: https://doc.owncloud.com/ios-app/ios_faq.html :android-system-requirements-url: https://doc.owncloud.com/android/faq.html -:description: Read this documentation for a recommended or supported environment for your ownCloud Server. This documentation applies to both a new installation or upgrade of an existing installation. +:description: Read this documentation for the supported environment for your ownCloud Server. Starting with ownCloud Server 11, only Docker-based installations are supported. == Introduction {description} -== General Note +== Docker Host Requirements -There is an important note about a xref:installation/manual_installation/manual_installation_prerequisites.adoc#openssl-version[prerequisite of openSSL]. We highly recommend checking this prerequisite as it needs to be checked regardless of the Operating System chosen. +ownCloud Server 11 is exclusively deployed via Docker. The following requirements apply to the Docker host: -== Officially Recommended Environment - -For _best performance_, _stability_, _support_ and _full functionality_, we officially recommend and support: - -[width="60%"cols="30%,60%a",options="header"] -|=== -| Platform -| Options - -| Operating System -| Ubuntu 20.04 LTS - -| Database -| xref:#database-requirements[MariaDB] 10.11 ^1^ - -| Redis -| >= 6 - -| Web server -| Apache 2.4 with xref:installation/manual_installation/manual_installation.adoc#configure-the-web-server[`prefork and mod_php`] - -| PHP Runtime -| {recommended-php-version} +[width="60%",cols="30%,60%a",options="header"] |=== +| Component +| Requirement -(1) MariaDB 10.6 and later is *only supported* with ownCloud release 10.9 and upwards. See the xref:installation/manual_installation/manual_installation.adoc#install-a-database[Install a Database] guide and xref:maintenance/upgrading/database_upgrade.adoc[Database Upgrade] guide. - -== Officially Supported Environments +| Docker +| Docker Engine 20.10 or later -For _best performance_, _stability_, _support_, and _full functionality_ we officially support: +| Docker Compose +| Docker Compose v2 or later -=== Server +| Architecture +| 64-bit (x86_64 / amd64) -[width="90%"cols=".^ 30%,90%a",options="header"] +| RAM +| Minimum 512MB; 1GB or more recommended |=== -| Platform -| Options - -| Operating System (64bit) -| * Debian 10 -* Red Hat Enterprise Linux 7, 8 and 9 + -including all 100% compatible derivatives (please note Red Hat Enterprise Linux 9 support is Enterprise only. Contact ownCloud support for more information) -* SUSE Linux Enterprise Server 12 with SP4/5 and 15 -* Ubuntu 20.04 and 22.04 -* openSUSE Leap 15.2 - -| Database -| * xref:#database-requirements[MySQL] 8+ or xref:#database-requirements[MariaDB] 10.2 through 10.11 ^1^ (*Recommended*) -* Oracle 11 and 12 can be run in Oracle 19c with compatibility mode (*Enterprise only*) -* PostgreSQL 9, 10, 11, 12, 13 or 14 -* SQLite (*Not for production*) - -| Redis -| * >= 6 - -|Web server -|* Apache 2.4 with xref:installation/manual_installation/manual_installation.adoc#configure-the-web-server[`prefork` and `mod_php`] - -| PHP Runtime -|* {supported-php-versions} -|=== - -(1) MariaDB 10.6 and later is *only supported* with ownCloud release 10.9 and upwards. See the xref:installation/manual_installation/manual_installation.adoc#install-a-database[Install a Database] guide and xref:maintenance/upgrading/database_upgrade.adoc[Database Upgrade] guide. [NOTE] ==== -For Linux distributions, we support, if technically feasible, the latest two versions per platform and the previous LTS Version. +The operating system, web server, PHP runtime, and database are all managed inside the Docker images provided by ownCloud. No manual configuration of these components is required on the host. ==== === Hypervisors @@ -120,16 +73,6 @@ You can find detailed system requirements in the documentation for the mobile ap You can find out more in the https://owncloud.com/changelog[changelog]. ==== -== Database Requirements - -The following database settings are currently required if you’re running ownCloud together with a MySQL or MariaDB database: - -* Disabled or `BINLOG_FORMAT = MIXED` or `BINLOG_FORMAT = ROW` configured Binary Logging (See: xref:configuration/database/linux_database_configuration.adoc#mysql-mariadb[MySQL / MariaDB with Binary Logging Enabled]) -* InnoDB storage engine (The MyISAM storage engine is *not supported*, see: -xref:configuration/database/linux_database_configuration.adoc#mysql-mariadb[MySQL / MariaDB storage engine]) -* `READ COMMITTED` transaction isolation level (See: -xref:configuration/database/linux_database_configuration.adoc#set-read-committed-as-the-transaction-isolation-level[MySQL / MariaDB `READ COMMITTED` transaction isolation level]) - == Memory Requirements Memory requirements for running an ownCloud server are greatly variable, depending on the numbers of users and files, and volume of server activity. ownCloud officially requires a minimum of 128MB RAM. diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index 065e4c353..5fdc22596 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -10,17 +10,8 @@ *** xref:admin_manual:installation/deployment_recommendations.adoc[Deployment Recommendations] **** xref:admin_manual:installation/deployment_recommendations/nfs.adoc[NFS] *** xref:admin_manual:installation/system_requirements.adoc[System Requirements] -*** xref:admin_manual:installation/configuration_notes_and_tips.adoc[Configuration Notes and Tips] *** xref:admin_manual:installation/index.adoc[Installation Options] **** xref:admin_manual:installation/docker/index.adoc[Installing With Docker] -**** Manual Installation on Linux -***** Detailed Installation Guide -****** xref:admin_manual:installation/manual_installation/manual_installation.adoc[Detailed Installation on Ubuntu (various versions)] -***** Quick Installation Guide -****** xref:admin_manual:installation/quick_guides/ubuntu_20_04.adoc[On Ubuntu 20.04] -****** xref:admin_manual:installation/quick_guides/ubuntu_22_04.adoc[On Ubuntu 22.04] -***** Linux Package Manager -**** xref:admin_manual:installation/installation_wizard.adoc[The Installation Wizard] *** xref:admin_manual:installation/troubleshooting.adoc[Troubleshooting] *** xref:admin_manual:installation/changing_the_web_route.adoc[Changing Your ownCloud URL] *** xref:admin_manual:installation/apps_management_installation.adoc[Installing and Managing Apps] From 9d8d17e116ff519ecce96b4763e716d6d18e3307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= <1005065+DeepDiver1975@users.noreply.github.com> Date: Mon, 30 Mar 2026 16:22:18 +0200 Subject: [PATCH 02/38] feat: drop Raspberry --- .../pages/installation/docker/index.adoc | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/modules/admin_manual/pages/installation/docker/index.adoc b/modules/admin_manual/pages/installation/docker/index.adoc index ad5fe3642..13a44130b 100644 --- a/modules/admin_manual/pages/installation/docker/index.adoc +++ b/modules/admin_manual/pages/installation/docker/index.adoc @@ -2,7 +2,6 @@ :toc: right :dockerhub-url: https://hub.docker.com/r/owncloud/server :docker-compose-url: https://docs.docker.com/compose/ -:linux-server-doc-url: https://docs.linuxserver.io/faq :docker-compose-build-url: https://docs.docker.com/compose/compose-file/build/ :description: ownCloud can be installed using the official ownCloud Docker image. @@ -396,33 +395,6 @@ The loglevel is set to the fixed value 2: _"Warnings, errors, and fatal issues"_ OWNCLOUD_LOGLEVEL=0 ---- -=== Raspberry Pi - -If your container fails to start on Raspberry Pi or other ARM devices, you most likely have an old version of `libseccomp2` on your host. This should only affect distros based on Rasbian Buster 32 bit. Install a newer version with the following command: - -[source,bash] ----- -cd /tmp -wget http://ftp.us.debian.org/debian/pool/main/libs/libseccomp/libseccomp2_2.5.1-1_armhf.deb -sudo dpkg -i libseccomp2_2.5.1-1_armhf.deb ----- - -Alternatively you can add the backports repo for Debian Buster: - -[source,bash] ----- -sudo apt-key adv --keyserver keyserver.ubuntu.com \ - --recv-keys 04EE7237B7D453EC 648ACFD622F3D138 -echo "deb http://deb.debian.org/debian buster-backports main" | \ - sudo tee -a /etc/apt/sources.list.d/buster-backports.list -sudo apt update -sudo apt install -t buster-backports libseccomp2 ----- - -In any case, you should restart the container after confirming you have `libseccomp2.4.4` installed. - -For more information see: {linux-server-doc-url}[Linux Server Docs] - === Terminating containers If your container is terminating for whatever reason, you will not be able to run `docker(-compose) exec` to make investigations inside the container as there will be no running container. Instead you need to use `docker(-compose) run`. It's important that you prefix any command to be run by `/usr/bin/owncloud`, otherwise the container will not be initialized correctly. See the example command below: From d72cc5274941ad6d59ce9a762aa7f1a9a4e260c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= <1005065+DeepDiver1975@users.noreply.github.com> Date: Mon, 30 Mar 2026 16:24:19 +0200 Subject: [PATCH 03/38] feat: remove "Changing Your ownCloud URL" --- modules/admin_manual/partials/nav.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index 5fdc22596..5e7e35914 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -13,7 +13,6 @@ *** xref:admin_manual:installation/index.adoc[Installation Options] **** xref:admin_manual:installation/docker/index.adoc[Installing With Docker] *** xref:admin_manual:installation/troubleshooting.adoc[Troubleshooting] -*** xref:admin_manual:installation/changing_the_web_route.adoc[Changing Your ownCloud URL] *** xref:admin_manual:installation/apps_management_installation.adoc[Installing and Managing Apps] *** xref:admin_manual:installation/apps_supported.adoc[Supported Apps] **** xref:admin_manual:installation/apps/mediaviewer/index.adoc[Media Viewer] From 1c72e9033b1e72e1e7e25a3a0647c5f706a4bed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= <1005065+DeepDiver1975@users.noreply.github.com> Date: Mon, 30 Mar 2026 16:27:02 +0200 Subject: [PATCH 04/38] feat: remove lets encrypt and selinux configuration --- .../configuration/files/external_storage/configuration.adoc | 2 +- .../pages/configuration/server/harden_server.adoc | 3 +-- .../pages/configuration/user/user_auth_ftp_smb_imap.adoc | 4 +--- .../pages/installation/deployment_recommendations.adoc | 2 +- modules/admin_manual/partials/nav.adoc | 4 ---- 5 files changed, 4 insertions(+), 11 deletions(-) diff --git a/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc b/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc index f80927ec3..c6398b4ce 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc @@ -101,7 +101,7 @@ TIP: Please refer to xref:configuration/server/import_ssl_cert.adoc[Importing Sy The following backends are provided by the external storages app. Other apps may provide their own backends, which are not listed here. -NOTE: A non-blocking or correctly configured SELinux setup is needed for these backends to work. Please refer to xref:installation/selinux_configuration.adoc[the SELinux configuration]. +NOTE: A non-blocking or correctly configured SELinux setup is needed for these backends to work. == Allow Users to Mount External Storage diff --git a/modules/admin_manual/pages/configuration/server/harden_server.adoc b/modules/admin_manual/pages/configuration/server/harden_server.adoc index 8d7aa2530..e7cfa72c5 100644 --- a/modules/admin_manual/pages/configuration/server/harden_server.adoc +++ b/modules/admin_manual/pages/configuration/server/harden_server.adoc @@ -71,8 +71,7 @@ With this information, you can begin customizing a rate-limiting solution specif === Enable hardening modules such as SELinux -We also recommend to enable hardening modules such as SELinux -where possible. See xref:installation/selinux_configuration.adoc[SELinux Configuration] to learn more about SELinux. +We also recommend to enable hardening modules such as SELinux where possible. == Database diff --git a/modules/admin_manual/pages/configuration/user/user_auth_ftp_smb_imap.adoc b/modules/admin_manual/pages/configuration/user/user_auth_ftp_smb_imap.adoc index 1eff9f48e..e0b8680ba 100644 --- a/modules/admin_manual/pages/configuration/user/user_auth_ftp_smb_imap.adoc +++ b/modules/admin_manual/pages/configuration/user/user_auth_ftp_smb_imap.adoc @@ -21,9 +21,7 @@ file (`config/config.php`) using the following syntax: ], ---- -NOTE: A non-blocking or correctly configured SELinux setup is needed for these backends to work, -if SELinux is enabled on your server. Please refer to the -xref:installation/selinux_configuration.adoc[SELinux configuration] for further details. +NOTE: A non-blocking or correctly configured SELinux setup is needed for these backends to work if SELinux is enabled on your server. Currently the https://github.com/owncloud/user_external[External user support app] (user_external), _which is not enabled by default_, provides three backends. These are: diff --git a/modules/admin_manual/pages/installation/deployment_recommendations.adoc b/modules/admin_manual/pages/installation/deployment_recommendations.adoc index 7f6301a21..1346be976 100644 --- a/modules/admin_manual/pages/installation/deployment_recommendations.adoc +++ b/modules/admin_manual/pages/installation/deployment_recommendations.adoc @@ -106,7 +106,7 @@ Any 64-bit Linux distribution capable of running Docker Engine 20.10 or later is ==== SSL Configuration -SSL termination is handled by a reverse proxy in front of the Docker deployment. A standard SSL certificate is required. See our xref:installation/letsencrypt/index.adoc[Let's Encrypt SSL Certificates] documentation. +SSL termination is handled by a reverse proxy in front of the Docker deployment. A standard SSL certificate is required. ==== Load Balancer diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index 5e7e35914..244d44dcd 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -16,10 +16,6 @@ *** xref:admin_manual:installation/apps_management_installation.adoc[Installing and Managing Apps] *** xref:admin_manual:installation/apps_supported.adoc[Supported Apps] **** xref:admin_manual:installation/apps/mediaviewer/index.adoc[Media Viewer] -*** xref:admin_manual:installation/selinux_configuration.adoc[SELinux Configuration] -*** xref:admin_manual:installation/letsencrypt/index.adoc[Using Let's Encrypt SSL Certificates] -**** xref:admin_manual:installation/letsencrypt/using_letsencrypt.adoc[Using Letsencrypt] -**** xref:admin_manual:installation/letsencrypt/apache.adoc[Apache] ** Configuration *** xref:admin_manual:configuration/database/index.adoc[Database] From c0d1ed6763bd833516a58133bc4e556b96738ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= <1005065+DeepDiver1975@users.noreply.github.com> Date: Mon, 30 Mar 2026 16:28:31 +0200 Subject: [PATCH 05/38] feat: drop db:convert-type --- .../core_commands/_database_commands.adoc | 25 ------------------- modules/admin_manual/partials/nav.adoc | 1 - 2 files changed, 26 deletions(-) diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc index e156ecb26..a80f64864 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc @@ -2,31 +2,6 @@ == Database Conversion Commands -=== Convert the Database Type - -The SQLite database is good for testing, and for ownCloud servers with small single-user workloads that do not use sync clients, but production servers with multiple users should use MariaDB, MySQL, or PostgreSQL. You can use `occ` to convert from SQLite to one of these other databases. - -[source,plaintext] ----- -db - db:convert-type Convert the ownCloud database to the newly configured one ----- - -You need: - -* Your desired database and its PHP connector installed. -* The login and password of a database admin user. -* The database port number, if it is a non-standard port. - -This is example converts SQLite to MySQL/MariaDB: - -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix} db:convert-type mysql oc_dbuser 127.0.0.1 oc_database ----- - -TIP: For a more detailed explanation see xref:configuration/database/db_conversion.adoc[converting database types]. - === Convert the MySQL Charset Convert charset of MySQL/MariaDB to use utf8mb4. If you are using an older ownCloud installation, the database may not be setup to use the 4-byte unicode charset. This command changes the database charset to use `utf8mb4`. Check your database charset before you use this command. diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index 244d44dcd..3a471c47e 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -19,7 +19,6 @@ ** Configuration *** xref:admin_manual:configuration/database/index.adoc[Database] -**** xref:admin_manual:configuration/database/db_conversion.adoc[Database Conversion] **** xref:admin_manual:configuration/database/linux_database_configuration.adoc[Database Configuration] *** xref:admin_manual:configuration/files/encryption/index.adoc[Encryption] From 7e68ab95b2e6b1825200795ccdc9721382a48fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= <1005065+DeepDiver1975@users.noreply.github.com> Date: Thu, 2 Apr 2026 11:46:36 +0200 Subject: [PATCH 06/38] feat: use occ and no sudo --- global-attributes.yml | 3 +- .../linux_database_configuration.adoc | 2 + .../encryption/encryption_configuration.adoc | 40 ++++++++ .../encryption_configuration_quick_guide.adoc | 10 ++ .../files/external_storage/configuration.adoc | 2 + ...federated_cloud_sharing_configuration.adoc | 20 ++++ .../files/file_sharing_configuration.adoc | 20 ++++ .../files/manual_file_locking.adoc | 8 ++ .../pages/configuration/files/mimetypes.adoc | 4 + .../configuration/files/trashbin_options.adoc | 6 ++ .../general_topics/code_signing.adoc | 2 + .../general_topics/impersonate_users.adoc | 22 +++++ .../configuration/general_topics/search.adoc | 24 ++++- .../server/background_jobs_configuration.adoc | 12 +++ .../configuration/server/harden_server.adoc | 2 + .../server/legal_settings_configuration.adoc | 4 + .../configuration/server/occ_command.adoc | 68 +++---------- .../app_commands/_2fa_app_commands.adoc | 4 + .../app_commands/_activity_commands.adoc | 8 ++ .../app_commands/_admin_audit_commands.adoc | 6 ++ .../app_commands/_antivirus_commands.adoc | 4 + .../_brute_force_protection_commands.adoc | 4 + .../app_commands/_custom_groups.adoc | 10 ++ .../app_commands/_data_exporter_commands.adoc | 6 ++ .../app_commands/_files_lifecycle.adoc | 24 +++++ .../_full_text_search_commands.adoc | 32 ++++++ .../_ldap_integration_commands.adoc | 43 ++++++++ .../app_commands/_market_commands.adoc | 10 ++ .../app_commands/_metrics_commands.adoc | 6 ++ .../_migrate_to_kitworks_commands.adoc | 12 +++ .../_password_policy_commands.adoc | 4 + .../_ransomware_protection_commands.adoc | 14 +++ .../app_commands/_richdocuments.adoc | 16 +++ .../app_commands/_s3objectstore_commands.adoc | 4 + ...l_sso_shibboleth_integration_commands.adoc | 2 + .../app_commands/_wnd_commands.adoc | 6 ++ .../core_commands/_2fa_core_commands.adoc | 4 + .../core_commands/_app_commands.adoc | 12 +++ .../_background_jobs_selector.adoc | 2 + .../_command_line_installation_commands.adoc | 6 ++ .../_command_line_upgrade_commands.adoc | 6 ++ .../core_commands/_config_commands.adoc | 46 +++++++++ .../_config_reports_commands.adoc | 6 ++ .../core_commands/_database_commands.adoc | 4 + .../core_commands/_dav_commands.adoc | 18 ++++ .../core_commands/_encryption_commands.adoc | 20 ++++ .../_federation_sync_commands.adoc | 2 + .../_federation_trusted_servers.adoc | 12 +++ .../core_commands/_file_commands.adoc | 34 +++++++ .../_files_external_commands.adoc | 2 + .../core_commands/_group_commands.adoc | 20 ++++ .../_incoming_shares_commands.adoc | 2 + .../_integrity_check_commands.adoc | 4 + .../core_commands/_localisation_commands.adoc | 4 + .../core_commands/_logging_commands.adoc | 4 + .../core_commands/_maintenance_commands.adoc | 26 +++++ .../_managing_background_jobs.adoc | 8 ++ .../_migration_steps_commands.adoc | 4 + .../_notifications_commands.adoc | 4 + .../core_commands/_previews_commands.adoc | 4 + .../core_commands/_security_commands.adoc | 12 +++ .../core_commands/_sharing_commands.adoc | 6 ++ .../core_commands/_system_command.adoc | 7 ++ .../core_commands/_trashbin_commands.adoc | 4 + .../core_commands/_user_commands.adoc | 99 +++++++++++++++++++ .../core_commands/_versions_commands.adoc | 8 ++ .../server/security/hsmdaemon/index.adoc | 6 ++ .../server/ui-configuration.adoc | 6 ++ .../server/virus-scanner-support.adoc | 24 +++++ .../pages/configuration/user/oidc/oidc.adoc | 2 + .../user/reset_admin_password.adoc | 2 + .../configuration/user/user_auth_ldap.adoc | 6 ++ .../configuration/user/user_management.adoc | 10 ++ .../enterprise/authentication/kerberos.adoc | 2 + .../windows-network-drive_configuration.adoc | 43 ++++++++ .../external_storage/wnd_quick_guide.adoc | 6 ++ .../file_management/files_lifecycle.adoc | 22 +++++ .../pages/enterprise/logging/admin_audit.adoc | 2 + .../pages/enterprise/reporting/metrics.adoc | 4 + .../user_management/saml_2.0_sso.adoc | 2 + .../user_management/user_auth_shibboleth.adoc | 6 ++ .../backup_and_restore/backup.adoc | 4 + .../backup_and_restore/restore.adoc | 6 ++ .../pages/maintenance/enable_maintenance.adoc | 4 + ...migrating-from-user-key-to-master-key.adoc | 4 + .../export_import_instance_data.adoc | 8 ++ .../manually-moving-data-folders.adoc | 8 ++ .../pages/maintenance/migrating.adoc | 6 ++ .../upgrading/database_upgrade.adoc | 6 ++ .../providing_logs_and_config_files.adoc | 8 ++ .../remove_non_existent_bg_jobs.adoc | 4 + .../server/disable-single-user-mode.adoc | 2 + 92 files changed, 999 insertions(+), 58 deletions(-) diff --git a/global-attributes.yml b/global-attributes.yml index 4bbf0067f..1db3818ff 100644 --- a/global-attributes.yml +++ b/global-attributes.yml @@ -36,8 +36,7 @@ oc-examples-username: 'username' oc-examples-password: 'password' oc-complete-name: 'owncloud-complete-latest' - occ-command-example-prefix: 'sudo -u www-data ./occ' - occ-command-example-prefix-no-sudo: 'occ' + occ-command-example-prefix: 'occ' php-net-url: 'https://www.php.net' php-supported-versions-url: 'https://www.php.net/supported-versions.php' http-status-codes-base-url: 'https://developer.mozilla.org/en-US/docs/Web/HTTP/Status' diff --git a/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc b/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc index ad2fb25de..6ce93155b 100644 --- a/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc +++ b/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc @@ -185,6 +185,8 @@ innodb_file_per_table=ON {occ-command-example-prefix} db:convert-mysql-charset ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ When this is done, tables will be created with: + * A `utf8mb4` character set. diff --git a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc index d7bc816c8..e3ae80344 100644 --- a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc @@ -123,11 +123,15 @@ To enable the encryption app, run the following command: {occ-command-example-prefix} app:enable encryption ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} encryption:enable ---- +NOTE: Run this command inside the ownCloud Docker container. + If the encryption app is successfully enabled, you should see the following confirmations: [source,plaintext] @@ -165,6 +169,8 @@ To be safe and avoid any issues on a running instance, put your server in single {occ-command-example-prefix} maintenance:singleuser --on ---- +NOTE: Run this command inside the ownCloud Docker container. + Enabling encryption via the command line involves several commands. If not already done, enable the default encryption module app with the following command: [source,bash,subs="attributes+"] @@ -172,6 +178,8 @@ Enabling encryption via the command line involves several commands. If not alrea {occ-command-example-prefix} app:enable encryption ---- +NOTE: Run this command inside the ownCloud Docker container. + Then enable encryption, using the following command: [source,bash,subs="attributes+"] @@ -179,6 +187,8 @@ Then enable encryption, using the following command: {occ-command-example-prefix} encryption:enable ---- +NOTE: Run this command inside the ownCloud Docker container. + Finally, encrypt all data, using the following command: [source,bash,subs="attributes+"] @@ -186,6 +196,8 @@ Finally, encrypt all data, using the following command: {occ-command-example-prefix} encryption:encrypt-all --yes ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: This command is not typically required as the master key is often enabled at installation time. As a result when enabling it, there should be no data to encrypt. In case it’s being enabled after the installation and there are files which are unencrypted, xref:configuration/server/occ_command.adoc#encrypt-all[encrypt-all] can be used to encrypt them. Depending on the amount of existing data and the location, this operation can take a long time. Now you can turn off the single user mode: @@ -195,6 +207,8 @@ Now you can turn off the single user mode: {occ-command-example-prefix} maintenance:singleuser --off ---- +NOTE: Run this command inside the ownCloud Docker container. + === View Current Encryption Status Get the current encryption status and the loaded encryption module: @@ -204,6 +218,8 @@ Get the current encryption status and the loaded encryption module: {occ-command-example-prefix} encryption:status ---- +NOTE: Run this command inside the ownCloud Docker container. + === Replacing an Existing Master Key If the master key needs replacement, for example because it has been compromised, an occ command is available. The command is xref:configuration/server/occ_command.adoc#encryption[encryption:recreate-master-key]. It replaces an existing master key with a new one and encrypts the files with the new key. @@ -217,6 +233,8 @@ You must first put your ownCloud server into single-user mode to prevent any use {occ-command-example-prefix} maintenance:singleuser --on ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,plaintext] ---- Single user mode is currently enabled @@ -229,6 +247,8 @@ Decrypt all user data files, or optionally a single user: {occ-command-example-prefix} encryption:decrypt-all [username] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Disable Encryption To disable encryption, put your ownCloud server into single-user mode, and then disable your encryption module with these commands: @@ -238,11 +258,15 @@ To disable encryption, put your ownCloud server into single-user mode, and then {occ-command-example-prefix} maintenance:singleuser --on ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} encryption:disable ---- +NOTE: Run this command inside the ownCloud Docker container. + Take it out of single-user mode when you are finished, by using the following command: [source,bash,subs="attributes+"] @@ -250,6 +274,8 @@ Take it out of single-user mode when you are finished, by using the following co {occ-command-example-prefix} maintenance:singleuser --off ---- +NOTE: Run this command inside the ownCloud Docker container. + [IMPORTANT] ==== You may only disable encryption by using the xref:configuration/server/occ_command.adoc#encryption[occ Encryption Commands]. Make sure you have backups of all encryption keys, including those for all your users if user key encryption was selected. @@ -264,6 +290,8 @@ Get the current encryption status and the loaded encryption module: {occ-command-example-prefix} encryption:status ---- +NOTE: Run this command inside the ownCloud Docker container. + === Enable Users' File Recovery Keys If users encrypt their files and lose their ownCloud password, they lose access to their encrypted files as the files will be unrecoverable. It is not possible to reset a user’s password using the standard reset process if the user's files are encrypted. @@ -315,6 +343,8 @@ You must first put your ownCloud server into single-user mode to prevent any use {occ-command-example-prefix} maintenance:singleuser --on ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,plaintext] ---- Single user mode is currently enabled @@ -329,11 +359,15 @@ You may disable encryption only with `occ`. Make sure you have backups of all th {occ-command-example-prefix} maintenance:singleuser --on ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} encryption:disable ---- +NOTE: Run this command inside the ownCloud Docker container. + IMPORTANT: Encryption cannot be disabled without the user’s password or xref:enable-users-file-recovery-keys[file recovery key]. If you don’t have access to at least one of these then there is no way to decrypt all files. @@ -345,6 +379,8 @@ command: {occ-command-example-prefix} maintenance:singleuser --off ---- +NOTE: Run this command inside the ownCloud Docker container. + It is possible to disable encryption with the file recovery key _if_ every user has enabled it. In this case, "decrypt all" will decrypt all files of all users. NOTE: It is *not* planned to move this to the next user login or a background job. If that was done, then login passwords would need to be stored in the database, which could be a security issue. @@ -358,6 +394,8 @@ View current location of keys: {occ-command-example-prefix} encryption:show-key-storage-root ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,plaintext] ---- Current key storage root: default storage location (data/) @@ -385,6 +423,8 @@ chmod -R 0770 /var/www/owncloud/data/new_keys {occ-command-example-prefix} encryption:change-key-storage-root new_keys ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,plaintext] ---- Change key storage root from default storage location to new_keys diff --git a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration_quick_guide.adoc b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration_quick_guide.adoc index 6c6b043dc..02e37c04d 100644 --- a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration_quick_guide.adoc +++ b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration_quick_guide.adoc @@ -24,6 +24,8 @@ This quick guide gives a brief summary of the commands needed without going into {occ-command-example-prefix} maintenance:singleuser --off ---- +NOTE: Run this command inside the ownCloud Docker container. + === View the Encryption Status [source,bash,subs="attributes+"] @@ -31,6 +33,8 @@ This quick guide gives a brief summary of the commands needed without going into {occ-command-example-prefix} encryption:status ---- +NOTE: Run this command inside the ownCloud Docker container. + === Decrypt Encrypted Files Depending on the amount of existing data, this operation can take a long time. @@ -42,6 +46,8 @@ Depending on the amount of existing data, this operation can take a long time. {occ-command-example-prefix} maintenance:singleuser --off ---- +NOTE: Run this command inside the ownCloud Docker container. + === Deactivate Master-Key-Based Encryption [source,bash,subs="attributes+"] @@ -52,6 +58,8 @@ Depending on the amount of existing data, this operation can take a long time. {occ-command-example-prefix} app:disable encryption ---- +NOTE: Run this command inside the ownCloud Docker container. + If the master key has been compromised or exposed, you can replace it. You will need the current master key for it. [source,bash,subs="attributes+"] @@ -59,6 +67,8 @@ If the master key has been compromised or exposed, you can replace it. You will {occ-command-example-prefix} encryption:recreate-master-key ---- +NOTE: Run this command inside the ownCloud Docker container. + == Clean up Your Database Access your ownCloud database and remove the remaining entries that have not been automatically removed with this command: diff --git a/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc b/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc index c6398b4ce..889d37aed 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc @@ -137,6 +137,8 @@ You might need to setup a cron job that runs {occ-command-example-prefix} files:scan --all` ---- +NOTE: Run this command inside the ownCloud Docker container. + * Alternatively, replace `--all` with the user name to trigger a rescan of the user’s files periodically, for example every 15 minutes, which includes the mounted external storage. + diff --git a/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc b/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc index 02f4c421f..392328f33 100644 --- a/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc @@ -36,6 +36,8 @@ image::configuration/files/browser-address-bars.png[Lock icon in Firefox, Google ---- {occ-command-example-prefix} system:cron ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . Run the `OCA\Federation\SyncJob` job with the `force` option on both servers. + You can get the corresponding job ID by using the `background:queue:status` occ command: @@ -44,6 +46,8 @@ You can get the corresponding job ID by using the `background:queue:status` occ ---- {occ-command-example-prefix} background:queue:execute --force ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . The check should now be green @@ -54,6 +58,8 @@ You can get the corresponding job ID by using the `background:queue:status` occ {occ-command-example-prefix} dav:sync-system-addressbook {occ-command-example-prefix} federation:sync-addressbook ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . Configure automatic acceptance of new federated shares + @@ -65,6 +71,8 @@ NOTE: Automatic acceptance of new federated shares will not work if the option ` {occ-command-example-prefix} config:app:set federation auto_accept_trusted --value '0' {occ-command-example-prefix} config:app:set federatedfilesharing auto_accept_trusted --value 'yes' ---- + +NOTE: Run this command inside the ownCloud Docker container. -- == Working With Proxies @@ -117,6 +125,8 @@ Alternatively you can use the command line: {occ-command-example-prefix} config:app:set files_sharing cronjob_scan_external_enabled --value 'yes' ---- +NOTE: Run this command inside the ownCloud Docker container. + You can also configure these settings of the cronjob: . the minimum amount of time since last login of a user so that a scan is triggered (ensures only active users get fed shares synced) @@ -125,6 +135,8 @@ You can also configure these settings of the cronjob: ---- {occ-command-example-prefix} config:app:set files_sharing cronjob_scan_external_min_login --value ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . the minimum amount of time since last scanned so that the next scan is triggered (avoid frequent scan when active collaboration) + @@ -132,6 +144,8 @@ You can also configure these settings of the cronjob: ---- {occ-command-example-prefix} config:app:set files_sharing cronjob_scan_external_min_scan --value ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . the maximum number of federated share scans per 10 minutes (scan performed only if fed share files got updated) + @@ -139,6 +153,8 @@ You can also configure these settings of the cronjob: ---- {occ-command-example-prefix} config:app:set files_sharing cronjob_scan_external_batch --value ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . Use the following command to force a run of the scanner cronjob: + @@ -146,6 +162,8 @@ You can also configure these settings of the cronjob: ---- {occ-command-example-prefix} background:queue:execute --force --accept-warning ---- ++ +NOTE: Run this command inside the ownCloud Docker container. == Known Issues @@ -173,6 +191,8 @@ It is possible to configure the VCARD properties that are searched in order to r {occ-command-example-prefix} config:app:set dav remote_search_properties --value=CLOUD,FN,EMAIL ---- +NOTE: Run this command inside the ownCloud Docker container. + Possible values are: * VERSION diff --git a/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc b/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc index 78467d880..841afadba 100644 --- a/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc @@ -106,6 +106,8 @@ xref:configuration/server/occ_command.adoc#config-commands[occ config:app:set co --value '' ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: In the example above, the `` is an {two-letter-url}[ISO 3166-1 alpha-2 two-letter country code], such as *de*, *gb*, *us*, *es* or others. @@ -228,6 +230,8 @@ Here is an example of how to transfer all files from one user to another. ---- +NOTE: Run this command inside the ownCloud Docker container. + Here is an example of how to transfer _a limited group_ a single folder from one user to another. In it, `folder/to/move`, and any file and folder inside it will be moved to ``. [source,bash,subs="attributes+"] @@ -238,6 +242,8 @@ Here is an example of how to transfer _a limited group_ a single folder from one ---- +NOTE: Run this command inside the ownCloud Docker container. + When using this command keep two things in mind: 1. The directory provided to the `--path` switch *must* exist inside `data//files`. @@ -254,6 +260,8 @@ IMPORTANT: If an exception occurred during the transfer ownership command or the {occ-command-example-prefix} files:troubleshoot-transfer-ownership --uid ` ---- +NOTE: Run this command inside the ownCloud Docker container. + == Creating Persistent File Shares When a user is deleted, their files are also deleted. As you can imagine, this is a problem if they created file shares that need to be preserved, because these disappear as well. In ownCloud, files are tied to their owners. This means, whatever happens to the file owner also happens to the files. @@ -282,6 +290,8 @@ This command provides for the creation of both personal (for a specific user) an --user someuser ---- +NOTE: Run this command inside the ownCloud Docker container. + or [source,bash,subs="attributes+"] @@ -296,6 +306,8 @@ or --user someuser ---- +NOTE: Run this command inside the ownCloud Docker container. + ==== General Share [source,bash,subs="attributes+"] @@ -306,6 +318,8 @@ or --config={host=127.0.0.1, share='home', root='$user', domain='owncloud.local'} ---- +NOTE: Run this command inside the ownCloud Docker container. + or [source,bash,subs="attributes+"] @@ -319,6 +333,8 @@ or --config domain='somedomain.local' ---- +NOTE: Run this command inside the ownCloud Docker container. + === occ files_external:import You can create general and personal shares passing the configuration details via JSON files, using the `occ files_external:import` command. @@ -331,6 +347,8 @@ You can create general and personal shares passing the configuration details via /import.json ---- +NOTE: Run this command inside the ownCloud Docker container. + ==== Personal Share [source,bash,subs="attributes+"] @@ -339,6 +357,8 @@ You can create general and personal shares passing the configuration details via /import.json --user someuser ---- +NOTE: Run this command inside the ownCloud Docker container. + In the two examples above, here is a sample JSON file, showing all of the available configuration options that the command supports. [source,json] diff --git a/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc b/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc index 6a1543324..704e72b4f 100644 --- a/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc +++ b/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc @@ -53,6 +53,8 @@ Using the occ command:: {occ-command-example-prefix} config:app:set files enable_lock_file_action --value yes ---- +NOTE: Run this command inside the ownCloud Docker container. + == Configuration To prevent files being locked infinitely, there is a mechanism that automatically expires locks after a certain time. The expiration time of locks can either be configured via the web interface or using occ commands. In addition, administrators can define groups whose members can break locks. @@ -78,6 +80,8 @@ Using the occ command:: {occ-command-example-prefix} config:app:set files lock_timeout_default --value 1800 ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ * Maximum locks timeout + [source,bash,subs="attributes+"] @@ -85,6 +89,8 @@ Using the occ command:: {occ-command-example-prefix} config:app:set files lock_timeout_max --value 86400 ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ * Define lock breaker groups + The example below defines two lock breaker groups named `unlockers` and `admin`. @@ -93,3 +99,5 @@ The example below defines two lock breaker groups named `unlockers` and `admin`. ---- {occ-command-example-prefix} config:app:set core lock-breaker-groups --value '["unlockers","admin"]' ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/files/mimetypes.adoc b/modules/admin_manual/pages/configuration/files/mimetypes.adoc index 552eba2ca..8bc7bf93c 100644 --- a/modules/admin_manual/pages/configuration/files/mimetypes.adoc +++ b/modules/admin_manual/pages/configuration/files/mimetypes.adoc @@ -112,6 +112,8 @@ use the xref:configuration/server/occ_command.adoc[occ command] to propagate the {occ-command-example-prefix} maintenance:mimetype:update-js ---- +NOTE: Run this command inside the ownCloud Docker container. + === Example - Changing the JSON File Icon image:configuration/mimetypes/json-alias-before.png[The default icon for JSON files] @@ -156,6 +158,8 @@ The name and location of the file are important. ---- {occ-command-example-prefix} maintenance:mimetype:update-js ---- ++ +NOTE: Run this command inside the ownCloud Docker container. After doing so, whenever you view a folder that contains JSON files or upload one, your new icon file will be used to represent the file, as in the image below. diff --git a/modules/admin_manual/pages/configuration/files/trashbin_options.adoc b/modules/admin_manual/pages/configuration/files/trashbin_options.adoc index cdcdefa0d..64bdc1a41 100644 --- a/modules/admin_manual/pages/configuration/files/trashbin_options.adoc +++ b/modules/admin_manual/pages/configuration/files/trashbin_options.adoc @@ -34,6 +34,8 @@ Remove deleted files for users on backend Database user4 ---- +NOTE: Run this command inside the ownCloud Docker container. + This example removes the deleted files of user2 and user4: [source,bash,subs="attributes+"] @@ -43,6 +45,8 @@ This example removes the deleted files of user2 and user4: Remove deleted files of user4 ---- +NOTE: Run this command inside the ownCloud Docker container. + `trashbin:expire` deletes only expired files according to the `trashbin_retention_obligation` setting in `config.php`. The default setting is `auto`, which keeps files in the Trashbin for 30 days, then @@ -59,4 +63,6 @@ users in a space-delimited list: Remove deleted files of user2 ---- +NOTE: Run this command inside the ownCloud Docker container. + See the *Deleted Files* section in xref:configuration/server/config_sample_php_parameters.adoc[Sample PHP Configuration Parameters], and xref:configuration/server/occ_command.adoc[the Trash Bin section] of the occ commands. diff --git a/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc b/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc index 3d2f145de..1de829745 100644 --- a/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc +++ b/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc @@ -216,6 +216,8 @@ a command to manually scan all apps: {occ-command-example-prefix} integrity:check-app ---- +NOTE: Run this command inside the ownCloud Docker container. + TIP: See xref:configuration/server/occ_command.adoc[the occ command] to learn more about using `occ`. == Errors diff --git a/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc b/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc index 42658e8fc..95f043403 100644 --- a/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc +++ b/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc @@ -54,6 +54,8 @@ image::apps/impersonate/impersonate_enable.png[Define who can use Impersonate,wi {occ-command-example-prefix} config:app:set \ impersonate enabled --value 'yes' ---- ++ +NOTE: Run this command inside the ownCloud Docker container. ** You can also use an occ command to define groups whose members are granted the right to _use_ impersonation: + @@ -62,6 +64,8 @@ image::apps/impersonate/impersonate_enable.png[Define who can use Impersonate,wi {occ-command-example-prefix} config:app:set \ impersonate enabled --value '["admin","einstein-g"]' ---- ++ +NOTE: Run this command inside the ownCloud Docker container. == Define Who is Allowed to Impersonate @@ -87,17 +91,23 @@ image::apps/impersonate/impersonate_oc_admins_only.png[Impersonate for ownCloud impersonate impersonate_all_groupadmins --value false ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} config:app:set \ impersonate impersonate_include_groups --value false ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} config:app:set \ impersonate impersonate_include_groups_list --value '[]' ---- ++ +NOTE: Run this command inside the ownCloud Docker container. * If you want to allow all group admins to impersonate users within groups which they administer: + @@ -111,17 +121,23 @@ image::apps/impersonate/impersonate_group_admins_only.png[Impersonate for all gr impersonate impersonate_all_groupadmins --value true ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} config:app:set \ impersonate impersonate_include_groups --value false ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} config:app:set \ impersonate impersonate_include_groups_list --value '[]' ---- ++ +NOTE: Run this command inside the ownCloud Docker container. * If you want to limit impersonation to admins of specific groups, first click btn:[Allow group admins of specific groups...]. With the option checked, click into the textbox underneath it. You will see a list of all groups on your ownCloud installation, which will change, based on what you type in the textbox to search for specific groups. Choose one or more groups from the list, and they will be added to the textbox, restricting this functionality to admins of those groups only. + @@ -135,14 +151,20 @@ image::apps/impersonate/impersonate_groups_only.png[Impersonate for specific gro impersonate impersonate_all_groupadmins --value false ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} config:app:set \ impersonate impersonate_include_groups --value true ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} config:app:set \ impersonate impersonate_include_groups_list --value '["group1", "group2"]' ---- ++ +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/general_topics/search.adoc b/modules/admin_manual/pages/configuration/general_topics/search.adoc index e57d073a3..55f79f8bf 100644 --- a/modules/admin_manual/pages/configuration/general_topics/search.adoc +++ b/modules/admin_manual/pages/configuration/general_topics/search.adoc @@ -52,7 +52,9 @@ To install the app, use the Marketplace app on your ownCloud server or proceed m ---- {occ-command-example-prefix} app:enable search_elastic ---- -+ + +NOTE: Run this command inside the ownCloud Docker container. + or enable it via the GUI menu:Settings[Admin > Apps > Full Text Search > Enable]. == Configuration @@ -183,6 +185,8 @@ You can at any time reset the index if required by clicking on btn:[Reset index] {occ-command-example-prefix} search:index:reset ---- +NOTE: Run this command inside the ownCloud Docker container. + == Using occ Commands You can use the: @@ -194,6 +198,8 @@ You can use the: {occ-command-example-prefix} search:index:reset ---- +NOTE: Run this command inside the ownCloud Docker container. + * xref:configuration/server/occ_command.adoc#config-commands[occ Config Commands command set] to configure the app. + Examples: @@ -230,6 +236,8 @@ Set app options:: search_elastic scanExternalStorages --value 0 ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ or + [source,bash,subs="attributes+"] @@ -238,6 +246,8 @@ or search_elastic scanExternalStorages --value 1 ---- +NOTE: Run this command inside the ownCloud Docker container. + == App Modes The Full Text Search app provides two modes, which are *active* and *passive*. @@ -269,6 +279,8 @@ To do an initial full indexing without the app interfering, it can be put in _pa search_elastic mode --value passive ---- +NOTE: Run this command inside the ownCloud Docker container. + or [source,bash,subs="attributes+"] @@ -277,6 +289,8 @@ or search_elastic mode --value active ---- +NOTE: Run this command inside the ownCloud Docker container. + == Restrict Search Results === Index Metadata Only @@ -289,6 +303,8 @@ If you only want to use the Full Text Search app as a more scalable search on fi search_elastic nocontent --value true ---- +NOTE: Run this command inside the ownCloud Docker container. + [NOTE] ==== * You have to reindex all files if you change this back to `false`. Setting it to `true` does not require reindexing. @@ -306,6 +322,8 @@ If you only want to use search for shared filenames, you can disable full text s --value nofulltext ---- +NOTE: Run this command inside the ownCloud Docker container. + You can also configure multiple groups by separating them with comma: [source,bash,subs="attributes+"] @@ -315,6 +333,8 @@ You can also configure multiple groups by separating them with comma: --value nofulltext,anothergroup,"group with blanks" ---- +NOTE: Run this command inside the ownCloud Docker container. + This allows a scalable search in shared files without clouding the results with content based hits. == Create the Index @@ -329,6 +349,8 @@ When everything has been set up and configured, you can initiate creating the in {occ-command-example-prefix} search:index:create ---- +NOTE: Run this command inside the ownCloud Docker container. + == Issues When the Elasticsearch server is down or the index has not been set up, you may get the following message. Check if the ES server is reachable or if the index was set up properly as one solution to fix the issue. diff --git a/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc b/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc index 209a7de35..2b2607d0f 100644 --- a/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc @@ -21,6 +21,8 @@ As an example: {occ-command-example-prefix} background:cron ---- +NOTE: Run this command inside the ownCloud Docker container. + Is the same as using the *Cron* section on your ownCloud Admin page. === Docker Note @@ -94,6 +96,8 @@ There is no way to do so via the ownCloud UI. But, the most direct way to do so, {occ-command-example-prefix} system:cron ---- +NOTE: Run this command inside the ownCloud Docker container. + Each of these processes would acquire their own list of jobs to process without overlapping any other. === Available Background Jobs @@ -129,6 +133,8 @@ The ExpireTrash job, contained in `OCA\Files_Trashbin\BackgroundJob\ExpireTrash` {occ-command-example-prefix} trashbin:expire ---- +NOTE: Run this command inside the ownCloud Docker container. + ==== ExpireVersions The ExpireVersions job, contained in `OCA\Files_Versions\BackgroundJob\ExpireVersions`, will expire versions of files which are older than the specified maximum version retention time. It can be run, as follows, using the xref:configuration/server/occ_command.adoc#versions[OCC versions] command: @@ -138,6 +144,8 @@ The ExpireVersions job, contained in `OCA\Files_Versions\BackgroundJob\ExpireVer {occ-command-example-prefix} versions:expire ---- +NOTE: Run this command inside the ownCloud Docker container. + CAUTION: Please take care when adding `ExpireTrash` and `ExpireVersions` as xref:cron[Cron] jobs. Make sure that they're not started in parallel on multiple machines. Running in parallel on a single machine is fine. But, currently, there isn't sufficient locking in place to prevent them from conflicting with each other if running in parallel across multiple machines. ==== SyncJob (CardDAV) @@ -149,6 +157,8 @@ The `CardDAV SyncJob`, contained in `OCA\DAV\CardDAV\SyncJob`, syncs the local s {occ-command-example-prefix} dav:sync-system-addressbook ---- +NOTE: Run this command inside the ownCloud Docker container. + ==== SyncJob (Federation) OCAFederationSyncJob @@ -161,6 +171,8 @@ xref:configuration/server/occ_command.adoc#federation-sync[OCC federation sync] {occ-command-example-prefix} federation:sync-addressbooks ---- +NOTE: Run this command inside the ownCloud Docker container. + == Troubleshooting === Remove Non-Existent Background Jobs diff --git a/modules/admin_manual/pages/configuration/server/harden_server.adoc b/modules/admin_manual/pages/configuration/server/harden_server.adoc index e7cfa72c5..cf8779f11 100644 --- a/modules/admin_manual/pages/configuration/server/harden_server.adoc +++ b/modules/admin_manual/pages/configuration/server/harden_server.adoc @@ -36,6 +36,8 @@ This information is obtained by running xref:configuration/server/occ_command.ad {occ-command-example-prefix} security:routes ---- +NOTE: Run this command inside the ownCloud Docker container. + It should print a list of all the routes as in the following truncated example. [source,plaintext] diff --git a/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc b/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc index b3527719a..3cbdeaf39 100644 --- a/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc @@ -51,6 +51,8 @@ Get the current values, if any, for the Imprint and Privacy Policy URLs: {occ-command-example-prefix} config:app:get core legal.privacy_policy_url ---- +NOTE: Run this command inside the ownCloud Docker container. + Set the Imprint and Privacy Policy URLs: [source,bash,subs="attributes+"] ---- @@ -58,6 +60,8 @@ Set the Imprint and Privacy Policy URLs: {occ-command-example-prefix} config:app:set core legal.privacy_policy_url --value=new_value ---- +NOTE: Run this command inside the ownCloud Docker container. + For more information about these commands, refer to xref:configuration/server/occ_command.adoc#config-commands[the config command reference in the occ commands documentation]. == Viewing the URLs diff --git a/modules/admin_manual/pages/configuration/server/occ_command.adoc b/modules/admin_manual/pages/configuration/server/occ_command.adoc index 14eaf14aa..bd64d4d97 100644 --- a/modules/admin_manual/pages/configuration/server/occ_command.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_command.adoc @@ -65,66 +65,43 @@ toc::[] == Running occ -=== Check if occ Is Set to Executable +All `occ` commands must be run inside the running ownCloud Docker container. There are two ways to do this. -Note that this step is not necessary when using a docker installation. +=== Running a Single occ Command -To check if the `occ` command is set to executable, change to your ownCloud directory first, then enter the command: +To run a single `occ` command without entering the container, use `docker compose exec` from the directory containing your `docker-compose.yml`: [source,bash] ---- -ls -lhF occ +docker compose exec owncloud occ ---- -This should give an output similar to this: +[[docker-exec]] +=== Opening a Shell Inside the Container -[source,plaintext] ----- --rwxr-x--x 1 root www-data 283 May 18 17:44 occ* ----- - -In case it does not, set the occ command to executable with: +To run multiple commands interactively, open a bash shell inside the container: [source,bash] ---- -sudo chmod +x occ +docker compose exec owncloud bash ---- -=== As Your HTTP User - -On a regular ownCloud installation, `occ` is in the `owncloud/` directory, this is on Ubuntu Linux for example `/var/www/owncloud` . `occ` itself is a PHP script. - -*You must run it as your HTTP user* to ensure that the correct permissions are maintained on your ownCloud files and directories. The default HTTP user is different on the various Linux distributions. - -* The HTTP user and group in Debian/Ubuntu is `www-data`. -* The HTTP user and group in Fedora/CentOS is `apache`. -* The HTTP user and group in Arch Linux is `http`. -* The HTTP user in openSUSE is `wwwrun`, and the HTTP group is `www`. +Once inside, run `occ` commands directly: -[TIP] -==== -Use the following command to find your HTTP user: [source,bash] ---- -ps -ef | egrep '(apache|httpd)' | grep -v grep | grep -v root | head -n1 | awk '{print $1}' +occ ---- -==== -If your HTTP server is configured to use a different PHP version than the default (/usr/bin/php), `occ` should be run with the same version. + -For example, in CentOS with SCL-PHP74 installed, the command looks like this: - -[source,bash] ----- -sudo -u apache /opt/rh/php74/root/usr/bin/php /var/www/html/owncloud/occ ----- +Type `exit` to leave the container shell. === occ Command Structure The `occ` command has _options_, _commands_, and _arguments_. -. Options are optional. +. Options are optional. . Commands are required. -. Arguments can be required _or_ optional. +. Arguments can be required _or_ optional. The generic syntax is: @@ -133,25 +110,6 @@ The generic syntax is: occ [options] command [arguments] ---- -.Example command running occ in Ubuntu -[source,bash] ----- -sudo -u www-data /var/www/owncloud/occ ----- - -If your web server is configured to use a different PHP version than the default (/usr/bin/php), the `occ` command should be run with the same version. - -=== With a Docker Container - -If your ownCloud instance is set up in a docker container, you need a user in the group `docker` to perform `occ` commands. An example command looks like this: - -[source,docker] ----- -docker exec --user www-data occ ----- - -For more information on docker, refer to section xref:installation/docker/index.adoc[Installing with Docker]. - === Example Commands Running `occ` with no options lists all commands and options, like this example on Ubuntu: diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_2fa_app_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_2fa_app_commands.adoc index fa543aa65..4d0ed815f 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_2fa_app_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_2fa_app_commands.adoc @@ -22,6 +22,8 @@ Delete the redundant secrets of non-existing users: {occ-command-example-prefix} twofactor_totp:delete-redundant-secret ---- +NOTE: Run this command inside the ownCloud Docker container. + == Set Secret Verification Status Set secret verification status of specified users or all users: @@ -31,6 +33,8 @@ Set secret verification status of specified users or all users: {occ-command-example-prefix} twofactor_totp:set-secret-verification-status [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_activity_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_activity_commands.adoc index b46452394..d7f13996e 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_activity_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_activity_commands.adoc @@ -17,6 +17,8 @@ The `activity:send-emails` command sends all pending activity emails immediately {occ-command-example-prefix} activity:send-emails ---- +NOTE: Run this command inside the ownCloud Docker container. + == Manage Rename and Move Action Notifications Starting with Activity app version 2.7.0, rename and move action notifications can be sent. This feature is disabled by default and must be enabled manually. @@ -28,6 +30,8 @@ Starting with Activity app version 2.7.0, rename and move action notifications c {occ-command-example-prefix} config:app:set activity enable_move_and_rename_activities --value "yes" ---- +NOTE: Run this command inside the ownCloud Docker container. + === Disable Rename and Move Action Notifications [source,bash,subs="attributes+"] @@ -35,9 +39,13 @@ Starting with Activity app version 2.7.0, rename and move action notifications c {occ-command-example-prefix} config:app:set activity enable_move_and_rename_activities --value "no" ---- +NOTE: Run this command inside the ownCloud Docker container. + or [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} config:app:delete activity enable_move_and_rename_activities ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_admin_audit_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_admin_audit_commands.adoc index 6b1c406d9..11c31b433 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_admin_audit_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_admin_audit_commands.adoc @@ -18,6 +18,8 @@ To ignore all CLI triggered events, you can set the following option, defaults t --value "yes" ---- +NOTE: Run this command inside the ownCloud Docker container. + == Get Value of Ignore CLI Events This command reads the value of `admin_audit ignore_cli_events`: @@ -27,6 +29,8 @@ This command reads the value of `admin_audit ignore_cli_events`: {occ-command-example-prefix} config:app:get "admin_audit ignore_cli_events" ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,plaintext] ---- yes @@ -40,3 +44,5 @@ This command completely removes the key and the value: ---- {occ-command-example-prefix} config:app:delete "admin_audit ignore_cli_events" ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_antivirus_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_antivirus_commands.adoc index 62622c0bf..4df727680 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_antivirus_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_antivirus_commands.adoc @@ -12,6 +12,8 @@ Parametrisation must be done with the `occ config` command set. {occ-command-example-prefix} config:list files_antivirus ---- +NOTE: Run this command inside the ownCloud Docker container. + == Set the Setting To set a new value, use the command below and replace `` and value `` accordingly. @@ -21,6 +23,8 @@ To set a new value, use the command below and replace `` and value ` {occ-command-example-prefix} config:app:set files_antivirus --value= --update-only ---- +NOTE: Run this command inside the ownCloud Docker container. + === Antivirus Mode [string] Antivirus Configuration. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_brute_force_protection_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_brute_force_protection_commands.adoc index 08d4a679e..21b6ca2f1 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_brute_force_protection_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_brute_force_protection_commands.adoc @@ -13,6 +13,8 @@ The combination of `uid` and `IP address` is used to trigger the ban. {occ-command-example-prefix} config:list brute_force_protection ---- +NOTE: Run this command inside the ownCloud Docker container. + == Set the Setting To set a new value, use the command below and replace `` and value `` accordingly. @@ -22,6 +24,8 @@ To set a new value, use the command below and replace `` and value ` {occ-command-example-prefix} config:app:set brute_force_protection --value= --update-only ---- +NOTE: Run this command inside the ownCloud Docker container. + === Fail Tolerance [attempts] Number of wrong attempts to trigger the ban. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_custom_groups.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_custom_groups.adoc index a0d99d485..276181f1d 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_custom_groups.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_custom_groups.adoc @@ -23,6 +23,8 @@ By default, administrators can administrate custom groups of an instance. When c --type boolean --value true ---- +NOTE: Run this command inside the ownCloud Docker container. + This occ command will create a key-value pair in your config.php which must be writable for the webserver user. You can also do this manually by adding the following key in config.php: [source.plaintext] @@ -42,6 +44,8 @@ You can hide custom groups from a user's personal settings page based on a user' --value '["no_guest_app_users", "project5"]' ---- +NOTE: Run this command inside the ownCloud Docker container. + This occ command will create a key-value pair in your config.php which must be writable for the webserver user to be set. You can also set this manually by adding the following key in config.php: [source.plaintext] @@ -65,6 +69,8 @@ This setting defines if ordinary users are allowed to create custom groups. By d --value 'true' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Restrict Add or Remove Group Members This setting defines if an existing ordinary group member is allowed to add other users to the target group or remove them. By default, all users can add members to groups, but this can be restricted to admins (if allowed as above) and group-admins. Values to be set can be 'yes' and 'no', defaults to 'no'. @@ -77,6 +83,8 @@ This setting defines if an existing ordinary group member is allowed to add othe --value 'yes' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Allow Duplicate Group Display Names This setting allows the creation of multiple groups with the same display name. By default, group display names must be unique, but it can be be allowed to have multiple identical group display names. Values to be set can be 'true' and 'false', defaults to 'false'. @@ -88,3 +96,5 @@ This setting allows the creation of multiple groups with the same display name. allow_duplicate_names \ --value 'false' ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_data_exporter_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_data_exporter_commands.adoc index 7ecf599ca..5716d2428 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_data_exporter_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_data_exporter_commands.adoc @@ -24,6 +24,8 @@ The following commands are available for the Data Exporter app: {occ-command-example-prefix} instance:export:user ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="80%",cols="30%,70%",] @@ -39,6 +41,8 @@ The following commands are available for the Data Exporter app: {occ-command-example-prefix} instance:import:user [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="80%",cols="30%,70%",] @@ -62,6 +66,8 @@ The following commands are available for the Data Exporter app: {occ-command-example-prefix} instance:export:migrate:share ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="80%",cols="30%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_files_lifecycle.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_files_lifecycle.adoc index dbcef98f6..32de07b15 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_files_lifecycle.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_files_lifecycle.adoc @@ -47,6 +47,8 @@ Archive files which have reached a certain age. {occ-command-example-prefix} lifecycle:archive [options] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Options [width="90%",cols="40%,80%",] @@ -65,6 +67,8 @@ Expire files from archive which have reached a certain age. {occ-command-example-prefix} lifecycle:expire [options] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Options [width="90%",cols="40%,80%",] @@ -83,6 +87,8 @@ Restore files from archive to the original location. Note that the location for {occ-command-example-prefix} lifecycle:restore ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="90%",cols="40%,80%",] @@ -100,6 +106,8 @@ Restore all files in folder `project1` for user alice with path `/work/projects/ {occ-command-example-prefix} lifecycle:restore /alice/archive/files/work/projects/project1 ---- +NOTE: Run this command inside the ownCloud Docker container. + == Restore All Files From Archive Restore all archived files for all users in the system back to their original locations. This command has no additional arguments or options. @@ -109,6 +117,8 @@ Restore all archived files for all users in the system back to their original lo {occ-command-example-prefix} lifecycle:restore-all ---- +NOTE: Run this command inside the ownCloud Docker container. + == Set Default Upload Time Set upload time for files which do not have one. @@ -121,6 +131,8 @@ This can happen with files that were uploaded before the files_lifecycle app was {occ-command-example-prefix} lifecycle:set-upload-time [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="90%",cols="40%,80%",] @@ -153,6 +165,8 @@ The following example command sets the time passed since upload (or restore) for {occ-command-example-prefix} config:app:set files_lifecycle archive_period --value='90' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Set the Expire Period The number of days since archiving after which files will be permanently deleted. @@ -164,6 +178,8 @@ The following example command sets the time passed to delete files to 180 days. {occ-command-example-prefix} config:app:set files_lifecycle expire_period --value='180' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Set Groups to be Excluded Define groups of users that are exempt from the lifecycle policies (comma-separated group ids). @@ -175,6 +191,8 @@ The following example command specifies groups whose members will not be part of {occ-command-example-prefix} config:app:set files_lifecycle excluded_groups --value='group1,group2' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Restoration Policy for Users Set a policy who can restore files. Use the value `soft` for self-service and `hard` for admin/groupadmin-service. @@ -186,6 +204,8 @@ The following example command sets the restoration policy for users to `soft` (d {occ-command-example-prefix} config:app:set files_lifecycle policy --value='soft' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Disable User Interface Disable the whole user interface for the File Lifecycle Management app. @@ -197,9 +217,13 @@ The following example command disables the user interface for the File Lifecycle {occ-command-example-prefix} config:app:set files_lifecycle disable_ui --value='yes' ---- +NOTE: Run this command inside the ownCloud Docker container. + You can reenable it by deleting the key: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} config:app:delete files_lifecycle disable_ui ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_full_text_search_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_full_text_search_commands.adoc index 13f419cb9..9c4a4b596 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_full_text_search_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_full_text_search_commands.adoc @@ -29,6 +29,8 @@ The command `search:index:create` creates the initial full text search index for {occ-command-example-prefix} search:index:create ()... ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,100%"] @@ -57,6 +59,8 @@ This example creates a full text search index for the user with user id `testuse Indexing user testuser ---- +NOTE: Run this command inside the ownCloud Docker container. + === Example 2 This example creates a full text search index for the users with user ids `admin` and `testuser`. @@ -69,6 +73,8 @@ Indexing user admin Indexing user testuser ---- +NOTE: Run this command inside the ownCloud Docker container. + == Fill a Secondary Index Fill a secondary index based on the indexed data we have. Files not matching the "indexed" status will be ignored. This is intended to be used in index data migrations, so the connector for this secondary index should have been configured as "write connector". See the xref:configuration/general_topics/search.adoc[Full Text Search] documentation for more details. Note that the values of the `connector_name` are hardcoded and have to be written as described. @@ -78,6 +84,8 @@ Fill a secondary index based on the indexed data we have. Files not matching the {occ-command-example-prefix} search:index:fillSecondary [options] [--] ... ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,100%"] @@ -117,6 +125,8 @@ If you want to rebuild the whole index, run `search:index:reset` and then `searc {occ-command-example-prefix} search:index:rebuild ()... ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,100%"] @@ -153,6 +163,8 @@ This will delete all full text search index data for testuser! Do you want to pr Rebuilding full text search Index for testuser ---- +NOTE: Run this command inside the ownCloud Docker container. + === Example 2 This example rebuilds the full text search index for the users with user IDs `admin` and `testuser`. @@ -170,6 +182,8 @@ Rebuilding Search Index for admin Rebuilding Search Index for testuser ---- +NOTE: Run this command inside the ownCloud Docker container. + === Rebuild the Entire Index The entire index can be rebuilt by running the following two commands: @@ -189,6 +203,8 @@ Reset all the configured indexes. Changes in the configuration of the indexes as {occ-command-example-prefix} search:index:reset ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,100%"] @@ -209,6 +225,8 @@ This will delete the whole search index! Do you want to proceed? Search index has been reset. ---- +NOTE: Run this command inside the ownCloud Docker container. + == Update the Full Text Search Index Updates to the search index due to changed content or changed metadata are happening via background jobs that are added to a queue. These background jobs are normally run by the ownCloud cronjob. The command `search:index:update` updates the full text search index by running all pending background jobs. @@ -218,6 +236,8 @@ Updates to the search index due to changed content or changed metadata are happe {occ-command-example-prefix} search:index:update ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,100%"] @@ -237,6 +257,8 @@ Start Updating the Elastic search index: No pending jobs found. ---- +NOTE: Run this command inside the ownCloud Docker container. + == Set App Modes To do an initial full indexing without the Full Text Search app interfering, it can be put in passive mode. See the xref:configuration/general_topics/search.adoc#app-modes[App Modes] section in the Full Text Search description for details. @@ -247,6 +269,8 @@ To do an initial full indexing without the Full Text Search app interfering, it search_elastic mode --value passive ---- +NOTE: Run this command inside the ownCloud Docker container. + Switching back to active mode can be done by running the following command: [source,bash,subs="attributes+"] @@ -255,6 +279,8 @@ Switching back to active mode can be done by running the following command: search_elastic mode --value active ---- +NOTE: Run this command inside the ownCloud Docker container. + == Restrict Search Results Search results can be restricted in different ways, see the xref:configuration/general_topics/search.adoc#restrict-search-results[Restrict Search Results] section in the Full Text Search description for details. @@ -267,6 +293,8 @@ Search results can be restricted in different ways, see the xref:configuration/g search_elastic nocontent --value true ---- +NOTE: Run this command inside the ownCloud Docker container. + Switching back to provide all content search results can be done by running the following command: [source,bash,subs="attributes+"] @@ -275,6 +303,8 @@ Switching back to provide all content search results can be done by running the search_elastic nocontent --value false ---- +NOTE: Run this command inside the ownCloud Docker container. + === Limit Metadata Search for Groups [source,bash,subs="attributes+"] @@ -283,3 +313,5 @@ Switching back to provide all content search results can be done by running the search_elastic group.nocontent \ --value group1,group2,"group with blank" ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ldap_integration_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ldap_integration_commands.adoc index 2610e4cf2..c365fe984 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ldap_integration_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ldap_integration_commands.adoc @@ -23,6 +23,9 @@ Search for an LDAP user, using this syntax: ---- {occ-command-example-prefix} ldap:search [options] [--] ---- + +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -116,6 +119,8 @@ Searches match at the beginning of the attribute value only. This example search {occ-command-example-prefix} ldap:search "rob" ---- +NOTE: Run this command inside the ownCloud Docker container. + This will find "robbie", "roberta", and "robin". Broaden the search to find, for example, `jeroboam` with the asterisk wildcard: @@ -124,6 +129,8 @@ Broaden the search to find, for example, `jeroboam` with the asterisk wildcard: {occ-command-example-prefix} ldap:search "*rob" ---- +NOTE: Run this command inside the ownCloud Docker container. + The following examples use `offset` and `limit` options: [source,bash,subs="attributes+"] @@ -136,6 +143,8 @@ Rekha Cox (Rekha.Cox) Rekha Craft (Rekha.Craft) ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} ldap:search "re" --offset 0 --limit 3 @@ -144,6 +153,8 @@ Rebecca Vintin (Rebecca.Vintin) Rebekka Da-Cahuna (Rebekka.Da-Cahuna) ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} ldap:search "re" --offset 3 --limit 3 @@ -151,6 +162,8 @@ Rekha Cox (Rekha.Cox) Rekha Craft (Rekha.Craft) ---- +NOTE: Run this command inside the ownCloud Docker container. + == Check if an LDAP User Exists This only works if the ownCloud server is connected to an LDAP server. @@ -183,6 +196,8 @@ Example: {occ-command-example-prefix} ldap:check-user robert ---- +NOTE: Run this command inside the ownCloud Docker container. + `ldap:check-user` will not run a check when it finds a disabled LDAP connection. This prevents users that exist on disabled LDAP connections from being marked as deleted. If you know for sure that the user you are searching for is not in one of the disabled connections and exists on an active connection, use the `--force` option to force a check of all active LDAP connections. [source,bash,subs="attributes+"] @@ -190,6 +205,8 @@ Example: {occ-command-example-prefix} ldap:check-user --force robert ---- +NOTE: Run this command inside the ownCloud Docker container. + == Create an Empty LDAP Configuration Create an empty LDAP configuration. @@ -215,6 +232,8 @@ Configurations that you create without assigning a are automatically Created new configuration with configID 's01' ---- +NOTE: Run this command inside the ownCloud Docker container. + == List and View Your Configurations You can list and view your configurations: @@ -224,6 +243,8 @@ You can list and view your configurations: {occ-command-example-prefix} ldap:show-config [options] [--] [] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -252,6 +273,8 @@ If you omit the `configID`, all configuration ID's with their settings are liste {occ-command-example-prefix} ldap:show-config ---- +NOTE: Run this command inside the ownCloud Docker container. + View the configuration for a single `configID`: [source,bash,subs="attributes+"] @@ -259,6 +282,8 @@ View the configuration for a single `configID`: {occ-command-example-prefix} ldap:show-config s01 ---- +NOTE: Run this command inside the ownCloud Docker container. + == Delete an Existing LDAP Configuration Deletes an existing LDAP configuration. @@ -282,6 +307,8 @@ Deletes an existing LDAP configuration. Deleted configuration with configID 's01' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Invalidate LDAP Cache This command invalidates the LDAP cache for all users: @@ -291,6 +318,8 @@ This command invalidates the LDAP cache for all users: {occ-command-example-prefix} ldap:invalidate-cache ---- +NOTE: Run this command inside the ownCloud Docker container. + == Manipulate LDAP Configurations This command manipulates LDAP configurations. @@ -300,6 +329,8 @@ This command manipulates LDAP configurations. {occ-command-example-prefix} ldap:set-config ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -323,6 +354,8 @@ This example sets search attributes: {occ-command-example-prefix} ldap:set-config s01 ldapAttributesForUserSearch "cn;givenname;sn;displayname;mail" ---- +NOTE: Run this command inside the ownCloud Docker container. + Available keys, along with default values for configValue, are listed in the table below. [width="70%",cols=",",options="header",] @@ -390,6 +423,8 @@ Tests whether your configuration is correct and can bind to the server. {occ-command-example-prefix} ldap:test-config ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -406,6 +441,8 @@ Example: The configuration is valid and the connection could be established! ---- +NOTE: Run this command inside the ownCloud Docker container. + == Set and Unset LDAP App Configurations [source,bash,subs="attributes+"] @@ -413,6 +450,8 @@ The configuration is valid and the connection could be established! {occ-command-example-prefix} config:app:set user_ldap updateAttributesInterval --value=7200 ---- +NOTE: Run this command inside the ownCloud Docker container. + In the example above, the interval is being set to 7200 seconds. Assuming the above example was used, the command would output the following: @@ -428,6 +467,8 @@ If you want to reset (or unset) the setting, then you can use the following comm {occ-command-example-prefix} config:app:delete user_ldap updateAttributesInterval ---- +NOTE: Run this command inside the ownCloud Docker container. + *Reuse Existing LDAP Accounts if Available* If you want to allow new LDAP logins to attempt to reuse existing `oc_accounts` entries that match the resolved username attribute, and have backend set to `User_Proxy`, then set the `reuse_accounts` config setting to `yes`. @@ -439,6 +480,8 @@ Below is an example of how to do so. {occ-command-example-prefix} config:app:set user_ldap reuse_accounts --value="yes" ---- +NOTE: Run this command inside the ownCloud Docker container. + This functionality is valuable for several reasons; these are: * It handles the situation of when admins mistakenly delete one or more user mappings, and subsequent logins then create new accounts. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_market_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_market_commands.adoc index 131798919..243809147 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_market_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_market_commands.adoc @@ -36,6 +36,8 @@ So its app id is `twofactor_backup_codes`. {occ-command-example-prefix} market:install [option] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="80%",cols="30%,70%",] @@ -66,6 +68,8 @@ Only `zip`, `gzip`, and `bzip2` archives are supported. {occ-command-example-prefix} market:install -l /mnt/data/richdocuments-2.0.0.tar.gz ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: The target directory has to be *accessible to the webserver user* and you have to *enable* the app afterwards with the `occ app:enable` command. == Uninstall an Application @@ -77,6 +81,8 @@ To uninstall an application use the following commands: {occ-command-example-prefix} market:uninstall ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="80%",cols="30%,70%",] @@ -94,6 +100,8 @@ It returns the ids of the apps. {occ-command-example-prefix} market:list ---- +NOTE: Run this command inside the ownCloud Docker container. + == Upgrade an Application Install new app versions if available on the marketplace by using following commands: @@ -103,6 +111,8 @@ Install new app versions if available on the marketplace by using following comm {occ-command-example-prefix} market:upgrade [options] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="80%",cols="30%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_metrics_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_metrics_commands.adoc index 7559e1e74..7d4094856 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_metrics_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_metrics_commands.adoc @@ -28,6 +28,8 @@ Note: You can also set the config key/value manually into your config.php file. --value "your-metrics-secret" ---- +NOTE: Run this command inside the ownCloud Docker container. + The above command adds the following at the end of `config.php`: [source,php] @@ -44,6 +46,8 @@ This command reads the value of the `metrics_shared_secret` key from config.php: {occ-command-example-prefix} config:system:get "metrics_shared_secret" ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,plaintext] ---- your-metrics-secret @@ -58,3 +62,5 @@ This command completely removes the key and the value from config.php: {occ-command-example-prefix} config:system:delete "metrics_shared_secret" ---- +NOTE: Run this command inside the ownCloud Docker container. + diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_kitworks_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_kitworks_commands.adoc index bd50c40e6..cc71e4b2f 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_kitworks_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_kitworks_commands.adoc @@ -28,6 +28,8 @@ To start the migration, it must be initialized first: {occ-command-example-prefix} migrate:to-kiteworks:init KW_HOST KW_APPLICATION_ID "KW_SECRET" ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -59,6 +61,8 @@ After initialisation, the migration must be verified to be ready: {occ-command-example-prefix} migrate:to-kiteworks:verify $KW_ADMIN_USER ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -84,6 +88,8 @@ After verification, migrating users can be started: {occ-command-example-prefix} migrate:to-kiteworks:users $KW_ADMIN_USER $KW_PROFILE_GUEST ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -112,6 +118,8 @@ After migrating users, migrating files can be started: {occ-command-example-prefix} migrate:to-kiteworks:files $KW_ADMIN_USER ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -137,6 +145,8 @@ After migrating files, shares can be migrated. Note that when initiating this st {occ-command-example-prefix} migrate:to-kiteworks:shares $KW_ADMIN_USER ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -162,6 +172,8 @@ After migrating shares, the final step can be processed. This is to disable migr {occ-command-example-prefix} migrate:to-kiteworks:disable-users $KW_ADMIN_USER ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_password_policy_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_password_policy_commands.adoc index 37099c67f..ecc8c3e97 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_password_policy_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_password_policy_commands.adoc @@ -11,6 +11,8 @@ Command to expire a user or group of users’ passwords. {occ-command-example-prefix} user:expire-password [] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,82%",] @@ -69,6 +71,8 @@ The password for frank is set to expire on 2018-07-12 13:15:28 UTC. {occ-command-example-prefix} user:expire-password --uid frank '15-Aug-05 15:52:01 UTC' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Caveats Please be aware of the following implications of enabling or changing the password policy's "*days until user password expires*" option. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ransomware_protection_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ransomware_protection_commands.adoc index c187c6e8b..e5057cee4 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ransomware_protection_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ransomware_protection_commands.adoc @@ -31,6 +31,8 @@ Scan the ownCloud database for changes in order to discover anomalies in a user {occ-command-example-prefix} ransomguard:scan ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -49,6 +51,8 @@ Revert all operations in a user account after a given point in time. Note that ` {occ-command-example-prefix} ransomguard:restore ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -67,6 +71,8 @@ When necessary, set a user account as `read-only` for ownCloud and other WebDAV {occ-command-example-prefix} ransomguard:lock ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -84,6 +90,8 @@ When ransomware issues have been resolved, the user account can be unlocked. {occ-command-example-prefix} ransomguard:unlock ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -105,6 +113,8 @@ This command will set the location of the blacklist file the app will use. The l {occ-command-example-prefix} ransomguard:blacklist:set-file ---- +NOTE: Run this command inside the ownCloud Docker container. + ==== Arguments [width="100%",cols="20%,70%",] @@ -122,6 +132,8 @@ This command will update the contents of the blacklist file using another file a {occ-command-example-prefix} ransomguard:blacklist:update:from-file ---- +NOTE: Run this command inside the ownCloud Docker container. + ==== Arguments [width="100%",cols="20%,70%",] @@ -139,6 +151,8 @@ This command will update the contents by getting the blacklist from a website. T {occ-command-example-prefix} ransomguard:blacklist:update:from-site ---- +NOTE: Run this command inside the ownCloud Docker container. + ==== Arguments [width="100%",cols="20%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_richdocuments.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_richdocuments.adoc index b8c7c9fa1..f78896b13 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_richdocuments.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_richdocuments.adoc @@ -41,6 +41,8 @@ Adding the port is only necessary when not using standard ports. {occ-command-example-prefix} config:app:set richdocuments wopi_url --value='[IP/URL]:port' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Enable Secure View Enable Secure View (possible values: true/false, default: false). @@ -52,6 +54,8 @@ The following example command enables secure view globally on the system: {occ-command-example-prefix} config:app:set richdocuments secure_view_option --value='true' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Define the Watermark Pattern Displayed A watermark pattern is displayed in the document when it is viewed. It can be an arbitrary string. The keyword \{viewer-email} will be replaced with the current user's email address in the document watermark. If an email address is not set, then the user's display name will be used. @@ -63,6 +67,8 @@ The following example command sets the watermark pattern displayed in the docume {occ-command-example-prefix} config:app:set richdocuments watermark_text --value='Restricted to \{viewer-email}' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Open Documents in a New Tab By default, documents will open in a new tab if not otherwise defined. You can change this behaviour with a command (possible values: true/false, default: false). @@ -74,6 +80,8 @@ The following example command makes documents open in the same tab: {occ-command-example-prefix} config:app:set richdocuments open_in_new_tab --value='false' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Define the Print and Exporting Option Enable documents in secure view mode to be printed and exported (possible values: true/false, default: false). @@ -85,6 +93,8 @@ The following example command enables the option to globally print and export do {occ-command-example-prefix} config:app:set secure_view_can_print_default --value='true' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Enforce Displaying the Watermark Open documents in secure view with watermark by default (possible values: true/false, default: false). @@ -96,6 +106,8 @@ The following example command enables the option to globally enforce displaying {occ-command-example-prefix} config:app:set richdocuments secure_view_open_action_default --value='true' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Delete a Key or Change a Key You can delete a key with the following example command: @@ -105,9 +117,13 @@ You can delete a key with the following example command: {occ-command-example-prefix} config:app:delete richdocuments secure_view_open_action_default ---- +NOTE: Run this command inside the ownCloud Docker container. + You can change a key with the following example command: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} config:app:set richdocuments secure_view_option --value='false' ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_s3objectstore_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_s3objectstore_commands.adoc index f93c170b0..63a8a96a8 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_s3objectstore_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_s3objectstore_commands.adoc @@ -11,6 +11,8 @@ Marketplace URL: {oc-marketplace-url}/apps/files_primary_s3[S3 Primary Object St {occ-command-example-prefix} s3:list ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="80%",cols="30%,70%",] @@ -26,6 +28,8 @@ Marketplace URL: {oc-marketplace-url}/apps/files_primary_s3[S3 Primary Object St {occ-command-example-prefix} s3:create-bucket ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="80%",cols="30%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_saml_sso_shibboleth_integration_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_saml_sso_shibboleth_integration_commands.adoc index 29b0577ac..46e604843 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_saml_sso_shibboleth_integration_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_saml_sso_shibboleth_integration_commands.adoc @@ -8,3 +8,5 @@ Marketplace URL: {oc-marketplace-url}/apps/user_shibboleth[SAML/SSO Integration] ---- {occ-command-example-prefix} shibboleth:mode [mode] ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_wnd_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_wnd_commands.adoc index a08c6415f..65f1103f6 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_wnd_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_wnd_commands.adoc @@ -27,6 +27,8 @@ Listen to smb changes and store notifications for later processing in the databa {occ-command-example-prefix} wnd:listen [options] [--] [] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="90%",cols="40%,80%",] @@ -83,6 +85,8 @@ Process the notifications stored by the `wnd:listen` command {occ-command-example-prefix} wnd:process-queue [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="90%",cols="40%,80%",] @@ -112,6 +116,8 @@ Sets the service account for the target mount point. You'll be asked for the pas {occ-command-example-prefix} wnd:set-service-account [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + Please see the occ documentation of xref:configuration/server/occ_command.adoc#files_externallist[files_external:list] to get the required mount-id. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_2fa_core_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_2fa_core_commands.adoc index e7a912c3c..34ae1fa28 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_2fa_core_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_2fa_core_commands.adoc @@ -22,6 +22,8 @@ Disable two-factor authentication for a user: {occ-command-example-prefix} twofactorauth:disable [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -39,6 +41,8 @@ Enable two-factor authentication for a user: {occ-command-example-prefix} twofactorauth:enable [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_app_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_app_commands.adoc index dabc63894..9d0c05da4 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_app_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_app_commands.adoc @@ -22,6 +22,8 @@ The output shows whether they are enabled or disabled. {occ-command-example-prefix} app:list [--] [] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -65,6 +67,8 @@ Enable an app, for example the Market app. market enabled ---- +NOTE: Run this command inside the ownCloud Docker container. + == Disable an App [source,bash,subs="attributes+"] @@ -73,6 +77,8 @@ market enabled market disabled ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: Be aware that the following apps cannot be disabled: _DAV_, _FederatedFileSharing_, _Files_ and _Files_External_. == Check App Code @@ -90,6 +96,8 @@ By default all checks are enabled. The Activity app is an example of a correctly App is compliant - awesome job! ---- +NOTE: Run this command inside the ownCloud Docker container. + If your app has issues, you'll see output like this. [source,bash,subs="attributes+"] @@ -103,6 +111,8 @@ Analysing /var/www/owncloud/apps/files/foo_app.php line 49: OC_Util - Static method of private class must not be called ---- +NOTE: Run this command inside the ownCloud Docker container. + == Get the App Installation Path You can get the full file path to an app. @@ -113,3 +123,5 @@ You can get the full file path to an app. /var/www/owncloud/apps/notifications ---- +NOTE: Run this command inside the ownCloud Docker container. + diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_background_jobs_selector.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_background_jobs_selector.adoc index 57652cec0..b4cddaec0 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_background_jobs_selector.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_background_jobs_selector.adoc @@ -25,5 +25,7 @@ background {occ-command-example-prefix} background:webcron ---- +NOTE: Run this command inside the ownCloud Docker container. + TIP: Check out the sections xref:configuration/server/occ_command.adoc#managing-background-jobs[Managing Background Jobs] and xref:configuration/server/background_jobs_configuration.adoc[Background Jobs configuration] to learn more. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_installation_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_installation_commands.adoc index 67ba27f55..2a47dac17 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_installation_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_installation_commands.adoc @@ -39,6 +39,8 @@ Available commands: maintenance:install Install ownCloud ---- +NOTE: Run this command inside the ownCloud Docker container. + == Command Description @@ -51,6 +53,8 @@ ownCloud is not installed - only a limited number of commands are available Usage: ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,plaintext] ---- maintenance:install [--database=["..."]] [--database-connection-string=["..."]] \ @@ -122,3 +126,5 @@ cd /var/www/owncloud/ ownCloud is not installed - only a limited number of commands are available ownCloud was successfully installed ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_upgrade_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_upgrade_commands.adoc index 49706a2c9..60df06634 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_upgrade_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_upgrade_commands.adoc @@ -12,6 +12,8 @@ Usage: upgrade [options] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Options [width="100%",cols="20%,70%",] @@ -40,6 +42,8 @@ Update successful Turned off maintenance mode ---- +NOTE: Run this command inside the ownCloud Docker container. + Note how it details the steps. Enabling verbosity displays timestamps: [source,bash,subs="attributes+"] @@ -55,6 +59,8 @@ ownCloud or one of the apps require upgrade - only a limited number of commands 2017-06-23T09:06:15+0000 Turned off maintenance mode ---- +NOTE: Run this command inside the ownCloud Docker container. + If there is an error it throws an exception, and the error is detailed in your ownCloud logfile, so you can use the log output to figure out what went wrong, or to use in a bug report. ---- diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_commands.adoc index 97f61ee96..fbfb4305b 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_commands.adoc @@ -80,6 +80,8 @@ These commands manage the configurations of apps. Keys and values are stored in {occ-command-example-prefix} config:app:delete [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -104,6 +106,8 @@ These commands manage the configurations of apps. Keys and values are stored in Config value provisioning_api of app myappname deleted ---- +NOTE: Run this command inside the ownCloud Docker container. + The delete command will by default not complain if the configuration was not set before. If you want to be notified in that case, set the `--error-if-not-exists` flag. @@ -113,6 +117,8 @@ If you want to be notified in that case, set the `--error-if-not-exists` flag. Config provisioning_api of app appname could not be deleted because it did not exist ---- +NOTE: Run this command inside the ownCloud Docker container. + == config:app:get [source,bash,subs="attributes+"] @@ -120,6 +126,8 @@ Config provisioning_api of app appname could not be deleted because it did not e {occ-command-example-prefix} config:app:get [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -145,6 +153,8 @@ the command will exit with 1. 2.2.1 ---- +NOTE: Run this command inside the ownCloud Docker container. + == config:app:set [source,bash,subs="attributes+"] @@ -152,6 +162,8 @@ the command will exit with 1. {occ-command-example-prefix} config:app:set [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -181,6 +193,8 @@ the command will exit with 1. Config value incoming_server2server_share_enabled for app files_sharing set to yes ---- +NOTE: Run this command inside the ownCloud Docker container. + The `config:app:set` command creates the value, if it does not already exist. To update an existing value, set `--update-only`: [source,bash,subs="attributes+"] @@ -193,6 +207,8 @@ The `config:app:set` command creates the value, if it does not already exist. To Value not updated, as it has not been set before. ---- +NOTE: Run this command inside the ownCloud Docker container. + == General Config Commands These commands manage listing and importing configurations. @@ -207,6 +223,8 @@ Values that exist in the current configuration, but not in the one that is being {occ-command-example-prefix} config:import filename.json ---- +NOTE: Run this command inside the ownCloud Docker container. + It is also possible to import remote files, by piping the input: [source,bash,subs="attributes+"] @@ -214,6 +232,8 @@ It is also possible to import remote files, by piping the input: {occ-command-example-prefix} config:import < local-backup.json ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: While it is possible to update/set/delete the versions and installation statuses of apps and ownCloud itself, it is *not* recommended to do this directly. Use the `occ app:enable`, `occ app:disable` and `occ update` commands instead. @@ -226,6 +246,8 @@ The `config:list` command lists all configuration values for your ownCloud setup {occ-command-example-prefix} config:list [options] [--] [] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -258,6 +280,8 @@ To generate a full report which includes sensitive values, such as passwords and {occ-command-example-prefix} config:list --private ---- +NOTE: Run this command inside the ownCloud Docker container. + === Filtering Information Reported The output can be filtered to just the core information, core and apps, or one specific app. @@ -276,6 +300,8 @@ In the example below, you can see how to filter for each of these categories. {occ-command-example-prefix} config:list -- dav ---- +NOTE: Run this command inside the ownCloud Docker container. + Below is an example of listing the config details for a single app. [source,json] @@ -301,6 +327,8 @@ These commands manage system configurations. {occ-command-example-prefix} config:system:delete [options] [--] ()... ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -324,6 +352,8 @@ These commands manage system configurations. System config value maintenance:mode deleted ---- +NOTE: Run this command inside the ownCloud Docker container. + == config:system:get [source,bash,subs="attributes+"] @@ -331,6 +361,8 @@ System config value maintenance:mode deleted {occ-command-example-prefix} config:system:get [options] [--] ()... ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -355,6 +387,8 @@ the command will exit with 1. 10.7.0.4 ---- +NOTE: Run this command inside the ownCloud Docker container. + == config:system:set [source,bash,subs="attributes+"] @@ -362,6 +396,8 @@ the command will exit with 1. {occ-command-example-prefix} config:system:set [options] [--] ()... ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -396,6 +432,8 @@ ownCloud is in maintenance mode - no app have been loaded System config value maintenance set to boolean false ---- +NOTE: Run this command inside the ownCloud Docker container. + Create the `app_paths` config setting (using a JSON payload because of multi array values): [source,bash,subs="attributes+"] @@ -416,6 +454,8 @@ Create the `app_paths` config setting (using a JSON payload because of multi arr ]' ---- +NOTE: Run this command inside the ownCloud Docker container. + Adding Redis to the configuration: [source,bash,subs="attributes+"] @@ -428,6 +468,8 @@ Adding Redis to the configuration: System config value redis set to json {"host": "{oc-examples-server-ip}", "port": "{std-port-redis}"} ---- +NOTE: Run this command inside the ownCloud Docker container. + Some configurations (e.g., the trusted domain setting) are an array of data. The array starts counting with 0. In order to set (and also get) the value of one key, you can specify multiple `config` names separated by spaces: @@ -439,6 +481,8 @@ owncloud.local sample.tld ---- +NOTE: Run this command inside the ownCloud Docker container. + To replace `sample.tld` with `example.com` trusted_domains => 2 needs to be set: [source,bash,subs="attributes+"] @@ -451,3 +495,5 @@ localhost owncloud.local example.com ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_reports_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_reports_commands.adoc index dc15bb771..467c69d66 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_reports_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_reports_commands.adoc @@ -10,6 +10,8 @@ From the command-line in the root directory of your ownCloud installation, run i {occ-command-example-prefix} configreport:generate ---- +NOTE: Run this command inside the ownCloud Docker container. + This will generate the report and send it to `STDOUT`. You can optionally pipe the output to a file and then attach it to an email to ownCloud support, by running the following command: @@ -18,6 +20,8 @@ You can optionally pipe the output to a file and then attach it to an email to o {occ-command-example-prefix} configreport:generate > generated-config-report.txt ---- +NOTE: Run this command inside the ownCloud Docker container. + Alternatively, you could generate the report and email it all in one command, by running: [source,bash,subs="attributes+"] @@ -28,4 +32,6 @@ Alternatively, you could generate the report and email it all in one command, by ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: These commands are not available in xref:maintenance-commands[single-user (maintenance) mode]. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc index a80f64864..0ff376c4b 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc @@ -11,6 +11,8 @@ Convert charset of MySQL/MariaDB to use utf8mb4. If you are using an older ownCl {occ-command-example-prefix} db:convert-mysql-charset ---- +NOTE: Run this command inside the ownCloud Docker container. + == Restore the Table Format This command sets the default row format of MySQL/MariaDB tables. This is only necessary once before you are going to e.g. install MariaDB 10.6 or higher because the COMPRESSED row format is now read-only by default. As a prerequisite, ownCloud 10.9 needs to be installed first. See the xref:maintenance/upgrading/database_upgrade.adoc[Database Upgrade] guide for details. @@ -19,3 +21,5 @@ This command sets the default row format of MySQL/MariaDB tables. This is only n ---- {occ-command-example-prefix} db:restore-default-row-format ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_dav_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_dav_commands.adoc index ce89b5a15..d0e44c85e 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_dav_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_dav_commands.adoc @@ -23,6 +23,8 @@ NOTE: These commands are not available in xref:maintenance-commands[single-user {occ-command-example-prefix} dav:cleanup-chunks [options] [--] [] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="25%,70%",] @@ -54,6 +56,8 @@ Cleaning chunks for admin 0 [>---------------------------] ---- +NOTE: Run this command inside the ownCloud Docker container. + == Create Addressbook Create a dav address book. @@ -63,6 +67,8 @@ Create a dav address book. {occ-command-example-prefix} dav:create-addressbook ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="25%,70%",] @@ -83,6 +89,8 @@ This example creates the address book `mollybook` for the user molly: {occ-command-example-prefix} dav:create-addressbook molly mollybook ---- +NOTE: Run this command inside the ownCloud Docker container. + Molly will immediately see her address book. == Create Calendar @@ -94,6 +102,8 @@ Create a dav calendar. {occ-command-example-prefix} dav:create-calendar ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="25%,70%",] @@ -114,6 +124,8 @@ This example creates a new calendar `mollycal` for user molly: {occ-command-example-prefix} dav:create-calendar molly mollycal ---- +NOTE: Run this command inside the ownCloud Docker container. + Molly will immediately see her calendar. // NOTE: dav:migrate-addressbooks has been removed with: https://github.com/owncloud/core/pull/23976 @@ -128,6 +140,8 @@ Synchronizes the birthday calendar. It adds all birthdays to your calendar from {occ-command-example-prefix} dav:sync-birthday-calendar [] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="25%,70%",] @@ -145,6 +159,8 @@ This example syncs to your calendar from user `bernie`: {occ-command-example-prefix} dav:sync-birthday-calendar bernie ---- +NOTE: Run this command inside the ownCloud Docker container. + == Sync System Addressbook Synchronizes all users to the system addressbook. @@ -153,3 +169,5 @@ Synchronizes all users to the system addressbook. ---- {occ-command-example-prefix} dav:sync-system-addressbook ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_encryption_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_encryption_commands.adoc index 9fd848c3d..e9586afcd 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_encryption_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_encryption_commands.adoc @@ -50,6 +50,8 @@ To enable encryption you must first enable the Encryption app and then run `occ - defaultModule: OC_DEFAULT_MODULE ---- +NOTE: Run this command inside the ownCloud Docker container. + == Encrypt the Users Home Storage Server-side encryption for local storage like the users home and remote storages like Google Drive can operate independently of each other. By doing so, you can encrypt a remote storage without also having to encrypt the users home storage on your ownCloud server. Possible values are `0` and `1` @@ -70,6 +72,8 @@ The folder must exist and the path is relative to your data directory. {occ-command-example-prefix} encryption:change-key-storage-root ../data/security/oc-keys ---- +NOTE: Run this command inside the ownCloud Docker container. + You can see the current location of your keys folder: [source,bash,subs="attributes+"] @@ -78,6 +82,8 @@ You can see the current location of your keys folder: Current key storage root: default storage location (data/) ---- +NOTE: Run this command inside the ownCloud Docker container. + == List Modules `encryption:list-modules` displays your available encryption modules. @@ -108,6 +114,8 @@ This argument automatically answers, potential, questions with "yes", which is p {occ-command-example-prefix} encryption:decrypt freda ---- +NOTE: Run this command inside the ownCloud Docker container. + Users must have enabled recovery keys on their Personal pages. You must first put your ownCloud server into single-user mode, using xref:maintenance-commands[the maintenance commands], to prevent any user activity until decryption is completed. === Arguments @@ -168,6 +176,8 @@ The `-y` switch can be supplied to automate acceptance of user input. {occ-command-example-prefix} encryption:fix-encrypted-version [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + `encryption:fix-encrypted-version` fixes the encrypted version of files if the encrypted file(s) are not downloadable for a given user. You only need this command if you get an "Invalid Signature" message in the browser or the clients. Background: the `oc_filecache` database table contains the integer columns "version" and "encryptedVersion" which start with 1 and are incremented on every file modification. When using encryption, those values are used together with the ciphertext to generate a cryptographic signature for the file. The version value is required to verify the signature. In some very rare cases like timeouts or bugs etc., the value might not get updated accordingly or get lost. The brute-force approach is to use the `fix:encrypted:version` command until the file can be decrypted. Starting with ownCloud 10.8, the behavior of the command got improved so that the encryptedVersion value is reset to its original value if no correct version was found. Before that fix, the last tried value was stored in the database thus modifying the state of the system and making further rescue attempts non-deterministic. @@ -204,6 +214,8 @@ Searches in increments from -n to +n. [default: "5"] {occ-command-example-prefix} encryption:hsmdaemon [options] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Options [width="100%",cols="30%,70%",] @@ -230,6 +242,8 @@ Allows to test the `hsmdaemon` setup by providing an encrypted string to ownClou {occ-command-example-prefix} encryption:hsmdaemon:decrypt [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="30%,70%",] @@ -258,6 +272,8 @@ Set the url on which the `hsmdaemon` REST-API is reachable. {occ-command-example-prefix} config:app:set encryption hsm.url --value 'http://127.0.0.1:8513' ---- +NOTE: Run this command inside the ownCloud Docker container. + === Set the JSON Web Token Secret To access the `hsmdaemon` API, ownCloud must authenticate with a JWT (JSON Web Token). The given secret is shared between the `hsdmdaemon` (see the hsmdaemon.toml configuration file) and ownCloud to sign the JWT. See the xref:configuration/server/security/hsmdaemon/index.adoc[HSM documentation] for an example how to generate a secret. @@ -267,6 +283,8 @@ To access the `hsmdaemon` API, ownCloud must authenticate with a JWT (JSON Web T {occ-command-example-prefix} config:app:set encryption hsm.jwt.secret --value '7a7d1826-b514-4d9f-afc7-a7485084e8de' ---- +NOTE: Run this command inside the ownCloud Docker container. + === Set the JWT Clockskew The JWT described above has an expiry timestamp. In case the time clocks on ownCloud and hsmdaemon system drift or skew apart, additional time is added to the expiry time to counteract this situation. Set or change the clockskew only if ownCloud advises to do so. Defaults to 120, value is in seconds. @@ -275,3 +293,5 @@ The JWT described above has an expiry timestamp. In case the time clocks on ownC ---- {occ-command-example-prefix} config:app:set encryption hsm.jwt.clockskew --value '120' ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_sync_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_sync_commands.adoc index 5ddd01751..1e31a5510 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_sync_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_sync_commands.adoc @@ -10,4 +10,6 @@ Use this command to synchronize federated servers: {occ-command-example-prefix} federation:sync-addressbooks ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: This command is only available when the "Federation" app (`federation`) is enabled. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_trusted_servers.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_trusted_servers.adoc index 95d528f8c..388eac2ea 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_trusted_servers.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_trusted_servers.adoc @@ -19,6 +19,8 @@ This command adds a trusted federated server. {occ-command-example-prefix} federation:trusted-servers:add ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="25%,70%",] @@ -37,6 +39,8 @@ In the example below, the named trusted server is added. https://myserver:8888/server/owncloud ---- +NOTE: Run this command inside the ownCloud Docker container. + == List Trusted Servers This command lists all trusted federated servers that have been added. @@ -46,6 +50,8 @@ This command lists all trusted federated servers that have been added. {occ-command-example-prefix} federation:trusted-servers:list ---- +NOTE: Run this command inside the ownCloud Docker container. + === Example In the example below, all trusted servers that have been added are listed. @@ -56,6 +62,8 @@ In the example below, all trusted servers that have been added are listed. ---- +NOTE: Run this command inside the ownCloud Docker container. + *Output:* [source,plaintext] @@ -77,6 +85,8 @@ This command removes a trusted federated server. {occ-command-example-prefix} federation:trusted-servers:remove ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="25%,70%",] @@ -94,6 +104,8 @@ In the example below, the trusted server with ID=2 gets removed. {occ-command-example-prefix} federation:trusted-servers:remove 2 ---- +NOTE: Run this command inside the ownCloud Docker container. + *Output:* [source,plaintext] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_file_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_file_commands.adoc index b318bb171..70df3cec1 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_file_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_file_commands.adoc @@ -42,6 +42,8 @@ This is why this command is only provided to check for one file instead of scann files:check-cache [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -66,6 +68,8 @@ Examples of checking files for user maria: welcome.txt has been accessed properly ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} files:check-cache maria maria@smbhome/myfile.txt @@ -74,6 +78,8 @@ Ignoring maria@smbhome/myfile.txt because it is shared or not inside the primary ---- +NOTE: Run this command inside the ownCloud Docker container. + == The files:checksums:verify command ownCloud supports file integrity checking, by computing and matching checksums. @@ -103,6 +109,8 @@ Mismatch for thumbnails/9/2048-2048-max.png: Actual: SHA1:da39a3ee5e6b4b0d3255bfef95601890afd80709 MD5:d41d8cd98f00b204e9800998ecf8427e ADLER32:00000001 ---- +NOTE: Run this command inside the ownCloud Docker container. + === Options [width="100%",cols="20%,70%",] @@ -133,6 +141,8 @@ When a mount point gets removed, the storage ID and file cache related info stay files:remove-storage [options] [--] []... ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="23%,70%",] @@ -164,6 +174,8 @@ This command should be handled with absolute care because *any* storage ID and t {occ-command-example-prefix} files:remove-storage --show-candidates ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,plaintext] ---- +------------+-------------------------------------------------+------------+ @@ -197,6 +209,8 @@ IMPORTANT: Scanning is only possible when using POSIX filesystems but not for ob files:scan [options] [--] []... ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -247,6 +261,8 @@ To get a list of scannable mounts for a given user, use the following command: {occ-command-example-prefix} files_external:list user_id ---- +NOTE: Run this command inside the ownCloud Docker container. + TIP: Mounts are only scannable at the point of origin. Scanning of shares including federated shares is not necessary on the receiver side and therefore not possible. @@ -281,6 +297,8 @@ This way is much faster than running the command for every user separately, but {occ-command-example-prefix} maintenance:singleuser --off ---- +NOTE: Run this command inside the ownCloud Docker container. + The following command filters by the storage of the specified user. [source,bash,subs="attributes+"] @@ -288,6 +306,8 @@ The following command filters by the storage of the specified user. {occ-command-example-prefix} files:scan USERID --repair ---- +NOTE: Run this command inside the ownCloud Docker container. + TIP: If many users are affected, it could be convenient to create a shell script, which iterates over a list of User ID's. == The files:transfer-ownership command @@ -307,6 +327,8 @@ This command is useful before removing users. files:transfer-ownership [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -338,6 +360,8 @@ For example, to move all files from `` to `` tran ---- +NOTE: Run this command inside the ownCloud Docker container. + You can also move a limited set of files from `` to `` transfer folder by making use of the `--path` switch, as in the example below. Ownership of `folder/to/move` and all files and folders which it contains will be transferred to `` transfer folder. @@ -349,6 +373,8 @@ Ownership of `folder/to/move` and all files and folders which it contains will b ---- +NOTE: Run this command inside the ownCloud Docker container. + If the entire user folder of `` needs to be migrated to `` user folder, use the `--destination-use-user-folder` switch, as in the example below. The destination user needs to be created but never log in, we recommend using owncloud maintenance mode for this operation. @@ -360,6 +386,8 @@ The destination user needs to be created but never log in, we recommend using ow ---- +NOTE: Run this command inside the ownCloud Docker container. + Please keep the following in mind when using this command: . The directory provided to the `--path` switch *must* exist inside `data//files`. @@ -385,6 +413,8 @@ NOTE: By default, the command performs a dry run and displays the problems found files:troubleshoot-transfer-ownership [options] [--] [] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="30%,90%",] @@ -409,6 +439,8 @@ Run the command with one of the type arguments: ---- +NOTE: Run this command inside the ownCloud Docker container. + The command can attempt to fix the issues with the `--fix` flag, + or execute for a single user using `--uid ` @@ -418,3 +450,5 @@ or execute for a single user using `--uid ` --fix \ --uid=UID ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_files_external_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_files_external_commands.adoc index ed0f5d8cf..383c5c3ad 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_files_external_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_files_external_commands.adoc @@ -69,6 +69,8 @@ files_external:list [--show-password] [--full] [-a|--all] [-s|--short] [--] [ ---- +NOTE: Run this command inside the ownCloud Docker container. + == Arguments [width="100%",cols="20%,70%",] @@ -24,3 +26,5 @@ This example executes the migration step for the core app: {occ-command-example-prefix} migrations:execute core 20181220085457 ---- +NOTE: Run this command inside the ownCloud Docker container. + diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_notifications_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_notifications_commands.adoc index d4b1a2bc6..52111eee6 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_notifications_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_notifications_commands.adoc @@ -15,6 +15,8 @@ notifications {occ-command-example-prefix} notifications:generate [-u|--user USER] [-g|--group GROUP] [-l|--link ] [--] [] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments: [width="100%",cols="20%,70%",] @@ -45,3 +47,5 @@ Example: {occ-command-example-prefix} notifications:generate -g Office "Emergency Alert" "Rebooting in 5min" ---- +NOTE: Run this command inside the ownCloud Docker container. + diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_previews_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_previews_commands.adoc index 4507627fb..15c839915 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_previews_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_previews_commands.adoc @@ -17,6 +17,8 @@ Removing not referenced previews can be necessary, e.g., when the image has been {occ-command-example-prefix} previews:cleanup [options] [--] [] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="25%,70%",] @@ -55,6 +57,8 @@ In the example below, you run one loop with max (default) 1000 files processed. {occ-command-example-prefix} previews:cleanup ---- +NOTE: Run this command inside the ownCloud Docker container. + Other combinations could be: * `previews:cleanup -- 50`: run once and process 50 files diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_security_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_security_commands.adoc index 7acf4338f..8235477e7 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_security_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_security_commands.adoc @@ -26,6 +26,8 @@ Example 1: {occ-command-example-prefix} security:routes ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,plaintext] ---- +-----------------------------------------------------------+-----------------+ @@ -46,6 +48,8 @@ Example 2: {occ-command-example-prefix} security:routes --output=json-pretty ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,plaintext] ---- [ @@ -64,6 +68,8 @@ Example 3: {occ-command-example-prefix} security:routes --with-details ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,plaintext] ---- +---------------------------------------------+---------+-------------------------------------------------------+--------------------------------+ @@ -92,6 +98,8 @@ This example lists your installed certificates: {occ-command-example-prefix} security:certificates ---- +NOTE: Run this command inside the ownCloud Docker container. + Import a new certificate: [source,bash,subs="attributes+"] @@ -99,9 +107,13 @@ Import a new certificate: {occ-command-example-prefix} security:certificates:import /path/to/certificate ---- +NOTE: Run this command inside the ownCloud Docker container. + Remove a certificate: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} security:certificates:remove [certificate name] ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_sharing_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_sharing_commands.adoc index f41027ea3..442e1fec6 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_sharing_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_sharing_commands.adoc @@ -20,6 +20,8 @@ So, to cleanup all orphaned remote storages, run it as follows: {occ-command-example-prefix} sharing:cleanup-remote-storages ---- +NOTE: Run this command inside the ownCloud Docker container. + You can also set it up to run as xref:background-jobs-selector[a background job]. NOTE: These commands are not available in xref:maintenance-commands[single-user (maintenance) mode]. @@ -33,9 +35,13 @@ Currently, if a federated share is invalid or the API endpoint returns a "not fo {occ-command-example-prefix} config:app:set files_sharing enable_cleanup_invalid_external_shares --value no ---- +NOTE: Run this command inside the ownCloud Docker container. + To revert that setting to its default behavior, run: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} config:app:delete files_sharing enable_cleanup_invalid_external_shares ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_system_command.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_system_command.adoc index 3e5a5a742..9938a2c2b 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_system_command.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_system_command.adoc @@ -13,6 +13,8 @@ system:cron [options] ---- +NOTE: Run this command inside the ownCloud Docker container. + == Options [width="100%",cols="20%,70%",] @@ -29,6 +31,8 @@ To execute xref:configuration/server/background_jobs_configuration.adoc[backgrou {occ-command-example-prefix} system:cron ---- +NOTE: Run this command inside the ownCloud Docker container. + If the `--progress` or `-p` argument is specified, then progress output will be displayed in the console, as in the example below. [source,console] @@ -60,6 +64,9 @@ Use the following one instead ---- {occ-command-example-prefix} system:cron ---- + +NOTE: Run this command inside the ownCloud Docker container. + ==== [NOTE] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_trashbin_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_trashbin_commands.adoc index 12cc42506..b66993974 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_trashbin_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_trashbin_commands.adoc @@ -25,6 +25,8 @@ Remove deleted files for users on backend Database edward ---- +NOTE: Run this command inside the ownCloud Docker container. + This example removes the deleted files of users `molly` and `freda`: [source,bash,subs="attributes+"] @@ -34,5 +36,7 @@ Remove deleted files of molly Remove deleted files of freda ---- +NOTE: Run this command inside the ownCloud Docker container. + `trashbin:expire` deletes only expired files according to the `trashbin_retention_obligation` setting in `config.php` (see xref:configuration/server/config_sample_php_parameters.adoc[the "Deleted Files" section documentation]). The default is to delete expired files for all users, or you may list users in a space-delimited list. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_user_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_user_commands.adoc index cbe274e6e..f45a75aea 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_user_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_user_commands.adoc @@ -42,6 +42,8 @@ You can create a new user with the `user:add` command. ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="30%,70%",] @@ -91,6 +93,8 @@ If either group does not exist, it is created. User "layla" added to group "db-admins" ---- +NOTE: Run this command inside the ownCloud Docker container. + .Create a user with a temporary password (the user will receive a link to set their password). [source,bash,subs="attributes+"] ---- @@ -107,6 +111,8 @@ User layla added to group users User layla added to group db-admins ---- +NOTE: Run this command inside the ownCloud Docker container. + == Deleting A User To delete a user, you use the `user:delete` command. @@ -116,6 +122,8 @@ To delete a user, you use the `user:delete` command. {occ-command-example-prefix} user:delete [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -138,6 +146,8 @@ To delete a user, you use the `user:delete` command. {occ-command-example-prefix} user:delete fred ---- +NOTE: Run this command inside the ownCloud Docker container. + == Disable Users Admins can disable users via the occ command too: @@ -147,6 +157,8 @@ Admins can disable users via the occ command too: {occ-command-example-prefix} user:disable ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -164,6 +176,8 @@ NOTE: Once users are disabled, their connected browsers will be disconnected. Us {occ-command-example-prefix} user:enable ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -183,6 +197,8 @@ This command is complementary when using `user:move-home`. {occ-command-example-prefix} user:home:list-dirs [options] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Options [width="100%",cols="20%,70%"] @@ -199,6 +215,8 @@ This command is complementary when using `user:move-home`. - /var/www/owncloud/data ---- +NOTE: Run this command inside the ownCloud Docker container. + == List all Users For a Given Home Directory List all users that have their home in a given path. For details see xref:configuration/user/user_management.adoc#moving-the-user-home[Moving the User Home] documentation. @@ -210,6 +228,8 @@ This command is complementary when using `user:move-home`. {occ-command-example-prefix} user:home:list-users [options] [--] [] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%"] @@ -243,6 +263,8 @@ Note for the example below, some user accounts originated from LDAP. - dbcca7b4-7306-103b-813a-19652cf0a9d2 ---- +NOTE: Run this command inside the ownCloud Docker container. + Run the following command to list all users from all available home directories. The example shows, that user `lisa` has been moved to a different home directory with `user:move-home`. [source,bash,subs="attributes+"] @@ -255,6 +277,8 @@ Run the following command to list all users from all available home directories. - user01 ---- +NOTE: Run this command inside the ownCloud Docker container. + == Finding Inactive Users To view a list of users who've not logged in for a given number of days, use the `user:inactive` command. @@ -264,6 +288,8 @@ To view a list of users who've not logged in for a given number of days, use the {occ-command-example-prefix} user:inactive [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -287,6 +313,8 @@ The example below searches for users inactive for five days or more: {occ-command-example-prefix} user:inactive 5 ---- +NOTE: Run this command inside the ownCloud Docker container. + By default, this will generate output in the following format: [source,plaintext] @@ -326,6 +354,8 @@ To view a user's most recent login, use the `user:lastseen` command: {occ-command-example-prefix} user:lastseen ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -342,6 +372,8 @@ Example layla's last login: 09.01.2015 18:46 ---- +NOTE: Run this command inside the ownCloud Docker container. + == Listing Users You can list existing users with the `user:list` command. @@ -351,6 +383,8 @@ You can list existing users with the `user:list` command. {occ-command-example-prefix} user:list [options] [] ---- +NOTE: Run this command inside the ownCloud Docker container. + User IDs containing the `search-pattern` string are listed. Matching is not case-sensitive. If you do not provide a search-pattern then all users are listed. @@ -383,6 +417,8 @@ This example lists user IDs containing the string `ron` - aaron: Aaron Smith ---- +NOTE: Run this command inside the ownCloud Docker container. + The output can be formatted in JSON with the output option `json` or `json_pretty`. [source,bash,subs="attributes+"] @@ -395,6 +431,8 @@ The output can be formatted in JSON with the output option `json` or `json_prett } ---- +NOTE: Run this command inside the ownCloud Docker container. + This example lists all users including the attribute `enabled`. [source,bash,subs="attributes+"] @@ -404,6 +442,8 @@ This example lists all users including the attribute `enabled`. - foo: true ---- +NOTE: Run this command inside the ownCloud Docker container. + == Listing Group Membership of a User You can list the group membership of a user with the `user:list-groups` command. @@ -413,6 +453,8 @@ You can list the group membership of a user with the `user:list-groups` command. {occ-command-example-prefix} user:list-groups [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -440,6 +482,8 @@ This example lists group membership of user `julie`: - Finance ---- +NOTE: Run this command inside the ownCloud Docker container. + The output can be formatted in JSON with the output option `json` or `json_pretty`: [source,bash,subs="attributes+"] @@ -451,6 +495,8 @@ The output can be formatted in JSON with the output option `json` or `json_prett ] ---- +NOTE: Run this command inside the ownCloud Docker container. + == Modify User Details This command modifies either the users username or email address. @@ -460,6 +506,8 @@ This command modifies either the users username or email address. {occ-command-example-prefix} user:modify [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -481,6 +529,8 @@ All three arguments are mandatory and can not be empty. Example to set the email {occ-command-example-prefix} user:modify carla email foobar@foo.com ---- +NOTE: Run this command inside the ownCloud Docker container. + The email address of `carla` is updated to `foobar@foo.com`. == Move a Users Home Folder @@ -492,6 +542,8 @@ This command moves a user's home folder to a new location. For details see xref: {occ-command-example-prefix} user:move-home ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -518,6 +570,8 @@ Example: {occ-command-example-prefix} user:move-home lisa /mnt/newhome_1 ---- +NOTE: Run this command inside the ownCloud Docker container. + This command moves the home directory of user `lisa` to the new location `/mnt/newhome_1` == Generating a User Count Report @@ -530,6 +584,8 @@ and guest users which are created by the guests app. {occ-command-example-prefix} user:report ---- +NOTE: Run this command inside the ownCloud Docker container. + There are no arguments and no options beside the default once to parametrize the output. [source,bash,subs="attributes+"] @@ -549,6 +605,8 @@ There are no arguments and no options beside the default once to parametrize the +--------------------------+-----+ ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: A user directory is created, when a local user has logged on the first time after creation. Therefore the difference between `OC\User\Database` and `user directories` equals all users which have been created locally, but have not logged on at least once. == Setting a User's Password @@ -560,6 +618,8 @@ Resets the password of the named user. {occ-command-example-prefix} user:resetpassword [options] [--] ---- +NOTE: Run this command inside the ownCloud Docker container. + include::partial$configuration/user/update-password-note.adoc[] === Arguments @@ -615,6 +675,8 @@ You can reset any user's password, including administrators (see xref:configurat Successfully reset password for layla ---- +NOTE: Run this command inside the ownCloud Docker container. + You may also use `password-from-env` to reset passwords: [source,plaintext] @@ -638,6 +700,8 @@ Additionally, when the command completes, it outputs the password reset link to The password reset link is: http://localhost:{std-port-http}/index.php/lostpassword/reset/form/rQAlCjNeQf3aphA6Hraq2/layla ---- +NOTE: Run this command inside the ownCloud Docker container. + If the specified user does not have a valid email address set, then the following error will be output to the console, and the email will not be sent: [source,plaintext] @@ -659,6 +723,8 @@ To manage application settings for a user, use the `user:setting` command. This {occ-command-example-prefix} user:setting [options] [--] [[ []] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,40%",] @@ -725,6 +791,8 @@ To retrieve settings for a user, you need to call the `user:setting` command and {occ-command-example-prefix} user:setting [] [] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Arguments [width="100%",cols="20%,70%",] @@ -753,6 +821,9 @@ To retrieve settings for a user, you need to call the `user:setting` command and - settings: - email: layla@example.tld ---- + +NOTE: Run this command inside the ownCloud Docker container. + + Here we see that the user has settings for the application `core`, when they last logged in, and what their email address is. @@ -764,6 +835,9 @@ Here we see that the user has settings for the application `core`, when they las - core: - lang: en ---- + +NOTE: Run this command inside the ownCloud Docker container. + + In the output, you can see that one setting is in effect, `lang`, which is set to `en`. @@ -773,6 +847,9 @@ In the output, you can see that one setting is in effect, `lang`, which is set t ---- {occ-command-example-prefix} user:setting layla core lang ---- + +NOTE: Run this command inside the ownCloud Docker container. + + This will display the value for that setting, such as `en`. @@ -783,6 +860,8 @@ This will display the value for that setting, such as `en`. {occ-command-example-prefix} user:setting [options] [--] [] [] ---- +NOTE: Run this command inside the ownCloud Docker container. + IMPORTANT: In case you want to change the email address, use xref:modify-user-details[the `user:modify` command]. Here's an example of how you would set the language of the user `layla`. @@ -792,6 +871,8 @@ Here's an example of how you would set the language of the user `layla`. {occ-command-example-prefix} user:setting layla core lang --value=en ---- +NOTE: Run this command inside the ownCloud Docker container. + Deleting a setting is quite similar to setting a setting. In this case, you supply the username, application (or setting category) and key as above. Then, in addition, you supply the `--delete` flag. @@ -801,6 +882,8 @@ Then, in addition, you supply the `--delete` flag. {occ-command-example-prefix} user:setting layla core lang --delete ---- +NOTE: Run this command inside the ownCloud Docker container. + == Syncing User Accounts This command syncs users stored in external backend services, such as _LDAP_, _Shibboleth_, and _Samba_, with ownCloud's, internal user database. @@ -886,6 +969,8 @@ and _Shibboleth_ backend. {occ-command-example-prefix} user:sync "OCA\User_LDAP\User_Proxy" ---- +NOTE: Run this command inside the ownCloud Docker container. + === Samba [source,bash,subs="attributes+"] @@ -893,6 +978,8 @@ and _Shibboleth_ backend. {occ-command-example-prefix} user:sync "OCA\User\SMB" -vvv ---- +NOTE: Run this command inside the ownCloud Docker container. + Below are examples of how to use the command with the *LDAP* backend along with example console output. === Example 1 @@ -911,6 +998,8 @@ Below are examples of how to use the command with the *LDAP* backend along with 4 [============================] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Example 2 [source,bash,subs="attributes+"] @@ -931,6 +1020,8 @@ Below are examples of how to use the command with the *LDAP* backend along with 1 [============================] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Example 3 [source,bash,subs="attributes+"] @@ -952,6 +1043,8 @@ Below are examples of how to use the command with the *LDAP* backend along with 1 [============================] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Example 4 [source,bash,subs="attributes+"] @@ -971,6 +1064,8 @@ Below are examples of how to use the command with the *LDAP* backend along with 4 [============================] ---- +NOTE: Run this command inside the ownCloud Docker container. + === Example 5 [source,bash,subs="attributes+"] @@ -979,6 +1074,8 @@ Below are examples of how to use the command with the *LDAP* backend along with ---- +NOTE: Run this command inside the ownCloud Docker container. + === Example 6 [source,bash,subs="attributes+"] @@ -990,6 +1087,8 @@ If unknown users are found, what do you want to do with their accounts? (removin [2] ask later ---- +NOTE: Run this command inside the ownCloud Docker container. + === Syncing via cron job Here is an example for syncing with LDAP four times a day on Ubuntu: diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_versions_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_versions_commands.adoc index 5857d89a0..51d1ed1b8 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_versions_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_versions_commands.adoc @@ -12,6 +12,8 @@ These commands are not available in xref:maintenance-commands[single-user (maint {occ-command-example-prefix} versions:cleanup []... ---- +NOTE: Run this command inside the ownCloud Docker container. + Options [width="100%",cols="22%,70%",] @@ -33,6 +35,8 @@ Delete versions for users on backend Database edward ---- +NOTE: Run this command inside the ownCloud Docker container. + You can delete versions for specific users in a space-delimited list: [source,bash,subs="attributes+"] @@ -42,6 +46,8 @@ Delete versions of freda Delete versions of molly ---- +NOTE: Run this command inside the ownCloud Docker container. + == versions:expire `versions:expire` deletes only expired files according to the `versions_retention_obligation` setting in `config.php` (see the File versions section in config_sample_php_parameters). @@ -52,6 +58,8 @@ The default is to delete expired files for all users, or you may list users in a {occ-command-example-prefix} versions:expire []... ---- +NOTE: Run this command inside the ownCloud Docker container. + Options [width="100%",cols="22%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/security/hsmdaemon/index.adoc b/modules/admin_manual/pages/configuration/server/security/hsmdaemon/index.adoc index 62313235a..c6c5d7c2d 100644 --- a/modules/admin_manual/pages/configuration/server/security/hsmdaemon/index.adoc +++ b/modules/admin_manual/pages/configuration/server/security/hsmdaemon/index.adoc @@ -405,6 +405,8 @@ ep6Y1aAVAYpAesZ1+sQzzUepjO82o34kjmm63Drmz+6KED4oIBARQkXeW/OoxgUg6kQhQK1thA/3Ww33 decrypted string (base64 encoded): 'SGVsbG8sIHdvcmxkIQo=' ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,bash] ---- sudo tail -5 /var/log/hsm.log @@ -500,6 +502,8 @@ Set the generated secret for ownCloud: {occ-command-example-prefix} config:app:set encryption hsm.jwt.secret --value '7a7d1826-b514-4d9f-afc7-a7485084e8de' ---- +NOTE: Run this command inside the ownCloud Docker container. + If the command succeeds, you should see the following console output: [source,plaintext] @@ -518,6 +522,8 @@ Enable the HSM mode and enable encryption by running the commands in the followi {occ-command-example-prefix} encryption:enable ---- +NOTE: Run this command inside the ownCloud Docker container. + If the commands are successful, you should see the following console output: [source,plaintext] diff --git a/modules/admin_manual/pages/configuration/server/ui-configuration.adoc b/modules/admin_manual/pages/configuration/server/ui-configuration.adoc index 35747c805..1c5965b4d 100644 --- a/modules/admin_manual/pages/configuration/server/ui-configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/ui-configuration.adoc @@ -22,6 +22,8 @@ This progress bar can be hidden with the following command: {occ-command-example-prefix} config:app:set files hide_upload_estimation --value="yes" ---- +NOTE: Run this command inside the ownCloud Docker container. + To show the progress bar again, type one of the following commands: [source,bash,subs="attributes+"] @@ -29,6 +31,8 @@ To show the progress bar again, type one of the following commands: {occ-command-example-prefix} config:app:set files hide_upload_estimation --value="no" ---- +NOTE: Run this command inside the ownCloud Docker container. + or [source,bash,subs="attributes+"] @@ -36,5 +40,7 @@ or {occ-command-example-prefix} config:app:delete files hide_upload_estimation ---- +NOTE: Run this command inside the ownCloud Docker container. + The current value can be queried with the `config:app:get` or the `config:list` command. For details see the xref:configuration/server/occ_command.adoc#config-commands[occ Config Commands] diff --git a/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc b/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc index 1b8622a1f..9ba9dd219 100644 --- a/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc +++ b/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc @@ -69,12 +69,16 @@ image::configuration/server/virus-scanner-support/antivirus-app.png[Anti-Virus A {occ-command-example-prefix} market:install files_antivirus ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ and enable it with the following occ command: + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} app:enable files_antivirus ---- ++ +NOTE: Run this command inside the ownCloud Docker container. == Ways of Configuration @@ -92,6 +96,8 @@ All of the configuration settings for the Anti-Virus app are configurable by pas av_socket --value="/var/run/clamav/clamd.ctl" ---- +NOTE: Run this command inside the ownCloud Docker container. + To get a current option, run for example: [source,bash,subs="attributes+"] @@ -100,6 +106,8 @@ To get a current option, run for example: av_socket ---- +NOTE: Run this command inside the ownCloud Docker container. + [caption=] .Available configuration settings, availability is _av_mode_ dependent [cols="23%,45%,15%",options="header"] @@ -301,6 +309,8 @@ In both daemon modes, background scans are enabled by default. If you want to di ---- {occ-command-example-prefix} config:app:set files_antivirus av_scan_background --value 'false' ---- + +NOTE: Run this command inside the ownCloud Docker container. ==== [[daemon-socket-same-server]] @@ -418,6 +428,8 @@ Use the following occ commands to set configurations based on your environment: {occ-command-example-prefix} config:app:set files_antivirus \ av_host --value="172.17.0.3" ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . Specify the port of the anti-virus server: + @@ -426,6 +438,8 @@ Use the following occ commands to set configurations based on your environment: {occ-command-example-prefix} config:app:set files_antivirus \ av_port --value="1344" ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . Enable background scans: + @@ -434,6 +448,8 @@ Use the following occ commands to set configurations based on your environment: {occ-command-example-prefix} config:app:set files_antivirus \ av_scan_background --value="true" ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . Specify what to do with the offending file: + @@ -443,6 +459,8 @@ Use the following occ commands to set configurations based on your environment: av_infected_action --value="delete" ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ Possible values are `delete` and `only_log`. + Note that this setting is only used when `av_scan_background` is set to `true`. @@ -458,6 +476,8 @@ The following settings are just examples and must be adjusted for the scanner yo {occ-command-example-prefix} config:app:set files_antivirus \ av_mode --value="icap" ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . Set the request service: + @@ -466,6 +486,8 @@ The following settings are just examples and must be adjusted for the scanner yo {occ-command-example-prefix} config:app:set files_antivirus \ av_request_service --value="avscan" ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . Set the response header: + @@ -474,6 +496,8 @@ The following settings are just examples and must be adjusted for the scanner yo {occ-command-example-prefix} config:app:set files_antivirus \ av_response_header --value="X-Infection-Found" ---- ++ +NOTE: Run this command inside the ownCloud Docker container. === ClamAV & Kaspersky (ICAP) diff --git a/modules/admin_manual/pages/configuration/user/oidc/oidc.adoc b/modules/admin_manual/pages/configuration/user/oidc/oidc.adoc index e5f55cee9..6174416ab 100644 --- a/modules/admin_manual/pages/configuration/user/oidc/oidc.adoc +++ b/modules/admin_manual/pages/configuration/user/oidc/oidc.adoc @@ -92,6 +92,8 @@ If a malformed JSON string is found, an error is logged. The _key->value_ pairs --value='{"provider-url":"https:\/\/idp.example.net","client-id":"fc9b5c78-ec73-47bf-befc-59d4fe780f6f","client-secret":"e3e5b04a-3c3c-4f4d-b16c-2a6e9fdd3cd1","loginButtonName":"Login via OpenId Connect"}' ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: Only set either the database or the config.php keys but not both for the OpenID Connect app. == Set Up Service Discovery diff --git a/modules/admin_manual/pages/configuration/user/reset_admin_password.adoc b/modules/admin_manual/pages/configuration/user/reset_admin_password.adoc index 0578507d0..9b1b8e995 100644 --- a/modules/admin_manual/pages/configuration/user/reset_admin_password.adoc +++ b/modules/admin_manual/pages/configuration/user/reset_admin_password.adoc @@ -22,6 +22,8 @@ Confirm the new password: Successfully reset password for admin ---- +NOTE: Run this command inside the ownCloud Docker container. + If your ownCloud username is not `admin`, then substitute your ownCloud username. diff --git a/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc b/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc index a196d9b2e..5582dee81 100644 --- a/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc +++ b/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc @@ -316,6 +316,8 @@ Disallowing login with LDAP Email Address requires enabling strict login checkin ---- {occ-command-example-prefix} config:system:set --type boolean --value true strict_login_enforced ---- + +NOTE: Run this command inside the ownCloud Docker container. ==== Other Attributes:: @@ -620,6 +622,8 @@ Since ownCloud 8.0.10 and up the home folder rule is enforced. This means that o {occ-command-example-prefix} config:app:set user_ldap enforce_home_folder_naming_rule --value=1 ---- +NOTE: Run this command inside the ownCloud Docker container. + Starting with ownCloud 10.0, the home folder naming rule is only applied when first provisioning the user. This prevents data loss due to re-provisioning the users home folder in case of unintentional changes in LDAP. -- @@ -731,6 +735,8 @@ To enable this functionality, the `reuse_accounts` config setting must be set to {occ-command-example-prefix} config:app:set user_ldap reuse_accounts --value=yes .... +NOTE: Run this command inside the ownCloud Docker container. + === ownCloud Avatar Integration ownCloud supports user profile pictures, which are also called avatars. If a user has a photo stored in the `jpegPhoto` or `thumbnailPhoto` attribute on your LDAP server, it will be used as their avatar. In this case the user cannot alter their avatar (on their Personal page) as it must be changed in LDAP. `jpegPhoto` is preferred over `thumbnailPhoto`. diff --git a/modules/admin_manual/pages/configuration/user/user_management.adoc b/modules/admin_manual/pages/configuration/user/user_management.adoc index 006bddb66..fb12f4a03 100644 --- a/modules/admin_manual/pages/configuration/user/user_management.adoc +++ b/modules/admin_manual/pages/configuration/user/user_management.adoc @@ -188,6 +188,8 @@ For details of the occ user commands used below, see the xref:configuration/serv - lisa: /var/www/owncloud/data/lisa ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ Here you can see, that the home of user `lisa` is located in `/var/www/owncloud/data/lisa` . Prepare new mounts *in advance* for one or more users: @@ -207,6 +209,8 @@ Use the OS methods to create one or more new mount points for users home directo {occ-command-example-prefix} user:move-home lisa /mnt/newhome_1 ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ The user gets disconnected and the user's home is now moved which may take a while depending on the load of the server and the bandwidth available on the mount points. When the move operation has finished, + -- @@ -227,6 +231,8 @@ NOTE: If you are using LDAP and the xref:enterprise/external_storage/ldap_home_c - lisa: /mnt/newhome_1/lisa ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ Here you can see that the home of user `lisa` is now located in `/mnt/newhome_1/lisa`. . To list the available user home root directories, use the following command: @@ -239,6 +245,8 @@ The following command lists all available user homes. Note a home only gets list - /var/www/owncloud/data - /mnt/newhome_1/lisa ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . To list all users from a users home root directory, use the following command: + @@ -250,3 +258,5 @@ The following command lists all users from a given home. - admin - user01 ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc b/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc index af192ba3c..266640e01 100644 --- a/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc +++ b/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc @@ -215,6 +215,8 @@ This option can also be used if you have only one web site but want to keep the {occ-command-example-prefix} app:enable kerberos ---- +NOTE: Run this command inside the ownCloud Docker container. + === Domain Controller Side ==== Service Principal Name (SPN) diff --git a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc index 7a61be2d2..48c029f59 100644 --- a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc +++ b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc @@ -330,6 +330,8 @@ The simplest way, useful for initial testing is, to start the `wnd:listen` proce {occ-command-example-prefix} wnd:listen ---- +NOTE: Run this command inside the ownCloud Docker container. + The password is an optional parameter and you will be asked for it if you didn't provide it as in the example above. If necessary, the workgroup can be set together with the username as well. Use following syntax and set quotes, which is important to keep the backslash `'\'`. The whole example command looks like: [source,bash,subs="attributes+"] @@ -337,6 +339,8 @@ The password is an optional parameter and you will be asked for it if you didn't {occ-command-example-prefix} wnd:listen '\' ---- +NOTE: Run this command inside the ownCloud Docker container. + In order to start `wnd:listen` without any user interaction like as service, provide the password from a password file. [source,bash,subs="attributes+"] @@ -346,6 +350,8 @@ In order to start `wnd:listen` without any user interaction like as service, pro --password-trim ---- +NOTE: Run this command inside the ownCloud Docker container. + For additional options to provide the password, check xref:password-options[Password Options]. Note that the password must be in plain text inside the file. Neither spaces nor newline characters will be removed from the contents of the file by default, unless the `--password-trim` option is added. The password file must be readable by the apache user (or www-data). Also make sure that the password file is outside of any directory handled by apache (web-readable) for security reasons. You may use the same location when using flock in xref:execution-serialization[Execution Serialization] below. @@ -363,6 +369,8 @@ As a simple example, you can check the following: {occ-command-example-prefix} wnd:process-queue ---- +NOTE: Run this command inside the ownCloud Docker container. + You can run that command, even if there are no notifications to be processed. Depending on your requirements, you can wrap that command in a Cron job so it's run every 5 minutes for example. @@ -478,6 +486,8 @@ If you need to serialize the execution of the `wnd:process-queue`, check the fol flock -n /opt/my-lock-file {occ-command-example-prefix} wnd:process-queue ---- +NOTE: Run this command inside the ownCloud Docker container. + In that case, flock will try to get the lock of that file and won't run the command if it isn't possible. For our case, and considering that file isn't being used by any other process, it will run only one `wnd:process-queue` at a time. If someone tries to run the same command a second time while the previous one is running, the second will fail and won't be executed. The lock file `/opt/my-lock-file` itself will be created as an empty file by the `flock` command if it does not yet exist, but after it has been created the lock file doesn't change. Only an flock will be applied and removed. The file won't be removed after the script completes. @@ -489,6 +499,8 @@ You can use flock also in cron, see the example below: * * * * * flock -n /opt/my-lock-file -c 'sudo -u www-data /var/www/owncloud/occ wnd:process-queue ' ---- +NOTE: Run this command inside the ownCloud Docker container. + Check {flock-docs-url}[flock's documentation] for details and more options. === Activity Extension @@ -610,6 +622,8 @@ Take the example of attempting to connect to the host MyHost, the share named `M {occ-command-example-prefix} wnd:listen MyHost MyData user password ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: The command is case-sensitive, and that it must match the information from the mount point configuration. === Kerberos Testing @@ -719,12 +733,18 @@ There are several ways to supply a password: ---- {occ-command-example-prefix} wnd:listen ---- ++ +NOTE: Run this command inside the ownCloud Docker container. + . Sent as a parameter to the command. + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} wnd:listen ---- ++ +NOTE: Run this command inside the ownCloud Docker container. + . Read from a file, using the `--password-file` switch to specify the file to read from. Note, that the password must be in plain text inside the file, and neither spaces nor newline characters will be removed from the file by default, unless the `--password-trim` option is added. The password file must be readable by the apache user (or www-data) + [source,bash,subs="attributes+"] @@ -733,6 +753,8 @@ There are several ways to supply a password: --password-file=/my/secret/password/file ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} wnd:listen \ @@ -740,6 +762,8 @@ There are several ways to supply a password: --password-trim ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ NOTE: If you use the `--password-file` switch, the entire contents of the file will be used for the password, so please be careful with newlines. + IMPORTANT: If using `--password-file` make sure that the file is only readable by the apache / www-data user and inaccessible from the web. This prevents tampering or leaking of the information. The password won't be leaked to any other user using `ps`. @@ -752,6 +776,8 @@ IMPORTANT: If using `--password-file` make sure that the file is only readable b --password-from-service-account ---- + +NOTE: Run this command inside the ownCloud Docker container. ++ IMPORTANT: You need to ensure that the triple of ``, `` and `` (including any kind of workgroup if used) matches the configuration made for the WND collaborative share. The command will fail otherwise. === Reduce WND Notifier Memory Usage @@ -778,6 +804,8 @@ This provides a bit more security because the `/tmp/plainpass` password as shown cat /tmp/plainpass | {occ-command-example-prefix} wnd:listen --password-file=- ---- +NOTE: Run this command inside the ownCloud Docker container. + ==== base64 Similar to plainpass, the content in this case gets encoded in the {base64-url}[Base64 format]. There's not much security, but it has additional obfuscation. @@ -788,6 +816,8 @@ base64 -d /tmp/encodedpass | \ {occ-command-example-prefix} wnd:listen --password-file=- ---- +NOTE: Run this command inside the ownCloud Docker container. + ==== pass Example using "pass" @@ -799,6 +829,8 @@ Example using "pass" pass the-password-name | {occ-command-example-prefix} wnd:listen --password-file=- ---- +NOTE: Run this command inside the ownCloud Docker container. + ==== HashiCorp Vault This example uses {vaultproject-url}[Vault] as the secrets store. See {hashicorp-url}[HCP Vault] on how to setup the secrets store. Then use something like the following: @@ -808,6 +840,8 @@ This example uses {vaultproject-url}[Vault] as the secrets store. See {hashicorp vault kv get -field=password secret/samba | {occ-command-example-prefix} wnd:listen --password-file=- ---- +NOTE: Run this command inside the ownCloud Docker container. + Use Vault's ACLs to limit access to the token. Destroy the token after starting the service during boot with systemd. === Password Option Precedence @@ -817,6 +851,9 @@ If both the argument and the option are passed, e.g., ---- {occ-command-example-prefix} wnd:listen --password-file=/opt/pass` ---- + +NOTE: Run this command inside the ownCloud Docker container. + then the `--password-file` option will take precedence. === Optimizing wnd:process-queue @@ -911,6 +948,8 @@ Setups with several servers might have some difficulties in some scenarios: --serializer-param file=/opt/oc/store2 ---- +NOTE: Run this command inside the ownCloud Docker container. + To set it up, make sure the listener is running as a system service: [source,bash,subs="attributes+"] @@ -918,6 +957,8 @@ To set it up, make sure the listener is running as a system service: {occ-command-example-prefix} wnd:listen host share username password ---- +NOTE: Run this command inside the ownCloud Docker container. + Setup a Cron job or similar with something like the following two commands: [source,bash,subs="attributes+"] @@ -929,6 +970,8 @@ Setup a Cron job or similar with something like the following two commands: sudo rm -f /opt/oc/store1 # With a different schedule ---- +NOTE: Run this command inside the ownCloud Docker container. + The first run will create the `/opt/oc/store1` with the serialized storages, the rest of the executions will use that file. The second Cron job, the one removing the file, will force the `wnd:process-queue` to refresh the data. diff --git a/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc b/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc index 33463265d..91feebd93 100644 --- a/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc +++ b/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc @@ -26,11 +26,15 @@ Command line:: {occ-command-example-prefix} market:install windows_network_drive ---- +NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} app:enable windows_network_drive ---- +NOTE: Run this command inside the ownCloud Docker container. + == Configuration **WebUI** @@ -181,6 +185,8 @@ Running the following command would work: {occ-command-example-prefix} wnd:listen MyHost MyData svc_owncloud password ---- +NOTE: Run this command inside the ownCloud Docker container. + The command is case-sensitive, and it must match the information from the mount point configuration. * When the output of the `occ process-queue ..` command shows `0 Storages found`, then this means, diff --git a/modules/admin_manual/pages/enterprise/file_management/files_lifecycle.adoc b/modules/admin_manual/pages/enterprise/file_management/files_lifecycle.adoc index aad06616c..08a3d2eea 100644 --- a/modules/admin_manual/pages/enterprise/file_management/files_lifecycle.adoc +++ b/modules/admin_manual/pages/enterprise/file_management/files_lifecycle.adoc @@ -56,6 +56,8 @@ Example to set missing upload time values to November, 1st 2019: {occ-command-example-prefix} lifecycle:set-upload-time 2019-11-01 ---- +NOTE: Run this command inside the ownCloud Docker container. + TIP: The extension only considers files. Folder structures are kept available. === Policy Configuration @@ -77,12 +79,16 @@ Example to set the time passed since upload (or restore) for archiving files to {occ-command-example-prefix} config:app:set files_lifecycle archive_period --value='90' ---- +NOTE: Run this command inside the ownCloud Docker container. + To query existing values, use this example command: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} config:app:get files_lifecycle archive_period ---- +NOTE: Run this command inside the ownCloud Docker container. + ==== Restoration Policies for Users ===== Soft Policy @@ -95,6 +101,8 @@ The _soft policy_ is used by default. To switch from the hard policy to the soft {occ-command-example-prefix} config:app:set files_lifecycle policy --value='soft' ---- +NOTE: Run this command inside the ownCloud Docker container. + ===== Hard Policy The _hard policy_ is designed to enforce strict controls on user data, forcing archiving after the defined time and requiring escalated permissions in order to restore. If the archived data is still needed, users need to get in contact with a privileged manager and request the restoration. @@ -108,6 +116,8 @@ To put the _hard policy_ in place, use this _occ_ command: {occ-command-example-prefix} config:app:set files_lifecycle policy --value='hard' ---- +NOTE: Run this command inside the ownCloud Docker container. + === Archive and Expiration Background Jobs To put File Lifecycle Management into actual operation, there are two _occ_ commands for archiving files and for permanently deleting them from the archive. Scanning the database for files that are due for archiving or expiration, given the chosen policies, can take some time. For this reason, these jobs are delegated to specific _occ_ commands which should be executed using CRON on a daily schedule. @@ -120,6 +130,8 @@ To move files scheduled for archiving (days since upload/restore > `archive_time {occ-command-example-prefix} lifecycle:archive ---- +NOTE: Run this command inside the ownCloud Docker container. + TIP: There is a dry-run mode (append `-d`) that simulates the execution of this command to allow checking the configuration before putting the actual process in place. ==== Archive Expiration Background Job @@ -130,6 +142,8 @@ To permanently delete files from the archive that have met the policy rules (day {occ-command-example-prefix} lifecycle:expire ---- +NOTE: Run this command inside the ownCloud Docker container. + TIP: There is a dry-run mode (append `-d`) that simulates the execution of this command to allow checking the configuration before putting the actual process in place. === Restoring Files @@ -148,6 +162,8 @@ When a user `alice` requests to restore all files, e.g., in the folder `/work/pr {occ-command-example-prefix} lifecycle:restore /alice/archive/files/work/projects/project1 ---- +NOTE: Run this command inside the ownCloud Docker container. + ==== Restoring All Files from All Archives File Lifecycle Management provides a way to restore all files from all archives back to their owners' file directories. To do this, system administrators can use the `restore-all` _occ_ command: @@ -156,6 +172,8 @@ File Lifecycle Management provides a way to restore all files from all archives {occ-command-example-prefix} lifecycle:restore-all ---- +NOTE: Run this command inside the ownCloud Docker container. + The command will restore all files from all users and report on the progress. TIP: There is a dry-run mode (append `-d`) that simulates the execution of this command to allow checking the configuration before putting the actual process in place. @@ -169,6 +187,8 @@ In some scenarios it can be desired to disable the whole user interface for this {occ-command-example-prefix} config:app:set files_lifecycle disable_ui --value='yes' ---- +NOTE: Run this command inside the ownCloud Docker container. + To enable the user interface components again, this config value needs to be removed: [source,bash,subs="attributes+"] @@ -176,6 +196,8 @@ To enable the user interface components again, this config value needs to be rem {occ-command-example-prefix} config:app:delete files_lifecycle disable_ui ---- +NOTE: Run this command inside the ownCloud Docker container. + == Audit Events During archiving, restoring and expiration, Audit events are emitted. Logging those to the `audit.log` requires the minimum version 2.0.0 of the {oc-marketplace-url}/apps/admin_audit[Auditing] app. diff --git a/modules/admin_manual/pages/enterprise/logging/admin_audit.adoc b/modules/admin_manual/pages/enterprise/logging/admin_audit.adoc index 683b2a3dd..0edcb33db 100644 --- a/modules/admin_manual/pages/enterprise/logging/admin_audit.adoc +++ b/modules/admin_manual/pages/enterprise/logging/admin_audit.adoc @@ -53,6 +53,8 @@ To ignore all CLI triggered events (default is to include them), set the followi {occ-command-example-prefix} config:app:set admin_audit ignore_cli_events --value='yes' ---- +NOTE: Run this command inside the ownCloud Docker container. + == Grouped Logging With each log message, a number of users are calculated to be the 'audit context'. This is the list of users which are related to the log message. Additionally, each log message includes a list of groups that the users are a member of, to enable filtering / splitting of the log messages at a later date. In cases when users are members of many groups, to reduce the data output, the group list can be filtered by adding the following to your `config.php`. Change the groups needed accordingly: diff --git a/modules/admin_manual/pages/enterprise/reporting/metrics.adoc b/modules/admin_manual/pages/enterprise/reporting/metrics.adoc index 1b4c07389..4297b39ab 100644 --- a/modules/admin_manual/pages/enterprise/reporting/metrics.adoc +++ b/modules/admin_manual/pages/enterprise/reporting/metrics.adoc @@ -92,6 +92,8 @@ See the following occ command on how to set it. Make up a passphrase, referred t {occ-command-example-prefix} config:system:set "metrics_shared_secret" --value "" ---- +NOTE: Run this command inside the ownCloud Docker container. + TIP: This token gets stored in config.php as `metrics_shared_secret`, which could also be done manually instead of using the occ command. @@ -104,6 +106,8 @@ The dashboard is enabled by default. You can disable it with the following comma {occ-command-example-prefix} config:app:set metrics disable_dashboard --value=yes ---- +NOTE: Run this command inside the ownCloud Docker container. + === Endpoints and Parameters ==== Metrics Endpoint diff --git a/modules/admin_manual/pages/enterprise/user_management/saml_2.0_sso.adoc b/modules/admin_manual/pages/enterprise/user_management/saml_2.0_sso.adoc index 949679448..984367dfd 100644 --- a/modules/admin_manual/pages/enterprise/user_management/saml_2.0_sso.adoc +++ b/modules/admin_manual/pages/enterprise/user_management/saml_2.0_sso.adoc @@ -152,6 +152,8 @@ Use `upn` as `uid` and set the app mode to 'SSO Only' by running: {occ-command-example-prefix} shibboleth:mapping -u upn ---- +NOTE: Run this command inside the ownCloud Docker container. + `displayName` and email are only relevant for `autoprovisioning` mode. Add Claims in ADFS and map them in the `attribute-map.xml` if needed. diff --git a/modules/admin_manual/pages/enterprise/user_management/user_auth_shibboleth.adoc b/modules/admin_manual/pages/enterprise/user_management/user_auth_shibboleth.adoc index 892234c1c..3a7d03932 100644 --- a/modules/admin_manual/pages/enterprise/user_management/user_auth_shibboleth.adoc +++ b/modules/admin_manual/pages/enterprise/user_management/user_auth_shibboleth.adoc @@ -54,6 +54,8 @@ You can also change the app mode and environment mappings by using the `occ` com {occ-command-example-prefix} shibboleth:mapping --uid login ---- +NOTE: Run this command inside the ownCloud Docker container. + In *Single sign-on only* mode the app checks if the environment variable for the Shibboleth session, by default *Shib-Session-Id*, is set. If that is the case it will take the value of the environment variable as the `uid`, by default `eppn`, and check if a user is known by that `uid`. In effect, this allows another user backend, e.g., the LDAP app, to provide the `displayname`, `email` and `avatar`. @@ -88,6 +90,8 @@ From 3.1.2 you can now specify a mapper that is used on inbound ownCloud user ID uid_mapper --value="OCA\User_Shibboleth\Mapper\ADFSMapper" ---- +NOTE: Run this command inside the ownCloud Docker container. + You may view the currently configured mapper using: [source,bash,subs="attributes+"] @@ -95,6 +99,8 @@ You may view the currently configured mapper using: {occ-command-example-prefix} shibboleth:mapping ---- +NOTE: Run this command inside the ownCloud Docker container. + The following mappers are provided with the app: [cols="2",options="header"] diff --git a/modules/admin_manual/pages/maintenance/backup_and_restore/backup.adoc b/modules/admin_manual/pages/maintenance/backup_and_restore/backup.adoc index 949b943ce..db85ff240 100644 --- a/modules/admin_manual/pages/maintenance/backup_and_restore/backup.adoc +++ b/modules/admin_manual/pages/maintenance/backup_and_restore/backup.adoc @@ -70,6 +70,8 @@ Before backing up the database, set your ownCloud instance into maintenance mode {occ-command-example-prefix} maintenance:mode --on ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: This guide uses a backup file name like `owncloud-dbbackup_.bak`. === MySQL/MariaDB @@ -138,6 +140,8 @@ Perform the following tasks to reactivate your ownCloud instance: {occ-command-example-prefix} maintenance:mode --off ---- +NOTE: Run this command inside the ownCloud Docker container. + .Enable browser access Start your web server, or alternatively enable the virtual host serving ownCloud: [source,bash] diff --git a/modules/admin_manual/pages/maintenance/backup_and_restore/restore.adoc b/modules/admin_manual/pages/maintenance/backup_and_restore/restore.adoc index cd946538d..35505c43c 100644 --- a/modules/admin_manual/pages/maintenance/backup_and_restore/restore.adoc +++ b/modules/admin_manual/pages/maintenance/backup_and_restore/restore.adoc @@ -67,6 +67,8 @@ Before restoring the database, set your ownCloud instance into maintenance mode: {occ-command-example-prefix} maintenance:mode --on ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: This guide assumes that your previous backup is called `owncloud-dbbackup.bak`, though the file may have a timestamp added in the filename. === MySQL/MariaDB @@ -189,6 +191,8 @@ Run the following command to tell desktop and mobile clients that a server backu {occ-command-example-prefix} maintenance:data-fingerprint ---- +NOTE: Run this command inside the ownCloud Docker container. + === Bring back ownCloud into normal operation mode [source,bash,subs="attributes+"] @@ -196,6 +200,8 @@ Run the following command to tell desktop and mobile clients that a server backu {occ-command-example-prefix} maintenance:mode --off ---- +NOTE: Run this command inside the ownCloud Docker container. + === Enable browser access Start your web server, or alternatively enable the virtual host serving ownCloud: diff --git a/modules/admin_manual/pages/maintenance/enable_maintenance.adoc b/modules/admin_manual/pages/maintenance/enable_maintenance.adoc index 892586f5b..21441eb20 100644 --- a/modules/admin_manual/pages/maintenance/enable_maintenance.adoc +++ b/modules/admin_manual/pages/maintenance/enable_maintenance.adoc @@ -15,6 +15,8 @@ To enable maintenance mode, run the following command: {occ-command-example-prefix} maintenance:mode --on ---- +NOTE: Run this command inside the ownCloud Docker container. + You may also put your server into this mode by editing config/config.php. [source,php] @@ -31,6 +33,8 @@ To disable maintenance mode, run the following command: {occ-command-example-prefix} maintenance:mode --off ---- +NOTE: Run this command inside the ownCloud Docker container. + You may also put your server into this mode by editing config/config.php. + [source,php] diff --git a/modules/admin_manual/pages/maintenance/encryption/migrating-from-user-key-to-master-key.adoc b/modules/admin_manual/pages/maintenance/encryption/migrating-from-user-key-to-master-key.adoc index 521d7bbdc..87dfd15c6 100644 --- a/modules/admin_manual/pages/maintenance/encryption/migrating-from-user-key-to-master-key.adoc +++ b/modules/admin_manual/pages/maintenance/encryption/migrating-from-user-key-to-master-key.adoc @@ -49,6 +49,8 @@ You can see an example of calling the commands listed below, configured to requi {occ-command-example-prefix} app:disable --no-interaction encryption ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: The decryption of the files by the ownCloud administrator requires the current passwords of all users! This only works when users have enabled password recovery and if an admin recovery password is available. === Remove the Encryption Records from the ownCloud Database @@ -91,6 +93,8 @@ The following example shows how to do this on the command line. {occ-command-example-prefix} encryption:encrypt-all --yes ---- +NOTE: Run this command inside the ownCloud Docker container. + == Verify the Encrypted Files With the files encrypted using Master Key-based encryption, you should now verify that everything worked properly. To do so, run a `SELECT` query in your database which returns all files from the `oc_appconfig` table where the `appid` column is set to `encryption`. You should see a number of records, as in the output of the example below. diff --git a/modules/admin_manual/pages/maintenance/export_import_instance_data.adoc b/modules/admin_manual/pages/maintenance/export_import_instance_data.adoc index eb600ff85..df0d1e4d9 100644 --- a/modules/admin_manual/pages/maintenance/export_import_instance_data.adoc +++ b/modules/admin_manual/pages/maintenance/export_import_instance_data.adoc @@ -46,6 +46,8 @@ This will create a folder `/tmp/export/user1` which contains all the files and m {occ-command-example-prefix} instance:export:user user1 /tmp/export ---- +NOTE: Run this command inside the ownCloud Docker container. + === Copy the Export to the Target Instance Copy the created export to the target instance, for example, using `scp`: @@ -65,6 +67,8 @@ to federated shares pointing to the source instance: {occ-command-example-prefix} instance:import:user /tmp/export/user1 ---- +NOTE: Run this command inside the ownCloud Docker container. + NOTE: A new user's last login timestamp on the target instance will be set to the current time. The import command sets up the user's file system and the system does not need to do any further "first login" processing when the user first logs in to the target instance. === Recreate all Shares to Point to the Target Instance @@ -77,6 +81,8 @@ they point to the target instance. To do so, run this command on the source inst {occ-command-example-prefix} instance:export:migrate:share user1 https://newinstance.com ---- +NOTE: Run this command inside the ownCloud Docker container. + === Delete the User on the Source Instance Finally delete `user1` on the source instance: @@ -91,6 +97,8 @@ on the target instance. See xref:known-limitations[Known Limitations] for furthe {occ-command-example-prefix} user:delete user1 ---- +NOTE: Run this command inside the ownCloud Docker container. + == What is Exported - Files (Local) diff --git a/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc b/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc index 91069ee2f..6a44c1314 100644 --- a/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc +++ b/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc @@ -53,6 +53,8 @@ To enable maintenance mode, run the following command. {occ-command-example-prefix} maintenance:mode --on ---- +NOTE: Run this command inside the ownCloud Docker container. + == Sync your Data Directory [source,bash] @@ -158,6 +160,8 @@ To fix the config.php settings: {occ-command-example-prefix} config:system:set --value /mnt/owncloud/data datadirectory ---- +NOTE: Run this command inside the ownCloud Docker container. + === Adjust config.php . Change the `datadirectory` key in your `config.php` to the new path. @@ -174,6 +178,8 @@ To disable maintenance mode of your instance run the following command: {occ-command-example-prefix} maintenance:mode --off ---- +NOTE: Run this command inside the ownCloud Docker container. + == Start the Web Server [source,bash] @@ -187,3 +193,5 @@ sudo service apache2 start ---- {occ-command-example-prefix} files:scan --all ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/maintenance/migrating.adoc b/modules/admin_manual/pages/maintenance/migrating.adoc index eedecc486..0bb108a29 100644 --- a/modules/admin_manual/pages/maintenance/migrating.adoc +++ b/modules/admin_manual/pages/maintenance/migrating.adoc @@ -152,6 +152,8 @@ cd /var/www/owncloud/ {occ-command-example-prefix} maintenance:mode --on ---- +NOTE: Run this command inside the ownCloud Docker container. + After that’s done, then wait a few minutes and stop your web server, in this case Apache: [source,bash] @@ -227,6 +229,8 @@ first verify that ownCloud is in maintenance mode. {occ-command-example-prefix} maintenance:mode ---- +NOTE: Run this command inside the ownCloud Docker container. + Next, start up the database and web server on the new machine. [source,bash] @@ -245,6 +249,8 @@ maintenance mode. {occ-command-example-prefix} maintenance:mode --off ---- +NOTE: Run this command inside the ownCloud Docker container. + And finally, log in as admin and confirm normal function of ownCloud. If you have a domain name, and you want an SSL certificate, we recommend https://certbot.eff.org/[certbot]. diff --git a/modules/admin_manual/pages/maintenance/upgrading/database_upgrade.adoc b/modules/admin_manual/pages/maintenance/upgrading/database_upgrade.adoc index e526f030e..212f6f45d 100644 --- a/modules/admin_manual/pages/maintenance/upgrading/database_upgrade.adoc +++ b/modules/admin_manual/pages/maintenance/upgrading/database_upgrade.adoc @@ -41,6 +41,8 @@ xref:maintenance/backup_and_restore/backup.adoc[Backing up ownCloud] guide. ---- {occ-command-example-prefix} maintenance:mode --on ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . Prevent browser access + + @@ -59,6 +61,8 @@ sudo service apache2 stop ---- {occ-command-example-prefix} db:restore-default-row-format ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . Upgrade MariaDB to version 10.6+ + @@ -80,6 +84,8 @@ when using a dockerized environment as part of the upgrade procedure. ---- {occ-command-example-prefix} maintenance:mode --off ---- ++ +NOTE: Run this command inside the ownCloud Docker container. . Enable browser access + Start your web server, Alternatively, enable the virtual host serving ownCloud again: diff --git a/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc b/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc index 16318b6cb..df300c1cc 100644 --- a/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc +++ b/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc @@ -20,12 +20,16 @@ Check if it is disabled: {occ-command-example-prefix} app:list --disabled configreport ---- +NOTE: Run this command inside the ownCloud Docker container. + Enable it if it was formerly disabled: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} app:enable configreport ---- +NOTE: Run this command inside the ownCloud Docker container. + === Generate via webUI To generate a config report using the webUI, navigate to: + @@ -40,6 +44,8 @@ To generate a config report from the command line, run the following command fro {occ-command-example-prefix} configreport:generate > config_report.txt ---- +NOTE: Run this command inside the ownCloud Docker container. + == ownCloud Server Log File === Generate via webUI @@ -71,3 +77,5 @@ If LDAP is used, viewing the LDAP configuration is important when checking for e ---- {occ-command-example-prefix} ldap:show-config > ldap_config.txt ---- + +NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc b/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc index b93808621..14ec92d89 100644 --- a/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc +++ b/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc @@ -38,6 +38,8 @@ Use the following command to list all active background jobs triggered by ownClo {occ-command-example-prefix} background:queue:status --display-invalid-jobs ---- +NOTE: Run this command inside the ownCloud Docker container. + The output may look like the following: [source,plaintext] @@ -63,6 +65,8 @@ When you have identified the `ID` of the background job to be removed, run foll {occ-command-example-prefix} background:queue:delete ID ---- +NOTE: Run this command inside the ownCloud Docker container. + WARNING: Deleting a job cannot be undone. Be sure that you want to delete the job before doing so. === Remove Jobs Manually Added via Crontab diff --git a/modules/admin_manual/partials/configuration/server/disable-single-user-mode.adoc b/modules/admin_manual/partials/configuration/server/disable-single-user-mode.adoc index 3e7a3d3ec..809cb7b20 100644 --- a/modules/admin_manual/partials/configuration/server/disable-single-user-mode.adoc +++ b/modules/admin_manual/partials/configuration/server/disable-single-user-mode.adoc @@ -6,3 +6,5 @@ With encryption migrated from User Key-based encryption to Master Key-based, dis ---- {occ-command-example-prefix} maintenance:singleuser --off ---- + +NOTE: Run this command inside the ownCloud Docker container. From f75cbb7bc0636616c5ebf8cb4958cfdac7eff951 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Tue, 12 May 2026 09:48:52 +0200 Subject: [PATCH 07/38] remove latest-server-version attribute --- modules/admin_manual/pages/index.adoc | 7 ------- modules/admin_manual/pages/useful_pages.adoc | 10 +++++----- .../partials/maintenance/major_release_note.adoc | 4 ++-- .../pages/external_storage/external_storage.adoc | 2 +- .../pages/files/federated_cloud_sharing.adoc | 2 +- modules/classic_ui/pages/files/large_file_upload.adoc | 2 +- modules/classic_ui/pages/files/webgui/search.adoc | 2 +- modules/classic_ui/pages/files/webgui/sharing.adoc | 2 +- .../classic_ui/pages/personal_settings/storage.adoc | 2 +- modules/classic_ui/pages/pim/sync_ios.adoc | 2 +- modules/classic_ui/pages/pim/sync_osx.adoc | 2 +- .../files/encryption/not-encrypted-files.adoc | 4 ++-- 12 files changed, 17 insertions(+), 24 deletions(-) diff --git a/modules/admin_manual/pages/index.adoc b/modules/admin_manual/pages/index.adoc index c19a946d1..c5e3ba8a5 100644 --- a/modules/admin_manual/pages/index.adoc +++ b/modules/admin_manual/pages/index.adoc @@ -1,6 +1,4 @@ = Introduction -:owncloud-news-url: https://owncloud.com/news/ -:ownCloud-channel-url: https://www.youtube.com/channel/UC_4gez4lsWqciH-otOlXo5w Welcome to the ownCloud Classic Server Administration Guide. This guide describes administration tasks for ownCloud, the flexible open source file synchronization and sharing solution. ownCloud includes the ownCloud server, which runs on Linux, plus client applications for Microsoft Windows, Mac OS X, Linux, Android and Apple iOS operating systems. @@ -12,11 +10,6 @@ ownCloud server is available in three editions: * The Standard Subscription for customers who want paid support for the core Server, without Enterprise applications. * The Enterprise Subscription provides paid support for the Enterprise Edition. This includes the core Server and Enterprise apps. -== ownCloud Videos and Blogs - -See the -{ownCloud-channel-url}[official ownCloud channel] on YouTube for tutorials, overviews, and conference videos. Visit {owncloud-news-url}[News] to stay up to date. - == Target Audience This guide is for administrators who want to install, administer, and optimize their ownCloud servers. To learn more about the ownCloud Web user interface, and desktop and mobile clients, please refer to their respective manuals. See the developer manual if you would like to contribute: diff --git a/modules/admin_manual/pages/useful_pages.adoc b/modules/admin_manual/pages/useful_pages.adoc index af5b964ce..85b048735 100644 --- a/modules/admin_manual/pages/useful_pages.adoc +++ b/modules/admin_manual/pages/useful_pages.adoc @@ -11,8 +11,8 @@ Note that this section always points to the latest server version available. In case you need a different version, select your topic and manually switch to one of the available ones. -* xref:{latest-server-version}@server:admin_manual:installation/index.adoc[Manual Installation] -* xref:{latest-server-version}@server:admin_manual:installation/docker/index.adoc[Installation with Docker] -* xref:{latest-server-version}@server:admin_manual:configuration/server/occ_command.adoc[OCC Commands] -* xref:{latest-server-version}@server:admin_manual:configuration/server/caching_configuration.adoc#small-organization-single-server-setup[File Locking and Caching Configuration] -* xref:{latest-server-version}@server:admin_manual:maintenance/manual_upgrade.adoc[Manual Upgrade] +* xref:server:admin_manual:installation/index.adoc[Manual Installation] +* xref:server:admin_manual:installation/docker/index.adoc[Installation with Docker] +* xref:server:admin_manual:configuration/server/occ_command.adoc[OCC Commands] +* xref:server:admin_manual:configuration/server/caching_configuration.adoc#small-organization-single-server-setup[File Locking and Caching Configuration] +* xref:server:admin_manual:maintenance/manual_upgrade.adoc[Manual Upgrade] diff --git a/modules/admin_manual/partials/maintenance/major_release_note.adoc b/modules/admin_manual/partials/maintenance/major_release_note.adoc index 673d59532..c48b51fd7 100644 --- a/modules/admin_manual/partials/maintenance/major_release_note.adoc +++ b/modules/admin_manual/partials/maintenance/major_release_note.adoc @@ -1,6 +1,6 @@ [IMPORTANT] ==== -When upgrading, also check the minimum and maximum supported PHP version of the ownCloud target release. An ownCloud release may require a particular minimum and/or maximum PHP version. Check that the PHP version provided by the Operating System meets the requirements. For details see the https://doc.owncloud.com/docs_main/next/server_release_notes.html[Server Release Notes] and the xref:{latest-server-version}@server:admin_manual:installation/system_requirements.adoc[System Requirements] for the latest Release. +When upgrading, also check the minimum and maximum supported PHP version of the ownCloud target release. An ownCloud release may require a particular minimum and/or maximum PHP version. Check that the PHP version provided by the Operating System meets the requirements. For details see the https://doc.owncloud.com/docs_main/next/server_release_notes.html[Server Release Notes] and the xref:server:admin_manual:installation/system_requirements.adoc[System Requirements] for the latest Release. ==== [TIP] @@ -15,7 +15,7 @@ Here are some examples: |=== |Version |Can Upgrade to {latest-server-download-version} ? -|Requirements (always check the xref:{latest-server-version}@server:admin_manual:installation/system_requirements.adoc[System Requirements] too) +|Requirements (always check the xref:server:admin_manual:installation/system_requirements.adoc[System Requirements] too) |10.X.Y |Yes diff --git a/modules/classic_ui/pages/external_storage/external_storage.adoc b/modules/classic_ui/pages/external_storage/external_storage.adoc index 0b00f0ba7..a30efc30f 100644 --- a/modules/classic_ui/pages/external_storage/external_storage.adoc +++ b/modules/classic_ui/pages/external_storage/external_storage.adoc @@ -2,5 +2,5 @@ :description: The External Storage application allows you to mount external storage services, such as Google Drive, Dropbox, Amazon S3, SMB/CIFS fileservers, and FTP servers in ownCloud. Your ownCloud server administrator controls which of these are available to you. {description} Please see -xref:{latest-server-version}@server:admin_manual:configuration/files/external_storage/configuration.adoc[External Storage Configuration] in the ownCloud +xref:server:admin_manual:configuration/files/external_storage/configuration.adoc[External Storage Configuration] in the ownCloud Administrator’s manual for configuration howtos and examples. diff --git a/modules/classic_ui/pages/files/federated_cloud_sharing.adoc b/modules/classic_ui/pages/files/federated_cloud_sharing.adoc index 46682a24b..2c952e40b 100644 --- a/modules/classic_ui/pages/files/federated_cloud_sharing.adoc +++ b/modules/classic_ui/pages/files/federated_cloud_sharing.adoc @@ -7,7 +7,7 @@ servers, in effect creating your own cloud of ownClouds. {description} You can create direct share links with users on other ownCloud servers. -IMPORTANT: xref:{latest-server-version}@server:admin_manual:configuration/files/federated_cloud_sharing_configuration.adoc[Federated Sharing] has to be configured by the administrator. +IMPORTANT: xref:server:admin_manual:configuration/files/federated_cloud_sharing_configuration.adoc[Federated Sharing] has to be configured by the administrator. == How Federated Sharing Works diff --git a/modules/classic_ui/pages/files/large_file_upload.adoc b/modules/classic_ui/pages/files/large_file_upload.adoc index 69b746187..b083964cb 100644 --- a/modules/classic_ui/pages/files/large_file_upload.adoc +++ b/modules/classic_ui/pages/files/large_file_upload.adoc @@ -9,4 +9,4 @@ you require larger upload limits than have been provided by the default * Contact your administrator to request an increase in these variables * Refer to the section in the -xref:{latest-server-version}@server:admin_manual:configuration/files/big_file_upload_configuration.adoc[Admin Documentation] that describes how to manage file upload size limits. +xref:server:admin_manual:configuration/files/big_file_upload_configuration.adoc[Admin Documentation] that describes how to manage file upload size limits. diff --git a/modules/classic_ui/pages/files/webgui/search.adoc b/modules/classic_ui/pages/files/webgui/search.adoc index e05caa518..32b53960a 100644 --- a/modules/classic_ui/pages/files/webgui/search.adoc +++ b/modules/classic_ui/pages/files/webgui/search.adoc @@ -4,7 +4,7 @@ == Introduction -{description} Refer to the xref:{latest-server-version}@server:admin_manual:configuration/general_topics/search.adoc[Full Text Search] app in the ownCloud Admin Manual for more information about how to deploy it. +{description} Refer to the xref:server:admin_manual:configuration/general_topics/search.adoc[Full Text Search] app in the ownCloud Admin Manual for more information about how to deploy it. == Regular Search diff --git a/modules/classic_ui/pages/files/webgui/sharing.adoc b/modules/classic_ui/pages/files/webgui/sharing.adoc index d54f95f35..028003988 100644 --- a/modules/classic_ui/pages/files/webgui/sharing.adoc +++ b/modules/classic_ui/pages/files/webgui/sharing.adoc @@ -31,7 +31,7 @@ Based on the input, ownCloud will decide how to create the shares (e.g., share w [NOTE] ==== From 10.0.8, user and group name search results are dependent on a new -xref:{latest-server-version}@server:admin_manual:configuration/server/config_sample_php_parameters.adoc[configuration setting], called `user.search_min_length` (it is set to 4 by default). This setting enhances the search performance but requires that search terms contain at least the defined number of characters. Consequently, search terms shorter than the defined number of characters will not return a list of matches. However, they will return an existing user or group with a name of the same length as the search term. +xref:server:admin_manual:configuration/server/config_sample_php_parameters.adoc[configuration setting], called `user.search_min_length` (it is set to 4 by default). This setting enhances the search performance but requires that search terms contain at least the defined number of characters. Consequently, search terms shorter than the defined number of characters will not return a list of matches. However, they will return an existing user or group with a name of the same length as the search term. ==== After a file or folder has been shared, xref:share-permissions[Share Permissions] can be set for it. In the image below, you can see that the directory "event-Photos" is shared with the user "pierpont", who can share, edit, create, change, and delete the directory. diff --git a/modules/classic_ui/pages/personal_settings/storage.adoc b/modules/classic_ui/pages/personal_settings/storage.adoc index e846724d3..c05ca3bb2 100644 --- a/modules/classic_ui/pages/personal_settings/storage.adoc +++ b/modules/classic_ui/pages/personal_settings/storage.adoc @@ -10,4 +10,4 @@ image::personal-settings/storage/external-storage.png[] == Configuration -To configure one or more external storages, please refer to the xref:{latest-server-version}@server:admin_manual:configuration/files/external_storage/index.adoc[External Storage documentation]. +To configure one or more external storages, please refer to the xref:server:admin_manual:configuration/files/external_storage/index.adoc[External Storage documentation]. diff --git a/modules/classic_ui/pages/pim/sync_ios.adoc b/modules/classic_ui/pages/pim/sync_ios.adoc index 546754ace..2df4644e8 100644 --- a/modules/classic_ui/pages/pim/sync_ios.adoc +++ b/modules/classic_ui/pages/pim/sync_ios.adoc @@ -41,4 +41,4 @@ Your calendar will now be visible in the Calendar application Now should now find your contacts in the address book of your iPhone. If it’s still not working, have a look at the -xref:{latest-server-version}@server:admin_manual:configuration/general_topics/general_troubleshooting.adoc#troubleshooting-contacts-calendar[Troubleshooting Contacts & Calendar] guides. +xref:server:admin_manual:configuration/general_topics/general_troubleshooting.adoc#troubleshooting-contacts-calendar[Troubleshooting Contacts & Calendar] guides. diff --git a/modules/classic_ui/pages/pim/sync_osx.adoc b/modules/classic_ui/pages/pim/sync_osx.adoc index 492ad8a5d..f5c87766b 100644 --- a/modules/classic_ui/pages/pim/sync_osx.adoc +++ b/modules/classic_ui/pages/pim/sync_osx.adoc @@ -45,4 +45,4 @@ with your favorite text editor. . You may have to restart addressbook once more. After this, it should work. If it’s still not working, have a look at the -xref:{latest-server-version}@server:admin_manual:configuration/general_topics/general_troubleshooting.adoc#troubleshooting-contacts-calendar[Troubleshooting Contacts & Calendar] guides. +xref:server:admin_manual:configuration/general_topics/general_troubleshooting.adoc#troubleshooting-contacts-calendar[Troubleshooting Contacts & Calendar] guides. diff --git a/modules/classic_ui/partials/configuration/files/encryption/not-encrypted-files.adoc b/modules/classic_ui/partials/configuration/files/encryption/not-encrypted-files.adoc index 0b9e5c152..fce557962 100644 --- a/modules/classic_ui/partials/configuration/files/encryption/not-encrypted-files.adoc +++ b/modules/classic_ui/partials/configuration/files/encryption/not-encrypted-files.adoc @@ -3,7 +3,7 @@ === The following data *is* encrypted: * Users' _files_ in their home directory trees _if enabled_ by the admin. + -Location: `data//files`, see the: xref:{latest-server-version}@server:admin_manual:configuration/server/occ_command.adoc#encryption[occ encryption command set] +Location: `data//files`, see the: xref:server:admin_manual:configuration/server/occ_command.adoc#encryption[occ encryption command set] * External storage _if enabled_ either by the user or by the admin === The following is *never* encrypted: @@ -22,4 +22,4 @@ Note that there may be other not mentioned files that are not encrypted. If not otherwise decided by the admin, only new and changed files after enabling encryption are encrypted. -NOTE: An admin can encrypt existing files post enabling encryption via an xref:{latest-server-version}@server:admin_manual:configuration/server/occ_command.adoc#encryption[occ encryption command]. +NOTE: An admin can encrypt existing files post enabling encryption via an xref:server:admin_manual:configuration/server/occ_command.adoc#encryption[occ encryption command]. From 6c29444256fa5de0eae82ef6e7511b8e1e0e2b43 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Tue, 12 May 2026 10:52:45 +0200 Subject: [PATCH 08/38] save before occ attribute change --- .../configuration/server/occ_command.adoc | 66 ++----------------- modules/admin_manual/pages/index.adoc | 22 +++---- .../pages/installation/docker/index.adoc | 3 +- .../pages/installation/index.adoc | 1 - .../installation/system_requirements.adoc | 39 ++++------- modules/admin_manual/pages/useful_pages.adoc | 1 - 6 files changed, 31 insertions(+), 101 deletions(-) diff --git a/modules/admin_manual/pages/configuration/server/occ_command.adoc b/modules/admin_manual/pages/configuration/server/occ_command.adoc index bd64d4d97..609d3baa0 100644 --- a/modules/admin_manual/pages/configuration/server/occ_command.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_command.adoc @@ -1,58 +1,6 @@ = Using the occ Command :toc: macro :toclevels: 2 -:page-aliases: configuration/server/occ_app_command.adoc, \ -go/admin-cli-upgrade.adoc, \ -configuration/files/external_storage_configuration.adoc, \ -configuration/server/occ_commands/core_commands/app_commands.adoc, \ -configuration/server/occ_commands/core_commands/background_jobs_selector.adoc, \ -configuration/server/occ_commands/core_commands/config_commands.adoc, \ -configuration/server/occ_commands/core_commands/config_reports_commands.adoc, \ -configuration/server/occ_commands/core_commands/command_line_installation_commands.adoc, \ -configuration/server/occ_commands/core_commands/command_line_upgrade_commands.adoc, \ -configuration/server/occ_commands/core_commands/dav_commands.adoc, \ -configuration/server/occ_commands/core_commands/database_conversion_commands.adoc, \ -configuration/server/occ_commands/core_commands/encryption_commands.adoc, \ -configuration/server/occ_commands/core_commands/federation_sync_commands.adoc, \ -configuration/server/occ_commands/core_commands/file_commands.adoc, \ -configuration/server/occ_commands/core_commands/files_external_commands.adoc, \ -configuration/server/occ_commands/core_commands/full_text_search_commands.adoc, \ -configuration/server/occ_commands/core_commands/group_commands.adoc, \ -configuration/server/occ_commands/core_commands/integrity_check_commands.adoc, \ -configuration/server/occ_commands/core_commands/localisation_commands.adoc, \ -configuration/server/occ_commands/core_commands/logging_commands.adoc, \ -configuration/server/occ_commands/core_commands/managing_background_jobs.adoc, \ -configuration/server/occ_commands/core_commands/maintenance_commands.adoc, \ -configuration/server/occ_commands/core_commands/migration_steps_commands.adoc, \ -configuration/server/occ_commands/core_commands/mimetype_update_commands.adoc, \ -configuration/server/occ_commands/core_commands/notifications_commands.adoc, \ -configuration/server/occ_commands/core_commands/incoming_shares_commands.adoc, \ -configuration/server/occ_commands/core_commands/security_commands.adoc, \ -configuration/server/occ_commands/core_commands/sharing_commands.adoc, \ -configuration/server/occ_commands/core_commands/trashbin_commands.adoc, \ -configuration/server/occ_commands/core_commands/2fa_core_commands.adoc, \ -configuration/server/occ_commands/core_commands/user_commands.adoc, \ -configuration/server/occ_commands/core_commands/versions_commands.adoc, \ -configuration/server/occ_commands/app_commands/activity_commands.adoc, \ -configuration/server/occ_commands/app_commands/antivirus_commands.adoc, \ -configuration/server/occ_commands/app_commands/admin_audit_commands.adoc, \ -configuration/server/occ_commands/app_commands/brute_force_protection_commands.adoc, \ -configuration/server/occ_commands/app_commands/calendar_commands.adoc, \ -configuration/server/occ_commands/app_commands/contacts_commands.adoc, \ -configuration/server/occ_commands/app_commands/custom_groups.adoc, \ -configuration/server/occ_commands/app_commands/data_explorer_commands.adoc, \ -configuration/server/occ_commands/app_commands/files_lifecycle.adoc, \ -configuration/server/occ_commands/app_commands/ldap_integration_commands.adoc, \ -configuration/server/occ_commands/app_commands/market_commands.adoc, \ -configuration/server/occ_commands/app_commands/metrics_commands.adoc, \ -configuration/server/occ_commands/app_commands/password_policy_commands.adoc, \ -configuration/server/occ_commands/app_commands/ransomware_protection_commands.adoc, \ -configuration/server/occ_commands/app_commands/richdocuments.adoc, \ -configuration/server/occ_commands/app_commands/oauth2_commands.adoc, \ -configuration/server/occ_commands/app_commands/s3objectstore_commands.adoc, \ -configuration/server/occ_commands/app_commands/saml_sso_shibboleth_integration_commands.adoc, \ -configuration/server/occ_commands/app_commands/2fa_app_commands.adoc, \ -configuration/server/occ_commands/app_commands/wnd_commands.adoc ownCloud's `occ` command (ownCloud console) is ownCloud's command-line interface. You can perform many common server operations with `occ`, such as installing and upgrading ownCloud, managing users and groups, encryption, passwords, app settings, and more. @@ -117,7 +65,7 @@ Running `occ` with no options lists all commands and options, like this example [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} -ownCloud version 10.8.0 +ownCloud version 11.0.0 Usage: command [options] [arguments] @@ -156,7 +104,7 @@ Display your ownCloud version: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} -V - ownCloud version 10.8.0 + ownCloud version 11.0.0 ---- Query your ownCloud server status: @@ -165,8 +113,8 @@ Query your ownCloud server status: ---- {occ-command-example-prefix} status - installed: true - - version: 10.8.0.4 - - versionstring: 10.8.0 + - version: 11.0.0.0 + - versionstring: 11.0.0 - edition: Community ---- @@ -177,7 +125,7 @@ The default is plain text, but it can also be `json`: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix} status --output=json -{"installed":true,"version":"10.8.0.4","versionstring":"10.8.0","edition":""} +{"installed":true,"version":"11.0.0.0","versionstring":"11.0.0","edition":""} ---- or `json_pretty`: @@ -187,8 +135,8 @@ or `json_pretty`: {occ-command-example-prefix} status --output=json_pretty { "installed": true, - "version": "10.8.0.4", - "versionstring": "10.8.0", + "version": "11.0.0.0", + "versionstring": "11.0.0", "edition": "Community" } ---- diff --git a/modules/admin_manual/pages/index.adoc b/modules/admin_manual/pages/index.adoc index c5e3ba8a5..11e883c36 100644 --- a/modules/admin_manual/pages/index.adoc +++ b/modules/admin_manual/pages/index.adoc @@ -1,21 +1,19 @@ = Introduction -Welcome to the ownCloud Classic Server Administration Guide. This guide describes administration tasks for ownCloud, the flexible open source file synchronization and sharing solution. ownCloud includes the ownCloud server, which runs on Linux, plus client applications for Microsoft Windows, Mac OS X, Linux, Android and Apple iOS operating systems. +Welcome to the ownCloud Classic Server Administration Guide. This guide describes administration tasks for ownCloud, the flexible open source file synchronization and sharing solution. -Current editions of ownCloud manuals are always available online at {docs-base-url}[doc.owncloud.com]. +== Installation Changes + +IMPORTANT: Compared to former releases, ownCloud 11 is only available as docker image which contains all the required libraries such as PHP 8. + +== Target Audience + +This guide is for administrators who want to install, administer, and optimize their ownCloud servers. To learn more about the ownCloud Web user interface, and desktop and mobile clients, please refer to their respective manuals. See the xref:developer_manual:index.adoc[developer manual] if you would like to contribute. + +== Editions ownCloud server is available in three editions: * The free community-supported server. This is the core server for all editions. * The Standard Subscription for customers who want paid support for the core Server, without Enterprise applications. * The Enterprise Subscription provides paid support for the Enterprise Edition. This includes the core Server and Enterprise apps. - -== Target Audience - -This guide is for administrators who want to install, administer, and optimize their ownCloud servers. To learn more about the ownCloud Web user interface, and desktop and mobile clients, please refer to their respective manuals. See the developer manual if you would like to contribute: - -* xref:classic_ui:index.adoc[ownCloud User Manual] -* xref:developer_manual:index.adoc[ownCloud Developer Manual] -* {docs-base-url}/desktop/[ownCloud Desktop Client] -* {docs-base-url}/ios-app/[ownCloud iOS App] -* {docs-base-url}/android/[ownCloud Android App] diff --git a/modules/admin_manual/pages/installation/docker/index.adoc b/modules/admin_manual/pages/installation/docker/index.adoc index 13a44130b..1a393f254 100644 --- a/modules/admin_manual/pages/installation/docker/index.adoc +++ b/modules/admin_manual/pages/installation/docker/index.adoc @@ -1,9 +1,10 @@ = Installing with Docker :toc: right +:description: ownCloud can be installed using the official ownCloud Docker image. + :dockerhub-url: https://hub.docker.com/r/owncloud/server :docker-compose-url: https://docs.docker.com/compose/ :docker-compose-build-url: https://docs.docker.com/compose/compose-file/build/ -:description: ownCloud can be installed using the official ownCloud Docker image. == Introduction diff --git a/modules/admin_manual/pages/installation/index.adoc b/modules/admin_manual/pages/installation/index.adoc index 5959e5d12..fccfb48bb 100644 --- a/modules/admin_manual/pages/installation/index.adoc +++ b/modules/admin_manual/pages/installation/index.adoc @@ -1,5 +1,4 @@ = Installation Options -:page-aliases: go/admin-install.adoc == Introduction diff --git a/modules/admin_manual/pages/installation/system_requirements.adoc b/modules/admin_manual/pages/installation/system_requirements.adoc index 4f736cd6f..e9e07a87f 100644 --- a/modules/admin_manual/pages/installation/system_requirements.adoc +++ b/modules/admin_manual/pages/installation/system_requirements.adoc @@ -1,12 +1,11 @@ = System Requirements :toc: right -:toclevels: 1 -:desktop-system-requirements-url: https://doc.owncloud.com/desktop/installing.html#system-requirements -:ios-system-requirements-url: https://doc.owncloud.com/ios-app/ios_faq.html -:android-system-requirements-url: https://doc.owncloud.com/android/faq.html - :description: Read this documentation for the supported environment for your ownCloud Server. Starting with ownCloud Server 11, only Docker-based installations are supported. +:desktop-system-requirements-url: https://doc.owncloud.com/desktop/ +:ios-system-requirements-url: https://doc.owncloud.com/ios-app/ +:android-system-requirements-url: https://doc.owncloud.com/android/ + == Introduction {description} @@ -15,7 +14,7 @@ ownCloud Server 11 is exclusively deployed via Docker. The following requirements apply to the Docker host: -[width="60%",cols="30%,60%a",options="header"] +[width="100%",cols="30%,70%a",options="header"] |=== | Component | Requirement @@ -30,7 +29,8 @@ ownCloud Server 11 is exclusively deployed via Docker. The following requirement | 64-bit (x86_64 / amd64) | RAM -| Minimum 512MB; 1GB or more recommended +| Minimum 512MB; 1GB or more recommended. + +Memory requirements for running an ownCloud server are greatly variable, depending on the numbers of users and files, and volume of server activity. |=== [NOTE] @@ -47,33 +47,18 @@ The operating system, web server, PHP runtime, and database are all managed insi === Web Browser -* Edge (current version on Windows 10) -* IE11 or newer (except Compatibility Mode) * Firefox 60 ESR+ * Chrome 66+ * Safari 10+ +* Edge (current version on Windows 10) +* IE11 or newer (except Compatibility Mode) -=== Desktop Sync Client - -We always recommend to use the newest sync client with the latest server release. - -You can find {desktop-system-requirements-url}[detailed system requirements] in the documentation for the Desktop Synchronization Client. - -=== Mobile Apps +=== Desktop and Mobile Apps We always recommend to use the newest mobile apps with the latest server release. -You can find detailed system requirements in the documentation for the mobile apps. +You can find detailed system requirements in the documentation for the Apps in: +* {desktop-system-requirements-url}[Desktop App] * {ios-system-requirements-url}[iOS system requirements] * {android-system-requirements-url}[Android system requirements] - -[TIP] -==== -You can find out more in the https://owncloud.com/changelog[changelog]. -==== - -== Memory Requirements - -Memory requirements for running an ownCloud server are greatly variable, depending on the numbers of users and files, and volume of server activity. ownCloud officially requires a minimum of 128MB RAM. -But, we recommend a minimum of 512MB. diff --git a/modules/admin_manual/pages/useful_pages.adoc b/modules/admin_manual/pages/useful_pages.adoc index 85b048735..c642f64ff 100644 --- a/modules/admin_manual/pages/useful_pages.adoc +++ b/modules/admin_manual/pages/useful_pages.adoc @@ -11,7 +11,6 @@ Note that this section always points to the latest server version available. In case you need a different version, select your topic and manually switch to one of the available ones. -* xref:server:admin_manual:installation/index.adoc[Manual Installation] * xref:server:admin_manual:installation/docker/index.adoc[Installation with Docker] * xref:server:admin_manual:configuration/server/occ_command.adoc[OCC Commands] * xref:server:admin_manual:configuration/server/caching_configuration.adoc#small-organization-single-server-setup[File Locking and Caching Configuration] From 2f56a5957dd0aade7c004b1c7083cdd850f25183 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Tue, 12 May 2026 18:09:51 +0200 Subject: [PATCH 09/38] occ updates --- .../configuration/database/db_conversion.adoc | 4 +- .../linux_database_configuration.adoc | 2 +- .../encryption/encryption_configuration.adoc | 40 ++-- .../encryption_configuration_quick_guide.adoc | 24 +- .../files/external_storage/configuration.adoc | 2 +- ...federated_cloud_sharing_configuration.adoc | 24 +- .../files/file_sharing_configuration.adoc | 20 +- .../files/manual_file_locking.adoc | 8 +- .../pages/configuration/files/mimetypes.adoc | 4 +- .../configuration/files/trashbin_options.adoc | 6 +- .../general_topics/code_signing.adoc | 4 +- .../general_topics/impersonate_users.adoc | 22 +- .../configuration/general_topics/search.adoc | 24 +- .../server/background_jobs_configuration.adoc | 12 +- .../server/config_sample_php_parameters.adoc | 6 +- .../configuration/server/harden_server.adoc | 2 +- .../server/legal_settings_configuration.adoc | 8 +- .../configuration/server/occ_command.adoc | 36 ++- .../app_commands/_2fa_app_commands.adoc | 8 +- .../app_commands/_activity_commands.adoc | 16 +- .../app_commands/_admin_audit_commands.adoc | 12 +- .../app_commands/_antivirus_commands.adoc | 8 +- .../_brute_force_protection_commands.adoc | 8 +- .../app_commands/_custom_groups.adoc | 20 +- .../app_commands/_data_exporter_commands.adoc | 12 +- .../app_commands/_files_lifecycle.adoc | 51 +++-- .../_full_text_search_commands.adoc | 70 +++--- .../_ldap_integration_commands.adoc | 80 +++---- .../app_commands/_market_commands.adoc | 22 +- .../app_commands/_metrics_commands.adoc | 12 +- .../_migrate_to_kitworks_commands.adoc | 24 +- .../_migrate_to_ocis_commands.adoc | 26 +-- .../app_commands/_oauth2_commands.adoc | 16 +- .../_password_policy_commands.adoc | 14 +- .../_ransomware_protection_commands.adoc | 30 +-- .../app_commands/_richdocuments.adoc | 31 ++- .../app_commands/_s3objectstore_commands.adoc | 8 +- ...l_sso_shibboleth_integration_commands.adoc | 4 +- .../app_commands/_wnd_commands.adoc | 15 +- .../core_commands/_2fa_core_commands.adoc | 8 +- .../core_commands/_app_commands.adoc | 24 +- .../_background_jobs_selector.adoc | 8 +- .../_command_line_installation_commands.adoc | 130 ----------- .../_command_line_upgrade_commands.adoc | 12 +- .../core_commands/_config_commands.adoc | 100 ++++----- .../_config_reports_commands.adoc | 15 +- .../core_commands/_database_commands.adoc | 8 +- .../core_commands/_dav_commands.adoc | 36 +-- .../core_commands/_encryption_commands.adoc | 74 +++--- .../_federation_sync_commands.adoc | 7 +- .../_federation_trusted_servers.adoc | 24 +- .../core_commands/_file_commands.adoc | 102 ++++----- .../_files_external_commands.adoc | 42 ++-- .../core_commands/_group_commands.adoc | 70 +++--- .../_incoming_shares_commands.adoc | 17 +- .../_integrity_check_commands.adoc | 15 +- .../core_commands/_localisation_commands.adoc | 15 +- .../core_commands/_logging_commands.adoc | 10 +- .../core_commands/_maintenance_commands.adoc | 52 ++--- .../_managing_background_jobs.adoc | 34 ++- .../_migration_steps_commands.adoc | 8 +- .../_mimetype_update_commands.adoc | 4 +- .../_notifications_commands.adoc | 12 +- .../core_commands/_previews_commands.adoc | 8 +- .../core_commands/_security_commands.adoc | 28 ++- .../core_commands/_sharing_commands.adoc | 25 +-- .../core_commands/_system_command.adoc | 12 +- .../core_commands/_trashbin_commands.adoc | 14 +- .../core_commands/_user_commands.adoc | 210 +++++++++--------- .../core_commands/_versions_commands.adoc | 22 +- .../server/security/hsmdaemon/index.adoc | 10 +- .../server/ui-configuration.adoc | 6 +- .../server/virus-scanner-support.adoc | 24 +- .../pages/configuration/user/oidc/oidc.adoc | 2 +- .../user/reset_admin_password.adoc | 2 +- .../configuration/user/user_auth_ldap.adoc | 6 +- .../configuration/user/user_management.adoc | 10 +- .../enterprise/authentication/kerberos.adoc | 2 +- .../windows-network-drive_configuration.adoc | 46 ++-- .../external_storage/wnd_quick_guide.adoc | 6 +- .../file_management/files_lifecycle.adoc | 22 +- .../pages/enterprise/logging/admin_audit.adoc | 2 +- .../pages/enterprise/reporting/metrics.adoc | 4 +- .../user_management/saml_2.0_sso.adoc | 4 +- .../user_management/user_auth_shibboleth.adoc | 8 +- modules/admin_manual/pages/index.adoc | 2 +- .../pages/installation/docker/index.adoc | 82 +++---- .../pages/installation/index.adoc | 2 +- .../manual_installation.adoc | 2 +- .../installation/system_requirements.adoc | 4 +- .../backup_and_restore/backup.adoc | 4 +- .../backup_and_restore/restore.adoc | 6 +- .../pages/maintenance/enable_maintenance.adoc | 4 +- ...migrating-from-user-key-to-master-key.adoc | 14 +- .../export_import_instance_data.adoc | 8 +- .../manually-moving-data-folders.adoc | 8 +- .../pages/maintenance/migrating.adoc | 6 +- .../upgrading/database_upgrade.adoc | 6 +- .../maintenance/upgrading/manual_upgrade.adoc | 16 +- .../providing_logs_and_config_files.adoc | 8 +- .../remove_non_existent_bg_jobs.adoc | 4 +- .../server/disable-single-user-mode.adoc | 2 +- .../app/fundamentals/backgroundjobs.adoc | 2 +- .../pages/app/fundamentals/database.adoc | 4 +- .../developer_manual/pages/core/theming.adoc | 2 +- .../pages/testing/acceptance-tests.adoc | 2 +- .../developer_manual/pages/testing/drone.adoc | 2 +- .../pages/testing/unit-testing.adoc | 2 +- 108 files changed, 1008 insertions(+), 1219 deletions(-) delete mode 100644 modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_installation_commands.adoc diff --git a/modules/admin_manual/pages/configuration/database/db_conversion.adoc b/modules/admin_manual/pages/configuration/database/db_conversion.adoc index d4a1aa15b..a93ad85a9 100644 --- a/modules/admin_manual/pages/configuration/database/db_conversion.adoc +++ b/modules/admin_manual/pages/configuration/database/db_conversion.adoc @@ -59,7 +59,7 @@ After you have restarted the database, run the following occ command in your own [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} db:convert-type [options] type username hostname database +{occ-command-example-prefix-docker} db:convert-type [options] type username hostname database ---- [NOTE] @@ -70,7 +70,7 @@ For example: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} db:convert-type --all-apps mysql oc_mysql_user 127.0.0.1 new_db_name +{occ-command-example-prefix-docker} db:convert-type --all-apps mysql oc_mysql_user 127.0.0.1 new_db_name ---- ==== diff --git a/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc b/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc index 6ce93155b..ed9a2b57a 100644 --- a/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc +++ b/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc @@ -182,7 +182,7 @@ innodb_file_per_table=ON + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} db:convert-mysql-charset +{occ-command-example-prefix-docker} db:convert-mysql-charset ---- + NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc index e3ae80344..fd5fef564 100644 --- a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc @@ -120,14 +120,14 @@ To enable the encryption app, run the following command: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:enable encryption +{occ-command-example-prefix-docker} app:enable encryption ---- NOTE: Run this command inside the ownCloud Docker container. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:enable +{occ-command-example-prefix-docker} encryption:enable ---- NOTE: Run this command inside the ownCloud Docker container. @@ -166,7 +166,7 @@ To be safe and avoid any issues on a running instance, put your server in single [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --on +{occ-command-example-prefix-docker} maintenance:singleuser --on ---- NOTE: Run this command inside the ownCloud Docker container. @@ -175,7 +175,7 @@ Enabling encryption via the command line involves several commands. If not alrea [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:enable encryption +{occ-command-example-prefix-docker} app:enable encryption ---- NOTE: Run this command inside the ownCloud Docker container. @@ -184,7 +184,7 @@ Then enable encryption, using the following command: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:enable +{occ-command-example-prefix-docker} encryption:enable ---- NOTE: Run this command inside the ownCloud Docker container. @@ -193,7 +193,7 @@ Finally, encrypt all data, using the following command: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:encrypt-all --yes +{occ-command-example-prefix-docker} encryption:encrypt-all --yes ---- NOTE: Run this command inside the ownCloud Docker container. @@ -204,7 +204,7 @@ Now you can turn off the single user mode: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --off +{occ-command-example-prefix-docker} maintenance:singleuser --off ---- NOTE: Run this command inside the ownCloud Docker container. @@ -215,7 +215,7 @@ Get the current encryption status and the loaded encryption module: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:status +{occ-command-example-prefix-docker} encryption:status ---- NOTE: Run this command inside the ownCloud Docker container. @@ -230,7 +230,7 @@ You must first put your ownCloud server into single-user mode to prevent any use [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --on +{occ-command-example-prefix-docker} maintenance:singleuser --on ---- NOTE: Run this command inside the ownCloud Docker container. @@ -244,7 +244,7 @@ Decrypt all user data files, or optionally a single user: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:decrypt-all [username] +{occ-command-example-prefix-docker} encryption:decrypt-all [username] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -255,14 +255,14 @@ To disable encryption, put your ownCloud server into single-user mode, and then [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --on +{occ-command-example-prefix-docker} maintenance:singleuser --on ---- NOTE: Run this command inside the ownCloud Docker container. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:disable +{occ-command-example-prefix-docker} encryption:disable ---- NOTE: Run this command inside the ownCloud Docker container. @@ -271,7 +271,7 @@ Take it out of single-user mode when you are finished, by using the following co [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --off +{occ-command-example-prefix-docker} maintenance:singleuser --off ---- NOTE: Run this command inside the ownCloud Docker container. @@ -287,7 +287,7 @@ Get the current encryption status and the loaded encryption module: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:status +{occ-command-example-prefix-docker} encryption:status ---- NOTE: Run this command inside the ownCloud Docker container. @@ -340,7 +340,7 @@ You must first put your ownCloud server into single-user mode to prevent any use [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --on +{occ-command-example-prefix-docker} maintenance:singleuser --on ---- NOTE: Run this command inside the ownCloud Docker container. @@ -356,14 +356,14 @@ You may disable encryption only with `occ`. Make sure you have backups of all th [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --on +{occ-command-example-prefix-docker} maintenance:singleuser --on ---- NOTE: Run this command inside the ownCloud Docker container. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:disable +{occ-command-example-prefix-docker} encryption:disable ---- NOTE: Run this command inside the ownCloud Docker container. @@ -376,7 +376,7 @@ command: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --off +{occ-command-example-prefix-docker} maintenance:singleuser --off ---- NOTE: Run this command inside the ownCloud Docker container. @@ -391,7 +391,7 @@ View current location of keys: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:show-key-storage-root +{occ-command-example-prefix-docker} encryption:show-key-storage-root ---- NOTE: Run this command inside the ownCloud Docker container. @@ -420,7 +420,7 @@ chmod -R 0770 /var/www/owncloud/data/new_keys [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:change-key-storage-root new_keys +{occ-command-example-prefix-docker} encryption:change-key-storage-root new_keys ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration_quick_guide.adoc b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration_quick_guide.adoc index 02e37c04d..40d147d34 100644 --- a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration_quick_guide.adoc +++ b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration_quick_guide.adoc @@ -17,11 +17,11 @@ This quick guide gives a brief summary of the commands needed without going into [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --on -{occ-command-example-prefix} app:enable encryption -{occ-command-example-prefix} encryption:enable -{occ-command-example-prefix} encryption:encrypt-all --yes -{occ-command-example-prefix} maintenance:singleuser --off +{occ-command-example-prefix-docker} maintenance:singleuser --on +{occ-command-example-prefix-docker} app:enable encryption +{occ-command-example-prefix-docker} encryption:enable +{occ-command-example-prefix-docker} encryption:encrypt-all --yes +{occ-command-example-prefix-docker} maintenance:singleuser --off ---- NOTE: Run this command inside the ownCloud Docker container. @@ -30,7 +30,7 @@ NOTE: Run this command inside the ownCloud Docker container. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:status +{occ-command-example-prefix-docker} encryption:status ---- NOTE: Run this command inside the ownCloud Docker container. @@ -41,9 +41,9 @@ Depending on the amount of existing data, this operation can take a long time. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --on -{occ-command-example-prefix} encryption:decrypt-all -{occ-command-example-prefix} maintenance:singleuser --off +{occ-command-example-prefix-docker} maintenance:singleuser --on +{occ-command-example-prefix-docker} encryption:decrypt-all +{occ-command-example-prefix-docker} maintenance:singleuser --off ---- NOTE: Run this command inside the ownCloud Docker container. @@ -52,10 +52,10 @@ NOTE: Run this command inside the ownCloud Docker container. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:disable +{occ-command-example-prefix-docker} encryption:disable # ignore the "already disabled" message -{occ-command-example-prefix} app:disable encryption +{occ-command-example-prefix-docker} app:disable encryption ---- NOTE: Run this command inside the ownCloud Docker container. @@ -64,7 +64,7 @@ If the master key has been compromised or exposed, you can replace it. You will [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:recreate-master-key +{occ-command-example-prefix-docker} encryption:recreate-master-key ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc b/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc index 889d37aed..4a83d7937 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc @@ -134,7 +134,7 @@ You might need to setup a cron job that runs + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files:scan --all` +{occ-command-example-prefix-docker} files:scan --all` ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc b/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc index 392328f33..ac9f2a2ca 100644 --- a/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc @@ -34,7 +34,7 @@ image::configuration/files/browser-address-bars.png[Lock icon in Firefox, Google + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} system:cron +{occ-command-example-prefix-docker} system:cron ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -44,7 +44,7 @@ You can get the corresponding job ID by using the `background:queue:status` occ + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} background:queue:execute --force +{occ-command-example-prefix-docker} background:queue:execute --force ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -55,8 +55,8 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} dav:sync-system-addressbook -{occ-command-example-prefix} federation:sync-addressbook +{occ-command-example-prefix-docker} dav:sync-system-addressbook +{occ-command-example-prefix-docker} federation:sync-addressbook ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -68,8 +68,8 @@ NOTE: Automatic acceptance of new federated shares will not work if the option ` [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set federation auto_accept_trusted --value '0' -{occ-command-example-prefix} config:app:set federatedfilesharing auto_accept_trusted --value 'yes' +{occ-command-example-prefix-docker} config:app:set federation auto_accept_trusted --value '0' +{occ-command-example-prefix-docker} config:app:set federatedfilesharing auto_accept_trusted --value 'yes' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -122,7 +122,7 @@ Alternatively you can use the command line: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_sharing cronjob_scan_external_enabled --value 'yes' +{occ-command-example-prefix-docker} config:app:set files_sharing cronjob_scan_external_enabled --value 'yes' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -133,7 +133,7 @@ You can also configure these settings of the cronjob: + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_sharing cronjob_scan_external_min_login --value +{occ-command-example-prefix-docker} config:app:set files_sharing cronjob_scan_external_min_login --value ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -142,7 +142,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_sharing cronjob_scan_external_min_scan --value +{occ-command-example-prefix-docker} config:app:set files_sharing cronjob_scan_external_min_scan --value ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -151,7 +151,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_sharing cronjob_scan_external_batch --value +{occ-command-example-prefix-docker} config:app:set files_sharing cronjob_scan_external_batch --value ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -160,7 +160,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} background:queue:execute --force --accept-warning +{occ-command-example-prefix-docker} background:queue:execute --force --accept-warning ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -188,7 +188,7 @@ It is possible to configure the VCARD properties that are searched in order to r [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set dav remote_search_properties --value=CLOUD,FN,EMAIL +{occ-command-example-prefix-docker} config:app:set dav remote_search_properties --value=CLOUD,FN,EMAIL ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc b/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc index 841afadba..6d73e4df6 100644 --- a/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc @@ -99,7 +99,7 @@ xref:configuration/server/occ_command.adoc#config-commands[occ config:app:set co [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} \ +{occ-command-example-prefix-docker} \ config:app:set \ core \ shareapi_public_notification_lang \ @@ -225,7 +225,7 @@ Here is an example of how to transfer all files from one user to another. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files:transfer-ownership \ +{occ-command-example-prefix-docker} files:transfer-ownership \ \ ---- @@ -236,7 +236,7 @@ Here is an example of how to transfer _a limited group_ a single folder from one [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files:transfer-ownership \ +{occ-command-example-prefix-docker} files:transfer-ownership \ --path="folder/to/move" \ \ @@ -257,7 +257,7 @@ for a complete list of `occ` commands. IMPORTANT: If an exception occurred during the transfer ownership command or the command terminated prematurely, it is advised to run following command for the source *and* target user: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files:troubleshoot-transfer-ownership --uid ` +{occ-command-example-prefix-docker} files:troubleshoot-transfer-ownership --uid ` ---- NOTE: Run this command inside the ownCloud Docker container. @@ -283,7 +283,7 @@ This command provides for the creation of both personal (for a specific user) an [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files_external:create \ +{occ-command-example-prefix-docker} files_external:create \ /my_share_name windows_network_drive \ password::logincredentials \ --config={host=127.0.0.1, share='home', root='$user', domain='owncloud.local'} \ @@ -296,7 +296,7 @@ or [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files_external:create \ +{occ-command-example-prefix-docker} files_external:create \ /my_share_name windows_network_drive \ password::logincredentials \ --config host=127.0.0.1 \ @@ -312,7 +312,7 @@ NOTE: Run this command inside the ownCloud Docker container. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files_external:create \ +{occ-command-example-prefix-docker} files_external:create \ /my_share_name windows_network_drive \ password::logincredentials \ --config={host=127.0.0.1, share='home', root='$user', domain='owncloud.local'} @@ -324,7 +324,7 @@ or [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files_external:create \ +{occ-command-example-prefix-docker} files_external:create \ /my_share_name windows_network_drive \ password::logincredentials \ --config host=127.0.0.1 \ @@ -343,7 +343,7 @@ You can create general and personal shares passing the configuration details via [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files_external:import \ +{occ-command-example-prefix-docker} files_external:import \ /import.json ---- @@ -353,7 +353,7 @@ NOTE: Run this command inside the ownCloud Docker container. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files_external:import \ +{occ-command-example-prefix-docker} files_external:import \ /import.json --user someuser ---- diff --git a/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc b/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc index 704e72b4f..7b079e0d5 100644 --- a/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc +++ b/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc @@ -50,7 +50,7 @@ image::configuration/files/manual_file_locking/manual-file-locking-with-lock-bre Using the occ command:: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files enable_lock_file_action --value yes +{occ-command-example-prefix-docker} config:app:set files enable_lock_file_action --value yes ---- NOTE: Run this command inside the ownCloud Docker container. @@ -77,7 +77,7 @@ Using the occ command:: + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files lock_timeout_default --value 1800 +{occ-command-example-prefix-docker} config:app:set files lock_timeout_default --value 1800 ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -86,7 +86,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files lock_timeout_max --value 86400 +{occ-command-example-prefix-docker} config:app:set files lock_timeout_max --value 86400 ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -97,7 +97,7 @@ The example below defines two lock breaker groups named `unlockers` and `admin`. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set core lock-breaker-groups --value '["unlockers","admin"]' +{occ-command-example-prefix-docker} config:app:set core lock-breaker-groups --value '["unlockers","admin"]' ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/files/mimetypes.adoc b/modules/admin_manual/pages/configuration/files/mimetypes.adoc index 8bc7bf93c..e08710170 100644 --- a/modules/admin_manual/pages/configuration/files/mimetypes.adoc +++ b/modules/admin_manual/pages/configuration/files/mimetypes.adoc @@ -109,7 +109,7 @@ use the xref:configuration/server/occ_command.adoc[occ command] to propagate the [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mimetype:update-js +{occ-command-example-prefix-docker} maintenance:mimetype:update-js ---- NOTE: Run this command inside the ownCloud Docker container. @@ -156,7 +156,7 @@ The name and location of the file are important. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mimetype:update-js +{occ-command-example-prefix-docker} maintenance:mimetype:update-js ---- + NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/files/trashbin_options.adoc b/modules/admin_manual/pages/configuration/files/trashbin_options.adoc index 64bdc1a41..d465545f3 100644 --- a/modules/admin_manual/pages/configuration/files/trashbin_options.adoc +++ b/modules/admin_manual/pages/configuration/files/trashbin_options.adoc @@ -25,7 +25,7 @@ removes all the deleted files of all users: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} trashbin:cleanup +{occ-command-example-prefix-docker} trashbin:cleanup Remove all deleted files Remove deleted files for users on backend Database user1 @@ -40,7 +40,7 @@ This example removes the deleted files of user2 and user4: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} trashbin:cleanup user2 user4 +{occ-command-example-prefix-docker} trashbin:cleanup user2 user4 Remove deleted files of user2 Remove deleted files of user4 ---- @@ -58,7 +58,7 @@ users in a space-delimited list: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} trashbin:cleanup user1 user2 +{occ-command-example-prefix-docker} trashbin:cleanup user1 user2 Remove deleted files of user1 Remove deleted files of user2 ---- diff --git a/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc b/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc index 1de829745..7f25e5d9b 100644 --- a/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc +++ b/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc @@ -212,8 +212,8 @@ a command to manually scan all apps: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} integrity:check-core -{occ-command-example-prefix} integrity:check-app +{occ-command-example-prefix-docker} integrity:check-core +{occ-command-example-prefix-docker} integrity:check-app ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc b/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc index 95f043403..32729e988 100644 --- a/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc +++ b/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc @@ -51,7 +51,7 @@ image::apps/impersonate/impersonate_enable.png[Define who can use Impersonate,wi + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ impersonate enabled --value 'yes' ---- + @@ -61,7 +61,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ impersonate enabled --value '["admin","einstein-g"]' ---- + @@ -87,7 +87,7 @@ image::apps/impersonate/impersonate_oc_admins_only.png[Impersonate for ownCloud + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_all_groupadmins --value false ---- + @@ -95,7 +95,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups --value false ---- + @@ -103,7 +103,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups_list --value '[]' ---- + @@ -117,7 +117,7 @@ image::apps/impersonate/impersonate_group_admins_only.png[Impersonate for all gr + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_all_groupadmins --value true ---- + @@ -125,7 +125,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups --value false ---- + @@ -133,7 +133,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups_list --value '[]' ---- + @@ -147,7 +147,7 @@ image::apps/impersonate/impersonate_groups_only.png[Impersonate for specific gro + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_all_groupadmins --value false ---- + @@ -155,7 +155,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups --value true ---- + @@ -163,7 +163,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups_list --value '["group1", "group2"]' ---- + diff --git a/modules/admin_manual/pages/configuration/general_topics/search.adoc b/modules/admin_manual/pages/configuration/general_topics/search.adoc index 55f79f8bf..e833ed219 100644 --- a/modules/admin_manual/pages/configuration/general_topics/search.adoc +++ b/modules/admin_manual/pages/configuration/general_topics/search.adoc @@ -50,7 +50,7 @@ To install the app, use the Marketplace app on your ownCloud server or proceed m + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:enable search_elastic +{occ-command-example-prefix-docker} app:enable search_elastic ---- NOTE: Run this command inside the ownCloud Docker container. @@ -182,7 +182,7 @@ You can at any time reset the index if required by clicking on btn:[Reset index] [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:reset +{occ-command-example-prefix-docker} search:index:reset ---- NOTE: Run this command inside the ownCloud Docker container. @@ -195,7 +195,7 @@ You can use the: + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:reset +{occ-command-example-prefix-docker} search:index:reset ---- NOTE: Run this command inside the ownCloud Docker container. @@ -208,7 +208,7 @@ List app settings:: + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:list search_elastic +{occ-command-example-prefix-docker} config:list search_elastic ---- + [source,plaintext] @@ -232,7 +232,7 @@ Set app options:: + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ search_elastic scanExternalStorages --value 0 ---- + @@ -242,7 +242,7 @@ or + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ search_elastic scanExternalStorages --value 1 ---- @@ -275,7 +275,7 @@ To do an initial full indexing without the app interfering, it can be put in _pa [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ search_elastic mode --value passive ---- @@ -285,7 +285,7 @@ or [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ search_elastic mode --value active ---- @@ -299,7 +299,7 @@ If you only want to use the Full Text Search app as a more scalable search on fi [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ search_elastic nocontent --value true ---- @@ -317,7 +317,7 @@ If you only want to use search for shared filenames, you can disable full text s [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ search_elastic group.nocontent \ --value nofulltext ---- @@ -328,7 +328,7 @@ You can also configure multiple groups by separating them with comma: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ search_elastic group.nocontent \ --value nofulltext,anothergroup,"group with blanks" ---- @@ -346,7 +346,7 @@ When everything has been set up and configured, you can initiate creating the in [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:create +{occ-command-example-prefix-docker} search:index:create ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc b/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc index 2b2607d0f..50e5d237b 100644 --- a/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc @@ -18,7 +18,7 @@ As an example: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} background:cron +{occ-command-example-prefix-docker} background:cron ---- NOTE: Run this command inside the ownCloud Docker container. @@ -93,7 +93,7 @@ There is no way to do so via the ownCloud UI. But, the most direct way to do so, [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} system:cron +{occ-command-example-prefix-docker} system:cron ---- NOTE: Run this command inside the ownCloud Docker container. @@ -130,7 +130,7 @@ The ExpireTrash job, contained in `OCA\Files_Trashbin\BackgroundJob\ExpireTrash` [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} trashbin:expire +{occ-command-example-prefix-docker} trashbin:expire ---- NOTE: Run this command inside the ownCloud Docker container. @@ -141,7 +141,7 @@ The ExpireVersions job, contained in `OCA\Files_Versions\BackgroundJob\ExpireVer [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} versions:expire +{occ-command-example-prefix-docker} versions:expire ---- NOTE: Run this command inside the ownCloud Docker container. @@ -154,7 +154,7 @@ The `CardDAV SyncJob`, contained in `OCA\DAV\CardDAV\SyncJob`, syncs the local s [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} dav:sync-system-addressbook +{occ-command-example-prefix-docker} dav:sync-system-addressbook ---- NOTE: Run this command inside the ownCloud Docker container. @@ -168,7 +168,7 @@ xref:configuration/server/occ_command.adoc#federation-sync[OCC federation sync] [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} federation:sync-addressbooks +{occ-command-example-prefix-docker} federation:sync-addressbooks ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/config_sample_php_parameters.adoc b/modules/admin_manual/pages/configuration/server/config_sample_php_parameters.adoc index a307140fb..2aff529c9 100644 --- a/modules/admin_manual/pages/configuration/server/config_sample_php_parameters.adoc +++ b/modules/admin_manual/pages/configuration/server/config_sample_php_parameters.adoc @@ -820,7 +820,7 @@ Note that the above rule is not valid in every case, as there are some rare setu cases where this may not apply. However, to avoid any update problems this configuration value is explicitly opt-in. -After setting this value run `{occ-command-example-prefix} maintenance:update:htaccess`. Now, when the +After setting this value run `{occ-command-example-prefix-docker} maintenance:update:htaccess`. Now, when the following conditions are met ownCloud URLs won't contain `index.php`: - `mod_rewrite` is installed @@ -1850,7 +1850,7 @@ and MySQL can handle 4 byte characters instead of 3 byte characters. If you want to convert an existing 3-byte setup into a 4-byte setup please set the parameters in MySQL as mentioned below and run the migration command: -`{occ-command-example-prefix} db:convert-mysql-charset` +`{occ-command-example-prefix-docker} db:convert-mysql-charset` The config setting will be set automatically after a successful run. Consult the documentation for more details. @@ -2341,7 +2341,7 @@ We strongly encourage you never to use it in production. === Define the data-fingerprint of the current data served This is a property used by the clients to find out if a backup has been restored on the server. Once a backup is restored run -{occ-command-example-prefix} maintenance:data-fingerprint +{occ-command-example-prefix-docker} maintenance:data-fingerprint To set this to a new value. Updating/Deleting this value can make connected clients stall until diff --git a/modules/admin_manual/pages/configuration/server/harden_server.adoc b/modules/admin_manual/pages/configuration/server/harden_server.adoc index cf8779f11..958dd28db 100644 --- a/modules/admin_manual/pages/configuration/server/harden_server.adoc +++ b/modules/admin_manual/pages/configuration/server/harden_server.adoc @@ -33,7 +33,7 @@ This information is obtained by running xref:configuration/server/occ_command.ad [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} security:routes +{occ-command-example-prefix-docker} security:routes ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc b/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc index 3cbdeaf39..06a360279 100644 --- a/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc @@ -47,8 +47,8 @@ From the command line, you can use the `occ config:app:get` and `occ config:app: Get the current values, if any, for the Imprint and Privacy Policy URLs: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:get core legal.imprint_url -{occ-command-example-prefix} config:app:get core legal.privacy_policy_url +{occ-command-example-prefix-docker} config:app:get core legal.imprint_url +{occ-command-example-prefix-docker} config:app:get core legal.privacy_policy_url ---- NOTE: Run this command inside the ownCloud Docker container. @@ -56,8 +56,8 @@ NOTE: Run this command inside the ownCloud Docker container. Set the Imprint and Privacy Policy URLs: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set core legal.imprint_url --value=new_value -{occ-command-example-prefix} config:app:set core legal.privacy_policy_url --value=new_value +{occ-command-example-prefix-docker} config:app:set core legal.imprint_url --value=new_value +{occ-command-example-prefix-docker} config:app:set core legal.privacy_policy_url --value=new_value ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_command.adoc b/modules/admin_manual/pages/configuration/server/occ_command.adoc index 609d3baa0..6f5ee4c78 100644 --- a/modules/admin_manual/pages/configuration/server/occ_command.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_command.adoc @@ -19,9 +19,9 @@ All `occ` commands must be run inside the running ownCloud Docker container. The To run a single `occ` command without entering the container, use `docker compose exec` from the directory containing your `docker-compose.yml`: -[source,bash] +[source,docker,subs="attributes+"] ---- -docker compose exec owncloud occ +{occ-command-example-prefix-docker} ---- [[docker-exec]] @@ -62,9 +62,9 @@ occ [options] command [arguments] Running `occ` with no options lists all commands and options, like this example on Ubuntu: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} +{occ-command-example-prefix-docker} ownCloud version 11.0.0 Usage: @@ -91,27 +91,27 @@ Available commands: ... ---- -This is the same as `{occ-command-example-prefix} list`. +This is the same as `{occ-command-example-prefix-docker} list`. Run it with the `-h` option for syntax help: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} -h +{occ-command-example-prefix-docker} -h ---- Display your ownCloud version: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} -V +{occ-command-example-prefix-docker} -V ownCloud version 11.0.0 ---- Query your ownCloud server status: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} status +{occ-command-example-prefix-docker} status - installed: true - version: 11.0.0.0 - versionstring: 11.0.0 @@ -122,17 +122,17 @@ The `status` command from above has an option to define the output format. The default is plain text, but it can also be `json`: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} status --output=json +{occ-command-example-prefix-docker} status --output=json {"installed":true,"version":"11.0.0.0","versionstring":"11.0.0","edition":""} ---- or `json_pretty`: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} status --output=json_pretty +{occ-command-example-prefix-docker} status --output=json_pretty { "installed": true, "version": "11.0.0.0", @@ -145,9 +145,9 @@ This output option is available on all list and list-like commands, which includ Get detailed information on individual commands with the `help` command, like in this example for the `maintenance:mode` command: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} help maintenance:mode --help +{occ-command-example-prefix-docker} help maintenance:mode --help Usage: maintenance:mode [options] @@ -178,8 +178,6 @@ include::./occ_commands/core_commands/_config_commands.adoc[leveloffset=+2] include::./occ_commands/core_commands/_config_reports_commands.adoc[leveloffset=+2] -include::./occ_commands/core_commands/_command_line_installation_commands.adoc[leveloffset=+2] - include::./occ_commands/core_commands/_command_line_upgrade_commands.adoc[leveloffset=+2] include::./occ_commands/core_commands/_dav_commands.adoc[leveloffset=+2] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_2fa_app_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_2fa_app_commands.adoc index 4d0ed815f..5e8cfe5eb 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_2fa_app_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_2fa_app_commands.adoc @@ -17,9 +17,9 @@ The following commands are available for the 2-Factor Authentication app: Delete the redundant secrets of non-existing users: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} twofactor_totp:delete-redundant-secret +{occ-command-example-prefix-docker} twofactor_totp:delete-redundant-secret ---- NOTE: Run this command inside the ownCloud Docker container. @@ -28,9 +28,9 @@ NOTE: Run this command inside the ownCloud Docker container. Set secret verification status of specified users or all users: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} twofactor_totp:set-secret-verification-status [options] [--] +{occ-command-example-prefix-docker} twofactor_totp:set-secret-verification-status [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_activity_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_activity_commands.adoc index d7f13996e..c262c5754 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_activity_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_activity_commands.adoc @@ -12,9 +12,9 @@ The `activity` command is used for sending automated activity email notification The `activity:send-emails` command sends all pending activity emails immediately, regardless of the time they are scheduled. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} activity:send-emails +{occ-command-example-prefix-docker} activity:send-emails ---- NOTE: Run this command inside the ownCloud Docker container. @@ -25,27 +25,27 @@ Starting with Activity app version 2.7.0, rename and move action notifications c === Enable Rename and Move Action Notifications -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set activity enable_move_and_rename_activities --value "yes" +{occ-command-example-prefix-docker} config:app:set activity enable_move_and_rename_activities --value "yes" ---- NOTE: Run this command inside the ownCloud Docker container. === Disable Rename and Move Action Notifications -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set activity enable_move_and_rename_activities --value "no" +{occ-command-example-prefix-docker} config:app:set activity enable_move_and_rename_activities --value "no" ---- NOTE: Run this command inside the ownCloud Docker container. or -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:delete activity enable_move_and_rename_activities +{occ-command-example-prefix-docker} config:app:delete activity enable_move_and_rename_activities ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_admin_audit_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_admin_audit_commands.adoc index 11c31b433..9179ec3c4 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_admin_audit_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_admin_audit_commands.adoc @@ -11,9 +11,9 @@ Ignore all CLI triggered events. To ignore all CLI triggered events, you can set the following option, defaults to track cli events: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ "admin_audit ignore_cli_events" \ --value "yes" ---- @@ -24,9 +24,9 @@ NOTE: Run this command inside the ownCloud Docker container. This command reads the value of `admin_audit ignore_cli_events`: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:get "admin_audit ignore_cli_events" +{occ-command-example-prefix-docker} config:app:get "admin_audit ignore_cli_events" ---- NOTE: Run this command inside the ownCloud Docker container. @@ -40,9 +40,9 @@ yes This command completely removes the key and the value: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:delete "admin_audit ignore_cli_events" +{occ-command-example-prefix-docker} config:app:delete "admin_audit ignore_cli_events" ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_antivirus_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_antivirus_commands.adoc index 4df727680..1393ff299 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_antivirus_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_antivirus_commands.adoc @@ -7,9 +7,9 @@ Parametrisation must be done with the `occ config` command set. == List the Current Settings -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:list files_antivirus +{occ-command-example-prefix-docker} config:list files_antivirus ---- NOTE: Run this command inside the ownCloud Docker container. @@ -18,9 +18,9 @@ NOTE: Run this command inside the ownCloud Docker container. To set a new value, use the command below and replace `` and value `` accordingly. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_antivirus --value= --update-only +{occ-command-example-prefix-docker} config:app:set files_antivirus --value= --update-only ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_brute_force_protection_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_brute_force_protection_commands.adoc index 21b6ca2f1..26cfd12a5 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_brute_force_protection_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_brute_force_protection_commands.adoc @@ -8,9 +8,9 @@ The combination of `uid` and `IP address` is used to trigger the ban. == List the Current Settings -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:list brute_force_protection +{occ-command-example-prefix-docker} config:list brute_force_protection ---- NOTE: Run this command inside the ownCloud Docker container. @@ -19,9 +19,9 @@ NOTE: Run this command inside the ownCloud Docker container. To set a new value, use the command below and replace `` and value `` accordingly. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set brute_force_protection --value= --update-only +{occ-command-example-prefix-docker} config:app:set brute_force_protection --value= --update-only ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_custom_groups.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_custom_groups.adoc index 276181f1d..344a72a04 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_custom_groups.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_custom_groups.adoc @@ -16,9 +16,9 @@ You can get the value of a current setting. For details how to do so see the xre By default, administrators can administrate custom groups of an instance. When changed, only group admins can administrate custom groups. You can change this behaviour with the following command: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:set \ +{occ-command-example-prefix-docker} config:system:set \ customgroups.disallow-admin-access-all \ --type boolean --value true ---- @@ -36,9 +36,9 @@ This occ command will create a key-value pair in your config.php which must be w You can hide custom groups from a user's personal settings page based on a user's group membership. This makes it easier to collect users you want to exclude into defined groups which will be further used for this setting: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:set \ +{occ-command-example-prefix-docker} config:system:set \ customgroups.disallowed-groups \ --type json \ --value '["no_guest_app_users", "project5"]' @@ -61,9 +61,9 @@ This occ command will create a key-value pair in your config.php which must be w This setting defines if ordinary users are allowed to create custom groups. By default, all users can create custom groups, but this can be restricted to admins (if allowed as above) and group-admins. Values to be set can be 'true' and 'false', defaults to 'false'. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ customgroups \ only_subadmin_can_create \ --value 'true' @@ -75,9 +75,9 @@ NOTE: Run this command inside the ownCloud Docker container. This setting defines if an existing ordinary group member is allowed to add other users to the target group or remove them. By default, all users can add members to groups, but this can be restricted to admins (if allowed as above) and group-admins. Values to be set can be 'yes' and 'no', defaults to 'no'. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ core \ shareapi_only_share_with_group_members \ --value 'yes' @@ -89,9 +89,9 @@ NOTE: Run this command inside the ownCloud Docker container. This setting allows the creation of multiple groups with the same display name. By default, group display names must be unique, but it can be be allowed to have multiple identical group display names. Values to be set can be 'true' and 'false', defaults to 'false'. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ customgroups \ allow_duplicate_names \ --value 'false' diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_data_exporter_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_data_exporter_commands.adoc index 5716d2428..75da0998e 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_data_exporter_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_data_exporter_commands.adoc @@ -19,9 +19,9 @@ The following commands are available for the Data Exporter app: == Export User Data -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} instance:export:user +{occ-command-example-prefix-docker} instance:export:user ---- NOTE: Run this command inside the ownCloud Docker container. @@ -36,9 +36,9 @@ NOTE: Run this command inside the ownCloud Docker container. == Import User Data -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} instance:import:user [options] [--] +{occ-command-example-prefix-docker} instance:import:user [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -61,9 +61,9 @@ NOTE: Run this command inside the ownCloud Docker container. == Migrate Shares -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} instance:export:migrate:share +{occ-command-example-prefix-docker} instance:export:migrate:share ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_files_lifecycle.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_files_lifecycle.adoc index 32de07b15..9c6d29148 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_files_lifecycle.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_files_lifecycle.adoc @@ -2,8 +2,7 @@ Marketplace URL: {oc-marketplace-url}/apps/files_lifecycle[File Lifecycle Management] -The File Lifecycle Management extension allows service providers to manage the lifecycle of files within ownCloud. For details please see the -xref:enterprise/file_management/files_lifecycle.adoc[File Lifecycle Management] documentation. +The File Lifecycle Management extension allows service providers to manage the lifecycle of files within ownCloud. For details please see the xref:enterprise/file_management/files_lifecycle.adoc[File Lifecycle Management] documentation. The `lifecycle` commands configure the File Lifecycle Management app. @@ -42,9 +41,9 @@ lifecycle Archive files which have reached a certain age. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} lifecycle:archive [options] +{occ-command-example-prefix-docker} lifecycle:archive [options] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -62,9 +61,9 @@ NOTE: Run this command inside the ownCloud Docker container. Expire files from archive which have reached a certain age. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} lifecycle:expire [options] +{occ-command-example-prefix-docker} lifecycle:expire [options] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -82,9 +81,9 @@ NOTE: Run this command inside the ownCloud Docker container. Restore files from archive to the original location. Note that the location for archived files always follows the pattern `$userid/archive/files/...` -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} lifecycle:restore +{occ-command-example-prefix-docker} lifecycle:restore ---- NOTE: Run this command inside the ownCloud Docker container. @@ -101,9 +100,9 @@ NOTE: Run this command inside the ownCloud Docker container. Restore all files in folder `project1` for user alice with path `/work/projects/project1` -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} lifecycle:restore /alice/archive/files/work/projects/project1 +{occ-command-example-prefix-docker} lifecycle:restore /alice/archive/files/work/projects/project1 ---- NOTE: Run this command inside the ownCloud Docker container. @@ -112,9 +111,9 @@ NOTE: Run this command inside the ownCloud Docker container. Restore all archived files for all users in the system back to their original locations. This command has no additional arguments or options. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} lifecycle:restore-all +{occ-command-example-prefix-docker} lifecycle:restore-all ---- NOTE: Run this command inside the ownCloud Docker container. @@ -126,9 +125,9 @@ Set upload time for files which do not have one. NOTE: Files without upload time are silently skipped by `occ lifecycle:archive` This can happen with files that were uploaded before the files_lifecycle app was configured or when it was temporarily disabled and therefore do not have an upload time set. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} lifecycle:set-upload-time [options] [--] +{occ-command-example-prefix-docker} lifecycle:set-upload-time [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -160,9 +159,9 @@ The number of days since upload (or restore) after which files will be archived. The following example command sets the time passed since upload (or restore) for archiving files to 90 days. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_lifecycle archive_period --value='90' +{occ-command-example-prefix-docker} config:app:set files_lifecycle archive_period --value='90' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -173,9 +172,9 @@ The number of days since archiving after which files will be permanently deleted The following example command sets the time passed to delete files to 180 days. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_lifecycle expire_period --value='180' +{occ-command-example-prefix-docker} config:app:set files_lifecycle expire_period --value='180' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -186,9 +185,9 @@ Define groups of users that are exempt from the lifecycle policies (comma-separa The following example command specifies groups whose members will not be part of the lifecycle management. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_lifecycle excluded_groups --value='group1,group2' +{occ-command-example-prefix-docker} config:app:set files_lifecycle excluded_groups --value='group1,group2' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -199,9 +198,9 @@ Set a policy who can restore files. Use the value `soft` for self-service and `h The following example command sets the restoration policy for users to `soft` (default). -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_lifecycle policy --value='soft' +{occ-command-example-prefix-docker} config:app:set files_lifecycle policy --value='soft' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -212,18 +211,18 @@ Disable the whole user interface for the File Lifecycle Management app. The following example command disables the user interface for the File Lifecycle Management app. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_lifecycle disable_ui --value='yes' +{occ-command-example-prefix-docker} config:app:set files_lifecycle disable_ui --value='yes' ---- NOTE: Run this command inside the ownCloud Docker container. You can reenable it by deleting the key: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:delete files_lifecycle disable_ui +{occ-command-example-prefix-docker} config:app:delete files_lifecycle disable_ui ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_full_text_search_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_full_text_search_commands.adoc index 9c4a4b596..5c86cf11a 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_full_text_search_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_full_text_search_commands.adoc @@ -24,9 +24,9 @@ In addition to the settings provided by the Full Text Search app, you can set/re The command `search:index:create` creates the initial full text search index for one or all users. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:create ()... +{occ-command-example-prefix-docker} search:index:create ()... ---- NOTE: Run this command inside the ownCloud Docker container. @@ -52,9 +52,9 @@ A full text search index is created for all users, if this value is omitted. This example creates a full text search index for the user with user id `testuser`. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:create testuser +{occ-command-example-prefix-docker} search:index:create testuser Indexing user testuser ---- @@ -65,9 +65,9 @@ NOTE: Run this command inside the ownCloud Docker container. This example creates a full text search index for the users with user ids `admin` and `testuser`. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:create admin testuser +{occ-command-example-prefix-docker} search:index:create admin testuser Indexing user admin Indexing user testuser @@ -79,9 +79,9 @@ NOTE: Run this command inside the ownCloud Docker container. Fill a secondary index based on the indexed data we have. Files not matching the "indexed" status will be ignored. This is intended to be used in index data migrations, so the connector for this secondary index should have been configured as "write connector". See the xref:configuration/general_topics/search.adoc[Full Text Search] documentation for more details. Note that the values of the `connector_name` are hardcoded and have to be written as described. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:fillSecondary [options] [--] ... +{occ-command-example-prefix-docker} search:index:fillSecondary [options] [--] ... ---- NOTE: Run this command inside the ownCloud Docker container. @@ -120,9 +120,9 @@ Rebuild the index for a given user. All the indexes associated with the configur If you want to rebuild the whole index, run `search:index:reset` and then `search:index:create --all`. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:rebuild ()... +{occ-command-example-prefix-docker} search:index:rebuild ()... ---- NOTE: Run this command inside the ownCloud Docker container. @@ -150,9 +150,9 @@ NOTE: Run this command inside the ownCloud Docker container. This example rebuilds the full text search index for the user with user ID `testuser`. .Rebuild the index for a single user -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:rebuild testuser +{occ-command-example-prefix-docker} search:index:rebuild testuser Indexing user testuser @@ -170,9 +170,9 @@ NOTE: Run this command inside the ownCloud Docker container. This example rebuilds the full text search index for the users with user IDs `admin` and `testuser`. .Rebuild the index for multiple users -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:rebuild admin testuser +{occ-command-example-prefix-docker} search:index:rebuild admin testuser This will delete all search index data for admin, testuser! Do you want to proceed? [0] no @@ -188,19 +188,19 @@ NOTE: Run this command inside the ownCloud Docker container. The entire index can be rebuilt by running the following two commands: -[source="console",subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:reset -{occ-command-example-prefix} search:index:create --all +{occ-command-example-prefix-docker} search:index:reset +{occ-command-example-prefix-docker} search:index:create --all ---- == Reset the Full Text Search Index Reset all the configured indexes. Changes in the configuration of the indexes associated with the configured connectors will take place. All the data in those indexes will be removed, so you'll need to rebuild the indexes, usually with "search:index:rebuild". -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:reset +{occ-command-example-prefix-docker} search:index:reset ---- NOTE: Run this command inside the ownCloud Docker container. @@ -215,9 +215,9 @@ NOTE: Run this command inside the ownCloud Docker container. === Example -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:reset +{occ-command-example-prefix-docker} search:index:reset This will delete the whole search index! Do you want to proceed? [0] no [1] yes @@ -231,9 +231,9 @@ NOTE: Run this command inside the ownCloud Docker container. Updates to the search index due to changed content or changed metadata are happening via background jobs that are added to a queue. These background jobs are normally run by the ownCloud cronjob. The command `search:index:update` updates the full text search index by running all pending background jobs. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:update +{occ-command-example-prefix-docker} search:index:update ---- NOTE: Run this command inside the ownCloud Docker container. @@ -250,9 +250,9 @@ NOTE: Run this command inside the ownCloud Docker container. This example updates the full text search index for all users. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} search:index:update +{occ-command-example-prefix-docker} search:index:update Start Updating the Elastic search index: No pending jobs found. ---- @@ -263,9 +263,9 @@ NOTE: Run this command inside the ownCloud Docker container. To do an initial full indexing without the Full Text Search app interfering, it can be put in passive mode. See the xref:configuration/general_topics/search.adoc#app-modes[App Modes] section in the Full Text Search description for details. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ search_elastic mode --value passive ---- @@ -273,9 +273,9 @@ NOTE: Run this command inside the ownCloud Docker container. Switching back to active mode can be done by running the following command: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ search_elastic mode --value active ---- @@ -287,9 +287,9 @@ Search results can be restricted in different ways, see the xref:configuration/g === Index Metadata Only -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ search_elastic nocontent --value true ---- @@ -297,9 +297,9 @@ NOTE: Run this command inside the ownCloud Docker container. Switching back to provide all content search results can be done by running the following command: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ search_elastic nocontent --value false ---- @@ -307,9 +307,9 @@ NOTE: Run this command inside the ownCloud Docker container. === Limit Metadata Search for Groups -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ search_elastic group.nocontent \ --value group1,group2,"group with blank" ---- diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ldap_integration_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ldap_integration_commands.adoc index c365fe984..1f3d9e135 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ldap_integration_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ldap_integration_commands.adoc @@ -19,9 +19,9 @@ ldap Search for an LDAP user, using this syntax: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:search [options] [--] +{occ-command-example-prefix-docker} ldap:search [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -114,9 +114,9 @@ The best way understanding `offset` and `limit` is the following table when usin Searches match at the beginning of the attribute value only. This example searches for `givenNames` that start with 'rob': -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:search "rob" +{occ-command-example-prefix-docker} ldap:search "rob" ---- NOTE: Run this command inside the ownCloud Docker container. @@ -124,18 +124,18 @@ NOTE: Run this command inside the ownCloud Docker container. This will find "robbie", "roberta", and "robin". Broaden the search to find, for example, `jeroboam` with the asterisk wildcard: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:search "*rob" +{occ-command-example-prefix-docker} ldap:search "*rob" ---- NOTE: Run this command inside the ownCloud Docker container. The following examples use `offset` and `limit` options: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:search "re" +{occ-command-example-prefix-docker} ldap:search "re" Rebecca OShea (Rebecca.OShea) Rebecca Vintin (Rebecca.Vintin) Rebekka Da-Cahuna (Rebekka.Da-Cahuna) @@ -145,9 +145,9 @@ Rekha Craft (Rekha.Craft) NOTE: Run this command inside the ownCloud Docker container. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:search "re" --offset 0 --limit 3 +{occ-command-example-prefix-docker} ldap:search "re" --offset 0 --limit 3 Rebecca OShea (Rebecca.OShea) Rebecca Vintin (Rebecca.Vintin) Rebekka Da-Cahuna (Rebekka.Da-Cahuna) @@ -155,9 +155,9 @@ Rebekka Da-Cahuna (Rebekka.Da-Cahuna) NOTE: Run this command inside the ownCloud Docker container. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:search "re" --offset 3 --limit 3 +{occ-command-example-prefix-docker} ldap:search "re" --offset 3 --limit 3 Rekha Cox (Rekha.Cox) Rekha Craft (Rekha.Craft) ---- @@ -191,18 +191,18 @@ ldap:check-user [options] [--] Example: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:check-user robert +{occ-command-example-prefix-docker} ldap:check-user robert ---- NOTE: Run this command inside the ownCloud Docker container. `ldap:check-user` will not run a check when it finds a disabled LDAP connection. This prevents users that exist on disabled LDAP connections from being marked as deleted. If you know for sure that the user you are searching for is not in one of the disabled connections and exists on an active connection, use the `--force` option to force a check of all active LDAP connections. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:check-user --force robert +{occ-command-example-prefix-docker} ldap:check-user --force robert ---- NOTE: Run this command inside the ownCloud Docker container. @@ -228,7 +228,7 @@ Configurations that you create without assigning a are automatically [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:create-empty-config +{occ-command-example-prefix-docker} ldap:create-empty-config Created new configuration with configID 's01' ---- @@ -240,7 +240,7 @@ You can list and view your configurations: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:show-config [options] [--] [] +{occ-command-example-prefix-docker} ldap:show-config [options] [--] [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -268,18 +268,18 @@ NOTE: Run this command inside the ownCloud Docker container. If you omit the `configID`, all configuration ID's with their settings are listed: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:show-config +{occ-command-example-prefix-docker} ldap:show-config ---- NOTE: Run this command inside the ownCloud Docker container. View the configuration for a single `configID`: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:show-config s01 +{occ-command-example-prefix-docker} ldap:show-config s01 ---- NOTE: Run this command inside the ownCloud Docker container. @@ -301,9 +301,9 @@ Deletes an existing LDAP configuration. | The configuration ID |=== -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:delete s01 +{occ-command-example-prefix-docker} ldap:delete s01 Deleted configuration with configID 's01' ---- @@ -313,9 +313,9 @@ NOTE: Run this command inside the ownCloud Docker container. This command invalidates the LDAP cache for all users: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:invalidate-cache +{occ-command-example-prefix-docker} ldap:invalidate-cache ---- NOTE: Run this command inside the ownCloud Docker container. @@ -324,9 +324,9 @@ NOTE: Run this command inside the ownCloud Docker container. This command manipulates LDAP configurations. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:set-config +{occ-command-example-prefix-docker} ldap:set-config ---- NOTE: Run this command inside the ownCloud Docker container. @@ -349,9 +349,9 @@ If a `configKey` allows multiple entries like the key `ldapAttributesForUserSear This example sets search attributes: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:set-config s01 ldapAttributesForUserSearch "cn;givenname;sn;displayname;mail" +{occ-command-example-prefix-docker} ldap:set-config s01 ldapAttributesForUserSearch "cn;givenname;sn;displayname;mail" ---- NOTE: Run this command inside the ownCloud Docker container. @@ -418,9 +418,9 @@ Available keys, along with default values for configValue, are listed in the tab Tests whether your configuration is correct and can bind to the server. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:test-config +{occ-command-example-prefix-docker} ldap:test-config ---- NOTE: Run this command inside the ownCloud Docker container. @@ -435,9 +435,9 @@ NOTE: Run this command inside the ownCloud Docker container. Example: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:test-config s01 +{occ-command-example-prefix-docker} ldap:test-config s01 The configuration is valid and the connection could be established! ---- @@ -445,9 +445,9 @@ NOTE: Run this command inside the ownCloud Docker container. == Set and Unset LDAP App Configurations -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set user_ldap updateAttributesInterval --value=7200 +{occ-command-example-prefix-docker} config:app:set user_ldap updateAttributesInterval --value=7200 ---- NOTE: Run this command inside the ownCloud Docker container. @@ -462,9 +462,9 @@ Config value updateAttributesInterval for app user_ldap set to 7200 If you want to reset (or unset) the setting, then you can use the following command: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:delete user_ldap updateAttributesInterval +{occ-command-example-prefix-docker} config:app:delete user_ldap updateAttributesInterval ---- NOTE: Run this command inside the ownCloud Docker container. @@ -475,9 +475,9 @@ If you want to allow new LDAP logins to attempt to reuse existing `oc_accounts` Below is an example of how to do so. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set user_ldap reuse_accounts --value="yes" +{occ-command-example-prefix-docker} config:app:set user_ldap reuse_accounts --value="yes" ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_market_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_market_commands.adoc index 243809147..93fb3a0e1 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_market_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_market_commands.adoc @@ -31,9 +31,9 @@ To install an application from the Marketplace, you need to supply the app’s i For example, the URL for _Two factor backup codes_ is {oc-marketplace-url}/apps/twofactor_backup_codes. So its app id is `twofactor_backup_codes`. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} market:install [option] +{occ-command-example-prefix-docker} market:install [option] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -59,13 +59,13 @@ Only `zip`, `gzip`, and `bzip2` archives are supported. == Usage Example -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- # Install an app from the marketplace. -{occ-command-example-prefix} market:install twofactor_backup_codes +{occ-command-example-prefix-docker} market:install twofactor_backup_codes # Install an app from a local archive. -{occ-command-example-prefix} market:install -l /mnt/data/richdocuments-2.0.0.tar.gz +{occ-command-example-prefix-docker} market:install -l /mnt/data/richdocuments-2.0.0.tar.gz ---- NOTE: Run this command inside the ownCloud Docker container. @@ -76,9 +76,9 @@ NOTE: The target directory has to be *accessible to the webserver user* and you To uninstall an application use the following commands: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} market:uninstall +{occ-command-example-prefix-docker} market:uninstall ---- NOTE: Run this command inside the ownCloud Docker container. @@ -95,9 +95,9 @@ NOTE: Run this command inside the ownCloud Docker container. This command lists apps available on the marketplace. It returns the ids of the apps. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} market:list +{occ-command-example-prefix-docker} market:list ---- NOTE: Run this command inside the ownCloud Docker container. @@ -106,9 +106,9 @@ NOTE: Run this command inside the ownCloud Docker container. Install new app versions if available on the marketplace by using following commands: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} market:upgrade [options] +{occ-command-example-prefix-docker} market:upgrade [options] ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_metrics_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_metrics_commands.adoc index 7d4094856..47acee509 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_metrics_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_metrics_commands.adoc @@ -21,9 +21,9 @@ Writes the key `metrics_shared_secret` and the secret to config.php. The name mu Note: You can also set the config key/value manually into your config.php file. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:set \ +{occ-command-example-prefix-docker} config:system:set \ "metrics_shared_secret" \ --value "your-metrics-secret" ---- @@ -41,9 +41,9 @@ The above command adds the following at the end of `config.php`: This command reads the value of the `metrics_shared_secret` key from config.php: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:get "metrics_shared_secret" +{occ-command-example-prefix-docker} config:system:get "metrics_shared_secret" ---- NOTE: Run this command inside the ownCloud Docker container. @@ -57,9 +57,9 @@ your-metrics-secret This command completely removes the key and the value from config.php: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:delete "metrics_shared_secret" +{occ-command-example-prefix-docker} config:system:delete "metrics_shared_secret" ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_kitworks_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_kitworks_commands.adoc index cc71e4b2f..1cc54ac55 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_kitworks_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_kitworks_commands.adoc @@ -23,9 +23,9 @@ The following commands manage the migration of ownCloud to Kiteworks: To start the migration, it must be initialized first: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-kiteworks:init KW_HOST KW_APPLICATION_ID "KW_SECRET" +{occ-command-example-prefix-docker} migrate:to-kiteworks:init KW_HOST KW_APPLICATION_ID "KW_SECRET" ---- NOTE: Run this command inside the ownCloud Docker container. @@ -56,9 +56,9 @@ NOTE: Run this command inside the ownCloud Docker container. After initialisation, the migration must be verified to be ready: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-kiteworks:verify $KW_ADMIN_USER +{occ-command-example-prefix-docker} migrate:to-kiteworks:verify $KW_ADMIN_USER ---- NOTE: Run this command inside the ownCloud Docker container. @@ -83,9 +83,9 @@ NOTE: Run this command inside the ownCloud Docker container. After verification, migrating users can be started: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-kiteworks:users $KW_ADMIN_USER $KW_PROFILE_GUEST +{occ-command-example-prefix-docker} migrate:to-kiteworks:users $KW_ADMIN_USER $KW_PROFILE_GUEST ---- NOTE: Run this command inside the ownCloud Docker container. @@ -113,9 +113,9 @@ NOTE: Run this command inside the ownCloud Docker container. After migrating users, migrating files can be started: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-kiteworks:files $KW_ADMIN_USER +{occ-command-example-prefix-docker} migrate:to-kiteworks:files $KW_ADMIN_USER ---- NOTE: Run this command inside the ownCloud Docker container. @@ -140,9 +140,9 @@ NOTE: Run this command inside the ownCloud Docker container. After migrating files, shares can be migrated. Note that when initiating this step, migrating files and users cant be run again: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-kiteworks:shares $KW_ADMIN_USER +{occ-command-example-prefix-docker} migrate:to-kiteworks:shares $KW_ADMIN_USER ---- NOTE: Run this command inside the ownCloud Docker container. @@ -167,9 +167,9 @@ NOTE: Run this command inside the ownCloud Docker container. After migrating shares, the final step can be processed. This is to disable migrated users in Kiteworks that are disabled in ownCloud: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-kiteworks:disable-users $KW_ADMIN_USER +{occ-command-example-prefix-docker} migrate:to-kiteworks:disable-users $KW_ADMIN_USER ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_ocis_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_ocis_commands.adoc index 18433d3d3..e1a2bcfa8 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_ocis_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_ocis_commands.adoc @@ -22,9 +22,9 @@ The following commands manage the migration of ownCloud to oCIS: To start the migration, it must be initialized first: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-ocis:init OCIS_HOST +{occ-command-example-prefix-docker} migrate:to-ocis:init OCIS_HOST ---- === Arguments @@ -50,9 +50,9 @@ To start the migration, it must be initialized first: After initialization, verify that the ownCloud instance meets all requirements for migration: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-ocis:verify +{occ-command-example-prefix-docker} migrate:to-ocis:verify ---- === Options @@ -69,7 +69,7 @@ After verification, migrate the ownCloud users to oCIS: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-ocis:migrate:users +{occ-command-example-prefix-docker} migrate:to-ocis:migrate:users ---- === Arguments @@ -92,9 +92,9 @@ After verification, migrate the ownCloud users to oCIS: After migrating users, assign a role to all migrated users. The available roles are fetched from the oCIS instance and the role to assign is selected interactively: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-ocis:assign-role +{occ-command-example-prefix-docker} migrate:to-ocis:assign-role ---- === Arguments @@ -111,9 +111,9 @@ NOTE: This step is mandatory and cannot be skipped. After assigning roles, migrate the ownCloud groups to oCIS: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-ocis:migrate:groups +{occ-command-example-prefix-docker} migrate:to-ocis:migrate:groups ---- === Arguments @@ -136,9 +136,9 @@ After assigning roles, migrate the ownCloud groups to oCIS: After migrating groups, migrate each user's files to oCIS using the rclone binary bundled with the app. oCIS impersonation via the auth-app is used to access each user's account: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-ocis:migrate:files +{occ-command-example-prefix-docker} migrate:to-ocis:migrate:files ---- === Arguments @@ -153,9 +153,9 @@ After migrating groups, migrate each user's files to oCIS using the rclone binar After migrating files, migrate all user, group, and link shares. oCIS impersonation via the auth-app is used to access each user's account: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrate:to-ocis:migrate:shares +{occ-command-example-prefix-docker} migrate:to-ocis:migrate:shares ---- === Arguments diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_oauth2_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_oauth2_commands.adoc index f2975131a..3eebaba37 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_oauth2_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_oauth2_commands.adoc @@ -17,9 +17,9 @@ oauth2 === Usage -[source,plaintext] +[source,docker,subs="attributes+"] ---- -oauth2:add-client [ [ []]] +{occ-command-example-prefix-docker} oauth2:add-client [ [ []]] ---- === Arguments @@ -52,9 +52,9 @@ oauth2:add-client [ +{occ-command-example-prefix-docker} oauth2:modify-client ---- === Arguments @@ -119,9 +119,9 @@ oauth2:modify-client === Usage -[source,plaintext] +[source,docker,subs="attributes+"] ---- -oauth2:remove-client +{occ-command-example-prefix-docker} oauth2:remove-client ---- === Arguments diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_password_policy_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_password_policy_commands.adoc index ecc8c3e97..1995e27e8 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_password_policy_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_password_policy_commands.adoc @@ -6,9 +6,9 @@ Command to expire a user or group of users’ passwords. == Command Description -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:expire-password [] +{occ-command-example-prefix-docker} user:expire-password [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -56,19 +56,19 @@ The password for frank is set to expire on 2018-07-12 13:15:28 UTC. == Command Examples -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- # The password for user "frank" will be set as being expired 24 hours before the command was run. -{occ-command-example-prefix} user:expire-password -u frank +{occ-command-example-prefix-docker} user:expire-password -u frank # Expire the user "frank"'s password in 2 days time. -{occ-command-example-prefix} user:expire-password -u frank '+2 days' +{occ-command-example-prefix-docker} user:expire-password -u frank '+2 days' # Expire the user "frank"'s password on the 15th of August 2005, at 15:52:01 in the local timezone. -{occ-command-example-prefix} user:expire-password --uid frank '2005-08-15T15:52:01+00:00' +{occ-command-example-prefix-docker} user:expire-password --uid frank '2005-08-15T15:52:01+00:00' # Expire the user "frank"'s password on the 15th of August 2005, at 15:52:01 UTC. -{occ-command-example-prefix} user:expire-password --uid frank '15-Aug-05 15:52:01 UTC' +{occ-command-example-prefix-docker} user:expire-password --uid frank '15-Aug-05 15:52:01 UTC' ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ransomware_protection_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ransomware_protection_commands.adoc index e5057cee4..d0002b5cb 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ransomware_protection_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ransomware_protection_commands.adoc @@ -7,7 +7,7 @@ You can find more information about the application in the xref:enterprise/secur == Command Description -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- ransomguard ransomguard:scan Scan the ownCloud database for changes in order @@ -26,9 +26,9 @@ ransomguard Scan the ownCloud database for changes in order to discover anomalies in a user’s account and their origin. Add a `` and a `` for the search to start with. Note that `` must be in the Linux timestamp format. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ransomguard:scan +{occ-command-example-prefix-docker} ransomguard:scan ---- NOTE: Run this command inside the ownCloud Docker container. @@ -46,9 +46,9 @@ NOTE: Run this command inside the ownCloud Docker container. Revert all operations in a user account after a given point in time. Note that `` must be in the Linux timestamp format. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ransomguard:restore +{occ-command-example-prefix-docker} ransomguard:restore ---- NOTE: Run this command inside the ownCloud Docker container. @@ -66,9 +66,9 @@ NOTE: Run this command inside the ownCloud Docker container. When necessary, set a user account as `read-only` for ownCloud and other WebDAV clients when malicious activity is suspected. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ransomguard:lock +{occ-command-example-prefix-docker} ransomguard:lock ---- NOTE: Run this command inside the ownCloud Docker container. @@ -85,9 +85,9 @@ NOTE: Run this command inside the ownCloud Docker container. When ransomware issues have been resolved, the user account can be unlocked. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ransomguard:unlock +{occ-command-example-prefix-docker} ransomguard:unlock ---- NOTE: Run this command inside the ownCloud Docker container. @@ -108,9 +108,9 @@ The information which files to blacklist can be dynamically maintained either vi This command will set the location of the blacklist file the app will use. The location needs to be shared in all ownCloud servers in case of a multi-server setup. If you try to update the blacklist using the command `blacklist:update:from-file` without having run the `blacklist:set-file` command first, the blacklist file will be generated using the bundled `blacklist.txt.dist` file and saved in the ownCloud's data directory as `ransomware_blacklist.txt`. That file will then be used as default. Running the command again using a different `` as argument will copy the contents from the old location to the new location without deleting the old one. It is highly recommended to use a different filename than the bundled one. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ransomguard:blacklist:set-file +{occ-command-example-prefix-docker} ransomguard:blacklist:set-file ---- NOTE: Run this command inside the ownCloud Docker container. @@ -127,9 +127,9 @@ NOTE: Run this command inside the ownCloud Docker container. This command will update the contents of the blacklist file using another file as source. The format of the file is the same as the `blacklist.txt.dist` file bundled in the app. The command will only add the new items, which are displayed in the terminal. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ransomguard:blacklist:update:from-file +{occ-command-example-prefix-docker} ransomguard:blacklist:update:from-file ---- NOTE: Run this command inside the ownCloud Docker container. @@ -146,9 +146,9 @@ NOTE: Run this command inside the ownCloud Docker container. This command will update the contents by getting the blacklist from a website. The default site is https://fsrm.experiant.ca/api/v1/get. Other sites can be used as long as the response follows the same format as the default site. The behavior is the same as with the `from-file` variant. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} ransomguard:blacklist:update:from-site +{occ-command-example-prefix-docker} ransomguard:blacklist:update:from-site ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_richdocuments.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_richdocuments.adoc index f78896b13..84b1f6dcc 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_richdocuments.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_richdocuments.adoc @@ -2,8 +2,7 @@ Marketplace URL: {oc-marketplace-url}/apps/richdocuments[Collabora Online] -Collabora Online allows you to work with all kinds of collabora office documents inside ownCloud for improved productivity. For details, see the -xref:enterprise/collaboration/collabora_secure_view.adoc[Collabora Online / Secure View] documentation. +Collabora Online allows you to work with all kinds of collabora office documents inside ownCloud for improved productivity. For details, see the xref:enterprise/collaboration/collabora_secure_view.adoc[Collabora Online / Secure View] documentation. `config:app` commands to configure the Collabora Online app. @@ -36,9 +35,9 @@ This command sets the WOPI Server to `[IP/URL]:port` + Adding the port is only necessary when not using standard ports. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set richdocuments wopi_url --value='[IP/URL]:port' +{occ-command-example-prefix-docker} config:app:set richdocuments wopi_url --value='[IP/URL]:port' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -51,7 +50,7 @@ The following example command enables secure view globally on the system: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set richdocuments secure_view_option --value='true' +{occ-command-example-prefix-docker} config:app:set richdocuments secure_view_option --value='true' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -64,7 +63,7 @@ The following example command sets the watermark pattern displayed in the docume [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set richdocuments watermark_text --value='Restricted to \{viewer-email}' +{occ-command-example-prefix-docker} config:app:set richdocuments watermark_text --value='Restricted to \{viewer-email}' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -75,9 +74,9 @@ By default, documents will open in a new tab if not otherwise defined. You can c The following example command makes documents open in the same tab: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set richdocuments open_in_new_tab --value='false' +{occ-command-example-prefix-docker} config:app:set richdocuments open_in_new_tab --value='false' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -88,9 +87,9 @@ Enable documents in secure view mode to be printed and exported (possible values The following example command enables the option to globally print and export documents although secure view is enabled: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set secure_view_can_print_default --value='true' +{occ-command-example-prefix-docker} config:app:set secure_view_can_print_default --value='true' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -101,9 +100,9 @@ Open documents in secure view with watermark by default (possible values: true/f The following example command enables the option to globally enforce displaying the watermark when documents are viewed: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set richdocuments secure_view_open_action_default --value='true' +{occ-command-example-prefix-docker} config:app:set richdocuments secure_view_open_action_default --value='true' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -112,18 +111,18 @@ NOTE: Run this command inside the ownCloud Docker container. You can delete a key with the following example command: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:delete richdocuments secure_view_open_action_default +{occ-command-example-prefix-docker} config:app:delete richdocuments secure_view_open_action_default ---- NOTE: Run this command inside the ownCloud Docker container. You can change a key with the following example command: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set richdocuments secure_view_option --value='false' +{occ-command-example-prefix-docker} config:app:set richdocuments secure_view_option --value='false' ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_s3objectstore_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_s3objectstore_commands.adoc index 63a8a96a8..7fda05f7b 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_s3objectstore_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_s3objectstore_commands.adoc @@ -6,9 +6,9 @@ Marketplace URL: {oc-marketplace-url}/apps/files_primary_s3[S3 Primary Object St == List objects, buckets or versions of an object -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} s3:list +{occ-command-example-prefix-docker} s3:list ---- NOTE: Run this command inside the ownCloud Docker container. @@ -23,9 +23,9 @@ NOTE: Run this command inside the ownCloud Docker container. == Create a bucket as necessary to be used -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} s3:create-bucket +{occ-command-example-prefix-docker} s3:create-bucket ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_saml_sso_shibboleth_integration_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_saml_sso_shibboleth_integration_commands.adoc index 46e604843..93fb03be6 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_saml_sso_shibboleth_integration_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_saml_sso_shibboleth_integration_commands.adoc @@ -4,9 +4,9 @@ Marketplace URL: {oc-marketplace-url}/apps/user_shibboleth[SAML/SSO Integration] `shibboleth:mode` sets your Shibboleth mode to `notactive`, `autoprovision`, or `ssoonly` -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} shibboleth:mode [mode] +{occ-command-example-prefix-docker} shibboleth:mode [mode] ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_wnd_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_wnd_commands.adoc index 65f1103f6..d840da0af 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_wnd_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_wnd_commands.adoc @@ -2,8 +2,7 @@ Marketplace URL: {oc-marketplace-url}/apps/windows_network_drive[External Storage: Windows Network Drives] -Integrate Windows and Samba/CIFS shared network drives as external storages. For details please see the -xref:enterprise/external_storage/windows-network-drive_configuration.adoc[Windows Network Drive (WND)] documentation. +Integrate Windows and Samba/CIFS shared network drives as external storages. For details please see the xref:enterprise/external_storage/windows-network-drive_configuration.adoc[Windows Network Drive (WND)] documentation. The `wnd` commands configure the WND app. @@ -22,9 +21,9 @@ xref:enterprise/external_storage/windows-network-drive_configuration.adoc#wnd-no Listen to smb changes and store notifications for later processing in the database -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen [options] [--] [] +{occ-command-example-prefix-docker} wnd:listen [options] [--] [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -80,9 +79,9 @@ NOTE: Run this command inside the ownCloud Docker container. Process the notifications stored by the `wnd:listen` command -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:process-queue [options] [--] +{occ-command-example-prefix-docker} wnd:process-queue [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -111,9 +110,9 @@ NOTE: This command is deprecated starting with ownCloud 10.8. All mount options Sets the service account for the target mount point. You'll be asked for the password of the service account. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:set-service-account [options] [--] +{occ-command-example-prefix-docker} wnd:set-service-account [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_2fa_core_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_2fa_core_commands.adoc index 34ae1fa28..f6f953051 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_2fa_core_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_2fa_core_commands.adoc @@ -17,9 +17,9 @@ The following commands are available for the two-factor authentication: Disable two-factor authentication for a user: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} twofactorauth:disable [options] [--] +{occ-command-example-prefix-docker} twofactorauth:disable [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -36,9 +36,9 @@ NOTE: Run this command inside the ownCloud Docker container. Enable two-factor authentication for a user: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} twofactorauth:enable [options] [--] +{occ-command-example-prefix-docker} twofactorauth:enable [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_app_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_app_commands.adoc index 9d0c05da4..e8eefefd3 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_app_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_app_commands.adoc @@ -17,9 +17,9 @@ app List all of your installed apps or optionally provide a search pattern to restrict the list of apps to those whose name matches the given regular expression. The output shows whether they are enabled or disabled. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} app:list [--] [] +{occ-command-example-prefix-docker} app:list [--] [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -61,9 +61,9 @@ When used, the output will contain the app's version number as well. Enable an app, for example the Market app. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} app:enable market +{occ-command-example-prefix-docker} app:enable market market enabled ---- @@ -71,9 +71,9 @@ NOTE: Run this command inside the ownCloud Docker container. == Disable an App -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} app:disable market +{occ-command-example-prefix-docker} app:disable market market disabled ---- @@ -90,9 +90,9 @@ NOTE: Be aware that the following apps cannot be disabled: _DAV_, _FederatedFile By default all checks are enabled. The Activity app is an example of a correctly-formatted app. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} app:check-code notifications +{occ-command-example-prefix-docker} app:check-code notifications App is compliant - awesome job! ---- @@ -100,9 +100,9 @@ NOTE: Run this command inside the ownCloud Docker container. If your app has issues, you'll see output like this. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} app:check-code foo_app +{occ-command-example-prefix-docker} app:check-code foo_app Analysing /var/www/owncloud/apps/files/foo_app.php 4 errors line 45: OCP\Response - Static method of deprecated class must not be called @@ -117,9 +117,9 @@ NOTE: Run this command inside the ownCloud Docker container. You can get the full file path to an app. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} app:getpath notifications +{occ-command-example-prefix-docker} app:getpath notifications /var/www/owncloud/apps/notifications ---- diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_background_jobs_selector.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_background_jobs_selector.adoc index b4cddaec0..7ccb58def 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_background_jobs_selector.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_background_jobs_selector.adoc @@ -13,16 +13,16 @@ background == Examples -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- # Set the background scheduler to Ajax -{occ-command-example-prefix} background:ajax +{occ-command-example-prefix-docker} background:ajax # Set the background scheduler to Cron -{occ-command-example-prefix} background:cron +{occ-command-example-prefix-docker} background:cron # Set the background scheduler to Webcron -{occ-command-example-prefix} background:webcron +{occ-command-example-prefix-docker} background:webcron ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_installation_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_installation_commands.adoc deleted file mode 100644 index 2a47dac17..000000000 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_installation_commands.adoc +++ /dev/null @@ -1,130 +0,0 @@ -= Command Line Installation - -ownCloud can be installed entirely from the command line. After downloading the tarball and copying ownCloud into the appropriate directories, you can use `occ` commands in place of running the graphical Installation Wizard. Also see xref:installation/manual_installation/manual_installation.adoc[Manual Installation on Linux]. - -NOTE: These instructions assume that you have a fully working and configured webserver. -If not, please refer to the documentation on configuring xref:installation/manual_installation/manual_installation.adoc#configure-the-web-server[Configure the Web Server] for detailed instructions. - -Apply the xref:installation/manual_installation/manual_installation.adoc#script-guided-installation[correct permissions] to your ownCloud directories. Then choose your `occ` options. This lists your available options: - -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix} occ -ownCloud is not installed - only a limited number of commands are available -ownCloud version 10.15.0 - -Usage: - [options] command [arguments] - -== Options - --help (-h) Display this help message - --quiet (-q) Do not output any message - --verbose (-v|vv|vvv) Increase the verbosity of messages: 1 for normal output, - 2 for more verbose output and 3 for debug - --version (-V) Display this application version - --ansi Force ANSI output - --no-ansi Disable ANSI output - --no-interaction (-n) Do not ask any interactive question - -Available commands: - check Check dependencies of the server environment - help Displays help for a command - list Lists commands - status Show some status information - app - app:check-code Check code to be compliant - l10n - l10n:createjs Create javascript translation files for a given app - maintenance - maintenance:install Install ownCloud ----- - -NOTE: Run this command inside the ownCloud Docker container. - - -== Command Description - -Display your `maintenance:install` options. - -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix} help maintenance:install -ownCloud is not installed - only a limited number of commands are available -Usage: ----- - -NOTE: Run this command inside the ownCloud Docker container. - -[source,plaintext] ----- -maintenance:install [--database=["..."]] [--database-connection-string=["..."]] \ - [--database-name=["..."]] [--database-host=["..."]] \ - [--database-user=["..."]] [--database-pass=["..."]] \ - [--database-table-prefix=["..."]] [--admin-user=["..."]] \ - [--admin-pass=["..."]] [--data-dir=["..."]] ----- - -=== Options - -[width="100%",cols="22%,70%",] -|=== -| `--database` -a| Supported database type (default: `sqlite`). -The supported values are: - -* `mysql`: MySQL/MariaDB -* `oci`: Oracle (_ownCloud Enterprise edition only_) -* `pgsql`: PostgreSQL -* `sqlite`: SQLite3 (_ownCloud Community edition only_) - -| `--database-connection-string` -a| An Oracle-specific connection string. - -NOTE: As soon as this parameter is provided, other parameters like database-host and database-name are not used and do not need to be provided. -For example: - -*Example* - -[source,plaintext] ----- -sales= - (DESCRIPTION= - (ADDRESS= (PROTOCOL=tcp)(HOST=sales-server)(PORT=1521)) - (CONNECT_DATA= - (SERVICE_NAME=sales.us.acme.com))) ----- -| `--database-name` -| Name of the database. -| `--database-host` -| Hostname of the database (default: `localhost`). -| `--database-user` -| User name to connect to the database. -| `--database-pass` -| Password of the database user. -| `--database-table-prefix` -| Prefix for all tables (default: `oc_` ). -| `--admin-user` -| Password of the admin account. -| `--data-dir` -| Path to data directory (default: `/var/www/owncloud/data`). -|=== - -=== Example - -This example completes the installation: - -[source,bash,subs="attributes+"] ----- -cd /var/www/owncloud/ -{occ-command-example-prefix} maintenance:install \ - --database "mysql" \ - --database-name "owncloud" \ - --database-user "root" \ - --database-pass "password" \ - --admin-user "admin" \ - --admin-pass "password" -ownCloud is not installed - only a limited number of commands are available -ownCloud was successfully installed ----- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_upgrade_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_upgrade_commands.adoc index 60df06634..1e7c43131 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_upgrade_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_upgrade_commands.adoc @@ -5,9 +5,9 @@ List all options, like this example on CentOS Linux: == Command Description -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} upgrade --help +{occ-command-example-prefix-docker} upgrade --help Usage: upgrade [options] ---- @@ -27,9 +27,9 @@ PHP scripts invoked from the Web interface are limited to 3600 seconds. In larger environments this may not be enough, leaving the system in an inconsistent state. After performing all the preliminary steps (see xref:maintenance/upgrade.adoc[the maintenance upgrade documentation]) use this command to upgrade your databases, like this example on CentOS Linux: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} upgrade +{occ-command-example-prefix-docker} upgrade ownCloud or one of the apps require upgrade - only a limited number of commands are available Turned on maintenance mode @@ -46,9 +46,9 @@ NOTE: Run this command inside the ownCloud Docker container. Note how it details the steps. Enabling verbosity displays timestamps: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} upgrade -v +{occ-command-example-prefix-docker} upgrade -v ownCloud or one of the apps require upgrade - only a limited number of commands are available 2017-06-23T09:06:15+0000 Turned on maintenance mode 2017-06-23T09:06:15+0000 Checked database schema update diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_commands.adoc index fbfb4305b..240474d71 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_commands.adoc @@ -75,9 +75,9 @@ These commands manage the configurations of apps. Keys and values are stored in == config:app:delete -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:delete [options] [--] +{occ-command-example-prefix-docker} config:app:delete [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -100,9 +100,9 @@ NOTE: Run this command inside the ownCloud Docker container. === Examples: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:delete myappname provisioning_api +{occ-command-example-prefix-docker} config:app:delete myappname provisioning_api Config value provisioning_api of app myappname deleted ---- @@ -111,9 +111,9 @@ NOTE: Run this command inside the ownCloud Docker container. The delete command will by default not complain if the configuration was not set before. If you want to be notified in that case, set the `--error-if-not-exists` flag. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:delete doesnotexist --error-if-not-exists +{occ-command-example-prefix-docker} config:app:delete doesnotexist --error-if-not-exists Config provisioning_api of app appname could not be deleted because it did not exist ---- @@ -121,9 +121,9 @@ NOTE: Run this command inside the ownCloud Docker container. == config:app:get -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:get [options] [--] +{occ-command-example-prefix-docker} config:app:get [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -147,9 +147,9 @@ the command will exit with 1. === Examples -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:get activity installed_version +{occ-command-example-prefix-docker} config:app:get activity installed_version 2.2.1 ---- @@ -157,9 +157,9 @@ NOTE: Run this command inside the ownCloud Docker container. == config:app:set -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set [options] [--] +{occ-command-example-prefix-docker} config:app:set [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -183,9 +183,9 @@ NOTE: Run this command inside the ownCloud Docker container. === Examples -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ files_sharing \ incoming_server2server_share_enabled \ --value=true \ @@ -197,9 +197,9 @@ NOTE: Run this command inside the ownCloud Docker container. The `config:app:set` command creates the value, if it does not already exist. To update an existing value, set `--update-only`: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ doesnotexist \ --value=true \ --type=boolean \ @@ -218,18 +218,18 @@ The exported content can also be imported again to allow the fast setup of simil The import command will only add or update values. Values that exist in the current configuration, but not in the one that is being imported are left untouched. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:import filename.json +{occ-command-example-prefix-docker} config:import filename.json ---- NOTE: Run this command inside the ownCloud Docker container. It is also possible to import remote files, by piping the input: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:import < local-backup.json +{occ-command-example-prefix-docker} config:import < local-backup.json ---- NOTE: Run this command inside the ownCloud Docker container. @@ -241,9 +241,9 @@ Use the `occ app:enable`, `occ app:disable` and `occ update` commands instead. The `config:list` command lists all configuration values for your ownCloud setup as well as for any apps. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:list [options] [--] [] +{occ-command-example-prefix-docker} config:list [options] [--] [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -275,9 +275,9 @@ include::partial$configuration/server/occ_command/config-list-report.json[] To generate a full report which includes sensitive values, such as passwords and salts, use the `--private` option, as in the following example. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:list --private +{occ-command-example-prefix-docker} config:list --private ---- NOTE: Run this command inside the ownCloud Docker container. @@ -287,17 +287,17 @@ NOTE: Run this command inside the ownCloud Docker container. The output can be filtered to just the core information, core and apps, or one specific app. In the example below, you can see how to filter for each of these categories. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- # List only system configuration details -{occ-command-example-prefix} config:list -- system +{occ-command-example-prefix-docker} config:list -- system # List system and app configuration details # This is the default, so doesn't need to be explicitly specified -{occ-command-example-prefix} config:list -- all +{occ-command-example-prefix-docker} config:list -- all # List configuration details of the dav app -{occ-command-example-prefix} config:list -- dav +{occ-command-example-prefix-docker} config:list -- dav ---- NOTE: Run this command inside the ownCloud Docker container. @@ -322,9 +322,9 @@ These commands manage system configurations. == config:system:delete -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:delete [options] [--] ()... +{occ-command-example-prefix-docker} config:system:delete [options] [--] ()... ---- NOTE: Run this command inside the ownCloud Docker container. @@ -346,9 +346,9 @@ NOTE: Run this command inside the ownCloud Docker container. === Examples: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:delete maintenance:mode +{occ-command-example-prefix-docker} config:system:delete maintenance:mode System config value maintenance:mode deleted ---- @@ -356,9 +356,9 @@ NOTE: Run this command inside the ownCloud Docker container. == config:system:get -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:get [options] [--] ()... +{occ-command-example-prefix-docker} config:system:get [options] [--] ()... ---- NOTE: Run this command inside the ownCloud Docker container. @@ -381,19 +381,19 @@ the command will exit with 1. === Examples: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:get version -10.7.0.4 +{occ-command-example-prefix-docker} config:system:get version +10.16.0.2 ---- NOTE: Run this command inside the ownCloud Docker container. == config:system:set -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:set [options] [--] ()... +{occ-command-example-prefix-docker} config:system:set [options] [--] ()... ---- NOTE: Run this command inside the ownCloud Docker container. @@ -422,9 +422,9 @@ NOTE: In order to write a boolean, float, JSON, or integer value to the configur Disable the maintenance mode: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:set maintenance \ +{occ-command-example-prefix-docker} config:system:set maintenance \ --value=false \ --type=boolean @@ -436,9 +436,9 @@ NOTE: Run this command inside the ownCloud Docker container. Create the `app_paths` config setting (using a JSON payload because of multi array values): -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:set apps_paths \ +{occ-command-example-prefix-docker} config:system:set apps_paths \ --type=json \ --value='[ { @@ -458,9 +458,9 @@ NOTE: Run this command inside the ownCloud Docker container. Adding Redis to the configuration: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:set \ +{occ-command-example-prefix-docker} config:system:set \ redis \ --value '{"host": "{oc-examples-server-ip}", "port": "{std-port-redis}"}' \ --type json @@ -473,9 +473,9 @@ NOTE: Run this command inside the ownCloud Docker container. Some configurations (e.g., the trusted domain setting) are an array of data. The array starts counting with 0. In order to set (and also get) the value of one key, you can specify multiple `config` names separated by spaces: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:get trusted_domains +{occ-command-example-prefix-docker} config:system:get trusted_domains localhost owncloud.local sample.tld @@ -485,12 +485,12 @@ NOTE: Run this command inside the ownCloud Docker container. To replace `sample.tld` with `example.com` trusted_domains => 2 needs to be set: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:set trusted_domains 2 --value=example.com +{occ-command-example-prefix-docker} config:system:set trusted_domains 2 --value=example.com System config value trusted_domains => 2 set to string example.com -{occ-command-example-prefix} config:system:get trusted_domains +{occ-command-example-prefix-docker} config:system:get trusted_domains localhost owncloud.local example.com diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_reports_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_reports_commands.adoc index 467c69d66..ab76e9bdf 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_reports_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_reports_commands.adoc @@ -1,13 +1,12 @@ = Config Reports -If you're working with ownCloud support and need to send them a configuration summary, you can generate it using the `configreport:generate` command. -This command generates the same JSON-based report as the Admin Config Report, which you can access under `admin -> Settings -> Admin -> General -> Generate Config Report -> Download ownCloud config report`. +If you're working with ownCloud support and need to send them a configuration summary, you can generate it using the `configreport:generate` command. This command generates the same JSON-based report as the Admin Config Report, which you can access under `admin -> Settings -> Admin -> General -> Generate Config Report -> Download ownCloud config report`. From the command-line in the root directory of your ownCloud installation, run it as your webserver user as follows, (assuming your webserver user is `www-data`): -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} configreport:generate +{occ-command-example-prefix-docker} configreport:generate ---- NOTE: Run this command inside the ownCloud Docker container. @@ -15,18 +14,18 @@ NOTE: Run this command inside the ownCloud Docker container. This will generate the report and send it to `STDOUT`. You can optionally pipe the output to a file and then attach it to an email to ownCloud support, by running the following command: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} configreport:generate > generated-config-report.txt +{occ-command-example-prefix-docker} configreport:generate > generated-config-report.txt ---- NOTE: Run this command inside the ownCloud Docker container. Alternatively, you could generate the report and email it all in one command, by running: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} configreport:generate | mail \ +{occ-command-example-prefix-docker} configreport:generate | mail \ -s "configuration report" \ -r \ diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc index 0ff376c4b..0d9399be7 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc @@ -6,9 +6,9 @@ Convert charset of MySQL/MariaDB to use utf8mb4. If you are using an older ownCloud installation, the database may not be setup to use the 4-byte unicode charset. This command changes the database charset to use `utf8mb4`. Check your database charset before you use this command. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} db:convert-mysql-charset +{occ-command-example-prefix-docker} db:convert-mysql-charset ---- NOTE: Run this command inside the ownCloud Docker container. @@ -17,9 +17,9 @@ NOTE: Run this command inside the ownCloud Docker container. This command sets the default row format of MySQL/MariaDB tables. This is only necessary once before you are going to e.g. install MariaDB 10.6 or higher because the COMPRESSED row format is now read-only by default. As a prerequisite, ownCloud 10.9 needs to be installed first. See the xref:maintenance/upgrading/database_upgrade.adoc[Database Upgrade] guide for details. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} db:restore-default-row-format +{occ-command-example-prefix-docker} db:restore-default-row-format ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_dav_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_dav_commands.adoc index d0e44c85e..e46663011 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_dav_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_dav_commands.adoc @@ -18,9 +18,9 @@ NOTE: These commands are not available in xref:maintenance-commands[single-user `dav:cleanup-chunks` cleans up outdated chunks (uploaded files) more than a certain number of days old. By default, the command cleans up chunks more than 2 days old. However, by supplying the number of days to the command, the range can be increased. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} dav:cleanup-chunks [options] [--] [] +{occ-command-example-prefix-docker} dav:cleanup-chunks [options] [--] [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -46,9 +46,9 @@ NOTE: Run this command inside the ownCloud Docker container. In the example below, chunks older than 10 days will be removed. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} dav:cleanup-chunks 10 +{occ-command-example-prefix-docker} dav:cleanup-chunks 10 # example output Cleaning chunks older than 10 days(2017-11-08T13:13:45+00:00) @@ -62,9 +62,9 @@ NOTE: Run this command inside the ownCloud Docker container. Create a dav address book. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} dav:create-addressbook +{occ-command-example-prefix-docker} dav:create-addressbook ---- NOTE: Run this command inside the ownCloud Docker container. @@ -84,9 +84,9 @@ NOTE: Run this command inside the ownCloud Docker container. This example creates the address book `mollybook` for the user molly: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} dav:create-addressbook molly mollybook +{occ-command-example-prefix-docker} dav:create-addressbook molly mollybook ---- NOTE: Run this command inside the ownCloud Docker container. @@ -97,9 +97,9 @@ Molly will immediately see her address book. Create a dav calendar. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} dav:create-calendar +{occ-command-example-prefix-docker} dav:create-calendar ---- NOTE: Run this command inside the ownCloud Docker container. @@ -119,9 +119,9 @@ NOTE: Run this command inside the ownCloud Docker container. This example creates a new calendar `mollycal` for user molly: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} dav:create-calendar molly mollycal +{occ-command-example-prefix-docker} dav:create-calendar molly mollycal ---- NOTE: Run this command inside the ownCloud Docker container. @@ -135,9 +135,9 @@ Molly will immediately see her calendar. Synchronizes the birthday calendar. It adds all birthdays to your calendar from address books shared with you. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} dav:sync-birthday-calendar [] +{occ-command-example-prefix-docker} dav:sync-birthday-calendar [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -154,9 +154,9 @@ NOTE: Run this command inside the ownCloud Docker container. This example syncs to your calendar from user `bernie`: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} dav:sync-birthday-calendar bernie +{occ-command-example-prefix-docker} dav:sync-birthday-calendar bernie ---- NOTE: Run this command inside the ownCloud Docker container. @@ -165,9 +165,9 @@ NOTE: Run this command inside the ownCloud Docker container. Synchronizes all users to the system addressbook. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} dav:sync-system-addressbook +{occ-command-example-prefix-docker} dav:sync-system-addressbook ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_encryption_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_encryption_commands.adoc index e9586afcd..5b677f682 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_encryption_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_encryption_commands.adoc @@ -38,14 +38,13 @@ encryption == Status -`occ encryption:status` shows whether you have active encryption and your default encryption module. -To enable encryption you must first enable the Encryption app and then run `occ encryption:enable`: +`occ encryption:status` shows whether you have active encryption and your default encryption module. To enable encryption you must first enable the Encryption app and then run `occ encryption:enable`: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:enable encryption -{occ-command-example-prefix} encryption:enable -{occ-command-example-prefix} encryption:status +{occ-command-example-prefix-docker} app:enable encryption +{occ-command-example-prefix-docker} encryption:enable +{occ-command-example-prefix-docker} encryption:status - enabled: true - defaultModule: OC_DEFAULT_MODULE ---- @@ -56,7 +55,7 @@ NOTE: Run this command inside the ownCloud Docker container. Server-side encryption for local storage like the users home and remote storages like Google Drive can operate independently of each other. By doing so, you can encrypt a remote storage without also having to encrypt the users home storage on your ownCloud server. Possible values are `0` and `1` -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- config:app:set encryption encryptHomeStorage --value '1' ---- @@ -67,18 +66,18 @@ config:app:set encryption encryptHomeStorage --value '1' It takes one argument, which defines your new root folder. The folder must exist and the path is relative to your data directory. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:change-key-storage-root ../data/security/oc-keys +{occ-command-example-prefix-docker} encryption:change-key-storage-root ../data/security/oc-keys ---- NOTE: Run this command inside the ownCloud Docker container. You can see the current location of your keys folder: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:show-key-storage-root +{occ-command-example-prefix-docker} encryption:show-key-storage-root Current key storage root: default storage location (data/) ---- @@ -109,9 +108,9 @@ This argument automatically answers, potential, questions with "yes", which is p `encryption:decrypt-all` decrypts all user data files, or optionally a single user: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:decrypt freda +{occ-command-example-prefix-docker} encryption:decrypt freda ---- NOTE: Run this command inside the ownCloud Docker container. @@ -138,42 +137,27 @@ This lets the command know whether to ask for permission to continue or not. ==== Recovery method -This method reads the value from the environment variable `OC_RECOVERY_PASSWORD`. -This variable bounds the value of recovery password set in the encryption page. -If this variable is not set the recovery process will be halted. -This has to be used for decrypting all users. -While opting recovery method user should not forget to set `OC_RECOVERY_PASSWORD` in the shell. +This method reads the value from the environment variable `OC_RECOVERY_PASSWORD`. This variable bounds the value of recovery password set in the encryption page. If this variable is not set the recovery process will be halted. This has to be used for decrypting all users. While opting recovery method user should not forget to set `OC_RECOVERY_PASSWORD` in the shell. ==== Password method -This method reads the value from the environment variable `OC_PASSWORD`. -This variable bounds the value of user password. -The password which user uses to login to oC account. -When password method is opted the user needs to set this variable in the shell. +This method reads the value from the environment variable `OC_PASSWORD`. This variable bounds the value of user password. The password which user uses to login to oC account. When password method is opted the user needs to set this variable in the shell. ==== Continue Option Description -The continue option can be used to bypass the permissions asked like `yes` or `no` while decrypting the file system. -If the user is sure about what he/she is doing with the command and would like to proceed, then `-c yes` when provided to the command would not ask permissions. -If `-c no` is passed to the command, then permissions would be asked to the user. It becomes interactive. +The continue option can be used to bypass the permissions asked like `yes` or `no` while decrypting the file system. If the user is sure about what he/she is doing with the command and would like to proceed, then `-c yes` when provided to the command would not ask permissions. If `-c no` is passed to the command, then permissions would be asked to the user. It becomes interactive. -Use `encryption:disable` to disable your encryption module. -You must first put your ownCloud server into xref:maintenance-commands[single-user mode] to prevent any user activity. +Use `encryption:disable` to disable your encryption module. You must first put your ownCloud server into xref:maintenance-commands[single-user mode] to prevent any user activity. -`encryption:migrate` migrates encryption keys after a major ownCloud version upgrade. -You may optionally specify individual users in a space-delimited list. -See xref:configuration/files/encryption/encryption_configuration.adoc[encryption configuration] to learn more. +`encryption:migrate` migrates encryption keys after a major ownCloud version upgrade. You may optionally specify individual users in a space-delimited list. See xref:configuration/files/encryption/encryption_configuration.adoc[encryption configuration] to learn more. -`encryption:recreate-master-key` decrypts the ownCloud file system, replaces the existing master key with a new one, and encrypts the entire ownCloud file system with the new master key. -Given the size of your ownCloud filesystem, this may take some time to complete. -However, if your filesystem is quite small, then it will complete quite quickly. -The `-y` switch can be supplied to automate acceptance of user input. +`encryption:recreate-master-key` decrypts the ownCloud file system, replaces the existing master key with a new one, and encrypts the entire ownCloud file system with the new master key. Given the size of your ownCloud filesystem, this may take some time to complete. However, if your filesystem is quite small, then it will complete quite quickly. The `-y` switch can be supplied to automate acceptance of user input. == Fix Encrypted Version -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:fix-encrypted-version [options] [--] +{occ-command-example-prefix-docker} encryption:fix-encrypted-version [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -209,9 +193,9 @@ Searches in increments from -n to +n. [default: "5"] === Export or Import the Masterkey -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:hsmdaemon [options] +{occ-command-example-prefix-docker} encryption:hsmdaemon [options] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -237,9 +221,9 @@ The private key file in the directory may be named like `master_08ea43b7.private Allows to test the `hsmdaemon` setup by providing an encrypted string to ownCloud and test if it can be decrypted. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:hsmdaemon:decrypt [options] [--] +{occ-command-example-prefix-docker} encryption:hsmdaemon:decrypt [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -267,9 +251,9 @@ NOTE: Run this command inside the ownCloud Docker container. Set the url on which the `hsmdaemon` REST-API is reachable. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set encryption hsm.url --value 'http://127.0.0.1:8513' +{occ-command-example-prefix-docker} config:app:set encryption hsm.url --value 'http://127.0.0.1:8513' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -278,9 +262,9 @@ NOTE: Run this command inside the ownCloud Docker container. To access the `hsmdaemon` API, ownCloud must authenticate with a JWT (JSON Web Token). The given secret is shared between the `hsdmdaemon` (see the hsmdaemon.toml configuration file) and ownCloud to sign the JWT. See the xref:configuration/server/security/hsmdaemon/index.adoc[HSM documentation] for an example how to generate a secret. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set encryption hsm.jwt.secret --value '7a7d1826-b514-4d9f-afc7-a7485084e8de' +{occ-command-example-prefix-docker} config:app:set encryption hsm.jwt.secret --value '7a7d1826-b514-4d9f-afc7-a7485084e8de' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -289,9 +273,9 @@ NOTE: Run this command inside the ownCloud Docker container. The JWT described above has an expiry timestamp. In case the time clocks on ownCloud and hsmdaemon system drift or skew apart, additional time is added to the expiry time to counteract this situation. Set or change the clockskew only if ownCloud advises to do so. Defaults to 120, value is in seconds. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set encryption hsm.jwt.clockskew --value '120' +{occ-command-example-prefix-docker} config:app:set encryption hsm.jwt.clockskew --value '120' ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_sync_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_sync_commands.adoc index 1e31a5510..f0e2d2816 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_sync_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_sync_commands.adoc @@ -2,12 +2,11 @@ Synchronize the address books of all federated ownCloud servers. -Servers connected with federation shares can share user address books, and auto-complete usernames in share dialogs. -Use this command to synchronize federated servers: +Servers connected with federation shares can share user address books, and auto-complete usernames in share dialogs. Use this command to synchronize federated servers: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} federation:sync-addressbooks +{occ-command-example-prefix-docker} federation:sync-addressbooks ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_trusted_servers.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_trusted_servers.adoc index 388eac2ea..58ba36311 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_trusted_servers.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_trusted_servers.adoc @@ -14,9 +14,9 @@ federation:trusted-servers This command adds a trusted federated server. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} federation:trusted-servers:add +{occ-command-example-prefix-docker} federation:trusted-servers:add ---- NOTE: Run this command inside the ownCloud Docker container. @@ -33,9 +33,9 @@ NOTE: Run this command inside the ownCloud Docker container. In the example below, the named trusted server is added. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} federation:trusted-servers:add / +{occ-command-example-prefix-docker} federation:trusted-servers:add / https://myserver:8888/server/owncloud ---- @@ -45,9 +45,9 @@ NOTE: Run this command inside the ownCloud Docker container. This command lists all trusted federated servers that have been added. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} federation:trusted-servers:list +{occ-command-example-prefix-docker} federation:trusted-servers:list ---- NOTE: Run this command inside the ownCloud Docker container. @@ -56,9 +56,9 @@ NOTE: Run this command inside the ownCloud Docker container. In the example below, all trusted servers that have been added are listed. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} configured +{occ-command-example-prefix-docker} configured ---- @@ -80,9 +80,9 @@ NOTE: Run this command inside the ownCloud Docker container. This command removes a trusted federated server. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} federation:trusted-servers:remove +{occ-command-example-prefix-docker} federation:trusted-servers:remove ---- NOTE: Run this command inside the ownCloud Docker container. @@ -99,9 +99,9 @@ NOTE: Run this command inside the ownCloud Docker container. In the example below, the trusted server with ID=2 gets removed. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} federation:trusted-servers:remove 2 +{occ-command-example-prefix-docker} federation:trusted-servers:remove 2 ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_file_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_file_commands.adoc index 70df3cec1..4c51a4510 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_file_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_file_commands.adoc @@ -25,19 +25,16 @@ IMPORTANT: These commands are not available in xref:maintenance-commands[single- The main purpose of this command is to clear the cache for objectstores (`objectstore` and `files_primary_S3` apps) as primary storage, but it is not limited to this type of storage. It can be used for any other type as long it is the primary storage. -Files in the primary storage could be deleted outside of ownCloud, leaving information in ownCloud's file cache. -This command intends to check if the target file can be read from the primary backend storage and, if not, allows you to remove the information cached. +Files in the primary storage could be deleted outside of ownCloud, leaving information in ownCloud's file cache. This command intends to check if the target file can be read from the primary backend storage and, if not, allows you to remove the information cached. [NOTE] ==== -Removing files directly from the primary storage is not supported and should not happen. -As such, the cases where you need to run this command should be extremely rare. -This is why this command is only provided to check for one file instead of scanning the whole of ownCloud's filesystem. +Removing files directly from the primary storage is not supported and should not happen. As such, the cases where you need to run this command should be extremely rare. This is why this command is only provided to check for one file instead of scanning the whole of ownCloud's filesystem. ==== -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:check-cache --help +{occ-command-example-prefix-docker} files:check-cache --help Usage: files:check-cache [options] [--] ---- @@ -61,44 +58,39 @@ NOTE: Run this command inside the ownCloud Docker container. Examples of checking files for user maria: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:check-cache maria welcome.txt +{occ-command-example-prefix-docker} files:check-cache maria welcome.txt welcome.txt has been accessed properly ---- NOTE: Run this command inside the ownCloud Docker container. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:check-cache maria maria@smbhome/myfile.txt +{occ-command-example-prefix-docker} files:check-cache maria maria@smbhome/myfile.txt Ignoring maria@smbhome/myfile.txt because it is shared or not inside the primary storage - ---- NOTE: Run this command inside the ownCloud Docker container. == The files:checksums:verify command -ownCloud supports file integrity checking, by computing and matching checksums. -Doing so ensures that transferred files arrive at their target in the exact state as they left their origin. +ownCloud supports file integrity checking, by computing and matching checksums. Doing so ensures that transferred files arrive at their target in the exact state as they left their origin. -In some rare cases, wrong checksums are written to the database which leads to synchronization issues, such as with the Desktop Client. -To mitigate such problems a new command is available: `occ files:checksums:verify`. +In some rare cases, wrong checksums are written to the database which leads to synchronization issues, such as with the Desktop App. To mitigate such problems a new command is available: `occ files:checksums:verify`. -Executing the command recalculates checksums, either for all files of a user or within a specified filesystem path on the designated storage. -It then compares them with the values in the database. -The command also offers an option to repair incorrect checksum values (`-r, --repair`). +Executing the command recalculates checksums, either for all files of a user or within a specified filesystem path on the designated storage. It then compares them with the values in the database. The command also offers an option to repair incorrect checksum values (`-r, --repair`). CAUTION: Executing this command might take some time depending on the file count. Below is sample output that you can expect to see when using the command. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:checksums:verify +{occ-command-example-prefix-docker} files:checksums:verify This operation might take very long. Mismatch for files/welcome.txt: @@ -134,9 +126,9 @@ For example, if the user's id was "john" and the `--path` value was "tree/apple" When a mount point gets removed, the storage ID and file cache related info stay in the database. Over time, this can consume a considerable amount of database space and can slow down database queries. With the `files:remove-storage` command, these orphans can be removed. As a rule of thumb, though not essential, this command should be run in single user mode to avoid any conflicting access. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:remove-storage --help +{occ-command-example-prefix-docker} files:remove-storage --help Usage: files:remove-storage [options] [--] []... ---- @@ -169,9 +161,9 @@ This command should be handled with absolute care because *any* storage ID and t === Example Output -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:remove-storage --show-candidates +{occ-command-example-prefix-docker} files:remove-storage --show-candidates ---- NOTE: Run this command inside the ownCloud Docker container. @@ -189,7 +181,7 @@ NOTE: Run this command inside the ownCloud Docker container. Note that the name can be NULL as shown at storage 15 if there is no info about it in the `oc_storages` table. It can also be hashed if it's too long (as it is in the DB). -== The files:scan command +== The files:scan Command The `files:scan` command @@ -202,9 +194,9 @@ File scans can be performed per-user, for a space-delimited list of users, for g IMPORTANT: Scanning is only possible when using POSIX filesystems but not for object storages like S3. This is because the object storage implementation uses the database as primary data source and the S3 storage for only holding the data blobs but no metadata. A sync from S3 storage to database is therefore not reasonable. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:scan --help +{occ-command-example-prefix-docker} files:scan --help Usage: files:scan [options] [--] []... ---- @@ -256,15 +248,14 @@ For example: In the example above, the user_id `alice` is determined implicitly from the path component given. To get a list of scannable mounts for a given user, use the following command: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files_external:list user_id +{occ-command-example-prefix-docker} files_external:list user_id ---- NOTE: Run this command inside the ownCloud Docker container. -TIP: Mounts are only scannable at the point of origin. -Scanning of shares including federated shares is not necessary on the receiver side and therefore not possible. +TIP: Mounts are only scannable at the point of origin. Scanning of shares including federated shares is not necessary on the receiver side and therefore not possible. NOTE: Mounts based on session credentials can not be scanned as the users credentials are not available to the occ command set. @@ -273,9 +264,7 @@ The `--path`, `--all`, `--group`, `--groups` and `[user_id]` parameters are excl === The `--repair` Option -As noted above, repairs can be performed for individual users, groups of users, and for all users in an ownCloud installation. -What's more, repair scans can be run even if no files are known to need repairing and if one or more files are known to be in need of repair. -Two examples of when files need repairing are: +As noted above, repairs can be performed for individual users, groups of users, and for all users in an ownCloud installation. What's more, repair scans can be run even if no files are known to need repairing and if one or more files are known to be in need of repair. Two examples of when files need repairing are: * If folders have the same entry twice in the web UI (known as a '__ghost folder__'), this can also lead to strange error messages in the desktop client. * If entering a folder doesn't seem to lead into that folder. @@ -290,20 +279,20 @@ The `--repair` option can be run within two different scenarios: The following commands show how to enable single user mode, run a repair file scan in bulk on all storages, and then disable single user mode. This way is much faster than running the command for every user separately, but it requires single user mode. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --on -{occ-command-example-prefix} files:scan --all --repair -{occ-command-example-prefix} maintenance:singleuser --off +{occ-command-example-prefix-docker} maintenance:singleuser --on +{occ-command-example-prefix-docker} files:scan --all --repair +{occ-command-example-prefix-docker} maintenance:singleuser --off ---- NOTE: Run this command inside the ownCloud Docker container. The following command filters by the storage of the specified user. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:scan USERID --repair +{occ-command-example-prefix-docker} files:scan USERID --repair ---- NOTE: Run this command inside the ownCloud Docker container. @@ -320,9 +309,9 @@ If the target users don't exist, they will be created. This command is useful before removing users. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:transfer-ownership --help +{occ-command-example-prefix-docker} files:transfer-ownership --help Usage: files:transfer-ownership [options] [--] ---- @@ -353,9 +342,9 @@ never logged in and command aborts otherwise. For example, to move all files from `` to `` transfer folder, use the following command: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:transfer-ownership \ +{occ-command-example-prefix-docker} files:transfer-ownership \ \ ---- @@ -365,9 +354,9 @@ NOTE: Run this command inside the ownCloud Docker container. You can also move a limited set of files from `` to `` transfer folder by making use of the `--path` switch, as in the example below. Ownership of `folder/to/move` and all files and folders which it contains will be transferred to `` transfer folder. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:transfer-ownership \ +{occ-command-example-prefix-docker} files:transfer-ownership \ --path="folder/to/move" \ \ @@ -378,9 +367,9 @@ NOTE: Run this command inside the ownCloud Docker container. If the entire user folder of `` needs to be migrated to `` user folder, use the `--destination-use-user-folder` switch, as in the example below. The destination user needs to be created but never log in, we recommend using owncloud maintenance mode for this operation. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:transfer-ownership \ +{occ-command-example-prefix-docker} files:transfer-ownership \ --destination-use-user-folder \ \ @@ -399,16 +388,13 @@ Please keep the following in mind when using this command: == The files:troubleshoot-transfer-ownership command -This command is used to scan for problems, that might have occurred during a run of -ownership transfer using the above command `files:transfer-ownership`. -It can also be used to automatically attempt to fix problems. -For example, transferred shares that may now have an invalid share owner. +This command is used to scan for problems, that might have occurred during a run of ownership transfer using the above command `files:transfer-ownership`. It can also be used to automatically attempt to fix problems. For example, transferred shares that may now have an invalid share owner. NOTE: By default, the command performs a dry run and displays the problems found to the console output. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:troubleshoot-transfer-ownership --help +{occ-command-example-prefix-docker} files:troubleshoot-transfer-ownership --help Usage: files:troubleshoot-transfer-ownership [options] [--] [] ---- @@ -433,9 +419,9 @@ NOTE: Run this command inside the ownCloud Docker container. Run the command with one of the type arguments: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} files:troubleshoot-transfer-ownership \ +{occ-command-example-prefix-docker} files:troubleshoot-transfer-ownership \ ---- @@ -446,7 +432,7 @@ or execute for a single user using `--uid ` [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files:troubleshoot-transfer-ownership all \ +{occ-command-example-prefix-docker} files:troubleshoot-transfer-ownership all \ --fix \ --uid=UID ---- diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_files_external_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_files_external_commands.adoc index 383c5c3ad..d379267b3 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_files_external_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_files_external_commands.adoc @@ -1,7 +1,8 @@ = Files External These commands replace the `data/mount.json` configuration file used in ownCloud releases before 9.0. -Commands for managing external storage. + +Commands for managing external storage: [source,plaintext] ---- @@ -22,8 +23,7 @@ These commands replicate the functionality in the ownCloud Web GUI, plus two new Use `files_external:export` to export all admin mounts to stdout, and `files_external:export [user_id]` to export the mounts of the specified ownCloud user. -NOTE: These commands are only available when the "External storage support" app (`files_external`) is enabled. -It is not available in xref:maintenance-commands[single-user (maintenance) mode]. +NOTE: These commands are only available when the "External storage support" app (`files_external`) is enabled. It is not available in xref:maintenance-commands[single-user (maintenance) mode]. == files_external:list @@ -31,9 +31,9 @@ List configured mounts. === Usage -[source,plaintext] +[source,docker,subs="attributes+"] ---- -files_external:list [--show-password] [--full] [-a|--all] [-s|--short] [--] [] +{occ-command-example-prefix-docker} files_external:list [--show-password] [--full] [-a|--all] [-s|--short] [--] [] ---- === Arguments @@ -58,9 +58,9 @@ files_external:list [--show-password] [--full] [-a|--all] [-s|--short] [--] [ +{occ-command-example-prefix-docker} files_external:delete [options] [--] ---- === Arguments @@ -286,9 +282,9 @@ files_external:delete [options] [--] === Usage -[source,plaintext] +[source,docker,subs="attributes+"] ---- -files_external:export [options] [--] [] +{occ-command-example-prefix-docker} files_external:export [options] [--] [] ---- === Arguments @@ -312,9 +308,9 @@ Import mount configurations. === Usage -[source,plaintext +[source,docker,subs="attributes+"] ---- -files_external:import [options] [--] +{occ-command-example-prefix-docker} files_external:import [options] [--] ---- === Arguments @@ -340,9 +336,9 @@ Manage mount options for a mount. === Usage -[source,plaintext] +[source,docker,subs="attributes+"] ---- -files_external:option [] +{occ-command-example-prefix-docker} files_external:option [] ---- === Arguments @@ -361,9 +357,9 @@ Verify mount configuration. === Usage -[source,plaintext] +[source,docker,subs="attributes+"] ---- -files_external:verify [options] [--] +{occ-command-example-prefix-docker} files_external:verify [options] [--] ---- === Arguments diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_group_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_group_commands.adoc index d2a75084a..cc5b3d626 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_group_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_group_commands.adoc @@ -1,8 +1,6 @@ = Group Commands -The `group` commands provide a range of functionality for managing ownCloud groups. -This includes creating and removing groups and managing group membership. -Group names are case-sensitive, so "Finance" and "finance" are two different groups. +The `group` commands provide a range of functionality for managing ownCloud groups. This includes creating and removing groups and managing group membership. Group names are case-sensitive, so "Finance" and "finance" are two different groups. The full list of commands is: @@ -27,9 +25,9 @@ group:add groupname This example adds a new group, called "Finance": -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} group:add Finance +{occ-command-example-prefix-docker} group:add Finance Created group "Finance" ---- @@ -40,13 +38,12 @@ NOTE: Run this command inside the ownCloud Docker container. You can list the names of existing groups with the `group:list` command. The syntax is: +[source,docker,subs="attributes+"] ---- -group:list [options] [] +{occ-command-example-prefix-docker} group:list [options] [] ---- -Groups containing the `search-pattern` string are listed. -Matching is not case-sensitive. -If you do not provide a search-pattern then all groups are listed. +Groups containing the `search-pattern` string are listed. Matching is not case-sensitive. If you do not provide a search-pattern then all groups are listed. === Options @@ -57,9 +54,9 @@ If you do not provide a search-pattern then all groups are listed. This example lists groups containing the string "finance". -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} group:list finance +{occ-command-example-prefix-docker} group:list finance - All-Finance-Staff - Finance - Finance-Managers @@ -69,9 +66,9 @@ NOTE: Run this command inside the ownCloud Docker container. This example lists groups containing the string "finance" formatted with `json_pretty`. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} group:list --output=json_pretty finance +{occ-command-example-prefix-docker} group:list --output=json_pretty finance [ "All-Finance-Staff", "Finance", @@ -86,8 +83,9 @@ NOTE: Run this command inside the ownCloud Docker container. You can list the user IDs of group members with the `group:list-members` command. The syntax is: +[source,docker,subs="attributes+"] ---- -group:list-members [options] +-{occ-command-example-prefix-docker} group:list-members [options] ---- === Options @@ -101,7 +99,7 @@ This example lists members of the "Finance" group. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} group:list-members Finance +{occ-command-example-prefix-docker} group:list-members Finance - aaron: Aaron Smith - julie: Julie Jones ---- @@ -110,9 +108,9 @@ NOTE: Run this command inside the ownCloud Docker container. This example lists members of the Finance group formatted with `json_pretty`. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} group:list-members --output=json_pretty Finance +{occ-command-example-prefix-docker} group:list-members --output=json_pretty Finance { "aaron": "Aaron Smith", "julie": "Julie Jones" @@ -123,32 +121,29 @@ NOTE: Run this command inside the ownCloud Docker container. == Adding Members to Groups -You can add members to an existing group with the `group:add-member` command. -Members must be existing users. -The syntax is: +You can add members to an existing group with the `group:add-member` command. Members must be existing users. The syntax is: +[source,docker,subs="attributes+"] ---- -group:add-member [-m|--member [MEMBER]] +{occ-command-example-prefix-docker} group:add-member [-m|--member [MEMBER]] ---- This example adds members "aaron" and "julie" to group "Finance": -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} group:add-member --member aaron --member julie Finance +{occ-command-example-prefix-docker} group:add-member --member aaron --member julie Finance User "aaron" added to group "Finance" User "julie" added to group "Finance" ---- NOTE: Run this command inside the ownCloud Docker container. -You may attempt to add members that are already in the group, without error. -This allows you to add members in a scripted way without needing to know if the user is already a member of the group. -For example: +You may attempt to add members that are already in the group, without error. This allows you to add members in a scripted way without needing to know if the user is already a member of the group. For example: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} group:add-member --member aaron --member julie --member fred Finance +{occ-command-example-prefix-docker} group:add-member --member aaron --member julie --member fred Finance User "aaron" is already a member of group "Finance" User "julie" is already a member of group "Finance" User fred" added to group "Finance" @@ -161,28 +156,27 @@ NOTE: Run this command inside the ownCloud Docker container. You can remove members from a group with the `group:remove-member` command. The syntax is: +[source,docker,subs="attributes+"] ---- -group:remove-member [-m|--member [MEMBER]] +{occ-command-example-prefix-docker} group:remove-member [-m|--member [MEMBER]] ---- This example removes members "aaron" and "julie" from group "Finance". -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} group:remove-member --member aaron --member julie Finance +{occ-command-example-prefix-docker} group:remove-member --member aaron --member julie Finance Member "aaron" removed from group "Finance" Member "julie" removed from group "Finance" ---- NOTE: Run this command inside the ownCloud Docker container. -You may attempt to remove members that have already been removed from the group, without error. -This allows you to remove members in a scripted way without needing to know if the user is still a member of the group. -For example: +You may attempt to remove members that have already been removed from the group, without error. This allows you to remove members in a scripted way without needing to know if the user is still a member of the group. For example: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} group:remove-member --member aaron --member fred Finance +{occ-command-example-prefix-docker} group:remove-member --member aaron --member fred Finance Member "aaron" could not be found in group "Finance" Member "fred" removed from group "Finance" ---- @@ -193,9 +187,9 @@ NOTE: Run this command inside the ownCloud Docker container. To delete a group, you use the `group:delete` command, as in the example below: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} group:delete Finance +{occ-command-example-prefix-docker} group:delete Finance ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_incoming_shares_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_incoming_shares_commands.adoc index 2d32ddc3a..9e3fb2f90 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_incoming_shares_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_incoming_shares_commands.adoc @@ -1,28 +1,23 @@ = Poll Incoming Federated Shares For Updates -This command must be used if received federated shares are being referenced by desktop clients but not regularly accessed via the webUI. -This is because, for performance reasons, federated shares do not update automatically. -Instead, federated share directories are only updated when users browse them using the xref:classic_ui:files/webgui/overview.adoc[webUI]. +This command must be used if received federated shares are being referenced by desktop clients but not regularly accessed via the webUI. This is because, for performance reasons, federated shares do not update automatically. Instead, federated share directories are only updated when users browse them using the xref:classic_ui:files/webgui/overview.adoc[webUI]. ownCloud and system administrators can use the `incoming-shares:poll` command to poll federated shares for updates. NOTE: The command polls all received federated shares, so does not require a path. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} incoming-shares:poll +{occ-command-example-prefix-docker} incoming-shares:poll ---- NOTE: Run this command inside the ownCloud Docker container. [IMPORTANT] ==== -When using federation, it is recommended to execute `occ incoming-shares:poll` regularly xref:configuration/server/background_jobs_configuration.adoc#cron-jobs[using Cron jobs]. -The time interval between executions is a trade-off between the availability of changes in federated shares and resource consumption; which naturally depends a lot on the number of federated shares and the frequency of changes within those shares. +When using federation, it is recommended to execute `occ incoming-shares:poll` regularly xref:configuration/server/background_jobs_configuration.adoc#cron-jobs[using Cron jobs]. The time interval between executions is a trade-off between the availability of changes in federated shares and resource consumption; which naturally depends a lot on the number of federated shares and the frequency of changes within those shares. -Executing the command once every 12 hours _should_ be safe enough for most instances. -However, the interval can be reduced to once every 2 hours, for instances with a small number of federated shares. +Executing the command once every 12 hours _should_ be safe enough for most instances. However, the interval can be reduced to once every 2 hours, for instances with a small number of federated shares. -Depending on the desired resource consumption, this value should be lowered or increased based on individual expectations. -To find a value that fits a specific setup, it is recommended to execute the command once, measure the execution time and set the interval, so that the background job can finish before the next execution is triggered. +Depending on the desired resource consumption, this value should be lowered or increased based on individual expectations. To find a value that fits a specific setup, it is recommended to execute the command once, measure the execution time and set the interval, so that the background job can finish before the next execution is triggered. ==== diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_integrity_check_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_integrity_check_commands.adoc index 6f669f377..67bf0e54b 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_integrity_check_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_integrity_check_commands.adoc @@ -1,8 +1,6 @@ = Integrity Check -Apps which have an official tag *must* be code signed. -Unsigned official apps won't be installable anymore. -Code signing is optional for all third-party applications. +Apps which have an official tag *must* be code signed. Unsigned official apps won't be installable anymore. Code signing is optional for all third-party applications. [source,plaintext] ---- @@ -15,9 +13,9 @@ integrity After creating your signing key, sign your app like this example: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} integrity:sign-app \ +{occ-command-example-prefix-docker} integrity:sign-app \ --privateKey=/Users/karlmay/contacts.key \ --certificate=/Users/karlmay/CA/contacts.crt \ --path=/Users/karlmay/Programming/contacts @@ -27,15 +25,14 @@ NOTE: Run this command inside the ownCloud Docker container. Verify your app: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} integrity:check-app --path=/pathto/app appname +{occ-command-example-prefix-docker} integrity:check-app --path=/pathto/app appname ---- NOTE: Run this command inside the ownCloud Docker container. -When it returns nothing, your app is signed correctly. -When it returns a message then there is an error. +When it returns nothing, your app is signed correctly. When it returns a message then there is an error. `integrity:sign-core` is for ownCloud core developers only. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_localisation_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_localisation_commands.adoc index a0efb39a2..32f37406e 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_localisation_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_localisation_commands.adoc @@ -2,8 +2,7 @@ This command creates JavaScript and JSON translation files for ownCloud applications. -NOTE: The command does not update existing translations if the source translation file has been updated. -It only creates translation files when none are present for a given language. +NOTE: The command does not update existing translations if the source translation file has been updated. It only creates translation files when none are present for a given language. [source,plaintext] ---- @@ -24,9 +23,7 @@ In this example, we'll create Austrian German translations for the Comments app. NOTE: This example assumes that the ownCloud directory is `/var/www/owncloud` and that it uses ownCloud's standard apps directory, `app`. -First, create a source translation file in `/var/www/owncloud/apps/comments/l10n`, called `de_AT.php`. -In it, add the required translation strings, as in the following example. -Refer to the developer documentation on xref:developer_manual:app/advanced/l10n.adoc#creating-your-own-translatable-files[creating translation files], if you're not familiar with creating them. +First, create a source translation file in `/var/www/owncloud/apps/comments/l10n`, called `de_AT.php`. In it, add the required translation strings, as in the following example. Refer to the developer documentation on xref:developer_manual:app/advanced/l10n.adoc#creating-your-own-translatable-files[creating translation files], if you're not familiar with creating them. [source,php] ---- @@ -40,9 +37,9 @@ $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; After that, run the following command to create the translation. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} l10n:createjs comments de_AT +{occ-command-example-prefix-docker} l10n:createjs comments de_AT ---- NOTE: Run this command inside the ownCloud Docker container. @@ -53,9 +50,9 @@ This will generate two translation files, `de_AT.js` and `de_AT.json`, in `/var/ To create translations in multiple languages simultaneously, supply multiple languages to the command, as in the following example: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} l10n:createjs comments de_AT de_DE hu_HU es fr +{occ-command-example-prefix-docker} l10n:createjs comments de_AT de_DE hu_HU es fr ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_logging_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_logging_commands.adoc index 0eea00a22..9adb806ea 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_logging_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_logging_commands.adoc @@ -13,9 +13,9 @@ log Run `log:owncloud` to see your current logging status: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} log:owncloud +{occ-command-example-prefix-docker} log:owncloud Log backend ownCloud: enabled Log file: /opt/owncloud/data/owncloud.log Rotate at: disabled @@ -47,10 +47,10 @@ Options for `log:manage`: Log level can be adjusted by entering the number or the name: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} log:manage --level 4 -{occ-command-example-prefix} log:manage --level error +{occ-command-example-prefix-docker} log:manage --level 4 +{occ-command-example-prefix-docker} log:manage --level error ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_maintenance_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_maintenance_commands.adoc index 09d5a83bc..e8f3b14a1 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_maintenance_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_maintenance_commands.adoc @@ -19,9 +19,9 @@ maintenance When a backup has been restored, the ETag information, which is necessary when accessing ownCloud with clients, has been changed. Run the following command to tell desktop and mobile clients that a server backup has been restored. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:data-fingerprint +{occ-command-example-prefix-docker} maintenance:data-fingerprint ---- NOTE: Run this command inside the ownCloud Docker container. @@ -37,9 +37,9 @@ NOTE: This command is only available if the following key in your `config.php` i 'installed' => false, ---- -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:install [options] +{occ-command-example-prefix-docker} maintenance:install [options] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -90,9 +90,9 @@ Update database mimetypes and file cache. Usage: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mimetype:update-db [options] +{occ-command-example-prefix-docker} maintenance:mimetype:update-db [options] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -114,9 +114,9 @@ This command updates the `mimetypelist.js` file. Usage: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:update-js +{occ-command-example-prefix-docker} maintenance:update-js ---- NOTE: Run this command inside the ownCloud Docker container. @@ -126,9 +126,9 @@ NOTE: Run this command inside the ownCloud Docker container. `maintenance:mode` command locks the sessions of all logged-in users, including administrators, and displays a status screen warning that the server is in maintenance mode. Users who are not already logged in cannot log in until maintenance mode is turned off. Once you take the server out of maintenance mode, logged-in users must refresh their Web browsers to continue working. Usage: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode [options] +{occ-command-example-prefix-docker} maintenance:mode [options] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -149,18 +149,18 @@ The `maintenance:mode` command supports the following options: Turn on maintenance mode: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --on +{occ-command-example-prefix-docker} maintenance:mode --on ---- NOTE: Run this command inside the ownCloud Docker container. Turn it off when you’re finished with the maintenance tasks: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --off +{occ-command-example-prefix-docker} maintenance:mode --off ---- NOTE: Run this command inside the ownCloud Docker container. @@ -173,9 +173,9 @@ NOTE: Your ownCloud installation needs to be in maintenance mode to use the `mai Usage: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:repair [options] +{occ-command-example-prefix-docker} maintenance:repair [options] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -203,9 +203,9 @@ The `maintenance:repair` command supports the following options: Here is an example of running the command: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:repair +{occ-command-example-prefix-docker} maintenance:repair ---- NOTE: Run this command inside the ownCloud Docker container. @@ -240,9 +240,9 @@ To run a single repair step, use either the `-s` or `--single` options, as in th Usage: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:repair \ +{occ-command-example-prefix-docker} maintenance:repair \ --single="OCA\DAV\Repair\RemoveInvalidShares" ---- @@ -258,18 +258,18 @@ This is useful for performing maintenance and troubleshooting on a running serve Usage: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --on +{occ-command-example-prefix-docker} maintenance:singleuser --on ---- NOTE: Run this command inside the ownCloud Docker container. Turn it off when you're finished: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --off +{occ-command-example-prefix-docker} maintenance:singleuser --off ---- NOTE: Run this command inside the ownCloud Docker container. @@ -280,9 +280,9 @@ This command updates the `.htaccess` file. Usage: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:update:htaccess +{occ-command-example-prefix-docker} maintenance:update:htaccess ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_managing_background_jobs.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_managing_background_jobs.adoc index 127561c5e..0a061f04e 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_managing_background_jobs.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_managing_background_jobs.adoc @@ -12,12 +12,11 @@ background:queue == Deleting a Background Job -The command `background:queue:delete` deletes a queued background job. -It requires the job id of the job to be deleted. +The command `background:queue:delete` deletes a queued background job. It requires the job id of the job to be deleted. -[source,plaintext] +[source,docker,subs="attributes+"] ---- -background:queue:delete +{occ-command-example-prefix-docker} background:queue:delete ---- === Arguments @@ -31,9 +30,9 @@ WARNING: Deleting a job cannot be undone. Be sure that you want to delete the jo This example deletes queued background job #12. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} background:queue:delete 12 +{occ-command-example-prefix-docker} background:queue:delete 12 Job has been deleted. ---- @@ -42,12 +41,11 @@ NOTE: Run this command inside the ownCloud Docker container. == Executing a Background Job -The command `background:queue:execute` executes a queued background job. -It requires the job id of the job to be executed. +The command `background:queue:execute` executes a queued background job. It requires the job id of the job to be executed. -[source,plaintext] +[source,docker,subs="attributes+"] ---- -background:queue:execute [options] [--] +{occ-command-example-prefix-docker} background:queue:execute [options] [--] ---- === Arguments @@ -68,9 +66,9 @@ background:queue:execute [options] [--] This example executes queued background job #12. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} background:queue:execute 12 +{occ-command-example-prefix-docker} background:queue:execute 12 This command is for maintenance and support purposes. This will run the specified background job now. Regular scheduled runs of the job will @@ -88,9 +86,9 @@ NOTE: Run this command inside the ownCloud Docker container. The command `background:queue:status` will list queued background jobs, including details when it last ran. -[source,plaintext] +[source,docker,subs="attributes+"] ---- -background:queue:status +{occ-command-example-prefix-docker} background:queue:status ---- === Options @@ -102,9 +100,9 @@ background:queue:status This example lists the queue status: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} background:queue:status +{occ-command-example-prefix-docker} background:queue:status +--------+----------------------------------------------------+---------------+----------+---------------------------+-------------+------------------------+ | Job ID | Job | Job Arguments | Last Run | Last Checked | Reserved At | Execution Duration (s) | @@ -134,9 +132,9 @@ NOTE: Run this command inside the ownCloud Docker container. There may be background jobs that are no longer valid. This can be because they are for an app that is now disabled or deleted, or jobs from an older version of an app that are no longer relevant. These jobs can be displayed with the `--display-invalid-jobs` option. Invalid jobs are listed with status "invalid". You can then delete invalid jobs with the `background:queue:delete` command using the job id. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} background:queue:status --display-invalid-jobs +{occ-command-example-prefix-docker} background:queue:status --display-invalid-jobs +--------+----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------+---------------------------+-------------+------------------------+---------+ | Job ID | Job | Job Arguments | Last Run | Last Checked | Reserved At | Execution Duration (s) | Status | diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_migration_steps_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_migration_steps_commands.adoc index 982b5e093..22e3991f2 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_migration_steps_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_migration_steps_commands.adoc @@ -2,9 +2,9 @@ You can run migration steps with the `migrations` command. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrations:execute +{occ-command-example-prefix-docker} migrations:execute ---- NOTE: Run this command inside the ownCloud Docker container. @@ -21,9 +21,9 @@ NOTE: Run this command inside the ownCloud Docker container. This example executes the migration step for the core app: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} migrations:execute core 20181220085457 +{occ-command-example-prefix-docker} migrations:execute core 20181220085457 ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_mimetype_update_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_mimetype_update_commands.adoc index 36adc0d70..eb9974171 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_mimetype_update_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_mimetype_update_commands.adoc @@ -1,5 +1,3 @@ = Mimetype Update Commands -`maintenance:mimetype:update-db` updates the ownCloud database and file cache with changed mimetypes found in `config/mimetypemapping.json`. -Run this command after modifying `config/mimetypemapping.json`. -If you change a mimetype, run `maintenance:mimetype:update-db --repair-filecache` to apply the change to existing files. +`maintenance:mimetype:update-db` updates the ownCloud database and file cache with changed mimetypes found in `config/mimetypemapping.json`. Run this command after modifying `config/mimetypemapping.json`. If you change a mimetype, run `maintenance:mimetype:update-db --repair-filecache` to apply the change to existing files. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_notifications_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_notifications_commands.adoc index 52111eee6..371e0f2d8 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_notifications_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_notifications_commands.adoc @@ -10,9 +10,9 @@ notifications == Command Description -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} notifications:generate [-u|--user USER] [-g|--group GROUP] [-l|--link ] [--] [] +{occ-command-example-prefix-docker} notifications:generate [-u|--user USER] [-g|--group GROUP] [-l|--link ] [--] [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -38,13 +38,11 @@ NOTE: Run this command inside the ownCloud Docker container. `--link=[LINK]` | A link associated with the notification. |=== -At least one user or group must be set. -A link can be useful for notifications shown in client apps. -Example: +At least one user or group must be set. A link can be useful for notifications shown in client apps. Example: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} notifications:generate -g Office "Emergency Alert" "Rebooting in 5min" +{occ-command-example-prefix-docker} notifications:generate -g Office "Emergency Alert" "Rebooting in 5min" ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_previews_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_previews_commands.adoc index 15c839915..83906bd80 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_previews_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_previews_commands.adoc @@ -12,9 +12,9 @@ previews Removing not referenced previews can be necessary, e.g., when the image has been deleted or the ID of the mountpoint changes which happens when renaming it. Previews will be generated anew when accessing the image again, but not referenced previews are orphans. To avoid orphans, an occ command has been added to manually remove those not referenced previews as they are eating up storage space unnecessarily. In addition, a background job has been created which automatically removes them on a regular basis. For more info see the xref:background-job[Background Job] section and the example listing xref:configuration/server/occ_command.adoc#list-queued-backgroundjobs[OCA\Files\BackgroundJob\PreviewCleanupJob]. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} previews:cleanup [options] [--] [] +{occ-command-example-prefix-docker} previews:cleanup [options] [--] [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -52,9 +52,9 @@ Description: In the example below, you run one loop with max (default) 1000 files processed. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} previews:cleanup +{occ-command-example-prefix-docker} previews:cleanup ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_security_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_security_commands.adoc index 8235477e7..d87595cd2 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_security_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_security_commands.adoc @@ -1,8 +1,6 @@ = Security -Use these commands when you manage security related tasks. -Routes displays all routes of ownCloud. -You can use this information to grant strict access via firewalls, proxies or load balancers etc. +Use these commands when you manage security related tasks. Routes displays all routes of ownCloud. You can use this information to grant strict access via firewalls, proxies or load balancers etc. == Command Description @@ -21,9 +19,9 @@ security:routes [options] Example 1: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} security:routes +{occ-command-example-prefix-docker} security:routes ---- NOTE: Run this command inside the ownCloud Docker container. @@ -43,9 +41,9 @@ NOTE: Run this command inside the ownCloud Docker container. Example 2: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} security:routes --output=json-pretty +{occ-command-example-prefix-docker} security:routes --output=json-pretty ---- NOTE: Run this command inside the ownCloud Docker container. @@ -63,9 +61,9 @@ NOTE: Run this command inside the ownCloud Docker container. Example 3: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} security:routes --with-details +{occ-command-example-prefix-docker} security:routes --with-details ---- NOTE: Run this command inside the ownCloud Docker container. @@ -93,27 +91,27 @@ security:certificates:remove Remove trusted certificate This example lists your installed certificates: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} security:certificates +{occ-command-example-prefix-docker} security:certificates ---- NOTE: Run this command inside the ownCloud Docker container. Import a new certificate: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} security:certificates:import /path/to/certificate +{occ-command-example-prefix-docker} security:certificates:import /path/to/certificate ---- NOTE: Run this command inside the ownCloud Docker container. Remove a certificate: -[source,bash,subs="attributes+"] +[source,docker ,subs="attributes+"] ---- -{occ-command-example-prefix} security:certificates:remove [certificate name] +{occ-command-example-prefix-docker} security:certificates:remove [certificate name] ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_sharing_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_sharing_commands.adoc index 442e1fec6..33a9e6fe1 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_sharing_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_sharing_commands.adoc @@ -2,22 +2,15 @@ == Cleanup Remote Storages -This is an occ command to clean up orphaned remote storages. -To explain why this is necessary, a little background is required. -While shares are able to be deleted as a normal matter of course, remote storages with `shared::` are not included in this process. +This is an occ command to clean up orphaned remote storages. To explain why this is necessary, a little background is required. While shares are able to be deleted as a normal matter of course, remote storages with `shared::` are not included in this process. -This might not, normally, be a problem. -However, if a user has re-shared a remote share which has been deleted it will. -This is because when the original share is deleted, the remote re-share reference is not. -Internally, the `fileid` will remain in the file cache and storage for that file will not be deleted. +This might not, normally, be a problem. However, if a user has re-shared a remote share which has been deleted it will. This is because when the original share is deleted, the remote re-share reference is not. Internally, the `fileid` will remain in the file cache and storage for that file will not be deleted. -As a result, any user(s) who the share was re-shared with will now get an error when trying to access that file or folder. -That's why the command is available. -So, to cleanup all orphaned remote storages, run it as follows: +As a result, any user(s) who the share was re-shared with will now get an error when trying to access that file or folder. That's why the command is available. So, to cleanup all orphaned remote storages, run it as follows: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} sharing:cleanup-remote-storages +{occ-command-example-prefix-docker} sharing:cleanup-remote-storages ---- NOTE: Run this command inside the ownCloud Docker container. @@ -30,18 +23,18 @@ NOTE: These commands are not available in xref:maintenance-commands[single-user Currently, if a federated share is invalid or the API endpoint returns a "not found", the availability check tests whether this is a problem with a server. If checks complete, that given share is removed. However, in some cases these checks might not be enough like in complex migrations of tightly federated setups. In that case, invalidation behavior can be disabled using the below app setting. When set, instead of removing the share, a warning is displayed in the browser. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_sharing enable_cleanup_invalid_external_shares --value no +{occ-command-example-prefix-docker} config:app:set files_sharing enable_cleanup_invalid_external_shares --value no ---- NOTE: Run this command inside the ownCloud Docker container. To revert that setting to its default behavior, run: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:delete files_sharing enable_cleanup_invalid_external_shares +{occ-command-example-prefix-docker} config:app:delete files_sharing enable_cleanup_invalid_external_shares ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_system_command.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_system_command.adoc index 9938a2c2b..f31147b2e 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_system_command.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_system_command.adoc @@ -6,9 +6,9 @@ system:cron Execute background jobs as cron ---- -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} -h system:cron +{occ-command-example-prefix-docker} -h system:cron -Usage: system:cron [options] ---- @@ -26,9 +26,9 @@ Do not use when executing from crontab To execute xref:configuration/server/background_jobs_configuration.adoc[background jobs] using xref:configuration/server/background_jobs_configuration.adoc#cron[cron], you can use the `system:cron` command, as in the following example: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} system:cron +{occ-command-example-prefix-docker} system:cron ---- NOTE: Run this command inside the ownCloud Docker container. @@ -60,9 +60,9 @@ Instead of the following configuration ---- Use the following one instead -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} system:cron +{occ-command-example-prefix-docker} system:cron ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_trashbin_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_trashbin_commands.adoc index b66993974..321633128 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_trashbin_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_trashbin_commands.adoc @@ -1,7 +1,6 @@ = Trashbin -NOTE: These commands are only available when the 'Deleted files' app (`files_trashbin`) is enabled. -These commands are not available in xref:maintenance-commands[single-user (maintenance) mode]. +NOTE: These commands are only available when the 'Deleted files' app (`files_trashbin`) is enabled. These commands are not available in xref:maintenance-commands[single-user (maintenance) mode]. [source,plaintext] ---- @@ -13,9 +12,9 @@ trashbin The `trashbin:cleanup` command removes the deleted files of the specified users in a space-delimited list, or all users if none are specified. This example removes all the deleted files of all users: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} trashbin:cleanup +{occ-command-example-prefix-docker} trashbin:cleanup Remove all deleted files Remove deleted files for users on backend Database freda @@ -29,14 +28,13 @@ NOTE: Run this command inside the ownCloud Docker container. This example removes the deleted files of users `molly` and `freda`: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} trashbin:cleanup molly freda +{occ-command-example-prefix-docker} trashbin:cleanup molly freda Remove deleted files of molly Remove deleted files of freda ---- NOTE: Run this command inside the ownCloud Docker container. -`trashbin:expire` deletes only expired files according to the `trashbin_retention_obligation` setting in `config.php` (see xref:configuration/server/config_sample_php_parameters.adoc[the "Deleted Files" section documentation]). -The default is to delete expired files for all users, or you may list users in a space-delimited list. +`trashbin:expire` deletes only expired files according to the `trashbin_retention_obligation` setting in `config.php` (see xref:configuration/server/config_sample_php_parameters.adoc[the "Deleted Files" section documentation]). The default is to delete expired files for all users, or you may list users in a space-delimited list. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_user_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_user_commands.adoc index f45a75aea..535a15467 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_user_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_user_commands.adoc @@ -2,9 +2,7 @@ :temp-dir-url: https://systemd.io/TEMPORARY_DIRECTORIES/ -The `user` commands provide a range of functionality for managing ownCloud users. -This includes: creating and removing users, resetting user passwords, displaying a report which shows how many users you have, and when a user was last logged in. -The full list, of commands is: +The `user` commands provide a range of functionality for managing ownCloud users. This includes: creating and removing users, resetting user passwords, displaying a report which shows how many users you have, and when a user was last logged in. The full list, of commands is: [source,plaintext] ---- @@ -31,9 +29,9 @@ user You can create a new user with the `user:add` command. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:add \ +{occ-command-example-prefix-docker} user:add \ [--password-from-env] \ [--display-name [DISPLAY-NAME]] \ [--email [EMAIL]] \ @@ -77,9 +75,9 @@ This example adds new user, Layla Smith, and adds her to the `users` and `db-adm If either group does not exist, it is created. .Create a user with a password, email address, and display name, and add them to two groups -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:add \ +{occ-command-example-prefix-docker} user:add \ --display-name="Layla Smith" \ --group="users" \ --group="db-admins" \ @@ -96,9 +94,9 @@ If either group does not exist, it is created. NOTE: Run this command inside the ownCloud Docker container. .Create a user with a temporary password (the user will receive a link to set their password). -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:add \ +{occ-command-example-prefix-docker} user:add \ --display-name "Layla Smith" \ --email "***********" \ --group "users" \ @@ -117,9 +115,9 @@ NOTE: Run this command inside the ownCloud Docker container. To delete a user, you use the `user:delete` command. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:delete [options] [--] +{occ-command-example-prefix-docker} user:delete [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -141,9 +139,9 @@ NOTE: Run this command inside the ownCloud Docker container. | Try to force the deletion of the user data even if the user is missing. |=== -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:delete fred +{occ-command-example-prefix-docker} user:delete fred ---- NOTE: Run this command inside the ownCloud Docker container. @@ -152,9 +150,9 @@ NOTE: Run this command inside the ownCloud Docker container. Admins can disable users via the occ command too: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:disable +{occ-command-example-prefix-docker} user:disable ---- NOTE: Run this command inside the ownCloud Docker container. @@ -171,9 +169,9 @@ NOTE: Once users are disabled, their connected browsers will be disconnected. Us == Enable Users -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:enable +{occ-command-example-prefix-docker} user:enable ---- NOTE: Run this command inside the ownCloud Docker container. @@ -192,9 +190,9 @@ List all available root directories for user homes that are currently in use. Fo This command is complementary when using `user:move-home`. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:home:list-dirs [options] +{occ-command-example-prefix-docker} user:home:list-dirs [options] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -209,9 +207,9 @@ NOTE: Run this command inside the ownCloud Docker container. === Examples -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:home:list-dirs +{occ-command-example-prefix-docker} user:home:list-dirs - /var/www/owncloud/data ---- @@ -223,9 +221,9 @@ List all users that have their home in a given path. For details see xref:config This command is complementary when using `user:move-home`. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:home:list-users [options] [--] [] +{occ-command-example-prefix-docker} user:home:list-users [options] [--] [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -253,9 +251,9 @@ NOTE: Run this command inside the ownCloud Docker container. Note for the example below, some user accounts originated from LDAP. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:home:list-users /var/www/owncloud/data +{occ-command-example-prefix-docker} user:home:list-users /var/www/owncloud/data - admin - aca4c3ec-691d-103b-8380-55a4da3d3a76 - 9918b614-6a2e-103b-89a7-f5edf5d332f5 @@ -267,9 +265,9 @@ NOTE: Run this command inside the ownCloud Docker container. Run the following command to list all users from all available home directories. The example shows, that user `lisa` has been moved to a different home directory with `user:move-home`. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:home:list-users --all +{occ-command-example-prefix-docker} user:home:list-users --all - /mnt/newhome_1 - lisa - /var/www/owncloud/data @@ -283,9 +281,9 @@ NOTE: Run this command inside the ownCloud Docker container. To view a list of users who've not logged in for a given number of days, use the `user:inactive` command. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:inactive [options] [--] +{occ-command-example-prefix-docker} user:inactive [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -308,9 +306,9 @@ NOTE: Run this command inside the ownCloud Docker container. The example below searches for users inactive for five days or more: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:inactive 5 +{occ-command-example-prefix-docker} user:inactive 5 ---- NOTE: Run this command inside the ownCloud Docker container. @@ -349,9 +347,9 @@ Using the output option `json_pretty` will render the output formatted as follow To view a user's most recent login, use the `user:lastseen` command: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:lastseen +{occ-command-example-prefix-docker} user:lastseen ---- NOTE: Run this command inside the ownCloud Docker container. @@ -366,9 +364,9 @@ NOTE: Run this command inside the ownCloud Docker container. Example -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:lastseen layla +{occ-command-example-prefix-docker} user:lastseen layla layla's last login: 09.01.2015 18:46 ---- @@ -378,9 +376,9 @@ NOTE: Run this command inside the ownCloud Docker container. You can list existing users with the `user:list` command. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:list [options] [] +{occ-command-example-prefix-docker} user:list [options] [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -411,9 +409,9 @@ Allowed attributes, multiple values possible: + This example lists user IDs containing the string `ron` -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:list ron +{occ-command-example-prefix-docker} user:list ron - aaron: Aaron Smith ---- @@ -421,9 +419,9 @@ NOTE: Run this command inside the ownCloud Docker container. The output can be formatted in JSON with the output option `json` or `json_pretty`. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:list --output=json_pretty +{occ-command-example-prefix-docker} user:list --output=json_pretty { "aaron": "Aaron Smith", "herbert": "Herbert Smith", @@ -435,9 +433,9 @@ NOTE: Run this command inside the ownCloud Docker container. This example lists all users including the attribute `enabled`. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:list -a enabled +{occ-command-example-prefix-docker} user:list -a enabled - admin: true - foo: true ---- @@ -448,9 +446,9 @@ NOTE: Run this command inside the ownCloud Docker container. You can list the group membership of a user with the `user:list-groups` command. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:list-groups [options] [--] +{occ-command-example-prefix-docker} user:list-groups [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -475,9 +473,9 @@ NOTE: Run this command inside the ownCloud Docker container. This example lists group membership of user `julie`: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:list-groups julie +{occ-command-example-prefix-docker} user:list-groups julie - Executive - Finance ---- @@ -486,9 +484,9 @@ NOTE: Run this command inside the ownCloud Docker container. The output can be formatted in JSON with the output option `json` or `json_pretty`: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:list-groups --output=json_pretty julie +{occ-command-example-prefix-docker} user:list-groups --output=json_pretty julie [ "Executive", "Finance" @@ -501,9 +499,9 @@ NOTE: Run this command inside the ownCloud Docker container. This command modifies either the users username or email address. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:modify [options] [--] +{occ-command-example-prefix-docker} user:modify [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -524,9 +522,9 @@ NOTE: Run this command inside the ownCloud Docker container. All three arguments are mandatory and can not be empty. Example to set the email address: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:modify carla email foobar@foo.com +{occ-command-example-prefix-docker} user:modify carla email foobar@foo.com ---- NOTE: Run this command inside the ownCloud Docker container. @@ -537,9 +535,9 @@ The email address of `carla` is updated to `foobar@foo.com`. This command moves a user's home folder to a new location. For details see xref:configuration/user/user_management.adoc#moving-the-user-home[Moving the User Home] documentation. Note that moving a users home is only possible for POSIX file systems. Also see the `user:home` commands for additional support. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:move-home +{occ-command-example-prefix-docker} user:move-home ---- NOTE: Run this command inside the ownCloud Docker container. @@ -565,9 +563,9 @@ You must not use temp directories like `/tmp` and `/var/tmp` as target directory Example: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:move-home lisa /mnt/newhome_1 +{occ-command-example-prefix-docker} user:move-home lisa /mnt/newhome_1 ---- NOTE: Run this command inside the ownCloud Docker container. @@ -576,21 +574,20 @@ This command moves the home directory of user `lisa` to the new location `/mnt/n == Generating a User Count Report -Generate a simple report that counts all users including users on external user authentication servers such as LDAP, -and guest users which are created by the guests app. +Generate a simple report that counts all users including users on external user authentication servers such as LDAP, and guest users which are created by the guests app. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:report +{occ-command-example-prefix-docker} user:report ---- NOTE: Run this command inside the ownCloud Docker container. There are no arguments and no options beside the default once to parametrize the output. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:report +{occ-command-example-prefix-docker} user:report +--------------------------+-----+ | User Report | | +--------------------------+-----+ @@ -613,9 +610,9 @@ NOTE: A user directory is created, when a local user has logged on the first tim Resets the password of the named user. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:resetpassword [options] [--] +{occ-command-example-prefix-docker} user:resetpassword [options] [--] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -667,9 +664,9 @@ User "fred" added to group "users" You can reset any user's password, including administrators (see xref:configuration/user/reset_admin_password.adoc[Reset Admin Password]): -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:resetpassword layla +{occ-command-example-prefix-docker} user:resetpassword layla Enter a new password: Confirm the new password: Successfully reset password for layla @@ -691,9 +688,9 @@ Successfully reset password for layla This example emails a password reset link to the user. Additionally, when the command completes, it outputs the password reset link to the console: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:resetpassword \ +{occ-command-example-prefix-docker} user:resetpassword \ --send-email \ --output-link \ layla @@ -718,9 +715,9 @@ To manage application settings for a user, use the `user:setting` command. This * Set a setting value * Delete a setting -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:setting [options] [--] [[ []] +{occ-command-example-prefix-docker} user:setting [options] [--] [[ []] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -786,9 +783,9 @@ A complete list cannot be supplied as it is impossible to know the entire list o To retrieve settings for a user, you need to call the `user:setting` command and supply at least the user's user name. You can drill down restricting results to a particular app and a key in the app. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:setting [] [] +{occ-command-example-prefix-docker} user:setting [] [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -811,9 +808,9 @@ NOTE: Run this command inside the ownCloud Docker container. . Retrieve all settings set for a given user: + -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:setting layla +{occ-command-example-prefix-docker} user:setting layla - core: - lang: en - login: @@ -829,9 +826,9 @@ Here we see that the user has settings for the application `core`, when they las . Retrieve all settings set restricted to application `core` for a given user: + -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:setting layla core +{occ-command-example-prefix-docker} user:setting layla core - core: - lang: en ---- @@ -843,9 +840,9 @@ In the output, you can see that one setting is in effect, `lang`, which is set t . Retrieve all settings set restricted to application `core`, key `lang` for a given user + -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:setting layla core lang +{occ-command-example-prefix-docker} user:setting layla core lang ---- NOTE: Run this command inside the ownCloud Docker container. @@ -857,7 +854,7 @@ This will display the value for that setting, such as `en`. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} user:setting [options] [--] [] [] +{occ-command-example-prefix-docker} user:setting [options] [--] [] [] ---- NOTE: Run this command inside the ownCloud Docker container. @@ -866,30 +863,25 @@ IMPORTANT: In case you want to change the email address, use xref:modify-user-de Here's an example of how you would set the language of the user `layla`. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:setting layla core lang --value=en +{occ-command-example-prefix-docker} user:setting layla core lang --value=en ---- NOTE: Run this command inside the ownCloud Docker container. -Deleting a setting is quite similar to setting a setting. -In this case, you supply the username, application (or setting category) and key as above. -Then, in addition, you supply the `--delete` flag. +Deleting a setting is quite similar to setting a setting. In this case, you supply the username, application (or setting category) and key as above. Then, in addition, you supply the `--delete` flag. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:setting layla core lang --delete +{occ-command-example-prefix-docker} user:setting layla core lang --delete ---- NOTE: Run this command inside the ownCloud Docker container. == Syncing User Accounts -This command syncs users stored in external backend services, such as _LDAP_, _Shibboleth_, and _Samba_, with ownCloud's, internal user database. -However, it's not essential to run it regularly, unless you have a large number of users whose account properties have changed in a backend outside of ownCloud. -When run, it will pick up changes from alternative user backends, such as LDAP, where properties like `cn` or `display name` have changed, and sync them with ownCloud's user database. -If accounts are found that no longer exist in the external backend, you are given the choice of either removing or disabling the +This command syncs users stored in external backend services, such as _LDAP_, _Shibboleth_, and _Samba_, with ownCloud's, internal user database. However, it's not essential to run it regularly, unless you have a large number of users whose account properties have changed in a backend outside of ownCloud. When run, it will pick up changes from alternative user backends, such as LDAP, where properties like `cn` or `display name` have changed, and sync them with ownCloud's user database. If accounts are found that no longer exist in the external backend, you are given the choice of either removing or disabling the accounts. NOTE: It's also xref:configuration/server/background_jobs_configuration.adoc#available-background-jobs[one of the commands] that you should run on a regular basis to ensure that your ownCloud installation is running optimally. @@ -898,9 +890,9 @@ NOTE: This command replaces the old `show-remnants` functionality, and brings th === Usage -[source,plaintext] +[source,docker,subs="attributes+"] ---- -user:sync [options] [--] [] +{occ-command-example-prefix-docker} user:sync [options] [--] [] ---- Synchronize users from a given backend to the accounts table. @@ -964,18 +956,18 @@ and _Shibboleth_ backend. === LDAP -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:sync "OCA\User_LDAP\User_Proxy" +{occ-command-example-prefix-docker} user:sync "OCA\User_LDAP\User_Proxy" ---- NOTE: Run this command inside the ownCloud Docker container. === Samba -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:sync "OCA\User\SMB" -vvv +{occ-command-example-prefix-docker} user:sync "OCA\User\SMB" -vvv ---- NOTE: Run this command inside the ownCloud Docker container. @@ -984,9 +976,9 @@ Below are examples of how to use the command with the *LDAP* backend along with === Example 1 -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:sync "OCA\User_LDAP\User_Proxy" -m disable -r +{occ-command-example-prefix-docker} user:sync "OCA\User_LDAP\User_Proxy" -m disable -r Analysing all users ... 6 [============================] @@ -1002,9 +994,9 @@ NOTE: Run this command inside the ownCloud Docker container. === Example 2 -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:sync "OCA\User_LDAP\User_Proxy" -m disable -r +{occ-command-example-prefix-docker} user:sync "OCA\User_LDAP\User_Proxy" -m disable -r Analysing all users ... 6 [============================] @@ -1024,9 +1016,9 @@ NOTE: Run this command inside the ownCloud Docker container. === Example 3 -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:sync "OCA\User_LDAP\User_Proxy" -m disable -r +{occ-command-example-prefix-docker} user:sync "OCA\User_LDAP\User_Proxy" -m disable -r Analysing all users ... 6 [============================] @@ -1047,9 +1039,9 @@ NOTE: Run this command inside the ownCloud Docker container. === Example 4 -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:sync "OCA\User_LDAP\User_Proxy" -m disable -r +{occ-command-example-prefix-docker} user:sync "OCA\User_LDAP\User_Proxy" -m disable -r Analysing all users ... 6 [============================] @@ -1068,9 +1060,9 @@ NOTE: Run this command inside the ownCloud Docker container. === Example 5 -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:sync "OCA\User_LDAP\User_Proxy" -m remove +{occ-command-example-prefix-docker} user:sync "OCA\User_LDAP\User_Proxy" -m remove ---- @@ -1078,9 +1070,9 @@ NOTE: Run this command inside the ownCloud Docker container. === Example 6 -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} user:sync "OCA\User_LDAP\User_Proxy" +{occ-command-example-prefix-docker} user:sync "OCA\User_LDAP\User_Proxy" If unknown users are found, what do you want to do with their accounts? (removing the account will also remove its data) [0] disable [1] remove diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_versions_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_versions_commands.adoc index 51d1ed1b8..6e622660f 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_versions_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_versions_commands.adoc @@ -1,15 +1,14 @@ = Versions -NOTE: These commands are only available when the "Versions" app (`files_versions`) is enabled. -These commands are not available in xref:maintenance-commands[single-user (maintenance) mode]. +NOTE: These commands are only available when the "Versions" app (`files_versions`) is enabled. These commands are not available in xref:maintenance-commands[single-user (maintenance) mode]. == versions:cleanup `versions:cleanup` can delete all versioned files, as well as the `files_versions` folder, for either specific users, or for all users. A Published version persists until the original file is deleted by somebody with such permission or via the `occ versions:cleanup` command. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} versions:cleanup []... +{occ-command-example-prefix-docker} versions:cleanup []... ---- NOTE: Run this command inside the ownCloud Docker container. @@ -23,9 +22,9 @@ Options The example below deletes all versioned files for all users: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} versions:cleanup +{occ-command-example-prefix-docker} versions:cleanup Delete all versions Delete versions for users on backend Database freda @@ -39,9 +38,9 @@ NOTE: Run this command inside the ownCloud Docker container. You can delete versions for specific users in a space-delimited list: -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} versions:cleanup freda molly +{occ-command-example-prefix-docker} versions:cleanup freda molly Delete versions of freda Delete versions of molly ---- @@ -50,12 +49,11 @@ NOTE: Run this command inside the ownCloud Docker container. == versions:expire -`versions:expire` deletes only expired files according to the `versions_retention_obligation` setting in `config.php` (see the File versions section in config_sample_php_parameters). -The default is to delete expired files for all users, or you may list users in a space-delimited list. +`versions:expire` deletes only expired files according to the `versions_retention_obligation` setting in `config.php` (see the File versions section in config_sample_php_parameters). The default is to delete expired files for all users, or you may list users in a space-delimited list. -[source,bash,subs="attributes+"] +[source,docker,subs="attributes+"] ---- -{occ-command-example-prefix} versions:expire []... +{occ-command-example-prefix-docker} versions:expire []... ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/security/hsmdaemon/index.adoc b/modules/admin_manual/pages/configuration/server/security/hsmdaemon/index.adoc index c6c5d7c2d..17e6f2edd 100644 --- a/modules/admin_manual/pages/configuration/server/security/hsmdaemon/index.adoc +++ b/modules/admin_manual/pages/configuration/server/security/hsmdaemon/index.adoc @@ -400,7 +400,7 @@ ep6Y1aAVAYpAesZ1+sQzzUepjO82o34kjmm63Drmz+6KED4oIBARQkXeW/OoxgUg6kQhQK1thA/3Ww33 [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:hsmdaemon:decrypt --keyId $key_id "$test_enc" +{occ-command-example-prefix-docker} encryption:hsmdaemon:decrypt --keyId $key_id "$test_enc" decrypted string (base64 encoded): 'SGVsbG8sIHdvcmxkIQo=' ---- @@ -499,7 +499,7 @@ Set the generated secret for ownCloud: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set encryption hsm.jwt.secret --value '7a7d1826-b514-4d9f-afc7-a7485084e8de' +{occ-command-example-prefix-docker} config:app:set encryption hsm.jwt.secret --value '7a7d1826-b514-4d9f-afc7-a7485084e8de' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -517,9 +517,9 @@ Enable the HSM mode and enable encryption by running the commands in the followi [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:enable encryption -{occ-command-example-prefix} config:app:set encryption hsm.url --value 'http://localhost:8513' -{occ-command-example-prefix} encryption:enable +{occ-command-example-prefix-docker} app:enable encryption +{occ-command-example-prefix-docker} config:app:set encryption hsm.url --value 'http://localhost:8513' +{occ-command-example-prefix-docker} encryption:enable ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/ui-configuration.adoc b/modules/admin_manual/pages/configuration/server/ui-configuration.adoc index 1c5965b4d..e09442068 100644 --- a/modules/admin_manual/pages/configuration/server/ui-configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/ui-configuration.adoc @@ -19,7 +19,7 @@ This progress bar can be hidden with the following command: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files hide_upload_estimation --value="yes" +{occ-command-example-prefix-docker} config:app:set files hide_upload_estimation --value="yes" ---- NOTE: Run this command inside the ownCloud Docker container. @@ -28,7 +28,7 @@ To show the progress bar again, type one of the following commands: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files hide_upload_estimation --value="no" +{occ-command-example-prefix-docker} config:app:set files hide_upload_estimation --value="no" ---- NOTE: Run this command inside the ownCloud Docker container. @@ -37,7 +37,7 @@ or [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:delete files hide_upload_estimation +{occ-command-example-prefix-docker} config:app:delete files hide_upload_estimation ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc b/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc index 9ba9dd219..52b506ce8 100644 --- a/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc +++ b/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc @@ -66,7 +66,7 @@ image::configuration/server/virus-scanner-support/antivirus-app.png[Anti-Virus A + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} market:install files_antivirus +{occ-command-example-prefix-docker} market:install files_antivirus ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -75,7 +75,7 @@ and enable it with the following occ command: + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:enable files_antivirus +{occ-command-example-prefix-docker} app:enable files_antivirus ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -92,7 +92,7 @@ All of the configuration settings for the Anti-Virus app are configurable by pas [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_antivirus \ +{occ-command-example-prefix-docker} config:app:set files_antivirus \ av_socket --value="/var/run/clamav/clamd.ctl" ---- @@ -102,7 +102,7 @@ To get a current option, run for example: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:get files_antivirus \ +{occ-command-example-prefix-docker} config:app:get files_antivirus \ av_socket ---- @@ -307,7 +307,7 @@ ClamAV runs in one of three modes: In both daemon modes, background scans are enabled by default. If you want to disable them, run the command: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_antivirus av_scan_background --value 'false' +{occ-command-example-prefix-docker} config:app:set files_antivirus av_scan_background --value 'false' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -425,7 +425,7 @@ Use the following occ commands to set configurations based on your environment: + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_antivirus \ +{occ-command-example-prefix-docker} config:app:set files_antivirus \ av_host --value="172.17.0.3" ---- + @@ -435,7 +435,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_antivirus \ +{occ-command-example-prefix-docker} config:app:set files_antivirus \ av_port --value="1344" ---- + @@ -445,7 +445,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_antivirus \ +{occ-command-example-prefix-docker} config:app:set files_antivirus \ av_scan_background --value="true" ---- + @@ -455,7 +455,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_antivirus \ +{occ-command-example-prefix-docker} config:app:set files_antivirus \ av_infected_action --value="delete" ---- + @@ -473,7 +473,7 @@ The following settings are just examples and must be adjusted for the scanner yo + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_antivirus \ +{occ-command-example-prefix-docker} config:app:set files_antivirus \ av_mode --value="icap" ---- + @@ -483,7 +483,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_antivirus \ +{occ-command-example-prefix-docker} config:app:set files_antivirus \ av_request_service --value="avscan" ---- + @@ -493,7 +493,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_antivirus \ +{occ-command-example-prefix-docker} config:app:set files_antivirus \ av_response_header --value="X-Infection-Found" ---- + diff --git a/modules/admin_manual/pages/configuration/user/oidc/oidc.adoc b/modules/admin_manual/pages/configuration/user/oidc/oidc.adoc index 6174416ab..4c7c1eacc 100644 --- a/modules/admin_manual/pages/configuration/user/oidc/oidc.adoc +++ b/modules/admin_manual/pages/configuration/user/oidc/oidc.adoc @@ -86,7 +86,7 @@ If a malformed JSON string is found, an error is logged. The _key->value_ pairs [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set \ +{occ-command-example-prefix-docker} config:app:set \ openidconnect \ openid-connect \ --value='{"provider-url":"https:\/\/idp.example.net","client-id":"fc9b5c78-ec73-47bf-befc-59d4fe780f6f","client-secret":"e3e5b04a-3c3c-4f4d-b16c-2a6e9fdd3cd1","loginButtonName":"Login via OpenId Connect"}' diff --git a/modules/admin_manual/pages/configuration/user/reset_admin_password.adoc b/modules/admin_manual/pages/configuration/user/reset_admin_password.adoc index 9b1b8e995..a9611cb14 100644 --- a/modules/admin_manual/pages/configuration/user/reset_admin_password.adoc +++ b/modules/admin_manual/pages/configuration/user/reset_admin_password.adoc @@ -16,7 +16,7 @@ HTTP user, as in this example on Ubuntu Linux: [source,bash,subs="attributes+"] ---- -$ {occ-command-example-prefix} user:resetpassword admin +$ {occ-command-example-prefix-docker} user:resetpassword admin Enter a new password: Confirm the new password: Successfully reset password for admin diff --git a/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc b/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc index 5582dee81..7cbae429b 100644 --- a/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc +++ b/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc @@ -314,7 +314,7 @@ Disallowing login with LDAP Email Address requires enabling strict login checkin [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:set --type boolean --value true strict_login_enforced +{occ-command-example-prefix-docker} config:system:set --type boolean --value true strict_login_enforced ---- NOTE: Run this command inside the ownCloud Docker container. @@ -619,7 +619,7 @@ Since ownCloud 8.0.10 and up the home folder rule is enforced. This means that o [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set user_ldap enforce_home_folder_naming_rule --value=1 +{occ-command-example-prefix-docker} config:app:set user_ldap enforce_home_folder_naming_rule --value=1 ---- NOTE: Run this command inside the ownCloud Docker container. @@ -732,7 +732,7 @@ To enable this functionality, the `reuse_accounts` config setting must be set to [source,bash,subs="attributes+"] .... -{occ-command-example-prefix} config:app:set user_ldap reuse_accounts --value=yes +{occ-command-example-prefix-docker} config:app:set user_ldap reuse_accounts --value=yes .... NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/user/user_management.adoc b/modules/admin_manual/pages/configuration/user/user_management.adoc index fb12f4a03..1a0602cf1 100644 --- a/modules/admin_manual/pages/configuration/user/user_management.adoc +++ b/modules/admin_manual/pages/configuration/user/user_management.adoc @@ -184,7 +184,7 @@ For details of the occ user commands used below, see the xref:configuration/serv + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} user:list lisa -a home +{occ-command-example-prefix-docker} user:list lisa -a home - lisa: /var/www/owncloud/data/lisa ---- + @@ -206,7 +206,7 @@ Use the OS methods to create one or more new mount points for users home directo + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} user:move-home lisa /mnt/newhome_1 +{occ-command-example-prefix-docker} user:move-home lisa /mnt/newhome_1 ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -227,7 +227,7 @@ NOTE: If you are using LDAP and the xref:enterprise/external_storage/ldap_home_c + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} user:list lisa -a home +{occ-command-example-prefix-docker} user:list lisa -a home - lisa: /mnt/newhome_1/lisa ---- + @@ -241,7 +241,7 @@ The following command lists all available user homes. Note a home only gets list + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} user:home:list-dirs +{occ-command-example-prefix-docker} user:home:list-dirs - /var/www/owncloud/data - /mnt/newhome_1/lisa ---- @@ -254,7 +254,7 @@ The following command lists all users from a given home. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} user:home:list-users /var/www/owncloud/data +{occ-command-example-prefix-docker} user:home:list-users /var/www/owncloud/data - admin - user01 ---- diff --git a/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc b/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc index 266640e01..42a9a71e3 100644 --- a/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc +++ b/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc @@ -212,7 +212,7 @@ This option can also be used if you have only one web site but want to keep the + [source.bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:enable kerberos +{occ-command-example-prefix-docker} app:enable kerberos ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc index 48c029f59..999ebcd97 100644 --- a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc +++ b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc @@ -327,7 +327,7 @@ The simplest way, useful for initial testing is, to start the `wnd:listen` proce [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen +{occ-command-example-prefix-docker} wnd:listen ---- NOTE: Run this command inside the ownCloud Docker container. @@ -336,7 +336,7 @@ The password is an optional parameter and you will be asked for it if you didn't [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen '\' +{occ-command-example-prefix-docker} wnd:listen '\' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -345,7 +345,7 @@ In order to start `wnd:listen` without any user interaction like as service, pro [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen \ +{occ-command-example-prefix-docker} wnd:listen \ --password-file=/my/secret/password/file \ --password-trim ---- @@ -366,7 +366,7 @@ As a simple example, you can check the following: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:process-queue +{occ-command-example-prefix-docker} wnd:process-queue ---- NOTE: Run this command inside the ownCloud Docker container. @@ -483,7 +483,7 @@ If you need to serialize the execution of the `wnd:process-queue`, check the fol [source,bash,subs="attributes+"] ---- -flock -n /opt/my-lock-file {occ-command-example-prefix} wnd:process-queue +flock -n /opt/my-lock-file {occ-command-example-prefix-docker} wnd:process-queue ---- NOTE: Run this command inside the ownCloud Docker container. @@ -619,7 +619,7 @@ Take the example of attempting to connect to the host MyHost, the share named `M [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen MyHost MyData user password +{occ-command-example-prefix-docker} wnd:listen MyHost MyData user password ---- NOTE: Run this command inside the ownCloud Docker container. @@ -731,7 +731,7 @@ There are several ways to supply a password: + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen +{occ-command-example-prefix-docker} wnd:listen ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -740,7 +740,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen +{occ-command-example-prefix-docker} wnd:listen ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -749,7 +749,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen \ +{occ-command-example-prefix-docker} wnd:listen \ --password-file=/my/secret/password/file ---- + @@ -757,7 +757,7 @@ NOTE: Run this command inside the ownCloud Docker container. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen \ +{occ-command-example-prefix-docker} wnd:listen \ --password-file=/my/secret/password/file \ --password-trim ---- @@ -772,7 +772,7 @@ IMPORTANT: If using `--password-file` make sure that the file is only readable b + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen +{occ-command-example-prefix-docker} wnd:listen --password-from-service-account ---- + @@ -801,7 +801,7 @@ This provides a bit more security because the `/tmp/plainpass` password as shown [source,bash,subs="attributes+"] ---- -cat /tmp/plainpass | {occ-command-example-prefix} wnd:listen --password-file=- +cat /tmp/plainpass | {occ-command-example-prefix-docker} wnd:listen --password-file=- ---- NOTE: Run this command inside the ownCloud Docker container. @@ -813,7 +813,7 @@ Similar to plainpass, the content in this case gets encoded in the {base64-url}[ [source,bash,subs="attributes+"] ---- base64 -d /tmp/encodedpass | \ - {occ-command-example-prefix} wnd:listen --password-file=- + {occ-command-example-prefix-docker} wnd:listen --password-file=- ---- NOTE: Run this command inside the ownCloud Docker container. @@ -826,7 +826,7 @@ Example using "pass" [source,bash,subs="attributes+"] ---- -pass the-password-name | {occ-command-example-prefix} wnd:listen --password-file=- +pass the-password-name | {occ-command-example-prefix-docker} wnd:listen --password-file=- ---- NOTE: Run this command inside the ownCloud Docker container. @@ -837,7 +837,7 @@ This example uses {vaultproject-url}[Vault] as the secrets store. See {hashicorp [source,bash,subs="attributes+"] ---- -vault kv get -field=password secret/samba | {occ-command-example-prefix} wnd:listen --password-file=- +vault kv get -field=password secret/samba | {occ-command-example-prefix-docker} wnd:listen --password-file=- ---- NOTE: Run this command inside the ownCloud Docker container. @@ -849,7 +849,7 @@ Use Vault's ACLs to limit access to the token. Destroy the token after starting If both the argument and the option are passed, e.g., [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen --password-file=/opt/pass` +{occ-command-example-prefix-docker} wnd:listen --password-file=/opt/pass` ---- NOTE: Run this command inside the ownCloud Docker container. @@ -933,17 +933,17 @@ Setups with several servers might have some difficulties in some scenarios: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen host share username password +{occ-command-example-prefix-docker} wnd:listen host share username password -{occ-command-example-prefix} wnd:process-queue host share +{occ-command-example-prefix-docker} wnd:process-queue host share -{occ-command-example-prefix} wnd:process-queue host share -c 500 +{occ-command-example-prefix-docker} wnd:process-queue host share -c 500 -{occ-command-example-prefix} wnd:process-queue host share -c 500 \ +{occ-command-example-prefix-docker} wnd:process-queue host share -c 500 \ --serializer-type file \ --serializer-param file=/opt/oc/store -{occ-command-example-prefix} wnd:process-queue host2 share2 -c 500 \ +{occ-command-example-prefix-docker} wnd:process-queue host2 share2 -c 500 \ --serializer-type File \ --serializer-param file=/opt/oc/store2 ---- @@ -954,7 +954,7 @@ To set it up, make sure the listener is running as a system service: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen host share username password +{occ-command-example-prefix-docker} wnd:listen host share username password ---- NOTE: Run this command inside the ownCloud Docker container. @@ -963,7 +963,7 @@ Setup a Cron job or similar with something like the following two commands: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:process-queue host share -c 500 \ +{occ-command-example-prefix-docker} wnd:process-queue host share -c 500 \ --serializer-type file \ --serializer-param file=/opt/oc/store1 diff --git a/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc b/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc index 91feebd93..699a445f1 100644 --- a/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc +++ b/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc @@ -23,14 +23,14 @@ WebUI:: Command line:: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} market:install windows_network_drive +{occ-command-example-prefix-docker} market:install windows_network_drive ---- NOTE: Run this command inside the ownCloud Docker container. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:enable windows_network_drive +{occ-command-example-prefix-docker} app:enable windows_network_drive ---- NOTE: Run this command inside the ownCloud Docker container. @@ -182,7 +182,7 @@ Running the following command would work: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} wnd:listen MyHost MyData svc_owncloud password +{occ-command-example-prefix-docker} wnd:listen MyHost MyData svc_owncloud password ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/enterprise/file_management/files_lifecycle.adoc b/modules/admin_manual/pages/enterprise/file_management/files_lifecycle.adoc index 08a3d2eea..b68ebe43a 100644 --- a/modules/admin_manual/pages/enterprise/file_management/files_lifecycle.adoc +++ b/modules/admin_manual/pages/enterprise/file_management/files_lifecycle.adoc @@ -53,7 +53,7 @@ Example to set missing upload time values to November, 1st 2019: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} lifecycle:set-upload-time 2019-11-01 +{occ-command-example-prefix-docker} lifecycle:set-upload-time 2019-11-01 ---- NOTE: Run this command inside the ownCloud Docker container. @@ -76,7 +76,7 @@ Example to set the time passed since upload (or restore) for archiving files to [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_lifecycle archive_period --value='90' +{occ-command-example-prefix-docker} config:app:set files_lifecycle archive_period --value='90' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -84,7 +84,7 @@ NOTE: Run this command inside the ownCloud Docker container. To query existing values, use this example command: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:get files_lifecycle archive_period +{occ-command-example-prefix-docker} config:app:get files_lifecycle archive_period ---- NOTE: Run this command inside the ownCloud Docker container. @@ -98,7 +98,7 @@ The _soft policy_ is used by default. To switch from the hard policy to the soft [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_lifecycle policy --value='soft' +{occ-command-example-prefix-docker} config:app:set files_lifecycle policy --value='soft' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -113,7 +113,7 @@ To put the _hard policy_ in place, use this _occ_ command: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_lifecycle policy --value='hard' +{occ-command-example-prefix-docker} config:app:set files_lifecycle policy --value='hard' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -127,7 +127,7 @@ To move files scheduled for archiving (days since upload/restore > `archive_time [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} lifecycle:archive +{occ-command-example-prefix-docker} lifecycle:archive ---- NOTE: Run this command inside the ownCloud Docker container. @@ -139,7 +139,7 @@ To permanently delete files from the archive that have met the policy rules (day [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} lifecycle:expire +{occ-command-example-prefix-docker} lifecycle:expire ---- NOTE: Run this command inside the ownCloud Docker container. @@ -159,7 +159,7 @@ When a user `alice` requests to restore all files, e.g., in the folder `/work/pr [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} lifecycle:restore /alice/archive/files/work/projects/project1 +{occ-command-example-prefix-docker} lifecycle:restore /alice/archive/files/work/projects/project1 ---- NOTE: Run this command inside the ownCloud Docker container. @@ -169,7 +169,7 @@ File Lifecycle Management provides a way to restore all files from all archives [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} lifecycle:restore-all +{occ-command-example-prefix-docker} lifecycle:restore-all ---- NOTE: Run this command inside the ownCloud Docker container. @@ -184,7 +184,7 @@ In some scenarios it can be desired to disable the whole user interface for this [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set files_lifecycle disable_ui --value='yes' +{occ-command-example-prefix-docker} config:app:set files_lifecycle disable_ui --value='yes' ---- NOTE: Run this command inside the ownCloud Docker container. @@ -193,7 +193,7 @@ To enable the user interface components again, this config value needs to be rem [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:delete files_lifecycle disable_ui +{occ-command-example-prefix-docker} config:app:delete files_lifecycle disable_ui ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/enterprise/logging/admin_audit.adoc b/modules/admin_manual/pages/enterprise/logging/admin_audit.adoc index 0edcb33db..4ff1ecee2 100644 --- a/modules/admin_manual/pages/enterprise/logging/admin_audit.adoc +++ b/modules/admin_manual/pages/enterprise/logging/admin_audit.adoc @@ -50,7 +50,7 @@ To ignore all CLI triggered events (default is to include them), set the followi [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set admin_audit ignore_cli_events --value='yes' +{occ-command-example-prefix-docker} config:app:set admin_audit ignore_cli_events --value='yes' ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/enterprise/reporting/metrics.adoc b/modules/admin_manual/pages/enterprise/reporting/metrics.adoc index 4297b39ab..eff58764d 100644 --- a/modules/admin_manual/pages/enterprise/reporting/metrics.adoc +++ b/modules/admin_manual/pages/enterprise/reporting/metrics.adoc @@ -89,7 +89,7 @@ See the following occ command on how to set it. Make up a passphrase, referred t [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:set "metrics_shared_secret" --value "" +{occ-command-example-prefix-docker} config:system:set "metrics_shared_secret" --value "" ---- NOTE: Run this command inside the ownCloud Docker container. @@ -103,7 +103,7 @@ The dashboard is enabled by default. You can disable it with the following comma [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set metrics disable_dashboard --value=yes +{occ-command-example-prefix-docker} config:app:set metrics disable_dashboard --value=yes ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/enterprise/user_management/saml_2.0_sso.adoc b/modules/admin_manual/pages/enterprise/user_management/saml_2.0_sso.adoc index 984367dfd..7586daca0 100644 --- a/modules/admin_manual/pages/enterprise/user_management/saml_2.0_sso.adoc +++ b/modules/admin_manual/pages/enterprise/user_management/saml_2.0_sso.adoc @@ -148,8 +148,8 @@ Use `upn` as `uid` and set the app mode to 'SSO Only' by running: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} shibboleth:mode ssoonly -{occ-command-example-prefix} shibboleth:mapping -u upn +{occ-command-example-prefix-docker} shibboleth:mode ssoonly +{occ-command-example-prefix-docker} shibboleth:mapping -u upn ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/enterprise/user_management/user_auth_shibboleth.adoc b/modules/admin_manual/pages/enterprise/user_management/user_auth_shibboleth.adoc index 3a7d03932..46bf134a2 100644 --- a/modules/admin_manual/pages/enterprise/user_management/user_auth_shibboleth.adoc +++ b/modules/admin_manual/pages/enterprise/user_management/user_auth_shibboleth.adoc @@ -50,8 +50,8 @@ You can also change the app mode and environment mappings by using the `occ` com [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} shibboleth:mode notactive -{occ-command-example-prefix} shibboleth:mapping --uid login +{occ-command-example-prefix-docker} shibboleth:mode notactive +{occ-command-example-prefix-docker} shibboleth:mapping --uid login ---- NOTE: Run this command inside the ownCloud Docker container. @@ -86,7 +86,7 @@ From 3.1.2 you can now specify a mapper that is used on inbound ownCloud user ID [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:app:set user_shibboleth \ +{occ-command-example-prefix-docker} config:app:set user_shibboleth \ uid_mapper --value="OCA\User_Shibboleth\Mapper\ADFSMapper" ---- @@ -96,7 +96,7 @@ You may view the currently configured mapper using: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} shibboleth:mapping +{occ-command-example-prefix-docker} shibboleth:mapping ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/index.adoc b/modules/admin_manual/pages/index.adoc index 11e883c36..ac9128b66 100644 --- a/modules/admin_manual/pages/index.adoc +++ b/modules/admin_manual/pages/index.adoc @@ -4,7 +4,7 @@ Welcome to the ownCloud Classic Server Administration Guide. This guide describe == Installation Changes -IMPORTANT: Compared to former releases, ownCloud 11 is only available as docker image which contains all the required libraries such as PHP 8. +IMPORTANT: Unlike previous releases, ownCloud 11 is only available as a Docker image containing the necessary libraries, such as PHP 8. == Target Audience diff --git a/modules/admin_manual/pages/installation/docker/index.adoc b/modules/admin_manual/pages/installation/docker/index.adoc index 1a393f254..e8ce4e472 100644 --- a/modules/admin_manual/pages/installation/docker/index.adoc +++ b/modules/admin_manual/pages/installation/docker/index.adoc @@ -35,9 +35,9 @@ Users not added to the `docker` group can run docker commands with a preceding ` An example `occ` command looks like this: -[source,docker] +[source,docker,subs="attributes+"] ---- -docker exec --user www-data occ +{occ-command-example-prefix-docker} ---- == Quick Evaluation @@ -64,6 +64,18 @@ You can log in to your ownCloud instance via a browser at `pass:a[http://localho NOTE: Access only works locally with http, not https. +[IMPORTANT] +==== +If you want to access the occ CLI command set with the quick evaluation setup, you must use: + +[source,docker] +---- +docker exec --user www-data oc-eval occ +---- + +instead the `docker compose exec` version as used in the documentation. +==== + If the outcome meets the expectations but a supported installation with MariaDB is targeted, remove the eval version before proceeding with the next section. [source,docker] @@ -157,9 +169,9 @@ Only a few settings are required, these are: | `{std-port-http}` |=== -NOTE: `ADMIN_USERNAME` and `ADMIN_PASSWORD` will not change between deploys even if you change the -values in the .env file. To change them, you'll need to do `docker volume prune`, which -*will delete all your data*. +NOTE: `ADMIN_USERNAME` and `ADMIN_PASSWORD` + +will not change between deploys even if you change the values in the `.env` file. + +To change them, you'll need to issue `docker volume prune`, which *will delete all your data*. -- . Then, you can build and start the container, using your preferred Docker _command-line tool_. @@ -227,37 +239,37 @@ docker run -v :/mnt \ [TIP] ==== -Although the containers are up and running, it may still take a few minutes until ownCloud is fully -functional. + +Although the containers are up and running, it may still take a few minutes until ownCloud is fully functional. + To inspect the log output: + [source,docker] ---- docker compose logs --follow owncloud ---- + Wait until the output shows **Starting apache daemon...** before you access the web UI. ==== [IMPORTANT] ==== Although all important data persists after: + [source,docker] ---- docker compose down; docker compose up -d ---- + there are certain details that get lost, e.g., default apps may re-appear after they were uninstalled. ==== -- === Logging In -To log in to the ownCloud UI, open `pass:a[http://localhost:{std-port-http}]` in your browser -of choice, where you see the standard ownCloud login screen as in the -image below. +To log in to the ownCloud UI, open `pass:a[http://localhost:{std-port-http}]` (or the URL defined) in your browser of choice, where you see the standard ownCloud login screen as in the image below. -image:docker/owncloud-ui-login.png[The ownCloud UI via Docker] +image::docker/owncloud-ui-login.png[The ownCloud UI via Docker,width=300] -The username and password are the credentials which you stored in `.env` earlier. -Note that these will not change between deploys even if you change the values in .env. +The username and password are the credentials which you stored in `.env` earlier. Note that these will not change between deploys even if you change the values in .env. === Stopping the Containers @@ -277,31 +289,25 @@ docker compose down --rmi all --volumes === Running occ commands If you want to run an occ command, first go to the directory where your `.yaml` or `.env` file is located. -Here, you are able to run any command referring to -xref:configuration/server/occ_command.adoc[Using the occ Command] by entering: +Here, you are able to run any command referring to xref:configuration/server/occ_command.adoc[Using the occ Command] by entering: [source,docker] ---- docker compose exec owncloud occ ---- -[IMPORTANT] -==== -Don't use the `php` command prefix, this leads to several errors and is not intended to run in -docker environments. -==== +IMPORTANT: Don't use the `php` command prefix, this leads to several errors and is not intended to run in docker environments. === Upgrading ownCloud on Docker -When a new version of ownCloud gets released, you should update your instance. To do so, follow -these simple steps: +When a new version of ownCloud gets released, you should update your instance. To do so, follow these simple steps: . Go to your docker directory where your `.yaml` and `.env` files exist. . Put ownCloud into maintenance mode with the following command: + -[source,docker] +[source,docker,subs="attributes+"] ---- -docker compose exec owncloud occ maintenance:mode --on +{occ-command-example-prefix-docker} maintenance:mode --on ---- . Create a backup of the database in case something goes wrong during the upgrade process, using the following command: @@ -325,15 +331,16 @@ NOTE: You need to adjust the password and database name if you have changed it i docker compose down ---- -. Update the version number of ownCloud in your `.env` file. You can use sed -for it, as in the following example. +. Update the version number of ownCloud in your `.env` file. You can use sed for it, as in the following example. + +-- Make sure that you adjust the example to match your installation. -+ + [source,bash] ---- sed -i 's/^OWNCLOUD_VERSION=.*$/OWNCLOUD_VERSION=/' .env ---- +-- . View the file to ensure the change has been implemented. + @@ -344,35 +351,32 @@ cat .env . Start your docker instance again. + +-- [source,docker] ---- docker compose up -d ---- -+ -Now you should have the current ownCloud running with `docker compose`. Note that the container will -automatically run `occ upgrade` when starting up. If you notice the container starting over and over again, -you can check the update log with the following command: -+ + +Now you should have the current ownCloud running with `docker compose`. Note that the container will automatically run `occ upgrade` when starting up. If you notice the container starting over and over again, you can check the update log with the following command: + [source,docker] ---- docker compose logs --timestamp owncloud ---- +-- . If all went well, end maintenance mode: + -[source,docker] +[source,docker,subs="attributes+"] ---- -docker compose exec owncloud occ maintenance:mode --off +{occ-command-example-prefix-docker} maintenance:mode --off ---- === Docker Compose YAML File The file `docker-compose.yml` contains the configuration of your ownCloud container. -[NOTE] -==== -Since ownCloud Server 10.5, the dedicated enterprise docker image `registry.owncloud.com/owncloud/enterprise` is deprecated. All supported enterprise features and apps are now included in the public image `owncloud/server` available on Docker Hub. A login to our registry `registry.owncloud.com` is no longer required. -==== +NOTE: Since ownCloud Server 10.5, the dedicated enterprise docker image `registry.owncloud.com/owncloud/enterprise` is *deprecated*. All supported enterprise features and apps are now included in the public image `owncloud/server` available on Docker Hub. A login to our registry `registry.owncloud.com` is no longer required. [source,yaml] ---- @@ -396,7 +400,7 @@ The loglevel is set to the fixed value 2: _"Warnings, errors, and fatal issues"_ OWNCLOUD_LOGLEVEL=0 ---- -=== Terminating containers +=== Terminating Containers If your container is terminating for whatever reason, you will not be able to run `docker(-compose) exec` to make investigations inside the container as there will be no running container. Instead you need to use `docker(-compose) run`. It's important that you prefix any command to be run by `/usr/bin/owncloud`, otherwise the container will not be initialized correctly. See the example command below: diff --git a/modules/admin_manual/pages/installation/index.adoc b/modules/admin_manual/pages/installation/index.adoc index fccfb48bb..cdbbc25eb 100644 --- a/modules/admin_manual/pages/installation/index.adoc +++ b/modules/admin_manual/pages/installation/index.adoc @@ -2,7 +2,7 @@ == Introduction -Starting with ownCloud Server 11, the only supported installation method is a Docker-based installation. Manual installation on Linux is no longer supported. +Starting with ownCloud Server 11, the only supported installation method is a Docker-based installation which includes PHP 8. Manual installation on Linux is no longer supported. == Using a Docker-Based Installation diff --git a/modules/admin_manual/pages/installation/manual_installation/manual_installation.adoc b/modules/admin_manual/pages/installation/manual_installation/manual_installation.adoc index 09a976cea..5012995d1 100644 --- a/modules/admin_manual/pages/installation/manual_installation/manual_installation.adoc +++ b/modules/admin_manual/pages/installation/manual_installation/manual_installation.adoc @@ -155,7 +155,7 @@ Replace all the parameters according to your needs. [source,bash,subs="attributes+"] ---- cd /var/www/owncloud/ -{occ-command-example-prefix} maintenance:install \ +{occ-command-example-prefix-docker} maintenance:install \ --database "mysql" \ --database-name "owncloud" \ --database-user "root"\ diff --git a/modules/admin_manual/pages/installation/system_requirements.adoc b/modules/admin_manual/pages/installation/system_requirements.adoc index e9e07a87f..8d3aa902f 100644 --- a/modules/admin_manual/pages/installation/system_requirements.adoc +++ b/modules/admin_manual/pages/installation/system_requirements.adoc @@ -55,9 +55,9 @@ The operating system, web server, PHP runtime, and database are all managed insi === Desktop and Mobile Apps -We always recommend to use the newest mobile apps with the latest server release. +We always recommend to use the newest Desktop and Mobile Apps with the latest server release. -You can find detailed system requirements in the documentation for the Apps in: +You can find detailed system requirements in the documentation for each App in: * {desktop-system-requirements-url}[Desktop App] * {ios-system-requirements-url}[iOS system requirements] diff --git a/modules/admin_manual/pages/maintenance/backup_and_restore/backup.adoc b/modules/admin_manual/pages/maintenance/backup_and_restore/backup.adoc index db85ff240..56b2e69bb 100644 --- a/modules/admin_manual/pages/maintenance/backup_and_restore/backup.adoc +++ b/modules/admin_manual/pages/maintenance/backup_and_restore/backup.adoc @@ -67,7 +67,7 @@ Before backing up the database, set your ownCloud instance into maintenance mode [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --on +{occ-command-example-prefix-docker} maintenance:mode --on ---- NOTE: Run this command inside the ownCloud Docker container. @@ -137,7 +137,7 @@ Perform the following tasks to reactivate your ownCloud instance: .Bring back ownCloud into normal operation mode [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --off +{occ-command-example-prefix-docker} maintenance:mode --off ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/maintenance/backup_and_restore/restore.adoc b/modules/admin_manual/pages/maintenance/backup_and_restore/restore.adoc index 35505c43c..0b0689014 100644 --- a/modules/admin_manual/pages/maintenance/backup_and_restore/restore.adoc +++ b/modules/admin_manual/pages/maintenance/backup_and_restore/restore.adoc @@ -64,7 +64,7 @@ Before restoring the database, set your ownCloud instance into maintenance mode: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --on +{occ-command-example-prefix-docker} maintenance:mode --on ---- NOTE: Run this command inside the ownCloud Docker container. @@ -188,7 +188,7 @@ Run the following command to tell desktop and mobile clients that a server backu [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:data-fingerprint +{occ-command-example-prefix-docker} maintenance:data-fingerprint ---- NOTE: Run this command inside the ownCloud Docker container. @@ -197,7 +197,7 @@ NOTE: Run this command inside the ownCloud Docker container. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --off +{occ-command-example-prefix-docker} maintenance:mode --off ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/maintenance/enable_maintenance.adoc b/modules/admin_manual/pages/maintenance/enable_maintenance.adoc index 21441eb20..64e6dfbea 100644 --- a/modules/admin_manual/pages/maintenance/enable_maintenance.adoc +++ b/modules/admin_manual/pages/maintenance/enable_maintenance.adoc @@ -12,7 +12,7 @@ To enable maintenance mode, run the following command: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --on +{occ-command-example-prefix-docker} maintenance:mode --on ---- NOTE: Run this command inside the ownCloud Docker container. @@ -30,7 +30,7 @@ To disable maintenance mode, run the following command: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --off +{occ-command-example-prefix-docker} maintenance:mode --off ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/maintenance/encryption/migrating-from-user-key-to-master-key.adoc b/modules/admin_manual/pages/maintenance/encryption/migrating-from-user-key-to-master-key.adoc index 87dfd15c6..f7d732114 100644 --- a/modules/admin_manual/pages/maintenance/encryption/migrating-from-user-key-to-master-key.adoc +++ b/modules/admin_manual/pages/maintenance/encryption/migrating-from-user-key-to-master-key.adoc @@ -44,9 +44,9 @@ You can see an example of calling the commands listed below, configured to requi [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} encryption:decrypt-all --continue=yes && \ - {occ-command-example-prefix} encryption:disable --no-interaction && \ - {occ-command-example-prefix} app:disable --no-interaction encryption +{occ-command-example-prefix-docker} encryption:decrypt-all --continue=yes && \ + {occ-command-example-prefix-docker} encryption:disable --no-interaction && \ + {occ-command-example-prefix-docker} app:disable --no-interaction encryption ---- NOTE: Run this command inside the ownCloud Docker container. @@ -87,10 +87,10 @@ The following example shows how to do this on the command line. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:enable encryption && \ - {occ-command-example-prefix} encryption:enable && \ - {occ-command-example-prefix} encryption:select-encryption-type masterkey -y && \ - {occ-command-example-prefix} encryption:encrypt-all --yes +{occ-command-example-prefix-docker} app:enable encryption && \ + {occ-command-example-prefix-docker} encryption:enable && \ + {occ-command-example-prefix-docker} encryption:select-encryption-type masterkey -y && \ + {occ-command-example-prefix-docker} encryption:encrypt-all --yes ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/maintenance/export_import_instance_data.adoc b/modules/admin_manual/pages/maintenance/export_import_instance_data.adoc index df0d1e4d9..3c0cc6ccb 100644 --- a/modules/admin_manual/pages/maintenance/export_import_instance_data.adoc +++ b/modules/admin_manual/pages/maintenance/export_import_instance_data.adoc @@ -43,7 +43,7 @@ This will create a folder `/tmp/export/user1` which contains all the files and m [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} instance:export:user user1 /tmp/export +{occ-command-example-prefix-docker} instance:export:user user1 /tmp/export ---- NOTE: Run this command inside the ownCloud Docker container. @@ -64,7 +64,7 @@ to federated shares pointing to the source instance: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} instance:import:user /tmp/export/user1 +{occ-command-example-prefix-docker} instance:import:user /tmp/export/user1 ---- NOTE: Run this command inside the ownCloud Docker container. @@ -78,7 +78,7 @@ they point to the target instance. To do so, run this command on the source inst [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} instance:export:migrate:share user1 https://newinstance.com +{occ-command-example-prefix-docker} instance:export:migrate:share user1 https://newinstance.com ---- NOTE: Run this command inside the ownCloud Docker container. @@ -94,7 +94,7 @@ on the target instance. See xref:known-limitations[Known Limitations] for furthe [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} user:delete user1 +{occ-command-example-prefix-docker} user:delete user1 ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc b/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc index 6a44c1314..f1f814b20 100644 --- a/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc +++ b/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc @@ -50,7 +50,7 @@ To enable maintenance mode, run the following command. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --on +{occ-command-example-prefix-docker} maintenance:mode --on ---- NOTE: Run this command inside the ownCloud Docker container. @@ -157,7 +157,7 @@ To fix the config.php settings: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} config:system:set --value /mnt/owncloud/data datadirectory +{occ-command-example-prefix-docker} config:system:set --value /mnt/owncloud/data datadirectory ---- NOTE: Run this command inside the ownCloud Docker container. @@ -175,7 +175,7 @@ To disable maintenance mode of your instance run the following command: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --off +{occ-command-example-prefix-docker} maintenance:mode --off ---- NOTE: Run this command inside the ownCloud Docker container. @@ -191,7 +191,7 @@ sudo service apache2 start [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files:scan --all +{occ-command-example-prefix-docker} files:scan --all ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/maintenance/migrating.adoc b/modules/admin_manual/pages/maintenance/migrating.adoc index 0bb108a29..02f28bd50 100644 --- a/modules/admin_manual/pages/maintenance/migrating.adoc +++ b/modules/admin_manual/pages/maintenance/migrating.adoc @@ -149,7 +149,7 @@ following commands: [source,bash,subs="attributes+"] ---- cd /var/www/owncloud/ -{occ-command-example-prefix} maintenance:mode --on +{occ-command-example-prefix-docker} maintenance:mode --on ---- NOTE: Run this command inside the ownCloud Docker container. @@ -226,7 +226,7 @@ first verify that ownCloud is in maintenance mode. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode +{occ-command-example-prefix-docker} maintenance:mode ---- NOTE: Run this command inside the ownCloud Docker container. @@ -246,7 +246,7 @@ maintenance mode. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --off +{occ-command-example-prefix-docker} maintenance:mode --off ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/maintenance/upgrading/database_upgrade.adoc b/modules/admin_manual/pages/maintenance/upgrading/database_upgrade.adoc index 212f6f45d..6281f37a9 100644 --- a/modules/admin_manual/pages/maintenance/upgrading/database_upgrade.adoc +++ b/modules/admin_manual/pages/maintenance/upgrading/database_upgrade.adoc @@ -39,7 +39,7 @@ xref:maintenance/backup_and_restore/backup.adoc[Backing up ownCloud] guide. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --on +{occ-command-example-prefix-docker} maintenance:mode --on ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -59,7 +59,7 @@ sudo service apache2 stop + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} db:restore-default-row-format +{occ-command-example-prefix-docker} db:restore-default-row-format ---- + NOTE: Run this command inside the ownCloud Docker container. @@ -82,7 +82,7 @@ when using a dockerized environment as part of the upgrade procedure. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --off +{occ-command-example-prefix-docker} maintenance:mode --off ---- + NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/maintenance/upgrading/manual_upgrade.adoc b/modules/admin_manual/pages/maintenance/upgrading/manual_upgrade.adoc index ed9e704ce..aa57b9500 100644 --- a/modules/admin_manual/pages/maintenance/upgrading/manual_upgrade.adoc +++ b/modules/admin_manual/pages/maintenance/upgrading/manual_upgrade.adoc @@ -60,14 +60,14 @@ This command lists all apps by and app version: + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:list +{occ-command-example-prefix-docker} app:list ---- + This command disables the app with the given : + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:disable +{occ-command-example-prefix-docker} app:disable ---- . Disable via Browser + @@ -240,7 +240,7 @@ With the apps disabled and ownCloud in maintenance mode, start the xref:configur [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} upgrade +{occ-command-example-prefix-docker} upgrade ---- The upgrade operation can take anywhere from a few minutes to a few hours, depending on the size of your installation. When it is finished you will see either a success message or an error message that indicates why the process did not complete successfully. @@ -273,7 +273,7 @@ Assuming your upgrade succeeded, disable maintenance mode using the occ command. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --off +{occ-command-example-prefix-docker} maintenance:mode --off ---- === Enable Browser Access @@ -321,7 +321,7 @@ Here is an example of how to do so: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} files:scan --all +{occ-command-example-prefix-docker} files:scan --all ---- See the {oc-help-url}[Docs & Guides page] for further resources for both home and enterprise users. @@ -332,19 +332,19 @@ Stop the upgrade process this way: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:mode --off +{occ-command-example-prefix-docker} maintenance:mode --off ---- Then start the manual process: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} upgrade +{occ-command-example-prefix-docker} upgrade ---- If this does not work properly, try the repair function: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:repair +{occ-command-example-prefix-docker} maintenance:repair ---- diff --git a/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc b/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc index df300c1cc..578e0f944 100644 --- a/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc +++ b/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc @@ -17,7 +17,7 @@ You can use the webUI or the command line to generate a config report. The webUI Check if it is disabled: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:list --disabled configreport +{occ-command-example-prefix-docker} app:list --disabled configreport ---- NOTE: Run this command inside the ownCloud Docker container. @@ -25,7 +25,7 @@ NOTE: Run this command inside the ownCloud Docker container. Enable it if it was formerly disabled: [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} app:enable configreport +{occ-command-example-prefix-docker} app:enable configreport ---- NOTE: Run this command inside the ownCloud Docker container. @@ -41,7 +41,7 @@ To generate a config report from the command line, run the following command fro [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} configreport:generate > config_report.txt +{occ-command-example-prefix-docker} configreport:generate > config_report.txt ---- NOTE: Run this command inside the ownCloud Docker container. @@ -75,7 +75,7 @@ If LDAP is used, viewing the LDAP configuration is important when checking for e [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} ldap:show-config > ldap_config.txt +{occ-command-example-prefix-docker} ldap:show-config > ldap_config.txt ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc b/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc index 14ec92d89..38cd62660 100644 --- a/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc +++ b/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc @@ -35,7 +35,7 @@ Use the following command to list all active background jobs triggered by ownClo [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} background:queue:status --display-invalid-jobs +{occ-command-example-prefix-docker} background:queue:status --display-invalid-jobs ---- NOTE: Run this command inside the ownCloud Docker container. @@ -62,7 +62,7 @@ When you have identified the `ID` of the background job to be removed, run foll [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} background:queue:delete ID +{occ-command-example-prefix-docker} background:queue:delete ID ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/partials/configuration/server/disable-single-user-mode.adoc b/modules/admin_manual/partials/configuration/server/disable-single-user-mode.adoc index 809cb7b20..5e1377556 100644 --- a/modules/admin_manual/partials/configuration/server/disable-single-user-mode.adoc +++ b/modules/admin_manual/partials/configuration/server/disable-single-user-mode.adoc @@ -4,7 +4,7 @@ With encryption migrated from User Key-based encryption to Master Key-based, dis [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:singleuser --off +{occ-command-example-prefix-docker} maintenance:singleuser --off ---- NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/developer_manual/pages/app/fundamentals/backgroundjobs.adoc b/modules/developer_manual/pages/app/fundamentals/backgroundjobs.adoc index 7fe61a370..a10985749 100644 --- a/modules/developer_manual/pages/app/fundamentals/backgroundjobs.adoc +++ b/modules/developer_manual/pages/app/fundamentals/backgroundjobs.adoc @@ -43,7 +43,7 @@ To test the job classes, you can run Cron manually, as in the example below: [source,console,subs="attributes+"] ---- -{occ-command-example-prefix} system cron +{occ-command-example-prefix-docker} system cron ---- After doing so, you will need to reset the job to allow it to be run, diff --git a/modules/developer_manual/pages/app/fundamentals/database.adoc b/modules/developer_manual/pages/app/fundamentals/database.adoc index bb69acf67..103c30987 100644 --- a/modules/developer_manual/pages/app/fundamentals/database.adoc +++ b/modules/developer_manual/pages/app/fundamentals/database.adoc @@ -168,7 +168,7 @@ It is still necessary to increment the application’s version number to trigger [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} migrations:generate app-name {simple, SQL, schema} +{occ-command-example-prefix-docker} migrations:generate app-name {simple, SQL, schema} ---- === A Simple Migration Step @@ -213,7 +213,7 @@ This is the preferred way to manipulate the schema. [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix} migrations:execute dav 20161130090952 +{occ-command-example-prefix-docker} migrations:execute dav 20161130090952 ---- Because all migration steps will be executed upon installation, there is no explicit need for unit tests. diff --git a/modules/developer_manual/pages/core/theming.adoc b/modules/developer_manual/pages/core/theming.adoc index dc216d3b3..21333ddb4 100644 --- a/modules/developer_manual/pages/core/theming.adoc +++ b/modules/developer_manual/pages/core/theming.adoc @@ -75,7 +75,7 @@ sudo chown -R www-data: mynewtheme + [source,console,subs="attributes+"] ---- -{occ-command-example-prefix} app:enable mynewtheme +{occ-command-example-prefix-docker} app:enable mynewtheme ---- . Exclude your new theme from integrity checking. Add the following setting to `config/config.php`: diff --git a/modules/developer_manual/pages/testing/acceptance-tests.adoc b/modules/developer_manual/pages/testing/acceptance-tests.adoc index cfbd76e43..8fbaeff44 100644 --- a/modules/developer_manual/pages/testing/acceptance-tests.adoc +++ b/modules/developer_manual/pages/testing/acceptance-tests.adoc @@ -142,7 +142,7 @@ mysql -u root -h localhost -e "drop user oc_admin" mysql -u root -h localhost -e "drop user oc_admin@localhost" # Install ownCloud server with the command-line -{occ-command-example-prefix} maintenance:install \ +{occ-command-example-prefix-docker} maintenance:install \ --database='mysql' --database-name='owncloud' --database-user='root' \ --database-pass='mysqlrootpassword' --admin-user='admin' --admin-pass='admin' ---- diff --git a/modules/developer_manual/pages/testing/drone.adoc b/modules/developer_manual/pages/testing/drone.adoc index ce19e95b8..f5df9d35d 100644 --- a/modules/developer_manual/pages/testing/drone.adoc +++ b/modules/developer_manual/pages/testing/drone.adoc @@ -21,7 +21,7 @@ This document will show you how to run drone tests locally. + [source,console,subs="attributes+"] ---- -{occ-command-example-prefix} maintenance:install +{occ-command-example-prefix-docker} maintenance:install ---- - Change into directory: diff --git a/modules/developer_manual/pages/testing/unit-testing.adoc b/modules/developer_manual/pages/testing/unit-testing.adoc index 949a525a7..9aa9ac5c9 100644 --- a/modules/developer_manual/pages/testing/unit-testing.adoc +++ b/modules/developer_manual/pages/testing/unit-testing.adoc @@ -89,7 +89,7 @@ git clone https://github.com/owncloud/notes.git [source,bash,subs="attributes+"] ---- cd .. -{occ-command-example-prefix} app:enable notes +{occ-command-example-prefix-docker} app:enable notes ---- . Change into the newly cloned directory, for example: From 68521f7fc0746bef1d3eea6aaf70d3003328ed3e Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Tue, 12 May 2026 20:12:12 +0200 Subject: [PATCH 10/38] update --- .../examples/installation/docker/docker-compose.yml | 2 -- modules/admin_manual/pages/installation/docker/index.adoc | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/admin_manual/examples/installation/docker/docker-compose.yml b/modules/admin_manual/examples/installation/docker/docker-compose.yml index 908a1cf31..d4aca7973 100644 --- a/modules/admin_manual/examples/installation/docker/docker-compose.yml +++ b/modules/admin_manual/examples/installation/docker/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3" - volumes: files: driver: local diff --git a/modules/admin_manual/pages/installation/docker/index.adoc b/modules/admin_manual/pages/installation/docker/index.adoc index e8ce4e472..e68bfdb43 100644 --- a/modules/admin_manual/pages/installation/docker/index.adoc +++ b/modules/admin_manual/pages/installation/docker/index.adoc @@ -127,7 +127,7 @@ include::example$installation/docker/docker-compose.yml[] [source,bash,subs="attributes+"] ---- cat << EOF > .env -OWNCLOUD_VERSION={latest-server-version} +OWNCLOUD_VERSION=latest OWNCLOUD_DOMAIN=localhost:{std-port-http} OWNCLOUD_TRUSTED_DOMAINS=localhost ADMIN_USERNAME=admin From ad3fdbfc0b3ecec295c943d527b1379f9db36aee Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Wed, 13 May 2026 22:59:33 +0200 Subject: [PATCH 11/38] update compose --- global-attributes.yml | 5 +- .../installation/docker/docker-compose.yml | 51 ++++--- .../pages/installation/docker/index.adoc | 139 +++++++----------- 3 files changed, 94 insertions(+), 101 deletions(-) diff --git a/global-attributes.yml b/global-attributes.yml index 1db3818ff..a62131e67 100644 --- a/global-attributes.yml +++ b/global-attributes.yml @@ -26,7 +26,7 @@ previous-docs-version: 'next' # server latest-server-version: '10.15' - latest-server-download-version: '10.15.0' + latest-server-download-version: '10.16.2' previous-server-version: '10.14' current-server-version: '10.15' oc-changelog-url: 'https://owncloud.com/changelog/server/' @@ -36,7 +36,8 @@ oc-examples-username: 'username' oc-examples-password: 'password' oc-complete-name: 'owncloud-complete-latest' - occ-command-example-prefix: 'occ' + occ-command-example-prefix: 'sudo -u www-data ./occ' + occ-command-example-prefix-docker: 'docker compose exec owncloud occ' php-net-url: 'https://www.php.net' php-supported-versions-url: 'https://www.php.net/supported-versions.php' http-status-codes-base-url: 'https://developer.mozilla.org/en-US/docs/Web/HTTP/Status' diff --git a/modules/admin_manual/examples/installation/docker/docker-compose.yml b/modules/admin_manual/examples/installation/docker/docker-compose.yml index d4aca7973..c2b6feb83 100644 --- a/modules/admin_manual/examples/installation/docker/docker-compose.yml +++ b/modules/admin_manual/examples/installation/docker/docker-compose.yml @@ -1,14 +1,6 @@ -volumes: - files: - driver: local - mysql: - driver: local - redis: - driver: local - services: owncloud: - image: owncloud/server:${OWNCLOUD_VERSION} + image: owncloud/server:${OWNCLOUD_IMAGE} container_name: owncloud_server restart: always ports: @@ -19,6 +11,7 @@ services: environment: - OWNCLOUD_DOMAIN=${OWNCLOUD_DOMAIN} - OWNCLOUD_TRUSTED_DOMAINS=${OWNCLOUD_TRUSTED_DOMAINS} + - OWNCLOUD_OVERWRITE_CLI_URL=${OWNCLOUD_OVERWRITE_CLI_URL} - OWNCLOUD_DB_TYPE=mysql - OWNCLOUD_DB_NAME=owncloud - OWNCLOUD_DB_USERNAME=owncloud @@ -29,18 +22,19 @@ services: - OWNCLOUD_MYSQL_UTF8MB4=true - OWNCLOUD_REDIS_ENABLED=true - OWNCLOUD_REDIS_HOST=redis - healthcheck: - test: ["CMD", "/usr/bin/healthcheck"] - interval: 30s - timeout: 10s - retries: 5 volumes: - - files:/mnt/data + - type: volume + source: oc_files + target: /mnt/data + networks: + - oc_network mariadb: - image: mariadb:10.11 # minimum required ownCloud version is 10.9 + image: mariadb:${MARIADB_IMAGE} container_name: owncloud_mariadb restart: always + ports: + - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=owncloud - MYSQL_USER=owncloud @@ -55,11 +49,15 @@ services: retries: 5 volumes: - mysql:/var/lib/mysql + networks: + - oc_network redis: - image: redis:6 + image: redis:${REDIS_IMAGE} container_name: owncloud_redis restart: always + ports: + - "6379:6379" command: ["--databases", "1"] healthcheck: test: ["CMD", "redis-cli", "ping"] @@ -68,3 +66,22 @@ services: retries: 5 volumes: - redis:/data + networks: + - oc_network + +volumes: + oc_files: + driver: local +# driver_opts: +# type: none +# device: /mnt/oc +# o: bind + mysql: + driver: local + redis: + driver: local + apache: + driver: local + +networks: + oc_network: diff --git a/modules/admin_manual/pages/installation/docker/index.adoc b/modules/admin_manual/pages/installation/docker/index.adoc index e68bfdb43..ce9e59f05 100644 --- a/modules/admin_manual/pages/installation/docker/index.adoc +++ b/modules/admin_manual/pages/installation/docker/index.adoc @@ -8,7 +8,9 @@ == Introduction -{description} This {dockerhub-url}[official image] works standalone for a quick evaluation but is designed to be used in a docker compose setup. +{description} This {dockerhub-url}[official image] is designed to be used in a docker compose setup but can also be used for a quick evaluation. + +The image contains the PHP and Apache setups, and nothing else needs to be added for it to work properly. == Database Notes @@ -98,75 +100,89 @@ The configuration: * Exposes ports {std-port-http}, allowing for HTTP connections. * Uses separate _MariaDB_ and _Redis_ containers. -* Mounts the data and MySQL data directories on the host for persistent storage. +* Provides mounts plus a volume bind configuration example. + +=== Compose Setup -The following instructions assume you install locally. For remote access, the value of xref:configuration/server/config_sample_php_parameters.adoc#override-cli-url[OWNCLOUD_DOMAIN] and xref:configuration/server/config_sample_php_parameters.adoc#define-list-of-trusted-domains-that-users-can-log-into[OWNCLOUD_TRUSTED_DOMAINS] must be updated to represent the hostname(s) and/or IP addresses that the server is reachable at. +The following instructions assume you install locally. For remote access, the value of xref:#env-file[OWNCLOUD_DOMAIN] and xref:#env-file[OWNCLOUD_TRUSTED_DOMAINS] must be updated to represent the hostname(s) and/or IP addresses that the server is reachable at. -. Create a new project directory. +. Create a new project directory at a location of choice: + -- [source,bash] ---- -mkdir owncloud-docker-server -cd owncloud-docker-server +mkdir owncloud-server-docker +cd owncloud-server-docker ---- -- -. Then copy and paste the sample `docker-compose.yml` as base to derive from: +. Create a `docker-compose.yml` file as base to derive from with the following content: + --- [source,yml] ---- include::example$installation/docker/docker-compose.yml[] ---- --- -. Create a `.env` configuration file, which contains the required configuration settings. +. Create an `.env` configuration file in the same directory, which contains the required configuration settings. + -- +[#env-file] [source,bash,subs="attributes+"] ---- -cat << EOF > .env -OWNCLOUD_VERSION=latest -OWNCLOUD_DOMAIN=localhost:{std-port-http} +OWNCLOUD_IMAGE=10.16.2 +OWNCLOUD_DOMAIN=localhost OWNCLOUD_TRUSTED_DOMAINS=localhost -ADMIN_USERNAME=admin -ADMIN_PASSWORD=admin -HTTP_PORT={std-port-http} -EOF +OWNCLOUD_OVERWRITE_CLI_URL=http://localhost +HTTP_PORT=8080 +MARIADB_IMAGE=10.11 +REDIS_IMAGE=7 ---- Only a few settings are required, these are: -[width="100%",cols="45%,50%,80%",options="header"] +[width="100%",cols="45%,80%,50%",options="header"] |=== | Setting Name | Description | Example -| `OWNCLOUD_VERSION` +| `OWNCLOUD_IMAGE` | The ownCloud version -| `latest` +| `{latest-server-download-version}` or `latest` | `OWNCLOUD_DOMAIN` -| The ownCloud domain -| `localhost:{std-port-http}` +a| The ownCloud domain + +(needs to be the first entry of trusted domains) +| `localhost` | `OWNCLOUD_TRUSTED_DOMAINS` -| The ownCloud trusted domains +| The ownCloud trusted domains (xref:configuration/server/config_sample_php_parameters.adoc#define-list-of-trusted-domains-that-users-can-log-into[description]) | `localhost` +a| `OWNCLOUD_OVERWRITE_CLI_URL` +| The ownCloud Override CLI URL (xref:configuration/server/config_sample_php_parameters.adoc#override-cli-url[description]) +| `\http://localhost` + | `ADMIN_USERNAME` -| The admin username +| The webUI admin username | `admin` | `ADMIN_PASSWORD` -| The admin user’s password +| The webUI admin user’s password | `admin` | `HTTP_PORT` | The HTTP port to bind to | `{std-port-http}` + +| `MARIADB_IMAGE` +| The mariadb version + +(the minimum required ownCloud version is 10.9) +| `10.11` + +| `REDIS_IMAGE` +| The redis version +| `7` |=== NOTE: `ADMIN_USERNAME` and `ADMIN_PASSWORD` + @@ -174,16 +190,12 @@ will not change between deploys even if you change the values in the `.env` file To change them, you'll need to issue `docker volume prune`, which *will delete all your data*. -- -. Then, you can build and start the container, using your preferred Docker _command-line tool_. +. Start the container using your preferred Docker _command-line tool_ such as: + --- -The example below shows how to use {docker-compose-url}[Docker Compose]. - [source,docker] ---- docker compose up -d ---- --- . When the process completes: + @@ -216,27 +228,6 @@ Check that all the containers have successfully started, by running `docker comp In it, you can see that the database, ownCloud and Redis containers are running, and that ownCloud is accessible via port {std-port-http} on the host machine. -[IMPORTANT] -==== -All files stored in this setup are contained in Docker volumes rather than a physical filesystem tree. -It is the admin's responsibility to make the files persistent. - -To inspect the volumes run: -[source,docker] ----- -docker volume ls | grep files ----- - -The volume name depends on the project name which builds the first part of the volume and the name of the volume in the docker file. The naming pattern of the volume is `_`. An environment variable for `COMPOSE_PROJECT_NAME` can be set and also be defined in a `.env` file. If not specified, the directory in which docker compose is executed will be used as a name. - -To export the files of the project "owncloud-docker-server" as a tar archive run: -[source,docker] ----- -docker run -v :/mnt \ - ubuntu tar cf - -C /mnt . > files.tar ----- -==== - [TIP] ==== Although the containers are up and running, it may still take a few minutes until ownCloud is fully functional. + @@ -250,17 +241,9 @@ docker compose logs --follow owncloud Wait until the output shows **Starting apache daemon...** before you access the web UI. ==== -[IMPORTANT] -==== -Although all important data persists after: +IMPORTANT: All files stored in this setup are contained in Docker volumes rather than a physical filesystem tree. It is the admin's responsibility to make the files persistent. For details how to migrate, see the https://docs.docker.com/reference/cli/docker/container/cp/[docker container cp] command documentation. -[source,docker] ----- -docker compose down; docker compose up -d ----- - -there are certain details that get lost, e.g., default apps may re-appear after they were uninstalled. -==== +IMPORTANT: If you, for example, uninstall apps that are shipped with the image, these apps will be reappear on next container startup. -- === Logging In @@ -269,12 +252,11 @@ To log in to the ownCloud UI, open `pass:a[http://localhost:{std-port-http}]` (o image::docker/owncloud-ui-login.png[The ownCloud UI via Docker,width=300] -The username and password are the credentials which you stored in `.env` earlier. Note that these will not change between deploys even if you change the values in .env. +IMPORTANT: The username and password are the credentials which you stored in `.env` earlier. These will not change between deploys even if you change the values in the .env file. === Stopping the Containers -Again we assume you used `docker compose` like in the previous example. + -To stop the containers use: +To stop the containers, issue the following command: [source,docker] ---- docker compose stop @@ -298,7 +280,7 @@ docker compose exec owncloud occ IMPORTANT: Don't use the `php` command prefix, this leads to several errors and is not intended to run in docker environments. -=== Upgrading ownCloud on Docker +=== Upgrading ownCloud When a new version of ownCloud gets released, you should update your instance. To do so, follow these simple steps: @@ -331,16 +313,7 @@ NOTE: You need to adjust the password and database name if you have changed it i docker compose down ---- -. Update the version number of ownCloud in your `.env` file. You can use sed for it, as in the following example. -+ --- -Make sure that you adjust the example to match your installation. - -[source,bash] ----- -sed -i 's/^OWNCLOUD_VERSION=.*$/OWNCLOUD_VERSION=/' .env ----- --- +. Update the ownCloud version number in your `.env` file via the environment variable `OWNCLOUD_VERSION`. . View the file to ensure the change has been implemented. + @@ -372,22 +345,24 @@ docker compose logs --timestamp owncloud {occ-command-example-prefix-docker} maintenance:mode --off ---- -=== Docker Compose YAML File - -The file `docker-compose.yml` contains the configuration of your ownCloud container. +=== Container CLI -NOTE: Since ownCloud Server 10.5, the dedicated enterprise docker image `registry.owncloud.com/owncloud/enterprise` is *deprecated*. All supported enterprise features and apps are now included in the public image `owncloud/server` available on Docker Hub. A login to our registry `registry.owncloud.com` is no longer required. +If, for any reason, you need to enter the owncloud containers CLI, you can do that with the following command: -[source,yaml] +[source,docker,subs="attributes+"] ---- -include::example$installation/docker/docker-compose.yml[Example Docker Compose YAML configuration file for ownCloud Server.] +docker exec -it owncloud_server /bin/bash ---- +=== Additional Evironment Variables + +The image provides additional environment variables that can be configured for the use with the container. To identify available ones, see the file `overwrite.config.php` which can be found in the `config` directory. This directory is located in `/mnt/data` in the container or locally at the respective bind mount. + == Troubleshooting === Admin Settings -When running under docker, the admin user cannot control certain settings in the WebUI, instead they are now controlled by environment variables. Changing these variables requires stopping and restarting the container with extra `docker -e ...` parameters or with new entries in the `.env` file for docker compose. +With docker, the admin user cannot control certain settings in the WebUI, instead they are/can be now controlled by environment variables. Changing these variables requires stopping and restarting the container. When using environment variables, these changes need to be reflected in the compose file. ==== Logging From b9cfdc39544b78a419bfbc4bb8c9669f7c7499d0 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Sun, 17 May 2026 17:30:25 +0200 Subject: [PATCH 12/38] update installation --- .../installation/docker/docker-compose.yml | 4 +- .../pages/installation/index.adoc | 9 -- ...index.adoc => installing_with_docker.adoc} | 111 +++++++++++------- .../installation/mount_folder_structure.adoc | 33 ++++++ .../pages/installation/troubleshooting.adoc | 11 -- modules/admin_manual/pages/useful_pages.adoc | 2 +- modules/admin_manual/partials/nav.adoc | 5 +- .../pages/testing/ui-testing.adoc | 2 +- 8 files changed, 107 insertions(+), 70 deletions(-) delete mode 100644 modules/admin_manual/pages/installation/index.adoc rename modules/admin_manual/pages/installation/{docker/index.adoc => installing_with_docker.adoc} (86%) create mode 100644 modules/admin_manual/pages/installation/mount_folder_structure.adoc delete mode 100644 modules/admin_manual/pages/installation/troubleshooting.adoc diff --git a/modules/admin_manual/examples/installation/docker/docker-compose.yml b/modules/admin_manual/examples/installation/docker/docker-compose.yml index c2b6feb83..9da7a934b 100644 --- a/modules/admin_manual/examples/installation/docker/docker-compose.yml +++ b/modules/admin_manual/examples/installation/docker/docker-compose.yml @@ -72,16 +72,16 @@ services: volumes: oc_files: driver: local +# template when using bind mounts # driver_opts: # type: none # device: /mnt/oc # o: bind mysql: driver: local +# use the above template for bind mounts redis: driver: local - apache: - driver: local networks: oc_network: diff --git a/modules/admin_manual/pages/installation/index.adoc b/modules/admin_manual/pages/installation/index.adoc deleted file mode 100644 index cdbbc25eb..000000000 --- a/modules/admin_manual/pages/installation/index.adoc +++ /dev/null @@ -1,9 +0,0 @@ -= Installation Options - -== Introduction - -Starting with ownCloud Server 11, the only supported installation method is a Docker-based installation which includes PHP 8. Manual installation on Linux is no longer supported. - -== Using a Docker-Based Installation - -This guide shows you how to install xref:installation/docker/index.adoc[ownCloud with Docker] using Docker Compose with a YAML file provided by ownCloud. diff --git a/modules/admin_manual/pages/installation/docker/index.adoc b/modules/admin_manual/pages/installation/installing_with_docker.adoc similarity index 86% rename from modules/admin_manual/pages/installation/docker/index.adoc rename to modules/admin_manual/pages/installation/installing_with_docker.adoc index ce9e59f05..c0bbcb113 100644 --- a/modules/admin_manual/pages/installation/docker/index.adoc +++ b/modules/admin_manual/pages/installation/installing_with_docker.adoc @@ -10,7 +10,7 @@ {description} This {dockerhub-url}[official image] is designed to be used in a docker compose setup but can also be used for a quick evaluation. -The image contains the PHP and Apache setups, and nothing else needs to be added for it to work properly. +Starting with ownCloud Server 11, the only supported installation method is a Docker-based installation which includes PHP 8 and Apache. Manual installation on Linux is no longer supported. == Database Notes @@ -243,7 +243,7 @@ Wait until the output shows **Starting apache daemon...** before you access the IMPORTANT: All files stored in this setup are contained in Docker volumes rather than a physical filesystem tree. It is the admin's responsibility to make the files persistent. For details how to migrate, see the https://docs.docker.com/reference/cli/docker/container/cp/[docker container cp] command documentation. -IMPORTANT: If you, for example, uninstall apps that are shipped with the image, these apps will be reappear on next container startup. +IMPORTANT: For example, if you uninstall apps that came with the image, they will reappear when the container is restarted. -- === Logging In @@ -270,8 +270,7 @@ docker compose down --rmi all --volumes === Running occ commands -If you want to run an occ command, first go to the directory where your `.yaml` or `.env` file is located. -Here, you are able to run any command referring to xref:configuration/server/occ_command.adoc[Using the occ Command] by entering: +If you want to run an occ command, first go to the directory where your compose `.yaml` file is located. Here, you are able to run any command referring to xref:configuration/server/occ_command.adoc[Using the occ Command] by entering: [source,docker] ---- @@ -280,6 +279,71 @@ docker compose exec owncloud occ IMPORTANT: Don't use the `php` command prefix, this leads to several errors and is not intended to run in docker environments. +=== Additional Evironment Variables + +The image provides additional environment variables that can be configured for the use with the container. To identify available ones, see the file `overwrite.config.php` which can be found in the `config` directory. This directory is located in `/mnt/data` in the container or locally at the respective bind mount. + +=== Alternative Configuration + +Rather than using environment variables to configure your ownCloud instance, you can use additional configuration files, as was possible with earlier releases of ownCloud. This configuration method is only possible when using bind mounts because access to the `config` sub folder of the mounted is required. + +[source,plaintext] +---- +mount_point/ + - apps/ + - certs/ + - config/ + - files/ + - sessions/ +---- + +For more and important details see: xref:installation/mount_folder_structure.adoc[Mount Folder Structure]. + +== Troubleshooting + +=== Admin Settings + +With docker, the admin user cannot control certain settings in the WebUI, instead they are/can be now controlled by environment variables. Changing these variables requires stopping and restarting the container. When using environment variables, these changes need to be reflected in the compose file. + +=== Logging + +The loglevel is set to the fixed value 2: _"Warnings, errors, and fatal issues"_. + +.To get the highest log level "Everything" (including debug output), use: + +[source,plaintext] +---- +OWNCLOUD_LOGLEVEL=0 +---- + +=== Container CLI + +If you need to access the ownCloud containers CLI for any reason, you can do so using the following command: + +[source,docker,subs="attributes+"] +---- +docker exec -it owncloud_server /bin/bash +---- + +=== Terminating Containers + +If your container is terminating for whatever reason, you will not be able to run `docker(-compose) exec` to make investigations inside the container as there will be no running container. Instead you need to use `docker(-compose) run`. It's important that you prefix any command to be run by `/usr/bin/owncloud`, otherwise the container will not be initialized correctly. See the example command below: + +[source,bash] +---- +docker( compose) run /usr/bin/owncloud bash +---- + + +=== MySQL + +If your ownCloud installation fails and you see the following error in your ownCloud log please refer to xref:configuration/database/linux_database_configuration.adoc#mysql-mariadb[MySQL / MariaDB with Binary Logging Enabled] for how to resolve it. + +[source,plaintext] +---- +An unhandled exception has been thrown: exception ‘PDOException’ with message 'SQLSTATE[HY000]: General error: 1665 Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.' +---- + === Upgrading ownCloud When a new version of ownCloud gets released, you should update your instance. To do so, follow these simple steps: @@ -344,42 +408,3 @@ docker compose logs --timestamp owncloud ---- {occ-command-example-prefix-docker} maintenance:mode --off ---- - -=== Container CLI - -If, for any reason, you need to enter the owncloud containers CLI, you can do that with the following command: - -[source,docker,subs="attributes+"] ----- -docker exec -it owncloud_server /bin/bash ----- - -=== Additional Evironment Variables - -The image provides additional environment variables that can be configured for the use with the container. To identify available ones, see the file `overwrite.config.php` which can be found in the `config` directory. This directory is located in `/mnt/data` in the container or locally at the respective bind mount. - -== Troubleshooting - -=== Admin Settings - -With docker, the admin user cannot control certain settings in the WebUI, instead they are/can be now controlled by environment variables. Changing these variables requires stopping and restarting the container. When using environment variables, these changes need to be reflected in the compose file. - -==== Logging - -The loglevel is set to the fixed value 2: _"Warnings, errors, and fatal issues"_. - -.To get the highest log level "Everything" (including debug output), use: - -[source,plaintext] ----- -OWNCLOUD_LOGLEVEL=0 ----- - -=== Terminating Containers - -If your container is terminating for whatever reason, you will not be able to run `docker(-compose) exec` to make investigations inside the container as there will be no running container. Instead you need to use `docker(-compose) run`. It's important that you prefix any command to be run by `/usr/bin/owncloud`, otherwise the container will not be initialized correctly. See the example command below: - -[source,bash] ----- -docker( compose) run /usr/bin/owncloud bash ----- diff --git a/modules/admin_manual/pages/installation/mount_folder_structure.adoc b/modules/admin_manual/pages/installation/mount_folder_structure.adoc new file mode 100644 index 000000000..573ae3c0e --- /dev/null +++ b/modules/admin_manual/pages/installation/mount_folder_structure.adoc @@ -0,0 +1,33 @@ += Mount Folder Structure +:toc: right +:description: When using bind mounts, ownCloud provides a predefined folder structure which is important to know. + +== Introduction + +{description} + +== Folder Structure + +This folder structure is important not only for knowign your data is located, but also when migrating ownCloud to a Dockerised environment. + +[source,plaintext] +---- +mount_point/ + - apps/ <1> + - certs/ + - config/ <2> + - files/ <3> + - sessions/ +---- + +<1> The apps folder will contain ANY apps that will be added manually and are not automatically shipped by ownCloud. It matches xref: configuration/server/config_sample_php_parameters.adoc#define-alternative-app-directories[Define alternative app directories] aka the `apps-external` configuration of the config. + +<2> The location for additional configuration files, if not using environment varialbles, as was possible with earlier releases of ownCloud. ++ +-- +IMPORTANT: Do not delete or manipulate any files in the config folder provided by the system. + +IMPORTANT: Consider the alphabetic order the system is reading config files. With conflicting settings, the last one counts. +-- + +<3> The files folder matches the `data` directory with former ownCloud releases. diff --git a/modules/admin_manual/pages/installation/troubleshooting.adoc b/modules/admin_manual/pages/installation/troubleshooting.adoc deleted file mode 100644 index 9b1337467..000000000 --- a/modules/admin_manual/pages/installation/troubleshooting.adoc +++ /dev/null @@ -1,11 +0,0 @@ -= Troubleshooting - -If your ownCloud installation fails and you see the following error in -your ownCloud log please refer to -xref:configuration/database/linux_database_configuration.adoc#mysql-mariadb[MySQL / MariaDB with Binary Logging Enabled] -for how to resolve it. - -[source,plaintext] ----- -An unhandled exception has been thrown: exception ‘PDOException’ with message 'SQLSTATE[HY000]: General error: 1665 Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.' ----- diff --git a/modules/admin_manual/pages/useful_pages.adoc b/modules/admin_manual/pages/useful_pages.adoc index c642f64ff..825d449f2 100644 --- a/modules/admin_manual/pages/useful_pages.adoc +++ b/modules/admin_manual/pages/useful_pages.adoc @@ -11,7 +11,7 @@ Note that this section always points to the latest server version available. In case you need a different version, select your topic and manually switch to one of the available ones. -* xref:server:admin_manual:installation/docker/index.adoc[Installation with Docker] +* xref:server:admin_manual:installation/installing_with_docker.adoc[Installation with Docker] * xref:server:admin_manual:configuration/server/occ_command.adoc[OCC Commands] * xref:server:admin_manual:configuration/server/caching_configuration.adoc#small-organization-single-server-setup[File Locking and Caching Configuration] * xref:server:admin_manual:maintenance/manual_upgrade.adoc[Manual Upgrade] diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index 3a471c47e..d130a1fe8 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -10,9 +10,8 @@ *** xref:admin_manual:installation/deployment_recommendations.adoc[Deployment Recommendations] **** xref:admin_manual:installation/deployment_recommendations/nfs.adoc[NFS] *** xref:admin_manual:installation/system_requirements.adoc[System Requirements] -*** xref:admin_manual:installation/index.adoc[Installation Options] -**** xref:admin_manual:installation/docker/index.adoc[Installing With Docker] -*** xref:admin_manual:installation/troubleshooting.adoc[Troubleshooting] +*** xref:admin_manual:installation/installing_with_docker.adoc[Installing With Docker] +*** xref:admin_manual:installation/mount_folder_structure.adoc[Mount Folder Structure] *** xref:admin_manual:installation/apps_management_installation.adoc[Installing and Managing Apps] *** xref:admin_manual:installation/apps_supported.adoc[Supported Apps] **** xref:admin_manual:installation/apps/mediaviewer/index.adoc[Media Viewer] diff --git a/modules/developer_manual/pages/testing/ui-testing.adoc b/modules/developer_manual/pages/testing/ui-testing.adoc index 52f4cef17..d93bbfdae 100644 --- a/modules/developer_manual/pages/testing/ui-testing.adoc +++ b/modules/developer_manual/pages/testing/ui-testing.adoc @@ -6,7 +6,7 @@ == Requirements * ownCloud >= 10.0. Make sure you have a running instance of ownCloud -xref:admin_manual:installation/index.adoc[setup completely]. +xref:admin_manual:installation/installing_with_docker.adoc[setup completely]. * Default language set to `en` (in `config/config.php` set `'default_language' => 'en',`). * An admin user called `admin` with the password `admin`. From d07c00313420b5cb1592180323332019afbc2f9e Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Mon, 18 May 2026 13:30:04 +0200 Subject: [PATCH 13/38] many updates --- antora.yml | 3 +- global-attributes.yml | 2 +- .../apps_management_installation.adoc | 62 +-- .../deployment_considerations.adoc | 70 ++- .../installation/installation_wizard.adoc | 92 ---- .../installation/installing_with_docker.adoc | 6 +- .../installation/letsencrypt/apache.adoc | 209 -------- .../pages/installation/letsencrypt/index.adoc | 7 - .../letsencrypt/using_letsencrypt.adoc | 383 --------------- .../manual_installation/compile_samba.adoc | 280 ----------- .../manual_installation/manual_imagick7.adoc | 312 ------------ .../manual_installation.adoc | 228 --------- .../manual_installation_apache.adoc | 141 ------ .../manual_installation_db.adoc | 72 --- .../manual_installation_prerequisites.adoc | 303 ------------ .../script_guided_install.adoc | 236 --------- .../server_prep_ubuntu_20.04.adoc | 453 ------------------ .../server_prep_ubuntu_22.04.adoc | 385 --------------- .../upgrade_install_phpmyadmin.adoc | 185 ------- .../installation/mount_folder_structure.adoc | 8 +- .../quick_guides/ubuntu_20_04.adoc | 323 ------------- .../quick_guides/ubuntu_22_04.adoc | 341 ------------- .../installation/system_requirements.adoc | 6 +- .../pages/maintenance/migrating.adoc | 308 +++--------- modules/admin_manual/partials/nav.adoc | 8 +- .../pages/general/devenv.adoc | 68 +-- site.yml | 2 +- 27 files changed, 152 insertions(+), 4341 deletions(-) delete mode 100644 modules/admin_manual/pages/installation/installation_wizard.adoc delete mode 100644 modules/admin_manual/pages/installation/letsencrypt/apache.adoc delete mode 100644 modules/admin_manual/pages/installation/letsencrypt/index.adoc delete mode 100644 modules/admin_manual/pages/installation/letsencrypt/using_letsencrypt.adoc delete mode 100644 modules/admin_manual/pages/installation/manual_installation/compile_samba.adoc delete mode 100644 modules/admin_manual/pages/installation/manual_installation/manual_imagick7.adoc delete mode 100644 modules/admin_manual/pages/installation/manual_installation/manual_installation.adoc delete mode 100644 modules/admin_manual/pages/installation/manual_installation/manual_installation_apache.adoc delete mode 100644 modules/admin_manual/pages/installation/manual_installation/manual_installation_db.adoc delete mode 100644 modules/admin_manual/pages/installation/manual_installation/manual_installation_prerequisites.adoc delete mode 100644 modules/admin_manual/pages/installation/manual_installation/script_guided_install.adoc delete mode 100644 modules/admin_manual/pages/installation/manual_installation/server_prep_ubuntu_20.04.adoc delete mode 100644 modules/admin_manual/pages/installation/manual_installation/server_prep_ubuntu_22.04.adoc delete mode 100644 modules/admin_manual/pages/installation/manual_installation/upgrade_install_phpmyadmin.adoc delete mode 100644 modules/admin_manual/pages/installation/quick_guides/ubuntu_20_04.adoc delete mode 100644 modules/admin_manual/pages/installation/quick_guides/ubuntu_22_04.adoc diff --git a/antora.yml b/antora.yml index 2840184c6..88574b6f0 100644 --- a/antora.yml +++ b/antora.yml @@ -10,8 +10,7 @@ asciidoc: attributes: latest-server-version: {page-component-version} # do not change, this is the value of the version key previous-server-version: {page-component-version} # do not change, this is the value of the version key - latest-server-download-version: {page-component-version} # do not change, this is the value of the version key - current-server-version: {page-component-version} # do not change, this is the value of the version key + current-server-version: {page-component-version} # do not change, this is the value of the version key minimum-php-version: '7.4' minimum-php-printed: '7.4.0' minimum-php-version-short-code: '74' diff --git a/global-attributes.yml b/global-attributes.yml index a62131e67..61324b4f9 100644 --- a/global-attributes.yml +++ b/global-attributes.yml @@ -26,8 +26,8 @@ previous-docs-version: 'next' # server latest-server-version: '10.15' - latest-server-download-version: '10.16.2' previous-server-version: '10.14' + latest-server-download-version: '10.16.2' current-server-version: '10.15' oc-changelog-url: 'https://owncloud.com/changelog/server/' oc-install-package-url: 'https://download.owncloud.com/server/stable/?sort=time&order=asc' diff --git a/modules/admin_manual/pages/installation/apps_management_installation.adoc b/modules/admin_manual/pages/installation/apps_management_installation.adoc index 26dc954c9..7b991e6f6 100644 --- a/modules/admin_manual/pages/installation/apps_management_installation.adoc +++ b/modules/admin_manual/pages/installation/apps_management_installation.adoc @@ -1,9 +1,14 @@ = Installing and Managing Apps :toc: right +:description: After installing ownCloud, you may provide added functionality by installing applications. == Introduction -After installing ownCloud, you may provide added functionality by installing applications. +{description} The Docker image comes with all apps provided by ownCloud, regardless of the licensing scheme. Apps that are not part of the image can be installed at any time. + +IMPORTANT: Any apps that came with the image will reappear when the container is restarted - if you uninstall them. + +IMPORTANT: Any apps that are installed manually must be compatible with PHP 8; otherwise, they will most likely fail to work and make your instance unstable. == Installing and Managing Apps @@ -11,20 +16,15 @@ After installing ownCloud, you may provide added functionality by installing app image:installation/top_menu_showing_market_app.png[ownCloud top navigation menu showing the Market app] -To add an app, use the _Market_ app, which is accessible from the top-level navigation bar, on the left-hand side of the page. -Once in the Market app, click an app's name to view more details about it. -Once you have done this, you can also install it by clicking btn:[Install]. -Clicking _Install_, downloads it from the ownCloud Marketplace, installs, and enables it. +To add an app, use the _Market_ app, which is accessible from the top-level navigation bar, on the left-hand side of the page. Once in the Market app, click an app's name to view more details about it. Once you have done this, you can also install it by clicking btn:[Install]. Clicking _Install_, downloads it from the ownCloud Marketplace, installs, and enables it. -Sometimes the installation of a third-party app fails silently, possibly because `appcodechecker' => true,` is enabled in `config.php`. -When `appcodechecker` is enabled, it checks if third-party apps are using the private API, rather than the public API. -If they are, they are not installed. +Sometimes the installation of a third-party app fails silently, possibly because `appcodechecker' => true,` is enabled in `config.php`. When `appcodechecker` is enabled, it checks if third-party apps are using the private API, rather than the public API. If they are, they are not installed. NOTE: If you would like to create or add (your own) ownCloud app, please refer to the xref:developer_manual:app/introduction.adoc[developer manual]. === Installing Apps Manually -To install an app manually, instead of by using the Market app, extract the app tarball into your ownCloud installation's default app folder (`/apps`) or, ideally, into xref:using-custom-app-directories[a custom app directory]. +All apps that are installed manually, regradless using the Marketplace or you copy them, will be placed into the `apps` folder of the ownCloud volume. This volume is either the Docker volume or a defined bind mount. This apps folder corresponds to the `apps-external` folder. For more and important details see: xref:installation/mount_folder_structure.adoc[Mount Folder Structure]. Once the tarball has been extracted into the default app folder. Enable the application, @@ -65,46 +65,6 @@ Some apps have configurable options on the Apps page, such as *Enable only for s However, this is the exception. Apps are mainly configured from your ownCloud Personal or Admin settings page, or in `config.php`. -== Using Custom App Directories - -There are several reasons for using custom app directories instead of ownCloud's default. -These are: - -. It separates ownCloud's core apps from user or admin downloaded apps. -Doing so distinguishes which apps are core and which aren't, simplifying upgrades. -. It eases manual upgrades. -Having non-core apps in a directory separate to the core app directory makes them simpler to manage. -. ownCloud may gain new core apps in newer versions. -Doing so orphans deprecated apps, but doesn't remove them. - -If you want to store apps in a custom directory, instead of ownCloud's default (`/app`), you need to modify the `apps_paths` element in `config/config.php`. -There, you need to add a new associative array that contains three elements. -These are: - -`path`:: The absolute file system path to the custom app folder. -`url`:: The request path to that folder relative to the ownCloud webroot, prefixed with `/`. -`writable`:: Whether users can install apps in that folder. - -After adding the configuration, ownCloud only installs apps in directories where `writable` is set to `true`. -The configuration example below shows how to add a second directory, called `apps-external`. - -[source,php] ----- -include::example$installation/custom-app-directory-configuration.php[] ----- - -After you add a new directory configuration, you can then move apps from the original app directory to the new one. -To do so, follow these steps: - -. xref:configuration/server/occ_command.adoc#maintenance-commands[Enable maintenance mode]. -. xref:configuration/server/occ_command.adoc#apps-commands[Disable the apps] that you want to move. -. Create a new apps directory and assign it the same user and group, and ownership permissions as the core apps directory. -. Move the apps from the old apps directory to the new apps directory. -. Add a new app directory in `config/config.php`. -. If you’re using a cache, such as xref:configuration/server/caching_configuration.adoc#clearing-the-redis-cache[Redis] or xref:configuration/server/caching_configuration.adoc#clearing-the-memcached-cache[Memcached], ensure that you clear the cache. -. xref:configuration/server/occ_command.adoc#apps-commands[Re-enable the apps]. -. xref:configuration/server/occ_command.adoc#maintenance-commands[Disable maintenance mode]. - -== Multiple Servers +== Apps With Multiple owCloud Servers -We recommend having your apps-external and your config directory on a network storage in order to prevent conflicts when installing or updating apps. +We recommend having your Docker volume on a network storage in order to prevent conflicts when installing or updating apps. diff --git a/modules/admin_manual/pages/installation/deployment_considerations.adoc b/modules/admin_manual/pages/installation/deployment_considerations.adoc index a2daa7acd..8cc269c4e 100644 --- a/modules/admin_manual/pages/installation/deployment_considerations.adoc +++ b/modules/admin_manual/pages/installation/deployment_considerations.adoc @@ -5,8 +5,7 @@ * Solid-state drives (SSDs) for I/O. * Separate hard disks for storage and database, SSDs for databases. -* Multiple network interfaces to distribute server synchronisation and -backend traffic across multiple subnets. +* Multiple network interfaces to distribute server synchronisation and backend traffic across multiple subnets. === Single Machine / Scale-Up Deployment @@ -14,32 +13,24 @@ The single-machine deployment is widely used in the community. Pros: -* Easy setup: no session storage daemon, use tmpfs and memory caching to -enhance performance, local storage. +* Easy setup: no session storage daemon, use tmpfs and memory caching to enhance performance, local storage. * No network latency to consider. -* To scale buy a bigger CPU, more memory, larger hard drive, or -additional hard drives. +* To scale buy a bigger CPU, more memory, larger hard drive, or additional hard drives. Cons: * Fewer high availability options. -* The amount of data in ownCloud tends to continually grow. Eventually a -single machine will not scale; I/O performance decreases and becomes a -bottleneck with multiple up- and downloads, even with solid-state -drives. +* The amount of data in ownCloud tends to continually grow. Eventually a single machine will not scale; I/O performance decreases and becomes a bottleneck with multiple up- and downloads, even with solid-state drives. === Scale-Out Deployment Provider setup: -* DNS round robin to HAProxy servers (2-n, SSL offloading, cache static -resources) +* DNS round robin to HAProxy servers (2-n, SSL offloading, cache static resources) * Least load to Apache servers (2-n) * Memcached/Redis for shared session storage (2-n) -* Database cluster with single primary, multiple replicas and proxy to -split requests accordingly (2-n) -* GPFS or Ceph via phprados (2-n, 3 to be safe, Ceph 10+ nodes to see -speed benefits under load) +* Database cluster with single primary, multiple replicas and proxy to split requests accordingly (2-n) +* GPFS or Ceph via phprados (2-n, 3 to be safe, Ceph 10+ nodes to see speed benefits under load) * In case of clustering, your cluster nodes must have the same ownCloud configuration including an identical config.php to avoid any potential issues. Pros: @@ -52,54 +43,47 @@ Cons: * More complicated to setup. * Network becomes the bottleneck (10GB Ethernet recommended). -* Currently DB filecache table will grow rapidly, making migrations -painful in case the table is altered. +* Currently DB filecache table will grow rapidly, making migrations painful in case the table is altered. === A Single primary DB is Single Point of Failure, Does Not Scale -When primary fails another replica can become primary. However, the -increased complexity carries some risks: Multi-primary has the risk of -split brain, and deadlocks. ownCloud tries to solve the problem of -deadlocks with high-level file locking. +When primary fails another replica can become primary. However, the increased complexity carries some risks: Multi-primary has the risk of split brain, and deadlocks. ownCloud tries to solve the problem of deadlocks with high-level file locking. == Software === Docker Host -ownCloud Server 11 runs exclusively in Docker containers. The host operating system only needs to provide Docker Engine and Docker Compose. The web server, PHP runtime, and application dependencies are all encapsulated within the ownCloud Docker images. +ownCloud Server 11 runs exclusively in Docker containers. The host operating system only needs to provide Docker Engine and Docker Compose. A basic web server (Apache), the required PHP runtime, and the application dependencies are all encapsulated within the ownCloud Docker image. + +=== Web Proxy + +The Docker image does not handle SSL. Therefore, you must use a proxy in front of this image to add web security and other web-related settings. The embedded web server is pre-configured to serve ownCloud Server 11; further configuration is not possible. === Relational Database -More often than not the customer already has an opinion on what database -to use. In general, the recommendation is to use what their database -administrator is most familiar with. Taking into account what we are -seeing at customer deployments, we recommend MySQL/MariaDB in a -primary-replica deployment with a MySQL proxy in front of them to send -updates to primary, and selects to the replica(s). +More often than not the customer already has an opinion on what database to use. In general, the recommendation is to use what their database administrator is most familiar with. Taking into account what we are seeing at customer deployments, we recommend MySQL/MariaDB in a primary-replica deployment with a MySQL proxy in front of them to send updates to primary, and selects to the replica(s). -The second-best option is PostgreSQL (alter table does not lock table, -which makes migration less painful) although we have yet to find a -customer who uses a primary-replica setup. +The second-best option is PostgreSQL (alter table does not lock table, which makes migration less painful) although we have yet to find a customer who uses a primary-replica setup. What about the other DBMS? -* Sqlite is adequate for simple testing, and for low-load single-user -deployments. It is not adequate for production systems. +* Sqlite is adequate for simple testing, and for low-load single-user deployments. It is not adequate for production systems. * Microsoft SQL Server is not a supported option. -* Oracle DB is the de facto standard at large enterprises and is fully -supported with ownCloud Enterprise Edition only. +* Oracle DB is the de facto standard at large enterprises and is fully supported with ownCloud Enterprise Edition only. + +== Storage + +=== Docker Volume + +When using bind mounts with the Docker volume, consider using a shared directory, such as NFS, as the mount point. This is important if you plan to implement Active-Passive failover scenarios, since the instance taking over must be able to access the configuration and app data.. -== File Storage +=== File Storage -While many customers are starting with NFS, sooner or later that -requires scale-out storage. Currently the options are GPFS or GlusterFS, -or an object store protocol like S3. S3 also allows access to Ceph Storage. +While many customers initially use NFS for file data, they eventually require scale-out storage. The current options are GPFS, GlusterFS or an object storage protocol such as S3. S3 also provides access to Ceph Storage. == Session Storage * Redis is required for transactional file locking xref:configuration/files/files_locking_transactional.adoc[Transactional File Locking], provides session persistence, and graphical inspection tools available. -* If you need to scale out Shibboleth you must use Memcached, as -Shibboleth does not provide an interface to Redis. Memcached can also be -used to scale-out shibd session storage (see +* If you need to scale out Shibboleth you must use Memcached, as Shibboleth does not provide an interface to Redis. Memcached can also be used to scale-out shibd session storage (see https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPStorageService#NativeSPStorageService-MemcacheStorageService[Memcache StorageService]). diff --git a/modules/admin_manual/pages/installation/installation_wizard.adoc b/modules/admin_manual/pages/installation/installation_wizard.adoc deleted file mode 100644 index efee6d8a5..000000000 --- a/modules/admin_manual/pages/installation/installation_wizard.adoc +++ /dev/null @@ -1,92 +0,0 @@ -= The Installation Wizard -:toc: right -:toclevels: 1 -:passwbasicauth_url: https://wiki.apache.org/httpd/PasswordBasicAuth -:access_control_url: https://httpd.apache.org/docs/2.4/howto/access.html -:page-aliases: go/admin-dir_permissions.adoc - -== Introduction - -When you have installed ownCloud physically, you can either finalize the installation from the command line or the installation wizard. This guide focuses on using the installation wizard. - -IMPORTANT: If you are planning to use the installation wizard, we *strongly* encourage you to protect it through some form of {passwbasicauth_url}[password authentication] or {access_control_url}[access control]. If the installer is left unprotected when exposed to the internet, there is the possibility that a malicious actor could finish the installation and block you out — or worse. So please ensure that only you — or someone from your organization — can access the web installer. - -== Quick Start - -When the ownCloud prerequisites are fulfilled and all ownCloud files are installed, run the Installation Wizard. This involves just three steps: - -1. Point your web browser to `\http://`. -2. Enter your desired administrator’s username and password. -3. Click btn:[Finish Setup]. - -image:installation/install-wizard-a.jpg[Installation Wizard, width=50%] - -Now you can start using your new ownCloud server. Of course, there is much more that you could do to set up your ownCloud server for best performance and security. In the following sections, we will cover important installation and post-installation steps. - -== Detailed Guide - -This section provides a more detailed guide to the installation wizard and the three main topics: - -1. xref:post-installation-steps[Post-Installation Steps] -2. xref:configuration-options[Configuration Options] -3. xref:database-setup-by-owncloud[Database Setup by ownCloud] - -=== Post-Installation Steps - -For hardened security and proper server operation, ownCloud recommends setting the permissions on your ownCloud directories as strictly as possible. This should be done immediately after the initial installation and before running the setup. - -Your HTTP user must own the directories `config/`, `data/`, `apps/` and, if applicable, `apps-external/` so that you can configure ownCloud, create, modify and delete your data files and install apps via the ownCloud Web interface. - -You can find your HTTP user in your HTTP server configuration files, or you can use label-phpinfo. Look for the *User/Group* line. - -* The HTTP user and group in Debian/Ubuntu is `www-data`. -* The HTTP user and group in Fedora/CentOS is `apache`. -* The HTTP user and group in Arch Linux is `http`. -* The HTTP user in openSUSE is `wwwrun`, and the HTTP group is `www`. - -NOTE: When using an NFS mount for the data directory, do not change its ownership from the default. The simple act of mounting the drive will set proper permissions for ownCloud to write to the directory. Changing ownership could cause problems if the NFS mount is lost. - -An easy way to set the correct permissions is to use the scripts provided in the -xref:installation/manual_installation/script_guided_install.adoc[Script-Guided Installation]. - -=== Configuration Options - -Click btn:[Storage and Database] to expose additional installation configuration options for your ownCloud data directory and to select the database and configure the access. - -image:installation/install-wizard-a1.jpg[Installation Configuration Options, width=50%] - -CAUTION: For security reasons, the `data` directory of your ownCloud should be located outside the webroot of your server. - -The location of the `data` directory can either be defined by entering the path here or when installing the ownCloud files. For more information on the latter, see the -xref:installation/manual_installation/script_guided_install.adoc[Script-Guided Installation]. - -If you define the path here, the respective setting in your config.php file will be adjusted. Alternatively, you can create a link `data` pointing to the directory containing the actual files. In this case, the config.php setting for the data directory remains unchanged. - -IMPORTANT: ownCloud’s data directory *must be exclusive to ownCloud* and not be modified manually by any other process or user. - -It is best to configure your data directory location at installation, as it is difficult to move after installation. You may put it anywhere; in this example is it located in `/var/oc_data`. This directory must already exist and must be owned by your webserver user. - -=== Database Setup by ownCloud - -IMPORTANT: Your database and PHP connectors must be installed **before** you run the Installation Wizard. - -After you enter your administrative login for your database, the installer creates a special database user with privileges limited to the ownCloud database. - -Afterward, ownCloud only needs this special ownCloud database user and drops the administrative database login you used before. This new user's name is based on your ownCloud admin user with an `oc_` prefix and given a random password. The ownCloud database user and password are written into `config.php`: - -For MySQL/MariaDB: - ----- -'dbuser' => 'oc_dbadmin', -'dbpassword' => 'pX65Ty5DrHQkYPE5HRsDvyFHlZZHcm', ----- - -For PostgreSQL: - ----- -'dbuser' => 'oc_postgres', -'dbpassword' => 'pX65Ty5DrHQkYPE5HRsDvyFHlZZHcm', ----- - -Click btn:[Finish setup], and you’re ready to start using your new ownCloud server. - diff --git a/modules/admin_manual/pages/installation/installing_with_docker.adoc b/modules/admin_manual/pages/installation/installing_with_docker.adoc index c0bbcb113..758d301be 100644 --- a/modules/admin_manual/pages/installation/installing_with_docker.adoc +++ b/modules/admin_manual/pages/installation/installing_with_docker.adoc @@ -243,7 +243,7 @@ Wait until the output shows **Starting apache daemon...** before you access the IMPORTANT: All files stored in this setup are contained in Docker volumes rather than a physical filesystem tree. It is the admin's responsibility to make the files persistent. For details how to migrate, see the https://docs.docker.com/reference/cli/docker/container/cp/[docker container cp] command documentation. -IMPORTANT: For example, if you uninstall apps that came with the image, they will reappear when the container is restarted. +IMPORTANT: Any apps that came with the image will reappear when the container is restarted - if you uninstall them. -- === Logging In @@ -325,6 +325,10 @@ If you need to access the ownCloud containers CLI for any reason, you can do so docker exec -it owncloud_server /bin/bash ---- +=== List Shipped Apps + +The Docker image comes with all apps provided by ownCloud, regardless of the licensing scheme. To see a list of the apps that have been shipped, you can either look in the GUI or list the contents of `/var/www/owncloud/apps` when accessing the xref:#container-cli[container CLI]. + === Terminating Containers If your container is terminating for whatever reason, you will not be able to run `docker(-compose) exec` to make investigations inside the container as there will be no running container. Instead you need to use `docker(-compose) run`. It's important that you prefix any command to be run by `/usr/bin/owncloud`, otherwise the container will not be initialized correctly. See the example command below: diff --git a/modules/admin_manual/pages/installation/letsencrypt/apache.adoc b/modules/admin_manual/pages/installation/letsencrypt/apache.adoc deleted file mode 100644 index 4a593fbfa..000000000 --- a/modules/admin_manual/pages/installation/letsencrypt/apache.adoc +++ /dev/null @@ -1,209 +0,0 @@ -= Configure Apache with Let's Encrypt -:toc: right -:toclevels: 1 -:description: Learn how to configure Apache with Let's Encrypt, using Ubuntu Linux with ownCloud. -:keywords: LetsEncrypt, Apache, SSL, OpenSSL -:diffie-hellman-url: https://en.wikipedia.org/wiki/Diffie–Hellman_key_exchange -:sslopensslconfcmd-url: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslopensslconfcmd -:forward-secrecy-1-url: https://www.thesslstore.com/blog/perfect-forward-secrecy-explained/ -:forward-secrecy-2-url: https://scotthelme.co.uk/perfect-forward-secrecy/ -:sslusestapling-url: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslusestapling -:sslstaplingcache-url: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslstaplingcache -:virtual-host-url: https://httpd.apache.org/docs/2.4/vhosts/examples.html -:letsencrypt-url: https://letsencrypt.org/getting-started/ -:ssl-configuration-generator-url: https://ssl-config.mozilla.org/#server=apache&version=2.4.41&config=intermediate&openssl=1.1.1k&guideline=5.6 - -== Introduction - -This guide shows how to configure Apache with Let's Encrypt. - -== Dependencies - -To follow this guide, your server needs to have the following dependencies installed: - -- Apache 2.4.8 or later -- OpenSSL 1.0.2 or later -- {letsencrypt-url}[Let's Encrypt] - -== Assumptions - -This guide assumes these things: - -. That you are using Ubuntu. + - If you are not using Ubuntu, please adjust the instructions to suit your distribution or operating system. -. That your ownCloud installation is configured using a {virtual-host-url}[VirtualHost (vhost)] configuration instead of being configured in the main Apache configuration. -. That the vhost configuration file is stored under `/etc/apache2/sites-available/`. + - Not all distributions use this location, however. Refer to your distribution's Apache documentation, to know where to store yours. - -NOTE: See the {ssl-configuration-generator-url}[SSL Configuration Generator] for setup details depending on your environment, especially the different results based on the selected _Mozilla Configurations_. - -== Create and Configure a Diffie-Hellman Params File - -NOTE: A Diffie-Hellman (DH) params file is necessary for Forward Secrecy and for securing your TLS setup. Read {forward-secrecy-1-url}[Perfect Forward Secrecy Explained] or {forward-secrecy-2-url}[Perfect Forward Secrecy - An Introduction] for more details. - -When using Apache 2.4.8 or later and OpenSSL 1.0.2 or later, you can generate and specify a {diffie-hellman-url}[Diffie-Hellman] (DH) params file. If not already present in your VirtualHost (vhost) file, add an {sslopensslconfcmd-url}[SSLOpenSSLConfCmd] directive and a new certificate with stronger keys, which improves Forward Secrecy. - -TIP: The following OpenSSL command may take quite a while to complete, so be patient. - -You can place the generated SSL certificate into any directory of your choice by running the following command and changing the value supplied to the `-out` option. We recommend storing it in `/etc/apache2/` in this guide, solely for simplicity. - -[source,bash] ----- -sudo openssl dhparam -out /etc/apache2/dh4096.pem 4096 ----- - -Once the command completes, add the following directive to your common SSL configuration: - -[source,apache] ----- -SSLOpenSSLConfCmd DHParameters /etc/apache2/dh4096.pem ----- - -== Let's Encrypt ACME-Challenge - -After that, add an Alias directive for the `/.well-known/acme-challenge` location in your HTTP VirtualHost configuration, as in line four in the following example. - -[source,apache] ----- - - ServerName mydom.tld - - Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/ - - Options None - AllowOverride None - ForceType text/plain - RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)" - - - # ... remaining configuration - ----- - -== Create an SSL VirtualHost Configuration - -We recommend creating a separate file for storing the `SSL` directives for each site. If these directives already exist on the virtual host for the site, delete them and include the file instead. This way, after the certificate has been created, you can use the file in any virtual host configuration with SSL enabled for which the certificate is valid without reissuing the SSL certificate. It also eases the management for the web site certificate files, as you can easily include or exclude the file in the virtual config with a single remark and it keeps the files' contents compact. - -[source,bash] ----- -cd /etc/apache2/ -sudo mkdir ssl_rules -touch ssl_rules/ssl_mydom.tld ----- - -./etc/apache2/ssl_rules/ssl_mydom.tld -[source,apache] ----- -# Eases letsencrypt initial cert issuing - -SSLEngine on -SSLCertificateChainFile /etc/letsencrypt/live/mydom.tld/fullchain.pem -SSLCertificateKeyFile /etc/letsencrypt/live/mydom.tld/privkey.pem -SSLCertificateFile /etc/letsencrypt/live/mydom.tld/cert.pem ----- - -[TIP] -==== -To improve SSL performance, we recommend that you use the {sslusestapling-url}[SSLUseStapling] and {sslstaplingcache-url}[SSLStaplingCache] directives. -Here's an example configuration: - -[source,apache] ----- -SSLUseStapling on -SSLStaplingCache shmcb:/tmp/stapling_cache(2097152) ----- -==== - -With the files created and filled-out, update your HTTPS VirtualHost configuration: - -[source,apache] ----- - - ServerName mydom.tld - - # ssl letsencrypt - # Include /etc/apache2/ssl_rules/ssl_mydom.tld - - #... - ----- - -IMPORTANT: For the moment, comment out the `Include` directive, as the certificate files do not, currently, exist. - -== Test and Enable the Apache Configuration - -If not already done, enable the Apache2 ssl module necessary for the ssl configuration. Use the following command to enable it: - -[source,bash] ----- -sudo a2enmod ssl ----- - -With the configuration created, test it by running one of the following two commands: - -[source,bash] ----- -sudo apache2ctl configtest -sudo apache2ctl -t ----- - -It should not display any errors. If it doesn't, load your new Apache configuration by running the following command: - -[source,bash] ----- -sudo apache2ctl graceful ----- - -=== Create the SSL Certificates - -See the Let’s Encrypt xref:installation/letsencrypt/using_letsencrypt.adoc#create-an-ssl-certificate[Create an SSL Certificate] -documentation for how to create the SSL certificates. - -See the Let’s Encrypt xref:installation/letsencrypt/using_letsencrypt.adoc#listing-existing-certificates[Listing Existing Certificates] -documentation for how to list the SSL certificates. - -As the certificate files exist, you can uncomment the `Include` directive in your HTTPS VirtualHost configuration to use them. - -[source,apache] ----- - - ServerName mydom.tld - - # ssl letsencrypt - Include /etc/apache2/ssl_rules/ssl_mydom.tld - - #... - ----- - -== Reload the Apache Configuration - -Finally, reload (or restart) Apache. - -It is now ready to serve HTTPS request for the given domain using the issued certificates. - -[source,bash] ----- -sudo service apache2 reload ----- - -== Add a Redirect Directive - -Now that SSL has been configured and enabled, a redirection of all traffic to the encrypted ssl site needs to be added. Reload the Apache configuration to activate it. - -[source,apache] ----- - - ServerName mydom.tld - Redirect permanent / https:/// - Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/ - - Options None - AllowOverride None - ForceType text/plain - RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)" - - - # ... remaining configuration - ----- diff --git a/modules/admin_manual/pages/installation/letsencrypt/index.adoc b/modules/admin_manual/pages/installation/letsencrypt/index.adoc deleted file mode 100644 index c8aef69c1..000000000 --- a/modules/admin_manual/pages/installation/letsencrypt/index.adoc +++ /dev/null @@ -1,7 +0,0 @@ -:section-title: Let's Encrypt SSL Certificates -:section-preamble-ender: to configure ownCloud with Let's Encrypt - -include::partial$section_page.adoc[] - -* xref:installation/letsencrypt/using_letsencrypt.adoc[Using Let’s Encrypt SSL Certificates] -* xref:installation/letsencrypt/apache.adoc[Configure Apache with Let's Encrypt] \ No newline at end of file diff --git a/modules/admin_manual/pages/installation/letsencrypt/using_letsencrypt.adoc b/modules/admin_manual/pages/installation/letsencrypt/using_letsencrypt.adoc deleted file mode 100644 index 3e52ac935..000000000 --- a/modules/admin_manual/pages/installation/letsencrypt/using_letsencrypt.adoc +++ /dev/null @@ -1,383 +0,0 @@ -= Using Let’s Encrypt SSL Certificates -:toc: right -:toclevels: 1 -:letsencrypt-url: https://letsencrypt.org -:a-record-url: https://support.dnsimple.com/articles/a-record/ -:raymii-ssl-url: https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html -:certbot-url: https://certbot.eff.org -:certbot-docs-url: https://eff-certbot.readthedocs.io/en/stable/ -:ssl-labs-url: https://www.ssllabs.com/ssltest/ -:crontab-guru-url: https://crontab.guru -:snapcraft-url: https://snapcraft.io/docs/getting-started -:certbot-sudo-url: https://certbot.eff.org/glossary#sudo - -== Introduction - -This page covers how to configure your web server to use {letsencrypt-url}[Let’s Encrypt] as the certificate authority for your ownCloud server. Note that Let’s Encrypt is _not officially supported_, and this page is _community-maintained_. - -* For ease of handling, SSL-specific directives have been moved into a separate file to be included. This can help with first-time certificate issuance as well as with reusing configurations. -* Read the {certbot-docs-url}[Certbot user guide] for details of the commands. -* Let’s Encrypt CA issues short-lived certificates valid for 90 days. Make sure you renew the certificates at least once in this period, because expired certificates need reissuing. A certificate is due for renewal at the earliest 30 days before expiring. Certbot can be forced to renew via options at any time as long as the certificate is valid. - -TIP: Raymii.org provides raymii-ssl-url[an excellent introduction to strong SSL security measures with Apache], if you would like to know more. - -== Requirements & Dependencies - -You require a domain name with a valid {a-record-url}[A-Record] pointing back to your server's IP address. In case your server is behind a firewall, ensure that your server is accessible from the internet by adding the required firewall and port forwarding rules. - -== Install Let’s Encrypt’s Certbot Client - -NOTE: certbot has updated the prerequisites and the way to install the certbot script. You can find how to install it on {certbot-url}/instructions[certbot instructions]. Follow one of the possible ways and continue when ready. - -NOTE: If you have used `certbot-auto` before, read how to upgrade in the {certbot-docs-url}/install.html#certbot-auto[certbot-auto] section. - -In general, to run Certbot, use the following command: - -[source,bash] ----- -sudo certbot ----- - -== Updating Certbot - -Because certbot is using snap for Ubuntu, there is no need to manually check for updates. Snap checks this automatically and does not require admin intervention, although you can configure the update behavior. For details see the {snapcraft-url}[Snap getting started] documentation. - -== Register Your Email Address - -=== First Time Registration - -Now that Certbot is installed, register your email address for urgent renewal and security notifications. This command also prepares Certbot’s environment if it’s not already installed. To do this, run the following command: - -[source,bash] ----- -sudo certbot register --agree-tos --email ----- - -When it executes, you’ll see a question similar to the following, which you can answer "Yes" or "No": - -[source,plaintext] ----- -Saving debug log to /var/log/letsencrypt/letsencrypt.log - -------------------------------------------------------------------------------- -Would you be willing to share your email address with the Electronic Frontier -Foundation, a founding partner of the Let's Encrypt project and the non-profit -organization that develops Certbot? We'd like to send you email about EFF and -our work to encrypt the web, protect its users and defend digital rights. -------------------------------------------------------------------------------- -(Y)es/(N)o: ----- - -When that completes, you’ll see a message similar to the following: - -[source,plaintext] ----- -IMPORTANT NOTES: - 1. Your account credentials have been saved in your Certbot - configuration directory at /etc/letsencrypt. You should make a - secure backup of this folder now. This configuration directory will - also contain certificates and private keys obtained by Certbot so - making regular backups of this folder is ideal. ----- - -Please, *strongly*, consider following its recommendation. - -=== Update Your Registration - -In case you want to update your registered email address use following command: - -NOTE: This will affect all the certificates issued using this account. - -[source,bash] ----- -sudo certbot register --update-registration --email ----- - -When that completes, you’ll see a message similar to the following: - ----- -Saving debug log to /var/log/letsencrypt/letsencrypt.log - -------------------------------------------------------------------------------- -Would you be willing to share your email address with the Electronic Frontier -Foundation, a founding partner of the Let's Encrypt project and the non-profit -organization that develops Certbot? We'd like to send you email about EFF and -our work to encrypt the web, protect its users and defend digital rights. -------------------------------------------------------------------------------- -(Y)es/(N)o: y - -IMPORTANT NOTES: - - Your e-mail address was updated to ----- - -== Create Let’s Encrypt’s Config Files - -Because remembering all the possible options for certbot is difficult, the following scripts ease the use for common tasks because of their self-descriptive name. - -* Create the following files in the Let’s Encrypt directory which can usually be found in `/etc/letsencrypt`. Rename .sh with the name of the domain(s) you want to issue a certificate for. -+ -[source,bash] ----- -cd /etc/letsencrypt -sudo touch cli.ini list.sh renew.sh renew-cron.sh delete.sh .sh ----- - -* Make all files created executable _except_ `cli.ini` by running -+ -[source,bash] ----- -sudo chmod +x *.sh ----- - -* Use `sudo` when running the scripts (unless you are already logged in as the root user) -+ -[NOTE] -==== -All scripts have to be executed with `sudo` as certbot {certbot-sudo-url}[requires enhanced privileges]. -____ -If you're logged in to your server as a user other than root, you'll likely need to put sudo before your Certbot commands so that they run as root (for example, sudo certbot instead of just certbot) -____ -==== - -=== cli.ini - -This file defines some default settings used by Certbot. Use the email address you registered with. Comment or uncomment the post-hook parameter depending on if you want to run post hooks. Running post hooks will reload the web server configuration automatically if a certificate has been renewed. - -[source,ini] ----- -include::example$installation/lets_encrypt/cli.ini[] ----- - -[NOTE] -==== -For the following scripts, replace the path to Certbot and the Certbot script name based on your installation. You can find it by running: - -[source,plaintext] ----- -which certbot ----- -==== - -=== list.sh - -This script lists all your issued certificates. - -[source,bash] ----- -include::example$installation/lets_encrypt/list.sh[] ----- - -=== renew.sh - -This script: - -* Renews all your issued certificates. -* In case you have enabled the post hook for your web server in `cli.ini`, it will reload the web server configuration automatically if a certificate has been renewed. - -[source,bash] ----- -include::example$installation/lets_encrypt/renew.sh[] ----- - -=== renew-cron.sh - -This script: - -* Renews all your issued certificates but does not upgrade Certbot. -* In case you have enabled the post hook for your web server in `cli.ini`, it will reload the web server configuration automatically if a certificate has been renewed. - -NOTE: This script is intended for use via Cron. - -[source,bash] ----- -include::example$installation/lets_encrypt/renew-cron.sh[] ----- - -=== delete.sh - -This script deletes an issued certificate. + -Use the `list.sh` script to list issued certificates. - -[source,bash] ----- -include::example$installation/lets_encrypt/delete.sh[] ----- - -=== .sh - -The following example script creates a certificate for a domain or sub-domains, which can be added or removed as necessary. Replace (sub-domain.)example.com with your domain or sub-domain names. The first (sub)domain name in the script is used for naming the directories created by Certbot. - -[NOTE] -==== -You can create different certificates for different sub-domains, such as `example.com`, `www.example.com`, and `subdomain.example.com` by creating different scripts. -==== - -[source,bash] ----- -include::example$installation/lets_encrypt/your-domain-name.sh[] ----- - -NOTE: You can enable the `--dry-run` option which does a test run of the client only. - -== Create an SSL Certificate - -With all the scripts created, to create an SSL certificate, run the -following command: - -[source,bash] ----- -sudo /etc/letsencrypt/.sh ----- - -After you run the script, you will see output similar to the following: - ----- -Saving debug log to /var/log/letsencrypt/letsencrypt.log -Obtaining a new certificate -Performing the following challenges: -http-01 challenge for your-domain-name.com -Using the webroot path /var/www/html for all unmatched domains. -Waiting for verification... -Cleaning up challenges -Running post-hook command: service apache2 reload - -IMPORTANT NOTES: - 1. Congratulations! Your certificate and chain have been saved at: - /etc/letsencrypt/live/your-domain-name.com/fullchain.pem - Your key file has been saved at: - /etc/letsencrypt/live/your-domain-name.com/privkey.pem - Your cert will expire on 2018-06-18. To obtain a new or tweaked - version of this certificate in the future, simply run certbot - again. To non-interactively renew *all* of your certificates, run - "certbot renew" - 2. If you like Certbot, please consider supporting our work by: - - Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate - Donating to EFF: https://eff.org/donate-le ----- - -You can see that the SSL certificate has been successfully created and that it will expire on 2018-06-18. - -== Listing Existing Certificates - -If you want to list (view) existing SSL certificates, use `list.sh`, which can be run as follows: - -[source,bash] ----- -sudo /etc/letsencrypt/list.sh ----- - -Depending on the number of certificates, you can expect to see output similar to the following: - ----- -------------------------------------------------------------------------------- -Found the following certs: - Certificate Name: your-domain-name.com - Domains: your-domain-name.com - Expiry Date: 2018-06-18 10:57:18+00:00 (VALID: 82 days) - Certificate Path: /etc/letsencrypt/live/your-domain-name.com/fullchain.pem - Private Key Path: /etc/letsencrypt/live/your-domain-name.com/privkey.pem -------------------------------------------------------------------------------- ----- - -== Web Server Setup - -Refer to the xref:installation/letsencrypt/apache.adoc[Apache setup guide], to set up your web server and issue a certificate. - -== Test the Setup - -After you have setup and configured the web server and installed the SSL certificate using Certbot, you should now test the security of your new configuration. To do so, you can use the free service of {ssl-labs-url}[SSL Labs]. See an example screenshot of a test run below. - -image:installation/ssllabs.png[ssllabs] - -== Renewing SSL Certificates - -As Let’s Encrypt certificates expire every 90 days, ensure you renew them before that time. + -There are two ways to do so: -xref:manual-renewal[manually] and xref:automatic-renewal-via-crontab[automatically]. - -=== Manual Renewal - -If you have provided your email address, you will receive reminder notifications. - -[source,bash] ----- -sudo /etc/letsencrypt/renew.sh ----- - -If the certificate is not yet due for renewal, you can expect to see output similar to that below: - ----- -------------------------------------------------------------------------------- -Processing /etc/letsencrypt/renewal/your-domain-name.com.conf -------------------------------------------------------------------------------- -Cert not yet due for renewal - -The following certs are not due for renewal yet: - /etc/letsencrypt/live/your-domain-name.com/fullchain.pem (skipped) -No renewals were attempted. -No hooks were run. ----- - -=== Automatic Renewal via Crontab - -Certificates are only renewed if they are due, so you can schedule Cron -jobs to renew your SSL certificates on a more frequent basis. However, a -weekly check is sufficient. - -To add a new Cron job to auto-renew your certificates, firstly run the -following command to edit the job list. - -[source,bash] ----- -sudo crontab -e ----- - -IMPORTANT: It is essential to use `sudo` to derive proper permissions. - -Then, add the following at the end of the existing configuration: - ----- -30 03 * * 6 /etc/letsencrypt/renew-cron.sh ----- - -After you save and exit the file, the new job will have been added to the Cron job scheduler. - -NOTE: If you want to use different values, you can check them e.g. at {crontab-guru-url}[crontab.guru] and modify the script with your preferred options. - -== Add Extra Domains to the Certificate - -If you want to add an extra domain, like `subdomain.example.com`, to your certificate, add the domain in the domain shell script above, re-run it and reload the web server config. This can be useful when migrating from -a sub-directory for your ownCloud instance to sub-domain access. - -NOTE: This means you need to comment the `include` directive (see the relevant xref:web-server-setup[web server setup]) and follow the steps afterwards. - -== Deleting SSL Certificates - -If you want to delete an SSL certificate, use the delete.sh script, running it as follows: - -[source,bash] ----- -sudo /etc/letsencrypt/delete.sh ----- - -It will start off by displaying a list of the currently available SSL certificate domain names, as in the example below, and then prompt you to supply the certificate you want to delete. - ----- -Available Certificates: - -1. your-domain-name.com - -Which certificate do you want to delete: ----- - -Provide the SSL certificate name that you want to delete and click -btn:[enter], and the certificate and all of its related files will be deleted. -After that you should expect to see a confirmation, as in the example -output below. - ----- -------------------------------------------------------------------------------- -Deleted all files relating to certificate your-domain-name.com. -------------------------------------------------------------------------------- ----- diff --git a/modules/admin_manual/pages/installation/manual_installation/compile_samba.adoc b/modules/admin_manual/pages/installation/manual_installation/compile_samba.adoc deleted file mode 100644 index df857d7db..000000000 --- a/modules/admin_manual/pages/installation/manual_installation/compile_samba.adoc +++ /dev/null @@ -1,280 +0,0 @@ -= Compile Samba From Source -:toc: right -:toclevels: 2 -:samba_home_url: https://www.samba.org -:samba_req_pack_url: https://wiki.samba.org/index.php/Package_Dependencies_Required_to_Build_Samba -:samba_download_url: https://download.samba.org/pub/samba/stable/ -:samba_fromsource_url: https://wiki.samba.org/index.php/Build_Samba_from_Source -:samba_conf_options_url: https://vapour-apps.com/build-samba-4-9-from-source-on-debian-9-or-ubuntu-18-04/ -:bugzilla: https://bugzilla.samba.org - -== Introduction - -This guide helps you to compile a particular {samba_home_url}[Samba] version from source which -includes `smbclient`. This may be necessary if the provided version of your OS can not connect to -a file server, in particular to older non Microsoft file servers serving SMB only with NT1. - -NOTE: The guide has been tested, is at it is and comes without any warranty. - -== Prerequisites - -WARNING: It is highly recommended to stop your Web Server and if configured `php-fpm` services. - -=== Uninstalling `samba` - -If you have already installed `smbclient` provided by your OS and you installed the `smbclient` -extension from PECL (to support smbclient in PHP) you need to uninstall them first. Follow the -steps described below to do so. - -NOTE: Copy your smb.conf or other configurations files you may want to keep to reuse them later on. -Purging deletes the config files and helps to make a clean basis. - -[source,bash] ----- -sudo phpdismod smbclient -sudo pecl uninstall smbclient -sudo apt purge smbclient -sudo apt autoremove ----- - -=== Preparing the Installation Environment - -To compile Samba, you need to install necessary packages. Copy the {samba_req_pack_url}[Bootstrap Dependencies Script] from Samba for Ubuntu 20.04. You will find it in section _Verified Package Dependencies_. Post downloading, make the script executable and execute it, which will install all required packages for a successful samba compilation. For your convenience, you can directly download the -xref:attachment$/installation/manual_installation/bootstrap.sh[bootstrap samba master] shell script here. - -[source,bash] ----- -sudo ./bootstrap.sh ----- - -== Prepare Compiling Samba - -=== Download Your Copy of Samba - -The latest version of Samba, which had support for protocol `NT1` as client was version 4.10.18. In all -versions above, the client support was dropped and is not available anymore. If you need `NT1` support -as client, download this version. You can choose any version that fits your needs. A search on -{bugzilla}[bugzilla] may help finding a particular version that fixes the issue you are facing, which is not -provided by the OS delivered version. Keep the downloaded (and later configured) version at a location for -later reuse. This will be necessary if you would like to uninstall it properly. The example uses `/opt`. - -[source,bash] ----- -cd /opt -sudo wget https://download.samba.org/pub/samba/stable/samba-4.10.18.tar.gz ----- - -=== Extract Samba Sources - -[source,bash] ----- -sudo tar -xvf samba-4.10.18.tar.gz -cd samba-4.10.18 ----- - -== Compile Samba - -To compile Samba, you need three steps which are described in detail at -{samba_fromsource_url}[Build Samba from Source]. The complete process may take some time. - -. `sudo ./configure` -. `sudo make` -. `sudo make install` - -=== Configuring the Installation - -The settings for the configuration options are important, so that Samba will be located and setup -for Ubuntu properly. If you are planning to use Samba in your installation where your server -_will act_ as domain controller and not only as a client, you can safely remove `--without-ad-dc` -from the options below. Read more on details {samba_conf_options_url}[config options] for Ubuntu. -For your convenience, you can directly download a -xref:attachment$/installation/manual_installation/compile_samba.sh[compile samba] shell script here. - -[source,bash] ----- -sudo ./configure \ - --prefix=/usr \ - --enable-fhs \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --with-privatedir=/var/lib/samba/private \ - --with-smbpasswd-file=/etc/samba/smbpasswd \ - --with-piddir=/var/run/samba \ - --with-pammodulesdir=/lib/x86_64-linux-gnu/security \ - --libdir=/usr/lib/x86_64-linux-gnu \ - --with-modulesdir=/usr/lib/x86_64-linux-gnu/samba \ - --datadir=/usr/share \ - --with-lockdir=/var/run/samba \ - --with-statedir=/var/lib/samba \ - --with-cachedir=/var/cache/samba \ - --with-socketpath=/var/run/ctdb/ctdbd.socket \ - --with-logdir=/var/log/ctdb \ - --systemd-install-services \ - --without-ad-dc ----- - -=== Start the Compilation - -Start the compilation with following command. Even not mandatory, you can set options to run -multiple jobs in parallel by adding `-j `. This optimizes the CPU utilisation and reduces -the time needed. In the example below, four jobs are enabled to utilize the 4 available cores -of the CPU. - -[source,bash] ----- -sudo make -j 4 ----- - -=== Install the Compiled Software - -To install the compiled software run following command: - -[source,bash] ----- -sudo make install -j 4 ----- - -=== Create a Default `smb.conf` File - -If you do not have an existing or already configured `smb.conf` file, you can create a default one. -The following command creates a new `smb.conf` if it does not exist, but does not overwrite an existing one. - -[source,bash] ----- -sudo cp -n examples/smb.conf.default /etc/samba/smb.conf ----- - -=== Uninstall the Compiled Software - -Uninstalling can be necessary, if you want to have a clean base. This is useful if you want to compile a -different version or the version provided by the OS. To uninstall the compiled software run following command: - -[source,bash] ----- -sudo make uninstall -j 4 ----- - -== Testing - -=== Connection Test to Foreign Host - -When the installation has completed, test your result. If you have used a `smb.conf` file before, -copy it back to its original location (`/etc/samba/`). - -[source,bash] ----- -sudo smbclient --version -Version 4.10.18 ----- - -[source,bash] ----- -sudo smbclient -L -U / ----- - -You now should get a proper response with a directory listing. - -=== Connection Test as Standalone Fileserver - -If you want that this server acts as simple standalone smb fileserver, e.g. for testing, you need to -prepare and set some settings. Following tasks are necessary to start and stop smb as service via systemd. -The smbd service is necessary that your server can act as simple smb file server. - -First create a link to the smb service. - -[source,bash] ----- -sudo ln -s /lib/systemd/system/smb.service /etc/systemd/system/smbd.service ----- - -Then, change some startup parameters. These will not be overwritten on the source file, but be added -via a separate non-destructive process. - -[source,bash] ----- -sudo systemctl edit smbd.service ----- - -Add the following content and save the result. The location and naming will be done automatically. -Just say save. - -[source,plaintext] ----- -[Unit] -After= -After=network.target remote-fs.target nss-lookup.target - -[Service] -Type= -Type=forking -ExecStart= -ExecStart=/usr/sbin/smbd --configfile=/etc/samba/smb.conf ----- - -When finished, reload the daemon to recognize the update: - -[source,bash] ----- -sudo systemctl daemon-reload ----- - -Finally, you can start (stop, reload ect), the smbd service with: - -[source,bash] ----- -sudo service smbd start ----- - -When this is done and the service has started successfully, adopt your smb.conf according your needs as -stand-alone fileserver, test the content by invoking the command `testparm` on the command line and restart -the smbd service. You should then be able to connect to this standalone samba server. - -== Reinstalling Pecl smbclient - -If you had removed `pecl smbcient` before, you can reinstall it now with: - -[source,bash] ----- -sudo pecl channel-update pecl.php.net -sudo pecl install smbclient -sudo phpenmod smbclient ----- - -== Restart Services - -Restart your Web Server and/or `php-fpm` when everything is finished. - -== Scripting the Compiling Procedure - -If you want to automate the compiling procedure, you can perform the following steps. -Prepare a directory structure like in the example below where `opt/` and Samba version `samba-4.10.18` are used: - ----- -opt/ - bootstrap.sh - compile_samba.sh - install_samba.sh - samba-4.10.18 ----- - -Download the scripts: - -* xref:attachment$/installation/manual_installation/bootstrap.sh[bootstrap.sh] -* xref:attachment$/installation/manual_installation/compile_samba.sh[compile_samba.sh] -* xref:attachment$/installation/manual_installation/install_samba.sh[install_samba.sh] - -Make the scripts executable: - -[source,bash] ----- -sudo chmod +x ----- - -Change into the extracted samba directory you want to compile, e.g. `samba-4.10.18`, and run the following command: - -[source,bash] ----- -sudo ../install_samba.sh ----- - -Creating a default `smb.conf` file, testing, uninstalling etc. remain a manual task as described in the above sections. diff --git a/modules/admin_manual/pages/installation/manual_installation/manual_imagick7.adoc b/modules/admin_manual/pages/installation/manual_installation/manual_imagick7.adoc deleted file mode 100644 index 3f5251d90..000000000 --- a/modules/admin_manual/pages/installation/manual_installation/manual_imagick7.adoc +++ /dev/null @@ -1,312 +0,0 @@ -= Install an Updated ImageMagick Version -:toc: right -:imei-url: https://github.com/SoftCreatR/imei/ -:checkinstall-url: https://en.wikipedia.org/wiki/CheckInstall - -ImageMagick shipped for Ubuntu 20.04 is based on version 6, the corresponding `php-imagick` wrapper on version 3.4 which does not have additional capabilities to render particular image types like HEIC or SVG. To install the latest version with many additional image and video capabilities for use with PHP, you must first uninstall and remove the former version of ImageMagick-6 and the old php wrapper and install ImageMagick-7 and the new php-imagick wrapper version +3.5. - -== Backup the ImageMagick Configuration Files - -In case you have made any changes to the configuration files for ImageMagick-6, we recommend to back them up for easy transition to ImageMagick-7 with the following command: - -[source,bash] ----- -sudo cp -rp /etc/ImageMagick-6 /etc/ImageMagick-6.backup ----- - -NOTE: After installing ImageMagick-7 and if you do not define the configuration location, the default configuration files can be found at `/usr/local/etc/ImageMagick-7`. See also the output of the installation script used regarding the various directories set. Use the backup files as base to update them. - -== Remove the Old ImageMagick-6 Installation - -=== Remove php-imagick - -. Check if `php-imagick` is installed: -+ --- -[source,bash] ----- -dpkg -l | grep php | awk '{print $2}' | tr "\n" " " | grep php-imagick ----- - -You will see the name printed if it is installed. --- - -. Check if the `imagick.so` library is installed: -+ -[source,bash] ----- -ls `php -i | grep "^extension_dir" | sed -e 's/.*=> //'` | sort | grep imagick ----- - -. Check the installed `php-imagick` version: -+ --- -[source,bash] ----- -php --ri imagick | grep -i "module version" ----- - -If both the `php-imagick` library and the `imagick.so` binary is installed, proceed with the next steps. --- - -. Disable `php-imagick`: -+ -[source,bash] ----- -sudo phpdismod imagick ----- - -. Remove php-imagick: -+ -[source,bash] ----- -sudo apt remove php-imagick ----- - -. Depending on the installation, restart Apache or php-fpm: -+ -[source,bash] ----- -sudo service apache2 restart ----- -+ -or -+ -[source,bash] ----- -sudo service php7.4-fpm restart ----- - -=== Remove ImageMagick-6 - -. Check which ImageMagick version is installed. The version may differ from our example output. -+ -[source,bash] ----- -convert -version | grep -i version - -Version: ImageMagick 6.9.7-4 ----- - -. Remove the old `imagemagick-6` version: -+ -[source,bash] ----- -sudo apt remove imagemagick-6-common ----- - -== Install ImageMagick 7 - -=== Install the Latest ImageMagick-7 Binary - -To install ImageMagick-7, a script is used. Alternatively, you can copy&paste all installation commands step by step from {imei-url}[IMEI - ImageMagick Easy Install]. See the README description for more information on options and parameters. IMEI uses {checkinstall-url}[Checkinstall] for ease of removing/uninstalling ImageMagick 7 and its components. - -. Change to the /tmp directory: -+ -[source,bas] ----- -cd /tmp ----- -. Download and check the signature of the installation script which is done in four steps: -.. Download the IMEI script -.. Download signature file -.. Download public key -.. Verify the installer -// the following blank line is intended to put the block aligned to the parent item - -+ --- -Run this example to do all steps in one chained command: - -[source,bash] ----- -wget https://dist.1-2.dev/imei.sh && \ -wget https://dist.1-2.dev/imei.sh.sig && \ -wget https://dist.1-2.dev/imei.sh.pem && \ -openssl dgst -sha512 -verify imei.sh.pem -signature imei.sh.sig imei.sh ----- --- - -. If you get a `Verified OK` message, make the script executable: -+ -[source,bash] ----- -sudo chmod +x imei.sh ----- -. Install the latest ImageMagick-7 release: -+ --- -NOTE: For Ubuntu, ImageMagick uses `/etc` as base for the config directory, see the backup information above. This installation example uses the same base set by an option. Change it according your needs. - -NOTE: Depending on your environment, this may take a while (+25min). - -[source,bash] ----- -sudo ./imei.sh --config-dir "/etc" ----- --- - -. Check if ImageMagic-7 and its libraries have been properly installed -+ -[source,bash] ----- -dpkg -l | grep imei ----- - -. Remove the downloaded script and verification files: -+ -[source,bash] ----- -rm imei.* ----- - -=== Check the Installed ImageMagick-7 Version - -Check the version installed. The version printed may be different than in the example output. - -[source,bash] ----- -convert -version | grep -i version ----- -[source,plaintext] ----- -Version: ImageMagick 7.1.0-2 ... ----- - -=== Get a List of Supported Formats - -Type the following commands to get a list of supported formats: - -[source,bash] ----- -convert identify -list format ----- - -[source,plaintext] ----- - Format Module Mode Description ----------------------------------------------------- - 3FR DNG r-- Hasselblad CFV/H3D39II - 3G2 VIDEO r-- Media Container - 3GP VIDEO r-- Media Container - AAI* AAI rw+ AAI Dune image -... ----- - -=== Reuse Changed Configuration Settings - -If you have changed configuration settings, you can reuse them for ImageMagick 7. Copy either the changed contend of the files in question or the complete files from `/etc/ImageMagick-6.backup` to `/etc/ImageMagick-7`. You may want to keep a backup of the original configuration files. - -=== Secure ImageMagick - -[IMPORTANT] -==== -Make sure to disable ImageMagick's scripting language in + -`/etc/ImageMagick-7/policy.xml` + -by adding or uncommenting this policy: -[source,plaintext] ----- - ----- - -See https://imagetragick.com[ImageTragick] for more information and context. -==== - -=== Install the New ImageMagick PHP Wrapper - -The new `php-imagick` wrapper is installed via PECL and uses the recently installed ImageMagick-7 version as base. - -NOTE: If you have installed the php-wrapper via PECL before and want to reinstall it, you will get a warning that it is already installed. You must remove it first with `sudo pecl uninstall imagick`. - -. Install `php-imagick` -+ --- -The `printf` command auto-accepts the question for using defaults. - -[source,bash] ----- -sudo pecl channel-update pecl.php.net -printf "\n" | sudo pecl install imagick ----- --- - -. Check if file `imagick.ini` is present in `mods-available`. -+ --- -Use your php version in the path of the example command below: - -[source,bash] ----- -ll /etc/php/7.4/mods-available/imagick.ini ----- -If the file is not present, create one: - -[source,bash] ----- -sudo nano /etc/php/7.4/mods-available/imagick.ini ----- - -with following content: - -[source,plaintext] ----- -; configuration for php imagick module -extension=imagick.so ----- --- - -== Enable the php-imagick wrapper - -. After ImageMagick-7 and the php wrapper have been installed, enable the php wrapper: -+ -[source,bash] ----- -sudo phpenmod imagick ----- - -. Depending on the installation, restart Apache or php-fpm: -+ -[source,bash] ----- -sudo service apache2 restart -or -sudo service php7.4-fpm restart ----- - -. Print supported `php-imagick` formats: -+ -[source,bash] ----- -php -r 'phpinfo();' | grep -i "ImageMagick supported formats" ----- - -== TIPS - -=== Reinstall or upgrade ImageMagick-7 and the php wrapper. - -To reinstall or upgrade ImageMagick-7, follow the principle steps described above by disabling and removing the php wrapper first, rerun the imei.sh installation script with the options of choice. The script checks if components need an upgrade and, if that's the case, installs them. Then reinstall the php wrapper, enable it and restart your web server or php-fpm. - -=== Uninstall ImageMagic-7 or components - -If you want to uninstall ImageMagick-7 only, run: - -[source,bash] ----- -sudo apt remove imei-imagemagick ----- - -If you want to completely remove ImageMagic-7 and all of its installed components, run: - -[source,bash] ----- -sudo apt remove imei-imagemagick,imei-libaom,imei-libheif,imei-libjxl ----- - -=== Change Configuration Settings of ImageMagick-7 - -You can change configuration settings of ImageMagick-7 at any time according to your needs. In case you do so, restart your web server of the php-fpm service post changing the settings so they can take effect for web services. - - -=== Previews Configuration Rules - -If you need to configure or enable previews for formats not enabled by default, see xref:configuration/files/previews_configuration.adoc#notes-for-pdf-preview-generation[Notes for PDF Preview Generation] which can serve as a template. diff --git a/modules/admin_manual/pages/installation/manual_installation/manual_installation.adoc b/modules/admin_manual/pages/installation/manual_installation/manual_installation.adoc deleted file mode 100644 index 5012995d1..000000000 --- a/modules/admin_manual/pages/installation/manual_installation/manual_installation.adoc +++ /dev/null @@ -1,228 +0,0 @@ -= Detailed Installation Guide -:toc: right -:mod_headers-url: https://httpd.apache.org/docs/current/mod/mod_headers.html#page-header -:download_oc_url: https://owncloud.com/download-server/ -:page-aliases: installation/source_installation.adoc - -== Introduction - -This document describes: - -* How to prepare your server -* Prerequisites and how to download ownCloud -* Installation of ownCloud - -The following descriptions focus on the Ubuntu distribution. Even if we try to make these steps -as easy as possible by offering ready to use commands and scripts, you need to have sufficient -knowledge about administrating a server environment which provides web services. - -IMPORTANT: This document does not offer proposals about how to secure your server. Therefore, we strongly recommend checking out the xref:configuration/server/harden_server.adoc[Hardening and Security Guidance] before the installation and to keep it on hand throughout. - -== Prepare Your Server - -For more information on the requirements of your server, read the -xref:installation/manual_installation/manual_installation_prerequisites.adoc[general prerequisites guide]. -The following sections describe the procedures in detail. - -=== Ubuntu 20.04 LTS Server - -To prepare your Ubuntu 20.04 server for the use with ownCloud, follow the -xref:installation/manual_installation/server_prep_ubuntu_20.04.adoc[Ubuntu 20.04 preparation guide]. -This guide installs PHP 7.4 - -=== Ubuntu 22.04 LTS Server - -To prepare your Ubuntu 22.04 server for the use with ownCloud, follow the -xref:installation/manual_installation/server_prep_ubuntu_22.04.adoc[Ubuntu 22.04 preparation guide]. - -NOTE: Ubuntu 22.04 only provides PHP 8.x which is currently not supported by ownCloud. Therefore PHP 7.4 is installed via PPA. - -=== Install a Database - -If you do not already have a supported database installed, follow the -xref:installation/manual_installation/manual_installation_db.adoc[Manual Database Installation guide]. - -=== Configure the Web Server - -To configure your Apache web server for use with ownCloud, follow the -xref:installation/manual_installation/manual_installation_apache.adoc[Apache preparation guide]. - -== Installation of ownCloud Binaries - -To install ownCloud binaries, you have to download the required package. After doing so, -you can perform the following steps manually or use the provided scripts. These scripts are convenient -since they can also be used for upgrading which eases the process a lot. - -=== Download ownCloud - -Before downloading ownCloud, change to a directory where you want to save -the file temporarily. This can be, for example `/tmp`. In further examples, we use tar archives or the complete ownCloud bundle. The name for the complete archive looks like this: -`owncloud-complete-yyyymmdd.archive_type`. - -Download the archive of the latest ownCloud version: - -. Go to the {download_oc_url}[ownCloud Download Page] and select the package that fits your needs. - You can download either the `.tar.bz2` or `.zip` archive. Based on the example below, copy the - link of the selected file and run the following command to download it: + -+ -[source,bash,subs="attributes+"] ----- -wget {oc-complete-base-url}/{oc-complete-name}.tar.bz2 ----- - -. Download the corresponding checksum file like: -+ -[source,bash,subs="attributes+"] ----- -wget {oc-complete-base-url}/{oc-complete-name}.tar.bz2.md5 - or -wget {oc-complete-base-url}/{oc-complete-name}.tar.bz2.sha256 ----- - -. Verify the MD5 or SHA256 sum: -+ -[source,bash,subs="attributes+"] ----- -sudo md5sum -c {oc-complete-name}.tar.bz2.md5 < {oc-complete-name}.tar.bz2 - or -sudo sha256sum -c {oc-complete-name}tar.bz2.sha256 < {oc-complete-name}.tar.bz2 ----- - -. You can also verify the PGP signature: -+ -[source,bash,subs="attributes+"] ----- -wget {oc-complete-base-url}/{oc-complete-name}.tar.bz2.asc - -gpg --verify {oc-complete-name}.tar.bz2.asc {oc-complete-name}.tar.bz2 ----- - -=== Script-Guided Installation - -Use the xref:installation/manual_installation/script_guided_install.adoc[Script-Guided Installation] -if you want to easily **install** or **upgrade** ownCloud or **manage ownership and permissions**. The page -contains detailed instructions about downloading and usage. - -TIP: Using the _Script Guided Installation_, you can handle many useful installation and update -options automatically. - -=== Command Line Installation - -Use the following commands if you want to do the basic setup without any changes and physical installation options. -Consider using the xref:installation/manual_installation/script_guided_install.adoc[Script-Guided Installation] -if you plan to improve your setup from step one. - -* Extract the archive contents and run the unpacking command for your tar archive: -+ -[source,bash,subs="attributes+"] ----- -tar -xjf {oc-complete-name}.tar.bz2 ----- - -* tar unpacks to a single `owncloud` directory. - Copy the ownCloud directory to its final destination. - If you are running the Apache HTTP server, you may safely install ownCloud in your Apache document root. - Assuming your document root is in `/var/www`. -+ -[source,bash] ----- -cp -r owncloud /var/www ----- - -After the installation, set the correct ownership and permissions according to the needs of your environment. While you can do that manually, we suggest using the scripts from the -xref:installation/manual_installation/script_guided_install.adoc[Script-Guided Installation] which ease the process a lot. - -== Complete the Installation - -After restarting Apache, you must complete your installation by running either the -Graphical Installation Wizard or on the command line with the `occ` command. - -After finalizing the installation, re-run the script provided in -xref:installation/manual_installation/script_guided_install.adoc[Script-Guided Installation] -to secure your `.htaccess` files. Your ownCloud instance is now ready to use. - -=== Finalize Using the Graphical Installation Wizard - -To finalize the installation using the graphical installation wizard, refer to the -xref:installation/installation_wizard.adoc[Graphical Installation Wizard]. - -=== Finalize Using the Command Line - -If you want to finalize the installation via the command line, use the following example -command. The command assumes that you have unpacked the source to `/var/www/owncloud/`. -Replace all the parameters according to your needs. - -[source,bash,subs="attributes+"] ----- -cd /var/www/owncloud/ -{occ-command-example-prefix-docker} maintenance:install \ - --database "mysql" \ - --database-name "owncloud" \ - --database-user "root"\ - --database-pass "password" \ - --admin-user "admin" \ - --admin-pass "password" ----- - -On how to use `occ`, refer to the xref:configuration/server/occ_command.adoc[occ command reference]. + - -NOTE: Admins of SELinux-enabled distributions may need to write new SELinux rules to complete -their ownCloud installation; see the -xref:installation/selinux_configuration.adoc[SELinux Configuration Guide] -for a suggested configuration. - -== Post Installation Configuration - -After installing ownCloud successfully, ownCloud recommends that you perform some post -installation tasks. These tasks help configure background jobs or improve performance -by caching. - -NOTE: At this point, we'd also like to remind you to consult the xref:configuration/server/harden_server.adoc[Hardening and Security Guidance] section. - -=== Background Jobs - -To read more about background jobs and how to configure them, read the -xref:configuration/server/background_jobs_configuration.adoc[Background Job Configuration] guide. - -=== Configure Caching - -It is recommended to install and enable caching (PHP opcode cache and/or data cache), which -significantly improves performance. For more information, read the -xref:configuration/server/caching_configuration.adoc[Caching Configuration] guide. - -== Notes - -=== Headers - -NOTE: ownCloud has a mechanism to set headers programmatically. -These headers are set with the `always` directive to avoid errors when there are additional -headers set in the web server's configuration file like `http.conf`. -More information on headers can be found in the {mod_headers-url}[`mod_headers`] documentation. - -=== Managing Trusted Domains - -All URLs used to access your ownCloud server must be white-listed in your `config.php` file -under the `trusted_domains` setting. Users are allowed to log in to ownCloud only when they -point their browsers to a URL that is listed in the `trusted_domains` setting. - -NOTE: This setting is important when changing or moving to a new domain name. -You may use IP addresses and domain names. - -A typical configuration may look like this: - -[source,php] ----- -'trusted_domains' => [ - 0 => 'localhost', - 1 => 'server1.example.com', - 2 => '192.168.1.50', -], ----- - -The loopback address, `127.0.0.1`, is automatically white-listed, so as long as you have access to the physical server you can always log in. -In the event that a load-balancer is in place, there will be no issues as long as it sends the correct `X-Forwarded-Host` header. - -NOTE: For further information on improving the quality of your ownCloud installation, see xref:installation/configuration_notes_and_tips.adoc[the configuration notes and tips guide]. - -NOTE: Admins of SELinux-enabled distributions such as _CentOS_, _Fedora_, and _Red Hat Enterprise Linux_ may need to set new rules to enable installing ownCloud. -See xref:installation/selinux_configuration.adoc[SELinux Configuration Guide] for a suggested configuration. diff --git a/modules/admin_manual/pages/installation/manual_installation/manual_installation_apache.adoc b/modules/admin_manual/pages/installation/manual_installation/manual_installation_apache.adoc deleted file mode 100644 index 41e6e6153..000000000 --- a/modules/admin_manual/pages/installation/manual_installation/manual_installation_apache.adoc +++ /dev/null @@ -1,141 +0,0 @@ -= Configure Apache for Manual Installation on Linux -:toc: right -:toclevels: 3 -:mod_headers_url: http://httpd.apache.org/docs/current/mod/mod_headers.html -:mod_unique_id_url: http://httpd.apache.org/docs/current/mod/mod_unique_id.html -:prefork_url: https://httpd.apache.org/docs/2.4/mod/prefork.html -:apache_doc_url: https://httpd.apache.org/docs/current/en/ - -== Introduction - -This document describes the basic configuration of your Apache webserver for the use with -ownCloud. It assumes that you already have successfully installed the Apache Webserver. -Please read the {apache_doc_url}[Apache Documentation] for more or enhanced configuration options. - -== Configure Apache - -On Debian, Ubuntu, and their derivatives, Apache installs with a useful configuration. -All you have to do is create an `/etc/apache2/sites-available/owncloud.conf` file with these lines in it, -replacing the *Directory* and other file paths with your own file paths: - -[source,apache] ----- -Alias /owncloud "/var/www/owncloud/" - - - Options +FollowSymlinks - AllowOverride All - - - Dav off - - ----- - -Then create a symlink to /etc/apache2/sites-enabled: - ----- -sudo ln -s /etc/apache2/sites-available/owncloud.conf /etc/apache2/sites-enabled/owncloud.conf ----- - -== Additional Apache Configurations - -* For ownCloud to work correctly, you need the module `mod_rewrite`. Enable it by running: `a2enmod rewrite`. Additionally recommended modules are `mod_headers`, `mod_env`, `mod_dir`, `mod_mime`, and `mod_unique_id`. To enable them, run the following commands: -+ -[source,bash] ----- -sudo a2enmod headers -sudo a2enmod env -sudo a2enmod dir -sudo a2enmod mime -sudo a2enmod unique_id ----- -+ -NOTE: If you want to use the {oc-marketplace-url}/apps/oauth2[OAuth2 app], then {mod_headers_url}[mod_headers] must be installed and enabled. - -* You must disable any server-configured authentication for ownCloud since it uses basic authentication internally for DAV services. If you have turned on authentication on a parent folder (e.g. via an `AuthType Basic` directive), you can disable the authentication specifically for the ownCloud entry. As in the above example configuration file, add the following line in the `Directory` section: -+ -[source,apache] ----- -Satisfy Any ----- - -* When using SSL, take special note of the `ServerName`. You should specify one in the server configuration as well as in the `CommonName` field of the certificate. If you want your ownCloud to be reachable via the internet, set both of these to the domain for your ownCloud server. - -* Now restart Apache -+ -[source,bash] ----- -sudo service apache2 restart ----- - -* If you’re running ownCloud in a sub-directory and want to use CalDAV or CardDAV clients, make sure you have configured the correct -xref:configuration/general_topics/general_troubleshooting.adoc#service-discovery[Service Discovery] URLs. - -=== Apache Mod_Unique_Id Configuration - -The use of `mod_unique_id` enables an administrator to trace requests via logfiles. - -NOTE: {mod_unique_id_url}[mod_unique_id] provides a magic token for each request which is guaranteed to be unique across "all" requests under very specific conditions. - -If you enable the module, there is nothing else you have to do as ownCloud automatically includes the `UNIQUE_ID` environment variable, provided by the module, in ownCloud's log file. - -To confirm that it's working, check that the `UNIQUE_ID` environment variable is being set by running `phpinfo()` (like in the screenshot below). - -image:installation/webservers/apache/mod_unique_id/phpinfo.png[phpinfo() showing that Apache -is sending the UNIQUE_ID value from mod_unique_id] - -Next, compare the value set for `UNIQUE_ID` in the output of `phpinfo()` with the value in ownCloud's log file to ensure that they're the same. In the example below, you can see an example log entry, where ownCloud is logging the unique id provided by Apache as the value for the first key `reqId` in the record. - -[source,json] ----- -include::example$installation/webservers/apache/log-entry.json[] ----- - -=== Using SSL - -You can use ownCloud over plain HTTP, but we strongly encourage you to use SSL/TLS to encrypt all of your server traffic and to protect users’ logins and data in transit. - -==== Use a Professional Certificate - -You can install any purchased or free certificate like the ones via Let's Encrypt. - -Read -xref:installation/letsencrypt/index.adoc[Using Let's Encrypt SSL Certificates] -if you want to use free of charge certificates for Apache. - -==== Use the Default Simple Self-Signed Certificate - -Apache installed on an Ubuntu system comes already set up with a simple self-signed certificate. - -NOTE: Self-signed certificates have their drawbacks - especially when you plan to make your ownCloud server publicly accessible. You may want to consider getting a certificate signed by a commercial signing authority or a free certificate like the ones from Let's Encrypt. - -Using the simple self-signed certificate provided by the Apache installation, all you have to do is to enable the `ssl` module and the default site. Open a terminal and run: - -[source,bash] ----- -sudo a2enmod ssl -sudo a2ensite default-ssl -sudo service apache2 reload ----- - -=== Multi-Processing Module (MPM) - -{prefork_url}[Apache prefork] has to be used. Don’t use a threaded `MPM` like `event` or -`worker` with `mod_php`, because PHP is currently {php-net-url}/manual/en/install.unix.apache2.php[not thread safe]. - -If you want to use a threaded MPM, look at a FastCGI configuration where PHP is running -in its own memory space. ownCloud limits its support to Apache prefork only. - -[NOTE] -==== -In case you have enabled `mpm_event` during an earlier setup of Apache, you may get conflict notes from Apache. Use the following commands to solve this issue. The order of commands is recommended to ensure a smooth transition. - -[source,bash] ----- -sudo a2dismod mpm_event -sudo systemctl restart apache2 -sudo a2enmod mpm_prefork -sudo systemctl restart apache2 ----- -==== diff --git a/modules/admin_manual/pages/installation/manual_installation/manual_installation_db.adoc b/modules/admin_manual/pages/installation/manual_installation/manual_installation_db.adoc deleted file mode 100644 index cb65c0346..000000000 --- a/modules/admin_manual/pages/installation/manual_installation/manual_installation_db.adoc +++ /dev/null @@ -1,72 +0,0 @@ -= Manual Installation Databases -:toc: right -:page-partial: - -== Introduction - -This document gives you an overview of databases supported by ownCloud. It describes some basic installation steps and how to create an administrative user for the database. This administrative user is necessary so that the ownCloud database and user who further manages the ownCloud database can be created The ownCloud database user has no access -to other databases! - -== Possible Databases - -When installing ownCloud Server & ownCloud Enterprise editions, the administrator may choose one of four supported database products. These are: - -* SQLite -* MYSQL/MariaDB (recommended) -* PostgreSQL -* Oracle 11g (Enterprise-edition only) - -IMPORTANT: After selecting and installing a database as described below, read the xref:configuration/database/linux_database_configuration.adoc[Database Configuration on Linux] -documentation for more information regarding database engine configuration. - -== SQLite - -NOTE: SQLite is not supported by the ownCloud Enterprise edition. - -IMPORTANT: SQLite should **only** be used for testing and lightweight single user setups. - -SQLite has no client synchronization support, so other devices will not be able to synchronize with the data stored in an ownCloud SQLite database. - -== MYSQL/MariaDB - -MariaDB is the ownCloud recommended database. It may be used with either ownCloud Server or ownCloud Enterprise editions. Please look for additional configuration parameters in the xref:configuration/database/linux_database_configuration.adoc[Database Configuration on Linux] guides. - -Once the database installation is complete, refer to the Database section in the xref:configuration/server/harden_server.adoc#database[Hardening and Security Guidance] guide for additional important information. - -include::partial$installation/manual_installation/mariadb.adoc[leveloffset=+1] - -== PostgreSQL - -To install postgres, use the following command (or that of your preferred package manager): - -[source,bash] ----- -sudo apt-get install postgresql php-pgsql ----- - -In order to allow ownCloud access to the database, create an `ownlcoud` user who owns the `owncloud` database. The user and the database name can be any name that fits your needs. - -Create the `owncloud` PostgreSQL user account. Note that the default admin account post installing PostgreSQL is `postgres`. If you have created another postgres admin user and disabled the default one, use the new one instead. -[source,bash] ----- -sudo -u postgres -c "createuser -e -P owncloud" ----- - -Define a password for the `owncloud` user. Note to remember this password to access the database later on: -[source,plaintext] ----- -Enter new password: -Enter it again: ----- - -Create the `owncloud` database owned by the `owncloud` user: -[source,bash] ----- -sudo -u postgres -c "createdb -e -O owncloud owncloud" ----- - -== Oracle 11g - -Oracle 11g is **only** supported for the ownCloud Enterprise edition. Please see the -xref:enterprise/installation/oracle_db_configuration.adoc[Oracle Database Setup & Configuration] -in the Enterprise documentation section. diff --git a/modules/admin_manual/pages/installation/manual_installation/manual_installation_prerequisites.adoc b/modules/admin_manual/pages/installation/manual_installation/manual_installation_prerequisites.adoc deleted file mode 100644 index 08acf35d3..000000000 --- a/modules/admin_manual/pages/installation/manual_installation/manual_installation_prerequisites.adoc +++ /dev/null @@ -1,303 +0,0 @@ -= Prerequisites for Manual Installation on Linux -:toc: right -:description: This document guides you through the prerequisites for a manual ownCloud Server installation on Linux. - -:avconv-url: https://libav.org/ -:ffmpeg-url: https://ffmpeg.org/ -:openoffice-url: https://www.openoffice.org/ -:libreoffice-url: https://www.libreoffice.org/ -:pecl-package-url: https://pecl.php.net/package -:sabre-url: http://sabre.io/ -:gnu-make-url: https://www.gnu.org/software/make/ - -== Introduction - -{description} - -The ownCloud tar archive contains all of the required third-party PHP libraries. As a result, no extra ones are strictly necessary. However, ownCloud does require that PHP has a set of extensions installed, enabled and configured. - -This section lists both the required and optional PHP extensions. If you need further information about a particular extension, please consult the relevant section of the {php-net-url}/manual/en/extensions.php[extensions section of the PHP manual]. - -If you are using a Linux distribution, it should have packages for all the required extensions. You can check the presence of a module by typing `php -m | grep -i `. If you get a result, the module is present. - -== Required Prerequisites - -=== openSSL Version - -ownCloud requires that you have openSSL version 1.1.x installed. With the release change of openSSL v1.x to openSSL version 3.x in December 2021, some ciphers which were valid in version 1.x, have been retired with immediate effect. This impacts the ownCloud xref:configuration/files/encryption/encryption_configuration.adoc[encryption app]. - -[IMPORTANT] -==== -If you plan to: - -* upgrade the openSSL version of your server to v3 **or** -* install or upgrade your server where the server upgrade delivers the new openSSL v3 version **and** -* you have enabled and use encryption - -your encryption environment will break due to openSSL v3 retired (legacy) ciphers. As a result, encrypted files cant be accessed. As a _temporary solution_, you have to manually reenable in the openSSL v3 config the legacy ciphers. To do so, see the example in the https://wiki.openssl.org/index.php/OpenSSL_3.0#Providers[OpenSSL 3.0 Wiki,window=_blank] at section **6.2 Providers**. -==== - -How to implement the fix for the above mentioned issue: - -. Find the openssl config directory with -+ --- -[source,bash] ----- -openssl version -d ----- - -Output example: - -`OPENSSLDIR: "/usr/lib/ssl"` --- - -. Go in to that directory and open the config file `openssl.cnf` -+ --- -Look for: - -[source,plaintext] ----- -[openssl_init] -providers = provider_sect ----- - -and add this line below - -`legacy = legacy_sect` - -then look for - -[source,plaintext] ----- -[default_sect] -# activate = 1 ----- - -remove the "#" before "activate" and add the following lines below: - -[source,plaintext] ----- -[legacy_sect] -activate = 1 ----- --- - -. The file should now look like this: -+ -[source,plaintext] ----- -openssl_conf = openssl_init - -[openssl_init] -providers = provider_sect - -[provider_sect] -default = default_sect -legacy = legacy_sect - -[default_sect] -activate = 1 - -[legacy_sect] -activate = 1 ----- - -. Save the file and you have enabled OpenSSL legacy support. - -=== PHP Version - -ownCloud can run with following PHP versions: {supported-php-versions} - -[IMPORTANT] -==== -PHP 7.4 *must* be used for all installations. Sites currently using a different PHP version *must* migrate to PHP 7.4. -==== - -[IMPORTANT] -==== -Note that PHP 8.x is currently not supported. -==== - -==== PHP Extensions - -[width="100%",cols="28%,72%",options="header",] -|==== -| Name -| Description - -| {php-net-url}/manual/en/book.ctype.php[Ctype] -| For character type checking - -| {php-net-url}/manual/en/book.curl.php[cURL] -| Used for aspects of HTTP user authentication - -| {php-net-url}/manual/en/book.dom.php[DOM] -| For operating on XML documents through the DOM API - -| {php-net-url}/manual/en/book.image.php[GD] -| For creating and manipulating image files in a variety of different image formats, including GIF, PNG, JPEG, WBMP, and XPM - -| {php-net-url}/manual/en/function.hash.php[HASH Message] {php-net-url}/manual/en/function.hash.php[Digest Framework] -| For working with message digests (hash) - -| {php-net-url}/manual/en/book.iconv.php[iconv] -| For working with the iconv character set conversion facility - -| {php-net-url}/manual/en/book.intl.php[intl] -| Increases language translation performance and fixes sorting of non-ASCII characters - -| {php-net-url}/manual/en/book.json.php[JSON] -| For working with the JSON data-interchange format - -| {php-net-url}/manual/en/book.libxml.php[libxml] -| This is required for the -{php-net-url}/manual/en/book.dom.php[DOM], -{php-net-url}/manual/en/book.libxml.php[libxml], -{php-net-url}/manual/en/book.simplexml.php[SimpleXML], and -{php-net-url}/manual/en/book.xmlwriter.php[XMLWriter] extensions to work. -It requires that libxml2, version 2.7.0 or higher, is installed - -| {php-net-url}/manual/en/book.mbstring.php[Multibyte String] -| For working with multibyte character encoding schemes - -| {php-net-url}/manual/en/book.openssl.php[OpenSSL] -| For symmetric and asymmetric encryption and decryption, PBKDF2, PKCS7, PKCS12, X509 and other crypto operations - -| {php-net-url}/manual/en/book.pdo.php[PDO] -| This is required for the pdo_msql function to work - -| {php-net-url}/manual/en/book.phar.php[Phar] -| For working with PHP Archives (.phar files) - -| {php-net-url}/manual/en/book.posix.php[POSIX] -| For working with UNIX POSIX functionality - -| {php-net-url}/manual/en/book.simplexml.php[SimpleXML] -| For working with XML files as objects - -| {php-net-url}/manual/en/book.xmlwriter.php[XMLWriter] -| For generating streams or files of XML data - -| {php-net-url}/manual/en/book.zip.php[Zip] -| For reading and writing ZIP compressed archives and the files inside them. - -| {php-net-url}/manual/en/book.zlib.php[Zlib] -| For reading and writing gzip (.gz) compressed files -|==== - -NOTE: The _Phar_, _OpenSSL_, and _cUrl_ extensions are mandatory if you want to use {gnu-make-url}[Make] xref:developer_manual:general/devenv.adoc[to setup your ownCloud environment], prior to running either the web installation wizard, or the command line installer. - -==== Database Extensions - -[cols=",",options="header",] -|==== -| Name -| Description - -| {php-net-url}/manual/en/set.mysqlinfo.php[mysql] -| For working with MySQL & MariaDB - -| {php-net-url}/manual/en/book.pgsql.php[pgsql] -| For working with PostgreSQL. It requires PostgreSQL 9.0 or above - -| {php-net-url}/manual/en/book.sqlite3.php[sqlite] -| For working with SQLite. It requires SQLite 3 or above. This is, usually, not recommended for performance reasons -|==== - -=== Required For Specific Apps - -[cols=",",options="header",] -|==== -| Name -| Description - -| {php-net-url}/manual/en/book.ftp.php[ftp] -| For working with FTP storage - -| {php-net-url}/manual/de/book.ssh2.php[sftp] -| For working with SFTP storage - -| {php-net-url}/manual/en/book.imap.php[imap] -| For IMAP integration - -| {php-net-url}/manual/en/book.ldap.php[ldap] -| For LDAP integration - -| {pecl-package-url}/smbclient[smbclient] -| For SMB/CIFS integration -|==== - -NOTE: SMB/Windows Network Drive mounts require the PHP module smbclient version 0.8.0+. See xref:configuration/files/external_storage/smb.adoc[SMB/CIFS]. - -=== Optional - -[cols=",",options="header",] -|==== -| Extension -| Reason - -| {php-net-url}/manual/en/book.bzip2.php[Bzip2] -| Required for extraction of applications - -| {php-net-url}/manual/en/book.fileinfo.php[Fileinfo] -| Highly recommended, as it enhances file analysis performance - -| {php-net-url}/manual/en/book.mcrypt.php[Mcrypt] -| Increases file encryption performance - -| {php-net-url}/manual/en/book.openssl.php[OpenSSL] -| Required for accessing HTTPS resources - -| {php-net-url}/manual/en/book.imagick.php[imagick] -| Required for creating and modifying images and preview thumbnails -|==== - -== Recommended Prerequisites - -=== For Specific Apps - -[cols=",",options="header",] -|==== -| Extension -| Reason - -| {php-net-url}/manual/en/book.exif.php[Exif] -| For image rotation in the pictures app - -| {php-net-url}/manual/en/book.gmp.php[GMP] -| For working with arbitrary-length integers -|==== - -==== For Server Performance - -For enhanced server performance consider installing one of the following cache extensions: - -* {php-net-url}/manual/en/book.apcu.php[apcu] -* {php-net-url}/manual/en/book.memcached.php[memcached] -* {pecl-package-url}/redis[redis] (>= 2.2.6+, required for transactional file locking) - -See xref:configuration/server/caching_configuration.adoc[Caching Configuration] to learn how to select and configure Memcache. - -==== For Preview Generation - -* {avconv-url}[avconv] or {ffmpeg-url}[ffmpeg] -* {openoffice-url}[OpenOffice] or {libreoffice-url}[LibreOffice] - -==== For Command Line Processing - -[cols=",",options="header",] -|==== -| Extension -| Reason - -| {php-net-url}/manual/en/book.pcntl.php[PCNTL] -| Enables command interruption by pressing `ctrl-c` -|==== - -NOTE: You don’t need the WebDAV module for your Web server (i.e., Apache’s `mod_webdav`), as ownCloud has a built-in WebDAV server of its own, {sabre-url}[SabreDAV]. If `mod_webdav` is enabled, you must disable it for ownCloud. See the xref:installation/manual_installation/manual_installation_apache.adoc[Apache preparation guide] for more details. - -=== For MySQL/MariaDB - -The InnoDB storage engine is required, and MyISAM is not supported, see xref:configuration/database/linux_database_configuration.adoc#mysql-mariadb[MySQL / MariaDB storage engine] for more information. diff --git a/modules/admin_manual/pages/installation/manual_installation/script_guided_install.adoc b/modules/admin_manual/pages/installation/manual_installation/script_guided_install.adoc deleted file mode 100644 index faa5a8442..000000000 --- a/modules/admin_manual/pages/installation/manual_installation/script_guided_install.adoc +++ /dev/null @@ -1,236 +0,0 @@ -= Scripts for the Script-Guided Installation -:toc: right -:toclevels: 1 -:apache_docs: https://httpd.apache.org/docs/2.4/ -:description: The purpose of the provided scripts is to ease installation or upgrades of ownCloud instances. Using these scripts, you can also reapply ownership and access rights on linked directories if needed. - -== Introduction - -{description} - -== General Info - -It is important to understand how these scripts work and why things are done to process all the steps for a successful, smooth and secure installation or upgrade. - -Installation:: -When you do a fresh installation using this set of scripts, consider using links for the `data/` and `apps-external/` directories. Any copying or moving big directories can cause issues which can be avoided by using links. When doing an upgrade after an installation, the scripts can re-link those directories but will not "migrate" standard ones. If standard directories are used, the admin has to select a suitable method to migrate those directories as part of the upgrade process. You will get notified about this task if necessary. - -Migrating from standard to linked directories:: -You can at any time relocate your `data/` and `apps-external/` directories and link them to the old location using symlinks. This does not impact the functionality but eases upgrade steps a lot. In such a case, parametrize the instance script with the proper values to be prepared for the next upgrade. See some details at the xref:configuration[configuration section] below. -+ -Do not try to use the script to migrate between directory types. Your environment will break and data loss can occur. Any migration from one type to another must be done manually and before using the script. - -Upgrading:: -When upgrading, the scripts rename the current ownCloud directory (usually `owncloud`) to `owncloud-timestamp`. A new and fresh owncloud directory will be created where the files from the tar archive get extracted to. By doing so, nothing gets deleted, overwritten or moved and the existing instance is secured to go back to in case it is needed. Note that the script does not take care of the database. You have to manage a xref:maintenance/backup_and_restore/backup.adoc#backup-the-database[database backup] yourself. When you have decided to use links for `data/` and `apps-external/`, the script will re-link these directories. Nothing gets moved. You can also (re)run the scrips on linked directories to set correct ownership and permissions. When using standard directories, you have to manually migrate them according to your environment and also manually check for correct ownership and permissions. -+ -The scripts take care of your configuration. The relevant files are _copied_ from the backup. -+ -If the upgrade was successful, you can delete the backup or keep it based on your requirements. - -Scripts:: -There are two scripts available. The instance script defines the environment for your ownCloud while the preparation script called by the instance script performs the main tasks. Note that the preparation script asks a couple of questions to decide what you want to achieve. -+ -If you administrate more than one ownCloud instance, you still only need the one `owncloud_prep.sh` script. This script is doing the main job. Have as many instance scripts as you have instances to maintain. Only the instance scripts need configuration, like the respective target directory and other predefined information. The `instance.sh` script (or however you will name it) calls `owncloud_prep.sh` with the configuration you defined for the respective instance. - -The scripts are written for the `bash` shell. After you copy and pasted them, save both in a location for easy access. - -WARNING: Use the following scripts at your own risk. They may not work as expected if not properly configured. - -NOTE: The scripts are only working with tar archives as sources for installations and upgrades. - -TIP: You can also use these scripts if you want to set or reapply strong permissions on linked drectories. - -== Configuration - -* This is a brief overview of main directories in case you use linking. Note that `/mnt/owncloud_data` can be for example nfs mounted. The script takes care of proper linking the source to the target. -+ -[source,plaintext] ----- -/mnt/owncloud_data - └ apps-external - └ data - -/var/www/owncloud - └ apps - └ apps-external -> /mnt/owncloud_data/apps-external - └ data -> /mnt/owncloud_data/data - .. ----- - -* This is a brief overview of main directories in case you use standard directories -+ -[source,plaintext] ----- -/var/www/owncloud - └ apps - └ apps-external - └ data - .. ----- - -While this makes no difference for an installation, upgrading is much easier as you do not need to take care of migrating directories as they are simply re-linked. - -NOTE: You only need to edit the `instance.sh` script (or however you name it), if you want to change the default settings. - -The following table illustrates the variables to be configured and what they mean. - -[width="90%",cols="20%,80%",options="header"] -|=== -|Variable | Description -|ocname | The name of your directory containing the owncloud files (default is owncloud) -|ocroot | The path to ocname, usually /var/www (no trailing slash, default is /var/www) -|linkroot | The path to your source directory for linking **data** and **apps-external** (default /mnt/owncloud_data). You have to prepare this directory in advance and give it proper ownership and r/w permissions for the webserver user. Note that the **apps** directory is always part of the tar archive and therefore be extracted at its default location without being linked. -|htuser | The webserver user (default www-data) -|htgroup | The webserver group (default www-data) -|rootuser | The root user (default root). Necessary to run some commands in the script. Note that the script is not intended to run as superuser for security reasons. -|=== - -. `ocname` + -This is the _directory name_ where your ownCloud files will be saved. Suggestion: Use `owncloud` for a single instance but feel free to pick any name you like. Do not use slashes (`/`). -+ -NOTE: With only one site to serve, use `html` as it requires no additional settings to maintain on the Apache webserver after the installation. If you use any other name like `owncloud`, you need to set the correct directory in the Apache configuration. For more information, see the {apache_docs}[Apache documentation]. If you are hosting additional websites on the same server, better use a name different from the Apache default (html). - -. `ocroot` + -This is the _path_ where `ocname` will be created, for example `/var/www`. + -The path must be resolvable! Do not use trailing slashes (`/`). + -`ocroot`/`ocname` is the path/directory where your webserver points to (document root). + -The script resolves this for example to `/var/www/owncloud`. - -. `linkroot` + -Although not mandatory, it is highly recommended that you use symbolic links for the `data` and `apps-external` directories. The `data` directory can grow very large and any copy or move process might take a long time on upgrades. Therefore this directory is often put on external drives or on NFS mounts. The `apps-external` directory is used for all apps not provided by the ownCloud installation. With any physical upgrade you perform, manual intervention like copying may be necessary before finalizing and upgrade if you are not using links. The use of symbolic links makes the administration much easier and less error-prone. -+ -The script uses `linkroot` as base for both the `data` and `apps-external` directories. If not already present, it creates the directories from scratch and links them, both for the installation and on upgrades. -+ -If you consider using symbolic links, create a base directory at the location of choice (for example: `/mnt/oc_data`) and let that directory be owned by your webserver's user or group. Use this directory as your `linkroot`. Do not use trailing slashes (`/`). - -. `htuser` and `htgroup` + -This is the user and group the webserver uses, usually `www-data`. - -. `rootuser` + -This is the name of the root user, usually `root`. - -== Usage - -It is mandatory to run this script with root privileges, because files and directories will be created and ownership and permissions will be set. Call the instance script like: - -[source,bash] ----- -sudo ./instance.sh ----- - -The script asks you a couple of questions which follow a logical path. Default answers are capitalized. - -.When installing -the script extracts the files with tar and automatically extracts them to the target location without copying. - -.In case of an upgrade -the old instance path is backed up by _renaming and adding a time stamp_. A new target folder with the old name is created. This ensures that in case of extracting and preparation issues, you can easily go back to the previous version. After a successful upgrade, you must manually remove the backup folder. - -The complete script based procedure might look like this (logged in as root user): - -* copy paste from below both scripts, and place them both in the current folder. -* `wget https://download.owncloud.com/server/stable/owncloud-latest.tar.bz2 -O /tmp/owncloud-latest.tar.bz2` -* `sudo -u www-data /var/www/owncloud/occ maintenance:mode --on` -* `bash ./instance.sh` - - Do you want to secure your .htaccess files post installing/upgrade (y/N)? → `n` + - You must choose `n` here, in order to continue. - - Do you want to install a new instance (y/N)? → `n` - - Do you want to upgrade an existing installation (y/N)? → `y` - - Use links for data and apps-external directories (Y/n)? → `n` + - Depending on the setup, a default standard install does not use "links". - - Is the instance in maintenance mode? (y/N)? → `y` + - You must choose `y` here, in order to continue. - - Please specify the tar file to extract with full path: `/tmp/owncloud-latest.tar.bz2` - -+ -[...] (many lines scroll by) -* `ls -ld /var/www/owncloud_*` + - `drwxr-xr-x 12 www-data www-data 4096 Aug 20 16:04 /var/www/owncloud_2024-08-20-15.50.56` -* `backup=/var/www/owncloud_2024-08-20-15.50.56` + - Note the exact numbers as printed with the `ls` command above. -* `rmdir /var/www/owncloud/data/ /var/www/owncloud/apps-external/` -* `mv $backup/data /var/www/owncloud/` -* `mv $backup/apps-external /var/www/owncloud/` -* `sudo -u www-data /var/www/owncloud/occ maintenance:mode --off` -* `sudo -u www-data /var/www/owncloud/occ upgrade` - -TIP: If you do not install or upgrade, the script sets ownership and permissions on linked directories only. - -NOTE: In case of upgrading, if you have customized the `.htaccess` or `.user.ini` file in the ownCloud webroot, you have to manually restore any changes made after the script has finished from the backup folder. Take care to only restore the changes made but not the complete file as this file will be recreated on upgrades by the tar source and may contain different settings provided by ownCloud. Customizing `.htaccess` can be necessary when you e.g. xref:configuration/integration/ms-teams.adoc[Integrate ownCloud into Microsoft Teams]. - -NOTE: In case of upgrading, if you have created links to the apps-external/ and data/ directory, the script will re-link these directories. If you used standard directories, you have to manually migrate any content of these directories back after the script has run. Check that ownership and permissions are correct after migration and in doubt, let the scrips set the correct ones when using linked directories or set them manually - which can take a while depending on the size of the data/ directory. Take care not to overwrite new app versions with older ones. - -=== Script Questions - -* **Do you want to secure your .htaccess files post installing/upgrade (y/N)?** + - Use this if you have configured or upgraded your instance successfully to protect - your .htaccess files. - -* **Do you want to install a new instance (y/N)?** + - Self explaining - -* **Do you want to upgrade an existing installation (y/N)?** + - Use this if you already have a running instance. Prepare your instance by enabling - maintenance mode. For security reasons, you will be asked before the script continues! - -* **Use links for data and apps-external directories (Y/n)?** + - The script uses respectively checks if links or local directories will be / are used. - -* **Do you want to chmod/chown these links (y/N)?** + - This question is only asked when you use links. If you are not installing or upgrading, - answering with yes, you can e.g. re-apply ownership and permissions to the linked `data` and - `apps-external` directories. As written above, the data directory can be very large - and may take long to complete. Note, by design, there is no progressbar... - -* **Please specify the tar file to extract with full path:** + - Used when installing or upgrading only. Enter the full path/filename to the tar source - file, downloaded from ownCloud. - -== Final Steps - -After running the script, you will see success messages when it finishes. - -.When installing -Enter the URL of your ownCloud instance in a browser and continue the setup via the graphical installation wizard. For more information, see xref:installation/installation_wizard.adoc[The Installation Wizard]. -The URL you need to enter in the browser depends on the webserver setup and is either an external URL or, if you installed locally, you should be able to access your ownCloud instance via a browser at `\http://127.0.0.1/owncloud/` or `\http://localhost/owncloud/`. - -.When upgrading -Follow the steps printed on the screen, especially when using standard directories where you have to migrate the `data/` and `apps-external/` directories manually before finalizing the upgrade. Do not forget to reapply manually made changes made to `.htaccess` and `.user.ini` in your owncloud root directory. - -.How to see the difference between two files quickly -The following example command shows you the difference between two files, which is helpful for reapplying manual changes to `.htaccess` and `.user.ini`. Change the paths, directories and files accordingly. -[source,bash] ----- -diff -y -W 70 --suppress-common-lines owncloud/.user.ini owncloud_2022-02-15-09.18.48/.user.ini ----- -[source,plaintext] ----- -post_max_size=513M | post_max_size=1G ----- - -== Creating the scripts - -Save both scripts together in a directory of your choice. Name the `instance.sh` script according to your needs, so you can easily identify to which ownCloud installation it applies. However, the script `owncloud_prep.sh` is called with exactly that name by the instance script, therefore you must save it with exactly that name. - -Edit your version of the `instance.sh` script with the parameters that apply to your environment. - -Next, make both scripts executable (use the correct script names instead of the placeholder): - -[source,bash] ----- -sudo chmod +x scriptname.sh ----- - -. The `instance.sh` script -+ -[source,bash] ----- -include::example$installation/manual_installation/instance.sh[] ----- - -. The `owncloud_prep.sh` script -+ -[source,bash] ----- -include::example$installation/manual_installation/owncloud_prep.sh[] ----- diff --git a/modules/admin_manual/pages/installation/manual_installation/server_prep_ubuntu_20.04.adoc b/modules/admin_manual/pages/installation/manual_installation/server_prep_ubuntu_20.04.adoc deleted file mode 100644 index fc91873e8..000000000 --- a/modules/admin_manual/pages/installation/manual_installation/server_prep_ubuntu_20.04.adoc +++ /dev/null @@ -1,453 +0,0 @@ -= Server Preparation for Ubuntu 20.04 -:toc: right -:toclevels: 1 -:page-partial: -:ubuntu_upgrade_url: https://www.cyberciti.biz/faq/upgrade-ubuntu-18-04-to-20-04-lts-using-command-line/ -:remove_ppa_url: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ -:php-common: https://tecadmin.net/enable-disable-php-modules-ubuntu/ -:ondrej-php-url: https://launchpad.net/~ondrej/+archive/ubuntu/php -:libsmbclient-php_url: https://github.com/eduardok/libsmbclient-php -:update-alternatives_url: https://manpages.ubuntu.com/manpages/focal/en/man1/update-alternatives.1.html -:smbclient_url: https://packages.ubuntu.com/search?keywords=smbclient -:pecl_url: https://pecl.php.net/package/smbclient -:phpmyadmin_latest_url: https://www.phpmyadmin.net/downloads/ -:pear-package_url: https://pear.php.net/package/PEAR/ -:page-aliases: installation/manual_installation/server_prep_ubuntu_18.04.adoc -:phpseclib-url: https://phpseclib.com/docs/why - -:description: This guide gives you detailed information on preparing your Ubuntu 20.04 server for the use with ownCloud. - -== Introduction - -{description} - -The target audience for this document are experienced admins with additional needs and setup scenarios. Ubuntu 20.04 by default only provides PHP 7.4. In case you are running a PHP version lower than 7.4, your PHP version is already EOL. Consider upgrading to PHP 7.4. For more information see {php-supported-versions-url}[Currently Supported PHP Versions]. This document considers two basic scenarios. You have/plan to upgrade from 18.04 LTS to 20.04 LTS or you have a fresh Ubuntu 20.04 LTS installation. - -IMPORTANT: PHP 8.0 is not currently supported by the ownCloud server. - -IMPORTANT: Read the xref:installation/manual_installation/manual_installation_prerequisites.adoc#openssl-version[openSSL Version] notes which are important when planning to use encryption. - -NOTE: The commands and links provided in this description should give you proper hints but we cannot take any responsibility. - -== Upgrading from Ubuntu 18.04 to 20.04 - -Without going into the upgrade details, you can now upgrade directly from Ubuntu 18.04 LTS to 20.04 LTS without using the _development_ (`-d`) option when using the `do-release-upgrade` command. For more details see an example description at {ubuntu_upgrade_url}[Upgrade Ubuntu 18.04 to 20.04 LTS using command line] - -[source,bash] ----- -sudo apt update ----- - -[source,bash] ----- -sudo apt upgrade ----- - -[source,bash] ----- -sudo apt dist-upgrade ----- - -[source,bash] ----- -sudo apt autoremove ----- - -[source,bash] ----- -sudo apt install update-manager-core ----- - -[source,bash] ----- -sudo do-release-upgrade ----- - -If you have upgraded successfully and had previously installed any versions of PHP, better uninstall all PHP versions and ALL extensions and perform a fresh PHP 7.4 native installation. This is especially true when using the `ondrej php` PPA as it installs all available PHP versions, which are either no longer needed or supported. To do so, stop any services which depend on or use PHP like your Web Server. Then get a list of all PHP related programs and extensions by typing: - -[source,bash] ----- -dpkg -l | grep php | awk '{print $2}' | tr "\n" " " ----- - -Disable all extensions listed (see the section -xref:useful-commands-for-managing-php-extensions[Useful Commands For Managing PHP Extensions]) - -Then purge them step by step - -[source,bash] ----- -sudo apt purge ----- - -Alternatively, if you are fine removing all packages listed, you can run: - -[source,bash] ----- -sudo apt purge `dpkg -l | grep php | awk '{print $2}' | tr "\n" " "` ----- - -NOTE: Keep a copy of your relevant `php.ini` and other configuration files as reference _before_ you start purging, to quickly reconfigure your PHP 7.4 installation afterwards. - -If you had installed the `ondrej php` PPA, remove it, else it will reinstall PHP from this source again. To do so run: - -[source,bash] ----- -sudo apt install ppa-purge ----- - -[source,bash] ----- -sudo ppa-purge ppa:ondrej/php ----- - -[source,bash] ----- -sudo rm -i /etc/apt/sources.list.d/ondrej-ubuntu-php-* ----- - -[source,bash] ----- -sudo apt update ----- - -You can also follow this guide to remove PPAs: {remove_ppa_url}[How to Remove or Delete PPA in Ubuntu]. - -WARNING: If you have not cleanly removed that ppa you may get conflicts when installing PHP. - -After deinstallation of all versions and extensions of PHP and cleaning up all remnants, you should have an empty `/etc/php` directory. You can proceed like on a fresh installation of Ubuntu 20.04 LTS. - -== Clean Ubuntu 20.04 Installation - -After you have installed your Ubuntu 20.04 LTS server from scratch, use the following commands to -install PHP 7.4 and necessary extensions: - -[source,bash] ----- -sudo apt install php-fpm php-cgi ----- - -[source,bash] ----- -sudo apt install php ----- - -[source,bash] ----- -sudo apt install php-mysql php-mbstring php-intl php-imagick \ - php-redis php-apcu php-igbinary php-gmp php-bcmath \ - php-curl php-gd php-zip php-imap php-ldap php-bz2 \ - php-ssh2 php-phpseclib php-common php-json php-xml \ - php-dev libsmbclient-dev php-pear ----- - -Note that the `php-phpseclib` package is a {phpseclib-url}[pure PHP implementation] for handling various ciphers and not dependent to the php source. - -Use the following commands to install some common prerequisites: - -[source,bash] ----- -sudo apt install smbclient ----- - -[source,bash] ----- -sudo apt install redis-server ----- - -[source,bash] ----- -sudo apt install unzip ----- - -[source,bash] ----- -sudo apt install openssl ----- - -[source,bash] ----- -sudo apt install rsync ----- - -[source,bash] ----- -sudo apt install imagemagick ----- - -The following step is necessary to upgrade PEAR because of a change in PHP 7.4.1+ Note that you should always use the {pear-package_url}[latest stable PEAR release]. - -[source,bash] ----- -pear version ----- - -[source,bash] ----- -sudo mkdir -p /tmp/pear/cache ----- - -[source,bash] ----- -sudo pear upgrade --force \ - --alldeps http://pear.php.net/get/PEAR-1.10.13 ----- - -[source,bash] ----- -sudo pear clear-cache ----- - -[source,bash] ----- -sudo pear update-channels ----- - -[source,bash] ----- -sudo pear upgrade --force ----- - -[source,bash] ----- -sudo pear upgrade-all ----- - -[source,bash] ----- -pear version ----- - -If you get any notices containing `You should add "extension=...`, check if the extension is listed in `/etc/php/7.4/mods-available`. If it is not present, add the `.ini` file manually and xref:useful-commands-for-managing-php-extensions[enable it]. - -Post upgrading pear, you can safely remove the directory `/tmp/pear/cache`. - -Please see the xref:php-imagick-library[php-imagick Library] section for reason to install an updated version of ImageMagick. - -== Important Note on `smbclient` - -On Ubuntu 18.04, the default `smbclient` version was 4.7.6. With Ubuntu 20.04 the version provided is 4.11.6, the actual compilable version is 4.15.x. If you have successfully configured and connected `smbclient` under Ubuntu 18.04 to a Windows Server, you may now get issues connecting to older NAS systems. Some requirements are now stricter than before or have changed. - -If you needed to set `client max protocol = NT1` before in `smb.conf` to connect, with Samba 4.11+ you may get a response like `Max protocol NT1 is less than min protocol SMB2_02` which highlights a disabled former connectivity. Starting with Samba version 4.11, the NT1 protocol has been removed completely. - -To check if you are affected connecting to a particular file server, do tests with the Ubuntu provided version like: - -[source,bash] ----- -host -t SRV _ldap._tcp. ----- - -If you do not get SRV records printed, your dns settings may need a change. The first DNS server must be able to resolve your LDAP Active Directory request properly. If not, `smbclient` can not find a KDC to check credentials. - -[source,bash] ----- -sudo smbclient -L -U / ----- - -Any other output than a list of shares, like the error message - -[source,bash] ----- -tree connect failed: NT_STATUS_INVALID_PARAMETER ----- - -shows, that this target server is affected. This may impact your onwCloud installation when using SMB shares with that file server. - -The only solution is to compile a working Samba version yourself. -This xref:installation/manual_installation/compile_samba.adoc[Compact Samba Compiling Guide] -helps how to do that. - -== Apache Web Server - -The following command installs the Apache Web Server. - -[source,bash] ----- -sudo apt install libapache2-mod-php apache2 ----- - -See the important note on using the correct xref:installation/manual_installation/manual_installation_apache.adoc#multi-processing-module-mpm[Multi-Processing Module (MPM)]. - -Although it's not supported by ownCloud, you can configure Apache to use `php-fpm`, the FastCGI Process Manager, which is a non-standard setup and not covered by this document. - -== Multiple Concurrent PHP Versions - -If you have multiple concurrent PHP versions installed, which will happen when using the {ondrej-php-url}[ondrej/php] PPA, you must tell your Web Server and your CLI environment which one to use. Using the `ondrej/php` PPA may be needed if you want to test or prepare for the latest PHP version like PHP 8. Please note that `ondrej/php` installs _ALL_ versions of PHP. To list all available versions installed and choose one from them, use the following command: - -[source,bash] ----- -sudo update-alternatives --config php ----- - -Here is an example output: - -[source,plaintext] ----- -There are 2 choices for the alternative php (providing /usr/bin/php). - - Selection Path Priority Status ------------------------------------------------------------- -* 0 /usr/bin/php7.4 74 auto mode - 1 /usr/bin/php7.4 74 manual mode - 2 /usr/bin/php8.0 80 manual mode - -Press to keep the current choice[*], or type selection number: ----- - -You can also directly set the required PHP version: - -[source,bash] ----- -sudo update-alternatives --set php /usr/bin/php7.4 ----- - -WARNING: After selecting your PHP version, it is **highly** recommended to switch to the correct compiling environment which is essential e.g. when using PECL! - -[source,bash] ----- -sudo update-alternatives --set phar /usr/bin/phar7.4 ----- - -[source,bash] ----- -sudo update-alternatives --set phar.phar /usr/bin/phar.phar7.4 ----- - -[source,bash] ----- -sudo update-alternatives --set phpize /usr/bin/phpize7.4 ----- - -[source,bash] ----- -sudo update-alternatives --set php-config /usr/bin/php-config7.4 ----- - -When using Apache PHP-FPM, you have to configure your PHP version in an Apache config file manually. In any case, the PHP version used must always be the same. - -You can read more about `update-alternatives` command on the {update-alternatives_url}[man page]. - -WARNING: Please be advised, when switching a php version, you **MUST** also configure the corresponding php.ini files and extensions used accordingly! Extension binaries are **not** shared! - -WARNING: You may get completely unexpected behaviour or a broken environment if the PHP version for the Web Server and for CLI are different! - -=== Avoiding a Nasty Pitfall - -If you are using a PECL install later on, check the output of the installation command soon after it has started. You will find a text like: - -[source,plaintext] ----- -... -PHP Api Version: 20190902 -Zend Module Api No: 20190902 -... ----- - -Then do a test by just entering the following command: - -[source,bash] ----- -php -i | grep extension_dir ----- - -If the output is different than the style below, there is a problem that needs fixing: - -[source,plaintext] ----- -extension_dir => /usr/lib/php/20180731 => /usr/lib/php/20180731 ----- - -This is the output that shows a fix is needed: - -[source,plaintext] ----- -PHP Warning: PHP Startup: smbclient: Unable to initialize module -Module compiled with module API=20190902 -PHP compiled with module API=20180731 -These options need to match ----- - -As you see above, the API modules do not match and have been compiled with different versions and therefore will not work. To fix this, uninstall the PECL module with `pecl uninstall `, set the correct `update-alternatives` as described above and reinstall it. - -== libsmbclient-php Library - -`libsmbclient-php` is a PHP extension that uses Samba's libsmbclient library to provide Samba-related functions to PHP programs. You need to install it if you have installed `smbclient` as described above. `smbclient` is e.g. necessary if you are using the -xref:enterprise/external_storage/windows-network-drive_configuration.adoc[Windows Network Drives app] -from ownCloud's Enterprise Edition. To install it, run the commands described below. You can find more information about `smbclient` and the latest version on {pecl_url}[PECL]. - -[source,bash] ----- -sudo pecl channel-update pecl.php.net ----- - -[source,bash] ----- -sudo pecl install smbclient ----- - -When the commands complete, you then have to (assuming you use PHP 7.4): - -- Create `/etc/php/7.4/mods-available/smbclient.ini` with following content `extension=smbclient.so`. -- Enable the module by running `phpenmod smbclient`. -- Restart PHP and your web server by running the following command: -+ -[source,bash] ----- -sudo service apache2 restart ----- - -NOTE: Do not get confused by the name `smbclient`. It is on the one hand a {smbclient_url}[command-line SMB/CIFS client for Unix], and on the other hand the package name for the {pecl_url}[PECL smbclient] PHP extension - -NOTE: Alternatively you can install `smbclient` from {libsmbclient-php_url}[source]. - -== php-imagick Library - -When using new or extended formats for previews like HEIC or SVG, the standard installation of ImageMagick 6 and its php-imagick wrapper version 3.4 lacks this functionality. You have to manually install ImageMagick 7 and an updated php wrapper. To do so, follow the xref:installation/manual_installation/manual_imagick7.adoc[Install an Updated ImageMagick Version] guide. See the xref:configuration/files/previews_configuration.adoc[Previews Configuration] guide how to enable preview providers for various file types. - -== Useful Commands For Managing PHP Extensions - -=== List Enabled PHP Extensions - -If you want to retrieve a list of enabled PHP extensions run following command: - -[source,bash] ----- -ls `php -i | grep "^extension_dir" | sed -e 's/.*=> //'` | sort ----- - -=== Enabling and Disabling PHP Extensions - -To enable or disable a PHP extension for CLI, FPM or Apache, use the commands `phpenmod` or `phpdismod`. - -Example: -[source,bash] ----- -sudo phpenmod php-ldap ----- - -or - -[source,bash] ----- -sudo phpdismod php-ldap ----- - -Type the command without parameters or see this {php-common}[guide] to read more about the commands in the php-common package. - -== Notes for PHP Library phpseclib - -phpseclib's BigInteger uses the php-gmp (GNU Multiple Precision Arithmetic Library), php-bcmath and OpenSSL extensions, if they're available, for speed, but doesn't require them to maintain maximum compatibility. The GMP library uses an internal resource type, while the BCMath library uses strings as datatype. The most salient difference is that GMP works on _arbitrary precision integer values_ whereas BCMath allows _arbitrary precision] decimal / float-like values_. - -== Database Installation - -To install a database, see the -xref:installation/manual_installation/manual_installation_db.adoc[Manual Installation Databases guide]. - -NOTE: Follow the procedure described in xref:useful-tips[Useful Tips], if you want to `Disable Transparent Huge Pages (THP),Transparent Huge Pages` - -You may want to use the latest version of phpmyadmin as the OS default versions lags behind the {phpmyadmin_latest_url}[latest available stable] version a lot and may report PHP errors with PHP 7.4. Follow this -xref:installation/manual_installation/upgrade_install_phpmyadmin.adoc[quick upgrade guide] to install it. - -== Useful Tips - -include::partial$installation/manual_installation/useful_tips.adoc[leveloffset=+1] diff --git a/modules/admin_manual/pages/installation/manual_installation/server_prep_ubuntu_22.04.adoc b/modules/admin_manual/pages/installation/manual_installation/server_prep_ubuntu_22.04.adoc deleted file mode 100644 index a24dbc8f3..000000000 --- a/modules/admin_manual/pages/installation/manual_installation/server_prep_ubuntu_22.04.adoc +++ /dev/null @@ -1,385 +0,0 @@ -= Server Preparation for Ubuntu 22.04 -:toc: right -:toclevels: 1 -:page-partial: -:ubuntu_upgrade_url: https://linuxconfig.org/how-to-upgrade-ubuntu-to-22-04-lts-jammy-jellyfish -:php-common: https://tecadmin.net/enable-disable-php-modules-ubuntu/ -:ondrej-php-url: https://launchpad.net/~ondrej/+archive/ubuntu/php -:libsmbclient-php_url: https://github.com/eduardok/libsmbclient-php -:update-alternatives_url: https://manpages.ubuntu.com/manpages/focal/en/man1/update-alternatives.1.html -:phpmyadmin_latest_url: https://www.phpmyadmin.net/downloads/ -:pear-package_url: https://pear.php.net/package/PEAR/ -:phpseclib-url: https://phpseclib.com/docs/why - -:description: This guide gives you detailed information on preparing your Ubuntu 22.04 server for the use with ownCloud. - -== Introduction - -{description} - -The target audience for this document are experienced admins with additional needs and setup scenarios. Ubuntu 22.04 by default only provides PHP 8.1. However, PHP versions 8.0 and 8.1 are currently not supported, therefore this guide describes how to install PHP version 7.4 on Ubuntu 22.04 by the means of the {ondrej-php-url}[ondrej/php] PPA. For more information, see {php-supported-versions-url}[Currently Supported PHP Versions]. This document considers two basic scenarios. You plan to upgrade from 20.04 LTS to 22.04 LTS or you have a fresh Ubuntu 22.04 LTS installation. - -IMPORTANT: PHP 8.x is currently **not** supported by ownCloud server. - -IMPORTANT: Read the xref:installation/manual_installation/manual_installation_prerequisites.adoc#openssl-version[openSSL Version] notes which are important when planning to use encryption. - -NOTE: The commands and links provided in this description should give you proper hints but we cannot take any responsibility. - -== Upgrading from Ubuntu 20.04 to 22.04 - -Without going into the upgrade details, you can now upgrade directly from Ubuntu 20.04 LTS to 22.04 LTS when using the do-release-upgrade command. For more details see an example description at {ubuntu_upgrade_url}[Upgrade Ubuntu 20.04 to 22.04 LTS using command line] - -[source,bash] ----- -sudo apt update ----- - -[source,bash] ----- -sudo apt upgrade ----- - -[source,bash] ----- -sudo apt dist-upgrade ----- - -[source,bash] ----- -sudo apt autoremove - ----- -[source,bash] ----- -sudo apt install update-manager-core ----- - -[source,bash] ----- -sudo do-release-upgrade ----- - -If you have upgraded successfully and had previously installed any versions of PHP, better uninstall all PHP versions and ALL extensions and perform a fresh PHP 7.4 native installation. To do so, stop any services which depend on or use PHP like your Web Server. Then get a list of all PHP related programs and extensions by typing: - -[source,bash] ----- -dpkg -l | grep php | awk '{print $2}' | tr "\n" " " ----- - -Disable all extensions listed (see the section -xref:useful-commands-for-managing-php-extensions[Useful Commands For Managing PHP Extensions]). - -Then purge them step by step: - -[source,bash] ----- -sudo apt purge ----- - -Alternatively, if you are fine removing all packages listed, you can run: - -[source,bash] ----- -sudo apt purge `dpkg -l | grep php | awk '{print $2}' | tr "\n" " "` ----- - -NOTE: Keep a copy of your relevant `php.ini` and other configuration files as reference _before_ you start purging, to quickly reconfigure your PHP 7.4 installation afterwards. - -After deinstallation of all versions and extensions of PHP and cleaning up all remnants, you should have an empty `/etc/php` directory. You can proceed like on a fresh installation of Ubuntu 22.04 LTS. - -== Clean Ubuntu 22.04 Installation - -After you have installed your Ubuntu 22.04 LTS server from scratch, use the following commands to first add the {ondrej-php-url}[ondrej/php] PPA and then install PHP 7.4 and all necessary extensions: - -[source,bash] ----- -sudo add-apt-repository ppa:ondrej/php -y ----- - -[source,bash] ----- -sudo apt update && sudo apt upgrade ----- - -[source,bash] ----- -sudo apt install php7.4 php7.4-intl php7.4-mysql php7.4-mbstring \ - php7.4-imagick php7.4-igbinary php7.4-gmp php7.4-bcmath \ - php7.4-curl php7.4-gd php7.4-zip php7.4-imap php7.4-ldap \ - php7.4-bz2 php7.4-ssh2 php7.4-common php7.4-json \ - php7.4-xml php7.4-dev php7.4-apcu php7.4-redis \ - libsmbclient-dev php-pear php-phpseclib ----- - -Note that the `php-phpseclib` package is a {phpseclib-url}[pure PHP implementation] for handling various ciphers and not dependent to the php source. - -Use the following commands to install some common prerequisites: - -[source,bash] ----- -sudo apt install smbclient ----- - -[source,bash] ----- -sudo apt install redis-server ----- - -[source,bash] ----- -sudo apt install unzip ----- - -[source,bash] ----- -sudo apt install openssl ----- - -[source,bash] ----- -sudo apt install rsync ----- - -[source,bash] ----- -sudo apt install imagemagick ----- - -== Multiple Concurrent PHP Versions - -If you have multiple concurrent PHP versions installed, which will happen when using the {ondrej-php-url}[ondrej/php] PPA, you must tell your Web Server and your CLI environment which one to use. Please note that `ondrej/php` installs _ALL_ versions of PHP. To list all available versions installed and choose one of them, use the following command: - -[source,bash] ----- -sudo update-alternatives --config php ----- - -Here is an example output: - -[source,plaintext] ----- -There are 2 choices for the alternative php (providing /usr/bin/php). - - Selection Path Priority Status ------------------------------------------------------------- -* 0 /usr/bin/php7.4 74 auto mode - 1 /usr/bin/php7.4 74 manual mode - 2 /usr/bin/php8.0 80 manual mode - -Press to keep the current choice[*], or type selection number: ----- - -You can also directly set the required PHP version: - -[source,bash] ----- -sudo update-alternatives --set php /usr/bin/php7.4 ----- - -WARNING: After selecting your PHP version, it is **highly** recommended to switch to the correct compiling environment which is essential e.g. when using PECL! - -[source,bash] ----- -sudo update-alternatives --set phar /usr/bin/phar7.4 ----- - -[source,bash] ----- -sudo update-alternatives --set phar.phar /usr/bin/phar.phar7.4 ----- - -[source,bash] ----- -sudo update-alternatives --set phpize /usr/bin/phpize7.4 ----- - -[source,bash] ----- -sudo update-alternatives --set php-config /usr/bin/php-config7.4 ----- - -When using Apache PHP-FPM, you have to configure your PHP version in an Apache config file manually. In any case, the PHP version used must always be the same. - -You can read more about the `update-alternatives` command in the {update-alternatives_url}[man page]. - -WARNING: When switching a PHP version, you **MUST** also configure the corresponding php.ini files and extensions accordingly! Extension binaries are **not** shared! - -WARNING: You may get completely unexpected behaviour or a broken environment if the PHP version for the Web Server and for CLI are different! - -=== Avoiding a Nasty Pitfall - -If you are using a PECL install later on, check the output of the installation command soon after it has started. You will find a text like: - -[source,plaintext] ----- -... -PHP Api Version: 20190902 -Zend Module Api No: 20190902 -... ----- - -Then do a test by just entering the following command: - -[source,bash] ----- -php -i | grep extension_dir ----- - -If the output is different than the style below, there is a problem that needs fixing: - -[source,plaintext] ----- -extension_dir => /usr/lib/php/20180731 => /usr/lib/php/20180731 ----- - -This is the output that shows a fix is needed: - -[source,plaintext] ----- -PHP Warning: PHP Startup: smbclient: Unable to initialize module -Module compiled with module API=20190902 -PHP compiled with module API=20180731 -These options need to match ----- - -As you see above, the API modules do not match and have been compiled with different versions and therefore will not work. To fix this, uninstall the PECL module with `pecl uninstall `, set the correct `update-alternatives` as described above and reinstall it. - -== Updating pear - -The following step is necessary to upgrade PEAR because of a change in PHP 7.4.1+ Note that you should always use the {pear-package_url}[latest stable PEAR release]. - -[source,bash] ----- -pear version ----- - -[source,bash] ----- -sudo mkdir -p /tmp/pear/cache ----- - -[source,bash] ----- -sudo pear upgrade --force \ - --alldeps http://pear.php.net/get/PEAR-1.10.13 ----- - -[source,bash] ----- -sudo pear clear-cache ----- - -[source,bash] ----- -sudo pear update-channels ----- - -[source,bash] ----- -sudo pear upgrade --force ----- - -[source,bash] ----- -sudo pear upgrade-all ----- - -[source,bash] ----- -pear version ----- - -If you get any notices containing `You should add "extension=...`, check if the extension is listed in `/etc/php/7.4/mods-available`. If it is not present, add the `.ini` file manually and xref:useful-commands-for-managing-php-extensions[enable it]. - -Post upgrading pear, you can safely remove the directory `/tmp/pear/cache`. - -See the xref:php-imagick-library[php-imagick Library] section if you are interested why an updated version of ImageMagick is necessary. - -== Apache Web Server - -The following command installs the Apache Web Server. - -[source,bash] ----- -sudo apt install libapache2-mod-php7.4 apache2 ----- - -See the important note on using the correct xref:installation/manual_installation/manual_installation_apache.adoc#multi-processing-module-mpm[Multi-Processing Module (MPM)]. - -Although it's not supported by ownCloud, you can configure Apache to use `php-fpm`, the FastCGI Process Manager, which is a non-standard setup and not covered by this document. - -== libsmbclient-php Library - -`libsmbclient-php` is a PHP extension that uses Samba's libsmbclient library to provide Samba-related functions to PHP programs. You need to install it if you have installed `smbclient` as described above. `smbclient` is e.g. necessary if you are using the -xref:enterprise/external_storage/windows-network-drive_configuration.adoc[Windows Network Drives app] -from ownCloud's Enterprise Edition. To install it, run the following command: - -[source,bash] ----- -sudo apt install php7.4-smbclient ----- - -When the command completes, perform the following tasks: - -- Create `/etc/php/7.4/mods-available/smbclient.ini` with the following content: `extension=smbclient.so`. -- Enable the module by running `phpenmod smbclient`. -- Restart PHP and your web server by running the following command: -+ -[source,bash] ----- -sudo service apache2 restart ----- - -NOTE: Alternatively you can install `smbclient` from {libsmbclient-php_url}[source]. - -== php-imagick Library - -When using new or extended formats for previews like HEIC or SVG, the standard installation of ImageMagick 6 lacks this functionality. You have to manually install ImageMagick 7 (while the php wrapper version should be 3.7.0, which is fine, when following the install instructions above). To do so, follow the xref:installation/manual_installation/manual_imagick7.adoc[Install an Updated ImageMagick Version] guide. See the xref:configuration/files/previews_configuration.adoc[Previews Configuration] guide how to enable preview providers for various file types. - -== Useful Commands For Managing PHP Extensions - -=== List Enabled PHP Extensions - -If you want to retrieve a list of enabled PHP extensions run the following command: - -[source,bash] ----- -ls `php -i | grep "^extension_dir" | sed -e 's/.*=> //'` | sort ----- - -=== Enabling and Disabling PHP Extensions - -To enable or disable a PHP extension for CLI, FPM or Apache, use the commands `phpenmod` or `phpdismod`. - -Example: -[source,bash] ----- -sudo phpenmod php-ldap ----- - -or - -[source,bash] ----- -sudo phpdismod php-ldap ----- - -Type the command without parameters or see this {php-common}[guide] to read more about the commands in the php-common package. - -== Notes for PHP Library phpseclib - -phpseclib's BigInteger uses the php-gmp (GNU Multiple Precision Arithmetic Library), php-bcmath and OpenSSL extensions, if they're available, for speed, but doesn't require them to maintain maximum compatibility. The GMP library uses an internal resource type, while the BCMath library uses strings as datatype. The most salient difference is that GMP works on _arbitrary precision integer values_ whereas BCMath allows _arbitrary precision] decimal / float-like values_. - -== Database Installation - -To install a database, see the -xref:installation/manual_installation/manual_installation_db.adoc[Manual Installation Databases] guide. - -NOTE: Follow the procedure described in xref:useful-tips[Useful Tips] if you want to `Disable Transparent Huge Pages (THP),Transparent Huge Pages`. - -You may want to use the latest version of phpmyadmin as the OS default versions lags behind the {phpmyadmin_latest_url}[latest available stable] version a lot and may report PHP errors with PHP 7.4. Follow this -xref:installation/manual_installation/upgrade_install_phpmyadmin.adoc[quick upgrade guide] to install it. - -== Useful Tips - -include::partial$installation/manual_installation/useful_tips.adoc[leveloffset=+1] diff --git a/modules/admin_manual/pages/installation/manual_installation/upgrade_install_phpmyadmin.adoc b/modules/admin_manual/pages/installation/manual_installation/upgrade_install_phpmyadmin.adoc deleted file mode 100644 index 1d06a5bc2..000000000 --- a/modules/admin_manual/pages/installation/manual_installation/upgrade_install_phpmyadmin.adoc +++ /dev/null @@ -1,185 +0,0 @@ -= Upgrade phpmyadmin -:toc: right -:toclevels: 2 -:phpmyadmin_home_url: https://www.phpmyadmin.net -:phpmyadmin_dl_url: https://www.phpmyadmin.net/downloads/ - -:description: This guide helps you to upgrade an existing and configured installation of {phpmyadmin_home_url}[phpmyadmin] from source. - -== Introduction - -{description} This may be necessary if the provided version of your OS lags behind the available version and/or you see PHP errors when using it and you need an updated version. - -NOTE: `phpmyadmin` gets rarely updated as an Ubuntu package - usually only with Ubuntu LTS upgrades. If you have manually upgraded the installation but Ubuntu _downgrades_ your local version because of updating the package, just redo the procedure described below. - -NOTE: The guide has been tested but comes as it is without any warranty. - -== Prerequisites - -NOTE: You must already have an _existing_, _configured_ and _working_ `phpmyadmin` installation. - -If you have installed `phpmyadmin` with the packagemanager, check your existing version with the following command: - -[source,bash] ----- -sudo apt-cache policy phpmyadmin ----- - -When using `phpmyadmin`, post login, look at the bottom right side to see the actual version running. - -image::installation/manual_installation/phpmyadmin_v4.9.5deb2.png[width=300] - -You will find the binaries of your installation in the directory: `/usr/share/phpmyadmin`. - -== Upgrade Methods - -=== PPA Upgrade - -// see: https://github.com/phpmyadmin/phpmyadmin/wiki/DebianUbuntu - -You can upgrade `phpmyadmin` most easily to a later, but also most likely not to the latest, version when adding a PPA provided by the phpmyadmin team. To do so, type the following commands: - -[source,bash] ----- -sudo add-apt-repository ppa:phpmyadmin/ppa ----- - -[source,bash] ----- -sudo apt update ----- - -[source,bash] ----- -sudo apt install phpmyadmin ----- - -Note: if you do not want to continue with the PPA solution, just remove it by invoking the following command. This will keep your existing phpmyadmin installation, but will not update it anymore: - -[source,bash] ----- -sudo add-apt-repository --remove ppa:phpmyadmin/ppa ----- - -=== Manual Upgrade - -To download `phpmyadmin`, see the {phpmyadmin_dl_url}[phpmyadmin download page] and select the latest stable version or a version that fits your needs. Then start downloading, extracting and putting the files to the correct location. - -==== Download and Move - -The following example uses `phpMyAdmin-5.2.0-all-languages` as the example for upgrading. The old installation location will be renamed, because we need to keep some basic configuration settings. - -[source,bash] ----- -cd /tmp ----- - -[source,bash] ----- -sudo wget https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-all-languages.tar.gz ----- - -[source,bash] ----- -sudo tar -xvf phpMyAdmin-5.2.0-all-languages.tar.gz ----- - -[source,bash] ----- -sudo mv /usr/share/phpmyadmin /usr/share/phpmyadmin.old ----- - -[source,bash] ----- -sudo mkdir -p /usr/share/phpmyadmin ----- - -[source,bash] ----- -sudo cp -r phpMyAdmin-5.2.0-all-languages/. \ - /usr/share/phpmyadmin ----- - -[source,bash] ----- -sudo rm -r phpMyAdmin-5.2.0-all-languages* ----- - -==== Recreate Basic Configuration Settings - -Because the upgrade has some default basic configuration settings, it is necessary to recreate them based on the former settings coming from the Ubuntu installation. The file to change can be found in `/usr/share/phpmyadmin/libraries/vendor_config.php`. + -To keep a copy of the original file from the download, create a backup with: - -[source,bash] ----- -sudo cp /usr/share/phpmyadmin/libraries/vendor_config.php \ - /usr/share/phpmyadmin/libraries/vendor_config.php.orig ----- - -NOTE: The transformation of values may differ depending on the phpmyadmin version compared. Especially starting with version 5.2.0, the definitions have changed from constants to array. In addition, keys have the same name but different casing and the definition of `CONFIG_DIR`, which defines the path to the configuration files, has been removed completely and needs to be set manually. - -As rule of thumb, create a copy of the line that will be changed and make it a remark by adding `#` in front to keep a safe copy. - -Open two editors of your choice in parallel with the following files: - -(1) - `/usr/share/phpmyadmin/libraries/vendor_config.php` + -(2) - `/usr/share/phpmyadmin.old/libraries/vendor_config.php` - -and transfer the values coming from (2) to (1) as described below, check the path values and make sure they fit your environment: - -TEMP_DIR or tempDir:: -+ -[source,plaintext] ----- -'tempDir' => '/var/lib/phpmyadmin/tmp/', ----- -+ -or -+ -[source,plaintext] ----- -define('TEMP_DIR', '/var/lib/phpmyadmin/tmp/'); ----- - -CONFIG_DIR:: -Only if `define('CONFIG_DIR'...` exists, -+ -[source,plaintext] ----- -define('CONFIG_DIR', '/etc/phpmyadmin/'); ----- - -configFile:: -+ -[source,plaintext] ----- -'configFile' => '/etc/phpmyadmin/' . 'config.inc.php', ----- - -customHeaderFile:: -+ -[source,plaintext] ----- -'customHeaderFile' => '/etc/phpmyadmin/' . 'config.header.inc.php', ----- - -customFooterFile:: -+ -[source,plaintext] ----- -'customFooterFile' => '/etc/phpmyadmin/' . 'config.footer.inc.php', ----- - -== Testing - -When the upgrade has finished, test it by logging in and checking the actual version -displayed at the bottom right of the screen. - -image::installation/manual_installation/phpmyadmin_v5.2.0.png[width=300] - -When you are fine with your upgrade, you can safely delete the old installation files with: - -[source,bash] ----- -sudo rm -r /usr/share/phpmyadmin.old ----- diff --git a/modules/admin_manual/pages/installation/mount_folder_structure.adoc b/modules/admin_manual/pages/installation/mount_folder_structure.adoc index 573ae3c0e..a66050156 100644 --- a/modules/admin_manual/pages/installation/mount_folder_structure.adoc +++ b/modules/admin_manual/pages/installation/mount_folder_structure.adoc @@ -14,10 +14,10 @@ This folder structure is important not only for knowign your data is located, bu ---- mount_point/ - apps/ <1> - - certs/ + - certs/ <4> - config/ <2> - files/ <3> - - sessions/ + - sessions/ <4> ---- <1> The apps folder will contain ANY apps that will be added manually and are not automatically shipped by ownCloud. It matches xref: configuration/server/config_sample_php_parameters.adoc#define-alternative-app-directories[Define alternative app directories] aka the `apps-external` configuration of the config. @@ -27,7 +27,9 @@ mount_point/ -- IMPORTANT: Do not delete or manipulate any files in the config folder provided by the system. -IMPORTANT: Consider the alphabetic order the system is reading config files. With conflicting settings, the last one counts. +IMPORTANT: Consider the alphabetic order the system is reading config files. With conflicting settings, the last one takes precedence. -- <3> The files folder matches the `data` directory with former ownCloud releases. + +<4> Unused, present for historic reasons. diff --git a/modules/admin_manual/pages/installation/quick_guides/ubuntu_20_04.adoc b/modules/admin_manual/pages/installation/quick_guides/ubuntu_20_04.adoc deleted file mode 100644 index 3510c7987..000000000 --- a/modules/admin_manual/pages/installation/quick_guides/ubuntu_20_04.adoc +++ /dev/null @@ -1,323 +0,0 @@ -= Install ownCloud on Ubuntu 20.04 -:toc: right -:page-aliases: installation/quick_guides/ubuntu_18_04.adoc - -== Introduction - -This is a short guide to installing ownCloud on a fresh installation of Ubuntu 20.04. Run the following commands in your terminal to complete the installation. - -This guide can not go into details and has its limits by nature. If you experience issues like with dependencies of PHP or other relevant things like the operating system, web server or database, look at the xref:installation/manual_installation/manual_installation.adoc#ubuntu-20-04-lts-server[Detailed Installation Guide] for more information. - -== Prerequisites and Notes - -* A fresh installation of https://www.ubuntu.com/download/server[Ubuntu 20.04] with SSH enabled. -* This guide assumes that you are working as the root user. -* Your ownCloud directory will be located in `/var/www/owncloud/`. -* php 7.4 is the default version installable with Ubuntu 20.04. -* Use the correct xref:installation/manual_installation/manual_installation_apache.adoc#multi-processing-module-mpm[Multi-Processing Module (MPM)]. -* Read the xref:installation/manual_installation/manual_installation_prerequisites.adoc#openssl-version[openSSL Version] notes which are important when planning to use encryption. - -== Preparation - -=== Set Your Domain Name - -[source,bash] ----- -my_domain="Your.Domain.tld" -echo $my_domain - -hostnamectl set-hostname $my_domain -hostname -f ----- - -=== Update Your System - -First, ensure that all the installed packages are entirely up to date and that PHP is available in the APT repository. -To do so, follow the instructions below: - -[source,bash] ----- -apt update && \ - apt upgrade -y ----- - -=== Create the occ Helper Script - -Create a helper script to simplify running xref:configuration/server/occ_command.adoc[occ commands]: - -[source,bash] ----- -FILE="/usr/local/bin/occ" -cat <$FILE -#! /bin/bash -cd /var/www/owncloud -sudo -E -u www-data /usr/bin/php /var/www/owncloud/occ "\$@" -EOM ----- - -Make the helper script executable: - -[source,bash] ----- -chmod +x $FILE ----- - -=== Install the Required Packages - -[source,bash] ----- -apt install -y \ - apache2 libapache2-mod-php \ - mariadb-server openssl redis-server wget php-imagick \ - php-common php-curl php-gd php-gmp php-bcmath php-imap \ - php-intl php-json php-mbstring php-mysql php-ssh2 php-xml \ - php-zip php-apcu php-redis php-ldap php-phpseclib ----- - -=== Install smbclient php Module - -If you want to connect to external storage via SMB you need to install the smbclient php module. - -First install the required packages: - -[source,bash] ----- -apt-get install -y libsmbclient-dev php-dev php-pear ----- - -Then install smblclient php module using pecl: - -[source,bash] ----- -pecl channel-update pecl.php.net -mkdir -p /tmp/pear/cache -pecl install smbclient-stable -echo "extension=smbclient.so" > /etc/php/7.4/mods-available/smbclient.ini -phpenmod smbclient -systemctl restart apache2 ----- - -Check if it was successfully activated: - -[source,bash] ----- -php -m | grep smbclient ----- - -This should show the following output: - -[source,plaintext] ----- -libsmbclient -smbclient ----- - -=== Install the Recommended Packages - -Additional useful tools helpful for debugging: - -[source,bash] ----- -apt install -y \ - unzip bzip2 rsync curl jq \ - inetutils-ping ldap-utils\ - smbclient ----- - -=== Configure Apache - -==== Create a Virtual Host Configuration - -[source,apache] ----- -FILE="/etc/apache2/sites-available/owncloud.conf" -cat <$FILE - -# uncommment the line below if variable was set -#ServerName $my_domain -DirectoryIndex index.php index.html -DocumentRoot /var/www/owncloud - - Options +FollowSymlinks -Indexes - AllowOverride All - Require all granted - - - Dav off - - - SetEnv HOME /var/www/owncloud - SetEnv HTTP_HOME /var/www/owncloud - - -EOM ----- - -==== Enable the Virtual Host Configuration - -[source,bash] ----- -a2dissite 000-default -a2ensite owncloud.conf ----- - -=== Configure the Database - -IMPORTANT: It's recommended to execute `mysql_secure_installation` to secure the mariadb installation and set a strong password for the database user. - -Ensure transaction-isolation level is set and performance_schema on. - -[source,bash] ----- -sed -i "/\[mysqld\]/atransaction-isolation = READ-COMMITTED\nperformance_schema = on" /etc/mysql/mariadb.conf.d/50-server.cnf -systemctl start mariadb -mysql -u root -e \ - "CREATE DATABASE IF NOT EXISTS owncloud; \ - CREATE USER IF NOT EXISTS 'owncloud'@'localhost' IDENTIFIED BY 'password'; \ - GRANT ALL PRIVILEGES ON *.* TO 'owncloud'@'localhost' WITH GRANT OPTION; \ - FLUSH PRIVILEGES;" ----- - -It is recommended to run mysqltuner script to analyse database configuration after running with load for several days. - -Once the database installation is complete, refer to the Database section in the xref:configuration/server/harden_server.adoc#database[Hardening and Security Guidance] guide for additional important information. - -==== Enable the Recommended Apache Modules - -[source,bash] ----- -a2enmod dir env headers mime rewrite setenvif -systemctl restart apache2 ----- - -== Installation - -=== Download ownCloud - -[source,bash,subs="attributes+"] ----- -cd /var/www/ -wget {oc-complete-base-url}/{oc-complete-name}.tar.bz2 && \ -tar -xjf {oc-complete-name}.tar.bz2 && \ -chown -R www-data. owncloud ----- - -=== Install ownCloud - -IMPORTANT: We recommend to set a strong password for your owncloud admin user and the database user. - -[source,bash] ----- -occ maintenance:install \ - --database "mysql" \ - --database-name "owncloud" \ - --database-user "owncloud" \ - --database-pass "password" \ - --data-dir "/var/www/owncloud/data" \ - --admin-user "admin" \ - --admin-pass "admin" ----- - -=== Configure ownCloud's Trusted Domains - -[source,bash] ----- -my_ip=$(hostname -I|cut -f1 -d ' ') -occ config:system:set trusted_domains 1 --value="$my_ip" -occ config:system:set trusted_domains 2 --value="$my_domain" ----- - -=== Configure the cron Jobs - -Set your background job mode to cron: - -[source,bash] ----- -occ background:cron ----- - -Configure the execution of the cron job to every 15 min and the cleanup of chunks every night at 2 am: - -[source,bash] ----- -echo "*/15 * * * * /var/www/owncloud/occ system:cron" \ - | sudo -u www-data -g crontab tee -a \ - /var/spool/cron/crontabs/www-data -echo "0 2 * * * /var/www/owncloud/occ dav:cleanup-chunks" \ - | sudo -u www-data -g crontab tee -a \ - /var/spool/cron/crontabs/www-data ----- - -[NOTE] -==== -If you need to sync your users from an LDAP or Active Directory Server, add this additional xref:configuration/server/background_jobs_configuration.adoc[Cron job]. Every 4 hours this cron job will sync LDAP users in ownCloud and disable the ones who are not available for ownCloud. Additionally, you get a log file in `/var/log/ldap-sync/user-sync.log` for debugging. -==== - -[source,bash] ----- -echo "1 */6 * * * /var/www/owncloud/occ user:sync \ - 'OCA\User_LDAP\User_Proxy' -m disable -vvv >> \ - /var/log/ldap-sync/user-sync.log 2>&1" \ - | sudo -u www-data -g crontab tee -a \ - /var/spool/cron/crontabs/www-data -mkdir -p /var/log/ldap-sync -touch /var/log/ldap-sync/user-sync.log -chown www-data. /var/log/ldap-sync/user-sync.log ----- - -=== Configure Caching and File Locking - -[source,bash,subs="attributes+"] ----- -occ config:system:set \ - memcache.local \ - --value '\OC\Memcache\APCu' -occ config:system:set \ - memcache.locking \ - --value '\OC\Memcache\Redis' -occ config:system:set \ - redis \ - --value '{"host": "{oc-examples-server-ip}", "port": "{std-port-redis}"}' \ - --type json ----- - -=== Configure Log Rotation - -[source,bash] ----- -FILE="/etc/logrotate.d/owncloud" -sudo cat <$FILE -/var/www/owncloud/data/owncloud.log { - size 10M - rotate 12 - copytruncate - missingok - compress - compresscmd /bin/gzip -} -EOM ----- - -==== Finalize the Installation - -Make sure the permissions are correct: - -[source,bash] ----- -cd /var/www/ -chown -R www-data. owncloud ----- - -**ownCloud is now installed. You can confirm that it is ready to enable HTTPS xref:installation/letsencrypt/using_letsencrypt.adoc[(for example using Let's Encrypt)] by pointing your web browser to your ownCloud installation.** - -To check if you have installed the correct version of ownCloud and that the occ command is working, execute the following: - -[source,bash] ----- -occ -V -echo "Your ownCloud is accessable under: "$my_ip -echo "Your ownCloud is accessable under: "$my_domain -echo "The Installation is complete." ----- - -IMPORTANT: We recommend you check out the section xref:configuration/server/harden_server.adoc[Hardening and Security Guidance] next. diff --git a/modules/admin_manual/pages/installation/quick_guides/ubuntu_22_04.adoc b/modules/admin_manual/pages/installation/quick_guides/ubuntu_22_04.adoc deleted file mode 100644 index 7179babcd..000000000 --- a/modules/admin_manual/pages/installation/quick_guides/ubuntu_22_04.adoc +++ /dev/null @@ -1,341 +0,0 @@ -= Install ownCloud on Ubuntu 22.04 -:toc: right - -== Introduction - -This is a short guide to installing ownCloud on a fresh installation of Ubuntu 22.04. Run the following commands in your terminal to complete the installation. - -This guide can not go into details and has its limits by nature. If you experience issues like with dependencies of PHP or other relevant things like the operating system, web server or database, look at the xref:installation/manual_installation/manual_installation.adoc#ubuntu-22-04-lts-server[Detailed Installation Guide] for more information. - -== Prerequisites and Notes - -* A fresh installation of https://www.ubuntu.com/download/server[Ubuntu 22.04] with SSH enabled. -* This guide assumes that you are working as the root user. -* Your ownCloud directory will be located in `/var/www/owncloud/`. -* php 7.4 from the ondrej/php PPA is going to be installed on Ubuntu 22.04. -* Use the correct xref:installation/manual_installation/manual_installation_apache.adoc#multi-processing-module-mpm[Multi-Processing Module (MPM)]. -* Read the xref:installation/manual_installation/manual_installation_prerequisites.adoc#openssl-version[openSSL Version] notes which are important when planning to use encryption. - -== Preparation - -=== Set Your Domain Name - -[source,bash] ----- -my_domain="Your.Domain.tld" -echo $my_domain - -hostnamectl set-hostname $my_domain -hostname -f ----- - -=== Update Your System - -First, ensure that all the installed packages are entirely up to date and that PHP is available in the APT repository. -To do so, follow the instructions below: - -[source,bash] ----- -apt update && \ - apt upgrade -y ----- - -=== Create the occ Helper Script - -Create a helper script to simplify running xref:configuration/server/occ_command.adoc[occ commands]: - -[source,bash] ----- -FILE="/usr/local/bin/occ" -cat <$FILE -#! /bin/bash -cd /var/www/owncloud -sudo -E -u www-data /usr/bin/php /var/www/owncloud/occ "\$@" -EOM ----- - -Make the helper script executable: - -[source,bash] ----- -chmod +x $FILE ----- - -=== Install the Required Packages - -[source,bash] ----- -sudo add-apt-repository ppa:ondrej/php -y -sudo apt update && sudo apt upgrade - -apt install -y \ - apache2 \ - libapache2-mod-php7.4 \ - mariadb-server openssl redis-server wget \ - php7.4 php7.4-imagick php7.4-common php7.4-curl \ - php7.4-gd php7.4-imap php7.4-intl php7.4-json \ - php7.4-mbstring php7.4-gmp php7.4-bcmath php7.4-mysql \ - php7.4-ssh2 php7.4-xml php7.4-zip php7.4-apcu \ - php7.4-redis php7.4-ldap php-phpseclib ----- - -=== Install smbclient php Module - -If you want to connect to external storage via SMB you need to install the smbclient php module. - -[source,bash] ----- -apt-get install -y php7.4-smbclient -echo "extension=smbclient.so" > /etc/php/7.4/mods-available/smbclient.ini -phpenmod smbclient -systemctl restart apache2 ----- - -Check if it was successfully activated: - -[source,bash] ----- -php -m | grep smbclient ----- - -This should show the following output: - -[source,plaintext] ----- -libsmbclient -smbclient ----- - -=== Install the Recommended Packages - -Additional useful tools helpful for debugging: - -[source,bash] ----- -apt install -y \ - unzip bzip2 rsync curl jq \ - inetutils-ping ldap-utils\ - smbclient ----- - -=== Configure Apache - -==== Create a Virtual Host Configuration - -[source,apache] ----- -FILE="/etc/apache2/sites-available/owncloud.conf" -cat <$FILE - -# uncommment the line below if variable was set -#ServerName \$my_domain -DirectoryIndex index.php index.html -DocumentRoot /var/www/owncloud - - Options +FollowSymlinks -Indexes - AllowOverride All - Require all granted - - - Dav off - - - SetEnv HOME /var/www/owncloud - SetEnv HTTP_HOME /var/www/owncloud - - -EOM ----- - -==== Test the Configuration - -[source,bash] ----- -apachectl -t ----- - -At this point, the following output is expected: - -[source,bash] ----- -apachectl -t -AH00112: Warning: DocumentRoot [/var/www/owncloud] does not exist -AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message -Syntax OK ----- - -The first warning will be resolved after ownCloud is installed. The second message can be resolved with following command. Check that the entry is only present once in the `apache2.conf` file: - -[source,bash] ----- -echo "ServerName $my_domain" >> /etc/apache2/apache2.conf ----- - -==== Enable the Virtual Host Configuration - -[source,bash] ----- -a2dissite 000-default -a2ensite owncloud.conf ----- - -=== Configure the Database - -IMPORTANT: It's recommended to execute `mysql_secure_installation` to secure the mariadb installation and set a strong password for the database user. - -Ensure transaction-isolation level is set and performance_schema on. - -[source,bash] ----- -sed -i "/\[mysqld\]/atransaction-isolation = READ-COMMITTED\nperformance_schema = on" /etc/mysql/mariadb.conf.d/50-server.cnf -systemctl start mariadb -mysql -u root -e \ - "CREATE DATABASE IF NOT EXISTS owncloud; \ - CREATE USER IF NOT EXISTS 'owncloud'@'localhost' IDENTIFIED BY 'password'; \ - GRANT ALL PRIVILEGES ON *.* TO 'owncloud'@'localhost' WITH GRANT OPTION; \ - FLUSH PRIVILEGES;" ----- - -It is recommended to run the mysqltuner script to analyze the database configuration after running with load for several days. - -Once the database installation is complete, refer to the Database section in the xref:configuration/server/harden_server.adoc#database[Hardening and Security Guidance] guide for additional important information. - -==== Enable the Recommended Apache Modules - -[source,bash] ----- -a2enmod dir env headers mime rewrite setenvif -systemctl restart apache2 ----- - -== Installation - -=== Download ownCloud - -[source,bash,subs="attributes+"] ----- -cd /var/www/ -wget {oc-complete-base-url}/{oc-complete-name}.tar.bz2 && \ -tar -xjf {oc-complete-name}.tar.bz2 && \ -chown -R www-data. owncloud ----- - -=== Install ownCloud - -IMPORTANT: We recommend to set a strong password for your owncloud admin user and the database user. - -[source,bash] ----- -occ maintenance:install \ - --database "mysql" \ - --database-name "owncloud" \ - --database-user "owncloud" \ - --database-pass "password" \ - --data-dir "/var/www/owncloud/data" \ - --admin-user "admin" \ - --admin-pass "admin" ----- - -=== Configure ownCloud's Trusted Domains - -[source,bash] ----- -my_ip=$(hostname -I|cut -f1 -d ' ') -occ config:system:set trusted_domains 1 --value="$my_ip" -occ config:system:set trusted_domains 2 --value="$my_domain" ----- - -=== Configure the cron Jobs - -Set your background job mode to cron: - -[source,bash] ----- -occ background:cron ----- - -Set the execution of the cron job to every 15 minutes and the cleanup of chunks every night at 2 am: - -[source,bash] ----- -echo "*/15 * * * * /var/www/owncloud/occ system:cron" \ - | sudo -u www-data -g crontab tee -a \ - /var/spool/cron/crontabs/www-data -echo "0 2 * * * /var/www/owncloud/occ dav:cleanup-chunks" \ - | sudo -u www-data -g crontab tee -a \ - /var/spool/cron/crontabs/www-data ----- - -[NOTE] -==== -If you need to sync your users from an LDAP or Active Directory Server, add this additional xref:configuration/server/background_jobs_configuration.adoc[cron job]. Every 6 hours this cron job will sync LDAP users in ownCloud and disable the ones who are not available for ownCloud. Additionally, you get a log file in `/var/log/ldap-sync/user-sync.log` for debugging. -==== - -[source,bash] ----- -echo "1 */6 * * * /var/www/owncloud/occ user:sync \ - 'OCA\User_LDAP\User_Proxy' -m disable -vvv >> \ - /var/log/ldap-sync/user-sync.log 2>&1" \ - | sudo -u www-data -g crontab tee -a \ - /var/spool/cron/crontabs/www-data -mkdir -p /var/log/ldap-sync -touch /var/log/ldap-sync/user-sync.log -chown www-data. /var/log/ldap-sync/user-sync.log ----- - -=== Configure Caching and File Locking - -[source,bash,subs="attributes+"] ----- -occ config:system:set \ - memcache.local \ - --value '\OC\Memcache\APCu' -occ config:system:set \ - memcache.locking \ - --value '\OC\Memcache\Redis' -occ config:system:set \ - redis \ - --value '{"host": "{oc-examples-server-ip}", "port": "{std-port-redis}"}' \ - --type json ----- - -=== Configure Log Rotation - -[source,bash] ----- -FILE="/etc/logrotate.d/owncloud" -sudo cat <$FILE -/var/www/owncloud/data/owncloud.log { - size 10M - rotate 12 - copytruncate - missingok - compress - compresscmd /bin/gzip -} -EOM ----- - -==== Finalize the Installation - -Make sure the permissions are correct: - -[source,bash] ----- -cd /var/www/ -chown -R www-data. owncloud ----- - -**ownCloud is now installed. You can confirm that it is ready to enable HTTPS xref:installation/letsencrypt/using_letsencrypt.adoc[(for example using Let's Encrypt)] by pointing your web browser to your ownCloud installation.** - -To check if you have installed the correct version of ownCloud and that the occ command is working, execute the following: - -[source,bash] ----- -occ -V -echo "Your ownCloud is accessable under: "$my_ip -echo "Your ownCloud is accessable under: "$my_domain -echo "The Installation is complete." ----- - -IMPORTANT: We recommend you check out the section xref:configuration/server/harden_server.adoc[Hardening and Security Guidance] next. diff --git a/modules/admin_manual/pages/installation/system_requirements.adoc b/modules/admin_manual/pages/installation/system_requirements.adoc index 8d3aa902f..237d6af68 100644 --- a/modules/admin_manual/pages/installation/system_requirements.adoc +++ b/modules/admin_manual/pages/installation/system_requirements.adoc @@ -57,8 +57,8 @@ The operating system, web server, PHP runtime, and database are all managed insi We always recommend to use the newest Desktop and Mobile Apps with the latest server release. -You can find detailed system requirements in the documentation for each App in: +You can find the system requirements for each app in its documentation: * {desktop-system-requirements-url}[Desktop App] -* {ios-system-requirements-url}[iOS system requirements] -* {android-system-requirements-url}[Android system requirements] +* {ios-system-requirements-url}[iOS App] +* {android-system-requirements-url}[Android App] diff --git a/modules/admin_manual/pages/maintenance/migrating.adoc b/modules/admin_manual/pages/maintenance/migrating.adoc index 02f28bd50..7a4da8dec 100644 --- a/modules/admin_manual/pages/maintenance/migrating.adoc +++ b/modules/admin_manual/pages/maintenance/migrating.adoc @@ -1,81 +1,75 @@ -= Migrating to a Different Server += Migrating ownCloud :toc: right -:toclevels: 1 -:page-aliases: go/admin-untrusted-domains.adoc +:description: There are several situations where ownCloud needs to be migrated. == Introduction -If the need arises, ownCloud can be migrated to a different server. -A typical use case would be a hardware change to a physical server. -All migrations have to be performed with ownCloud in maintenance mode. -Online migration is supported by ownCloud only when implementing -industry-standard clustering and high-availability solutions *before* -ownCloud is installed for the first time. +{description} -To start, let’s work through a potential use case. A configured ownCloud -instance runs reliably on one machine, but for some reason the instance -needs to be moved to a new machine. Depending on the size of the -ownCloud instance the migration might take several hours. +The following scenarios are described here: -For the purpose of this use case, it is assumed that: +. Migrating to a differernt host +. Migrating to a different domain +. Migrating from ownCloud 10 to ownCloud 11 -1. The end users reach the ownCloud instance via a virtual hostname -(such as a DNS `CNAME` record) which can be pointed at the new location. -2. The authentication method (e.g., LDAP) remains the same after the -migration. +Note that any database migration is not covered here. -IMPORTANT: During the migration, do not make any changes to the original system, except for putting it into -maintenance mode. This ensures, should anything unforeseen happen, that you can go back to your existing -installation and resume availability of your installation while debugging the problem. +IMPORTANT: During the migration process, do not make any changes to the original system except to put it into maintenance mode. This ensures that, should anything unforeseen happen, you can revert to your existing installation and resume its availability while debugging the problem. -== How to Migrate +== Maintenance Mode -Firstly, set up the new machine with your desired Linux distribution. At this point, you can install xref:installation/manual_installation/manual_installation.adoc[ownCloud manually] via the -compressed archive. +To issue any occ commands, you must enter the directory where the ownCloud compose file is located. -Then, on the original machine turn on maintenance mode and then stop ownCloud. -After waiting 6 - 7 minutes for all sync clients to register that the server is in maintenance mode, stop the web server that is serving ownCloud. +* To enable maintenance mode, issue the following command: ++ +[source,bash,subs="attributes+"] +---- +cd /var/www/owncloud/ +{occ-command-example-prefix-docker} maintenance:mode --on +---- + +* To disable maintenance mode, issue the following command: ++ +[source,bash,subs="attributes+"] +---- +cd /var/www/owncloud/ +{occ-command-example-prefix-docker} maintenance:mode --off +---- -After that, xref:maintenance/backup_and_restore/backup.adoc[create a database dump] from the database, copy it to the new machine and xref:maintenance/backup_and_restore/restore.adoc[import it] into the new database. -Then, copy only your data, configuration, and database files from your original ownCloud instance to the new machine. +== Migration -IMPORTANT: You must keep the `data/` directory’s original file path during the migration. -However, xref:maintenance/manually-moving-data-folders.adoc[you can change it] before you begin the migration, or after the migration’s completed. +=== Host Migration -The data files should keep their original timestamp otherwise the -clients will re-download all the files after the migration. This step -might take several hours, depending on your installation. This can be -done on a number of sync clients, such as by using `rsync` with `-t` -option +Migration to a different host is easy with Docker. -With ownCloud still in maintenance mode and before changing the DNS -`CNAME` record, start up the database and web server on the new machine. -Then point your web browser to the migrated ownCloud instance and -confirm that: +. Enable maintenance mode +. Down the container +. Make the data availabe on the new host: +.. Either copy the Docker volume if not using a shared mount point to the new host, or +.. Create a new shared mount point +. Copy / adapt the compose yaml file to reflect your changes +. Bring up the container +. Disable maintenance mode -1. You see the maintenance mode notice -2. That a log file entry is written by both the web server and ownCloud -3. That no error messages occur. +=== Domain Migration -If all of these things occur, then take ownCloud out of maintenance mode -and repeat. After doing this, log in as an admin and confirm that -ownCloud functions as normal. +As the ownCloud 11 image provides an embedded Apache web server, you need a proxy to handle security and other web-related settings anyway. To migrate or add a domain, two steps are required: -At this point, change the DNS `CNAME` entry to point your users to the -new location. And with the `CNAME` entry updated, you now need to update -the trusted domains. +. Update your proxy server settings +. Update the ownCloud trusted domain settings -== Managing Trusted Domains +==== Managing Trusted Domains -All URLs used to access your ownCloud server must be white-listed in your -`config.php` file, under the `trusted_domains` setting. Users are -allowed to log into ownCloud only when they point their browsers to a -URL that is listed in the `trusted_domains` setting. +All URLs used to access your ownCloud server must be white-listed in your configuration file, under the `trusted_domains` setting or via environment variables. Users are allowed to log into ownCloud only when they point their browsers to a URL that is listed in the `trusted_domains` setting. NOTE: This setting is important when changing or moving to a new domain name. You may use IP addresses and domain names. -A typical configuration looks like this: +NOTE: The loopback address, `127.0.0.1`, is automatically white-listed, so as long as you have access to the physical server you can always log in. In the event that a load-balancer is in place, there will be no issues as long as it sends the correct `X-Forwarded-Host` header. + +A typical configuration via the configuration file looks like this:: ++ +-- [source,php] ---- 'trusted_domains' => [ @@ -84,190 +78,44 @@ A typical configuration looks like this: 2 => '192.168.1.50', ], ---- +-- -The loopback address, `127.0.0.1`, is automatically white-listed, so as -long as you have access to the physical server you can always log in. In -the event that a load-balancer is in place, there will be no issues as -long as it sends the correct `X-Forwarded-Host` header. +Here is an example of how this can be used from within a docker-compose.yml file:: ++ +-- +In case of a docker based setup, the trusted_domains setting is controlled by the environment variables `OWNCLOUD_TRUSTED_DOMAINS` or `OWNCLOUD_DOMAIN`. The latter only takes effect, if `OWNCLOUD_TRUSTED_DOMAINS` is undefined and can provide one IP-address or hostname. `OWNCLOUD_TRUSTED_DOMAINS` can specify multiple values as a comma-separated list. For more details on environment variables see the xref:installation/installing_with_docker.adoc[Installing With Docker] documentation. -In case of a docker based setup, the trusted_domains setting is controlled by the environment variables `OWNCLOUD_TRUSTED_DOMAINS` or `OWNCLOUD_DOMAIN`. The latter only takes effect, if `OWNCLOUD_TRUSTED_DOMAINS` is undefined and can provide one IP-address or hostname. `OWNCLOUD_TRUSTED_DOMAINS` can specify multiple values as a comma-separated list. - -Here is an example of how this can be used from within a docker-compose.yml file to allow access to ownCloud under two different names, and one IP-address, in addition to localhost and 127.0.0.1: +This will allow access to ownCloud under two different names, and one IP-address, in addition to localhost and 127.0.0.1: [source,yaml,subs="attributes+"] ---- services: owncloud: - image: "owncloud/server:{latest-server-version}" + image: owncloud/server:{latest-server-download-version} environment: OWNCLOUD_TRUSTED_DOMAINS: "myowncloud.mydomain.com, myowncloud, 12.23.34.45" ... ---- - -== Example Migration - -The following is an example migration with assumptions to make -this migration work: - -* Ubuntu 20.04+ -* SSH with `PermitRootLogin` set to `yes` -* Database used is MySQL / MariaDB - -=== Preparation - -If not already available on the new server, make sure SSH is installed: - -[source,bash] ----- -sudo apt install ssh -y ----- - -Next, edit ssh-config and enable root ssh login. - -[source,bash] ----- -nano /etc/ssh/sshd_config -PermitRootLogin yes ----- - -And then restart SSH. - -[source,bash] ----- -sudo service ssh restart ----- - -Lastly, install ownCloud on the new server. - -=== Migration - -==== Enable Maintenance Mode - -The first step is to enable maintenance mode. To do that, use the -following commands: - -[source,bash,subs="attributes+"] ----- -cd /var/www/owncloud/ -{occ-command-example-prefix-docker} maintenance:mode --on ----- - -NOTE: Run this command inside the ownCloud Docker container. - -After that’s done, then wait a few minutes and stop your web server, in this case Apache: - -[source,bash] ----- -sudo service apache2 stop ----- - -==== Transfer the Database - -Now, you have to transfer the database from the old server to the new -one. To do that, first backup the database. - -[source,bash] ----- -cd /var/www/owncloud/ -mysqldump --single-transaction -h localhost \ - -u admin -ppassword owncloud > owncloud-dbbackup.bak ----- - -Then, export the database to the new server. - -[source,bash] ----- -rsync -v owncloud-dbbackup.bak root@new_server_address:/var/www/owncloud ----- - -With that completed, import the database on new server. - -[source,bash] ----- -mysql -h localhost -u admin -ppassword owncloud < owncloud-dbbackup.bak ----- - -NOTE: You can find the values for the mysqldump command in your config.php, in your owncloud root directory. `[server]= dbhost, [username]= dbuser, [password]= dbpassword, and [db_name]= dbname`. - -[NOTE] -==== -.For InnoDB tables only -The –single-transaction flag will start a transaction before running. -Rather than lock the entire database, this will let `mysqldump` read the database in the current state at the time of the transaction, making for a consistent data dump. -==== - -[NOTE] -==== -.For Mixed MyISAM / InnoDB tables -Either dumping your MyISAM tables separately from InnoDB tables or use `--lock-tables` instead of `--single-transaction` to guarantee the database is in a consistent state when using `mysqldump`. -==== - -==== Transfer Data and Configure the New Server - -The following ownCloud directories will be synced to the target instance: -`apps`, `config` and `data`. - -[source,bash] ----- -rsync -avt apps config data root@new_server_address:/var/www/owncloud ----- - -NOTE: If you have an additional apps directory like `apps-external`, this directory needs -to be added to the sync list above. - -IMPORTANT: If you want to move your data directory to another location on the target server, -it is advised to do this as a second step. Please see -xref:maintenance/manually-moving-data-folders.adoc[the data directory migration document] for more details. - -==== Finish the Migration - -Now it’s time to finish the migration. To do that, on the new server, -first verify that ownCloud is in maintenance mode. - -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} maintenance:mode ----- - -NOTE: Run this command inside the ownCloud Docker container. - -Next, start up the database and web server on the new machine. - -[source,bash] ----- -sudo service mysql start -sudo service apache2 start ----- - -With that done, point your web browser to the migrated ownCloud -instance, and confirm that you see the maintenance mode notice, and that -no error messages occur. If both of these occur, take ownCloud out of -maintenance mode. - -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} maintenance:mode --off ----- - -NOTE: Run this command inside the ownCloud Docker container. - -And finally, log in as admin and confirm normal function of ownCloud. If -you have a domain name, and you want an SSL certificate, we recommend -https://certbot.eff.org/[certbot]. - -==== Reverse the Changes to ssh-config - -Now you need to reverse the change to ssh-config. Specifically, set `PermitRootLogin` -to `no` and restart ssh. To do that, run the following command: - -NOTE: This is a security measure and improves SSH security. - -[source,bash] ----- -sudo service ssh restart ----- - -==== Update DNS and Trusted Domains - -Finally, update the DNS’ `CNAME` entry to point to your new server. -If you have not only migrated physically from server to server but have also changed your ownCloud server’s domain name, you also need to update the domain in xref:managing-trusted-domains[the Trusted Domain setting] in `config.php`, on the target server. +-- + +=== ownCloud Server Migration + +This section describes the migration of *ownCloud 10* to *ownCloud 11*, if ownCloud 10 was installed natively. It only focuses on ownCloud but not on any migration of the database! + +Due to the vast variability of installations, the description focuses on major steps rather than details. + +. Enable maintenance mode on ownCloud 10 +. Create a mount point to bind mount the Docker volume. + +For more details see the xref:installation/mount_folder_structure.adoc[Mount Folder Structure] documentation. +. Install ownCloud 11 using a bind mount and down the container. + +This will install/prepare ownCloud 11 in a basic way but it is not configured to your needs. + +For details see: xref:installation/installing_with_docker.adoc[Installing With Docker]. +. Adapt the compose yaml file to your needs. + +Remove any environment variables from the compose file that are no longer relevant, such as those for the database. These settings are now covered by a new configuration file, see below. +. Migrate the `data/files` directory into `mount-point/files`. +. Migrate all apps from ownCloud 10 that are NOT part of ownCloud 11 into the `mount-point/apps` directory. + +For more details see the xref:installation/apps_management_installation.adoc[Apps Management] documentation. +. Make a copy of your existing `config.php` file *with a new name* and remove any setting that adresses the `data` directory and `apps` / `apps-external` directories into the `mount-point/config` directory. + +See the inmportant note with regards to the config in the xref:installation/mount_folder_structure.adoc[Mount Folder Structure] documentation. +. Bring up the ownCloud 11 container. +. Disable maintenance mode. diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index d130a1fe8..17c4e4ac4 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -12,9 +12,9 @@ *** xref:admin_manual:installation/system_requirements.adoc[System Requirements] *** xref:admin_manual:installation/installing_with_docker.adoc[Installing With Docker] *** xref:admin_manual:installation/mount_folder_structure.adoc[Mount Folder Structure] -*** xref:admin_manual:installation/apps_management_installation.adoc[Installing and Managing Apps] -*** xref:admin_manual:installation/apps_supported.adoc[Supported Apps] -**** xref:admin_manual:installation/apps/mediaviewer/index.adoc[Media Viewer] +*** xref:admin_manual:installation/apps_management_installation.adoc[Apps Management] +**** xref:admin_manual:installation/apps_supported.adoc[Supported Apps] +***** xref:admin_manual:installation/apps/mediaviewer/index.adoc[Media Viewer] ** Configuration *** xref:admin_manual:configuration/database/index.adoc[Database] @@ -120,7 +120,7 @@ *** xref:admin_manual:maintenance/manually-moving-data-folders.adoc[Manually Moving Data Folders] *** Encryption **** xref:admin_manual:maintenance/encryption/migrating-from-user-key-to-master-key.adoc[Migrating from User Key to Master Key Encryption] -*** xref:admin_manual:maintenance/migrating.adoc[Migrating to a Different Server] +*** xref:admin_manual:maintenance/migrating.adoc[Migrating ownCloud] *** xref:admin_manual:maintenance/migrating_to_kiteworks.adoc[Migrating to Kiteworks PDN] *** xref:admin_manual:maintenance/migrating_to_ocis.adoc[Migrating to ownCloud Infinite Scale] diff --git a/modules/developer_manual/pages/general/devenv.adoc b/modules/developer_manual/pages/general/devenv.adoc index f549396b3..5addb09a1 100644 --- a/modules/developer_manual/pages/general/devenv.adoc +++ b/modules/developer_manual/pages/general/devenv.adoc @@ -5,15 +5,11 @@ This page helps with setting up your environment for use with and developing ownCloud. -Feel free to skip already one or more of the following steps, if you have already completed them. -Otherwise, if you’re just getting started, begin by getting the ownCloud source code. +Feel free to skip already one or more of the following steps, if you have already completed them. Otherwise, if you’re just getting started, begin by getting the ownCloud source code. == Install the Core Software -The first thing to do is to ensure that your server has the necessary software for installing and running ownCloud. -While you can go further, you need to install at least the -xref:admin_manual:installation/manual_installation/manual_installation.adoc[required packages]. -Then, you will need to install the software required to run the development environment's installation process. +The first thing to do is to ensure that your server has the necessary software for installing and running ownCloud. While you can go further, you need to install at least the xref:admin_manual:installation/manual_installation/manual_installation.adoc[required packages]. Then, you will need to install the software required to run the development environment's installation process. * https://www.gnu.org/software/make/[Make] * https://nodejs.org[Node.js] @@ -22,7 +18,7 @@ Then, you will need to install the software required to run the development envi * https://linux.die.net/man/1/unzip[unzip] * https://www.gnu.org/software/wget/[wget] -=== Install Dependencies on Ubuntu 16.04/18.04 +=== Install Dependencies on Ubuntu 24.04 ==== Install nodejs, make, unzip, and git @@ -78,8 +74,7 @@ Use it: php /usr/local/bin/composer ===== Verify the Installation -To verify that Composer is properly installed, run `composer`. -You should see output similar to that below. +To verify that Composer is properly installed, run `composer`. You should see output similar to that below. [source,console] ---- @@ -112,8 +107,7 @@ sudo apt-get install --no-install-recommends yarn ===== Verify that Yarn installed successfully: -After you have installed yarn, you can run `yarn --version` to confirm that it’s fully installed. -If it is, then it will print output similar to the following to the console. +After you have installed yarn, you can run `yarn --version` to confirm that it’s fully installed. If it is, then it will print output similar to the following to the console. ---- yarn version v1.13.0 @@ -134,22 +128,16 @@ sudo zypper --quiet --non-interactive install \ == Setup the Webserver and Database -Next, you need to setup your web and database servers, so that they work -properly with ownCloud. The respective guides are available at: +Next, you need to setup your web and database servers, so that they work properly with ownCloud. The respective guides are available at: * xref:admin_manual:installation/manual_installation/manual_installation.adoc#configure-the-web-server[Apache Webserver Configuration] * xref:admin_manual:configuration/database/linux_database_configuration.adoc[Database Server Configuration] == Get The Source -With the web and database servers setup, you next need to get a copy of -ownCloud. There are two ways to do so: +With the web and database servers setup, you next need to get a copy of ownCloud. -. Use a xref:admin_manual:installation/manual_installation/manual_installation.adoc[manual installation] -. Clone the development version from https://github.com/owncloud[GitHub]: - -For the sake of a brief example, assuming you chose to clone from -GitHub, here’s an example of how to do so: +* Clone the development version from https://github.com/owncloud/core[GitHub]: ---- # Assuming that /var/www/html is the webserver's document root @@ -158,17 +146,11 @@ git clone https://github.com/owncloud/core.git /var/www/html/core *What is the Web Server’s Root Directory?* -The quickest way to find out is by using the `ls` command, for example: -`ls -lah /var/www`. Depending on your Linux distribution, it’s likely -to be one of `/var/www`, `/var/www/html`, or `/srv/http`. +The quickest way to find out is by using the `ls` command, for example: `ls -lah /var/www`. Depending on your Linux distribution, it’s likely to be one of `/var/www`, `/var/www/html`, or `/srv/http`. === Set User, Group, and Permissions -You now need to make sure that the web server user (and optionally the -web server’s group) have read/write access to the directory where you -installed ownCloud: The following commands assume that `/var/www` is the -web server’s directory and that `www-data` is the web server user and -group. The following commands will do this: +You now need to make sure that the web server user (and optionally the- web server’s group) have read/write access to the directory where you installed ownCloud: The following commands assume that `/var/www` is the web server’s directory and that `www-data` is the web server user and group. The following commands will do this: ---- # Set the user and group to the webserver user and group @@ -180,9 +162,7 @@ sudo chmod o+rw -R /var/www/html/core/ *What is the Web Server’s User and Group?* -There are a few ways to identify the user and group the webserver is -running as. Likely the easiest are `grep` and `ps`. Here’s an example of -using both (which assumes that the distribution is Ubuntu 16.04). +There are a few ways to identify the user and group the webserver is running as. Likely the easiest are `grep` and `ps`. Here’s an example of using both (which assumes that the distribution is Ubuntu 24.04). ---- # Find the user defined in Apache's configuration files @@ -197,11 +177,7 @@ Depending on your distribution, it will likely be one of `http`, `www-data`, `ap == Install Software Dependencies -With the ownCloud source -xref:admin_manual:installation/manual_installation/manual_installation.adoc#configure-the-web-server[available to your webserver], -next install ownCloud’s dependencies by running -https://www.gnu.org/software/make/[Make], from the directory where -ownCloud’s located. Here’s an example of how to do so: +With the ownCloud source installed locally, next install ownCloud’s dependencies by running https://www.gnu.org/software/make/[Make], from the directory where ownCloud’s located. Here’s an example of how to do so: [source,console] ---- @@ -209,18 +185,14 @@ ownCloud’s located. Here’s an example of how to do so: cd /var/www/html/core && make ---- -By default, running `make` will install the required dependencies for -both PHP and JavaScript. However, there are other options that it -supports, which you can see in the table below, which are useful for a -variety of tasks. +By default, running `make` will install the required dependencies for both PHP and JavaScript. However, there are other options that it supports, which you can see in the table below, which are useful for a variety of tasks. [cols=",",options="header",] |=== | Target | Description | make | Pulls in both Composer and Bower dependencies | make clean | Cleans up dependencies. This is useful for starting over or when switching to older branches -| make dist | Builds a minimal owncloud-core tarball with only core apps in build/dist/core, stripped -of unwanted files +| make dist | Builds a minimal owncloud-core tarball with only core apps in build/dist/core, stripped of unwanted files | make docs | Builds the JavaScript documentation using http://usejsdoc.org[JSDoc] | make test | Runs all of the test targets | make test-external | Runs one of the external storage tests, and is configurable through make variables @@ -231,12 +203,7 @@ This replaces ./autotest.sh sqlite and is configurable through make variables == Enable Debug Mode -Now that ownCloud’s available to your web server and the dependencies -are installed, we strongly encourage you to disable JavaScript and CSS -caching during development. This is so that when changes are made, -they’re immediately visible, not at some later stage when the respective -caches expire. To do so, enable debug mode by setting `debug` to `true` -in config/config.php, as in the example below. +Now that ownCloud’s available to your web server and the dependencies are installed, we strongly encourage you to disable JavaScript and CSS caching during development. This is so that when changes are made, they’re immediately visible, not at some later stage when the respective caches expire. To do so, enable debug mode by setting `debug` to `true` in config/config.php, as in the example below. [source,php] ---- @@ -253,7 +220,4 @@ is only meant for debugging and development! == Setup ownCloud -With all that done, you’re now ready to use either -xref:admin_manual:installation/installation_wizard.adoc[the installation wizard] or -xref:admin_manual:installation/manual_installation/manual_installation.adoc#command-line-installation[command line installer] -to finish setting up ownCloud. +With all that done, install ownCloud using the xref:admin_manual:installation/installing_with_docker.adoc[Installing With Docker] documentation. diff --git a/site.yml b/site.yml index af77963eb..aa8961eca 100644 --- a/site.yml +++ b/site.yml @@ -28,7 +28,7 @@ asciidoc: # as they are just here for the test build latest-server-version: 'next@' # do not change, soft set, correctly defined via antora.yml previous-server-version: 'next@' # do not change, soft set, correctly defined via antora.yml - latest-server-download-version: 'next@' # do not change, soft set, correctly defined via antora.yml + latest-server-download-version: '10.16.2' current-server-version: 'next@' # do not change, soft set, correctly defined via antora.yml extensions: - ./ext-asciidoc/tabs.js From aa939e9a09370d168ea86d62510a557663d2d33d Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Mon, 18 May 2026 18:34:50 +0200 Subject: [PATCH 14/38] fix links and text to removed content --- .../encryption/encryption_configuration.adoc | 30 +++++--------- .../files/external_storage/local.adoc | 13 ++----- .../files/external_storage/smb.adoc | 9 ++--- .../configuration/server/security/oauth2.adoc | 39 +++++++------------ .../pages/maintenance/migrating.adoc | 2 +- .../pages/maintenance/upgrading/upgrade.adoc | 6 +-- 6 files changed, 34 insertions(+), 65 deletions(-) diff --git a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc index fd5fef564..617fe9b54 100644 --- a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc @@ -2,16 +2,6 @@ :toc: right :toclevels: 2 :description: The primary purpose of the ownCloud server-side encryption is to protect users’ files when they’re located on remote storage sites, such as Dropbox and Google Drive, smoothly and seamlessly from within ownCloud. -:page-aliases: go/admin-encryption.adoc, \ -configuration/files/encryption/disabling-encryption.adoc, \ -configuration/files/encryption/enabling-user-key-encryption.adoc, \ -configuration/files/encryption/encryption-types.adoc, \ -configuration/files/encryption/external-backends.adoc, \ -configuration/files/encryption/master-key-encryption.adoc, \ -configuration/files/encryption/migration-guide.adoc, \ -configuration/files/encryption/moving-key-locations.adoc, \ -configuration/files/encryption/sharing-encrypted-files.adoc, \ -configuration/files/encryption_configuration.adoc :hackerone-url: https://hackerone.com/reports/108082 :oc-uses-enc-url: https://owncloud.com/news/how-owncloud-uses-encryption-to-protect-your-data/ @@ -20,12 +10,13 @@ configuration/files/encryption_configuration.adoc {description} +NOTE: Using Docker means that the data directory is a subfolder of the volumes mount point, which is required for certain file configurations. For more details see the xref:installation/mount_folder_structure.adoc[Mount Folder Structure] documentation. + == General Notes Since ownCloud 9.0, server-side encryption for local and remote storage can operate independently. This allows encrypting a remote storage independent of the home storage on the ownCloud server. -NOTE: Starting with ownCloud 9.0 we support Authenticated Encryption for all newly encrypted files. -See {hackerone-url}[Exploiting unauthenticated encryption mode] for more technical information about the impact. +NOTE: Starting with ownCloud 9.0 we support Authenticated Encryption for all newly encrypted files. See {hackerone-url}[Exploiting unauthenticated encryption mode] for more technical information about the impact. For maximum security, make sure to configure external storage with menu:Check for changes[Never]. This will let ownCloud ignore new files not added via ownCloud. This way, a malicious external storage administrator cannot add new files to the storage without your knowledge. However, you may not use this setting _if_ your external storage is subject to legitimate external changes. @@ -33,7 +24,6 @@ ownCloud’s server-side encryption encrypts files stored on the ownCloud server [NOTE] ==== -* See the important information on the xref:installation/manual_installation/manual_installation_prerequisites.adoc#openssl-version[OpenSSL Version] before you start configuring the encryption app. * Encrypting files increases their size by an 8KB header plus 100 bytes per each 8KB block of the file. Remember to take this into account when you are both provisioning storage and setting storage quotas. * If you are _running_ the encryption app before version 1.5.0 or _started_ with an encryption app version before 1.5.0, BASE64 encoding was used and might still be used for old files if untouched since then. In these cases, old encrypted files increased their size by roughly 35%. We recommend to update the ownCloud system to be able to use the benefits of reduced file sizes for new and rewritten files. Note that the encryption app version lower than 1.5.0 was delivered as part of the ownCloud system lower than 10.7. * User quotas are based on the _unencrypted_ file size — *not* the encrypted size. This means that admins need to calculate with higher disk space requirements on the backend. @@ -325,10 +315,10 @@ NOTE: Sharing a recovery key with a user group is *not* supported. This is only If you have misplaced your recovery key password and need to replace it, here’s what you need to do: -1. Delete the recovery key from both `data/owncloud_private_keys` and `data/public-keys`. -2. Edit your database table `oc_appconfig` and remove the rows with the config keys `recoveryKeyId` and `recoveryAdminEnabled` for the appid `files_encryption`. -3. Login as admin and activate the recovery key again with a new password. This will generate a new key pair. -4. All users who used the original recovery key will need to disable it and enable it again. This deletes the old recovery share keys from their files and encrypts their files with the new recovery key. +. Delete the recovery key from both `data/owncloud_private_keys` and `data/public-keys`. +. Edit your database table `oc_appconfig` and remove the rows with the config keys `recoveryKeyId` and `recoveryAdminEnabled` for the appid `files_encryption`. +. Login as admin and activate the recovery key again with a new password. This will generate a new key pair. +. All users who used the original recovery key will need to disable it and enable it again. This deletes the old recovery share keys from their files and encrypts their files with the new recovery key. NOTE: You can only change the recovery key password if you know the original. This is by design as only admins who know the recovery key password should be able to change it. Otherwise admins could hijack the recovery key from each other. @@ -405,17 +395,17 @@ You can move the keys to another folder inside your data directory. Moving your [source,bash] ---- -mkdir /var/www/owncloud/data/new_keys +mkdir /mount_point/files/new_keys ---- [source,bash] ---- -chown -R root:www-data /var/www/owncloud/data/new_keys +chown -R root:www-data /mount_point/files/new_keys ---- [source,bash] ---- -chmod -R 0770 /var/www/owncloud/data/new_keys +chmod -R 0770 /mount_point/files/new_keys ---- [source,bash,subs="attributes+"] diff --git a/modules/admin_manual/pages/configuration/files/external_storage/local.adoc b/modules/admin_manual/pages/configuration/files/external_storage/local.adoc index f356253a8..14732aa59 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/local.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/local.adoc @@ -6,6 +6,8 @@ IMPORTANT: *Using local storage is a security risk, only use it if you know what you are doing.* +IMPORTANT: In a Dockerised environment, additional steps are required to make the chosen path available via volumes. These steps are not covered here. + {description} that is: * Outside of your ownCloud `data/` directory @@ -23,11 +25,6 @@ As this setup diffuses the difference between ownCloud Admin and sysadmin, this In any case, local storage is only configurable via the ownCloud admin settings. Non-admin users cannot create local storage mounts. -See -xref:installation/manual_installation/manual_installation.adoc#script-guided-installation[Set Correct Permissions] -for information on correct file permissions, and find your HTTP user -xref:configuration/general_topics/general_troubleshooting.adoc#php-version-and-information[PHP Version and Information]. - To enable Local storage, you must first enable it by editing your ownCloud installation’s `config/config.php` file adding the following configuration key: [source,php] @@ -43,8 +40,4 @@ image::configuration/files/external_storage/local.png[Manage local storage in ow . In the *Configuration* field enter the full file path of the directory you want to mount. . In the *Available for* field enter the users or groups who have permission to access the mount; by default all users have access. -See -xref:configuration/files/external_storage/configuration.adoc[External Storage Configuration] -for additional mount options and information, and -xref:configuration/files/external_storage/auth_mechanisms.adoc[External Storage Authentication mechanisms] -for more information on authentication schemes. +See xref:configuration/files/external_storage/configuration.adoc[External Storage Configuration] for additional mount options and information, and xref:configuration/files/external_storage/auth_mechanisms.adoc[External Storage Authentication mechanisms] for more information on authentication schemes. diff --git a/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc b/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc index 07ef4c413..743c18345 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc @@ -11,8 +11,7 @@ == Dependencies -To connect ownCloud to an SMB file server, you need to prepare your server. Please see the -xref:installation/manual_installation/manual_installation.adoc[Manual Installation on Linux] guides for more information, prerequisites and requirements. +All dependencies are provided with the ownCloud image. == Access Testing @@ -52,7 +51,5 @@ image::configuration/files/external_storage/smb.png[Samba external storage confi == Further Information -* xref:configuration/files/external_storage/configuration.adoc[External Storage Configuration] -for additional mount options and information. -* xref:configuration/files/external_storage/auth_mechanisms.adoc[External Storage Authentication Mechanisms] -for more information on authentication schemes. +* xref:configuration/files/external_storage/configuration.adoc[External Storage Configuration] for additional mount options and information. +* xref:configuration/files/external_storage/auth_mechanisms.adoc[External Storage Authentication Mechanisms] for more information on authentication schemes. diff --git a/modules/admin_manual/pages/configuration/server/security/oauth2.adoc b/modules/admin_manual/pages/configuration/server/security/oauth2.adoc index 5bc9d0ff9..617410131 100644 --- a/modules/admin_manual/pages/configuration/server/security/oauth2.adoc +++ b/modules/admin_manual/pages/configuration/server/security/oauth2.adoc @@ -70,15 +70,18 @@ OAuth2 support is available in ownCloud via the {oc-marketplace-url}/apps/oauth2 To use the OAuth2 app, your ownCloud installation will need to meet the following dependencies: -* *Apache:* If you are hosting your ownCloud installation using the Apache web server, then {mod_rewrite-url}[mod_rewrite] and {mod_headers-url}[mod_headers] modules must be installed and enabled. -* *Redis:* You will need to have a Redis server available, ideally the latest, stable version. -* *PHP-Redis:* You PHP installation must have the php-redis extension (>= 4.2) installed and enabled. +For the provided ownCloud image, the configuration already meets these criterias: -See the xref:installation/manual_installation/manual_installation.adoc[Detailed Installation Guide] for how to install Redis and PHP-Redis. +* *Apache:* + +{mod_rewrite-url}[mod_rewrite] and {mod_headers-url}[mod_headers] modules are installed and enabled. +* *PHP-Redis:* + +You PHP installation has the php-redis extension installed and enabled. + +A Redis server is required but not part of the ownCloud image. It can be deployed easily. For details see the xref:installation/installing_with_docker.adoc[Installing With Docker] documentation. === Installation -To install the application, download the {oc-marketplace-url}/apps/oauth2[OAuth2 app] from the marketplace to the ownCloud `app` directory or use the Market app. +The OAuth2 app is already part of the provided Docker image and does not need to be installed. It only needs to be enabled. === Basic Configuration @@ -126,9 +129,7 @@ When deleting in the web UI, you might need to scroll horizontally to see the de Clients first have to be registered in the web-UI menu:Settings[Admin > Authentication]. You need to specify a name for the client (the name is unrelated to the OAuth 2.0 protocol and is just used to recognize it later) and the redirection URI. A _client identifier_ and _client secret_ are generated when adding a new client, which both consist of 64 characters. -Refer to the -{official-client-registration-rfc-url}[official client registration RFC from the IETF] -for further information about client registration. +Refer to the {official-client-registration-rfc-url}[official client registration RFC from the IETF] for further information about client registration. ==== Authorization Request @@ -157,22 +158,17 @@ For every registered client, an authorization request can be made. The client re | Can be set by the client "to maintain state between the request and callback". See `RFC 6749`_ for more information. |========================== -Refer to the -{official-authorization-request-rfc-url}[official authorization request RFC from the IETF] -for further information about client registration. +Refer to the {official-authorization-request-rfc-url}[official authorization request RFC from the IETF] for further information about client registration. ==== Authorization Response After the resource owner's authorization, the app redirects to the `redirect_uri` specified in the authorization request and adds the authorization code as `URL parameter code`. An authorization code is valid for 10 minutes. -Refer to the -{official-authorization-response-rfc-url}[official authorization response RFC from the IETF] -for further information about client registration. +Refer to the {official-authorization-response-rfc-url}[official authorization response RFC from the IETF] for further information about client registration. ==== Access Token Request -With the authorization code, the client can request an access token using the access token URL. -{client-authentication-url}[Client authentication] is done using basic authentication with the client identifier as username and the client secret as a password. The following URL parameters have to be specified: +With the authorization code, the client can request an access token using the access token URL. {client-authentication-url}[Client authentication] is done using basic authentication with the client identifier as username and the client secret as a password. The following URL parameters have to be specified: [width="100%",cols="15%,60%,50%",options="header",] |========================== @@ -197,9 +193,7 @@ With the authorization code, the client can request an access token using the ac | |========================== -Refer to the -{official-access-token-request-rfc-url}[official access token request RFC from the IETF] -for further information about client registration. +Refer to the {official-access-token-request-rfc-url}[official access token request RFC from the IETF] for further information about client registration. ==== Access Token Response @@ -217,12 +211,9 @@ The app responds to a valid access token request with a JSON response like the f } ---- -Refer to the -{official-access-token-response-rfc-url}[official access token response RFC from the IETF] -for further information about client registration. +Refer to the {official-access-token-response-rfc-url}[official access token response RFC from the IETF] for further information about client registration. -NOTE: For a succinct explanation of the differences between access tokens and authorization codes, -check out this {stackoverflow-url}[answer on StackOverflow]. +NOTE: For a succinct explanation of the differences between access tokens and authorization codes, 8check out this {stackoverflow-url}[answer on StackOverflow]. === Limitations diff --git a/modules/admin_manual/pages/maintenance/migrating.adoc b/modules/admin_manual/pages/maintenance/migrating.adoc index 7a4da8dec..2222bbe85 100644 --- a/modules/admin_manual/pages/maintenance/migrating.adoc +++ b/modules/admin_manual/pages/maintenance/migrating.adoc @@ -102,7 +102,7 @@ services: This section describes the migration of *ownCloud 10* to *ownCloud 11*, if ownCloud 10 was installed natively. It only focuses on ownCloud but not on any migration of the database! -Due to the vast variability of installations, the description focuses on major steps rather than details. +Due to the wide range of installation types, the description focuses on the main steps rather than the details. When using encryption with the ownCloud 10 instance, the openSSL requirements must be met without circumventing retired ciphers. See the ownCloud 10 encryption documentation for more details. . Enable maintenance mode on ownCloud 10 . Create a mount point to bind mount the Docker volume. + diff --git a/modules/admin_manual/pages/maintenance/upgrading/upgrade.adoc b/modules/admin_manual/pages/maintenance/upgrading/upgrade.adoc index 555b9f8e8..706a39995 100644 --- a/modules/admin_manual/pages/maintenance/upgrading/upgrade.adoc +++ b/modules/admin_manual/pages/maintenance/upgrading/upgrade.adoc @@ -1,17 +1,15 @@ = How to Upgrade Your ownCloud Server :toc: right -:page-aliases: maintenance/upgrade.adoc, maintenance/upgrading/index.adoc +:description: When an update or upgrade is available for your ownCloud server, you will see a notification at the top of your ownCloud Web interface. == Introduction -We recommend that you keep your ownCloud server up to date. When an update or upgrade is available for your ownCloud server, you will see a notification at the top of your ownCloud Web interface. When you click the btn:[notification], it will bring you here. +We recommend that you keep your ownCloud server up to date. {description} When you click the btn:[notification], it will bring you here. Before beginning an upgrade, please keep the following points in mind: * Review the https://doc.owncloud.com/docs_main/next/server_release_notes.html[release notes] for important information about the needed migration steps during that upgrade to help ensure a smooth upgrade process. -* Check ownCloud's xref:installation/manual_installation/manual_installation_prerequisites.adoc[mandatory requirements] (such as PHP versions and extensions), which can change from one version to the next. Ensure that you review them and update or upgrade your server, if required, before upgrading ownCloud. - * Upgrading is disruptive, as your ownCloud server will be put into xref:configuration/server/occ_command.adoc#maintenance-commands[maintenance mode]. * Large installations may take several hours to complete the upgrade. From 56bd0629b80e06845f7a2fdf8ca6ac43f125dc60 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Tue, 19 May 2026 12:20:28 +0200 Subject: [PATCH 15/38] update upgrading --- .../installation/installing_with_docker.adoc | 63 +----- .../maintenance/upgrading/manual_upgrade.adoc | 207 +++++------------- .../pages/maintenance/upgrading/upgrade.adoc | 6 +- .../maintenance/upgrading/upgrade_php.adoc | 26 --- modules/admin_manual/partials/nav.adoc | 1 - 5 files changed, 55 insertions(+), 248 deletions(-) delete mode 100644 modules/admin_manual/pages/maintenance/upgrading/upgrade_php.adoc diff --git a/modules/admin_manual/pages/installation/installing_with_docker.adoc b/modules/admin_manual/pages/installation/installing_with_docker.adoc index 758d301be..b9d0477cb 100644 --- a/modules/admin_manual/pages/installation/installing_with_docker.adoc +++ b/modules/admin_manual/pages/installation/installing_with_docker.adoc @@ -350,65 +350,4 @@ An unhandled exception has been thrown: exception ‘PDOException’ with messag === Upgrading ownCloud -When a new version of ownCloud gets released, you should update your instance. To do so, follow these simple steps: - -. Go to your docker directory where your `.yaml` and `.env` files exist. -. Put ownCloud into maintenance mode with the following command: -+ -[source,docker,subs="attributes+"] ----- -{occ-command-example-prefix-docker} maintenance:mode --on ----- - -. Create a backup of the database in case something goes wrong during the upgrade process, using the following command: -+ -[source,docker] ----- -docker compose exec mariadb \ - /usr/bin/mysqldump \ - -u root \ - --password=owncloud \ - --single-transaction \ - owncloud > owncloud_$(date +%Y%m%d).sql ----- -+ -NOTE: You need to adjust the password and database name if you have changed it in your deployment. - -. Shutdown the containers: -+ -[source,docker] ----- -docker compose down ----- - -. Update the ownCloud version number in your `.env` file via the environment variable `OWNCLOUD_VERSION`. - -. View the file to ensure the change has been implemented. -+ -[source,bash] ----- -cat .env ----- - -. Start your docker instance again. -+ --- -[source,docker] ----- -docker compose up -d ----- - -Now you should have the current ownCloud running with `docker compose`. Note that the container will automatically run `occ upgrade` when starting up. If you notice the container starting over and over again, you can check the update log with the following command: - -[source,docker] ----- -docker compose logs --timestamp owncloud ----- --- - -. If all went well, end maintenance mode: -+ -[source,docker,subs="attributes+"] ----- -{occ-command-example-prefix-docker} maintenance:mode --off ----- +When a new version of ownCloud gets released, you should update your instance. To do so, read the documents located in the xref:maintenance/upgrading/upgrade.adoc[Upgrading] section. diff --git a/modules/admin_manual/pages/maintenance/upgrading/manual_upgrade.adoc b/modules/admin_manual/pages/maintenance/upgrading/manual_upgrade.adoc index aa57b9500..3ba2bdc36 100644 --- a/modules/admin_manual/pages/maintenance/upgrading/manual_upgrade.adoc +++ b/modules/admin_manual/pages/maintenance/upgrading/manual_upgrade.adoc @@ -1,8 +1,7 @@ = Manual ownCloud Upgrade :toc: right :toclevels: 2 -:description: This document describes how to manually upgrade your ownCloud installation. Because installations can vary, this guide can only give an overview of methods and examples. -:page-aliases: maintenance/manual_upgrade.adoc +:description: This document describes how to manually upgrade your Dockerized ownCloud installation. == Introduction @@ -10,17 +9,9 @@ NOTE: This guide assumes that you have basic knowledge about Unix terminology, commands and concepts. In case you are not familiar with these, ownCloud highly recommends that you create a playground first to try the steps and/or get in touch with ownCloud support to avoid breaking your system or losing data. -NOTE: This guide covers the upgrade of the ownCloud instance only. When planning to update/upgrade your server environment or server packages, read the xref:installation/manual_installation/manual_installation.adoc[Detailed Installation Guide] first to match the prerequisites. +NOTE: To run any occ commands, you must first change to the directory containing the Compose YAML file. -After preparing the upgrade, you can decide between two ways of upgrading your instance: - -.Script-Guided Upgrade -This upgrade automates most of the tasks to be done including setting the correct ownership and permissions. - -.Manual Step-by-Step Upgrade -Using this type of upgrade, you have to do all the steps manually but you can also handle special setups. - -NOTE: In this description we assume that your ownCloud installation was located in the default directory: `/var/www/owncloud` and the new release will reside there as well. The path might differ, depending on your installation. +NOTE: Accessing the webroot of ownCloud needs extra compose configuration that is not covered here. == General Preparation @@ -28,20 +19,13 @@ There are several steps necessary before you can start with upgrading your ownCl === Enable Maintenance Mode -Put your server in xref:maintenance/enable_maintenance.adoc[maintenance mode] and *disable* xref:configuration/server/background_jobs_configuration.adoc#cron-jobs[Cron jobs]. -Doing so prevents new logins, locks the sessions of logged-in users, and displays a status screen so that users know what is happening. +Put your server in xref:maintenance/enable_maintenance.adoc[maintenance mode] and *disable* xref:configuration/server/background_jobs_configuration.adoc#cron-jobs[Cron jobs]. Doing so prevents new logins, locks the sessions of logged-in users, and displays a status screen so that users know what is happening. TIP: In a clustered environment, check that all nodes are in maintenance mode. === Prevent Browser Access -With those steps completed, stop your webserver to prevent users trying to access ownCloud via the web. As an alternative, you can stop serving the virtual host for ownCloud. - -Stop the web server: -[source,bash] ----- -sudo service apache2 stop ----- +In a production environment, there is a proxy in front of your ownCloud container which is internally running Apache. To prevent browser-based access to the embedded Apache web server via the proxy, you must take the necessary measures on the proxy. === Backup the Database @@ -49,10 +33,8 @@ First, backup ownCloud and the server database as described in section xref:main === Review Third-Party Apps -Review any installed third-party apps for compatibility with the new ownCloud release. -Ensure that they are all disabled before beginning the upgrade. -Third party apps are all apps that are not distributed by {oc-marketplace-url}/publishers/owncloud[ownCloud] -or not listed in xref:installation/apps_supported.adoc[Supported Apps in ownCloud]. +Review any installed third-party apps for compatibility with the new ownCloud release. Ensure that they are all disabled before beginning the upgrade. +Third party apps are all apps that are not distributed by {oc-marketplace-url}/publishers/owncloud[ownCloud] or not listed in xref:installation/apps_supported.adoc[Supported Apps in ownCloud]. . Disable Apps via Command Line + @@ -81,162 +63,82 @@ If you have made changes in `.htaccess` located at the webroot of ownCloud, you If you have made changes in `.user.ini` located at the webroot of ownCloud, you must backup these changes. -=== Download the Latest Release - -Download the latest {oc-complete-base-url}/{oc-complete-name}.tar.bz2[ownCloud Server release] to the same location where your previous instance is located, in this example the default directory `/var/www/`. - -[source,bash,subs="attributes+"] ----- -cd /var/www/ -sudo wget {oc-complete-base-url}/{oc-complete-name}.tar.bz2 ----- - -== Script-Guided Upgrade - -When using the script-guided upgrade, the script from the xref:installation/manual_installation/manual_installation.adoc#script-guided-installation[Script-Guided Installation] is used. This script can not only **install** a new instance of ownCloud, but also **upgrade** an existing one or can **manage ownership and permissions**. When using the script for upgrading, the script renames the current instance and creates a new instance, copies `config.php` set ownership and permissions etc. - -The script xref:installation/manual_installation/script_guided_install.adoc#script-questions[asks questions] and beside other parameters, the *upgrade an existing installation* question is selected. - -Follow the script documentation for details on how to install and use it. - -NOTE: The script is most convenient if you use links for your `apps-external` and your `data` directory, as it takes care of recreating the links. You will be asked about this when you run the script. If you're using regular directories, these are created, but content must be moved or copied manually before finalizing the upgrade. If you aren't using the `apps-external` directory, you must manually take care of copying only those apps which are not part of the new source. - -When the script has finished, continue with the xref:finalize-the-upgrade[Finalize the Upgrade] step described below. - -NOTE: When using the script, any manual changes in `.htaccess` or `.user.ini` must be manually transferred from the backup directory the script created to the actual instance directory. - -After the upgrade is finished, you can re-run this script to secure the `.htaccess` files. - -== Manual Step-by-Step Upgrade +=== Market and Marketplace App Upgrades -Note that this procedure is not an in-place upgrade but an upgrade to a new directory identically named as originally set. This ensures that no code or settings can get orphaned or overwritten. +The ownCloud image ships with all the apps provided by ownCloud. Any apps that have been installed manually and are not part of the image need to be treated separately. If an update is available, these apps will need to be manually updated once the upgrade is finished. -=== Move Current ownCloud Directory +=== Permissions -Although you have already made a backup, move your current ownCloud directory to a different location for easy later access: +ownCloud handles permissions and ownership, except when you add data manually, such as when you copy apps to the `/apps` folder or have added a configuration to the `/config` folder. Replace `` and `` in the following code examples accordingly. -This example assumes Ubuntu Linux and MariaDB, rename the ownCloud directory: +apps folder:: ++ +-- +* For the ownership use `www-data:root` ++ [source,bash] ---- -sudo mv /var/www/owncloud /var/www/backup_owncloud ----- - -=== Extract the New Source - -Extract the new server release in the location where your previous ownCloud installation used to be. - -[source,bash,subs="attributes+"] ----- -sudo tar -xf {oc-complete-name}.tar.bz2 +sudo chown -R www-data:root //apps ---- -=== Copy the data/ Directory - -If you keep your `data/` directory _inside_ your `owncloud/` directory and you have not linked it, move it from your old version of ownCloud to your new version: - +* For all files use `0644` ++ [source,bash] ---- -sudo mv /var/www/backup_owncloud/data /var/www/owncloud/data +sudo find -L //apps -type f -print0 | sudo xargs -0 chmod 644 ---- -If you have linked the data directory, for ownCloud it is still inside the `owncloud` directory and you have to re-link it. - -If you keep your `data` **outside** of your `owncloud` directory, then you don’t have to do anything with it, because its location is configured in your original `config.php`, and none of the upgrade steps touch it. - -=== Copy Relevant config.php Content - -With the new source files now in place of where the old ones used to be, copy all `\*config.php` and `*.json` files (if any exist) from your old ownCloud directory to your new ownCloud directory: - +* For all directories use `0751` ++ [source,bash] ---- -sudo cp /var/www/backup_owncloud/config/*config.php \ - /var/www/owncloud/config/ +sudo find -L //apps -type d -print0 | sudo xargs -0 chmod 751 ---- +-- +config folder:: ++ +-- +* For the ownership use `www-data:root` ++ [source,bash] ---- -sudo cp /var/www/backup_owncloud/config/*.json \ - /var/www/owncloud/config/ +sudo chown -R www-data:root //config ---- -=== Market and Marketplace App Upgrades - -Before getting too far into the upgrade process, consider how the Market app and its configuration options affect the upgrade process. The Market app — and other apps from the Marketplace — will not be updated when you upgrade ownCloud if `upgrade.automatic-app-update` is set to `false` in config.php. - -In addition, if there are installed apps (whether compatible or incompatible with the next version, or missing source code) and the Market app is enabled but there is no internet connection available, these apps will need to be manually updated once the upgrade is finished. - -=== Copy Old Apps - -If you are using third party or enterprise applications, look in your new `/var/www/owncloud/apps/` or `/var/www/owncloud/apps-external/` directory to see if they are present. If not, copy them from your old instance to your new one. - -NOTE: Make sure that all app directories that are defined in the `apps_paths` section of your `config.php` file do exist in your new `/var/www/owncloud/` directory. Also, make sure, that all app directories listed in `apps_path` actually exist. If `occ` complains about missing `apps-external` then try: - +* For your added config file(s) use `0644` ++ [source,bash] ---- -sudo mkdir /var/www/owncloud/apps-external +sudo chmod 644 //config/ ---- +-- -=== Permissions - -To finalize the preparation of the upgrade, you need to set the correct ownership and permissions of the new ownCloud files and folders. +== Finalize the Upgrade -.Set correct ownership -Set the ownership for all files and folders to `root:www-data` **except** the `config` and `data` directory: +=== Down the Container -[source,bash] ----- -sudo find -L /var/www/owncloud \ - \( -path ./data -o -path ./config \) -prune -o \ - -type d -print0 | sudo xargs -0 chown root:www-data ----- +Bring the container down by issuing the following command: -[source,bash] +[source,docker] ---- -sudo find -L /var/www/owncloud \ - \( -path ./data -o -path ./config \) -prune -o \ - -type f -print0 | sudo xargs -0 chown root:www-data +docker compose down --remove-orphans ---- -Set the ownership for all files and folders to `www-data:www-data` for the `config`, `data` and `apps` directories. Note that it is not mandatory to set the ownership of the `data/` directory as it should already have the correct ownership and it can take a while to finish, depending on the size: +=== Get the Latest Release -[source,bash] ----- -sudo chown -R www-data:www-data /var/www/owncloud/config -sudo chown -R www-data:www-data /var/www/owncloud/data -sudo chown -R www-data:www-data /var/www/owncloud/apps* ----- +To get the latest release of ownCloud, update the image version defined in the `.env` file located where the compose file is. -.Set correct permissions -Use `chmod` on files and directories with different permissions: - -* For all files use `0640` -+ -[source,bash] ----- -sudo find -L /var/www/owncloud -type f -print0 | sudo xargs -0 chmod 640 ----- +=== Start the Upgrade -* For all directories use `0750` -+ -[source,bash] ----- -sudo find -L /var/www/owncloud -type d -print0 | sudo xargs -0 chmod 750 ----- +Start your docker instance. This will now use the new ownCloud image: -* Set the occ command to executable: -+ -[source,bash] +[source,docker] ---- -sudo chmod +x /var/www/owncloud/occ +docker compose up -d ---- -If you have configured a script for xref:installation/manual_installation/script_guided_install.adoc[guided installations], you can use it for this step as well as it automates it. - -== Finalize the Upgrade - -=== Start the Upgrade - -With the apps disabled and ownCloud in maintenance mode, start the xref:configuration/server/occ_command.adoc#command-line-upgrade[upgrade process] from the command line. Note that the example is based on Ubuntu Linux. Execute this within the ownCloud root folder. +With the apps disabled and ownCloud in maintenance mode, start the xref:configuration/server/occ_command.adoc#command-line-upgrade[upgrade process] from the command line. [source,bash,subs="attributes+"] ---- @@ -253,7 +155,7 @@ The following example command eases to find the differences of two files, which [source,bash] ---- -diff -y -W 70 --suppress-common-lines owncloud/.user.ini owncloud_2022-02-15-09.18.48/.user.ini +diff -y -W 70 --suppress-common-lines owncloud/.user.ini owncloud_2026-02-15-09.18.48/.user.ini ---- [source,plaintext] @@ -263,9 +165,7 @@ post_max_size=513M | post_max_size=1G === Strong Permissions -* Check that `chmod` with `0640` for `.htaccess` and `.user.ini` files has been applied. - -If you have configured a script for xref:installation/manual_installation/script_guided_install.adoc[guided installations], you can use it for this step as well as it automates it. +* Check that `chmod` with `0640` for `.htaccess` and `.user.ini` files has been applied, if you have made changes to the files. === Disable Maintenance Mode @@ -276,18 +176,13 @@ Assuming your upgrade succeeded, disable maintenance mode using the occ command. {occ-command-example-prefix-docker} maintenance:mode --off ---- -=== Enable Browser Access - -With all that done, restart your web server, or alternatively re-enable the virtual host serving ownCloud: +=== Re-Enable Browser Access -[source,bash] ----- -sudo service apache2 start ----- +With all that done, re-enable access of the proxy web server to your ownCloud instance. === Check the Upgrade -With maintenance mode disabled and the web server running, log in via the web interface and perform the following steps: +With maintenance mode disabled and the proxy web server giving access to the ownCloud instance, log in via the web interface and perform the following steps: . Check that the version number reflects the new installation. + It can be reviewed at the bottom of menu:Settings[Admin > General]. diff --git a/modules/admin_manual/pages/maintenance/upgrading/upgrade.adoc b/modules/admin_manual/pages/maintenance/upgrading/upgrade.adoc index 706a39995..95d0f553f 100644 --- a/modules/admin_manual/pages/maintenance/upgrading/upgrade.adoc +++ b/modules/admin_manual/pages/maintenance/upgrading/upgrade.adoc @@ -14,7 +14,7 @@ Before beginning an upgrade, please keep the following points in mind: * Large installations may take several hours to complete the upgrade. -* Review any installed xref:maintenance/manual_upgrade.adoc#review-third-party-apps[third-party apps] for compatibility with the new ownCloud release. +* Review any installed xref:maintenance/upgrading/manual_upgrade.adoc#review-third-party-apps[third-party apps] for compatibility with the new ownCloud release. * Downgrading *is not supported* as it risks corrupting your data. If you want to revert to an older ownCloud version, make a new, fresh installation and then restore your data from backup. Before attempting this, file a support ticket (if you have paid support) or ask for help in the ownCloud forums to resolve your issue without downgrading. @@ -22,12 +22,12 @@ include::partial$maintenance/major_release_note.adoc[] == Prerequisites -We strongly recommend that you always maintain xref:maintenance/backup_and_restore/backup.adoc[regular backups] as well as make a fresh backup before every upgrade. We also recommend that you review any installed xref:maintenance/manual_upgrade.adoc#review-third-party-apps[third-party apps] for compatibility with the new ownCloud release. Ensure that they are all disabled before beginning the upgrade. After the upgrade is complete, enable all those that are compatible with the new release again. +We strongly recommend that you always maintain xref:maintenance/backup_and_restore/backup.adoc[regular backups] as well as make a fresh backup before every upgrade. We also recommend that you review any installed xref:maintenance/upgrading/manual_upgrade.adoc#review-third-party-apps[third-party apps] for compatibility with the new ownCloud release. Ensure that they are all disabled before beginning the upgrade. After the upgrade is complete, enable all those that are compatible with the new release again. CAUTION: Unsupported apps may disrupt your upgrade. == Upgrade Options -Perform a xref:maintenance/manual_upgrade.adoc[manual upgrade], using the https://owncloud.com/download-server/[latest ownCloud release]. +Perform a xref:maintenance/upgrading/manual_upgrade.adoc[manual upgrade], using the https://owncloud.com/download-server/[latest ownCloud release]. NOTE: Enterprise customers: refer to xref:enterprise/installation/install.adoc[Installing & Upgrading ownCloud Enterprise Edition] for more information. diff --git a/modules/admin_manual/pages/maintenance/upgrading/upgrade_php.adoc b/modules/admin_manual/pages/maintenance/upgrading/upgrade_php.adoc deleted file mode 100644 index b18c5547f..000000000 --- a/modules/admin_manual/pages/maintenance/upgrading/upgrade_php.adoc +++ /dev/null @@ -1,26 +0,0 @@ -= Upgrade PHP on RedHat 7 and CentOS 7 -:toc: right -:toclevels: 1 -:keywords: upgrade, red hat, centos -:description: Upgrade PHP to one of the supported PHP versions ({supported-php-versions}) on Red Hat and CentOS so that you can make the most out of your ownCloud installations. - -== Introduction - -You should almost always upgrade to the latest version of PHP supported by ownCloud, if and where possible. -And if you're on a version of PHP older than {minimum-php-printed} you *must* upgrade. -This guide takes you through upgrading your installation of PHP to one of the supported PHP versions ({supported-php-versions}) on Red Hat or CentOS 7. - -:from-version: 5.6 -:to-version: 7.4 -:to-pkg-version: 74 - -include::partial$/maintenance/upgrading/upgrade_steps.adoc[leveloffset=+1] - -== Restart Apache - -Finally, you need to restart Apache to make the changes permanent, as in the command below. - -[source,bash] ----- -service httpd restart ----- diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index 17c4e4ac4..dba030733 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -110,7 +110,6 @@ *** xref:admin_manual:maintenance/upgrading/upgrade.adoc[Upgrading] **** xref:admin_manual:maintenance/upgrading/manual_upgrade.adoc[Manual Upgrade] **** xref:admin_manual:maintenance/upgrading/database_upgrade.adoc[Database Upgrade] -**** xref:admin_manual:maintenance/upgrading/upgrade_php.adoc[Upgrading PHP] **** xref:admin_manual:maintenance/upgrading/marketplace_apps.adoc[Marketplace Apps] *** Backup and Restore **** xref:admin_manual:maintenance/backup_and_restore/backup.adoc[Backup] From 94ee8b0fd15be34d15c6757fd0bd2de5439c0330 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Tue, 19 May 2026 21:30:32 +0200 Subject: [PATCH 16/38] remove oracle and fix more stuff --- .../linux_database_configuration.adoc | 213 +++------------- .../server/config_sample_php_parameters.adoc | 41 ++-- .../core_commands/_maintenance_commands.adoc | 6 +- .../examples/configuration-file.php | 15 -- .../enterprise/installation/install.adoc | 74 ------ .../installation/oracle_db_configuration.adoc | 230 ------------------ .../deployment_considerations.adoc | 1 - .../deployment_recommendations/nfs.adoc | 4 +- .../installation/installing_with_docker.adoc | 46 +++- .../backup_and_restore/restore.adoc | 84 ++----- .../upgrading/database_upgrade.adoc | 42 +--- .../pages/maintenance/upgrading/upgrade.adoc | 8 - .../manual_installation/mariadb.adoc | 130 ---------- .../manual_installation/useful_tips.adoc | 168 ------------- .../maintenance/major_release_note.adoc | 56 ----- .../maintenance/upgrading/upgrade_steps.adoc | 79 ------ modules/admin_manual/partials/nav.adoc | 3 - .../pages/app/fundamentals/database.adoc | 11 +- .../pages/app/fundamentals/info.adoc | 2 +- .../pages/testing/unit-testing.adoc | 56 ++--- 20 files changed, 152 insertions(+), 1117 deletions(-) delete mode 100644 modules/admin_manual/pages/enterprise/installation/examples/configuration-file.php delete mode 100644 modules/admin_manual/pages/enterprise/installation/install.adoc delete mode 100644 modules/admin_manual/pages/enterprise/installation/oracle_db_configuration.adoc delete mode 100644 modules/admin_manual/partials/installation/manual_installation/mariadb.adoc delete mode 100644 modules/admin_manual/partials/installation/manual_installation/useful_tips.adoc delete mode 100644 modules/admin_manual/partials/maintenance/major_release_note.adoc delete mode 100644 modules/admin_manual/partials/maintenance/upgrading/upgrade_steps.adoc diff --git a/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc b/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc index ed9a2b57a..df80c2658 100644 --- a/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc +++ b/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc @@ -9,51 +9,32 @@ :mysql-binary-log-overview-url: https://dev.mysql.com/doc/refman/5.6/en/binary-log.html :mariadb-docs-url: https://mariadb.com/kb/en/ :mysql-docs-url: https://dev.mysql.com/doc/ -:oracle-docs-url: https://docs.oracle.com/en/database/oracle/oracle-database/index.html :postgresql-docs-url: https://www.postgresql.org/docs/manuals/ == Introduction -ownCloud requires a database in which administrative data is stored. -The following databases are currently supported: +ownCloud requires a database in which administrative data is stored. The following databases are currently supported: * xref:mysql-mariadb[MySQL / MariaDB] * xref:postgresql[PostgreSQL] -* xref:enterprise/installation/oracle_db_configuration.adoc[Oracle (_ownCloud Enterprise edition only_)] -NOTE: The MySQL or MariaDB databases are the recommended database engines. - -IMPORTANT: After physically installing ownCloud, the setup of the owncloud database is either -done with the xref:installation/installation_wizard.adoc[installation wizard] or via the -command line. For more information see the -xref:installation/manual_installation/manual_installation.adoc#complete-the-installation[Complete the Installation] -section in the Manual Installation documentation. +NOTE: MySQL or MariaDB databases are the recommended database engines. == Requirements -Choosing to use MySQL / MariaDB, PostgreSQL, or Oracle as your database requires, -that you install and set up the server software first. - -TIP: Oracle users, see -xref:enterprise/installation/oracle_db_configuration.adoc[the Oracle Database Configuration guide]. +Choosing to use MySQL / MariaDB or PostgreSQL as your database requires, that you install and set up the server software first. -The steps for configuring a third party database are beyond the scope of this document. -Please refer to the documentation below, for your database vendor. +The steps for configuring a third party database are beyond the scope of this document. Please refer to the documentation below, for your database vendor. * The {mariadb-docs-url}[MariaDB Knowledge Base] * The {mysql-docs-url}[MySQL documentation] -* The {oracle-docs-url}[Oracle Database documentation] * The {postgresql-docs-url}[PostgreSQL documentation] === MySQL / MariaDB ==== Enabling Binary Logging -ownCloud is currently using a `TRANSACTION_READ_COMMITTED` transaction isolation to avoid -data loss under high load scenarios (e.g., by using the sync client with many -clients/users and many parallel operations). This requires a disabled or correctly configured -binary logging when using MySQL or MariaDB. Your system is affected if you see the following -in your log file during the installation or update of ownCloud: +ownCloud is currently using a `TRANSACTION_READ_COMMITTED` transaction isolation to avoid data loss under high load scenarios (e.g., by using the sync client with many clients/users and many parallel operations). This requires a disabled or correctly configured binary logging when using MySQL or MariaDB. Your system is affected if you see the following in your log file during the installation or update of ownCloud: [source,plaintext] ---- @@ -64,51 +45,32 @@ There are two solutions: * One is to disable binary logging. Binary logging records all changes to your database, and how long each change took. The purpose of binary logging is to enable replication and to support backup operations. -* The other is to change the BINLOG_FORMAT = STATEMENT in your database configuration file, -or possibly in your database startup script, to BINLOG_FORMAT = MIXED or BINLOG_FORMAT = ROW. -See {mariadb-binary-log-overview-url}[Overview of the Binary Log] and -{mysql-binary-log-overview-url}[The Binary Log] for detailed information. +* The other is to change the BINLOG_FORMAT = STATEMENT in your database configuration file, or possibly in your database startup script, to BINLOG_FORMAT = MIXED or BINLOG_FORMAT = ROW. See {mariadb-binary-log-overview-url}[Overview of the Binary Log] and {mysql-binary-log-overview-url}[The Binary Log] for detailed information. ==== Set `READ COMMITTED` as the Transaction Isolation Level -As discussed above, ownCloud is using the `TRANSACTION_READ_COMMITTED` transaction isolation -level. Some database configurations are enforcing other transaction isolation levels. -To avoid data loss under high load scenarios (e.g., by using the sync client with many -clients/users and many parallel operations), you need to configure the transaction isolation -level accordingly. Please refer to the {mysql-set-transaction-url}[MySQL manual] -for detailed information. +As discussed above, ownCloud is using the `TRANSACTION_READ_COMMITTED` transaction isolation level. Some database configurations are enforcing other transaction isolation levels. To avoid data loss under high load scenarios (e.g., by using the sync client with many clients/users and many parallel operations), you need to configure the transaction isolation level accordingly. Please refer to the {mysql-set-transaction-url}[MySQL manual] for detailed information. ==== Configuring the Storage Engine -Since ownCloud 7, only InnoDB is supported as a storage engine. -Some shared hosts do not support InnoDB and only MyISAM. -Running ownCloud in such an environment is not supported. +Since ownCloud 7, only InnoDB is supported as a storage engine. Some shared hosts do not support InnoDB and only MyISAM. Running ownCloud in such an environment is not supported. == Parameters -For setting up ownCloud to use any database, use the instructions in -xref:installation/installation_wizard.adoc[the Installation Wizard]. -You should not have to edit the respective values in the `config/config.php`. -However, in exceptional cases (for example, if you want to connect your ownCloud instance -to a database created by a previous installation of ownCloud), some modification might -be required. +For setting up ownCloud to use any database, use the instructions in xref:installation/installing_with_docker.adoc[Installing With Docker]. +You should not have to edit the respective values in the ownCloud config. However, in exceptional cases, for example, if you want to connect your ownCloud instance to a database created by a previous installation of ownCloud, some modification might be required. === MySQL / MariaDB -If you decide to use a MySQL or MariaDB database, ensure the following: - -* That you have installed and enabled the `pdo_mysql` extension in PHP. -* That the `mysql.default_socket` points to the correct socket (if the database runs on - the same server as ownCloud). +MariaDB is backward compatible with MySQL. All instructions work for both, so you will not need to replace or revise any existing MySQL client commands. -MariaDB is backward compatible with MySQL. -All instructions work for both, so you will not need to replace or revise any existing -MySQL client commands. The PHP configuration in -`/etc/php/{recommended-php-version}/apache2/conf.d/20-mysql.ini` could look like this: +//// +The PHP configuration in `/etc/php//apache2/conf.d/20-pdo_mysql.ini` could look like this: [source,ini] ---- -# configuration for PHP MySQL module +; configuration for php mysql module +; priority=20 extension=pdo_mysql.so [mysql] @@ -125,12 +87,9 @@ mysql.default_password= mysql.connect_timeout=60 mysql.trace_mode=Off ---- +//// -An ownCloud instance configured with MySQL would contain the hostname on which the database -is running, a valid username and password to access it, and the name of the database. The -`config/config.php` as created by the -xref:installation/installation_wizard.adoc[installation wizard] -would therefore contain entries like this: +An ownCloud instance configured with MySQL would contain the hostname on which the database is running, a valid username and password to access it, and the name of the database. The config as created by the xref:installation/installation_wizard.adoc[installation wizard] would therefore contain entries like this: [source,php] ---- @@ -146,8 +105,7 @@ would therefore contain entries like this: ==== Configure MySQL for 4-byte Unicode Support -For supporting such features as emoji, both MySQL (or MariaDB) *and* ownCloud need to be -capable of using 4-byte Unicode instead of the default 3-byte and configured accordingly. +For supporting such features as emoji, both MySQL (or MariaDB) *and* ownCloud need to be capable of using 4-byte Unicode instead of the default 3-byte and configured accordingly. [NOTE] ==== @@ -195,9 +153,7 @@ When this is done, tables will be created with: [TIP] ==== -For more information, please either refer to -xref:configuration/server/config_sample_php_parameters.adoc[config.sample.php], -or have a read through the following links: +For more information, please either refer to xref:configuration/server/config_sample_php_parameters.adoc[config.sample.php], or have a read through the following links: * https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_large_prefix * https://mariadb.com/kb/en/library/innodb-system-variables/#innodb_large_prefix @@ -209,17 +165,16 @@ or have a read through the following links: === PostgreSQL -If you decide to use a PostgreSQL database, make sure that you have installed and enabled the -{php-net-url}/manual/en/book.pgsql.php[PostgreSQL extension] and the -{php-net-url}/manual/en/ref.pdo-pgsql.php[PostgreSQL PDO extension] in PHP. The PHP -configuration in `/etc/php/{recommended-php-version}/apache2/conf.d/20-pgsql.ini` +//// +If you decide to use a PostgreSQL database, make sure that you have installed and enabled the {php-net-url}/manual/en/book.pgsql.php[PostgreSQL extension] and the +{php-net-url}/manual/en/ref.pdo-pgsql.php[PostgreSQL PDO extension] in PHP. The PHP configuration in `/etc/php//apache2/conf.d/20-pdo_pgsql.ini` could look like this: [source,bash] ---- -# configuration for PHP PostgreSQL module +; configuration for php pgsql module +; priority=20 extension=pdo_pgsql.so -extension=pgsql.so [PostgresSQL] pgsql.allow_persistent = On @@ -232,9 +187,7 @@ pgsql.log_notice = 0 [TIP] ==== -The default configuration for PostgreSQL (at least in Ubuntu 14.04) is to use the peer -authentication method. Check `/etc/postgresql/9.3/main/pg_hba.conf` to find out which -authentication method is used in your setup. +The default configuration for PostgreSQL (at least in Ubuntu 14.04) is to use the peer authentication method. Check `/etc/postgresql/9.3/main/pg_hba.conf` to find out which authentication method is used in your setup. ==== To start the PostgreSQL command-line mode use: @@ -244,19 +197,15 @@ To start the PostgreSQL command-line mode use: sudo -u postgres psql -d template1 ---- -Then a `template1=\#` prompt will appear. You can now enter your commands as required. When -finished, you can quit the prompt by entering: +Then a `template1=\#` prompt will appear. You can now enter your commands as required. When finished, you can quit the prompt by entering: [source,psql] ---- \q ---- +//// -An ownCloud instance configured with PostgreSQL will contain the hostname on which the -database is running, a valid username and password to access it, and the name of the -database. The `config/config.php` as created by -xref:installation/installation_wizard.adoc[the Installation Wizard] -would contain entries like this: +An ownCloud instance configured with PostgreSQL will contain the hostname on which the database is running, a valid username and password to access it, and the name of the database. The config as created by xref:installation/installing_with_docker.adoc[Installing With Docker] would contain entries like this: [source,php] ---- @@ -274,93 +223,9 @@ would contain entries like this: === How to Workaround General Error: 2006 MySQL Server Has Gone Away -The database request takes too long, and therefore the MySQL server times out. It's also -possible that the server is dropping a packet that is too large. Please refer to the manual -of your database for how to raise the configuration options `wait_timeout` and/or -`max_allowed_packet`. - -Some shared hosts are not allowing access to these config options. For such systems, -ownCloud is providing a `dbdriveroptions` configuration option within your `config/config.php` -where you can pass such options to the database driver. Please refer to -xref:configuration/server/config_sample_php_parameters.adoc[the sample PHP configuration parameters] -for an example. - -=== How Can I Find Out If My MySQL/PostgreSQL Server Is Reachable? - -To check the server’s network availability, use the ping command on the server's hostname -(`db.server.com` in this example): - -[source,bash] ----- -ping db.server.com - -PING db.server.com (ip-address) 56(84) bytes of data. -64 bytes from your-server.local.lan (192.168.1.10): icmp_req=1 ttl=64 time=3.64 ms -64 bytes from your-server.local.lan (192.168.1.10): icmp_req=2 ttl=64 time=0.055 ms -64 bytes from your-server.local.lan (192.168.1.10): icmp_req=3 ttl=64 time=0.062 ms ----- - -For a more detailed check whether the access to the database server software itself works -correctly, see the next question. - -=== How Can I Find Out If a Created User Can Access a Database? - -The easiest way to test if a database can be accessed is by starting the command-line interface: +The database request takes too long, and therefore the MySQL server times out. It's also possible that the server is dropping a packet that is too large. Please refer to the manual of your database for how to raise the configuration options `wait_timeout` and/or `max_allowed_packet`. -==== MySQL - -Assuming the database server is installed on the same system you’re running the command -from, use: - -[source,bash] ----- -mysql -uUSERNAME -p ----- - -To access a MySQL installation on a different machine, add the -h option with the -respective hostname: - -[source,bash] ----- -mysql -uUSERNAME -p -h HOSTNAME ----- - -[source,mysql] ----- -mysql> SHOW VARIABLES LIKE "version"; -+---------------+--------+ -| Variable_name | Value | -+---------------+--------+ -| version | 5.1.67 | -+---------------+--------+ -1 row in set (0.00 sec) -mysql> quit ----- - -==== PostgreSQL - -Assuming the database server is installed on the same system you’re running the command -from, use: - -[source,psql] ----- -psql -Uusername -downcloud ----- - -To access a PostgreSQL installation on a different machine, add the `-h` option with the applicable hostname: - -[source,psql] ----- -psql -Uusername -downcloud -h HOSTNAME ----- - -[source,psql] ----- -postgres=# SELECT version(); -PostgreSQL 8.4.12 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 4.1.3 20080704 (prerelease), 32-bit -(1 row) -postgres=# \q ----- +Some shared hosts are not allowing access to these config options. For such systems, ownCloud is providing a `dbdriveroptions` configuration option within your `config/config.php` where you can pass such options to the database driver. Please refer to the xref:configuration/server/config_sample_php_parameters.adoc[sample PHP configuration parameters] for an example. === Useful SQL Commands @@ -417,24 +282,14 @@ SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get l ==== Explanation -This error occurs when two transactions write and commit to the same rows in separate -cluster nodes. Only one of them can successfully commit. The failing one will be aborted. -For cluster level aborts, Galera Cluster returns a deadlock error. +This error occurs when two transactions write and commit to the same rows in separate cluster nodes. Only one of them can successfully commit. The failing one will be aborted. For cluster level aborts, Galera Cluster returns a deadlock error. ==== Solution -The solution, for Galera Cluster, would be to send all write requests to a single DB node, -instead of all of them. Here is {avoid-deadlocks-galery-haproxy-url}[a useful guide], -when using {haproxy-url}[HAProxy]. +The solution, for Galera Cluster, would be to send all write requests to a single DB node, instead of all of them. Here is {avoid-deadlocks-galery-haproxy-url}[a useful guide], when using {haproxy-url}[HAProxy]. -The same concept applies when {maxscale-url}[MaxScale] is used as a DB proxy. It needs to be -configured to send all write requests to a single DB node instead all of them and balance -read statements across the rest of the nodes. Here is -{maxscale-readwrite-splitting-with-galera-cluster-url}[a useful guide] -on how to configure MaxScale with Read/Write splitting. +The same concept applies when {maxscale-url}[MaxScale] is used as a DB proxy. It needs to be configured to send all write requests to a single DB node instead all of them and balance read statements across the rest of the nodes. Here is {maxscale-readwrite-splitting-with-galera-cluster-url}[a useful guide] on how to configure MaxScale with Read/Write splitting. ==== Enabling Causality Checks -Additionally, to solve this issue, when using Galera Cluster, customers should try to set -`wsrep_sync_wait=1`. When enabled, the node triggers causality checks in response to certain -types of queries. This is disabled by default. +Additionally, to solve this issue, when using Galera Cluster, customers should try to set `wsrep_sync_wait=1`. When enabled, the node triggers causality checks in response to certain types of queries. This is disabled by default. diff --git a/modules/admin_manual/pages/configuration/server/config_sample_php_parameters.adoc b/modules/admin_manual/pages/configuration/server/config_sample_php_parameters.adoc index 2aff529c9..8ed38ffaa 100644 --- a/modules/admin_manual/pages/configuration/server/config_sample_php_parameters.adoc +++ b/modules/admin_manual/pages/configuration/server/config_sample_php_parameters.adoc @@ -172,7 +172,6 @@ Available: - sqlite (SQLite3 - Not in Enterprise Edition) - mysql (MySQL/MariaDB) - pgsql (PostgreSQL) -- oci (Oracle - Enterprise Edition Only) ==== Code Sample @@ -637,7 +636,7 @@ You may need to increase this if you are running an anti-malware or spam scanner .... === Define the SMTP security style -Depends on `mail_smtpmode`. Specify when you are using `ssl` or `tls`. +Depends on `mail_smtpmode`. Specify when you are using `ssl` or not. Leave empty for no encryption. @@ -658,17 +657,6 @@ Depends on `mail_smtpmode`. Change this to `true` if your mail server requires a 'mail_smtpauth' => false, .... -=== Define the SMTP authentication type -Depends on `mail_smtpmode`. If SMTP authentication is required, -choose the authentication type as `LOGIN` (default) or `PLAIN`. - -==== Code Sample - -[source,php] -.... -'mail_smtpauthtype' => 'LOGIN', -.... - === Define the SMTP authentication username Depends on `mail_smtpauth`. Specify the username for authenticating to the SMTP server. @@ -820,7 +808,7 @@ Note that the above rule is not valid in every case, as there are some rare setu cases where this may not apply. However, to avoid any update problems this configuration value is explicitly opt-in. -After setting this value run `{occ-command-example-prefix-docker} maintenance:update:htaccess`. Now, when the +After setting this value run `{occ-command-example-prefix} maintenance:update:htaccess`. Now, when the following conditions are met ownCloud URLs won't contain `index.php`: - `mod_rewrite` is installed @@ -1069,6 +1057,15 @@ Is ownCloud connected to the Internet or running in a closed network? 'has_internet_connection' => true, .... +=== The following URL is used to detect internet connectivity. + +==== Code Sample + +[source,php] +.... +'internet_connectivity_detect_url' => 'https://detectportal.firefox.com/success.txt', +.... + === Check for a `.well-known` setup Allows ownCloud to verify a working .well-known URL redirect. @@ -1850,7 +1847,7 @@ and MySQL can handle 4 byte characters instead of 3 byte characters. If you want to convert an existing 3-byte setup into a 4-byte setup please set the parameters in MySQL as mentioned below and run the migration command: -`{occ-command-example-prefix-docker} db:convert-mysql-charset` +`{occ-command-example-prefix} db:convert-mysql-charset` The config setting will be set automatically after a successful run. Consult the documentation for more details. @@ -1907,7 +1904,6 @@ Available: - sqlite (SQLite3 - Not in Enterprise Edition) - mysql (MySQL) - pgsql (PostgreSQL) -- oci (Oracle - Enterprise Edition Only) ==== Code Sample @@ -1917,7 +1913,6 @@ Available: 'sqlite', 'mysql', 'pgsql', - 'oci', ], .... @@ -2310,6 +2305,16 @@ The web based updater is enabled by default. 'upgrade.disable-web' => false, .... +=== Explicitly enable the web updater - used by /updater/ +By default, it is disabled. + +==== Code Sample + +[source,php] +.... +'web-updater.enabled' => false, +.... + === Define whether to enable automatic update of market apps Set to `false` to disable. @@ -2341,7 +2346,7 @@ We strongly encourage you never to use it in production. === Define the data-fingerprint of the current data served This is a property used by the clients to find out if a backup has been restored on the server. Once a backup is restored run -{occ-command-example-prefix-docker} maintenance:data-fingerprint +{occ-command-example-prefix} maintenance:data-fingerprint To set this to a new value. Updating/Deleting this value can make connected clients stall until diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_maintenance_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_maintenance_commands.adoc index e8f3b14a1..2baf00942 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_maintenance_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_maintenance_commands.adoc @@ -53,11 +53,7 @@ The `maintenance:install` command supports the following options: | `--database`=DATABASE | Supported database type. [default: `sqlite`] + -Possible values: `sqlite` ,`mysql`, `pgsql`, `oci` + -Note that `oci` (Oracle) is only available with the Enterprise license. - -| `--database-connection-string`=DATABASE-CONNECTION-STRING -| Oracle specific connection string. As soon as this parameter is provided, other parameters like database-host and database-name are not used and do not need to be provided. +Possible values: `sqlite` ,`mysql` and `pgsql` | `--database-name`=DATABASE-NAME | Name of the database. diff --git a/modules/admin_manual/pages/enterprise/installation/examples/configuration-file.php b/modules/admin_manual/pages/enterprise/installation/examples/configuration-file.php deleted file mode 100644 index 9ce7448e5..000000000 --- a/modules/admin_manual/pages/enterprise/installation/examples/configuration-file.php +++ /dev/null @@ -1,15 +0,0 @@ - 'abcdefgh', - 'passwordsalt' => '01234567890123456789', - 'datadirectory' => '/var/data', - 'dbtype' => 'oci', - 'version' => '8.2.x.y', - 'dbname' => 'orcl', - 'dbhost' => '192.168.1.57', - 'dbtableprefix' => 'oc_', - 'dbuser' => 'owncloud1', - 'dbpassword' => '********', - 'installed' => true, -]; diff --git a/modules/admin_manual/pages/enterprise/installation/install.adoc b/modules/admin_manual/pages/enterprise/installation/install.adoc deleted file mode 100644 index 22015afa5..000000000 --- a/modules/admin_manual/pages/enterprise/installation/install.adoc +++ /dev/null @@ -1,74 +0,0 @@ -= Installing & Upgrading ownCloud Enterprise Edition -:toc: right -:page-aliases: go/admin-enterprise-license.adoc - -== Introduction - -After you have completed your initial installation of ownCloud as detailed in the README, -follow the instructions in xref:installation/installation_wizard.adoc[The Installation Wizard] -to finish setting up ownCloud. To upgrade your Enterprise server, refer to -xref:maintenance/upgrade.adoc[How to Upgrade Your ownCloud Server]. - -== Manual Installation - -Download the ownCloud archive from your account at -https://customer.owncloud.com/owncloud, then follow the instructions at -xref:installation/manual_installation/manual_installation.adoc[Manual Installation on Linux]. - -=== SELinux - -Linux distributions that use SELinux need to take some extra steps so -that ownCloud will operate correctly under SELinux. Please see -xref:installation/selinux_configuration.adoc[SELinux Configuration] for some recommended -configurations. - -== License Keys - -=== Introduction - -You need to install a license key to use ownCloud Enterprise Edition. -There are two types of license keys: one is a free 30-day trial key. The -other is a full license key for Enterprise customers. - -You can https://owncloud.com/download/[download and try ownCloud Enterprise for 30 days for free], -which auto-generates a free 30-day key. When this key expires your ownCloud installation is not removed, so -if you become an Enterprise customer you can enter your new key to -regain access. See https://owncloud.com/how-to-buy-owncloud/[How to Buy ownCloud] -for sales and contact information. - -=== Configuration - -Once you get your Enterprise license key, it needs to be copied to your -ownCloud configuration file `config/config.php` like in this example: - -[source,php] ----- -'license-key' => 'test-20150101-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-YYYYYY', ----- - -It is also possible to activate your Enterprise Edition on the webUI. Open owncloud and navigate to: -menu:Settings[Admin > General]. Copy your license key into the field `Enter a new license:` and click `Save` to confirm. - -Each running instance of ownCloud requires a license key. Keys will work -across upgrades without issue, so new keys will not be required when you -upgrade your ownCloud Enterprise to a new version. - -TIP: if you want to remove the current license, open ownCloud and navigate to menu:Settings[Admin > General] and click btn:[Remove current license key]. - -=== User Counting - -Your ownCloud Enterprise License Key is valid for the purchased amount of users, as per the ownCloud EULA - ownCloud Commercial License. -When you generate a config.report, you will get: - -* a counting of the enabled users, -* the ownCloud guest users -- if the guest app is enabled and -* the number of user directories created. - -The latter is the user number you will need licenses for. Guest users are currently counted with a fair use policy -- which means, that you can't have more guest users than you have licensed users. If you exceed the number of licensed users, please contact your account manager or ownCloud Partner and true-up as per your contract or EULA with us. -The user directories are created on first login. When a user is deleted, the user directories are deleted as well. Users which are disabled count. The last login is not relevant. - -== Supported ownCloud Enterprise Edition Apps - -See xref:installation/apps_supported.adoc[Supported Apps in ownCloud] for a list of supported apps. - -NOTE: 3rd party and unsupported apps must be disabled before performing a system upgrade. Then install the upgraded versions, and after the upgrade is complete re-enable them. diff --git a/modules/admin_manual/pages/enterprise/installation/oracle_db_configuration.adoc b/modules/admin_manual/pages/enterprise/installation/oracle_db_configuration.adoc deleted file mode 100644 index 5d1f7a62e..000000000 --- a/modules/admin_manual/pages/enterprise/installation/oracle_db_configuration.adoc +++ /dev/null @@ -1,230 +0,0 @@ -= Oracle Database Setup & Configuration -:toc: right -:php_oci8_url: https://pecl.php.net/package/oci8 -:ubuntu_community_guide_url: https://help.ubuntu.com/community/Oracle%20Instant%20Client - -== Introduction - -This document will cover the setup and preparation of the ownCloud -server to support the use of Oracle as a backend database. - -== Outline of Steps - -This document will cover the following steps: - -* Setup of the ownCloud user in Oracle: This involves setting up a user -space in Oracle for setting up the ownCloud database. -* Installing the Oracle Instant Client on the Web server (facilitating -the connection to the Oracle Database). -* Compiling and installing the Oracle PHP Plugin oci8 module -* Pointing ownCloud at the Oracle database in the initial setup process - -The document assumes that you already have your Oracle instance running, -and have provisioned the needed resources. It also assumes that you have -installed ownCloud with all of the prerequisites. - -== Configuring Oracle - -=== Setting up the User Space for ownCloud - -Step one, if it has not already been completed by your -DBA (DataBase Administrator), provision a user space on the Oracle -instance for ownCloud. This can be done by logging in as a DBA and -running the script below: - -[source,sql] ----- -CREATE USER owncloud IDENTIFIED BY password; -ALTER USER owncloud DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA unlimited ON users; -GRANT create session, create table, create procedure, create sequence, create trigger, create view, create synonym, alter session TO owncloud; ----- - -Substitute an actual password for `password`. Items like _TableSpace_, -_Quota_ etc., will be determined by your DBA (database administrator). - -=== Add OCI8 Client Packages - -Installation of the OCI8 client is dependent on your distribution. Given -that, please use the relevant section below to find the relevant -instructions to install the client. - -==== Ubuntu - -If you’re using Ubuntu, we recommend that you use this very thorough guide to install the {ubuntu_community_guide_url}[Oracle Instant Client] (OCI8) extension from the Ubuntu Community Wiki. - -NOTE: This _should_ work for other Debian-based distributions too, however your mileage may vary. - -==== RedHat / Centos / Fedora - -To install the OCI8 extension on a RedHat-based distribution, you first -need to download two Oracle Instant Client packages: - -* Instant Client Package - Basic (`oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm`) -* Instant Client Package - SDK (`oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm`) - -Then, to install them, use the following commands: - -[source,bash] ----- -rpm --install oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm \ - oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm ----- - -=== Install the OCI8 PHP Extension - -With the Oracle packages installed you’re now ready to install PHP’s {php_oci8_url}[OCI8] extension, where you have to specify the correct OCI8 version. For PHP7.x use `oci8-2.2.0` - -NOTE: Provide: `instantclient,/usr/lib/oracle/12.2/client64/lib` when requested, or let it auto-detect the location, if possible. - -[source,bash] ----- -sudo pecl install oci8-2.2.0 ----- - -With the extension installed, you now need to configure it, by creating -a configuration file for it. You can do so using the command below, -substituting `FILE_PATH` with one from the list below the command. - -[source,bash] ----- -cat << EOF > FILE_PATH -; Oracle Instant Client Shared Object extension -extension=oci8.so -EOF ----- - -==== Configuration File Paths - -Debian & Ubuntu -+++++++++++++++ - -[cols=",",options="header",] -|=== -| PHP Version -| Filename -| {minimum-php-printed} -| `/etc/php/{minimum-php-version}/apache2/conf.d/20-oci.ini` -|=== - -RedHat, Centos, & Fedora -++++++++++++++++++++++++ - -[cols=",",options="header",] -|=== -| PHP Version -| Filename -| {minimum-php-printed} -|`/etc/opt/rh/rh-php{minimum-php-version-short-code}/php.d/20-oci8.ini` -|=== - -=== Validating the Extension - -With all that done, confirm that it’s been installed and available in -your PHP distribution, run the following command: - -[source,bash] ----- -php -m | grep -i oci8 ----- - -When the process has completed, assuming that you don’t encounter any -errors, restart Apache and the extension is ready to use. - -== Configure ownCloud - -The next step is to configure the ownCloud instance to point to the -Oracle Database, again this document assumes that ownCloud has -previously been installed. - -=== Configuration Wizard - -image:oracle-1.png[image,width=554,height=711] - -==== Database user - -This is the user space created in step 2.1. In our Example this would be -owncloud. - -==== Database password - -Again this is defined in the script from section 2.1 above, or -pre-configured and provided to you by your DBA. - -==== Database Name - -Represents the database or the service that has been pre-configured on -the TSN Listener on the Database Server. This should also be provided by -the DBA. In this example, the default setup in the Oracle install was -orcl (there is a TSN Listener entry for orcl on our database server). - -This is not like setting up with MySQL or SQL Server, where a database -based on the name you give is created. The oci8 code will call this -specific service and it must be active on the TSN Listener on your -Oracle Database server. - -==== Database Table Space - -Provided by the DBA. In this example the users table space (as is seen -in the user creation script above), was used. - -=== Configuration File - -Assuming all of the steps have been followed to completion, the first -run wizard should complete successfully, and an operating instance of -ownCloud should appear. - -The configuration file should look something like this: - -=== Useful SQL Commands - -*Is my Database Reachable?* - -On the machine where your Oracle database is installed, type: - -[source,bash] ----- -sqlplus username ----- - -[source,sql] ----- -SQL> select * from v$version; - -BANNER --------------------------------------------------------------------------------- -Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production -PL/SQL Release 11.2.0.2.0 - Production -CORE 11.2.0.2.0 Production -TNS for Linux: Version 11.2.0.2.0 - Production -NLSRTL Version 11.2.0.2.0 - Production - -SQL> exit ----- - -*Show Database Users*: - -[source,sql] ----- -Oracle : SELECT * FROM all_users; ----- - -*Show available Databases*: - -[source,sql] ----- -Oracle : SELECT name FROM v$database; (requires DBA privileges) ----- - -*Show ownCloud Tables in Database*: - -[source,sql] ----- -Oracle : SELECT table_name FROM user_tables; ----- - -*Quit Database*: - -[source,sql] ----- -Oracle : quit ----- diff --git a/modules/admin_manual/pages/installation/deployment_considerations.adoc b/modules/admin_manual/pages/installation/deployment_considerations.adoc index 8cc269c4e..d040494bc 100644 --- a/modules/admin_manual/pages/installation/deployment_considerations.adoc +++ b/modules/admin_manual/pages/installation/deployment_considerations.adoc @@ -69,7 +69,6 @@ What about the other DBMS? * Sqlite is adequate for simple testing, and for low-load single-user deployments. It is not adequate for production systems. * Microsoft SQL Server is not a supported option. -* Oracle DB is the de facto standard at large enterprises and is fully supported with ownCloud Enterprise Edition only. == Storage diff --git a/modules/admin_manual/pages/installation/deployment_recommendations/nfs.adoc b/modules/admin_manual/pages/installation/deployment_recommendations/nfs.adoc index f7bad0ea1..759914f24 100644 --- a/modules/admin_manual/pages/installation/deployment_recommendations/nfs.adoc +++ b/modules/admin_manual/pages/installation/deployment_recommendations/nfs.adoc @@ -3,8 +3,8 @@ :toclevels: 1 :keywords: nfs, network file system, nfsv4, mtu, async, noasync :description: This guide covers the official ownCloud NFS (Network File System) deployment recommendations. + :autofs-url: https://help.ubuntu.com/community/Autofs -:lockd-url: https://docs.oracle.com/cd/E19455-01/806-0916/rfsrefer-9/index.html :mount-man-page-url: http://man7.org/linux/man-pages/man8/mount.8.html :netplan-docs-url: https://netplan.io/reference :networkmanager-url: https://help.ubuntu.com/community/NetworkManager @@ -97,7 +97,7 @@ Any tuning considerations should therefore first be attempted on the backend sto ownCloud recommends using NFSv4 over previous versions for a number of key reasons. These are: -* *Improved Security:* It {nfs-strong-security-architecture-url}[mandates a strong security architecture]. It does not require {rpc-statd-url}[rpc.statd] or {lockd-url}[lockd]. As a result, it only uses port 2049. +* *Improved Security:* It {nfs-strong-security-architecture-url}[mandates a strong security architecture]. It does not require {rpc-statd-url}[rpc.statd]. As a result, it only uses port 2049. * *Improved Reliability:* Uses TCP by default. * *Improved Performance:* It uses Multi-Component Messages, which reduce network traffic. It is capable of using a 32KB page size, compared to the default, 1024 bytes. * Use of {nfs-read-write-delegations-url}[Read/Write Delegations]. diff --git a/modules/admin_manual/pages/installation/installing_with_docker.adoc b/modules/admin_manual/pages/installation/installing_with_docker.adoc index b9d0477cb..3ca637055 100644 --- a/modules/admin_manual/pages/installation/installing_with_docker.adoc +++ b/modules/admin_manual/pages/installation/installing_with_docker.adoc @@ -1,6 +1,7 @@ = Installing with Docker :toc: right :description: ownCloud can be installed using the official ownCloud Docker image. +:page-aliases: enterprise/installation/install.adoc :dockerhub-url: https://hub.docker.com/r/owncloud/server :docker-compose-url: https://docs.docker.com/compose/ @@ -129,7 +130,7 @@ include::example$installation/docker/docker-compose.yml[] [#env-file] [source,bash,subs="attributes+"] ---- -OWNCLOUD_IMAGE=10.16.2 +OWNCLOUD_IMAGE={latest-server-download-version} OWNCLOUD_DOMAIN=localhost OWNCLOUD_TRUSTED_DOMAINS=localhost OWNCLOUD_OVERWRITE_CLI_URL=http://localhost @@ -299,6 +300,48 @@ mount_point/ For more and important details see: xref:installation/mount_folder_structure.adoc[Mount Folder Structure]. +== Enterprise License Keys + +An Enterprise license keys can be added by: + +* Using an environment variable named `OWNCLOUD_LICENSE_KEY`, or +* By adding a config entry. + +Here you need a bind mount and create an addifional config file that needs to be placed in the `/config` directory. +* It is also possible to activate your Enterprise Edition on the webUI. + +Open owncloud and navigate to: menu:Settings[Admin > General]. Copy your license key into the field `Enter a new license:` and click `Save` to confirm. + +=== Introduction + +You need to install a license key to use ownCloud Enterprise Edition. There are two types of license keys: + +* One is a free 30-day trial key. +* The other is a full license key for Enterprise customers. + +You can https://owncloud.com/download/[download and try ownCloud Enterprise for 30 days for free], which auto-generates a free 30-day key. When this key expires, your ownCloud installation is not removed, only enterprise features are disabled. If you become an Enterprise customer, you can enter your new key to regain access. See https://owncloud.com/how-to-buy-owncloud/[How to Buy ownCloud] for sales and contact information. + +=== Configuration + +Once you get your Enterprise license key, it needs to be copied to your ownCloud configuration file `config/config.php` like in this example: + +[source,php] +---- +'license-key' => 'test-20150101-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-YYYYYY', +---- + +Each running instance of ownCloud requires a license key. Keys will work across upgrades without issue, so new keys will not be required when you upgrade your ownCloud Enterprise to a new version. + +TIP: If you want to remove the current license, open ownCloud and navigate to menu:Settings[Admin > General] and click btn:[Remove current license key]. + +=== User Counting + +Your ownCloud Enterprise License Key is valid for the purchased amount of users, as per the ownCloud EULA - ownCloud Commercial License. When you generate a config.report, you will get: + +* a counting of the enabled users, +* the ownCloud guest users -- if the guest app is enabled and +* the number of user directories created. + +The latter is the user number you will need licenses for. Guest users are currently counted with a fair use policy -- which means, that you can't have more guest users than you have licensed users. If you exceed the number of licensed users, please contact your account manager or ownCloud Partner and true-up as per your contract or EULA with us. The user directories are created on first login. When a user is deleted, the user directories are deleted as well. Users which are disabled count. The last login is not relevant. + == Troubleshooting === Admin Settings @@ -338,7 +381,6 @@ If your container is terminating for whatever reason, you will not be able to ru docker( compose) run /usr/bin/owncloud bash ---- - === MySQL If your ownCloud installation fails and you see the following error in your ownCloud log please refer to xref:configuration/database/linux_database_configuration.adoc#mysql-mariadb[MySQL / MariaDB with Binary Logging Enabled] for how to resolve it. diff --git a/modules/admin_manual/pages/maintenance/backup_and_restore/restore.adoc b/modules/admin_manual/pages/maintenance/backup_and_restore/restore.adoc index 0b0689014..2ecc99606 100644 --- a/modules/admin_manual/pages/maintenance/backup_and_restore/restore.adoc +++ b/modules/admin_manual/pages/maintenance/backup_and_restore/restore.adoc @@ -1,6 +1,5 @@ = Restoring ownCloud :toc: right -:page-aliases: maintenance/restore.adoc :description: Depending how the ownCloud instance has been installed, you may need slightly different steps to restore it from a backup. == Introduction @@ -9,51 +8,27 @@ In any case, you need the following components from your backup: -. The `config/` directory. -. The `data/` directory. + -Note that the `data/` directory may not only contain user files, but also keys for encryption. -. The `apps/` directory. + -Note that this is only necessary if you are not using the `apps-external/` directory and have added own apps or themes. -. The `apps-external/` directory. + -Note that this is only necessary if it exists and is in use. +. The data of the Docker volume mount point () which includes the `apps`, `config` and the `files` folder + +For details see the xref:installation/mount_folder_structure.adoc[Mount Folder Structure] documentation. . The ownCloud database. . The custom theme files, if you had any. See xref:developer_manual:core/theming.adoc[Theming ownCloud]. + -Note that theme files are usually located in either the `apps/` or `apps-external/` directory. +Note that theme files are usually located in the `apps` directory. IMPORTANT: If you have customized user home directories or a custom location for encryption keys, you have to manually take care of backing them up and restoring them to the same location. == Prerequisites -To ensure a secure restore process, stop your web server to prevent users from accessing ownCloud via the web. As an alternative, you can stop serving the virtual host for ownCloud: - -[source,bash] ----- -sudo service apache2 stop ----- +Configure your web proxy server to prevent users from accessing ownCloud via the web. == Restore Scenarios -Tarball Installation:: -. If you have installed ownCloud from a tarball, you can safely restore the entire installation from the backup, with the exception of your ownCloud database. Databases cannot be copied, instead you must use the database tools to make a correct restoration. - -. You may also install a new instance from a tarball and restore the directories named above and the database. To avoid issues, use the same tarball version as the ownCloud version from the backup. - -Package Installation:: -If you have installed ownCloud from packages, start with a fresh ownCloud package installation in a new, empty directory. Then restore the above items from your xref:maintenance/backup_and_restore/backup.adoc[Backup]. -+ -NOTE: Only copy those files and folders from the `apps/` backup directory which are NOT present after the installation. Do not overwrite items of the `apps/` directory in the new installation. This will prevent a failing code integrity check and other errors. - -After you have completed restoring files, see how to xref:installation/manual_installation/manual_installation.adoc#script-guided-installation[Set Correct Permissions]. - -//missing docker... - === Restore Directories If possible, simply copy the directories from your backup to your new ownCloud environment, for example by running the following command from the backup directory. The following example command copies all directories mentioned above: [source,bash] ---- -sudo rsync -Aax config data apps apps-external /var/www/owncloud/ +sudo rsync -Aax config files apps / ---- There are many ways to restore normal files from backup. Use whatever method you are accustomed to. @@ -67,8 +42,6 @@ Before restoring the database, set your ownCloud instance into maintenance mode: {occ-command-example-prefix-docker} maintenance:mode --on ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: This guide assumes that your previous backup is called `owncloud-dbbackup.bak`, though the file may have a timestamp added in the filename. === MySQL/MariaDB @@ -103,7 +76,7 @@ WARNING: This is *not officially supported*. ownCloud officially supports either * Restore the file from backup. * Restore the file's encryption keys from your backup. -* Run `occ files:scan`, which makes the scanner find it. +* Run `{occ-command-example-prefix-docker} files:scan`, which makes the scanner find it. [NOTE] ==== @@ -121,17 +94,14 @@ because these aren't scanned or found by `occ files:scan`. * Download the file once as the user; the file's size will be corrected automatically. -This process might not be suitable across all environments. -If it's not suitable for yours, you might need to run an OCC command that does the scanning. +This process might not be suitable across all environments. If it's not suitable for yours, you might need to run an OCC command that does the scanning. === Retrieve the Encrypted Flag Value -1. In the backup database, retrieve the `numeric_id` value for https://github.com/owncloud/core/wiki/Storage-IDs[the storage] - where the file was located from the `oc_storages` table and store the value - for later reference. - For example, if you have the following in your `oc_storages` table, the - `numeric_id` you should use is `3` if you need to restore a file for `user1`. - +1. In the backup database, retrieve the `numeric_id` value for the https://github.com/owncloud/core/wiki/Storage-IDs[storage] where the file was located from the `oc_storages` table and store the value for later reference. For example, if you have the following in your `oc_storages` table, the `numeric_id` you should use is `3` if you need to restore a file for `user1`. ++ +[source, plaintext] +---- +--------------------------------+------------+-----------+--------------+ | id | numeric_id | available | last_checked | +--------------------------------+------------+-----------+--------------+ @@ -139,10 +109,9 @@ If it's not suitable for yours, you might need to run an OCC command that does t | local::/var/www/owncloud/data/ | 2 | 1 | NULL | | home::user1 | 3 | 1 | NULL | +--------------------------------+------------+-----------+--------------+ +---- -2. In the live database instance, find the `fileid` of the file to restore by - running the query below, substituting the placeholders for the retrieved - values, and store the value for later reference. +2. In the live database instance, find the `fileid` of the file to restore by running the query below, substituting the placeholders for the retrieved values, and store the value for later reference. + [source,sql] ---- @@ -156,10 +125,7 @@ WHERE path = 'path/to/the/file/to/restore' 4. Retrieve the required file from your backup and copy it to the real instance. -5. In the backup database, retrieve the file's `encrypted` value by running - the query below and store the value for later reference. - The example query assumes the storage was the same and the file was in the same location. - If not, you will need to track down where the file was before. +5. In the backup database, retrieve the file's `encrypted` value by running the query below and store the value for later reference. The example query assumes the storage was the same and the file was in the same location. If not, you will need to track down where the file was before. + [source,sql] ---- @@ -169,8 +135,7 @@ WHERE path = 'path/to/the/file/to/restore' AND storage = ---- -6. Update the live database instance with the retrieved information, by running the - following query, substituting the placeholders with the retrieved values: +6. Update the live database instance with the retrieved information, by running the following query, substituting the placeholders with the retrieved values: + [source,sql] ---- @@ -181,34 +146,25 @@ UPDATE oc_filecache == Final Tasks -=== Update ETag information +=== Update ETag Information -When a backup has been restored, the ETag information, which is necessary when accessing ownCloud with clients, has been changed. -Run the following command to tell desktop and mobile clients that a server backup has been restored. +When a backup has been restored, the ETag information, which is necessary when accessing ownCloud with clients, has been changed. Run the following command to tell desktop and mobile clients that a server backup has been restored. [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} maintenance:data-fingerprint ---- -NOTE: Run this command inside the ownCloud Docker container. - -=== Bring back ownCloud into normal operation mode +=== Bring back ownCloud Into Normal Operation Mode [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} maintenance:mode --off ---- -NOTE: Run this command inside the ownCloud Docker container. - -=== Enable browser access +=== Enable Browser Access -Start your web server, or alternatively enable the virtual host serving ownCloud: -[source,bash] ----- -sudo service apache2 start ----- +Configure your web proxy server to enable users to access ownCloud via the web. === Restore Cron Jobs diff --git a/modules/admin_manual/pages/maintenance/upgrading/database_upgrade.adoc b/modules/admin_manual/pages/maintenance/upgrading/database_upgrade.adoc index 6281f37a9..246475ac2 100644 --- a/modules/admin_manual/pages/maintenance/upgrading/database_upgrade.adoc +++ b/modules/admin_manual/pages/maintenance/upgrading/database_upgrade.adoc @@ -5,7 +5,7 @@ == Introduction -Usually, when upgrading a database, follow the guides the vendor provides. You may also take a look at the xref:installation/manual_installation/manual_installation.adoc#install-a-database[Install a Database] section for general notes. +Usually, when upgrading a database, follow the guides the vendor provides. This document supports an upgrade in case there are prerequisites and/or special steps to be taken to upgrade to a particular database version. @@ -13,7 +13,7 @@ This document supports an upgrade in case there are prerequisites and/or special ownCloud runs fine when using a MariaDB version lower than 10.6. You can upgrade ownCloud as usual without special considerations regarding the database. -When planning to upgrade to MariaDB 10.6, some prerequisites have to be met and upgrade steps have to be taken. +When planning to upgrade to MariaDB 10.6+, some prerequisites have to be met and upgrade steps have to be taken. This is mostly due to the fact that, unlike before, in MariaDB 10.6 _tables of the COMPRESSED row format are read-only by default_. For more information see the {compressed-row-format-url}[InnoDB COMPRESSED Row Format] document. @@ -21,11 +21,9 @@ NOTE: This process only needs to be carried out once. === Overview -. You must have upgraded your ownCloud installation to version 10.9 or above. To do so, follow the -xref:maintenance/upgrading/manual_upgrade.adoc[Manual ownCloud Upgrade] guide. +. You must have upgraded your ownCloud installation to version 10.9 or above. To do so, follow the xref:maintenance/upgrading/manual_upgrade.adoc[Manual ownCloud Upgrade] guide. -. Backup your ownCloud installation, especially the database to rollback in case of issues. To do so, follow the -xref:maintenance/backup_and_restore/backup.adoc[Backing up ownCloud] guide. +. Backup your ownCloud installation, especially the database to rollback in case of issues. To do so, follow the xref:maintenance/backup_and_restore/backup.adoc[Backing up ownCloud] guide. . Prepare the database for the upgrade with an xref:configuration/server/occ_command.adoc#restore-the-table-format[occ command]. @@ -41,19 +39,9 @@ xref:maintenance/backup_and_restore/backup.adoc[Backing up ownCloud] guide. ---- {occ-command-example-prefix-docker} maintenance:mode --on ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -. Prevent browser access + -+ -Stop your web server to prevent users from trying to access ownCloud via the web. As an alternative, you can stop serving the virtual host for ownCloud. -+ -Stop the web server: -+ -[source,bash] ----- -sudo service apache2 stop ----- +. Prevent browser access: + +Configure your web proxy server to prevent users from accessing ownCloud via the web. . Run an occ command to prepare the database for the upgrade + @@ -61,21 +49,17 @@ sudo service apache2 stop ---- {occ-command-example-prefix-docker} db:restore-default-row-format ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . Upgrade MariaDB to version 10.6+ + -- Follow the instructions in the respective {upgrade-mariadb-url}[Upgrading MariaDB] guide to upgrade MariaDB. + -If required, run the `mysql_upgrade` command when using a binary installation or as example +If required, run the `mysql_upgrade` command when using a compose setup including MySQL. [source,bash] ---- -docker-compose exec owncloud mysql_upgrade -uroot -p +docker compose exec owncloud mysql_upgrade -uroot -p ---- - -when using a dockerized environment as part of the upgrade procedure. -- . Set ownCloud back to normal operation mode: @@ -84,13 +68,7 @@ when using a dockerized environment as part of the upgrade procedure. ---- {occ-command-example-prefix-docker} maintenance:mode --off ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . Enable browser access + -Start your web server, Alternatively, enable the virtual host serving ownCloud again: -+ -[source,bash] ----- -sudo service apache2 start ----- +Configure your web proxy server to enable users to access ownCloud via the web. + diff --git a/modules/admin_manual/pages/maintenance/upgrading/upgrade.adoc b/modules/admin_manual/pages/maintenance/upgrading/upgrade.adoc index 95d0f553f..f071203b5 100644 --- a/modules/admin_manual/pages/maintenance/upgrading/upgrade.adoc +++ b/modules/admin_manual/pages/maintenance/upgrading/upgrade.adoc @@ -18,16 +18,8 @@ Before beginning an upgrade, please keep the following points in mind: * Downgrading *is not supported* as it risks corrupting your data. If you want to revert to an older ownCloud version, make a new, fresh installation and then restore your data from backup. Before attempting this, file a support ticket (if you have paid support) or ask for help in the ownCloud forums to resolve your issue without downgrading. -include::partial$maintenance/major_release_note.adoc[] - == Prerequisites We strongly recommend that you always maintain xref:maintenance/backup_and_restore/backup.adoc[regular backups] as well as make a fresh backup before every upgrade. We also recommend that you review any installed xref:maintenance/upgrading/manual_upgrade.adoc#review-third-party-apps[third-party apps] for compatibility with the new ownCloud release. Ensure that they are all disabled before beginning the upgrade. After the upgrade is complete, enable all those that are compatible with the new release again. CAUTION: Unsupported apps may disrupt your upgrade. - -== Upgrade Options - -Perform a xref:maintenance/upgrading/manual_upgrade.adoc[manual upgrade], using the https://owncloud.com/download-server/[latest ownCloud release]. - -NOTE: Enterprise customers: refer to xref:enterprise/installation/install.adoc[Installing & Upgrading ownCloud Enterprise Edition] for more information. diff --git a/modules/admin_manual/partials/installation/manual_installation/mariadb.adoc b/modules/admin_manual/partials/installation/manual_installation/mariadb.adoc deleted file mode 100644 index ba1fb01cc..000000000 --- a/modules/admin_manual/partials/installation/manual_installation/mariadb.adoc +++ /dev/null @@ -1,130 +0,0 @@ -:install-mariadb-latest-url: https://downloads.mariadb.org/mariadb/repositories/# -:auth-unix-socket-url: https://mariadb.com/kb/en/library/authentication-plugin-unix-socket/ -:upgrade-mariadb-url: https://mariadb.com/kb/en/upgrading/ - -== Standard Installation - -Use these commands to install MariaDB provided by Ubuntu and secure its installation. - -[NOTE] -==== -At the time of writing, the following MariaDB Server versions will be installed, which may change when the corresponding package gets updated: - -* With Ubuntu 20.04: `mariadb-server` version `10.4.21` -* With Ubuntu 22.04, `mariadb-server` version `10.6.12` -==== - -[source,bash] ----- -sudo apt install mariadb-server -sudo mysql_secure_installation ----- - -Check access and the version of MariaDB, replace `` as either defined during `mysql_secure_installation` above or use e.g. `root`. - -[source,bash] ----- -sudo mysqladmin -u -p version ----- - -If you get output like below, your database is up and running and ready to serve requests. - -[source,text] ----- -mysqladmin Ver 9.1 Distrib 10.4.21-MariaDB, for debian-linux-gnu on x86_64 -Copyright (c) 2000, 2021, Oracle, MariaDB Corporation Ab and others. - -Server version 10.4.21-MariaDB-1:10.4.21+maria~bionic -Protocol version 10 -Connection Localhost via UNIX socket -UNIX socket /var/run/mysqld/mysqld.sock -Uptime: 59 min 51 sec - -Threads: 16 Questions: 891020 Slow queries: 0 Opens: 119 Flush tables: 1 Open tables: 113 Queries per second avg: 248.125 ----- - -== Higher Stable Release - -For information on how to install a higher stable release of MariaDB than the one provided by Ubuntu, refer to the {install-mariadb-latest-url}[MariaDB installation documentation]. - -WARNING: The installation and use of MariaDB 10.6 and later is *only* supported and functional with ownCloud release 10.9 or above if it is a *new* ownCloud installation. Using an existing older version of ownCloud is not supported with MariaDB 10.6 and later. The necessary manual migration steps are only available with ownCloud release 10.9 or above. - -== Upgrading an Existing Release - -When upgrading from one minor version of MariaDB to another, e.g. from 10.4 to 10.5, follow the respective {upgrade-mariadb-url}[Upgrading MariaDB] guide. - -WARNING: Do not upgrade a running ownCloud installation to MariaDB 10.6 and later until ownCloud release 10.9 or above is installed. ownCloud release 10.9 or above runs well with MariaDB lower than 10.6 and has special instructions for upgrading to MariaDB 10.6 and later. - -WARNING: You must not skip minor releases of MariaDB when upgrading like from 10.4 -> 10.6, you have to upgrade to each minor version in between step by step. - -[NOTE] -==== -If you have an existing installation of MariaDB and upgrade to a higher version, do not forget to run the following command to handle the new setup for admin users — especially when running an older version of MariaDB and upgrading to MariaDB 10.4.3 upwards: - -[source,bash] ----- -sudo mysql_upgrade ----- -==== - -== Notes For MariaDB Lower Than 10.4.3 - -[NOTE] -==== -For MariaDB server releases lower than 10.4.3, you will be prompted during the installation to create a root password. Be sure to remember your password, as you will need it during the ownCloud database setup. -==== - -To install an ownCloud database, you need an administrative user who can log in, has rights to create/modify databases and users. If this user does not exist, like on MariaDB server releases higher than 10.4.3, or if you want to create a temporary user for this task, you manually have to create one. You will be asked for the mysql root user's password: - -[source,bash] ----- -sudo mysql --user=root -p - - CREATE USER 'dbadmin'@'localhost' IDENTIFIED BY 'password'; - GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'localhost' WITH GRANT OPTION; - FLUSH PRIVILEGES; -exit ----- - -== Notes For MariaDB Higher Than 10.4.3 - -[NOTE] -==== -From MariaDB 10.4.3 onwards, the authentication method has changed to UNIX sockets. For details, please refer to: {auth-unix-socket-url}[MariaDB: Authentication Plugin - Unix Socket]. The unix_socket authentication plugin allows the user to use operating system credentials when connecting to MariaDB via a local UNIX socket. Follow the procedure below to create an admin user for non-socket login, giving ownCloud access to create its database for phpMyAdmin. - -_This is not the ownCloud user!_ + -_Don't forget to change the username and password according to your needs_. - -[source,bash] ----- -sudo mysql - - CREATE USER IF NOT EXISTS 'dbadmin'@'localhost' IDENTIFIED BY 'password'; - GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'localhost' WITH GRANT OPTION; - FLUSH PRIVILEGES; - SHOW GRANTS FOR 'dbadmin'@'localhost'; -exit ----- -==== - -== phpmyadmin - -If you want to install phpMyAdmin as a graphical interface for administering the database, run the following command: - -[source,bash] ----- -sudo apt install phpmyadmin ----- - -After the installation, you need to configure your web server to access `phpmyadmin`. This is a manual task, depending on what your setup looks like and is not part of this documentation. - -[NOTE] -==== -You can run -[source,bash] ----- -sudo dpkg-reconfigure phpmyadmin ----- -to reconfigure phpmyadmin. -==== - diff --git a/modules/admin_manual/partials/installation/manual_installation/useful_tips.adoc b/modules/admin_manual/partials/installation/manual_installation/useful_tips.adoc deleted file mode 100644 index 99387932c..000000000 --- a/modules/admin_manual/partials/installation/manual_installation/useful_tips.adoc +++ /dev/null @@ -1,168 +0,0 @@ -:iscsi_initiator-url: https://ubuntu.com/server/docs/service-iscsi -:overriding-vendor-settings-url: https://www.freedesktop.org/software/systemd/man/systemd.unit.html -:transport-huge-pages-url: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-memory-transhuge -:disabling-thp-url: https://stackoverflow.com/questions/48743100/why-thp-transparent-huge-pages-are-not-recommended-for-databases-like-oracle-a - -== Start a Service After a Resource is Mounted - -If you have network resources, such as NFS or iSCSI based mounts, and you want to make -sure that the database or web server only starts _after_ the resource is mounted, -then consider the following example setup when configuring your system. - -The example below is based on an NFS mount which you want to be available _before_ the service -with starts. The same procedure can be used for iSCSI. For details setting up an -iSCSI mount see the {iscsi_initiator-url}[Ubuntu iSCSI Initiator] guide. - -The name in could be any valid service, including `apache2`, `mysql` or `mariadb`. - -* Add `_netdev` to the list of NFS mount point options in `/etc/fstab`. -+ --- -This option ensures, that the mount happens _after_ the network is up: - -[source,console] ----- -resource:foreign_path local_path nfs (),_netdev ----- --- - -* Make sure that all mounts in `/etc/fstab` are mounted by running: -+ --- -[source,bash] ----- -sudo mount -a ----- --- - -* Run the following command to list mounts which must be up first: -+ --- -[source,bash] ----- -systemctl list-units | grep -nP "\.mount" ----- - -You should see lines printed to the console. -Look for the mount you want to be up in the command's output. - -[source,console] ----- - - loaded active mounted ----- -where `` and `` are examples! --- - -* Edit the service you want to change: -+ --- -[source,bash] ----- -sudo systemctl edit .service ----- - -Add the following directive in the editor opened, using your chosen `folder.mount` from above: - -[source,text] ----- -[Unit] -After=folder.mount ----- - -You can add more than one dependency if needed by separating them with spaces. This procedure -keeps `.service` in its original state but makes it possible to override the current -setup with new parameters. This is necessary, because on updates, the original service data will -be overwritten. It automatically creates a directory in `/etc/systemd/system`, named -`.service.d`, and a file in that directory called `override.conf`. In the example -above, the parameter is added to the existing list of parameters of the `After` directive. - -For more details please read section {overriding-vendor-settings-url}[Example 2. Overriding vendor settings] - -Please keep the following points in mind, regarding if `.service` is linked or not: - -** If the file is linked from `/lib/systemd/system`, it is for packaged unit files. -They are overwritten when Systemd (or whatever package provides them) is upgraded. - -** If the file originates in `/etc/systemd/system`, it is for your own and customised unit files. -Unit files you place in here override the package-provided file and will not be replaced on upgrade. - -It is recommended to keep things simple and future-proof by creating an override file via `systemctl edit` For more details see https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units#editing-unit-files[Editing Unit Files]. --- - -* Run the following command to apply your changes: -+ --- -[source,bash] ----- -sudo systemctl daemon-reload ----- --- - -* Check if `.service` has been properly added: -+ --- -[source,bash] ----- -sudo systemctl show .service | grep "After=" ----- -`folder.mount` should be part of the parameter list. --- - -* Restart your service by invoking: -+ --- -[source,bash] ----- -sudo system restart ----- --- - -== Disable Transparent Huge Pages (THP) - -{transport-huge-pages-url}[Transparent Huge Pages] should be disabled when using databases. -This is applicable when using Redis, as well as MariaDB. For more information read: -{disabling-thp-url}[Why THP (Transparent Huge Pages) are not recommended for Databases]. - -To disable Transparent Huge Pages, follow these steps: - -* Create in `/etc/systemd/system` a file like `disable-thp.service` add the following content: -+ --- -[source,text] ----- -[Unit] -Description=Disable Transparent Huge Pages -DefaultDependencies=no -After=sysinit.target local-fs.target -Before=basic.target - -[Service] -Type=oneshot -ExecStart=/bin/sh -c '/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled' -ExecStart=/bin/sh -c '/bin/echo never > /sys/kernel/mm/transparent_hugepage/defrag' - -[Install] -WantedBy=basic.target ----- --- - -* Run the following command to apply and activate your changes and start it automatically at boot time: -+ --- -[source,bash] ----- -sudo systemctl daemon-reload ----- - -[source,bash] ----- -sudo systemctl enable disable-thp ----- - -[source,bash] ----- -sudo service disable-thp start ----- --- - diff --git a/modules/admin_manual/partials/maintenance/major_release_note.adoc b/modules/admin_manual/partials/maintenance/major_release_note.adoc deleted file mode 100644 index c48b51fd7..000000000 --- a/modules/admin_manual/partials/maintenance/major_release_note.adoc +++ /dev/null @@ -1,56 +0,0 @@ -[IMPORTANT] -==== -When upgrading, also check the minimum and maximum supported PHP version of the ownCloud target release. An ownCloud release may require a particular minimum and/or maximum PHP version. Check that the PHP version provided by the Operating System meets the requirements. For details see the https://doc.owncloud.com/docs_main/next/server_release_notes.html[Server Release Notes] and the xref:server:admin_manual:installation/system_requirements.adoc[System Requirements] for the latest Release. -==== - -[TIP] -==== -If required, you can skip major releases when upgrading your ownCloud installation. However, we recommend that you first upgrade to the latest point release of your respective minor version, e.g., _10.15.0_. - -If you are on ownCloud 8.2.11, 9.0.9, 9.1.X, or 10.X.Y you can go directly to the latest server version. - -Here are some examples: - -[cols=">10%,^25%,65%",options="header",stripes=even] -|=== -|Version -|Can Upgrade to {latest-server-download-version} ? -|Requirements (always check the xref:server:admin_manual:installation/system_requirements.adoc[System Requirements] too) - -|10.X.Y -|Yes -| PHP 7.2 to 7.4 - -| 9.1.8 -| Yes -| PHP 7.0 - -| 9.1.0 -| Yes -| PHP 7.0 - -| 9.0.9 -| Yes -| PHP 7.0 - -| 9.0.8 -| *No* -| PHP 7.0, must upgrade to 9.0.9 first - -| 8.2.11 -| Yes -| PHP 5.6 or 7.0 - -| 8.2.10 -| *No* -| PHP 5.6, must upgrade to 8.2.11 first - -| 7.0.15 -| *No* -| PHP 5.6, must upgrade to 8.0.16, then to 8.1.12, and then to 8.2.11 first. - -| 7.0.10 -| *No* -| PHP 5.6, must upgrade to 7.0.15, then to 8.0.16, then to 8.1.12, and then to 8.2.11 first. -|=== -==== diff --git a/modules/admin_manual/partials/maintenance/upgrading/upgrade_steps.adoc b/modules/admin_manual/partials/maintenance/upgrading/upgrade_steps.adoc deleted file mode 100644 index f8481a17b..000000000 --- a/modules/admin_manual/partials/maintenance/upgrading/upgrade_steps.adoc +++ /dev/null @@ -1,79 +0,0 @@ -= Upgrade PHP to Version {to-version} -:redhat-software-collections-overview-url: https://developers.redhat.com/products/softwarecollections/overview - -To upgrade to PHP {to-version} you first need to subscribe to {redhat-software-collections-overview-url}[the Red Hat Software Collections] channel repository to download and install the PHP {to-version} package in RHEL 7 (if you've not done this already). -This documentation uses the same command as you will find there. - -[IMPORTANT] -==== -Ensure that you have `subscription-manager` installed. -If you don't, yet, have it installed, do so with the following command: - -Install subscription manager -[source,bash] ----- -yum install --assumeyes subscription-manager ----- - -Add the required repositories for the PHP packages -[source,bash] ----- -subscription-manager repos --enable rhel-server-rhscl-7-rpms ----- -==== - -== Install the Required Packages - -Then, proceed by installing the required PHP {to-version} packages. -You can use the command below to save you time. - -[source,bash,subs="attributes+"] ----- -yum install \ - rh-php{to-pkg-version} \ - rh-php{to-pkg-version}-php \ - rh-php{to-pkg-version}-php-cli \ - rh-php{to-pkg-version}-php-curl \ - rh-php{to-pkg-version}-php-devel \ - rh-php{to-pkg-version}-php-gd \ - rh-php{to-pkg-version}-php-intl \ - rh-php{to-pkg-version}-php-ldap \ - rh-php{to-pkg-version}-php-mbstring \ - rh-php{to-pkg-version}-php-mysqlnd \ - rh-php{to-pkg-version}-php-opcache - rh-php{to-pkg-version}-php-pdo \ - rh-php{to-pkg-version}-php-pear \ - rh-php{to-pkg-version}-php-xml \ - rh-php{to-pkg-version}-php-xmlrpc \ - rh-php{to-pkg-version}-php-zip ----- - -== Enable PHP {to-version} and Disable PHP {from-version} - -Next, you need to enable PHP {to-version} and disable PHP {from-version} system-wide. -To enable PHP {to-version} system-wide, run the following command: - -[source,bash,subs="attributes+"] ----- -cp /opt/rh/rh-php{to-pkg-version}/enable /etc/profile.d/rh-php{to-pkg-version}.sh source /opt/rh/rh-php{to-pkg-version}/enable ----- - -Then, you need to disable loading of the PHP {from-version} Apache modules. -You can do this either by changing their names, as in the example below, or deleting the files. - -[source,bash,subs="attributes+"] ----- -mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php56.off -mv /etc/httpd/conf.modules.d/10-php.conf /etc/httpd/conf.modules.d/10-php56.off ----- - -== Update the Apache Configuration Files - -With that done, you next need to copy the PHP {to-version} Apache modules into place; that being the two Apache configuration files and the shared object file. - -[source,bash,subs="attributes+"] ----- -cp /opt/rh/httpd24/root/etc/httpd/conf.d/rh-php{to-pkg-version}-php.conf /etc/httpd/conf.d/ -cp /opt/rh/httpd24/root/etc/httpd/conf.modules.d/15-rh-php{to-pkg-version}-php.conf /etc/httpd/conf.modules.d/ -cp /opt/rh/httpd24/root/etc/httpd/modules/librh-php{to-pkg-version}-php7.so /etc/httpd/modules/ ----- diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index dba030733..76c2e8d30 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -144,9 +144,6 @@ **** xref:admin_manual:enterprise/file_management/files_lifecycle.adoc[File Lifecycle Management] *** Firewall **** xref:admin_manual:enterprise/firewall/file_firewall.adoc[File Firewall] -*** Installation -**** xref:admin_manual:enterprise/installation/install.adoc[Installing & Upgrading ownCloud Enterprise Edition] -**** xref:admin_manual:enterprise/installation/oracle_db_configuration.adoc[Oracle DB Setup & Configuration] *** Logging **** xref:admin_manual:enterprise/logging/admin_audit.adoc[Auditing] *** Reporting diff --git a/modules/developer_manual/pages/app/fundamentals/database.adoc b/modules/developer_manual/pages/app/fundamentals/database.adoc index 103c30987..3e5fbaa4b 100644 --- a/modules/developer_manual/pages/app/fundamentals/database.adoc +++ b/modules/developer_manual/pages/app/fundamentals/database.adoc @@ -19,19 +19,12 @@ include::example$app/fundamentals/database/database-access.php[] * Don't update more than 1 million rows within a transaction due to DB limitations. * Don't add more than 999 conditions in a `WHERE ... IN ...` statement but chunk it into separate queries when using SQLite. * When processing big tables, always do this in chunks, don't store the whole table in memory. -* Oracle compatibility specifics: -** For Oracle, `null` and empty strings are the same thing. Special handling is required to catch these cases. -** When reading values, make sure to convert nulls to empty strings when expected. -** When using a condition based on empty strings, use `is not null` with Oracle instead. -** Oracle can only compare the first 4000 bytes of a `CLOB` column. -** Make sure to properly escape column names when using custom functions with `createFunction`. The escaping is usually done automatically by the query builder. Oracle is the most likely to complain about unquoted columns while other databases will work fine. -** Always add the table name when calling `lastInsertId($tableName)`, as it is required by Oracle to return correct values. -* In general, don't specify a value for an `autoincrement` column. If you have to, keep in mind that Oracle's `autoincrement` trigger will get in the way on `INSERT`. As a result, you'll need a subsequent `UPDATE` to properly adjust the value. +* In general, don't specify a value for an `autoincrement` column. * *Always* make sure there are unit tests for the database operations with queries to verify the result. This will help find out whether the database related code works on all databases and often times might reveal database quirks. * Running unit tests with specific databases: `make test-php TEST_PHP_SUITE=path/to/test/file.php TEST_DATABASE=$databasetype` where "$databasetype" is one of "sqlite", "mysql", "mariadb", "pgsql", "oci" and "mysqlmb4". * String concatenation should be done like this: ** `CONCAT(str1, str2, ... strN)` for MYSQL. -** `str1 || str1 ... || strN` SQLite/pgSQL/Oracle. +** `str1 || str1 ... || strN` SQLite/pgSQL. * Use `IQueryBuilder::createPositionalParameter` instead of `IQueryBuilder::createNamedParameter` when using `like()`. == Mappers diff --git a/modules/developer_manual/pages/app/fundamentals/info.adoc b/modules/developer_manual/pages/app/fundamentals/info.adoc index b75cf81ee..7ee08790a 100644 --- a/modules/developer_manual/pages/app/fundamentals/info.adoc +++ b/modules/developer_manual/pages/app/fundamentals/info.adoc @@ -183,7 +183,7 @@ application. == database Each supported database has to be listed here. Valid values are -`sqlite`, `mysql`, `pgsql`, `oci` and `mssql`. In the future it will be +`sqlite`, `mysql` and `pgsql`. In the future it will be possible to specify versions here as well. In case no database is specified it is assumed that all databases are supported. diff --git a/modules/developer_manual/pages/testing/unit-testing.adoc b/modules/developer_manual/pages/testing/unit-testing.adoc index 9aa9ac5c9..ca20aa8ca 100644 --- a/modules/developer_manual/pages/testing/unit-testing.adoc +++ b/modules/developer_manual/pages/testing/unit-testing.adoc @@ -12,9 +12,7 @@ ownCloud uses PHPUnit >= 7.5 for unit testing PHP code. === Getting PHPUnit -Running `make` in your terminal from the `webroot` directory will prepare -everything for testing. This will install beside necessary dependencies, -a local version of PHPUnit at `/lib/composer/phpunit/phpunit`. +Running `make` in your terminal from the `webroot` directory will prepare everything for testing. This will install beside necessary dependencies, a local version of PHPUnit at `/lib/composer/phpunit/phpunit`. * Run `make help` to get a list of parameters * To update your testing environment run `make clean` and `make` again. @@ -22,8 +20,7 @@ a local version of PHPUnit at `/lib/composer/phpunit/phpunit`. === Running PHP Unit tests -There are existing test options provided by ownCloud. -To run them, change into the root directory of your ownCloud installation and run `grep "make test" <(make help)` to see tests and parameters available. +There are existing test options provided by ownCloud. To run them, change into the root directory of your ownCloud installation and run `grep "make test" <(make help)` to see tests and parameters available. You should see output similar to the below example. @@ -131,7 +128,7 @@ Generating code coverage report in Clover XML format ... done [NOTE] ==== Apps that are part of core *do not* have their own Makefile. -Third party apps are all apps that are not distributed by {oc-marketplace-url}/publishers/owncloud[ownCloud] or not in xref:admin_manual:installation/apps_supported.adoc[the supported apps list]. +Third party apps are all apps that are not distributed by {oc-marketplace-url}/publishers/owncloud[ownCloud] or not in ythe xref:admin_manual:installation/apps_supported.adoc[supported apps list]. ==== === Writing PHP Unit tests @@ -145,14 +142,11 @@ Then you can run the created test with `phpunit`. TIP: Alternatively, you can use xref:attachment$/core/Makefile.example[the default Makefile] to automate your unit tests. -If you use ownCloud functions in your class under test (i.e: -OC::getUser()) you’ll need to bootstrap ownCloud or use dependency -injection. +If you use ownCloud functions in your class under test (i.e: OC::getUser()) you’ll need to bootstrap ownCloud or use dependency injection. [NOTE] ==== -You'll most likely run your tests under a different user than the Web server. -This might cause problems with your PHP settings (i.e., `open_basedir`) and requires you to adjust your configuration. +You'll most likely run your tests under a different user than the Web server. This might cause problems with your PHP settings (i.e., `open_basedir`) and requires you to adjust your configuration. ==== Given the class `MyClass` in your app: @@ -173,8 +167,7 @@ include::example$core/unit-testing/MyClassTest.php[MyClassTest.php] [NOTE] ==== -The class under test and the test class should share the same namespace so you do not need to use a dedicated `use` statement for it. -This is {recommended-way-to-organise-tests-url}[the recommended way to organize tests]. +The class under test and the test class should share the same namespace so you do not need to use a dedicated `use` statement for it. This is {recommended-way-to-organise-tests-url}[the recommended way to organize tests]. ==== In `/srv/http/owncloud/apps/myapp/` you run the test with the following command: @@ -184,18 +177,13 @@ In `/srv/http/owncloud/apps/myapp/` you run the test with the following command: phpunit tests/unit/MyClassTest.php ---- -Make sure to extend the `\Test\TestCase` class with your test and always call the parent methods, when overwriting `setUp()`, -`setUpBeforeClass()`, `tearDown()` or `tearDownAfterClass()` methods from the `TestCase`. -These methods set up important stuff and clean up the system after the test so that the next test can run without side effects, such as clearing files and entries from the file cache, etc. -For more resources on writing tests for PHPUnit visit {writing-tests-url}[the writing tests section] of the PHPUnit documentation. +Make sure to extend the `\Test\TestCase` class with your test and always call the parent methods, when overwriting `setUp()`, `setUpBeforeClass()`, `tearDown()` or `tearDownAfterClass()` methods from the `TestCase`. These methods set up important stuff and clean up the system after the test so that the next test can run without side effects, such as clearing files and entries from the file cache, etc. For more resources on writing tests for PHPUnit visit {writing-tests-url}[the writing tests section] of the PHPUnit documentation. === Bootstrapping ownCloud -If you use ownCloud functions or classes in your code, you’ll need to -make them available to your test by bootstrapping ownCloud. +If you use ownCloud functions or classes in your code, you’ll need to make them available to your test by bootstrapping ownCloud. -To do this, you’ll need to provide the `--bootstrap` argument when -running PHPUnit +To do this, you’ll need to provide the `--bootstrap` argument when running PHPUnit [source,bash] ---- @@ -203,8 +191,7 @@ cd /srv/http/owncloud phpunit --bootstrap tests/bootstrap.php apps/myapp/tests/testsuite.php ---- -If you run the test suite as a user other than your Web server, you'll -have to adjust your php.ini and file rights. +If you run the test suite as a user other than your Web server, you'll have to adjust your php.ini and file rights. [source,bash] ---- @@ -223,13 +210,9 @@ su -c "chmod a+w data/owncloud.log" === Running Unit Tests for ownCloud Core -The core project provides a script that runs all the core unit tests -using the specified database backend like `sqlite`, `mysql`, `pgsql`, -`oci` (for Oracle), the default is `sqlite` +The core project provides a script that runs all the core unit tests using the specified database backend like `sqlite`, `mysql` and `pgsql`. The default is `sqlite` -To run tests on `mysql` or `pgsql` you need a database user called -`oc_autotest` with the password `owncloud`. This user needs the -privilege to create and delete the database called `oc_autotest`. +To run tests on `mysql` or `pgsql` you need a database user called `oc_autotest` with the password `owncloud`. This user needs the privilege to create and delete the database called `oc_autotest`. ==== MySQL Setup @@ -325,16 +308,11 @@ make test-php-unit NOCOVERAGE=true TEST_DATABASE=mysql TEST_PHP_SUITE=tests/lib/ == Unit Testing JavaScript in Core -JavaScript Unit testing for *core* and *core apps* is done using the -http://karma-runner.github.io[Karma] test runner with -https://jasmine.github.io[Jasmine]. +JavaScript Unit testing for *core* and *core apps* is done using the http://karma-runner.github.io[Karma] test runner with https://jasmine.github.io[Jasmine]. === Installing Node JS -To run the JavaScript unit tests you will need to install *Node JS*. You -can get it here: http://nodejs.org/ After that you will need to setup -the *Karma* test environment. The easiest way to do this is to run the -automatic test script first, see next section. +To run the JavaScript unit tests you will need to install *Node JS*. You can get it here: http://nodejs.org/ After that you will need to setup the *Karma* test environment. The easiest way to do this is to run the automatic test script first, see next section. === Running All The Tests @@ -356,11 +334,7 @@ To debug tests in the browser, this will run *Karma* in browser mode make test-js-debug ---- -From there, open the URL `\http://localhost:9876` in a web browser. On that -page, click on the btn:[Debug] button. An empty page will appear, from -which you must open the browser console (F12 in Firefox/Chrome). Every -time you reload the page, the unit tests will be relaunched and will -output the results in the browser console. +From there, open the URL `\http://localhost:9876` in a web browser. On that page, click on the btn:[Debug] button. An empty page will appear, from which you must open the browser console (F12 in Firefox/Chrome). Every time you reload the page, the unit tests will be relaunched and will output the results in the browser console. === Unit Test File Paths From 3b74a9ce7e3ef4f5f9b1efc4e1d02f6d532735f1 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Wed, 20 May 2026 11:52:57 +0200 Subject: [PATCH 17/38] updates and smb/wnd --- .../files/external_storage/smb.adoc | 9 +- .../user/user_auth_ftp_smb_imap.adoc | 19 +- .../windows-network-drive_configuration.adoc | 27 +-- .../external_storage/wnd_quick_guide.adoc | 23 +- .../installation/changing_the_web_route.adoc | 34 --- .../installation/configuration_notes.adoc | 17 ++ .../configuration_notes_and_tips.adoc | 223 ------------------ .../installation/installing_with_docker.adoc | 22 +- .../installation/mount_folder_structure.adoc | 2 +- modules/admin_manual/partials/nav.adoc | 1 + 10 files changed, 36 insertions(+), 341 deletions(-) delete mode 100644 modules/admin_manual/pages/installation/changing_the_web_route.adoc create mode 100644 modules/admin_manual/pages/installation/configuration_notes.adoc delete mode 100644 modules/admin_manual/pages/installation/configuration_notes_and_tips.adoc diff --git a/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc b/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc index 743c18345..00a1c8c6f 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc @@ -11,18 +11,18 @@ == Dependencies -All dependencies are provided with the ownCloud image. +All dependencies are provided by the ownCloud image. == Access Testing -To ensure that you can connect to your file server with SMB, do a small test upfront like the following. +To ensure that you can connect to your file server with SMB, do a small test upfront like the following. Note that the `smbclient` command is not part of the ownCloud Docker image and must be provided and issued from the host. [source,bash] ---- sudo smbclient -L -U / ---- -Please fix any issues before you connect ownCloud to a SMB file server. +Make sure you have resolved any issues before connecting ownCloud to an SMB file server. == Configuration @@ -36,8 +36,7 @@ When configuring ownCloud, you will need the following information: * The remote subfolder inside the remote Samba share to mount. + This is optional, as it defaults to `/`. + -TIP: To assign the ownCloud logon username automatically to the subfolder, use `$user` instead of a -subfolder name. The foldername=username must be present and is not created on access. +TIP: To assign the ownCloud logon username automatically to the subfolder, use `$user` instead of a subfolder name. The foldername=username must be present and is not created on access. * The ownCloud users and groups who get access to the share. * A domain name, might be required or optional depending on your setup diff --git a/modules/admin_manual/pages/configuration/user/user_auth_ftp_smb_imap.adoc b/modules/admin_manual/pages/configuration/user/user_auth_ftp_smb_imap.adoc index e0b8680ba..e735d91c1 100644 --- a/modules/admin_manual/pages/configuration/user/user_auth_ftp_smb_imap.adoc +++ b/modules/admin_manual/pages/configuration/user/user_auth_ftp_smb_imap.adoc @@ -4,8 +4,9 @@ == Introduction -You may configure additional user backends in ownCloud’s configuration -file (`config/config.php`) using the following syntax: +NOTE: The described configurations are examples, see the xref:installation/configuration_notes.adoc[Configuration Notes] documentation for more options. + +You may configure additional user backends in ownCloud’s configuration file (`config/config.php`) using the following syntax: [source,php] ---- @@ -21,10 +22,7 @@ file (`config/config.php`) using the following syntax: ], ---- -NOTE: A non-blocking or correctly configured SELinux setup is needed for these backends to work if SELinux is enabled on your server. - -Currently the https://github.com/owncloud/user_external[External user support app] (user_external), -_which is not enabled by default_, provides three backends. These are: +Currently the https://github.com/owncloud/user_external[External user support app] (user_external), _which is not enabled by default_, provides three backends. These are: * xref:imap[IMAP] * xref:smb[SMB] @@ -49,8 +47,7 @@ Provides authentication against IMAP servers. {php-net-url}/manual/en/function.imap-open.php[in the PHP documentation]. | Dependency -| {php-net-url}/manual/en/book.imap.php[PHP’s IMAP extension]. + -See xref:installation/manual_installation/manual_installation.adoc[Manual Installation on Linux] for instructions on how to install it. +| The PHP IMAP extension is not part of the image. If you want to authenticate against IMAP, you need to build your own image based on the official ownCloud image and add the extension to it. |==== === Example @@ -91,8 +88,7 @@ Provides authentication against Samba servers. | The samba server to authenticate against. | Dependency -| https://pecl.php.net/package/smbclient[PECL’s smbclient extension] or + -xref:configuration/files/external_storage/smb.adoc[smbclient]. +| xref:configuration/files/external_storage/smb.adoc[smbclient]. |==== === Example @@ -127,9 +123,6 @@ Provides authentication against FTP servers. | Arguments | The FTP server to authenticate against. -| Dependency -| {php-net-url}/manual/en/book.ftp.php[PHP’s FTP extension]. + -See xref:installation/manual_installation/manual_installation.adoc[Source Installation] for instructions on how to install it. |=== === Example diff --git a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc index 999ebcd97..f88fe85dd 100644 --- a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc +++ b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc @@ -1,7 +1,6 @@ = Windows Network Drive (WND) :toc: right :toclevels: 3 -:page-aliases: enterprise/external_storage/index.adoc :description: The Windows Network Drives app seamlessly integrates Windows and Samba/CIFS shared network drives as external storages. WND has great advantages compared to standard SMB access. :anacron-examples: http://www.thegeekstuff.com/2011/05/anacron-examples @@ -96,35 +95,11 @@ Files are synchronized bidirectionally, and you can create, upload and delete fi Depending on the authentication method, passwords for each mount are encrypted and stored in the ownCloud database, using a long random secret key stored in `config.php`. This allows ownCloud to access the shares when the users who own the mounts are not logged in. This access will not work if the mount is session based, where passwords are not stored and are available only for the current active session. In case other users are granted access to this mount, they will see a red triangle with an exclamation mark on the bottom right of the mount icon identifying lack of access. -== Installation - -Install the {oc-marketplace-url}/apps/windows_network_drive[External Storage: Windows Network Drives app] from the ownCloud Market App or ownCloud Marketplace. To make it work, a few dependencies have to be installed. - -* A Samba client. This is included in all Linux distributions. On Debian, Ubuntu, and other Debian derivatives it is called `smbclient`. On SUSE, Red Hat, CentOS, and other Red Hat derivatives it is `samba-client`. -* `php-smbclient` (version 0.8.0+). It should be included in most Linux distributions. You can use https://github.com/eduardok/libsmbclient-php#installation-from-pecl[Installation from PECL], if your distribution does not provide it or if you want to use a more updated version than the one provided by the OS. See xref:installation/manual_installation/server_prep_ubuntu_22.04.adoc#updating-pear[Updating pear] for a necessary prerequisite. -* `which` and `stdbuf`. These should be included in most Linux distributions. - -To install and configure the necessary packages, see the xref:installation/manual_installation/manual_installation.adoc#prepare-your-server[Prepare Your Server] section of the manual installation documentation. - TIP: For more information on SMB/CIFS in ownCloud, refer to the xref:configuration/files/external_storage/smb.adoc[Samba file server configuration documentation]. TIP: If you encounter errors when using the WND app like `NT_STATUS_REVISION_MISMATCH`, please get in touch by {oc-support-url}[Opening a Service Request]. -[IMPORTANT] -==== -ownCloud requires at least {samba-478-url}[Samba 4.7.8] or {samba-481-url}[Samba 4.8.1] on the ownCloud server, when: - -. The Windows Network Drive Listener is used; *and* -. The remote Windows/Samba file server requires at least {smb2-url}[version 2.0 of the SMB protocol]. - -The xref:wnd-listener-setup[Windows Network Drive Listener] only supports version 1 of the SMB protocol (SMB1) with _earlier_ Samba versions. - -*Background* - -A {samba-url}[Samba] server, often a Microsoft Windows Server, can enforce the minimum and maximum protocol versions used by connecting clients. However, in light of the {wannacry-ransomware-attack-url}[WannaCry ransomware attack], {msft-security-bulletin-ms17-010-url}[Microsoft patched Windows Server] to only allow SMB2 as minimum protocol by default, as SMB1 is insecure. - -The ownCloud windows network drive listener utilizes the SMB notification feature which works well with SMB1 in conjunction with most Samba versions. However, when the minimum protocol a server accepts is SMB2, ownCloud requires Samba 4.7.8+ (4.8+ etc.) to be able to properly work, as prior versions of Samba had a bug that broke this feature. -==== +IMPORTANT: The remote Windows/Samba file server requires at least {smb2-url}[version 2.0 of the SMB protocol]. == Configuration diff --git a/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc b/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc index 699a445f1..03d6eb044 100644 --- a/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc +++ b/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc @@ -6,35 +6,19 @@ This is a quick guide for installing and configuring the Windows Network Drive (WND) app. -== Prerequisites +== Enable the App -To successfully use the Windows Network Drive app, you must meet the prerequisites which can be found in the xref:installation/manual_installation/server_prep_ubuntu_20.04.adoc[Server Preparation for Ubuntu 20.04]. In particular, these are the sections required which address `smbclient` ( -xref:installation/manual_installation/server_prep_ubuntu_20.04.adoc#clean-ubuntu-20-04-installation[Clean Ubuntu 20.04 Installation]) and `libsmbclient-php` ( -xref:installation/manual_installation/server_prep_ubuntu_20.04.adoc#libsmbclient-php-library[libsmbclient-php Library]). - -== Installation - -Install the WND app either via the Web Interface or the command line: +The app is part of the ownCloud Docker image and only needs to be enabled: WebUI:: -* The Windows Network Drive app has to be downloaded from the Market App. Navigate to the Market app, search for Windows Network Drive and install it. -* Post installing enable it via menu:Settings[Admin > Apps]. +Go to menu:Settings[Admin > Apps] and enable the app. Command line:: -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} market:install windows_network_drive ----- - -NOTE: Run this command inside the ownCloud Docker container. - [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} app:enable windows_network_drive ---- -NOTE: Run this command inside the ownCloud Docker container. - == Configuration **WebUI** @@ -57,7 +41,6 @@ Configure external share: * Available for: limit access to groups * Settings: (gear wheel) enable the options you need - IMPORTANT: If you plan to use ownCloud **only** in the Web Browser - your setup of the WND is complete. If you plan to use a desktop client, you need to continue and configure the WND listener and WND process queue. diff --git a/modules/admin_manual/pages/installation/changing_the_web_route.adoc b/modules/admin_manual/pages/installation/changing_the_web_route.adoc deleted file mode 100644 index 8f6421ae2..000000000 --- a/modules/admin_manual/pages/installation/changing_the_web_route.adoc +++ /dev/null @@ -1,34 +0,0 @@ -= Changing Your ownCloud URL - -This admin manual assumes that the ownCloud server is already accessible -under the route `/owncloud` (which is the default, e.g. -`\https://example.com/owncloud`). If you like, you can change this in -your web server configuration, for example by changing it from -`\https://example.com/owncloud/` to `\https://example.com/`. - -To do so on Debian/Ubuntu Linux, you need to edit these files: - -* `/etc/apache2/sites-enabled/owncloud.conf` -* `/var/www/owncloud/config/config.php` - -Edit the `Alias` directive in `/etc/apache2/sites-enabled/owncloud.conf` -to alias your ownCloud directory to the Web server root: - -[source,apache] ----- -Alias / "/var/www/owncloud/" ----- - -Edit the `overwrite.cli.url` parameter in -`/var/www/owncloud/config/config.php`: - -[source,php] ----- -'overwrite.cli.url' => 'http://localhost/', ----- - -When the changes have been made and the file saved, restart Apache. Now -you can access ownCloud from either `\https://example.com/` or -`\https://localhost/`. - -NOTE: You will not be able to run any other virtual hosts, as ownCloud is aliased to your web root. On CentOS/Fedora/Red Hat, edit `/etc/httpd/conf.d/owncloud.conf` and `/var/www/html/owncloud/config/config.php`, then restart Apache. diff --git a/modules/admin_manual/pages/installation/configuration_notes.adoc b/modules/admin_manual/pages/installation/configuration_notes.adoc new file mode 100644 index 000000000..427d0b4ad --- /dev/null +++ b/modules/admin_manual/pages/installation/configuration_notes.adoc @@ -0,0 +1,17 @@ += Configuration Notes +:toc: right +:description: There are multiple ways to configure ownCloud to run in a Dockerized environment. + +== Introduction + +{description} + +== Using Environment Variables + +The image provides additional environment variables that can be configured for the use with the container. To identify available ones, see the file `overwrite.config.php` which can be found in the `config` folder. This folder is located in `/mnt/data` in the container or locally at the respective bind mount. + +== Using a Configuration File + +Rather than using environment variables to configure your ownCloud instance, you can use additional configuration files, as was possible with earlier releases of ownCloud. This configuration method is only possible when using bind mounts, because access to the `config` sub folder is required. + +For more and important details see: xref:installation/mount_folder_structure.adoc[Mount Folder Structure]. diff --git a/modules/admin_manual/pages/installation/configuration_notes_and_tips.adoc b/modules/admin_manual/pages/installation/configuration_notes_and_tips.adoc deleted file mode 100644 index 1707730dc..000000000 --- a/modules/admin_manual/pages/installation/configuration_notes_and_tips.adoc +++ /dev/null @@ -1,223 +0,0 @@ -= Configuration Notes and Tips -:toc: right -:toclevels: 1 -:tideways-url: https://tideways.io/profiler/blog/how-does-the-php-realpath-cache-work-and-how-to-configure-it -:page-aliases: go/admin-php-fpm.adoc - -== SELinux - -See the xref:installation/selinux_configuration.adoc[SELinux Configuration Guide] for -a suggested configuration for SELinux-enabled distributions such as Fedora and CentOS. - -== php.ini - -Several core PHP settings must be configured correctly, otherwise -ownCloud may not work properly. Known settings causing issues are listed -here. Please note that, there might be other settings which cause -unwanted behavior. In general, however, it is recommended to keep the -`php.ini` settings at their defaults, except when you know exactly why -the change is required, and its implications. - -NOTE: Keep in mind that, changes to `php.ini` may have to be configured in more than one ini file. -This can be the case, for example, for the `date.timezone` setting. - -=== php.ini - Used by the Web server - -For PHP version {minimum-php-printed} onward, replace `php_version` with the version number installed, e.g., `{minimum-php-version}` in the following examples. - -[source,plaintext] ----- -/etc/php/[php_version]/apache2/php.ini ----- - -or -[source,plaintext] ----- -/etc/php/[php_version]/fpm/php.ini ----- - -or - -=== php.ini - used by the php-cli and so by ownCloud CRON jobs - -[source,plaintext] ----- -/etc/php/[php_version]/cli/php.ini ----- - -=== session.auto_start && enable_post_data_reading - -Ensure that -{php-net-url}/manual/en/session.configuration.php#ini.session.auto-start[session.auto_start] -is set to `0` or `Off` and -{php-net-url}/manual/en/ini.core.php#ini.enable-post-data-reading[enable_post_data_reading] -to `1` or `On` in your configuration. If not, you may have issues -logging in to ownCloud via the WebUI, where you see the error: -"__Access denied. CSRF check failed__". - -=== session.save_path - -In addition to setting `session.auto_start` and -`enable_post_data_reading` correctly, ensure that, if -`session.save_handler` is set to `files`, that `session.save_path` is -set to a path on the filesystem which *only* the web server process (or -process which PHP is running as) can read from and write to. - -This is especially important if your ownCloud installation is using a -shared-hosting arrangement. In these situations, -https://en.wikipedia.org/wiki/Session_poisoning[session poisoning] can -occur if all of the session files are stored in the same location. -Session poisoning is where one web application can manipulate data in -the `$_SESSION` superglobal array of another. - -When this happens, the original application has no way of knowing that this -corruption has occurred and may not treat the data with any sense of suspicion. -You can read through a thorough discussion of -https://dl.packetstormsecurity.net/papers/attack/php-part1.pdf[local session poisoning] -if you’d like to know more. - -=== post_max_size - -Please ensure that you have `post_max_size` configured with _at least_ -the minimum amount of memory for use with ownCloud, which is 512 MB. - -NOTE: Please be careful when you set this value if you use the byte value shortcut as it is very specific. Use K for kilobyte, M for megabyte and G for gigabyte. KB, MB, and GB *do not work!* - -=== realpath_cache_size - -This determines the size of the realpath cache used by PHP. This value -should be increased on systems where PHP opens many files, to reflect -the number of file operations performed. For a detailed description see -{php-net-url}/manual/en/ini.core.php#ini.realpath-cache-size[realpath-cache-size]. -This setting has been available since PHP 5.1.0. Prior to PHP 7.0.16 and -7.1.2, the default was 16 KB. - -To see your current value, query your `phpinfo()` output for this key. -It is recommended to set the value if it is currently set to the default -of 16 KB. A good reading about the background can be found at {tideways-url}[tideways.io]. - -==== How to get a working value - -With the assumption of 112 bytes per file path needed, this would allow -the cache to hold around 37.000 items with a cache size of 4096K (4M), -but only about a hundred entries for a cache size of 16 KB. - -NOTE: It’s a good rule of thumb to always have a realpath cache that can hold entries for all your files paths in memory. If you use symlink deployment, then set it to double or triple the amount of files. - -The easiest way to get the quantity of PHP files is to use cloc, which -can be installed by running `sudo apt-get install cloc`. The cloc -package is available for nearly all distributions. - -[source,bash] ----- -sudo cloc /var/www/owncloud --exclude-dir=data --follow-links - 12179 text files. - 11367 unique files. - 73126 files ignored. ----- - -[source,plaintext] ----- -http://cloc.sourceforge.net v 1.60 T=1308.98 s (6.4 files/s, 1283.5 lines/s) --------------------------------------------------------------------------------- -Language files blank comment code --------------------------------------------------------------------------------- -PHP 4896 96509 285384 558135 -... ----- - -Taking the math from above and assuming a symlinked instance, using -factor 3. For example: `4896 * 3 * 112 = 1.6MB` This result shows that -you can run with the PHP setting of 4M two instances of ownCloud. - -Having the default of 16 KB means that only 1/100 of the existing PHP -file paths can be cached and need continuous cache refresh slowing down -performance. If you run more web services using PHP, you have to -calculate accordingly. - -== PHP-FPM - -Note that `mod_php` is used exclusively in the development and QA process of the ownCloud server. -It's highly recommended to use `mod_php` in your production environment for optimal performance and stability. -Any issues with the ownCloud server have to be reproducible with `mod_php`. - -SAML SSO with Shibboleth **will not work** with `php-fpm`. - -=== System Environment Variables - -When you are using `php-fpm`, system environment variables like `PATH`, -`TMP` or others are not automatically populated in the same way as when -using `php-cli`. A PHP call like `getenv('PATH');` can therefore return -an empty result. So you may need to manually configure environment -variables in the appropriate `php-fpm` ini/config file. - -Here are some example root paths for these ini/config files: - -[width="80%",cols="59%,41%",] -|=== -| Ubuntu/Mint | CentOS/Red Hat/Fedora -| `/etc/php/[php_version]/fpm/` | `/etc/php-fpm.d/` -|=== - -In both examples, the `ini/config` file is called `www.conf`, and -depending on the distribution or customizations which you have made, it -may be in a sub-directory. - -Usually, you will find some or all of the environment variables already -in the file, but commented out like this: - -[source,plaintext] ----- -;env[HOSTNAME] = $HOSTNAME -;env[PATH] = /usr/local/bin:/usr/bin:/bin -;env[TMP] = /tmp -;env[TMPDIR] = /tmp -;env[TEMP] = /tmp ----- - -Uncomment the appropriate existing entries. Then run `printenv PATH` to -confirm your paths, for example: - -[source,bash] ----- -printenv PATH -/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin: -/sbin:/bin:/ ----- - -If any of your system environment variables are not present in the file -then you must add them. - -When you are using shared hosting or a control panel to manage your -ownCloud virtual machine or server, the configuration files are almost -certain to be located somewhere else, for security and flexibility -reasons, so check your documentation for the correct locations. - -Please keep in mind that it is possible to create different settings for -`php-cli` and `php-fpm`, and for different domains and Web sites. The -best way to check your settings is with label-phpinfo. - -=== Maximum Upload Size - -If you want to increase the maximum upload size, you will also have to -modify your `php-fpm` configuration and increase the -`upload_max_filesize` and `post_max_size` values. You will need to -restart `php5-fpm` and your HTTP server in order for these changes to be -applied. - -=== .htaccess Notes for Apache - -ownCloud comes with its own `owncloud/.htaccess` file. Because `php-fpm` -can’t read PHP settings in `.htaccess` these settings and permissions -must be set in the `owncloud/.user.ini` file. - -=== No basic authentication headers were found - -This error is shown in your `data/owncloud.log` file. Some Apache -modules like `mod_fastcgi`, `mod_fcgid` or `mod_proxy_fcgi` are not -passing the needed authentication headers to PHP and so the login to -ownCloud via WebDAV, CalDAV and CardDAV clients is failing. Information -on how to correctly configure your environment can be found -{oc-central-url}/t/no-basic-authentication-headers-were-found-message/819[in -the forums] but we generally recommend not to use these modules -and recommend mod_php instead. diff --git a/modules/admin_manual/pages/installation/installing_with_docker.adoc b/modules/admin_manual/pages/installation/installing_with_docker.adoc index 3ca637055..150a64e0c 100644 --- a/modules/admin_manual/pages/installation/installing_with_docker.adoc +++ b/modules/admin_manual/pages/installation/installing_with_docker.adoc @@ -280,25 +280,9 @@ docker compose exec owncloud occ IMPORTANT: Don't use the `php` command prefix, this leads to several errors and is not intended to run in docker environments. -=== Additional Evironment Variables - -The image provides additional environment variables that can be configured for the use with the container. To identify available ones, see the file `overwrite.config.php` which can be found in the `config` directory. This directory is located in `/mnt/data` in the container or locally at the respective bind mount. - -=== Alternative Configuration - -Rather than using environment variables to configure your ownCloud instance, you can use additional configuration files, as was possible with earlier releases of ownCloud. This configuration method is only possible when using bind mounts because access to the `config` sub folder of the mounted is required. - -[source,plaintext] ----- -mount_point/ - - apps/ - - certs/ - - config/ - - files/ - - sessions/ ----- +=== Configuration -For more and important details see: xref:installation/mount_folder_structure.adoc[Mount Folder Structure]. +For more configuration options, please refer to the xref:installation/configuration_notes.adoc[Configuration Notes] documentation. == Enterprise License Keys @@ -306,7 +290,7 @@ An Enterprise license keys can be added by: * Using an environment variable named `OWNCLOUD_LICENSE_KEY`, or * By adding a config entry. + -Here you need a bind mount and create an addifional config file that needs to be placed in the `/config` directory. +For more details see the xref:installation/configuration_notes.adoc[Configuration Notes] documentation. * It is also possible to activate your Enterprise Edition on the webUI. + Open owncloud and navigate to: menu:Settings[Admin > General]. Copy your license key into the field `Enter a new license:` and click `Save` to confirm. diff --git a/modules/admin_manual/pages/installation/mount_folder_structure.adoc b/modules/admin_manual/pages/installation/mount_folder_structure.adoc index a66050156..d1aedb347 100644 --- a/modules/admin_manual/pages/installation/mount_folder_structure.adoc +++ b/modules/admin_manual/pages/installation/mount_folder_structure.adoc @@ -32,4 +32,4 @@ IMPORTANT: Consider the alphabetic order the system is reading config files. Wit <3> The files folder matches the `data` directory with former ownCloud releases. -<4> Unused, present for historic reasons. +<4> Unused, present for legacy reasons. diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index 76c2e8d30..d0517ee9b 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -12,6 +12,7 @@ *** xref:admin_manual:installation/system_requirements.adoc[System Requirements] *** xref:admin_manual:installation/installing_with_docker.adoc[Installing With Docker] *** xref:admin_manual:installation/mount_folder_structure.adoc[Mount Folder Structure] +*** xref:admin_manual:installation/configuration_notes.adoc[Configuration Notes] *** xref:admin_manual:installation/apps_management_installation.adoc[Apps Management] **** xref:admin_manual:installation/apps_supported.adoc[Supported Apps] ***** xref:admin_manual:installation/apps/mediaviewer/index.adoc[Media Viewer] From 2cce05abdacc8792bacbebadf93cb092810571df Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Tue, 2 Jun 2026 10:45:22 +0200 Subject: [PATCH 18/38] update package-lock --- package-lock.json | 559 ++++++++++++++++++++++------------------------ 1 file changed, 271 insertions(+), 288 deletions(-) diff --git a/package-lock.json b/package-lock.json index ffc9ecaa5..183f8f176 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,12 +24,12 @@ } }, "node_modules/@antora/asciidoc-loader": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.14.tgz", - "integrity": "sha512-4xxisnoBFrlLNY6f3xZtyyfgm+tBLsqesTcEStfc8jtXUMYJ4b2DWIzo1vULmxvZ7yY5+Q7YqEvS5o6kIWAG0A==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.15.tgz", + "integrity": "sha512-MVspbcMPmBgxZms0EjmyC9nlCAWBJfHYSwQCXRZn6T7OujRrLvJFPgz+EROz9XOqh4v76BeqgEuLsUJIZjH3cw==", "license": "MPL-2.0", "dependencies": { - "@antora/logger": "3.1.14", + "@antora/logger": "3.1.15", "@antora/user-require-helper": "~3.0", "@asciidoctor/core": "~2.2" }, @@ -38,13 +38,13 @@ } }, "node_modules/@antora/asciidoc-loader/node_modules/@asciidoctor/core": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-2.2.8.tgz", - "integrity": "sha512-oozXk7ZO1RAd/KLFLkKOhqTcG4GO3CV44WwOFg2gMcCsqCUTarvMT7xERIoWW2WurKbB0/ce+98r01p8xPOlBw==", + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-2.2.9.tgz", + "integrity": "sha512-tIPRHo1T2SFmAm+j77cDsj0RuaszP7xJxsaVTTAF5CwKyTbazw9TnIVlpIWM5yWfIWAWcAZy92RcnPgMJwny1w==", "license": "MIT", "dependencies": { - "asciidoctor-opal-runtime": "0.3.3", - "unxhr": "1.0.1" + "asciidoctor-opal-runtime": "0.3.4", + "unxhr": "~1.2" }, "engines": { "node": ">=8.11", @@ -52,23 +52,14 @@ "yarn": ">=1.1.0" } }, - "node_modules/@antora/asciidoc-loader/node_modules/unxhr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unxhr/-/unxhr-1.0.1.tgz", - "integrity": "sha512-MAhukhVHyaLGDjyDYhy8gVjWJyhTECCdNsLwlMoGFoNJ3o79fpQhtQuzmAE4IxCMDwraF4cW8ZjpAV0m9CRQbg==", - "license": "MIT", - "engines": { - "node": ">=8.11" - } - }, "node_modules/@antora/cli": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.14.tgz", - "integrity": "sha512-I6WcygMU2bFInjdURJjkYjo7K5M8B3lBB53v9OO0IcY0LhEY8Wa7IlZ7wVinf5qEjHvaYzRGTZVl6RsJtVt7Sw==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.15.tgz", + "integrity": "sha512-76vLhkyzyFd49WJHsC04oPAZlK4qWbJaeZdS/pLUUVBqgaxeSeNqpTZ0pXo7f+5laGRO19fXyk1eDWGus9h8jA==", "license": "MPL-2.0", "dependencies": { - "@antora/logger": "3.1.14", - "@antora/playbook-builder": "3.1.14", + "@antora/logger": "3.1.15", + "@antora/playbook-builder": "3.1.15", "@antora/user-require-helper": "~3.0", "commander": "~11.1" }, @@ -80,13 +71,13 @@ } }, "node_modules/@antora/content-aggregator": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.14.tgz", - "integrity": "sha512-FVuBgnrGPiktYqK1WHbGF8O8l4m5KHlkxoJumrbacgFo8SKuiRFEo31zalxrCUsv8QM3UBEgX+LdHrve/9CGLg==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.15.tgz", + "integrity": "sha512-w84rJRKx+C4dsSbOHmjg78oM2T6xP9JRDsxpXjTmlh9T4zlNELCB6AD5s6Gztt3S6wlTiCNFLZw0v/HEVtuhzQ==", "license": "MPL-2.0", "dependencies": { "@antora/expand-path-helper": "~3.0", - "@antora/logger": "3.1.14", + "@antora/logger": "3.1.15", "@antora/user-require-helper": "~3.0", "braces": "~3.0", "cache-directory": "~2.0", @@ -114,14 +105,26 @@ "node": ">=14" } }, + "node_modules/@antora/content-aggregator/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@antora/content-classifier": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.14.tgz", - "integrity": "sha512-y8Fk+KU1lqD3aawOu3ZFK92YfOZ1k3YBJhLI9QIFM6Ck4STPnf7AwYbhfOtjODlwer5/OhFmfhjUB2hn7onGnA==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.15.tgz", + "integrity": "sha512-m7INbqJcXBZU04HdBMqfL/NvezC3aaJGHHa0KfzeEKICg5FT22cVsEp6mYTgJVT4HqRy7JPCn9UeZvoa9x+MzQ==", "license": "MPL-2.0", "dependencies": { - "@antora/asciidoc-loader": "3.1.14", - "@antora/logger": "3.1.14", + "@antora/asciidoc-loader": "3.1.15", + "@antora/logger": "3.1.15", "mime-types": "~2.1", "vinyl": "~3.0" }, @@ -130,12 +133,12 @@ } }, "node_modules/@antora/document-converter": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.14.tgz", - "integrity": "sha512-f6wFnL+489DI0ZDgoxYWzbxxWqPviRiJ56OHS1NixEfvJ7OpRBDPEbX1xnsIeiyFBgqX4+nY92MsCWKTa+Gf3w==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.15.tgz", + "integrity": "sha512-7YZsc/iIJVTxvHKy0/eqPTuRIJupBd7Pq49gWvCxiDBR9Zj4esqMZIU3HaIbkBgqJLlQv5TLBeTjiQ1Qpe1hNw==", "license": "MPL-2.0", "dependencies": { - "@antora/asciidoc-loader": "3.1.14" + "@antora/asciidoc-loader": "3.1.15" }, "engines": { "node": ">=16.0.0" @@ -151,24 +154,24 @@ } }, "node_modules/@antora/file-publisher": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.14.tgz", - "integrity": "sha512-fTaAnkyKSOlsxQM1TBFCAmiERA6Q67XleDCD2bMPVgfcENmo0Xfx59KwCHaA92IcRSmMftydlXHPaFxNh0UVsg==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.15.tgz", + "integrity": "sha512-UfLYeyD6Na9YXespr3Xjy6OPIAGG6GTbdW3SNn8KxHl3hGeF/AtM3NaR+AJgyOmTb2r9lHzfODXeZevqX+vMww==", "license": "MPL-2.0", "dependencies": { "@antora/expand-path-helper": "~3.0", "@antora/user-require-helper": "~3.0", "vinyl": "~3.0", - "yazl": "~2.5" + "yazl": "~3.3" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/logger": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.14.tgz", - "integrity": "sha512-kVEeGqZbXR903hPIm+BlN97fLdQ3LoUzE/BOPZ6vRp9m9Mmbnm67Kg7fSYkfTMLB0S2UWpAPFg22RdsU5ZoAzA==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.15.tgz", + "integrity": "sha512-txA2Nv0QQ+hIt6arc3Rrh1BiUJNlucsyNF7ZA7LgtN+rzxyjcqQPpbQ2F3tU2lOV/LOQCEvMbmz9Dj0tY8oBuA==", "license": "MPL-2.0", "dependencies": { "@antora/expand-path-helper": "~3.0", @@ -181,24 +184,24 @@ } }, "node_modules/@antora/navigation-builder": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.14.tgz", - "integrity": "sha512-/637YLGD7oUHGSfEfszXkk4ASfIhDAg5Xs9035J1dV07XYRlGqmtUb15rtapbcECpcQFjCyM5jFQYSNNvLrGcQ==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.15.tgz", + "integrity": "sha512-XRs4pfNd88GCG9lDAJ1J+2vwvre7OzNRSgRmZhEhtgv0A13NEZq37X4YuaH46F2kj2BqiZT8UOuxqAqarLaxmg==", "license": "MPL-2.0", "dependencies": { - "@antora/asciidoc-loader": "3.1.14" + "@antora/asciidoc-loader": "3.1.15" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/page-composer": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.14.tgz", - "integrity": "sha512-RfA+67TxCqUPrQbZdrfjgLpHh8MR2z2du7cyF3HGX4N6DpqEBvz81NHHl3rA3fj6BQZPQbGm2OYAMU6wzJ6Pog==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.15.tgz", + "integrity": "sha512-koKlhWilA0E0QdCCOeLLzCFLNViBVjNe3aIlmJnMCwAK0p85wyhVfyolNqbNejAvdCZ87YhUQJ52Q4ikCgkQQg==", "license": "MPL-2.0", "dependencies": { - "@antora/logger": "3.1.14", + "@antora/logger": "3.1.15", "handlebars": "~4.7", "require-from-string": "~2.0" }, @@ -207,9 +210,9 @@ } }, "node_modules/@antora/playbook-builder": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.14.tgz", - "integrity": "sha512-Ss2r7In00u/n9Da+JOxEqIE8NeRosf+f+agzH3Te09JV/mpgZKxEOE5V/VuP+TNNq4ww1eu5aOS8DiU2PYwj4Q==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.15.tgz", + "integrity": "sha512-L2bE9FS0Th/d37DeDjz/dg9YXrkHM1xI0WQB3eiW3K/6d0Mc7eJhbmDMT0K8S+hgdaO0AT4kqDWzvx2866ZobA==", "license": "MPL-2.0", "dependencies": { "@iarna/toml": "~2.2", @@ -221,10 +224,22 @@ "node": ">=16.0.0" } }, + "node_modules/@antora/playbook-builder/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@antora/redirect-producer": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.14.tgz", - "integrity": "sha512-5koAwRk1cZrvE/qfOWKXqb3jtxrZbWA5EYHYGFEoato5By3cbC42blH4Bre9/48pjyS6znFpbZhYUBpT7PRhZA==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.15.tgz", + "integrity": "sha512-mV0KnRiTr9oi0hPm7okT/Bw8kkz+PWYxp9AVSGqzhkoQgr3crxhgyS0NFCoViHwjaj4NfQrf++yxbhr6Igd7Dw==", "license": "MPL-2.0", "dependencies": { "vinyl": "~3.0" @@ -234,24 +249,24 @@ } }, "node_modules/@antora/site-generator": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.14.tgz", - "integrity": "sha512-hQIUVtM9+xwleYWc4fIRZmiKl2p+ItOJuUm2+Hkdh07BZsySxkMOxxCyZsvTn9rc+4R94CYqDQCYElwFwdB2WA==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.15.tgz", + "integrity": "sha512-Z9YiRTqw3ssnLQxSHI3VZHEPLytQXt8cWC5C/o9vS+Fc560TSNs1UO4quPFIkg+bFUpxXtcAxqbp650aA4/N1g==", "license": "MPL-2.0", "dependencies": { - "@antora/asciidoc-loader": "3.1.14", - "@antora/content-aggregator": "3.1.14", - "@antora/content-classifier": "3.1.14", - "@antora/document-converter": "3.1.14", - "@antora/file-publisher": "3.1.14", - "@antora/logger": "3.1.14", - "@antora/navigation-builder": "3.1.14", - "@antora/page-composer": "3.1.14", - "@antora/playbook-builder": "3.1.14", - "@antora/redirect-producer": "3.1.14", - "@antora/site-mapper": "3.1.14", - "@antora/site-publisher": "3.1.14", - "@antora/ui-loader": "3.1.14", + "@antora/asciidoc-loader": "3.1.15", + "@antora/content-aggregator": "3.1.15", + "@antora/content-classifier": "3.1.15", + "@antora/document-converter": "3.1.15", + "@antora/file-publisher": "3.1.15", + "@antora/logger": "3.1.15", + "@antora/navigation-builder": "3.1.15", + "@antora/page-composer": "3.1.15", + "@antora/playbook-builder": "3.1.15", + "@antora/redirect-producer": "3.1.15", + "@antora/site-mapper": "3.1.15", + "@antora/site-publisher": "3.1.15", + "@antora/ui-loader": "3.1.15", "@antora/user-require-helper": "~3.0" }, "engines": { @@ -259,12 +274,12 @@ } }, "node_modules/@antora/site-mapper": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.14.tgz", - "integrity": "sha512-3qbETtwadl+fWREjzrBUxPUorMcMiZ+hdkB1El9z7it9KzKh0Yp7Je0+2uTxGX+Lov9uik48dZJ9e/mr5PeaRQ==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.15.tgz", + "integrity": "sha512-dV5zGeL1uMQ83sfkBWKg8vjaJQXz1Zh3ZSNQZYa64HnT4M7oSuQUzwDZdS0j6ZtTiYcNGulRi1ucz3uIoc9tqw==", "license": "MPL-2.0", "dependencies": { - "@antora/content-classifier": "3.1.14", + "@antora/content-classifier": "3.1.15", "vinyl": "~3.0" }, "engines": { @@ -272,21 +287,21 @@ } }, "node_modules/@antora/site-publisher": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.14.tgz", - "integrity": "sha512-8apyEmgepUc7ms9CTEIPwN3tGtWwLqR6fbLMLs7hibqmOSR880Ut/4GRGb97sqcGQXSHdIyWK2oJKzRl1Akb6Q==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.15.tgz", + "integrity": "sha512-pBuNxgA+H+WB5F4gA/gim5wKx/884QwlqOl0CpOY+6Fqn7h2ooHA7Tv6O47Tra1nZzNbIe3CQRoA5pnrX6zyRw==", "license": "MPL-2.0", "dependencies": { - "@antora/file-publisher": "3.1.14" + "@antora/file-publisher": "3.1.15" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/ui-loader": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.14.tgz", - "integrity": "sha512-LVvTdKQOB44CmJ1JQDu8sJf6rrLZMxPAWWackdg2JtGyGHHpd80/MBcv4BSFk7//cJQ13Oqm/7JCbhD51KAFjg==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.15.tgz", + "integrity": "sha512-zYjF5ID7t6mUEJuMyeNW/AYu1U0026wZj58H0siGuaT5YhVoxZrfvZYWV5iCMntpKduMqkwZW/l+D4MIqjhFYQ==", "license": "MPL-2.0", "dependencies": { "@antora/expand-path-helper": "~3.0", @@ -299,7 +314,7 @@ "should-proxy": "~1.0", "simple-get": "~4.0", "vinyl": "~3.0", - "yauzl": "~3.1" + "yauzl": "~3.3" }, "engines": { "node": ">=16.0.0" @@ -314,6 +329,18 @@ "node": ">=14" } }, + "node_modules/@antora/ui-loader/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@antora/user-require-helper": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@antora/user-require-helper/-/user-require-helper-3.0.0.tgz", @@ -374,30 +401,30 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -407,13 +434,13 @@ } }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -476,13 +503,13 @@ } }, "node_modules/@types/node": { - "version": "24.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", - "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.14.0" + "undici-types": ">=7.24.0 <7.24.7" } }, "node_modules/a-sync-waterfall": { @@ -543,13 +570,13 @@ } }, "node_modules/antora": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/antora/-/antora-3.1.14.tgz", - "integrity": "sha512-z8HshJsT6pUfdDOUJ15RGtpOM9LmL6JXU5JBshoR/9/xd+1qLmKPkOnUv+HrijAk93r1imxZOdkmIqhLcv8B8A==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/antora/-/antora-3.1.15.tgz", + "integrity": "sha512-nxz8n7sbKP58hhK13Mack+r3mELxFVYJm9fUBjefUhHWP3cjU/AX3LVVoFwssDOau3Gh+/id9xDNj8Vp5rbBNA==", "license": "MPL-2.0", "dependencies": { - "@antora/cli": "3.1.14", - "@antora/site-generator": "3.1.14" + "@antora/cli": "3.1.15", + "@antora/site-generator": "3.1.15" }, "bin": { "antora": "bin/antora" @@ -612,63 +639,14 @@ } }, "node_modules/asciidoctor-opal-runtime": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/asciidoctor-opal-runtime/-/asciidoctor-opal-runtime-0.3.3.tgz", - "integrity": "sha512-/CEVNiOia8E5BMO9FLooo+Kv18K4+4JBFRJp8vUy/N5dMRAg+fRNV4HA+o6aoSC79jVU/aT5XvUpxSxSsTS8FQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/asciidoctor-opal-runtime/-/asciidoctor-opal-runtime-0.3.4.tgz", + "integrity": "sha512-zqd6zn1LV+PZ69AP/kEbB00zuPHMIAJY3IX8+aZV+X1qOwatYvKGjsMmdMc5ApfhtkjZ4mYkqiTPJWnEnBiMJg==", "license": "MIT", "dependencies": { - "glob": "7.1.3", - "unxhr": "1.0.1" - }, - "engines": { - "node": ">=8.11" - } - }, - "node_modules/asciidoctor-opal-runtime/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/asciidoctor-opal-runtime/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/asciidoctor-opal-runtime/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "fast-glob": "~3.3", + "unxhr": "~1.2" }, - "engines": { - "node": "*" - } - }, - "node_modules/asciidoctor-opal-runtime/node_modules/unxhr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unxhr/-/unxhr-1.0.1.tgz", - "integrity": "sha512-MAhukhVHyaLGDjyDYhy8gVjWJyhTECCdNsLwlMoGFoNJ3o79fpQhtQuzmAE4IxCMDwraF4cW8ZjpAV0m9CRQbg==", - "license": "MIT", "engines": { "node": ">=8.11" } @@ -716,9 +694,9 @@ } }, "node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", "license": "Apache-2.0", "peerDependencies": { "react-native-b4a": "*" @@ -748,10 +726,18 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", - "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", - "license": "Apache-2.0" + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.3.tgz", + "integrity": "sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } }, "node_modules/base64-js": { "version": "1.5.1", @@ -847,9 +833,9 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -930,12 +916,12 @@ } }, "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "license": "MIT", "engines": { - "node": "*" + "node": ">=8.0.0" } }, "node_modules/buffer-from": { @@ -958,14 +944,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -1275,12 +1261,6 @@ "node": ">=16" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, "node_modules/concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", @@ -1318,9 +1298,9 @@ } }, "node_modules/convict": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/convict/-/convict-6.2.4.tgz", - "integrity": "sha512-qN60BAwdMVdofckX7AlohVJ2x9UvjTNoKVXCL2LxFk1l7757EJqf1nySdMkPQer0bt8kQ5lQiyZ9/2NvrFBuwQ==", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.2.5.tgz", + "integrity": "sha512-JtXpxqDqJ8P0UwEHwhxLzCIXQy97vlYBZR222Sbzb1q1Erex9ASrztJ29SyhWFQjod1AeFBaPzEEC8YvtZMIYg==", "license": "Apache-2.0", "dependencies": { "lodash.clonedeep": "^4.5.0", @@ -1657,9 +1637,9 @@ } }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -1772,18 +1752,18 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" @@ -1802,9 +1782,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, "funding": [ { @@ -1940,7 +1920,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -1981,9 +1961,9 @@ } }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "license": "MIT", "dependencies": { "minimist": "^1.2.5", @@ -2064,9 +2044,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -2114,6 +2094,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "dev": true, "license": "MIT", "dependencies": { @@ -2270,9 +2251,9 @@ } }, "node_modules/humanize-duration": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.33.1.tgz", - "integrity": "sha512-hwzSCymnRdFx9YdRkQQ0OYequXiVAV6ZGQA2uzocwB0F4309Ke6pO8dg0P8LHhRQJyVjGteRTAA/zNfEcpXn8A==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.33.2.tgz", + "integrity": "sha512-K7Ny/ULO1hDm2nnhvAY+SJV1skxFb61fd073SG1IWJl+D44ULrruCuTyjHKjBVVcSuTlnY99DKtgEG39CM5QOQ==", "dev": true, "license": "Unlicense", "funding": { @@ -2357,12 +2338,12 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -2600,9 +2581,19 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -2726,9 +2717,9 @@ } }, "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -2784,9 +2775,9 @@ } }, "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -3200,15 +3191,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -3228,9 +3210,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -3396,9 +3378,9 @@ } }, "node_modules/pino-std-serializers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", - "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", "license": "MIT" }, "node_modules/portfinder": { @@ -3492,12 +3474,12 @@ } }, "node_modules/pug": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", - "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.4.tgz", + "integrity": "sha512-kFfq5mMzrS7+wrl5pLJzZEzemx34OQ0w4SARfhy/3yxTlhbstsudDwJzhf1hP02yHzbjoVMSXUj/Sz6RNfMyXg==", "license": "MIT", "dependencies": { - "pug-code-gen": "^3.0.3", + "pug-code-gen": "^3.0.4", "pug-filters": "^4.0.0", "pug-lexer": "^5.0.1", "pug-linker": "^4.0.0", @@ -3519,9 +3501,9 @@ } }, "node_modules/pug-code-gen": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", - "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.4.tgz", + "integrity": "sha512-6okWYIKdasTyXICyEtvobmTZAVX57JkzgzIi4iRJlin8kmhG+Xry2dsus+Mun/nGCn6F2U49haHI5mkELXB14g==", "license": "MIT", "dependencies": { "constantinople": "^4.0.1", @@ -3625,9 +3607,9 @@ "license": "MIT" }, "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -3645,9 +3627,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3752,12 +3734,13 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -3972,14 +3955,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -4141,9 +4124,9 @@ } }, "node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.26.0.tgz", + "integrity": "sha512-VvNG1K72Po/xwJzxZFnZ++Tbrv4lwSptsbkFuzXCJAYZvCK5nnxsvXU6ajqkv7chyiI1Y0YXq2Jh8Iy8Y7NF/A==", "license": "MIT", "dependencies": { "events-universal": "^1.0.0", @@ -4252,9 +4235,9 @@ } }, "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.4" @@ -4456,18 +4439,18 @@ } }, "node_modules/undici": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.19.0.tgz", - "integrity": "sha512-Heho1hJD81YChi+uS2RkSjcVO+EQLmLSyUlHyp7Y/wFbxQaGb4WXVKD073JytrjXJVkSZVzoE2MCSOKugFGtOQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.0.tgz", + "integrity": "sha512-+t2Z/GwkZQDtu00813aP66ygViGtPHKhhoFZpQKpKrE+9jIgES+Zw+mFNaDWOVRKiuJjuqKHzD3B1sfGg8+ZOQ==", "license": "MIT", "engines": { "node": ">=20.18.1" } }, "node_modules/undici-types": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", - "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "dev": true, "license": "MIT" }, @@ -4559,7 +4542,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "dev": true, "license": "MIT" }, @@ -4591,6 +4574,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" @@ -4609,13 +4593,13 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.21.tgz", + "integrity": "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", @@ -4793,12 +4777,11 @@ } }, "node_modules/yauzl": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.1.3.tgz", - "integrity": "sha512-JCCdmlJJWv7L0q/KylOekyRaUrdEoUxWkWVcgorosTROCFWiS9p2NNPE9Yb91ak7b1N5SxAZEliWpspbZccivw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.3.2.tgz", + "integrity": "sha512-Md9ankxxN23wncAN8s7+Tn3Co52zLUPMtnrLAbVCnfG5d2tKBFfmygYSgXlqFgXObtzIgqkx7aNgDBpso9+4qA==", "license": "MIT", "dependencies": { - "buffer-crc32": "~0.2.3", "pend": "~1.2.0" }, "engines": { @@ -4806,12 +4789,12 @@ } }, "node_modules/yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-3.3.1.tgz", + "integrity": "sha512-BbETDVWG+VcMUle37k5Fqp//7SDOK2/1+T7X8TD96M3D9G8jK5VLUdQVdVjGi8im7FGkazX7kk5hkU8X4L5Bng==", "license": "MIT", "dependencies": { - "buffer-crc32": "~0.2.3" + "buffer-crc32": "^1.0.0" } } } From c82cedabbc46ae5c08719240dbd2dce3dee9ef97 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Tue, 2 Jun 2026 19:07:27 +0200 Subject: [PATCH 19/38] wnd update --- .../installation/docker/docker-compose.yml | 30 +- .../windows-network-drive_configuration.adoc | 319 ++++-------------- .../external_storage/wnd_quick_guide.adoc | 178 ---------- .../installation/configuration_notes.adoc | 2 +- modules/admin_manual/partials/nav.adoc | 1 - 5 files changed, 84 insertions(+), 446 deletions(-) delete mode 100644 modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc diff --git a/modules/admin_manual/examples/installation/docker/docker-compose.yml b/modules/admin_manual/examples/installation/docker/docker-compose.yml index 9da7a934b..31a6de898 100644 --- a/modules/admin_manual/examples/installation/docker/docker-compose.yml +++ b/modules/admin_manual/examples/installation/docker/docker-compose.yml @@ -1,10 +1,9 @@ -services: - owncloud: +# This oc-common template is a compose extension for ownCloud. +# It is used for starting the main ownCloud instance and reused e.g. when defining listeners for WND. +# This eases compose maintenance a lot. +x-owncloud: &oc-common image: owncloud/server:${OWNCLOUD_IMAGE} - container_name: owncloud_server restart: always - ports: - - ${HTTP_PORT}:8080 depends_on: - mariadb - redis @@ -29,6 +28,23 @@ services: networks: - oc_network +services: + + owncloud: + # Start the main ownCloud instance + <<: *oc-common + container_name: owncloud_server + ports: + - ${HTTP_PORT}:8080 + +# owncloud-wnd-1: +# # Enterprise only: uncomment and configure it accordingly if WND is used ! +# # Create as many of these services (containers) as you need listeners for different host/share pairs. +# # Read the documentation for more details, such when you want to use a password file. +# <<: *oc-common +# container_name: owncloud-wnd-1 +# command: ["/usr/bin/owncloud", "occ", "wnd:listen", "myhost", "myshare", "workgroup\myuser", "password"] + mariadb: image: mariadb:${MARIADB_IMAGE} container_name: owncloud_mariadb @@ -72,14 +88,14 @@ services: volumes: oc_files: driver: local -# template when using bind mounts +# Options when using bind mounts # driver_opts: # type: none # device: /mnt/oc # o: bind mysql: driver: local -# use the above template for bind mounts +# Use the above options when configuring bind mounts redis: driver: local diff --git a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc index f88fe85dd..6e6d54326 100644 --- a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc +++ b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc @@ -287,196 +287,119 @@ NOTE: The capability of the listener depends on the ability of the used SMB/CIFS ==== WND Listener Setup -The WND listener for ownCloud 10 includes two different commands that need to be executed: +The WND listener for ownCloud 11 includes two different commands that need to be executed: -* xref:wndlisten[wnd:listen] Listen to changes and save them in the database -* xref:wndprocess-queue[wnd:process-queue] Process saved listener changes from the database +* xref:wndlisten[wnd:listen] + +Listen to changes and save them in the database. + +The general pattern for the listener is: ++ +[source,plaintext] +---- +occ wnd:listen "myhost", "myshare", "workgroup\myuser", "password" +---- + +* xref:wndprocess-queue[wnd:process-queue] + +Process saved listener changes from the database . ===== wnd:listen -This command listens to changes for each host and share configured and stores all notifications gathered in the database. _It is intended to run this command as a service_. The command requires the Windows/Samba account and the host/share the listener will listen to. The command does not produce any output by default, unless an error happens. Each stored notification will be further processed by the `wnd:process-queue` and will be removed from the database after processing. +This command listens to changes for each host and share configured and stores all notifications gathered in the database. -NOTE: You can increase the command's verbosity by using `-vvv`. Doing so displays the listeners activities including a timestamp and the notifications received. A _read-only_ permission for the used account should be enough, but may need to be increased. +[NOTE] +==== +* This command needs configuration in the docker compose environment to be activated. A prepared example is given but needs configuration. You need to create as many services as you need listeners. -The simplest way, useful for initial testing is, to start the `wnd:listen` process manually, as follows: +* You can increase the command's verbosity by using `-vvv`. Doing so displays the listeners activities in the log including a timestamp and the notifications received. -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} wnd:listen ----- +* A _read-only_ permission for the used account should be enough, but may need to be increased. +==== -NOTE: Run this command inside the ownCloud Docker container. +The command does not produce any output by default, unless an error happens. Each stored notification will be further processed by the `wnd:process-queue` which is described in teh next chapter and will be removed from the database after processing. -The password is an optional parameter and you will be asked for it if you didn't provide it as in the example above. If necessary, the workgroup can be set together with the username as well. Use following syntax and set quotes, which is important to keep the backslash `'\'`. The whole example command looks like: +The password is a required parameter in the compose example and can be provided in different ways. Replace "password" in the compose example with one of the options below. The password value is always in plain text. -[source,bash,subs="attributes+"] +* Directly added as value. + +* Read from a file. + +Neither spaces nor newline characters will be removed from the file by default, unless the `--password-trim` option is added. The password file must be readable by the Apache user `www-data`. Note that you need to add a volume to pass the file to the service. ++ +-- +[source,docker] ---- -{occ-command-example-prefix-docker} wnd:listen '\' +--password-file=/run/secrets/wnd_password --password-trim ---- -NOTE: Run this command inside the ownCloud Docker container. +Make sure that the password file is outside of any directory handled by apache (web-readable) for security reasons. -In order to start `wnd:listen` without any user interaction like as service, provide the password from a password file. +NOTE: If you use the `--password-file` switch, the entire contents of the file will be used for the password, please be careful with newlines. +-- -[source,bash,subs="attributes+"] +* Using the `service account password`. + +This password is already stored in the ownCloud database if you setup WND in collaborative mode. In this mode, you set the username and the option for the `occ` command to reuse the password stored in the database. The example command looks like: ++ +-- +[source,docker] ---- -{occ-command-example-prefix-docker} wnd:listen \ - --password-file=/my/secret/password/file \ - --password-trim +--password-from-service-account ---- -NOTE: Run this command inside the ownCloud Docker container. - -For additional options to provide the password, check xref:password-options[Password Options]. - -Note that the password must be in plain text inside the file. Neither spaces nor newline characters will be removed from the contents of the file by default, unless the `--password-trim` option is added. The password file must be readable by the apache user (or www-data). Also make sure that the password file is outside of any directory handled by apache (web-readable) for security reasons. You may use the same location when using flock in xref:execution-serialization[Execution Serialization] below. - -You should be able to run any of those commands, and/or wrap them into a systemd service or any other startup service, so that the `wnd:listen` command is automatically started post booting. +IMPORTANT: You need to ensure that the triple of ``, `` and `` (including any kind of workgroup if used) matches the configuration made for the WND collaborative share. The command will fail otherwise. +-- ===== wnd:process-queue -This command processes the stored notifications for a given host and share. This process is intended to be run periodically as a Cron job, or via a similar mechanism. The command will process the notifications stored by the `wnd:listen` process, showing only errors by default. If you need more information, increase the verbosity by calling `wnd:process-queue -vvv`. +This command processes the stored notifications for a given host and share. This process is intended to be run periodically as a Cron job on the host, or via a similar mechanism. The command will process the notifications stored by the `wnd:listen` process, showing only errors by default. If you need more information, increase the verbosity by calling `wnd:process-queue -vvv`. -As a simple example, you can check the following: +As aa example, you can issue the following command, replacing and accordingly: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} wnd:process-queue ---- -NOTE: Run this command inside the ownCloud Docker container. - -You can run that command, even if there are no notifications to be processed. - -Depending on your requirements, you can wrap that command in a Cron job so it's run every 5 minutes for example. +You can run this command even if there are no notifications to process. -==== WND Listener Service Configuration +Depending on your requirements, you can schedule that command to run on the host every five minutes using a cron job, for example. -Create a service for `systemd` following the instructions below that checks for processable notifications: - -[NOTE] -==== -* Replace the all upper case words `SERVER`, `SHARE`, `USER` and `PASSWORD` in both, the **filename** and in the **contents** below with their respective values. -* Take care to also adjust the paths in `WorkingDirectory` and `ExecStart` according to your installation. -==== - -* For each WND mount point distinguished by a SERVER - SHARE pair: -** Replace the all upper case words `SERVER`, `SHARE`, `USER` and `PASSWORD` in both, the **filename** and in the **contents** below with their respective values. -** Place one copy of a file with the content from below under `/etc/systemd/system/owncloud-wnd-listen-SERVER-SHARE.service` + -To do so, enter following command and replace with `owncloud-wnd-listen-SERVER-SHARE`. For more details see https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units#editing-unit-files[Editing Unit Files]. -+ -[source,bash] ----- -sudo systemctl edit --force --full .service ----- -+ -Reload the deamon to make it available: +* Create or add a `crontab` file in `/etc/cron.d/oc-wnd-process-queue`. + -[source,bash] ----- -sudo systemctl daemon-reload ----- -** Take care to also adjust the paths in `WorkingDirectory` and `ExecStart` according to your installation. -** Password: Create a file readable only by the www-data user and outside the directories handled by Apache - (let's suppose in /tmp/mypass). The file must contain only the password for the share. In this example our - file is: "/tmp/mypass". The listener will read the contents of the file and use them as the password for -the account. This way, only root and the Apache user should have access to the password. -** `--password-trim` in directive `ExecStart` removes blank characters from the password file added by 3rdparty software or other services. - -* Content template for `owncloud-wnd-listen-SERVER-SHARE` -+ -[source,plaintext] ----- -[Unit] -Description=ownCloud WND Listener for SERVER SHARE -After=syslog.target -After=network.target -Requires=apache2.service -[Service] -User=www-data -Group=www-data -WorkingDirectory=/var/www/owncloud -ExecStart=./occ wnd:listen -vvv SERVER SHARE USER --password-file=/tmp/mypass --password-trim -Type=simple -StandardOutput=journal -StandardError=journal -SyslogIdentifier=%n -KillMode=process -RestartSec=3 -Restart=always -[Install] -WantedBy=multi-user.target ----- - -* Run the following command, once for each created file: -+ -[source,bash] ----- -sudo systemctl daemon-reload -sudo systemctl enable owncloud-wnd-listen-SERVER-SHARE.service -sudo systemctl start owncloud-wnd-listen-SERVER-SHARE.service ----- - -* To list all systemd wnd listeners for ownCloud run the following command, assuming you use the naming convention described above: -+ -[source,bash] ----- -systemctl list-units | grep owncloud-wnd-listen ----- - -* Please re-run the following commands if you are changing the contents of a particular listener service: -+ -[source,bash] ----- -sudo systemctl daemon-reload -sudo systemctl restart owncloud-wnd-listen-SERVER-SHARE.service ----- - -For more information about configuring services for systemd, read {manage-systemd-services-url}[How To Use Systemctl to Manage Systemd Services and Units] - -==== WND Process Queue Configuration - -Create or add a `crontab` file in `/etc/cron.d/oc-wnd-process-queue`. - NOTE: The commands must be **strictly sequential**. This can be done by using `flock -n` and tuning the `-c` (chunk-size) parameter of `occ wnd:process-queue`, see the xref:configuration/server/occ_command.adoc#windows-network-drive-wnd[wnd occ commands] description and the xref:execution-serialization[Execution Serialization] below. * Make a `crontab` entry to run a script iterating over all `SERVER SHARE` pairs with an appropriate `occ wnd:process-queue` command. + -[source,bash] +[source,bash,subs="attributes+"] ---- -* * * * * sudo -u www-data /var/www/owncloud/occ wnd:process-queue +* * * * * cd && {occ-command-example-prefix-docker} wnd:process-queue ---- -===== Execution Serialization - +[#execution-serialization] +* Execution Serialization: ++ +-- Parallel runs of `wnd:process-queue` might lead to a user lockout. The reason for this is that several `wnd:process-queue` might use the same wrong password because it hasn't been updated by the time they fetch it. -It's recommended to force the execution serialization of the `wnd:process-queue` command. You might want to use {anacron-examples}[Anacron], which seems to have an option for this scenario, or wrap the command with -{shell-flock-intro}[flock]. +It's recommended to force the execution serialization of the `wnd:process-queue` command. You might want to use {anacron-examples}[Anacron], which seems to have an option for this scenario, or wrap the command with {shell-flock-intro}[flock]. -If you need to serialize the execution of the `wnd:process-queue`, check the following example with {shell-flock-intro}[flock] +If you need to serialize the execution of the `wnd:process-queue`, check the following example with {shell-flock-intro}[flock]: [source,bash,subs="attributes+"] ---- flock -n /opt/my-lock-file {occ-command-example-prefix-docker} wnd:process-queue ---- -NOTE: Run this command inside the ownCloud Docker container. - -In that case, flock will try to get the lock of that file and won't run the command if it isn't possible. For our case, and considering that file isn't being used by any other process, it will run only one `wnd:process-queue` at a time. If someone tries to run the same command a second time while the previous one is running, the second will fail and won't be executed. +In that case, `flock` will attempt to acquire a lock on that file and will not run the command if this is not possible. In our case, since the file isn't being used by any other process, only one `wnd:process-queue` will run at a time. If someone tries to run the same command a second time while the previous one is still running, the second command will fail and won't be executed. -The lock file `/opt/my-lock-file` itself will be created as an empty file by the `flock` command if it does not yet exist, but after it has been created the lock file doesn't change. Only an flock will be applied and removed. The file won't be removed after the script completes. +If the lock file (`/opt/my-lock-file`) does not yet exist, the `flock` command will create it as an empty file. Once created, the lock file does not change. Only a lock will be applied and then removed. The file will not be deleted once the script has finished running. You can use flock also in cron, see the example below: [source,bash,subs="attributes+"] ---- -* * * * * flock -n /opt/my-lock-file -c 'sudo -u www-data /var/www/owncloud/occ wnd:process-queue ' +* * * * * cd && flock -n /opt/my-lock-file -c '{occ-command-example-prefix-docker} wnd:process-queue ' ---- -NOTE: Run this command inside the ownCloud Docker container. - Check {flock-docs-url}[flock's documentation] for details and more options. +-- === Activity Extension @@ -495,7 +418,7 @@ This extension requires the following components: For setting up the `wnd:listen` and `wnd:process-queue` commands, see their respective sections above. -This extension is disabled by default. This means that no activity will reach the users. In order to enable this extension, you can edit the `config/config.php` file and add the following configuration: +This extension is disabled by default. This means that no activity will reach the users. In order to enable this extension, you can edit your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file] and add the following configuration: [source,php] ---- @@ -510,14 +433,14 @@ The events are expected to reach only to the affected users. This filters out th As part of the Activity app configuration, users can decide which events they want to be notified about and how, in the activity stream or via email. -Users who can access the Windows Network Drive storage via share won't receive activity notifications by default. You can add the following configuration in the `config/config.php` file to enable sending the activity notification to those users. +Users who can access the Windows Network Drive storage via share won't receive activity notifications by default. You can edit your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file] and add the following configuration to enable sending the activity notification to those users: [source,php] ---- 'wnd.activity.sendToSharees' => true, ---- -NOTE: `wnd.activity.sendToSharees` key depends on the `wnd.activity.registerExtension` key to take effect. +NOTE: The `wnd.activity.sendToSharees` key depends on the `wnd.activity.registerExtension` key to take effect. === Collaborative WND @@ -698,63 +621,6 @@ As said, the command processes all the stored notifications, squeezes them and s On the one hand the memory usage is reduced, on the other hand there is more network activity. We recommend using the option with a value high enough to process a large number of notifications, but not so large to crash the process. Between 200 and 500 should be fine, and we'll likely process all the notifications in one go. -=== Password Options - -There are several ways to supply a password: - -. Interactively in response to a password prompt. -+ -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} wnd:listen ----- -+ -NOTE: Run this command inside the ownCloud Docker container. - -. Sent as a parameter to the command. -+ -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} wnd:listen ----- -+ -NOTE: Run this command inside the ownCloud Docker container. - -. Read from a file, using the `--password-file` switch to specify the file to read from. Note, that the password must be in plain text inside the file, and neither spaces nor newline characters will be removed from the file by default, unless the `--password-trim` option is added. The password file must be readable by the apache user (or www-data) -+ -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} wnd:listen \ - --password-file=/my/secret/password/file ----- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} wnd:listen \ - --password-file=/my/secret/password/file \ - --password-trim ----- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ -NOTE: If you use the `--password-file` switch, the entire contents of the file will be used for the password, so please be careful with newlines. -+ -IMPORTANT: If using `--password-file` make sure that the file is only readable by the apache / www-data user and inaccessible from the web. This prevents tampering or leaking of the information. The password won't be leaked to any other user using `ps`. -. Using 3rd party software to store and fetch the password. When using this option, the 3rd party app needs to show the password as plaintext on standard output. -. Using the service account password, which is already stored in the database if you setup WND in collaborative mode. In this mode, you set the username and the option for the `occ` command to reuse the password stored in the database. The example command looks like: -+ -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} wnd:listen - --password-from-service-account ----- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ -IMPORTANT: You need to ensure that the triple of ``, `` and `` (including any kind of workgroup if used) matches the configuration made for the WND collaborative share. The command will fail otherwise. - === Reduce WND Notifier Memory Usage The WND in-memory notifier for password changes provides the ability to notify all _affected_ WND storages to reset their passwords. This feature is intended to prevent a password lockout for the user in the backend. However, this functionality _can_ consume a significant amount of memory. To disable it, add the following configuration to your `config/config.php.`: @@ -766,71 +632,6 @@ The WND in-memory notifier for password changes provides the ability to notify a NOTE: The password will be reset on the next request, regardless of the flag setting. -=== 3rd Party Software Examples - -Third party password managers or processes can be integrated. The only requirement is that they have to provide the password in plain text somehow. If not, additional operations might be required to get the password as plain text and inject it in the listener. - -==== plainpass - -This provides a bit more security because the `/tmp/plainpass` password as shown below should be owned by root and only root should be able to read the file (0400 permissions); Apache, particularly, shouldn't be able to read it. It's expected that root will be the one to run this command. - -[source,bash,subs="attributes+"] ----- -cat /tmp/plainpass | {occ-command-example-prefix-docker} wnd:listen --password-file=- ----- - -NOTE: Run this command inside the ownCloud Docker container. - -==== base64 - -Similar to plainpass, the content in this case gets encoded in the {base64-url}[Base64 format]. There's not much security, but it has additional obfuscation. - -[source,bash,subs="attributes+"] ----- -base64 -d /tmp/encodedpass | \ - {occ-command-example-prefix-docker} wnd:listen --password-file=- ----- - -NOTE: Run this command inside the ownCloud Docker container. - -==== pass - -Example using "pass" - -* You can go through {pass-url}[manage passwords from the command line] to set up the keyring for whoever will fetch the password (probably root) and then use something like the following: - -[source,bash,subs="attributes+"] ----- -pass the-password-name | {occ-command-example-prefix-docker} wnd:listen --password-file=- ----- - -NOTE: Run this command inside the ownCloud Docker container. - -==== HashiCorp Vault - -This example uses {vaultproject-url}[Vault] as the secrets store. See {hashicorp-url}[HCP Vault] on how to setup the secrets store. Then use something like the following: - -[source,bash,subs="attributes+"] ----- -vault kv get -field=password secret/samba | {occ-command-example-prefix-docker} wnd:listen --password-file=- ----- - -NOTE: Run this command inside the ownCloud Docker container. - -Use Vault's ACLs to limit access to the token. Destroy the token after starting the service during boot with systemd. - -=== Password Option Precedence - -If both the argument and the option are passed, e.g., -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} wnd:listen --password-file=/opt/pass` ----- - -NOTE: Run this command inside the ownCloud Docker container. - -then the `--password-file` option will take precedence. - === Optimizing wnd:process-queue NOTE: Do not use this option if the process-queue is fast enough. The option has some drawbacks, specifically regarding password changes in the backend. diff --git a/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc b/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc deleted file mode 100644 index 03d6eb044..000000000 --- a/modules/admin_manual/pages/enterprise/external_storage/wnd_quick_guide.adoc +++ /dev/null @@ -1,178 +0,0 @@ -= WND Configuration Quick Guide -:toc: right -:toclevels: 2 - -== Introduction - -This is a quick guide for installing and configuring the Windows Network Drive (WND) app. - -== Enable the App - -The app is part of the ownCloud Docker image and only needs to be enabled: - -WebUI:: -Go to menu:Settings[Admin > Apps] and enable the app. - -Command line:: -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} app:enable windows_network_drive ----- - -== Configuration - -**WebUI** - -Enable external shares: - -* Navigate to menu:Settings[Admin > Storage] -* Enable the external storage -* Create a new share and choose Windows network Drives - -Configure external share: - -* Folder Name: A name for the WND Share -* Authentication: Choose **Log-in credentials, save in database** -* Host: domain name or IP address -* Share: name of the top share -* Remote Subfolder: enter `$user` for every user to get a home drive -* Permission Manager: leave empty to use the default one -* Domain: domain name of your server -* Available for: limit access to groups -* Settings: (gear wheel) enable the options you need - -IMPORTANT: If you plan to use ownCloud **only** in the Web Browser - your setup of the WND is complete. - -If you plan to use a desktop client, you need to continue and configure the WND listener and WND process queue. - -**Commandline** - -Lastly, you need to setup the wnd listener and process queue to propagate the changes made directly on the storage of your share to the sync client. - -This can be done in 2 ways: - -* you configure a new systemd service for the listener and setup a process queue cron job -* you setup a cronjob for the wnd:listen command and process queue cron job - -=== WND Listener Configuration - -Create a service for systemd following the instructions below that checks the share for changes: - -* For each WND mount point distinguished by a SERVER - SHARE pair: -** Replace the all upper case words `SERVER`, `SHARE`, `USER` and `PASSWORD` in both, the **filename** and in the **contents** below with their respective values. -** Place one copy of a file with the content from below under `/etc/systemd/system/owncloud-wnd-listen-SERVER-SHARE.service` + -To do so, enter the following command and replace with `owncloud-wnd-listen-SERVER-SHARE`. For more details see https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units#editing-unit-files[Editing Unit Files]. -+ -[source,bash] ----- -sudo systemctl edit --force --full .service ----- -+ -Reload the deamon to make it available: -+ -[source,bash] ----- -sudo systemctl daemon-reload ----- -** Take care to also adjust the paths in `WorkingDirectory` and `ExecStart` according to your installation. -** Password: Create a file readable only by the www-data user and outside the directories handled by Apache - (let's suppose in /tmp/mypass). The file must contain only the password for the share. In this example our - file is: "/tmp/mypass". The listener will read the contents of the file and use them as the password for -the account. This way, only root and the Apache user should have access to the password. -** `--password-trim` in directive `ExecStart` removes blank characters from the password file added by 3rdparty software or other services. - -* Content template for `owncloud-wnd-listen-SERVER-SHARE` -+ -[source,plaintext] ----- -[Unit] -Description=ownCloud WND Listener for SERVER SHARE -After=syslog.target -After=network.target -Requires=apache2.service -[Service] -User=www-data -Group=www-data -WorkingDirectory=/var/www/owncloud -ExecStart=/usr/bin/php ./occ wnd:listen -vvv SERVER SHARE USER --password-file=/opt/mypass --password-trim -Type=simple -StandardOutput=journal -StandardError=journal -SyslogIdentifier=%n -KillMode=process -RestartSec=3 -Restart=always -[Install] -WantedBy=multi-user.target ----- - -* Run the following command, once for each created file: -+ -[source,bash] ----- -sudo systemctl enable owncloud-wnd-listen-SERVER-SHARE.service -sudo systemctl start owncloud-wnd-listen-SERVER-SHARE.service ----- - -=== WND Process Queue Configuration - -Create or add a `crontab` file in `/etc/cron.d/oc-wnd-process-queue`. - -* Make a `crontab` entry to run a script iterating over all `SERVER SHARE` pairs with an - appropriate `occ wnd:process-queue` command. The commands must be **strictly sequential**. - This can be done by using `flock -n` and tuning the `-c` parameter of `occ wnd:process-queue` - -[source,bash] ----- -* * * * * sudo -u www-data /usr/bin/php /var/www/owncloud/occ wnd:process-queue ----- - -==== Execution Serialization - -Parallel runs of `wnd:process-queue` might lead to a user lockout. The reason for this, is that several -`wnd:process-queue` might use the same wrong password because it hasn’t been updated by the time they -fetch it. - -It’s recommended to force the execution serialization of the `wnd:process-queue` command. You might want to -use Anacron, which seems to have an option for this scenario, or wrap the command with flock. - -If you need to serialize the execution of the wnd:process-queue, check the following example with flock - -[source,bash] ----- -* * * * * flock -n /tmp/wnd001 occ wnd:process-queue server1 share1 -* * * * * flock -n /tmp/wnd002 occ wnd:process-queue server1 share2 -* * * * * flock -n /tmp/wnd003 occ wnd:process-queue server2 share3 ----- - -== Troubleshooting - -* The process queue will not work if there is a backslash in the share path configured in webui. -* The process queue will not work if the share name in the webui is configured starting with a forward slash `/`. - -If you encounter issues using Windows network drive, then try the following troubleshooting steps: - -Check the connection to the share by using smbclient on the command line of the ownCloud server. -Here is an example: - -[source,bash] ----- -smbclient -U Username -L //Servername ----- - -Take the example of attempting to connect to the share named MyData using occ wnd:listen. -Running the following command would work: - -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} wnd:listen MyHost MyData svc_owncloud password ----- - -NOTE: Run this command inside the ownCloud Docker container. - -The command is case-sensitive, and it must match the information from the mount point configuration. - -* When the output of the `occ process-queue ..` command shows `0 Storages found`, then this means, - that there was no corresponding external storage configuration found, because: - 1. The casing between calling the process queue and the web interface does not exactly match. - 2. The authentication method is not correctly configured, it needs to be **Log-in credentials, save in database** diff --git a/modules/admin_manual/pages/installation/configuration_notes.adoc b/modules/admin_manual/pages/installation/configuration_notes.adoc index 427d0b4ad..fa6732312 100644 --- a/modules/admin_manual/pages/installation/configuration_notes.adoc +++ b/modules/admin_manual/pages/installation/configuration_notes.adoc @@ -12,6 +12,6 @@ The image provides additional environment variables that can be configured for t == Using a Configuration File -Rather than using environment variables to configure your ownCloud instance, you can use additional configuration files, as was possible with earlier releases of ownCloud. This configuration method is only possible when using bind mounts, because access to the `config` sub folder is required. +Rather than using environment variables to configure your ownCloud instance, you can use *additional* configuration files, as was possible with earlier releases of ownCloud. This configuration method is only possible when using bind mounts, because access to the `config` sub folder is required. For more and important details see: xref:installation/mount_folder_structure.adoc[Mount Folder Structure]. diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index d0517ee9b..ababd3151 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -139,7 +139,6 @@ **** xref:admin_manual:enterprise/external_storage/ldap_home_connector_configuration.adoc[LDAP Home Connector Configuration] **** xref:admin_manual:enterprise/external_storage/sharepoint-integration_configuration.adoc[Sharepoint integration Configuration] **** xref:admin_manual:enterprise/external_storage/windows-network-drive_configuration.adoc[Windows Network Drive Configuration] -**** xref:admin_manual:enterprise/external_storage/wnd_quick_guide.adoc[WND Configuration Quick Guide] *** File Management **** xref:admin_manual:enterprise/file_management/files_tagging.adoc[File Tagging] **** xref:admin_manual:enterprise/file_management/files_lifecycle.adoc[File Lifecycle Management] From f88d5d64835fe8b81e735c8f044a91f79c369f9a Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Wed, 3 Jun 2026 12:46:03 +0200 Subject: [PATCH 20/38] finish wnd --- .../windows-network-drive_configuration.adoc | 124 ++++++------------ 1 file changed, 38 insertions(+), 86 deletions(-) diff --git a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc index 6e6d54326..574b712ab 100644 --- a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc +++ b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc @@ -301,25 +301,26 @@ occ wnd:listen "myhost", "myshare", "workgroup\myuser", "password" * xref:wndprocess-queue[wnd:process-queue] + Process saved listener changes from the database . -===== wnd:listen +{empty} +[#wndlisten] +wnd:listen:: This command listens to changes for each host and share configured and stores all notifications gathered in the database. - ++ [NOTE] ==== -* This command needs configuration in the docker compose environment to be activated. A prepared example is given but needs configuration. You need to create as many services as you need listeners. +* This command needs configuration in the xref:installation/installing_with_docker.adoc[docker compose environment] to be activated. A prepared example is given but needs configuration. You need to create as many services as you need listeners. * You can increase the command's verbosity by using `-vvv`. Doing so displays the listeners activities in the log including a timestamp and the notifications received. * A _read-only_ permission for the used account should be enough, but may need to be increased. ==== - ++ The command does not produce any output by default, unless an error happens. Each stored notification will be further processed by the `wnd:process-queue` which is described in teh next chapter and will be removed from the database after processing. - ++ The password is a required parameter in the compose example and can be provided in different ways. Replace "password" in the compose example with one of the options below. The password value is always in plain text. - ++ * Directly added as value. - * Read from a file. + Neither spaces nor newline characters will be removed from the file by default, unless the `--password-trim` option is added. The password file must be readable by the Apache user `www-data`. Note that you need to add a volume to pass the file to the service. + @@ -328,12 +329,11 @@ Neither spaces nor newline characters will be removed from the file by default, ---- --password-file=/run/secrets/wnd_password --password-trim ---- - ++ Make sure that the password file is outside of any directory handled by apache (web-readable) for security reasons. - ++ NOTE: If you use the `--password-file` switch, the entire contents of the file will be used for the password, please be careful with newlines. -- - * Using the `service account password`. + This password is already stored in the ownCloud database if you setup WND in collaborative mode. In this mode, you set the username and the option for the `occ` command to reuse the password stored in the database. The example command looks like: + @@ -342,15 +342,16 @@ This password is already stored in the ownCloud database if you setup WND in col ---- --password-from-service-account ---- - ++ IMPORTANT: You need to ensure that the triple of ``, `` and `` (including any kind of workgroup if used) matches the configuration made for the WND collaborative share. The command will fail otherwise. -- -===== wnd:process-queue - +[#wndprocess-queue] +wnd:process-queue:: This command processes the stored notifications for a given host and share. This process is intended to be run periodically as a Cron job on the host, or via a similar mechanism. The command will process the notifications stored by the `wnd:listen` process, showing only errors by default. If you need more information, increase the verbosity by calling `wnd:process-queue -vvv`. - -As aa example, you can issue the following command, replacing and accordingly: ++ +-- +As an example, you can issue the following command, replacing and accordingly: [source,bash,subs="attributes+"] ---- @@ -371,7 +372,8 @@ NOTE: The commands must be **strictly sequential**. This can be done by using `f ---- * * * * * cd && {occ-command-example-prefix-docker} wnd:process-queue ---- - +-- ++ [#execution-serialization] * Execution Serialization: + @@ -506,7 +508,7 @@ image:enterprise/external_storage/windows_network_drive/cwnd_fields.png[Enter Co If you encounter issues using Windows network drive, then try the following troubleshooting steps: -First check the connection to the share by using {smbclient-manpage-url}[smbclient] on the command line of the ownCloud server. Here is an example: +First check the connection to the share by using {smbclient-manpage-url}[smbclient] on the command line of the ownCloud hosting server. Here is an example: [source,console,subs="attributes+"] ---- @@ -520,8 +522,6 @@ Take the example of attempting to connect to the host MyHost, the share named `M {occ-command-example-prefix-docker} wnd:listen MyHost MyData user password ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: The command is case-sensitive, and that it must match the information from the mount point configuration. === Kerberos Testing @@ -565,56 +565,16 @@ smbclient \ kdestroy ---- -=== libsmbclient Issues - -If your Linux distribution ships with `libsmbclient 3.x`, which is included in the Samba client, you may need to set up the `HOME` variable in Apache to prevent a segmentation fault. If you have `libsmbclient 4.1.6` and higher, it doesn't seem to be an issue, so you won't have to change your `HOME` variable. To set up the `HOME` variable on Ubuntu, modify the `/etc/apache2/envvars` file: - -[source,bash] ----- -unset HOME -export HOME=/var/www ----- - -In Red Hat/CentOS, modify the `/etc/sysconfig/httpd` file and add the following line to set the HOME variable in Apache: - -[source,bash] ----- -export HOME=/usr/share/httpd ----- - -By default, CentOS has activated SELinux, and the `httpd` process can not make outgoing network connections. This will cause problems with the `curl`, `ldap` and `samba` libraries. You'll need to get around this to make this work. First, check the status: - -[source,bash] ----- -getsebool -a | grep httpd -httpd_can_network_connect --> off ----- - -Then enable support for network connections: - -[source,bash] ----- -setsebool -P httpd_can_network_connect 1 ----- - -In openSUSE, modify the `/usr/sbin/start_apache2` file: - -[source,bash] ----- -export HOME=/var/lib/apache2 ----- - -Restart Apache, open your ownCloud Admin page and start creating SMB/CIFS mounts. - === Basic Setup for One ownCloud Server . Go to the admin settings and set up the required WND mounts. Be aware though, that there are some limitations. These are: .. ownCloud needs access to the Windows account password for the mounts to update the file cache properly. This means that "__login credentials, saved in session__" won't work with the listener. ownCloud suggests to use "__login credentials, saved in DB__" as the best replacement instead. .. The `$user` placeholder for the share name, such as `//host/$user/path/to/root`, providing a share which is accessible per/user won't work with the listener. This is because the listener won't scale, as you'll need to setup one listener per/share equals one listener per user. As a result, you'll end up with too many listeners. An alternative is, to provide a common share for the users and use the `$user` placeholder in the root, such as `//host/share/$user/folder`. -. Start the `wnd:listen` process if it's not already started, ideally running it as a service. If it isn't running, no notifications are stored. The listener stores the notifications. Any change in the mount point configuration, such as adding or removing new mounts, and logins by new users, won't affect the behavior, so there is no need to restart the listener in those cases. + +. Configure and start the `wnd:listen` process via the compose file. If it isn't running, no notifications are stored. The listener stores the notifications. Any change in the mount point configuration, such as adding or removing new mounts, and logins by new users, won't affect the behavior, so there is no need to restart the listener in those cases. + -If you have several mount point configurations, note that each listener attaches to one host and share. If there are several mount configurations targeting different shares, you'll need to spawn one listener for each. For example, if you have one configuration with `10.0.0.2/share1` and another with `10.0.0.2/share2`, you'll need to spawn 2 listeners, one for the first configuration and another for the -second. +If you have several mount point configurations, note that each listener attaches to one host and share. If there are several mount configurations targeting different shares, you'll need to configure and run one listener for each. For example, if you have one configuration with `10.0.0.2/share1` and another with `10.0.0.2/share2`, you'll need to create two listeners, one for the first configuration and another for the second. + . Run the `wnd:process-queue` periodically, usually via xref:configuration/server/background_jobs_configuration.adoc#cron-jobs[a Cron job]. The command processes all the stored notifications for a specific host and share. If you have several, you could set up several Cron jobs, one for each host and share with different intervals, depending on the load or update urgency. As a simple example, you could run the command every 2 minutes for one server and every 5 minutes for another. As said, the command processes all the stored notifications, squeezes them and scans the resulting folders. The process might crash if there are too many notifications, or if it has too many storages to update. The `--chunk-size` option will help by making the command process all the notifications in buckets of that size. @@ -623,7 +583,7 @@ On the one hand the memory usage is reduced, on the other hand there is more net === Reduce WND Notifier Memory Usage -The WND in-memory notifier for password changes provides the ability to notify all _affected_ WND storages to reset their passwords. This feature is intended to prevent a password lockout for the user in the backend. However, this functionality _can_ consume a significant amount of memory. To disable it, add the following configuration to your `config/config.php.`: +The WND in-memory notifier for password changes provides the ability to notify all _affected_ WND storages to reset their passwords. This feature is intended to prevent a password lockout for the user in the backend. However, this functionality _can_ consume a significant amount of memory. To disable it, edit your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file] and add the following key: [source,php] ---- @@ -651,7 +611,7 @@ To optimize this, `wnd:process-queue` make use of two switches: `–serializer-t | `file`. Other valid values may be added in the future, as more implementations are requested. | `--serializer-param` -| Depends on `--serializer-type`, because those will be the parameters that the chosen serializer will use. For the `file` serializer, you need to provide a file location in the host FS where the storages will be serialized. You can use `--serializer-param file=/tmp/file` as an example. +| Depends on `--serializer-type`, because those will be the parameters that the chosen serializer will use. For the `file` serializer, you need to provide a file location in the host filesystem where the storages will be serialized. You can use `--serializer-param file=/tmp/file` as an example. |=== While the specific behavior will depend on the serializer implementation, the overall behavior can be simplified as follows: @@ -669,6 +629,7 @@ The file serializer is a serializer implementation that can be used with the `wn There are several things you should know about this serializer: * The generated file contains the encrypted passwords for accessing the backend. This is necessary in order to avoid re-fetching the user information, when next accessing the storages. + * The generated file is intended to be readable and writable *only* for the web server user. Other users shouldn't have access to this file. Do not manually edit the file. You can remove the file if it contains obsolete information. === Usage Recommendations @@ -701,16 +662,21 @@ This is a known issue that prevents these two inter-operating correctly. Current Setups with several servers might have some difficulties in some scenarios: -* The `wnd:listen` component _might_ be duplicated among several servers. This shouldn't cause a problem, depending on the limitations of the underlying database engine. The supported database engines should be able to handle concurrent access and de-duplication. -* The `wnd:process-queue` _should_ also be able to run from any server, however limitations for concurrent executions still apply. As a result, you might need to serialize command execution of the `wnd:process-queue` among the servers (to avoid password lockout), which might not be possible or difficult to achieve. You might want to execute the command from just one specific server in this case. -* `wnd:process-queue` + serializer. First, check the above section to know the interactions with the password lockout. Right now, the only option you have to set up is to store the target file in a common location for all the servers. We might need to provide a specific serializer for this scenario (based on Redis or DB) +* The `wnd:listen` component _might_ be duplicated among several servers. + +This shouldn't cause a problem, depending on the limitations of the underlying database engine. The supported database engines should be able to handle concurrent access and de-duplication. + +* The `wnd:process-queue` _should_ also be able to run from any server, + +however limitations for concurrent executions still apply. As a result, you might need to serialize command execution of the `wnd:process-queue` among the servers (to avoid password lockout), which might not be possible or difficult to achieve. You might want to execute the command from just one specific server in this case. + +* `wnd:process-queue` + serializer. + +First, check the above section to know the interactions with the password lockout. Right now, the only option you have to set up is to store the target file in a common location for all the servers. We might need to provide a specific serializer for this scenario (based on Redis or DB) === Basic Command Execution Examples +The following commands expect that you have setup the `wnd:listener` as described in the xref:#wnd-listener-setup[WND Listener Setup] documentation. + [source,bash,subs="attributes+"] ---- -{occ-command-example-prefix-docker} wnd:listen host share username password - {occ-command-example-prefix-docker} wnd:process-queue host share {occ-command-example-prefix-docker} wnd:process-queue host share -c 500 @@ -724,17 +690,6 @@ Setups with several servers might have some difficulties in some scenarios: --serializer-param file=/opt/oc/store2 ---- -NOTE: Run this command inside the ownCloud Docker container. - -To set it up, make sure the listener is running as a system service: - -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} wnd:listen host share username password ----- - -NOTE: Run this command inside the ownCloud Docker container. - Setup a Cron job or similar with something like the following two commands: [source,bash,subs="attributes+"] @@ -746,16 +701,13 @@ Setup a Cron job or similar with something like the following two commands: sudo rm -f /opt/oc/store1 # With a different schedule ---- -NOTE: Run this command inside the ownCloud Docker container. - -The first run will create the `/opt/oc/store1` with the serialized storages, the rest of the executions will use that file. The second Cron job, the one removing the file, will force the `wnd:process-queue` to -refresh the data. +The first run will create the `/opt/oc/store1` with the serialized storages, the rest of the executions will use that file. The second Cron job, the one removing the file, will force the `wnd:process-queue` to refresh the data. It's intended to be run in a different schedule, so there are several executions of the `wnd:process-queue` fetching the data from the file. Note that the file can be removed manually at any time if it's needed (for example, in case the admin has reset some passwords or has been notified about password changes). === Performance on High Number of ACL Targeting Users -The WND app doesn’t know about the users or groups associated with ACLs. This means that an ACL containing "admin" might refer to a user called "admin" or a group called "admin". By default, the group membership component considers the ACLs to target groups, and as such, it will try to get the information for such a group. This works fine if the majority of the ACLs target groups. If the majority of the ACLs contain users, this might be problematic. The cost of getting information on a group is usually higher than getting information on a user. This option makes the group membership component assume the ACL contains a user and checks whether there is a user in ownCloud with such a name first. If the name doesn’t refer to a user, it will get the group information. Note that this will have performance implications if the group membership component can’t discard users in a large number of cases. It is recommended to enable this option only if there are a high number of ACLs targeting users. In order to enable this setting, you can edit the `config/config.php` file and add the following configuration: +The WND app doesn’t know about the users or groups associated with ACLs. This means that an ACL containing "admin" might refer to a user called "admin" or a group called "admin". By default, the group membership component considers the ACLs to target groups, and as such, it will try to get the information for such a group. This works fine if the majority of the ACLs target groups. If the majority of the ACLs contain users, this might be problematic. The cost of getting information on a group is usually higher than getting information on a user. This option makes the group membership component assume the ACL contains a user and checks whether there is a user in ownCloud with such a name first. If the name doesn’t refer to a user, it will get the group information. Note that this will have performance implications if the group membership component can’t discard users in a large number of cases. It is recommended to enable this option only if there are a high number of ACLs targeting users. In order to enable this setting, edit your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file] and add the following key: [source,php] ---- From d3eef0d73fb0d023c9e8ba599ecbaf6ed4163ebf Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Wed, 3 Jun 2026 15:06:11 +0200 Subject: [PATCH 21/38] fix kerberos --- .../enterprise/authentication/kerberos.adoc | 109 +++++------------- .../windows-network-drive_configuration.adoc | 2 +- 2 files changed, 30 insertions(+), 81 deletions(-) diff --git a/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc b/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc index 42a9a71e3..39bf3ac14 100644 --- a/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc +++ b/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc @@ -106,7 +106,7 @@ image::enterprise/authentication/kerberos/kerberos-principle.drawio.svg[Kerberos * Make sure the clocktime of the KDC, the client and the server the ownCloud instance is running on is in sync. 5 minutes are the highest difference you may allow for Kerberos to work properly. Without going into the details, you may use NTP for that task. -* All members in the realm, which includes cients, must support `DES3, AES128 or AES256` encryption. This applies to Windows 10 and modern Linux based OS desktops. If a client does not support this encryption standard, he can not use Kerberos. Alternatively the legacy crypto `RC4-HMAC-EXP` can be added during configuration - which is _strongly discouraged_ for security reasons. See the http://web.mit.edu/kerberos/krb5-1.5/krb5-1.5/doc/krb5-admin/Supported-Encryption-Types.html#Supported%20Encryption%20Types[Kerberos supported encryption types,window=_blank] for more information. +* All members in the realm, which includes cients, must support `DES3, AES128 or AES256` encryption. This applies to Windows 10+ and modern Linux based OS desktops. If a client does not support this encryption standard, he can not use Kerberos. Alternatively the legacy crypto `RC4-HMAC-EXP` can be added during configuration - which is _strongly discouraged_ for security reasons. See the http://web.mit.edu/kerberos/krb5-1.5/krb5-1.5/doc/krb5-admin/Supported-Encryption-Types.html#Supported%20Encryption%20Types[Kerberos supported encryption types,window=_blank] for more information. * Replace in the configuration examples where applicapable the placeholders accordingly: ** `` + @@ -135,69 +135,7 @@ The administration server. This is typically the same as the LDAP/Active Directo ** If this is not the case, you need to https://wiki.samba.org/index.php/Setting_up_Samba_as_a_Domain_Member[Setting up Samba as a Domain Member]. //// -* Check that you have the latest xref:installation/manual_installation/server_prep_ubuntu_22.04.adoc#updating-pear[pear] version installed. - -* Install, if not already done the `php-dev-` environment: -+ --- -[source,bash] ----- -sudo apt install php-dev- ----- - -Check the existance of `phpize` with: -[source,bash] ----- -whereis phpize ----- --- - -* Install and enable the `php-krb5` library: -+ --- -[source,bash] ----- -sudo apt install libkrb5-dev -sudo pecl channel-update pecl.php.net -sudo pecl install krb5 ----- - -If not exists, add a file in `/etc/php//mods-available/krb5.ini` with the following content: - -[source,bash] ----- -extension=krb5.so ----- - -Finalize with: - -[source,bash] ----- -sudo phpenmod krb5 ----- - -Check with: - -[source,bash] ----- -php -i | grep Kerb ----- -[source,plaintext] ----- -Kerberos 5 support => enabled -Library version => Kerberos 5 release 1.17 ----- --- - -* Install handy command-line tools for Kerberos: + -Note that `krb5-user` is an actual requirement, the Kerberos implementation in the WND app requires the `kvno` command which is contained in that package. -+ --- -[source,bash] ----- -sudo apt install krb5-user ----- --- +* The Docker image does not provide the required Kerberos `krb5` PHP extension and the `krb5-user` CLI tool. This tool is an actual requirement, the Kerberos implementation in the WND app requires the `kvno` command which is contained in the package installed. To mitigate this issue, you need to manually create an image that installs and enables these requirements. * DNS records + Create a DNS record for the public FQDN of the ownCloud instance (``). @@ -208,15 +146,13 @@ Create a DNS record for the public FQDN of the ownCloud instance (``). This option can also be used if you have only one web site but want to keep the servers hostname and website address distinct. // https://imatviyenko.github.io/blog/2018/09/11/Apache-AD-kerberos -* Download the ownCloud Kerberos app from the {oc-marketplace-url}/apps/kerberos[Marketplace,window=_blank] and enabe it with: +* Enable the shipped ownCloud Kerberos app with: + [source.bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} app:enable kerberos ---- -NOTE: Run this command inside the ownCloud Docker container. - === Domain Controller Side ==== Service Principal Name (SPN) @@ -225,9 +161,17 @@ NOTE: Run this command inside the ownCloud Docker container. * Note that Kerberos depends on accurate naming, as server names are used to build the Service Principal Name (SPN) used to request tickets from a KDC. For clients, this becomes crucial when a load balancer is used, because they have, intentionally, no idea which server they are going to connect. For more details see: https://ssimo.org/blog/id_019.html[Load Balancers and Kerberos,window=_blank]. -* A SPN consists of: `/:/`, where `` and `` are optional components. +* A SPN consists of: + + -Using `HTTP`, which is a built in service class, in the configuration example below, enables that all Web applications on the same host including applications hosted by Apache, if they are configured for the use with Kerberos, will be granted tickets based on the domain user account. +-- +[source,plaintext] +---- +/:/ +---- +where `` and `` are optional components. + +Using `HTTP`, which is a built in service class, in the configuration example below, enables that all Web applications on the same host including applications hosted by Apache, if they are configured for the use with Kerberos, will be granted tickets based on the domain user acc +-- * Note that SPN always include the name of the host computer on which the service instance is running, for more details see: https://learn.microsoft.com/en-us/windows/win32/ad/service-principal-names[Microsoft: Service Principal Names,window=_blank]. @@ -377,7 +321,7 @@ samba-tool domain exportkeytab --principal=HTTP/ //.keytab . Check the validity of the `keytab` file: + -- -[source,bash] +[source,docker] ---- -klist -e -k -t /.keytab +docker exec -it owncloud_server sh -c 'klist -e -k -t /.keytab' ---- + [source,plaintext] ---- Keytab name: FILE:.keytab @@ -445,10 +390,11 @@ KVNO Timestamp Principal . Display the current key version number for a principal: + -- -[source,bash] +[source,docker] ---- -kvno HTTP/@ +docker exec -it owncloud_server sh -c 'kvno HTTP/@' ---- + [source,plaintext] ---- HTTP/@: kvno = 4 @@ -458,14 +404,16 @@ HTTP/@: kvno = 4 . Attempt to use the `keytab` file to authenticate as the service principal: + -- -[source,bash] +[source,docker] ---- -kinit -k -t /.keytab HTTP/@ +docker exec -it owncloud_server sh -c 'kinit -k -t /.keytab HTTP/@' ---- -[source,bash] + +[source,docker] ---- -klist +docker exec -it owncloud_server sh -c 'klist' ---- + [source,plaintext] ---- Ticket cache: FILE:/tmp/krb5cc_0 @@ -480,10 +428,11 @@ Valid starting Expires Service principal . Destroy the Kerberos ticket for security reasons: + -- -[source,bash] +[source,docker] ---- -kdestroy +docker exec -it owncloud_server sh -c 'kdestroy' ---- + [source,plaintext] ---- Tickets destroyed diff --git a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc index 574b712ab..1c1a8d032 100644 --- a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc +++ b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc @@ -25,7 +25,7 @@ {description} -The {oc-marketplace-url}/apps/windows_network_drive[Windows Network Drives app] creates a control panel in your Admin page. Any Windows file share and Samba servers on Linux and other Unix-type operating systems use the SMB/CIFS file-sharing protocol. The files and directories on the SMB/CIFS server will be visible on your Files page just like your other ownCloud files and folders. +The *Windows Network Drives app*, which is part of the shipped Docker image creates a control panel in your Admin page. Any Windows file share and Samba servers on Linux and other Unix-type operating systems use the SMB/CIFS file-sharing protocol. The files and directories on the SMB/CIFS server will be visible on your Files page just like your other ownCloud files and folders. Compared to standard SMB access, WND has advanced features like: From 5d5eede0227a54704ac7116de6124a5fbbace4e3 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Wed, 3 Jun 2026 17:06:00 +0200 Subject: [PATCH 22/38] many fixes --- .../linux_database_configuration.adoc | 6 +- .../files/previews_configuration.adoc | 40 ++--- .../configuration/server/harden_server.adoc | 113 ++----------- .../server/index_php_less_urls.adoc | 39 +---- .../configuration/server/occ_command.adoc | 4 +- .../_command_line_upgrade_commands.adoc | 13 +- .../core_commands/_config_commands.adoc | 63 +------- .../server/security_setup_warnings.adoc | 95 +++-------- .../enterprise/authentication/kerberos.adoc | 2 +- .../general_troubleshooting.adoc | 153 ++++-------------- modules/admin_manual/pages/useful_pages.adoc | 2 +- .../pages/general/devenv.adoc | 7 +- .../pages/testing/test-pilots.adoc | 49 ++---- 13 files changed, 126 insertions(+), 460 deletions(-) diff --git a/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc b/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc index df80c2658..947415fac 100644 --- a/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc +++ b/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc @@ -1,5 +1,7 @@ = Database Configuration on Linux :toc: right +:description: ownCloud requires a database in which administrative data is stored. + :avoid-deadlocks-galery-haproxy-url: https://severalnines.com/blog/avoiding-deadlocks-galera-set-haproxy-single-node-writes-and-multi-node-reads :haproxy-url: https://www.haproxy.org/ :maxscale-url: https://github.com/mariadb-corporation/MaxScale/wiki @@ -13,7 +15,7 @@ == Introduction -ownCloud requires a database in which administrative data is stored. The following databases are currently supported: +{description} The following databases are currently supported: * xref:mysql-mariadb[MySQL / MariaDB] * xref:postgresql[PostgreSQL] @@ -89,7 +91,7 @@ mysql.trace_mode=Off ---- //// -An ownCloud instance configured with MySQL would contain the hostname on which the database is running, a valid username and password to access it, and the name of the database. The config as created by the xref:installation/installation_wizard.adoc[installation wizard] would therefore contain entries like this: +An ownCloud instance configured with MySQL would contain the hostname on which the database is running, a valid username and password to access it, and the name of the database. The config as created by the xref:installation/installing_with_docker.adoc[Installing with Docker] procedure will therefore contain entries such as: [source,php] ---- diff --git a/modules/admin_manual/pages/configuration/files/previews_configuration.adoc b/modules/admin_manual/pages/configuration/files/previews_configuration.adoc index 23a801310..36535376f 100644 --- a/modules/admin_manual/pages/configuration/files/previews_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/previews_configuration.adoc @@ -1,13 +1,14 @@ = Previews Configuration :toc: right +:description: The ownCloud preview system generates thumbnails and previews of files for all ownCloud apps that display files such as the Files or the Files Mediaviewer app. == Introduction -The ownCloud preview system generates thumbnails and previews of files for all ownCloud apps that display files such as the Files or the Files Mediaviewer app. +{description} The following image shows some examples of previews of various file types. -image:preview_images.png[Thumbnails of various image and audio/video files.] +image:preview_images.png[Thumbnails of Various Image and Audio/Video Files.] By default, ownCloud can generate previews for the following filetypes: @@ -36,7 +37,7 @@ IMPORTANT: Be careful enabling preview thumbnail generation for documents which == Default Preview Providers -Please note that the ownCloud preview system comes already with sensible defaults, and therefore it is usually not necessary to adjust those configuration values. If you want to configure previews, add or change the following parameters in `config/config.php`. +Please note that the ownCloud preview system comes already with sensible defaults, and therefore it is usually not necessary to adjust those configuration values. If you want to configure previews, add or change the following parameters by editing your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file]. The default list of enabled preview providers which do not need to be explicitly enabled in the config are: @@ -53,20 +54,29 @@ OC\Preview\TXT OC\Preview\XBitmap ---- -If you want to add or change the default list, you MUST define all elements used. If you just declare an additional item, only this item will be taken and none of the default list. +If you want to add or change the default list, you MUST define all elements used by editing your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file]. If you just declare an additional item in the configuration, this item will be taken and none of the default list. == Prerequisites -When defining your own preview providers, some things need to be considered. For some file types, ownCloud uses ImageMagick to generate previews. By default, the delivered version of ImageMagick for Ubuntu 20.04 is version 6, and the wrapper for php is version 3.4. This version of ImageMacick is _not_ capable of processing additional file formats like SVG or HEIC and many others. If you want to use those providers, you must upgrade ImageMagick to version 7 and the php wrapper to version 3.5. See the xref:installation/manual_installation/server_prep_ubuntu_20.04.adoc#php-imagick-library[php-imagick Library] section in the installation guide for more information. +When defining your own preview providers, some things need to be considered. For some file types, ownCloud uses ImageMagick to generate previews. The ownCloud Docker Image provides the `imagic` php extension, but not the ImageMagick binary. To mitigate this issue, you need to manually create an image that installs this requirement. Please note that other binaries may be required, which are listed in the relevant section. + +Starting with version 7 of ImageMagick, additional file formats like SVG or HEIC and many others can be processed. + +You can check your ImageMagick version installed in your image by issuing the following command: + +[source,docker] +---- +docker exec -it owncloud_server sh -c 'convert --version' +---- === Notes for PDF Preview Generation -If you handle the security risk and decide to allow creating previews for PDF files, change the following imagick security policy. Use an editor of your choice like `nano` and change the following file, adapt the path if using ImageMagick 7: +ImageMagick uses ghostscript for converting PDF. Please also make sure, that ghostscript is installed. + +If you handle the security risk and decide to allow creating previews for PDF files, change the following imagick security policy. Use an editor of your choice such as `nano` and change the following file. Note that you need to configure a Docker Volume to access the data: [source,bash] ---- -sudo nano /etc/ImageMagick-6/policy.xml - or sudo nano /etc/ImageMagick-7/policy.xml ---- @@ -84,35 +94,29 @@ and change: rights="none" --> rights="read|write" ---- -After changing the policy file for ImageMagick, restart your Apache web server or your php-fpm service. -ImageMagick uses ghostscript for converting PDF. Please also make sure, that ghostscript is installed and the PDF format is listed when invoking the following command: +After changing the policy file for ImageMagick, restart your container. Check that the PDF format is listed when invoking the following command: [source,bash] ---- -convert -list format | grep -i pdf +docker exec -it owncloud_server sh -c 'convert -list format | grep -i pdf' ---- === Notes for Video Preview Generation To be able to create previews for video files when using the `OC\Preview\Movie` provider, you must install `ffmpeg`. There can be significant load on the server during conversion when video thumbnail generation is enabled. -[source,bash] ----- -sudo apt install -y ffmpeg ----- - === List Extensions Used for the Preview Generation To get a list of file extensions linked to the image or video provider, change into the `owncloud` directory and run the following example command. Use a different filter for other provider types. [source,bash] ---- -cat resources/config/mimetypemapping.dist.json | grep image +docker exec -it owncloud_server sh -c 'cat /var/www/owncloud/resources/config/mimetypemapping.dist.json | grep image' ---- == Preview Format Requirements -The following providers require the php `imagick` extension to be enabled (check `phpinfo();`) and compiled with support for these formats: +The following providers require the php `imagick` extension which is included in the Docker Image provided: [source,plaintext] ---- diff --git a/modules/admin_manual/pages/configuration/server/harden_server.adoc b/modules/admin_manual/pages/configuration/server/harden_server.adoc index 958dd28db..e7c45599c 100644 --- a/modules/admin_manual/pages/configuration/server/harden_server.adoc +++ b/modules/admin_manual/pages/configuration/server/harden_server.adoc @@ -6,38 +6,25 @@ go/enable-http-strict-transport-security.adoc == Introduction -ownCloud aims to ship with secure defaults that do not need to get -modified by administrators. However, in some cases some additional -security hardening can be applied in scenarios were the administrator -has complete control over the ownCloud instance. This page assumes that -you run ownCloud Server on Apache2 in a Linux environment. +ownCloud aims to ship with secure defaults that do not need to get modified by administrators. However, in some cases some additional security hardening can be applied in scenarios were the administrator has complete control over the ownCloud instance. This page assumes that you run ownCloud Server on Apache2 in a Linux environment. -NOTE: ownCloud will warn you in the administration interface if some critical security-relevant options are missing. -However, it is still up to the server administrator to review and maintain system security. +NOTE: ownCloud will warn you in the administration interface if some critical security-relevant options are missing. However, it is still up to the server administrator to review and maintain system security. == Limit on Password Length -ownCloud uses the https://en.m.wikipedia.org/wiki/Bcrypt[bcrypt] -algorithm. It only verifies the -first 72 characters of passwords. This applies to all passwords you -use in ownCloud: user passwords, passwords on link shares and passwords -on external shares. +ownCloud uses the https://en.m.wikipedia.org/wiki/Bcrypt[bcrypt] algorithm. It only verifies the first 72 characters of passwords. This applies to all passwords you use in ownCloud: user passwords, passwords on link shares and passwords on external shares. == Rate Limiting -Currently ownCloud deliberately does not provide any form of rate-limiting (though it does provide {oc-marketplace-url}/apps/brute_force_protection[brute-force protection]). -This is because ownCloud needs to integrate in to a diverse range of environments and infrastructure, which often already provide specialized rate-limiting solutions, e.g., _Apache_, _HAProxy_, and _F5_. +Currently ownCloud deliberately does not provide any form of rate-limiting (though it does provide {oc-marketplace-url}/apps/brute_force_protection[brute-force protection]). This is because ownCloud needs to integrate in to a diverse range of environments and infrastructure, which often already provide specialized rate-limiting solutions, e.g., _Apache_, _HAProxy_, and _F5_. -If you are yet to implement a rate-limiting solution for your ownCloud instance, start by retrieving a list of all active routes. -This information is obtained by running xref:configuration/server/occ_command.adoc#security[occ's security:routes command], as in the following example. +If you are yet to implement a rate-limiting solution for your ownCloud instance, start by retrieving a list of all active routes. This information is obtained by running xref:configuration/server/occ_command.adoc#security[occ's security:routes command], as in the following example. [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} security:routes ---- -NOTE: Run this command inside the ownCloud Docker container. - It should print a list of all the routes as in the following truncated example. [source,plaintext] @@ -71,7 +58,7 @@ With this information, you can begin customizing a rate-limiting solution specif == Operating System -=== Enable hardening modules such as SELinux +=== Enable Hardening Modules Such as SELinux We also recommend to enable hardening modules such as SELinux where possible. @@ -140,96 +127,20 @@ and check the output. == Deployment -=== Place data directory outside of the web root - -A simple but efficient way to increase the security of your data is to place your `data` directory outside of the Web root (i.e. outside of `/var/www`), ideally at the time of installation. - -=== Disable preview image generation +=== Disable Preview Image Generation -ownCloud is able to generate preview images of common file types such as -images or text files. By default, the preview generation for some file -types that we consider secure enough for deployment is enabled. However, administrators should be aware that these previews are -generated using PHP libraries written in C which might be vulnerable to -attack vectors. +ownCloud is able to generate preview images of common file types such as images or text files. By default, the preview generation for some file types that we consider secure enough for deployment is enabled. However, administrators should be aware that these previews are generated using PHP libraries written in C which might be vulnerable to attack vectors. -For high security deployments, we recommend disabling the preview -generation by setting the `enable_previews` switch to `false` in -`config.php`. As administrator you are also able to manage which -preview providers are enabled by modifying the `enabledPreviewProviders` +For high security deployments, we recommend disabling the preview generation by setting the `enable_previews` switch to `false` in `config.php`. As administrator you are also able to manage which preview providers are enabled by modifying the `enabledPreviewProviders` option switch. == Use HTTPS -Using ownCloud without an encrypted HTTPS connection opens up your -server to a man-in-the-middle (MITM) attack and risks the interception -of user data and passwords. It is a best practice, and highly -recommended, to always use HTTPS on production servers and to never -allow unencrypted HTTP. - -For information on how to setup HTTPS, consult the documentation of your Web server. The following examples -apply to Apache. - -=== Redirect all unencrypted traffic to HTTPS - -To redirect all HTTP traffic to HTTPS, administrators are encouraged to -issue a permanent redirect using the 301 status code. Using Apache, -this can be achieved by adding a setting such as the following in the -Apache VirtualHosts configuration containing the `` -entry: - -[source,apache] ----- -Redirect permanent / https://example.com/ ----- - -=== Enable HTTP Strict Transport Security - -While redirecting all traffic to HTTPS is good, it may not completely -prevent man-in-the-middle attacks. Therefore we recommend -setting the HTTP Strict Transport Security header, which instructs browsers -to not allow any connection to the ownCloud instance using HTTP, and it -attempts to prevent site visitors from bypassing invalid certificate -warnings. - -This can be achieved by adding the following settings in the Apache -VirtualHost file containing the `` entry: - -[source,apache] ----- - - Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains" - ----- - -If you don’t have access to your Apache configuration, it is also -possible to add this to the main `.htaccess` file shipped with ownCloud. -Make sure you’re adding it below the line: - ----- -#### DO NOT CHANGE ANYTHING ABOVE THIS LINE #### ----- - -This example configuration will make all subdomains only accessible via -HTTPS. If you have subdomains not accessible via HTTPS, remove -`includeSubDomains`. - -NOTE: This requires the `mod_headers` extension in Apache. - -=== Proper SSL configuration - -Default SSL configurations by Web servers are often not -state-of-the-art and require fine-tuning for an optimal performance and -security. The available SSL ciphers and options depend -completely on your environment, therefore we can't provide a general recommendation. +Using ownCloud without an encrypted HTTPS connection opens up your server to a man-in-the-middle (MITM) attack and risks the interception of user data and passwords. It is a best practice, and highly recommended, to always use HTTPS on production servers and to never allow unencrypted HTTP. -However, We do recommend using the -https://mozilla.github.io/server-side-tls/ssl-config-generator/[Mozilla SSL Configuration Generator] -to generate a configuration suitable for your environment, and the free -https://www.ssllabs.com/ssltest/[Qualys SSL Labs Tests] gives good -guidance on whether your SSL server is correctly configured. +Since Apache is included in the Docker image, HTTPS needs to be configured on the web proxy. Please refer to the web proxy documentation for details. You may also want to enable HTTP Strict Transport Security to prevent browsers from connecting to the ownCloud instance using HTTP and to stop site visitors from bypassing invalid certificate warnings. -Also ensure that HTTP compression is disabled to mitigate the BREACH -attack. +Note that the free https://www.ssllabs.com/ssltest/[Qualys SSL Labs Tests] gives good guidance on whether your SSL server is correctly configured. == Use a dedicated domain for ownCloud diff --git a/modules/admin_manual/pages/configuration/server/index_php_less_urls.adoc b/modules/admin_manual/pages/configuration/server/index_php_less_urls.adoc index 52d5288a2..f106e7142 100644 --- a/modules/admin_manual/pages/configuration/server/index_php_less_urls.adoc +++ b/modules/admin_manual/pages/configuration/server/index_php_less_urls.adoc @@ -3,47 +3,14 @@ == Introduction -Since ownCloud 9.0.3 you need to explicitly configure and enable index.php-less URLs (e.g. `\https://example.com/apps/files/` instead of `\https://example.com/index.php/apps/files/`). The following documentation provides the needed steps to configure this for the `Apache` Web server. +Note that with the Docker Image provided by ownCloud, `index.php` less URLs are enabled by default. -== Prerequisites +== Check -Before being able to use index.php-less URLs you need to enable the `mod_rewrite` and `mod_env` Apache modules. Furthermore a configured `AllowOverride All` directive within the vhost of your Web server is needed. Please have a look at the `Apache` manual for how to enable and configure these. - -Furthermore these instructions are only working when using Apache together with the `mod_php` Apache module for PHP. Other modules like `php-fpm` or `mod_fastcgi` are unsupported. - -Finally the user running your Web server (e.g. `www-data`) needs to be able to write into the `.htaccess` file shipped within the ownCloud root directory (e.g., `/var/www/owncloud/.htaccess`). If you have applied xref:installation/manual_installation/manual_installation.adoc#script-guided-installation[Set Correct Permissions], the user might be unable to write into this file and the needed update will fail. You may need to revert this strong permissions temporarily for upgrading. - -== Configuration steps - -The first step is to configure the `overwrite.cli.url` and `htaccess.RewriteBase` config.php options (See config_sample_php_parameters). If you’re accessing your ownCloud instance via `\https://example.com/` the following two options need to be added / configured: +You can check this by listing the `config.php` file via the bind mount after the first setup which will contain the following keys. Note that the URL matches your setup: [source,php] ---- 'overwrite.cli.url' => 'https://example.com', 'htaccess.RewriteBase' => '/', ---- - -If the instance is accessed via `\https://example.com/owncloud` the following configuration is needed: - -[source,php] ----- -'overwrite.cli.url' => 'https://example.com/owncloud', -'htaccess.RewriteBase' => '/owncloud', ----- - -As a second step ownCloud needs to enable index.php-less URLs. This is done: - -* during the next update of your ownCloud instance -* by manually running the occ command `occ maintenance:update:htaccess` (See occ_command) - -Afterwards your instance should have index.php-less URLs enabled. - -== Troubleshooting - -If accessing your ownCloud installation fails after following these instructions and you see messages like this in your ownCloud log: - ----- -The requested uri(\\/login) cannot be processed by the script '\\/owncloud\\/index.php' ----- - -make sure that you have configured the two `config.php` options listed above correctly. diff --git a/modules/admin_manual/pages/configuration/server/occ_command.adoc b/modules/admin_manual/pages/configuration/server/occ_command.adoc index 6f5ee4c78..47e1add06 100644 --- a/modules/admin_manual/pages/configuration/server/occ_command.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_command.adoc @@ -1,9 +1,9 @@ = Using the occ Command :toc: macro :toclevels: 2 +:description: ownCloud's 'occ' command (ownCloud console) is ownCloud's command-line interface. -ownCloud's `occ` command (ownCloud console) is ownCloud's command-line interface. -You can perform many common server operations with `occ`, such as installing and upgrading ownCloud, managing users and groups, encryption, passwords, app settings, and more. +{description} You can perform many common server operations with `occ`, such as installing and upgrading ownCloud, managing users and groups, encryption, passwords, app settings, and more. //The following is a trick to create a distance between the upper text and the table of contents. Using {empty} produces a clean empty line. Else the "Table of Contents" would stick right below the last text. See: https://discuss.asciidoctor.org/Getting-blank-lines-in-AsciiDoc-td47.html diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_upgrade_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_upgrade_commands.adoc index 1e7c43131..61b708433 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_upgrade_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_command_line_upgrade_commands.adoc @@ -12,8 +12,6 @@ Usage: upgrade [options] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Options [width="100%",cols="20%,70%",] @@ -22,10 +20,7 @@ NOTE: Run this command inside the ownCloud Docker container. | `--no-app-disable` | Skip disabling of third party apps. |=== -When you are performing an update or upgrade on your ownCloud server (see the Maintenance section of this manual), it is better to use `occ` to perform the database upgrade step, rather than the Web GUI, in order to avoid timeouts. -PHP scripts invoked from the Web interface are limited to 3600 seconds. -In larger environments this may not be enough, leaving the system in an inconsistent state. -After performing all the preliminary steps (see xref:maintenance/upgrade.adoc[the maintenance upgrade documentation]) use this command to upgrade your databases, like this example on CentOS Linux: +When you are performing an update or upgrade on your ownCloud Server (see the Maintenance section of this manual), it is better to use `occ` to perform the database upgrade step, rather than the Web GUI, in order to avoid timeouts. PHP scripts invoked from the Web interface are limited to 3600 seconds. In larger environments this may not be enough, leaving the system in an inconsistent state. After performing all the preliminary steps (see the xref:maintenance/upgrading/upgrade.adoc[Maintenance - Upgrade documentation]) use this command to upgrade your databases, like this example: [source,docker,subs="attributes+"] ---- @@ -37,13 +32,11 @@ Checked database schema update Checked database schema update for apps Updated database Updating ... -Updated to 2.1.0 +Updated to ... Update successful Turned off maintenance mode ---- -NOTE: Run this command inside the ownCloud Docker container. - Note how it details the steps. Enabling verbosity displays timestamps: [source,docker,subs="attributes+"] @@ -59,8 +52,6 @@ ownCloud or one of the apps require upgrade - only a limited number of commands 2017-06-23T09:06:15+0000 Turned off maintenance mode ---- -NOTE: Run this command inside the ownCloud Docker container. - If there is an error it throws an exception, and the error is detailed in your ownCloud logfile, so you can use the log output to figure out what went wrong, or to use in a bug report. ---- diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_commands.adoc index 240474d71..d16828473 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_commands.adoc @@ -59,10 +59,6 @@ The following apps, core functions or documents use/refer to `config:app` settin The following apps, core functions or documents use/refer to `config:system` settings: -.Standard -* xref:installation/quick_guides/ubuntu_20_04.adoc[Quick Install on Ubuntu 20.04] -* xref:installation/quick_guides/ubuntu_22_04.adoc[Quick Install on Ubuntu 22.04] - .occ Commands * xref:configuration/server/occ_command.adoc#metrics[occ Metrics] @@ -80,8 +76,6 @@ These commands manage the configurations of apps. Keys and values are stored in {occ-command-example-prefix-docker} config:app:delete [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -106,10 +100,7 @@ NOTE: Run this command inside the ownCloud Docker container. Config value provisioning_api of app myappname deleted ---- -NOTE: Run this command inside the ownCloud Docker container. - -The delete command will by default not complain if the configuration was not set before. -If you want to be notified in that case, set the `--error-if-not-exists` flag. +The delete command will by default not complain if the configuration was not set before. If you want to be notified in that case, set the `--error-if-not-exists` flag. [source,docker,subs="attributes+"] ---- @@ -117,8 +108,6 @@ If you want to be notified in that case, set the `--error-if-not-exists` flag. Config provisioning_api of app appname could not be deleted because it did not exist ---- -NOTE: Run this command inside the ownCloud Docker container. - == config:app:get [source,docker,subs="attributes+"] @@ -126,8 +115,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} config:app:get [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -153,8 +140,6 @@ the command will exit with 1. 2.2.1 ---- -NOTE: Run this command inside the ownCloud Docker container. - == config:app:set [source,docker,subs="attributes+"] @@ -162,8 +147,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} config:app:set [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -193,8 +176,6 @@ NOTE: Run this command inside the ownCloud Docker container. Config value incoming_server2server_share_enabled for app files_sharing set to yes ---- -NOTE: Run this command inside the ownCloud Docker container. - The `config:app:set` command creates the value, if it does not already exist. To update an existing value, set `--update-only`: [source,docker,subs="attributes+"] @@ -207,24 +188,18 @@ The `config:app:set` command creates the value, if it does not already exist. To Value not updated, as it has not been set before. ---- -NOTE: Run this command inside the ownCloud Docker container. - == General Config Commands These commands manage listing and importing configurations. == config:import -The exported content can also be imported again to allow the fast setup of similar instances. -The import command will only add or update values. -Values that exist in the current configuration, but not in the one that is being imported are left untouched. +The exported content can also be imported again to allow the fast setup of similar instances. The import command will only add or update values. Values that exist in the current configuration, but not in the one that is being imported are left untouched. [source,docker,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:import filename.json ---- -NOTE: Run this command inside the ownCloud Docker container. - It is also possible to import remote files, by piping the input: [source,docker,subs="attributes+"] @@ -232,10 +207,7 @@ It is also possible to import remote files, by piping the input: {occ-command-example-prefix-docker} config:import < local-backup.json ---- -NOTE: Run this command inside the ownCloud Docker container. - -NOTE: While it is possible to update/set/delete the versions and installation statuses of apps and ownCloud itself, it is *not* recommended to do this directly. -Use the `occ app:enable`, `occ app:disable` and `occ update` commands instead. +NOTE: While it is possible to update/set/delete the versions and installation statuses of apps and ownCloud itself, it is *not* recommended to do this directly. Use the `occ app:enable`, `occ app:disable` and `occ update` commands instead. == config:list @@ -246,8 +218,6 @@ The `config:list` command lists all configuration values for your ownCloud setup {occ-command-example-prefix-docker} config:list [options] [--] [] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -280,8 +250,6 @@ To generate a full report which includes sensitive values, such as passwords and {occ-command-example-prefix-docker} config:list --private ---- -NOTE: Run this command inside the ownCloud Docker container. - === Filtering Information Reported The output can be filtered to just the core information, core and apps, or one specific app. @@ -300,8 +268,6 @@ In the example below, you can see how to filter for each of these categories. {occ-command-example-prefix-docker} config:list -- dav ---- -NOTE: Run this command inside the ownCloud Docker container. - Below is an example of listing the config details for a single app. [source,json] @@ -318,6 +284,7 @@ Below is an example of listing the config details for a single app. ---- == Config System Commands + These commands manage system configurations. == config:system:delete @@ -327,8 +294,6 @@ These commands manage system configurations. {occ-command-example-prefix-docker} config:system:delete [options] [--] ()... ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -352,8 +317,6 @@ NOTE: Run this command inside the ownCloud Docker container. System config value maintenance:mode deleted ---- -NOTE: Run this command inside the ownCloud Docker container. - == config:system:get [source,docker,subs="attributes+"] @@ -361,8 +324,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} config:system:get [options] [--] ()... ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -384,11 +345,9 @@ the command will exit with 1. [source,docker,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:system:get version -10.16.0.2 +11.0.0.0 ---- -NOTE: Run this command inside the ownCloud Docker container. - == config:system:set [source,docker,subs="attributes+"] @@ -396,8 +355,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} config:system:set [options] [--] ()... ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -432,8 +389,6 @@ ownCloud is in maintenance mode - no app have been loaded System config value maintenance set to boolean false ---- -NOTE: Run this command inside the ownCloud Docker container. - Create the `app_paths` config setting (using a JSON payload because of multi array values): [source,docker,subs="attributes+"] @@ -454,8 +409,6 @@ Create the `app_paths` config setting (using a JSON payload because of multi arr ]' ---- -NOTE: Run this command inside the ownCloud Docker container. - Adding Redis to the configuration: [source,docker,subs="attributes+"] @@ -468,8 +421,6 @@ Adding Redis to the configuration: System config value redis set to json {"host": "{oc-examples-server-ip}", "port": "{std-port-redis}"} ---- -NOTE: Run this command inside the ownCloud Docker container. - Some configurations (e.g., the trusted domain setting) are an array of data. The array starts counting with 0. In order to set (and also get) the value of one key, you can specify multiple `config` names separated by spaces: @@ -481,8 +432,6 @@ owncloud.local sample.tld ---- -NOTE: Run this command inside the ownCloud Docker container. - To replace `sample.tld` with `example.com` trusted_domains => 2 needs to be set: [source,docker,subs="attributes+"] @@ -495,5 +444,3 @@ localhost owncloud.local example.com ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/security_setup_warnings.adoc b/modules/admin_manual/pages/configuration/server/security_setup_warnings.adoc index 4a842ba14..bb34f55aa 100644 --- a/modules/admin_manual/pages/configuration/server/security_setup_warnings.adoc +++ b/modules/admin_manual/pages/configuration/server/security_setup_warnings.adoc @@ -3,9 +3,7 @@ == Introduction -Your ownCloud server has a built-in configuration checker, and it -reports its findings at the top of your Admin page. These are some of -the warnings you might see, and what to do about them. +Your ownCloud Server has a built-in configuration checker, and it reports its findings at the top of your Admin page. These are some of the warnings you might see, and what to do about them. image:security-setup-warning-complete.png[image] @@ -19,117 +17,76 @@ ownCloud supports multiple PHP caching extensions: * APCu * Memcached -* Redis (minimum required PHP extension version: 2.2.6) +* Redis, which is the default for Dockerized environments -You will see this warning if you have no caches installed and enabled, -or if your cache does not have the required minimum version installed; -older versions are disabled because of performance problems. +You will see this warning if you have no caches installed and enabled. -If you see `__\{Cache}__ below version _\{Version}_ is installed. for -stability and performance reasons we recommend to update to a newer -_\{Cache}_ version` then you need to upgrade, or, if you’re not using it, remove it. +You are not required to use any caches, but caches improve server performance. See caching_configuration. -You are not required to use any caches, but caches improve server -performance. See caching_configuration. - -== Transactional file locking is disabled +== Transactional File Locking is Disabled ---- Transactional file locking is disabled, this might lead to issues with race conditions. ---- -Please see xref:configuration/files/files_locking_transactional.adoc[Transactional File Locking] -for how to correctly configure your environment for transactional file locking. +Please see xref:configuration/files/files_locking_transactional.adoc[Transactional File Locking] for how to correctly configure your environment for transactional file locking. == Background Jobs ---- -We recommend to enable system cron as any other cron method has possible performance and reliability implications. +We recommend to enable system cron as any other cron method +has possible performance and reliability implications. ---- Further Information can be found in the docs article on xref:configuration/server/background_jobs_configuration.adoc[Background Jobs] -== You are accessing this site via HTTP +== You are Accessing This Site via HTTP ---- -You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead. +You are accessing this site via HTTP. +We strongly suggest you configure your server to require using HTTPS instead. ---- -Please take this warning seriously; using HTTPS is a fundamental security measure. -You must configure your Web server to support it, and then there are some settings in the *Security* section of your ownCloud Admin page to enable. -The following pages describe how to enable HTTPS on the Apache webserver. +Please take this warning seriously; using HTTPS is a fundamental security measure. You must configure your Web server to support it, and then there are some settings in the *Security* section of your ownCloud Admin page to enable. The following pages describe how to enable HTTPS on the Apache webserver. -* xref:installation/manual_installation/manual_installation.adoc#configure-the-web-server[Enable SSL on Apache] -* xref:configuration/server/harden_server.adoc#use-https[Use HTTPS] +* See the xref:configuration/server/harden_server.adoc#use-https[Hardening and Security Guidance] documentation for more details. -== The test with getenv("PATH") only returns an empty response +== The Test with getenv("PATH") Only Returns an Empty Response -Some environments are not passing a valid PATH variable to ownCloud. -For Docker-based installations, ensure that the PATH variable is correctly set in the container environment via your Docker Compose configuration. +Some environments are not passing a valid PATH variable to ownCloud. For Docker-based installations, ensure that the PATH variable is correctly set in the container environment via your Docker Compose configuration. -== The "Strict-Transport-Security" HTTP header is not configured +== The "Strict-Transport-Security" HTTP header is not Configured ---- The `Strict-Transport-Security` HTTP header is not configured to least `15552000` seconds. For enhanced security we recommend enabling HSTS as described in our security tips. ---- -The HSTS header needs to be configured within your Web server by following the -xref:configuration/server/harden_server.adoc#enable-http-strict-transport-security[Enable HTTP Strict Transport Security] -documentation. - -== Your Web server is not yet set up properly to allow file synchronization - ----- -Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken. ----- +The HSTS header needs to be configured within your Web server by following the xref:configuration/server/harden_server.adoc#enable-http-strict-transport-security[Enable HTTP Strict Transport Security] documentation. -At the ownCloud community forums a larger -{oc-central-url}/t/how-to-fix-caldav-carddav-webdav-problems/852[FAQ] -is maintained containing various information and debugging hints. - -== Outdated NSS / OpenSSL version - ----- -cURL is using an outdated OpenSSL version (OpenSSL/$version). Please -update your operating system or features such as installing and updating -apps via the ownCloud Marketplace or Federated Cloud Sharing will not -work reliably. ----- +== Your Web Server is not yet set up Properly to Allow File Synchronization ---- -cURL is using an outdated NSS version (NSS/$version). Please update -your operating system or features such as installing and updating apps -via the ownCloud Marketplace or Federated Cloud Sharing will not work -reliably. +Your web server is not yet set up properly to allow file synchronization +because the WebDAV interface seems to be broken. ---- -There are known bugs in older OpenSSL and NSS versions leading to -misbehaviour in combination with remote hosts using SNI. A technology -used by most of the HTTPS websites. To ensure that ownCloud will work -properly you need to update OpenSSL to at least 1.0.2b or 1.0.1d. For -NSS the patch version depends on your distribution and an heuristic is -running the test which actually reproduces the bug. There are -distributions such as RHEL/CentOS which have this backport still -https://bugzilla.redhat.com/show_bug.cgi?id=1241172[pending]. +At the ownCloud community forums a larger {oc-central-url}/t/how-to-fix-caldav-carddav-webdav-problems/852[FAQ] is maintained containing various information and debugging hints. -== Your Web server is not set up properly to resolve /.well-known/caldav/ or /.well-known/carddav/ +== Your Web server is not set up Properly to Resolve /.well-known/caldav/ or /.well-known/carddav/ -Both URLs need to be correctly redirected to the DAV endpoint of ownCloud. Please refer to -xref:configuration/general_topics/general_troubleshooting.adoc#service-discovery[Service Discovery] -for more info. +Both URLs need to be correctly redirected to the DAV endpoint of ownCloud. Please refer to xref:configuration/general_topics/general_troubleshooting.adoc#service-discovery[Service Discovery] for more info. -== Some files have not passed the integrity check +== Some Files Have not Passed the Integrity Check Please refer to the xref:configuration/general_topics/code_signing.adoc#fixing-invalid-code-integrity-messages[Fixing Invalid Code Integrity Messages] documentation how to debug this issue. -== Your database does not run with "READ COMMITTED" transaction isolation level +== Your Database Does not run with "READ COMMITTED" Transaction Isolation Level ---- Your database does not run with"READ COMMITTED" transaction isolation level. This can cause problems when multiple actions are executed in parallel. ---- -Please refer to -xref:configuration/database/linux_database_configuration.adoc#mysql-mariadb[MySQL / MariaDB with Binary Logging Enabled]) +Please refer to xref:configuration/database/linux_database_configuration.adoc#mysql-mariadb[MySQL / MariaDB with Binary Logging Enabled]) how to configure your database for this requirement. diff --git a/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc b/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc index 39bf3ac14..1841e6f00 100644 --- a/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc +++ b/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc @@ -135,7 +135,7 @@ The administration server. This is typically the same as the LDAP/Active Directo ** If this is not the case, you need to https://wiki.samba.org/index.php/Setting_up_Samba_as_a_Domain_Member[Setting up Samba as a Domain Member]. //// -* The Docker image does not provide the required Kerberos `krb5` PHP extension and the `krb5-user` CLI tool. This tool is an actual requirement, the Kerberos implementation in the WND app requires the `kvno` command which is contained in the package installed. To mitigate this issue, you need to manually create an image that installs and enables these requirements. +* The Docker image does not provide the required Kerberos `krb5` PHP extension and the `krb5-user` CLI tool. This tool is an actual requirement, the Kerberos implementation in the WND app requires the `kvno` command which is contained in the package installed. To mitigate this issue, you need to manually create an image that installs and enables these requirements. * DNS records + Create a DNS record for the public FQDN of the ownCloud instance (``). diff --git a/modules/admin_manual/pages/troubleshooting/general_troubleshooting.adoc b/modules/admin_manual/pages/troubleshooting/general_troubleshooting.adoc index 3a63e4a6d..2aac3527d 100644 --- a/modules/admin_manual/pages/troubleshooting/general_troubleshooting.adoc +++ b/modules/admin_manual/pages/troubleshooting/general_troubleshooting.adoc @@ -15,18 +15,11 @@ If you have trouble installing, configuring or maintaining ownCloud, please refe * The {oc-central-url}[ownCloud Forum] -NOTE: The ownCloud forum have a https://owncloud.com/faq/[FAQ category] -where each topic corresponds to typical errors or frequently occurring issues. +NOTE: The ownCloud forum have a https://owncloud.com/faq/[FAQ category] where each topic corresponds to typical errors or frequently occurring issues. -Please understand that this channel essentially consist of users -like you helping each other. Consider helping others when you -can in return for the help you get. This is the only way to -keep a community like ownCloud healthy and sustainable! +Please understand that this channel essentially consist of users like you helping each other. Consider helping others when you can in return for the help you get. This is the only way to keep a community like ownCloud healthy and sustainable! -If you are using ownCloud in a business or otherwise large scale -deployment, note that ownCloud GmbH offers the -https://owncloud.com/find-the-right-edition/[Enterprise Edition] -with commercial support options. +If you are using ownCloud in a business or otherwise large scale deployment, note that ownCloud GmbH offers the https://owncloud.com/find-the-right-edition/[Enterprise Edition] with commercial support options. == Bugs @@ -35,47 +28,33 @@ If you think you have found a bug in ownCloud, please: * Search for a solution (see the options above) * Double-check your configuration -If you can’t find a solution, please use our -xref:developer_manual:bugtracker/index.adoc[bugtracker]. -You can generate a configuration report with the -xref:configuration/server/occ_command.adoc#config-commands[occ config command], -with passwords automatically obscured. +If you can’t find a solution, please use our xref:developer_manual:bugtracker/index.adoc[bugtracker]. You can generate a configuration report with the xref:configuration/server/occ_command.adoc#config-commands[occ config command], with passwords automatically obscured. == General Troubleshooting -Check the ownCloud xref:installation/system_requirements.adoc[System Requirements], especially supported browser versions. -When you see warnings about `code integrity`, refer to xref:configuration/general_topics/code_signing.adoc[Code Signing]. +Check the ownCloud xref:installation/system_requirements.adoc[System Requirements], especially supported browser versions. When you see warnings about `code integrity`, refer to xref:configuration/general_topics/code_signing.adoc[Code Signing]. === Disable Third-Party Apps -Third-party apps may cause problems during upgrades. -To avoid this happening, we strongly encourage administrators to always disable xref:maintenance/manual_upgrade.adoc#review-third-party-apps[third-party apps] before upgrades, and for troubleshooting purposes. +Third-party apps may cause problems during upgrades. To avoid this happening, we strongly encourage administrators to always disable third-party apps before upgrades, and for troubleshooting purposes. === ownCloud Logfiles -In a standard ownCloud installation the log level is set to `Normal`. -To find any issues you need to raise the log level to `All` in your `config.php` file, or to *Everything* on your ownCloud Admin page. -Please see xref:configuration/server/logging/logging_configuration.adoc[Logging Configuration] for more information on these log levels. +In a standard ownCloud installation the log level is set to `Normal`. To find any issues you need to raise the log level to `All` in your `config.php` file, or to *Everything* on your ownCloud Admin page. Please see xref:configuration/server/logging/logging_configuration.adoc[Logging Configuration] for more information on these log levels. -Some logging - for example JavaScript console logging - needs debugging -enabled. Edit config/config.php and change `'debug' => false,` to -`'debug' => true,` Be sure to change it back when you are finished. +Some logging - for example JavaScript console logging - needs debugging enabled. Edit config/config.php and change `'debug' => false,` to `'debug' => true,` Be sure to change it back when you are finished. -For JavaScript issues you will also need to view the javascript console. -All major browsers have developer tools for viewing the console. Usually you can access them by pressing F12. +For JavaScript issues you will also need to view the javascript console. All major browsers have developer tools for viewing the console. Usually you can access them by pressing F12. -For more information on developer tools for Mozilla Firefox, refer to: -https://developer.mozilla.org/en-US/docs/Tools +For more information on developer tools for Mozilla Firefox, refer to: https://developer.mozilla.org/en-US/docs/Tools -To learn more about Chrome or Chromium developer tools, go to: -https://developer.chrome.com/docs/devtools/ +To learn more about Chrome or Chromium developer tools, go to: https://developer.chrome.com/docs/devtools/ NOTE: The logfile of ownCloud is located in the data directory `owncloud/data/owncloud.log`. === PHP Version and Information -You will need to know your PHP version and configuration details. -There are two ways to retrieve this information: using PHP's phpinfo function and using a set of options to PHP on the command-line. +You will need to know your PHP version and configuration details. There are two ways to retrieve this information: using PHP's phpinfo function and using a set of options to PHP on the command-line. ==== Using PHP's phpinfo Function @@ -94,8 +73,7 @@ Open this file in a web browser, by pointing your browser to `localhost/phpinfo. image:phpinfo.png[image] -Your PHP version is at the top, and the rest of the page contains abundant system information such as active modules, active `.ini` files, and much more. -When you are finished reviewing your information you must delete `phpinfo.php`, or move it outside of your Web directory, because it is a security risk to expose such sensitive data. +Your PHP version is at the top, and the rest of the page contains abundant system information such as active modules, active `.ini` files, and much more. When you are finished reviewing your information you must delete `phpinfo.php`, or move it outside of your Web directory, because it is a security risk to expose such sensitive data. ==== Using the Command-Line @@ -138,9 +116,7 @@ Disregarding this can lead to unwanted behaviours like: * Problems with sync clients * Undetected changes due to caching in the database -If you need to directly upload files from the same server please use a -WebDAV command line client like `cadaver` to upload files to the WebDAV -interface at: +If you need to directly upload files from the same server please use a WebDAV command line client like `cadaver` to upload files to the WebDAV interface at: `\https://example.com/owncloud/remote.php/dav` @@ -153,10 +129,6 @@ described above: * `SQLSTATE[HY000]: General error: 5 database is locked` -> You’re using `SQLite` which can’t handle a lot of parallel requests. Please consider converting to another database like described in xref:configuration/database/db_conversion.adoc[converting Database Type]. * `SQLSTATE[HY000]: General error: 2006 MySQL server has gone away` -> Please refer to xref:configuration/database/linux_database_configuration.adoc#troubleshooting[Troubleshooting] for more information. * `SQLSTATE[HY000] [2002] No such file or directory` -> There is a problem accessing your SQLite database file in your data directory (`data/owncloud.db`). Please check the permissions of this folder/file or if it exists at all. If you’re using MySQL please start your database. -* `Connection closed / Operation cancelled` or `expected filesize 4734206 got 458752` -> This could be caused by wrong -`KeepAlive` settings within your Apache config. Make sure that `KeepAlive` is set to `On` and also try to raise the -limits of `KeepAliveTimeout` and `MaxKeepAliveRequests`. On Apache with `mod_php` using a xref:installation/manual_installation/manual_installation.adoc#configure-the-web-server[multi-processing module] other than `prefork` could be another reason. -Further information is available {oc-central-url}/t/expected-filesize-xxx-got-yyy-0/816[in the forums]. * `No basic authentication headers were found` -> This error is shown in your `data/owncloud.log` file. Some Apache modules like `mod_fastcgi`, `mod_fcgid` or `mod_proxy_fcgi` are not passing the needed authentication headers to PHP and so the login to ownCloud via WebDAV, CalDAV and CardDAV clients is failing. @@ -167,14 +139,9 @@ More information on how to correctly configure your environment can be found === ownCloud clients cannot connect to the ownCloud server -If ownCloud clients cannot connect to your ownCloud server, check to see -if PROPFIND requests receive `HTTP/1.1 401 Unauthorized` responses. If -this is happening, more than likely your webserver configuration is -stripping out https://tools.ietf.org/html/rfc6750[the bearer authorization header]. +If ownCloud clients cannot connect to your ownCloud server, check to see if PROPFIND requests receive `HTTP/1.1 401 Unauthorized` responses. If this is happening, more than likely your webserver configuration is stripping out https://tools.ietf.org/html/rfc6750[the bearer authorization header]. -If you’re using the Apache web server, add the following `SetEnvIf` -directive to your Apache configuration, whether in the general Apache -config, in a configuration include file, or in ownCloud’s .htaccess +If you’re using the Apache web server, add the following `SetEnvIf` directive to your Apache configuration, whether in the general Apache config, in a configuration include file, or in ownCloud’s .htaccess file. [source,apache] @@ -184,28 +151,15 @@ SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 == Missing Data Directory -During the normal course of operations, the ownCloud data directory may -be temporarily unavailable for a variety of reasons. These can include -network timeouts on mounted network disks, unintentional unmounting of -the partition on which the directory sits, or a corruption of the RAID -setup. If you have experienced this, here’s how ownCloud works and what -you can expect. - -During normal operation, ownCloud’s data directory contains a hidden -file, named `.ocdata`. The purpose of this file is for setups where the -data folder is mounted (such as via NFS) and for some reason the mount -disappeared. If the directory isn’t available, the data folder would, in -effect, be completely empty and the `.ocdata` would be missing. When -this happens, ownCloud will return a -https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#5xx_Server_Error[503 Service not available] -error, to prevent clients believing that the files are gone. +During the normal course of operations, the ownCloud data directory may be temporarily unavailable for a variety of reasons. These can include network timeouts on mounted network disks, unintentional unmounting of the partition on which the directory sits, or a corruption of the RAID setup. If you have experienced this, here’s how ownCloud works and what you can expect. + +During normal operation, ownCloud’s data directory contains a hidden file, named `.ocdata`. The purpose of this file is for setups where the data folder is mounted (such as via NFS) and for some reason the mount disappeared. If the directory isn’t available, the data folder would, in effect, be completely empty and the `.ocdata` would be missing. When this happens, ownCloud will return a https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#5xx_Server_Error[503 Service not available] error, to prevent clients believing that the files are gone. == Troubleshooting Web server and PHP problems === Logfiles -When having issues the first step is to check the logfiles provided by -PHP, the Web server and ownCloud itself. +When having issues the first step is to check the logfiles provided by PHP, the Web server and ownCloud itself. NOTE: In the following the paths to the logfiles of a default Debian installation running Apache2 with mod_php is assumed. On other Web servers, Linux distros or operating systems they can differ. @@ -217,32 +171,6 @@ directive. After those changes you need to restart your Web server. * The logfile of ownCloud is located in the data directory `/var/www/owncloud/data/owncloud.log`. -=== Web Server and PHP Modules - -NOTE: https://www.lighttpd.net/[Lighttpd] is not supported with ownCloud — and some ownCloud features -may not work _at all_ on Lighttpd. - -There are some Web server or PHP modules which are known to cause -various problems like broken up-/downloads. The following shows a draft -overview of these modules: - -==== Apache - -* libapache2-mod-php7.4 (or a lower supported version if necessary) -* mod_dav -* mod_deflate -* mod_evasive -* mod_pagespeed -* mod_proxy_html (can cause broken PDF downloads) -* mod_reqtimeout -* mod_security -* mod_spdy together with libapache2-mod-php7.4 (see above) / mod_php (use fcgi or php-fpm instead) -* mod_xsendfile / X-Sendfile (causing broken downloads if not configured correctly) - -==== PHP - -* eAccelerator - == Troubleshooting WebDAV === General troubleshooting @@ -261,9 +189,7 @@ See: * http://sabre.io/dav/clients/finder/[Finder, OS X’s built-in WebDAV client] (Describes problems with Finder on various Web servers) -There is also a well maintained FAQ thread available at the -{oc-central-url}/t/how-to-fix-caldav-carddav-webdav-problems/852[ownCloud Forums] -which contains various additional information about WebDAV problems. +There is also a well maintained FAQ thread available at the {oc-central-url}/t/how-to-fix-caldav-carddav-webdav-problems/852[ownCloud Forums] which contains various additional information about WebDAV problems. === Error 0x80070043 `The network name cannot be found.` while adding a network drive @@ -273,13 +199,11 @@ The windows native WebDAV client might fail with the following error message: Error 0x80070043 "The network name cannot be found." while adding a network drive ---- -A known workaround for this issue is to update your web server -configuration. +A known workaround for this issue is to update your web server configuration. *Apache* -You need to add the following rule set to your main web server or -virtual host configuration, or the `.htaccess` file in your document +You need to add the following rule set to your main web server or virtual host configuration, or the `.htaccess` file in your document root. NOTE: Please keep in mind that the `.htaccess` file in the ownCloud directory will be overwritten on update. Post upgrading ownCloud, you need to manually restore these changes. See the section xref:maintenance/upgrading/manual_upgrade.adoc#backup-manual-changes-in-htaccess[Backup Manual Changes in .htaccess] for details. @@ -297,11 +221,9 @@ RewriteRule .* - [R=401,L] === Service Discovery -Some clients - especially on iOS/Mac OS X - have problems finding the -proper sync URL, even when explicitly configured to use it. +Some clients - especially on iOS/Mac OS X - have problems finding the proper sync URL, even when explicitly configured to use it. -If you want to use CalDAV or CardDAV clients together with ownCloud it -is important to have a correct working setup of the following URLs: +If you want to use CalDAV or CardDAV clients together with ownCloud it is important to have a correct working setup of the following URLs: [verse] -- @@ -310,8 +232,7 @@ is important to have a correct working setup of the following URLs: -- -Those need to be redirecting your clients to the correct DAV endpoints. -If running ownCloud at the document root of your Web server the correct +Those need to be redirecting your clients to the correct DAV endpoints. If running ownCloud at the document root of your Web server the correct URL is: `\https://example.com/remote.php/dav` @@ -320,13 +241,9 @@ and if running in a subfolder like `owncloud`: `\https://example.com/owncloud/remote.php/dav` -For the first case the .htaccess file shipped with ownCloud should do -this work for your when running Apache. You only need to make sure that -your Web server is using this file. +For the first case the .htaccess file shipped with ownCloud should do this work for your when running Apache. You only need to make sure that your Web server is using this file. -If your ownCloud instance is installed in a subfolder called `owncloud` -and you’re running Apache create or edit the .htaccess file within the -document root of your Web server and add the following lines: +If your ownCloud instance is installed in a subfolder called `owncloud` and you’re running Apache create or edit the .htaccess file within the document root of your Web server and add the following lines: [source,apache] ---- @@ -342,8 +259,7 @@ instead of e.g. `\https://example.com/owncloud/remote.php/dav/principals/username`. -There are also several techniques to remedy this, which are described -extensively at the http://sabre.io/dav/service-discovery/[Sabre DAV website]. +There are also several techniques to remedy this, which are described extensively at the http://sabre.io/dav/service-discovery/[Sabre DAV website]. === Unable to update Contacts or Events @@ -362,15 +278,8 @@ Misconfigured Web server:: == Client Sync Stalls -One known reason is stray locks. These should expire automatically after an hour. -If stray locks don’t expire (identified by e.g. repeated `file.txt is locked` and/or `Exception\\\\FileLocked` messages in your data/owncloud.log), make sure that you are running system cron and not Ajax cron (See xref:configuration/server/background_jobs_configuration.adoc[Background Jobs]). -See https://github.com/owncloud/core/issues/22116 and -{oc-central-url}/t/file-is-locked-how-to-unlock/985 -for some discussion and additional info of this issue. +One known reason is stray locks. These should expire automatically after an hour. If stray locks don’t expire (identified by e.g. repeated `file.txt is locked` and/or `Exception\\\\FileLocked` messages in your data/owncloud.log), make sure that you are running system cron and not Ajax cron (See xref:configuration/server/background_jobs_configuration.adoc[Background Jobs]). See https://github.com/owncloud/core/issues/22116 and {oc-central-url}/t/file-is-locked-how-to-unlock/985 for some discussion and additional info of this issue. == Other issues -Some services like _Cloudflare_ can cause issues by minimizing -JavaScript and loading it only when needed. When having issues like a -not working login button or creating new users make sure to disable such -services first. +Some services like _Cloudflare_ can cause issues by minimizing JavaScript and loading it only when needed. When having issues like a not working login button or creating new users make sure to disable such services first. diff --git a/modules/admin_manual/pages/useful_pages.adoc b/modules/admin_manual/pages/useful_pages.adoc index 825d449f2..ee4f33289 100644 --- a/modules/admin_manual/pages/useful_pages.adoc +++ b/modules/admin_manual/pages/useful_pages.adoc @@ -14,4 +14,4 @@ Note that this section always points to the latest server version available. In * xref:server:admin_manual:installation/installing_with_docker.adoc[Installation with Docker] * xref:server:admin_manual:configuration/server/occ_command.adoc[OCC Commands] * xref:server:admin_manual:configuration/server/caching_configuration.adoc#small-organization-single-server-setup[File Locking and Caching Configuration] -* xref:server:admin_manual:maintenance/manual_upgrade.adoc[Manual Upgrade] +* xref:server:admin_manual:maintenance/upgrading/manual_upgrade.adoc[Manual Upgrade] diff --git a/modules/developer_manual/pages/general/devenv.adoc b/modules/developer_manual/pages/general/devenv.adoc index 5addb09a1..b6584944b 100644 --- a/modules/developer_manual/pages/general/devenv.adoc +++ b/modules/developer_manual/pages/general/devenv.adoc @@ -9,7 +9,7 @@ Feel free to skip already one or more of the following steps, if you have alread == Install the Core Software -The first thing to do is to ensure that your server has the necessary software for installing and running ownCloud. While you can go further, you need to install at least the xref:admin_manual:installation/manual_installation/manual_installation.adoc[required packages]. Then, you will need to install the software required to run the development environment's installation process. +The first thing to do is to ensure that your server has the necessary software for installing and running ownCloud. While you can go further, you need to proceed with xref:admin_manual:installation/installing_with_docker.adoc[Installing With Docker]. Then, you will need to install the software required to run the development environment's installation process. * https://www.gnu.org/software/make/[Make] * https://nodejs.org[Node.js] @@ -18,7 +18,9 @@ The first thing to do is to ensure that your server has the necessary software f * https://linux.die.net/man/1/unzip[unzip] * https://www.gnu.org/software/wget/[wget] -=== Install Dependencies on Ubuntu 24.04 +=== Install Dependencies + +These dependencies need to be installed manually creating an own Docker Image. ==== Install nodejs, make, unzip, and git @@ -130,7 +132,6 @@ sudo zypper --quiet --non-interactive install \ Next, you need to setup your web and database servers, so that they work properly with ownCloud. The respective guides are available at: -* xref:admin_manual:installation/manual_installation/manual_installation.adoc#configure-the-web-server[Apache Webserver Configuration] * xref:admin_manual:configuration/database/linux_database_configuration.adoc[Database Server Configuration] == Get The Source diff --git a/modules/developer_manual/pages/testing/test-pilots.adoc b/modules/developer_manual/pages/testing/test-pilots.adoc index c5d18221b..c4493c38e 100644 --- a/modules/developer_manual/pages/testing/test-pilots.adoc +++ b/modules/developer_manual/pages/testing/test-pilots.adoc @@ -3,41 +3,28 @@ == Introduction -The ownCloud Test Pilots help to test and improve different server and -client setups with ownCloud. +The ownCloud Test Pilots help to test and improve different server and client setups with ownCloud. == What do you do -You will receive emails from the mailing list and also from the bug -tracker if developers need your help. Also, there will be announcements -of new releases and preview releases on the mailing list, which give you -the possibility to test releases early and to help the developers fix +You will receive emails from the mailing list and also from the bug tracker if developers need your help. Also, there will be announcements of new releases and preview releases on the mailing list, which give you the possibility to test releases early and to help the developers fix them. We are looking forward to working with you :) == Why do you want to join -There are many different setups, and people have different interests. -If we want ownCloud to run well on a variety of different software configurations, someone has to test them. -Furthermore, during bug fixing the ownCloud developers often do not have the possibility to reproduce the bug in a given environment, nor are they able confirm if it was fixed. +There are many different setups, and people have different interests. If we want ownCloud to run well on a variety of different software configurations, someone has to test them. Furthermore, during bug fixing the ownCloud developers often do not have the possibility to reproduce the bug in a given environment, nor are they able confirm if it was fixed. -As a member of the Test Pilot Team you could act as a contact person for -a particular area to help developers *fix the bugs you care about*. -Testing ownCloud before it is released is the best way of making sure it -does what you need. +As a member of the Test Pilot Team you could act as a contact person for a particular area to help developers *fix the bugs you care about*. Testing ownCloud before it is released is the best way of making sure it does what you need. -Another benefit is a closer relationship with the developers, because -you will know which people are responsible for which parts, and it will -be easier to get help. +Another benefit is a closer relationship with the developers, because you will know which people are responsible for which parts, and it will be easier to get help. -If you want, you can also be listed as an active contributor on the -https://owncloud.com[owncloud.com] page. +If you want, you can also be listed as an active contributor on the https://owncloud.com[owncloud.com] page. == Who can join -Anyone who is interested in improving the quality on his/her setup and -is willing to communicate with developers and other testers. +Anyone who is interested in improving the quality on his/her setup and is willing to communicate with developers and other testers. == How do you join @@ -56,27 +43,17 @@ Testing follows these steps: == Installing ownCloud -Testing starts with setting up a testing environment. We urge you not to -put your production data on testing releases unless you have a backup +Testing starts with setting up a testing environment. We urge you not to put your production data on testing releases unless you have a backup somewhere! -Start by installing ownCloud, either on real hardware or in a VM. You can find instructions for installing ownCloud in the xref:admin_manual:installation/manual_installation/manual_installation.adoc[Manual Installation on Linux]. +Start by installing ownCloud, either on real hardware or in a VM. You can find instructions for installing ownCloud in the xref:admin_manual:installation/installing_with_docker.adoc[Installing With Docker]. -Please note that we are still working on the documentation and if you -bump into a problem, you can -https://github.com/owncloud/docs[help us fix it]. Small things -can be edited straight on GitHub. +Please note that we are still working on the documentation and if you bump into a problem, you can https://github.com/owncloud/docs[help us fix it]. Small things can be edited straight on GitHub. == The Real Testing -Testing is a matter of trying out some scenarios you decide on or were -asked to test, for example, sharing a folder and mounting it on another -ownCloud instance. If it works – awesome, move on. If it doesn’t, find -out as much as you can about why it doesn’t and use that for a bug -report. +Testing is a matter of trying out some scenarios you decide on or were asked to test, for example, sharing a folder and mounting it on another ownCloud instance. If it works – awesome, move on. If it doesn’t, find out as much as you can about why it doesn’t and use that for a bug report. -This is the stage where you should see if your issue is already reported by checking the relevant xref:bugtracker/index.adoc[bug tracker]. -It might even be fixed, sometimes! Alternatively, just ask on the test-pilots mailing list. +This is the stage where you should see if your issue is already reported by checking the relevant xref:bugtracker/index.adoc[bug tracker]. It might even be fixed, sometimes! Alternatively, just ask on the test-pilots mailing list. -Finally, if the issue you bump into is a definite bug and the developers -are not aware of it, file it as a new issue in xref:bugtracker/index.adoc[the relevant bug tracker]. +Finally, if the issue you bump into is a definite bug and the developers are not aware of it, file it as a new issue in xref:bugtracker/index.adoc[the relevant bug tracker]. From 15849521c77b4bbf0dad552cfc38dd8bb53b0433 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Thu, 4 Jun 2026 13:23:23 +0200 Subject: [PATCH 23/38] remove drone from dev docs --- .../developer_manual/pages/testing/drone.adoc | 85 ------------------- modules/developer_manual/partials/nav.adoc | 1 - 2 files changed, 86 deletions(-) delete mode 100644 modules/developer_manual/pages/testing/drone.adoc diff --git a/modules/developer_manual/pages/testing/drone.adoc b/modules/developer_manual/pages/testing/drone.adoc deleted file mode 100644 index f5df9d35d..000000000 --- a/modules/developer_manual/pages/testing/drone.adoc +++ /dev/null @@ -1,85 +0,0 @@ -= Drone Testing -:toc: right - -:drone-cli-url: https://github.com/drone/drone-cli -:smashbox-url: https://github.com/owncloud-docker/smashbox - -== Introduction - -This document will show you how to run drone tests locally. - -== Setup Drone - -- Download the {drone-cli-url}[command line client] for the Drone Continuous Integration Server -- Have a local docker available -- Look at file `.drone.yml` for possible values or the variables as they appear in the CI drone runs -- Command: `PHP_VERSION=7.4 DB_TYPE=postgres TEST_SUITE=phpunit drone exec` - -== Acceptance Tests - -- You need a local ownCloud setup. If not already done, finalize the installation it with: -+ -[source,console,subs="attributes+"] ----- -{occ-command-example-prefix-docker} maintenance:install ----- - -- Change into directory: -+ -[source,console] ----- -cd tests/acceptance ----- - -- Run all tests: -+ -[source,console] ----- -./run.sh ----- - -- Run a particular test by adding a feature file name and optionally line number: -+ -[source,console] ----- - ./run.sh features/sharing-v1.feature:123 ----- - -- From drone, use TEST_SUITE=api-acceptance-tests - -== Smashbox Tests - -Download the {smashbox-url}[ownCloud Smashbox Image] and see following possible commands: - -Note, the following command will not work, docker does not understand localhost, and needs a user and password: - -[source,console] ----- -sudo docker run -e SMASHBOX_URL=localhost:9680 \ - -e SMASHBOX_USERNAME=admin \ - -e SMASHBOX_ACCOUNT_PASSWORD=admin \ - owncloud/smashbox lib/test_basicSync.py ----- - -This is a correct working example: - -[source,console] ----- -sudo docker run -e SMASHBOX_URL=172.42.16.124:80/octest \ - -e SMASHBOX_USERNAME=admin \ - -e SMASHBOX_ACCOUNT_PASSWORD=admin \ - -e SMASHBOX_PASSWORD=admin \ - owncloud/smashbox lib/test_basicSync.py ----- - -This will run a specific test: - -[source,console] ----- -sudo docker run -e SMASHBOX_URL=172.42.16.124:80/octest \ - -e SMASHBOX_USERNAME=admin \ - -e SMASHBOX_ACCOUNT_PASSWORD=admin \ - -e SMASHBOX_PASSWORD=admin \ - owncloud/smashbox lib/test_basicSync.py -t 0 ----- - diff --git a/modules/developer_manual/partials/nav.adoc b/modules/developer_manual/partials/nav.adoc index efff41b09..14d541322 100644 --- a/modules/developer_manual/partials/nav.adoc +++ b/modules/developer_manual/partials/nav.adoc @@ -18,7 +18,6 @@ *** xref:developer_manual:core/code-standard.adoc[Code Standards Compliance] *** xref:developer_manual:testing/index.adoc[Testing] **** xref:developer_manual:testing/test-pilots.adoc[ownCloud Test Pilots] -**** xref:developer_manual:testing/drone.adoc[Drone Testing] **** xref:developer_manual:testing/unit-testing.adoc[Unit Testing] **** xref:developer_manual:testing/acceptance-tests.adoc[Acceptance Tests] **** xref:developer_manual:testing/ui-testing.adoc[User Interface Testing] From 90c0492bf51fca22c1106efb15dc799c8cb54779 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Thu, 4 Jun 2026 18:50:58 +0200 Subject: [PATCH 24/38] remove nonsense added by Claude --- .../linux_database_configuration.adoc | 8 +- .../encryption/encryption_configuration.adoc | 40 -------- .../encryption_configuration_quick_guide.adoc | 10 -- .../files/external_storage/configuration.adoc | 2 - ...federated_cloud_sharing_configuration.adoc | 20 ---- .../files/file_sharing_configuration.adoc | 20 ---- .../files/manual_file_locking.adoc | 16 +--- .../pages/configuration/files/mimetypes.adoc | 21 ++-- .../configuration/files/trashbin_options.adoc | 6 -- .../general_topics/code_signing.adoc | 2 - .../general_topics/impersonate_users.adoc | 35 ++----- .../configuration/general_topics/search.adoc | 36 ++----- .../server/background_jobs_configuration.adoc | 12 --- .../server/legal_settings_configuration.adoc | 4 - .../app_commands/_2fa_app_commands.adoc | 4 - .../app_commands/_activity_commands.adoc | 8 -- .../app_commands/_admin_audit_commands.adoc | 6 -- .../app_commands/_antivirus_commands.adoc | 4 - .../_brute_force_protection_commands.adoc | 4 - .../app_commands/_custom_groups.adoc | 10 -- .../app_commands/_data_exporter_commands.adoc | 6 -- .../app_commands/_files_lifecycle.adoc | 24 ----- .../_full_text_search_commands.adoc | 32 ------- .../_ldap_integration_commands.adoc | 42 -------- .../app_commands/_market_commands.adoc | 10 -- .../app_commands/_metrics_commands.adoc | 7 -- .../_migrate_to_kitworks_commands.adoc | 12 --- .../_password_policy_commands.adoc | 4 - .../_ransomware_protection_commands.adoc | 14 --- .../app_commands/_richdocuments.adoc | 16 ---- .../app_commands/_s3objectstore_commands.adoc | 4 - ...l_sso_shibboleth_integration_commands.adoc | 2 - .../app_commands/_wnd_commands.adoc | 6 -- .../core_commands/_2fa_core_commands.adoc | 4 - .../core_commands/_app_commands.adoc | 13 --- .../_background_jobs_selector.adoc | 3 - .../_config_reports_commands.adoc | 6 -- .../core_commands/_database_commands.adoc | 4 - .../core_commands/_dav_commands.adoc | 18 ---- .../core_commands/_encryption_commands.adoc | 20 ---- .../_federation_sync_commands.adoc | 2 - .../_federation_trusted_servers.adoc | 12 --- .../core_commands/_file_commands.adoc | 34 ------- .../_files_external_commands.adoc | 2 - .../core_commands/_group_commands.adoc | 20 ---- .../_incoming_shares_commands.adoc | 2 - .../_integrity_check_commands.adoc | 5 - .../core_commands/_localisation_commands.adoc | 4 - .../core_commands/_logging_commands.adoc | 5 - .../core_commands/_maintenance_commands.adoc | 26 ----- .../_managing_background_jobs.adoc | 8 -- .../_migration_steps_commands.adoc | 5 - .../_notifications_commands.adoc | 4 - .../core_commands/_previews_commands.adoc | 4 - .../core_commands/_security_commands.adoc | 12 --- .../core_commands/_sharing_commands.adoc | 6 -- .../core_commands/_system_command.adoc | 6 -- .../core_commands/_trashbin_commands.adoc | 4 - .../core_commands/_user_commands.adoc | 96 ------------------- .../core_commands/_versions_commands.adoc | 8 -- .../server/security/hsmdaemon/index.adoc | 6 -- .../server/ui-configuration.adoc | 6 -- .../server/virus-scanner-support.adoc | 36 ++----- .../pages/configuration/user/oidc/oidc.adoc | 2 - .../user/reset_admin_password.adoc | 2 - .../configuration/user/user_auth_ldap.adoc | 10 +- .../configuration/user/user_management.adoc | 38 ++++---- .../file_management/files_lifecycle.adoc | 22 ----- .../pages/enterprise/logging/admin_audit.adoc | 2 - .../pages/enterprise/reporting/metrics.adoc | 4 - .../user_management/saml_2.0_sso.adoc | 2 - .../user_management/user_auth_shibboleth.adoc | 6 -- .../backup_and_restore/backup.adoc | 4 - .../pages/maintenance/enable_maintenance.adoc | 4 - ...migrating-from-user-key-to-master-key.adoc | 4 - .../export_import_instance_data.adoc | 8 -- .../manually-moving-data-folders.adoc | 8 -- .../providing_logs_and_config_files.adoc | 8 -- .../remove_non_existent_bg_jobs.adoc | 4 - .../server/disable-single-user-mode.adoc | 2 - 80 files changed, 64 insertions(+), 894 deletions(-) diff --git a/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc b/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc index 947415fac..06a752251 100644 --- a/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc +++ b/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc @@ -140,18 +140,18 @@ innodb_file_per_table=ON . Run the following occ command: + +-- [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} db:convert-mysql-charset ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ + When this is done, tables will be created with: -+ + * A `utf8mb4` character set. * A `utf8mb4_bin` collation. * `row_format` set to compressed. +-- [TIP] ==== diff --git a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc index 617fe9b54..6100efedf 100644 --- a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration.adoc @@ -113,15 +113,11 @@ To enable the encryption app, run the following command: {occ-command-example-prefix-docker} app:enable encryption ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} encryption:enable ---- -NOTE: Run this command inside the ownCloud Docker container. - If the encryption app is successfully enabled, you should see the following confirmations: [source,plaintext] @@ -159,8 +155,6 @@ To be safe and avoid any issues on a running instance, put your server in single {occ-command-example-prefix-docker} maintenance:singleuser --on ---- -NOTE: Run this command inside the ownCloud Docker container. - Enabling encryption via the command line involves several commands. If not already done, enable the default encryption module app with the following command: [source,bash,subs="attributes+"] @@ -168,8 +162,6 @@ Enabling encryption via the command line involves several commands. If not alrea {occ-command-example-prefix-docker} app:enable encryption ---- -NOTE: Run this command inside the ownCloud Docker container. - Then enable encryption, using the following command: [source,bash,subs="attributes+"] @@ -177,8 +169,6 @@ Then enable encryption, using the following command: {occ-command-example-prefix-docker} encryption:enable ---- -NOTE: Run this command inside the ownCloud Docker container. - Finally, encrypt all data, using the following command: [source,bash,subs="attributes+"] @@ -186,8 +176,6 @@ Finally, encrypt all data, using the following command: {occ-command-example-prefix-docker} encryption:encrypt-all --yes ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: This command is not typically required as the master key is often enabled at installation time. As a result when enabling it, there should be no data to encrypt. In case it’s being enabled after the installation and there are files which are unencrypted, xref:configuration/server/occ_command.adoc#encrypt-all[encrypt-all] can be used to encrypt them. Depending on the amount of existing data and the location, this operation can take a long time. Now you can turn off the single user mode: @@ -197,8 +185,6 @@ Now you can turn off the single user mode: {occ-command-example-prefix-docker} maintenance:singleuser --off ---- -NOTE: Run this command inside the ownCloud Docker container. - === View Current Encryption Status Get the current encryption status and the loaded encryption module: @@ -208,8 +194,6 @@ Get the current encryption status and the loaded encryption module: {occ-command-example-prefix-docker} encryption:status ---- -NOTE: Run this command inside the ownCloud Docker container. - === Replacing an Existing Master Key If the master key needs replacement, for example because it has been compromised, an occ command is available. The command is xref:configuration/server/occ_command.adoc#encryption[encryption:recreate-master-key]. It replaces an existing master key with a new one and encrypts the files with the new key. @@ -223,8 +207,6 @@ You must first put your ownCloud server into single-user mode to prevent any use {occ-command-example-prefix-docker} maintenance:singleuser --on ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,plaintext] ---- Single user mode is currently enabled @@ -237,8 +219,6 @@ Decrypt all user data files, or optionally a single user: {occ-command-example-prefix-docker} encryption:decrypt-all [username] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Disable Encryption To disable encryption, put your ownCloud server into single-user mode, and then disable your encryption module with these commands: @@ -248,15 +228,11 @@ To disable encryption, put your ownCloud server into single-user mode, and then {occ-command-example-prefix-docker} maintenance:singleuser --on ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} encryption:disable ---- -NOTE: Run this command inside the ownCloud Docker container. - Take it out of single-user mode when you are finished, by using the following command: [source,bash,subs="attributes+"] @@ -264,8 +240,6 @@ Take it out of single-user mode when you are finished, by using the following co {occ-command-example-prefix-docker} maintenance:singleuser --off ---- -NOTE: Run this command inside the ownCloud Docker container. - [IMPORTANT] ==== You may only disable encryption by using the xref:configuration/server/occ_command.adoc#encryption[occ Encryption Commands]. Make sure you have backups of all encryption keys, including those for all your users if user key encryption was selected. @@ -280,8 +254,6 @@ Get the current encryption status and the loaded encryption module: {occ-command-example-prefix-docker} encryption:status ---- -NOTE: Run this command inside the ownCloud Docker container. - === Enable Users' File Recovery Keys If users encrypt their files and lose their ownCloud password, they lose access to their encrypted files as the files will be unrecoverable. It is not possible to reset a user’s password using the standard reset process if the user's files are encrypted. @@ -333,8 +305,6 @@ You must first put your ownCloud server into single-user mode to prevent any use {occ-command-example-prefix-docker} maintenance:singleuser --on ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,plaintext] ---- Single user mode is currently enabled @@ -349,15 +319,11 @@ You may disable encryption only with `occ`. Make sure you have backups of all th {occ-command-example-prefix-docker} maintenance:singleuser --on ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} encryption:disable ---- -NOTE: Run this command inside the ownCloud Docker container. - IMPORTANT: Encryption cannot be disabled without the user’s password or xref:enable-users-file-recovery-keys[file recovery key]. If you don’t have access to at least one of these then there is no way to decrypt all files. @@ -369,8 +335,6 @@ command: {occ-command-example-prefix-docker} maintenance:singleuser --off ---- -NOTE: Run this command inside the ownCloud Docker container. - It is possible to disable encryption with the file recovery key _if_ every user has enabled it. In this case, "decrypt all" will decrypt all files of all users. NOTE: It is *not* planned to move this to the next user login or a background job. If that was done, then login passwords would need to be stored in the database, which could be a security issue. @@ -384,8 +348,6 @@ View current location of keys: {occ-command-example-prefix-docker} encryption:show-key-storage-root ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,plaintext] ---- Current key storage root: default storage location (data/) @@ -413,8 +375,6 @@ chmod -R 0770 /mount_point/files/new_keys {occ-command-example-prefix-docker} encryption:change-key-storage-root new_keys ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,plaintext] ---- Change key storage root from default storage location to new_keys diff --git a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration_quick_guide.adoc b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration_quick_guide.adoc index 40d147d34..739c6fc9b 100644 --- a/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration_quick_guide.adoc +++ b/modules/admin_manual/pages/configuration/files/encryption/encryption_configuration_quick_guide.adoc @@ -24,8 +24,6 @@ This quick guide gives a brief summary of the commands needed without going into {occ-command-example-prefix-docker} maintenance:singleuser --off ---- -NOTE: Run this command inside the ownCloud Docker container. - === View the Encryption Status [source,bash,subs="attributes+"] @@ -33,8 +31,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} encryption:status ---- -NOTE: Run this command inside the ownCloud Docker container. - === Decrypt Encrypted Files Depending on the amount of existing data, this operation can take a long time. @@ -46,8 +42,6 @@ Depending on the amount of existing data, this operation can take a long time. {occ-command-example-prefix-docker} maintenance:singleuser --off ---- -NOTE: Run this command inside the ownCloud Docker container. - === Deactivate Master-Key-Based Encryption [source,bash,subs="attributes+"] @@ -58,8 +52,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} app:disable encryption ---- -NOTE: Run this command inside the ownCloud Docker container. - If the master key has been compromised or exposed, you can replace it. You will need the current master key for it. [source,bash,subs="attributes+"] @@ -67,8 +59,6 @@ If the master key has been compromised or exposed, you can replace it. You will {occ-command-example-prefix-docker} encryption:recreate-master-key ---- -NOTE: Run this command inside the ownCloud Docker container. - == Clean up Your Database Access your ownCloud database and remove the remaining entries that have not been automatically removed with this command: diff --git a/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc b/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc index 4a83d7937..c7c0e09d3 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc @@ -137,8 +137,6 @@ You might need to setup a cron job that runs {occ-command-example-prefix-docker} files:scan --all` ---- -NOTE: Run this command inside the ownCloud Docker container. - * Alternatively, replace `--all` with the user name to trigger a rescan of the user’s files periodically, for example every 15 minutes, which includes the mounted external storage. + diff --git a/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc b/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc index ac9f2a2ca..467e11e5b 100644 --- a/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc @@ -36,8 +36,6 @@ image::configuration/files/browser-address-bars.png[Lock icon in Firefox, Google ---- {occ-command-example-prefix-docker} system:cron ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . Run the `OCA\Federation\SyncJob` job with the `force` option on both servers. + You can get the corresponding job ID by using the `background:queue:status` occ command: @@ -46,8 +44,6 @@ You can get the corresponding job ID by using the `background:queue:status` occ ---- {occ-command-example-prefix-docker} background:queue:execute --force ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . The check should now be green @@ -58,8 +54,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} dav:sync-system-addressbook {occ-command-example-prefix-docker} federation:sync-addressbook ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . Configure automatic acceptance of new federated shares + @@ -71,8 +65,6 @@ NOTE: Automatic acceptance of new federated shares will not work if the option ` {occ-command-example-prefix-docker} config:app:set federation auto_accept_trusted --value '0' {occ-command-example-prefix-docker} config:app:set federatedfilesharing auto_accept_trusted --value 'yes' ---- - -NOTE: Run this command inside the ownCloud Docker container. -- == Working With Proxies @@ -125,8 +117,6 @@ Alternatively you can use the command line: {occ-command-example-prefix-docker} config:app:set files_sharing cronjob_scan_external_enabled --value 'yes' ---- -NOTE: Run this command inside the ownCloud Docker container. - You can also configure these settings of the cronjob: . the minimum amount of time since last login of a user so that a scan is triggered (ensures only active users get fed shares synced) @@ -135,8 +125,6 @@ You can also configure these settings of the cronjob: ---- {occ-command-example-prefix-docker} config:app:set files_sharing cronjob_scan_external_min_login --value ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . the minimum amount of time since last scanned so that the next scan is triggered (avoid frequent scan when active collaboration) + @@ -144,8 +132,6 @@ NOTE: Run this command inside the ownCloud Docker container. ---- {occ-command-example-prefix-docker} config:app:set files_sharing cronjob_scan_external_min_scan --value ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . the maximum number of federated share scans per 10 minutes (scan performed only if fed share files got updated) + @@ -153,8 +139,6 @@ NOTE: Run this command inside the ownCloud Docker container. ---- {occ-command-example-prefix-docker} config:app:set files_sharing cronjob_scan_external_batch --value ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . Use the following command to force a run of the scanner cronjob: + @@ -162,8 +146,6 @@ NOTE: Run this command inside the ownCloud Docker container. ---- {occ-command-example-prefix-docker} background:queue:execute --force --accept-warning ---- -+ -NOTE: Run this command inside the ownCloud Docker container. == Known Issues @@ -191,8 +173,6 @@ It is possible to configure the VCARD properties that are searched in order to r {occ-command-example-prefix-docker} config:app:set dav remote_search_properties --value=CLOUD,FN,EMAIL ---- -NOTE: Run this command inside the ownCloud Docker container. - Possible values are: * VERSION diff --git a/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc b/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc index 6d73e4df6..f1e036a11 100644 --- a/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc @@ -106,8 +106,6 @@ xref:configuration/server/occ_command.adoc#config-commands[occ config:app:set co --value '' ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: In the example above, the `` is an {two-letter-url}[ISO 3166-1 alpha-2 two-letter country code], such as *de*, *gb*, *us*, *es* or others. @@ -230,8 +228,6 @@ Here is an example of how to transfer all files from one user to another. ---- -NOTE: Run this command inside the ownCloud Docker container. - Here is an example of how to transfer _a limited group_ a single folder from one user to another. In it, `folder/to/move`, and any file and folder inside it will be moved to ``. [source,bash,subs="attributes+"] @@ -242,8 +238,6 @@ Here is an example of how to transfer _a limited group_ a single folder from one ---- -NOTE: Run this command inside the ownCloud Docker container. - When using this command keep two things in mind: 1. The directory provided to the `--path` switch *must* exist inside `data//files`. @@ -260,8 +254,6 @@ IMPORTANT: If an exception occurred during the transfer ownership command or the {occ-command-example-prefix-docker} files:troubleshoot-transfer-ownership --uid ` ---- -NOTE: Run this command inside the ownCloud Docker container. - == Creating Persistent File Shares When a user is deleted, their files are also deleted. As you can imagine, this is a problem if they created file shares that need to be preserved, because these disappear as well. In ownCloud, files are tied to their owners. This means, whatever happens to the file owner also happens to the files. @@ -290,8 +282,6 @@ This command provides for the creation of both personal (for a specific user) an --user someuser ---- -NOTE: Run this command inside the ownCloud Docker container. - or [source,bash,subs="attributes+"] @@ -306,8 +296,6 @@ or --user someuser ---- -NOTE: Run this command inside the ownCloud Docker container. - ==== General Share [source,bash,subs="attributes+"] @@ -318,8 +306,6 @@ NOTE: Run this command inside the ownCloud Docker container. --config={host=127.0.0.1, share='home', root='$user', domain='owncloud.local'} ---- -NOTE: Run this command inside the ownCloud Docker container. - or [source,bash,subs="attributes+"] @@ -333,8 +319,6 @@ or --config domain='somedomain.local' ---- -NOTE: Run this command inside the ownCloud Docker container. - === occ files_external:import You can create general and personal shares passing the configuration details via JSON files, using the `occ files_external:import` command. @@ -347,8 +331,6 @@ You can create general and personal shares passing the configuration details via /import.json ---- -NOTE: Run this command inside the ownCloud Docker container. - ==== Personal Share [source,bash,subs="attributes+"] @@ -357,8 +339,6 @@ NOTE: Run this command inside the ownCloud Docker container. /import.json --user someuser ---- -NOTE: Run this command inside the ownCloud Docker container. - In the two examples above, here is a sample JSON file, showing all of the available configuration options that the command supports. [source,json] diff --git a/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc b/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc index 7b079e0d5..d4117803b 100644 --- a/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc +++ b/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc @@ -53,8 +53,6 @@ Using the occ command:: {occ-command-example-prefix-docker} config:app:set files enable_lock_file_action --value yes ---- -NOTE: Run this command inside the ownCloud Docker container. - == Configuration To prevent files being locked infinitely, there is a mechanism that automatically expires locks after a certain time. The expiration time of locks can either be configured via the web interface or using occ commands. In addition, administrators can define groups whose members can break locks. @@ -79,25 +77,21 @@ Using the occ command:: ---- {occ-command-example-prefix-docker} config:app:set files lock_timeout_default --value 1800 ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ + * Maximum locks timeout + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set files lock_timeout_max --value 86400 ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ + * Define lock breaker groups + +-- The example below defines two lock breaker groups named `unlockers` and `admin`. -+ + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set core lock-breaker-groups --value '["unlockers","admin"]' ---- - -NOTE: Run this command inside the ownCloud Docker container. +-- diff --git a/modules/admin_manual/pages/configuration/files/mimetypes.adoc b/modules/admin_manual/pages/configuration/files/mimetypes.adoc index e08710170..fb26b5d3c 100644 --- a/modules/admin_manual/pages/configuration/files/mimetypes.adoc +++ b/modules/admin_manual/pages/configuration/files/mimetypes.adoc @@ -112,36 +112,36 @@ use the xref:configuration/server/occ_command.adoc[occ command] to propagate the {occ-command-example-prefix-docker} maintenance:mimetype:update-js ---- -NOTE: Run this command inside the ownCloud Docker container. - === Example - Changing the JSON File Icon image:configuration/mimetypes/json-alias-before.png[The default icon for JSON files] Let’s go through an example of to change the icon that ownCloud uses to represent JSON files, which you can see above. -1. From the root directory of your ownCloud installation, copy +. From the root directory of your ownCloud installation, copy + +-- [source,plaintext] ---- resources/config/mimetypealiases.dist.json ---- -+ + to -+ + [source,plaintext] ---- config/mimetypealiases.json ---- +-- -2. Update the alias for `application/json`, which you should find on line 8, to match the following, and save the file: +. Update the alias for `application/json`, which you should find on line 8, to match the following, and save the file: + [source,plaintext] ---- "application/json": "text/json", ---- -3. Copy a new SVG icon to represent JSON files to `core/img/filetypes`, calling it `text-json.svg`. +. Copy a new SVG icon to represent JSON files to `core/img/filetypes`, calling it `text-json.svg`. + [NOTE] ==== @@ -152,16 +152,16 @@ The name and location of the file are important. // to be tested if we need to add a config setting to exclude those files from integrity checks ==== -4. Run the following command to update the mimetype alias database. +. Run the following command to update the mimetype alias database. + +-- [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} maintenance:mimetype:update-js ---- -+ -NOTE: Run this command inside the ownCloud Docker container. After doing so, whenever you view a folder that contains JSON files or upload one, your new icon file will be used to represent the file, as in the image below. +-- image:configuration/mimetypes/json-alias-after.png[A replaced icon for JSON files] @@ -210,6 +210,7 @@ If you want to update or extend the existing mapping, as with updating the mimet ---- resources/config/mimetypemapping.dist.json ---- + and save it as [source,plaintext] diff --git a/modules/admin_manual/pages/configuration/files/trashbin_options.adoc b/modules/admin_manual/pages/configuration/files/trashbin_options.adoc index d465545f3..2b4569dbe 100644 --- a/modules/admin_manual/pages/configuration/files/trashbin_options.adoc +++ b/modules/admin_manual/pages/configuration/files/trashbin_options.adoc @@ -34,8 +34,6 @@ Remove deleted files for users on backend Database user4 ---- -NOTE: Run this command inside the ownCloud Docker container. - This example removes the deleted files of user2 and user4: [source,bash,subs="attributes+"] @@ -45,8 +43,6 @@ This example removes the deleted files of user2 and user4: Remove deleted files of user4 ---- -NOTE: Run this command inside the ownCloud Docker container. - `trashbin:expire` deletes only expired files according to the `trashbin_retention_obligation` setting in `config.php`. The default setting is `auto`, which keeps files in the Trashbin for 30 days, then @@ -63,6 +59,4 @@ users in a space-delimited list: Remove deleted files of user2 ---- -NOTE: Run this command inside the ownCloud Docker container. - See the *Deleted Files* section in xref:configuration/server/config_sample_php_parameters.adoc[Sample PHP Configuration Parameters], and xref:configuration/server/occ_command.adoc[the Trash Bin section] of the occ commands. diff --git a/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc b/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc index 7f25e5d9b..894b2a8a4 100644 --- a/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc +++ b/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc @@ -216,8 +216,6 @@ a command to manually scan all apps: {occ-command-example-prefix-docker} integrity:check-app ---- -NOTE: Run this command inside the ownCloud Docker container. - TIP: See xref:configuration/server/occ_command.adoc[the occ command] to learn more about using `occ`. == Errors diff --git a/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc b/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc index 32729e988..0fcdd29af 100644 --- a/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc +++ b/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc @@ -54,8 +54,6 @@ image::apps/impersonate/impersonate_enable.png[Define who can use Impersonate,wi {occ-command-example-prefix-docker} config:app:set \ impersonate enabled --value 'yes' ---- -+ -NOTE: Run this command inside the ownCloud Docker container. ** You can also use an occ command to define groups whose members are granted the right to _use_ impersonation: + @@ -64,8 +62,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} config:app:set \ impersonate enabled --value '["admin","einstein-g"]' ---- -+ -NOTE: Run this command inside the ownCloud Docker container. == Define Who is Allowed to Impersonate @@ -90,25 +86,19 @@ image::apps/impersonate/impersonate_oc_admins_only.png[Impersonate for ownCloud {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_all_groupadmins --value false ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ +++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups --value false ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ +++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups_list --value '[]' ---- + -NOTE: Run this command inside the ownCloud Docker container. - * If you want to allow all group admins to impersonate users within groups which they administer: + image::apps/impersonate/impersonate_group_admins_only.png[Impersonate for all group admins,width=500] @@ -120,25 +110,19 @@ image::apps/impersonate/impersonate_group_admins_only.png[Impersonate for all gr {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_all_groupadmins --value true ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ +++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups --value false ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ +++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups_list --value '[]' ---- + -NOTE: Run this command inside the ownCloud Docker container. - * If you want to limit impersonation to admins of specific groups, first click btn:[Allow group admins of specific groups...]. With the option checked, click into the textbox underneath it. You will see a list of all groups on your ownCloud installation, which will change, based on what you type in the textbox to search for specific groups. Choose one or more groups from the list, and they will be added to the textbox, restricting this functionality to admins of those groups only. + image::apps/impersonate/impersonate_groups_only.png[Impersonate for specific group admins,width=500] @@ -150,21 +134,16 @@ image::apps/impersonate/impersonate_groups_only.png[Impersonate for specific gro {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_all_groupadmins --value false ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ +++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups --value true ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ +++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups_list --value '["group1", "group2"]' ---- -+ -NOTE: Run this command inside the ownCloud Docker container. ++ \ No newline at end of file diff --git a/modules/admin_manual/pages/configuration/general_topics/search.adoc b/modules/admin_manual/pages/configuration/general_topics/search.adoc index e833ed219..bcb8f747d 100644 --- a/modules/admin_manual/pages/configuration/general_topics/search.adoc +++ b/modules/admin_manual/pages/configuration/general_topics/search.adoc @@ -53,8 +53,6 @@ To install the app, use the Marketplace app on your ownCloud server or proceed m {occ-command-example-prefix-docker} app:enable search_elastic ---- -NOTE: Run this command inside the ownCloud Docker container. - or enable it via the GUI menu:Settings[Admin > Apps > Full Text Search > Enable]. == Configuration @@ -185,8 +183,6 @@ You can at any time reset the index if required by clicking on btn:[Reset index] {occ-command-example-prefix-docker} search:index:reset ---- -NOTE: Run this command inside the ownCloud Docker container. - == Using occ Commands You can use the: @@ -198,19 +194,18 @@ You can use the: {occ-command-example-prefix-docker} search:index:reset ---- -NOTE: Run this command inside the ownCloud Docker container. - * xref:configuration/server/occ_command.adoc#config-commands[occ Config Commands command set] to configure the app. + +-- Examples: -+ + List app settings:: -+ + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:list search_elastic ---- -+ + [source,plaintext] ---- { @@ -227,26 +222,25 @@ List app settings:: } } ---- +-- Set app options:: + +-- [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ search_elastic scanExternalStorages --value 0 ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ + or -+ + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ search_elastic scanExternalStorages --value 1 ---- - -NOTE: Run this command inside the ownCloud Docker container. +-- == App Modes @@ -279,8 +273,6 @@ To do an initial full indexing without the app interfering, it can be put in _pa search_elastic mode --value passive ---- -NOTE: Run this command inside the ownCloud Docker container. - or [source,bash,subs="attributes+"] @@ -289,8 +281,6 @@ or search_elastic mode --value active ---- -NOTE: Run this command inside the ownCloud Docker container. - == Restrict Search Results === Index Metadata Only @@ -303,8 +293,6 @@ If you only want to use the Full Text Search app as a more scalable search on fi search_elastic nocontent --value true ---- -NOTE: Run this command inside the ownCloud Docker container. - [NOTE] ==== * You have to reindex all files if you change this back to `false`. Setting it to `true` does not require reindexing. @@ -322,8 +310,6 @@ If you only want to use search for shared filenames, you can disable full text s --value nofulltext ---- -NOTE: Run this command inside the ownCloud Docker container. - You can also configure multiple groups by separating them with comma: [source,bash,subs="attributes+"] @@ -333,8 +319,6 @@ You can also configure multiple groups by separating them with comma: --value nofulltext,anothergroup,"group with blanks" ---- -NOTE: Run this command inside the ownCloud Docker container. - This allows a scalable search in shared files without clouding the results with content based hits. == Create the Index @@ -349,8 +333,6 @@ When everything has been set up and configured, you can initiate creating the in {occ-command-example-prefix-docker} search:index:create ---- -NOTE: Run this command inside the ownCloud Docker container. - == Issues When the Elasticsearch server is down or the index has not been set up, you may get the following message. Check if the ES server is reachable or if the index was set up properly as one solution to fix the issue. diff --git a/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc b/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc index 50e5d237b..9ca09186c 100644 --- a/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc @@ -21,8 +21,6 @@ As an example: {occ-command-example-prefix-docker} background:cron ---- -NOTE: Run this command inside the ownCloud Docker container. - Is the same as using the *Cron* section on your ownCloud Admin page. === Docker Note @@ -96,8 +94,6 @@ There is no way to do so via the ownCloud UI. But, the most direct way to do so, {occ-command-example-prefix-docker} system:cron ---- -NOTE: Run this command inside the ownCloud Docker container. - Each of these processes would acquire their own list of jobs to process without overlapping any other. === Available Background Jobs @@ -133,8 +129,6 @@ The ExpireTrash job, contained in `OCA\Files_Trashbin\BackgroundJob\ExpireTrash` {occ-command-example-prefix-docker} trashbin:expire ---- -NOTE: Run this command inside the ownCloud Docker container. - ==== ExpireVersions The ExpireVersions job, contained in `OCA\Files_Versions\BackgroundJob\ExpireVersions`, will expire versions of files which are older than the specified maximum version retention time. It can be run, as follows, using the xref:configuration/server/occ_command.adoc#versions[OCC versions] command: @@ -144,8 +138,6 @@ The ExpireVersions job, contained in `OCA\Files_Versions\BackgroundJob\ExpireVer {occ-command-example-prefix-docker} versions:expire ---- -NOTE: Run this command inside the ownCloud Docker container. - CAUTION: Please take care when adding `ExpireTrash` and `ExpireVersions` as xref:cron[Cron] jobs. Make sure that they're not started in parallel on multiple machines. Running in parallel on a single machine is fine. But, currently, there isn't sufficient locking in place to prevent them from conflicting with each other if running in parallel across multiple machines. ==== SyncJob (CardDAV) @@ -157,8 +149,6 @@ The `CardDAV SyncJob`, contained in `OCA\DAV\CardDAV\SyncJob`, syncs the local s {occ-command-example-prefix-docker} dav:sync-system-addressbook ---- -NOTE: Run this command inside the ownCloud Docker container. - ==== SyncJob (Federation) OCAFederationSyncJob @@ -171,8 +161,6 @@ xref:configuration/server/occ_command.adoc#federation-sync[OCC federation sync] {occ-command-example-prefix-docker} federation:sync-addressbooks ---- -NOTE: Run this command inside the ownCloud Docker container. - == Troubleshooting === Remove Non-Existent Background Jobs diff --git a/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc b/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc index 06a360279..cf0b6143c 100644 --- a/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc @@ -51,8 +51,6 @@ Get the current values, if any, for the Imprint and Privacy Policy URLs: {occ-command-example-prefix-docker} config:app:get core legal.privacy_policy_url ---- -NOTE: Run this command inside the ownCloud Docker container. - Set the Imprint and Privacy Policy URLs: [source,bash,subs="attributes+"] ---- @@ -60,8 +58,6 @@ Set the Imprint and Privacy Policy URLs: {occ-command-example-prefix-docker} config:app:set core legal.privacy_policy_url --value=new_value ---- -NOTE: Run this command inside the ownCloud Docker container. - For more information about these commands, refer to xref:configuration/server/occ_command.adoc#config-commands[the config command reference in the occ commands documentation]. == Viewing the URLs diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_2fa_app_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_2fa_app_commands.adoc index 5e8cfe5eb..2af37cfb4 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_2fa_app_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_2fa_app_commands.adoc @@ -22,8 +22,6 @@ Delete the redundant secrets of non-existing users: {occ-command-example-prefix-docker} twofactor_totp:delete-redundant-secret ---- -NOTE: Run this command inside the ownCloud Docker container. - == Set Secret Verification Status Set secret verification status of specified users or all users: @@ -33,8 +31,6 @@ Set secret verification status of specified users or all users: {occ-command-example-prefix-docker} twofactor_totp:set-secret-verification-status [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_activity_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_activity_commands.adoc index c262c5754..b788303ea 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_activity_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_activity_commands.adoc @@ -17,8 +17,6 @@ The `activity:send-emails` command sends all pending activity emails immediately {occ-command-example-prefix-docker} activity:send-emails ---- -NOTE: Run this command inside the ownCloud Docker container. - == Manage Rename and Move Action Notifications Starting with Activity app version 2.7.0, rename and move action notifications can be sent. This feature is disabled by default and must be enabled manually. @@ -30,8 +28,6 @@ Starting with Activity app version 2.7.0, rename and move action notifications c {occ-command-example-prefix-docker} config:app:set activity enable_move_and_rename_activities --value "yes" ---- -NOTE: Run this command inside the ownCloud Docker container. - === Disable Rename and Move Action Notifications [source,docker,subs="attributes+"] @@ -39,13 +35,9 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} config:app:set activity enable_move_and_rename_activities --value "no" ---- -NOTE: Run this command inside the ownCloud Docker container. - or [source,docker,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:delete activity enable_move_and_rename_activities ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_admin_audit_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_admin_audit_commands.adoc index 9179ec3c4..11019c927 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_admin_audit_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_admin_audit_commands.adoc @@ -18,8 +18,6 @@ To ignore all CLI triggered events, you can set the following option, defaults t --value "yes" ---- -NOTE: Run this command inside the ownCloud Docker container. - == Get Value of Ignore CLI Events This command reads the value of `admin_audit ignore_cli_events`: @@ -29,8 +27,6 @@ This command reads the value of `admin_audit ignore_cli_events`: {occ-command-example-prefix-docker} config:app:get "admin_audit ignore_cli_events" ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,plaintext] ---- yes @@ -44,5 +40,3 @@ This command completely removes the key and the value: ---- {occ-command-example-prefix-docker} config:app:delete "admin_audit ignore_cli_events" ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_antivirus_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_antivirus_commands.adoc index 1393ff299..5d83f954d 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_antivirus_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_antivirus_commands.adoc @@ -12,8 +12,6 @@ Parametrisation must be done with the `occ config` command set. {occ-command-example-prefix-docker} config:list files_antivirus ---- -NOTE: Run this command inside the ownCloud Docker container. - == Set the Setting To set a new value, use the command below and replace `` and value `` accordingly. @@ -23,8 +21,6 @@ To set a new value, use the command below and replace `` and value ` {occ-command-example-prefix-docker} config:app:set files_antivirus --value= --update-only ---- -NOTE: Run this command inside the ownCloud Docker container. - === Antivirus Mode [string] Antivirus Configuration. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_brute_force_protection_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_brute_force_protection_commands.adoc index 26cfd12a5..ee6d9f7b9 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_brute_force_protection_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_brute_force_protection_commands.adoc @@ -13,8 +13,6 @@ The combination of `uid` and `IP address` is used to trigger the ban. {occ-command-example-prefix-docker} config:list brute_force_protection ---- -NOTE: Run this command inside the ownCloud Docker container. - == Set the Setting To set a new value, use the command below and replace `` and value `` accordingly. @@ -24,8 +22,6 @@ To set a new value, use the command below and replace `` and value ` {occ-command-example-prefix-docker} config:app:set brute_force_protection --value= --update-only ---- -NOTE: Run this command inside the ownCloud Docker container. - === Fail Tolerance [attempts] Number of wrong attempts to trigger the ban. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_custom_groups.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_custom_groups.adoc index 344a72a04..3c0b06fa6 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_custom_groups.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_custom_groups.adoc @@ -23,8 +23,6 @@ By default, administrators can administrate custom groups of an instance. When c --type boolean --value true ---- -NOTE: Run this command inside the ownCloud Docker container. - This occ command will create a key-value pair in your config.php which must be writable for the webserver user. You can also do this manually by adding the following key in config.php: [source.plaintext] @@ -44,8 +42,6 @@ You can hide custom groups from a user's personal settings page based on a user' --value '["no_guest_app_users", "project5"]' ---- -NOTE: Run this command inside the ownCloud Docker container. - This occ command will create a key-value pair in your config.php which must be writable for the webserver user to be set. You can also set this manually by adding the following key in config.php: [source.plaintext] @@ -69,8 +65,6 @@ This setting defines if ordinary users are allowed to create custom groups. By d --value 'true' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Restrict Add or Remove Group Members This setting defines if an existing ordinary group member is allowed to add other users to the target group or remove them. By default, all users can add members to groups, but this can be restricted to admins (if allowed as above) and group-admins. Values to be set can be 'yes' and 'no', defaults to 'no'. @@ -83,8 +77,6 @@ This setting defines if an existing ordinary group member is allowed to add othe --value 'yes' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Allow Duplicate Group Display Names This setting allows the creation of multiple groups with the same display name. By default, group display names must be unique, but it can be be allowed to have multiple identical group display names. Values to be set can be 'true' and 'false', defaults to 'false'. @@ -96,5 +88,3 @@ This setting allows the creation of multiple groups with the same display name. allow_duplicate_names \ --value 'false' ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_data_exporter_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_data_exporter_commands.adoc index 75da0998e..be601a494 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_data_exporter_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_data_exporter_commands.adoc @@ -24,8 +24,6 @@ The following commands are available for the Data Exporter app: {occ-command-example-prefix-docker} instance:export:user ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="80%",cols="30%,70%",] @@ -41,8 +39,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} instance:import:user [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="80%",cols="30%,70%",] @@ -66,8 +62,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} instance:export:migrate:share ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="80%",cols="30%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_files_lifecycle.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_files_lifecycle.adoc index 9c6d29148..be45696d7 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_files_lifecycle.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_files_lifecycle.adoc @@ -46,8 +46,6 @@ Archive files which have reached a certain age. {occ-command-example-prefix-docker} lifecycle:archive [options] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Options [width="90%",cols="40%,80%",] @@ -66,8 +64,6 @@ Expire files from archive which have reached a certain age. {occ-command-example-prefix-docker} lifecycle:expire [options] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Options [width="90%",cols="40%,80%",] @@ -86,8 +82,6 @@ Restore files from archive to the original location. Note that the location for {occ-command-example-prefix-docker} lifecycle:restore ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="90%",cols="40%,80%",] @@ -105,8 +99,6 @@ Restore all files in folder `project1` for user alice with path `/work/projects/ {occ-command-example-prefix-docker} lifecycle:restore /alice/archive/files/work/projects/project1 ---- -NOTE: Run this command inside the ownCloud Docker container. - == Restore All Files From Archive Restore all archived files for all users in the system back to their original locations. This command has no additional arguments or options. @@ -116,8 +108,6 @@ Restore all archived files for all users in the system back to their original lo {occ-command-example-prefix-docker} lifecycle:restore-all ---- -NOTE: Run this command inside the ownCloud Docker container. - == Set Default Upload Time Set upload time for files which do not have one. @@ -130,8 +120,6 @@ This can happen with files that were uploaded before the files_lifecycle app was {occ-command-example-prefix-docker} lifecycle:set-upload-time [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="90%",cols="40%,80%",] @@ -164,8 +152,6 @@ The following example command sets the time passed since upload (or restore) for {occ-command-example-prefix-docker} config:app:set files_lifecycle archive_period --value='90' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Set the Expire Period The number of days since archiving after which files will be permanently deleted. @@ -177,8 +163,6 @@ The following example command sets the time passed to delete files to 180 days. {occ-command-example-prefix-docker} config:app:set files_lifecycle expire_period --value='180' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Set Groups to be Excluded Define groups of users that are exempt from the lifecycle policies (comma-separated group ids). @@ -190,8 +174,6 @@ The following example command specifies groups whose members will not be part of {occ-command-example-prefix-docker} config:app:set files_lifecycle excluded_groups --value='group1,group2' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Restoration Policy for Users Set a policy who can restore files. Use the value `soft` for self-service and `hard` for admin/groupadmin-service. @@ -203,8 +185,6 @@ The following example command sets the restoration policy for users to `soft` (d {occ-command-example-prefix-docker} config:app:set files_lifecycle policy --value='soft' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Disable User Interface Disable the whole user interface for the File Lifecycle Management app. @@ -216,13 +196,9 @@ The following example command disables the user interface for the File Lifecycle {occ-command-example-prefix-docker} config:app:set files_lifecycle disable_ui --value='yes' ---- -NOTE: Run this command inside the ownCloud Docker container. - You can reenable it by deleting the key: [source,docker,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:delete files_lifecycle disable_ui ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_full_text_search_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_full_text_search_commands.adoc index 5c86cf11a..b660b1a45 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_full_text_search_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_full_text_search_commands.adoc @@ -29,8 +29,6 @@ The command `search:index:create` creates the initial full text search index for {occ-command-example-prefix-docker} search:index:create ()... ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,100%"] @@ -59,8 +57,6 @@ This example creates a full text search index for the user with user id `testuse Indexing user testuser ---- -NOTE: Run this command inside the ownCloud Docker container. - === Example 2 This example creates a full text search index for the users with user ids `admin` and `testuser`. @@ -73,8 +69,6 @@ Indexing user admin Indexing user testuser ---- -NOTE: Run this command inside the ownCloud Docker container. - == Fill a Secondary Index Fill a secondary index based on the indexed data we have. Files not matching the "indexed" status will be ignored. This is intended to be used in index data migrations, so the connector for this secondary index should have been configured as "write connector". See the xref:configuration/general_topics/search.adoc[Full Text Search] documentation for more details. Note that the values of the `connector_name` are hardcoded and have to be written as described. @@ -84,8 +78,6 @@ Fill a secondary index based on the indexed data we have. Files not matching the {occ-command-example-prefix-docker} search:index:fillSecondary [options] [--] ... ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,100%"] @@ -125,8 +117,6 @@ If you want to rebuild the whole index, run `search:index:reset` and then `searc {occ-command-example-prefix-docker} search:index:rebuild ()... ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,100%"] @@ -163,8 +153,6 @@ This will delete all full text search index data for testuser! Do you want to pr Rebuilding full text search Index for testuser ---- -NOTE: Run this command inside the ownCloud Docker container. - === Example 2 This example rebuilds the full text search index for the users with user IDs `admin` and `testuser`. @@ -182,8 +170,6 @@ Rebuilding Search Index for admin Rebuilding Search Index for testuser ---- -NOTE: Run this command inside the ownCloud Docker container. - === Rebuild the Entire Index The entire index can be rebuilt by running the following two commands: @@ -203,8 +189,6 @@ Reset all the configured indexes. Changes in the configuration of the indexes as {occ-command-example-prefix-docker} search:index:reset ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,100%"] @@ -225,8 +209,6 @@ This will delete the whole search index! Do you want to proceed? Search index has been reset. ---- -NOTE: Run this command inside the ownCloud Docker container. - == Update the Full Text Search Index Updates to the search index due to changed content or changed metadata are happening via background jobs that are added to a queue. These background jobs are normally run by the ownCloud cronjob. The command `search:index:update` updates the full text search index by running all pending background jobs. @@ -236,8 +218,6 @@ Updates to the search index due to changed content or changed metadata are happe {occ-command-example-prefix-docker} search:index:update ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,100%"] @@ -257,8 +237,6 @@ Start Updating the Elastic search index: No pending jobs found. ---- -NOTE: Run this command inside the ownCloud Docker container. - == Set App Modes To do an initial full indexing without the Full Text Search app interfering, it can be put in passive mode. See the xref:configuration/general_topics/search.adoc#app-modes[App Modes] section in the Full Text Search description for details. @@ -269,8 +247,6 @@ To do an initial full indexing without the Full Text Search app interfering, it search_elastic mode --value passive ---- -NOTE: Run this command inside the ownCloud Docker container. - Switching back to active mode can be done by running the following command: [source,docker,subs="attributes+"] @@ -279,8 +255,6 @@ Switching back to active mode can be done by running the following command: search_elastic mode --value active ---- -NOTE: Run this command inside the ownCloud Docker container. - == Restrict Search Results Search results can be restricted in different ways, see the xref:configuration/general_topics/search.adoc#restrict-search-results[Restrict Search Results] section in the Full Text Search description for details. @@ -293,8 +267,6 @@ Search results can be restricted in different ways, see the xref:configuration/g search_elastic nocontent --value true ---- -NOTE: Run this command inside the ownCloud Docker container. - Switching back to provide all content search results can be done by running the following command: [source,docker,subs="attributes+"] @@ -303,8 +275,6 @@ Switching back to provide all content search results can be done by running the search_elastic nocontent --value false ---- -NOTE: Run this command inside the ownCloud Docker container. - === Limit Metadata Search for Groups [source,docker,subs="attributes+"] @@ -313,5 +283,3 @@ NOTE: Run this command inside the ownCloud Docker container. search_elastic group.nocontent \ --value group1,group2,"group with blank" ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ldap_integration_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ldap_integration_commands.adoc index 1f3d9e135..868e1383e 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ldap_integration_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ldap_integration_commands.adoc @@ -24,8 +24,6 @@ Search for an LDAP user, using this syntax: {occ-command-example-prefix-docker} ldap:search [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -119,8 +117,6 @@ Searches match at the beginning of the attribute value only. This example search {occ-command-example-prefix-docker} ldap:search "rob" ---- -NOTE: Run this command inside the ownCloud Docker container. - This will find "robbie", "roberta", and "robin". Broaden the search to find, for example, `jeroboam` with the asterisk wildcard: @@ -129,8 +125,6 @@ Broaden the search to find, for example, `jeroboam` with the asterisk wildcard: {occ-command-example-prefix-docker} ldap:search "*rob" ---- -NOTE: Run this command inside the ownCloud Docker container. - The following examples use `offset` and `limit` options: [source,docker,subs="attributes+"] @@ -143,8 +137,6 @@ Rekha Cox (Rekha.Cox) Rekha Craft (Rekha.Craft) ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,docker,subs="attributes+"] ---- {occ-command-example-prefix-docker} ldap:search "re" --offset 0 --limit 3 @@ -153,8 +145,6 @@ Rebecca Vintin (Rebecca.Vintin) Rebekka Da-Cahuna (Rebekka.Da-Cahuna) ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,docker,subs="attributes+"] ---- {occ-command-example-prefix-docker} ldap:search "re" --offset 3 --limit 3 @@ -162,8 +152,6 @@ Rekha Cox (Rekha.Cox) Rekha Craft (Rekha.Craft) ---- -NOTE: Run this command inside the ownCloud Docker container. - == Check if an LDAP User Exists This only works if the ownCloud server is connected to an LDAP server. @@ -196,8 +184,6 @@ Example: {occ-command-example-prefix-docker} ldap:check-user robert ---- -NOTE: Run this command inside the ownCloud Docker container. - `ldap:check-user` will not run a check when it finds a disabled LDAP connection. This prevents users that exist on disabled LDAP connections from being marked as deleted. If you know for sure that the user you are searching for is not in one of the disabled connections and exists on an active connection, use the `--force` option to force a check of all active LDAP connections. [source,docker,subs="attributes+"] @@ -205,8 +191,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} ldap:check-user --force robert ---- -NOTE: Run this command inside the ownCloud Docker container. - == Create an Empty LDAP Configuration Create an empty LDAP configuration. @@ -232,8 +216,6 @@ Configurations that you create without assigning a are automatically Created new configuration with configID 's01' ---- -NOTE: Run this command inside the ownCloud Docker container. - == List and View Your Configurations You can list and view your configurations: @@ -243,8 +225,6 @@ You can list and view your configurations: {occ-command-example-prefix-docker} ldap:show-config [options] [--] [] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -273,8 +253,6 @@ If you omit the `configID`, all configuration ID's with their settings are liste {occ-command-example-prefix-docker} ldap:show-config ---- -NOTE: Run this command inside the ownCloud Docker container. - View the configuration for a single `configID`: [source,docker,subs="attributes+"] @@ -282,8 +260,6 @@ View the configuration for a single `configID`: {occ-command-example-prefix-docker} ldap:show-config s01 ---- -NOTE: Run this command inside the ownCloud Docker container. - == Delete an Existing LDAP Configuration Deletes an existing LDAP configuration. @@ -307,8 +283,6 @@ Deletes an existing LDAP configuration. Deleted configuration with configID 's01' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Invalidate LDAP Cache This command invalidates the LDAP cache for all users: @@ -318,8 +292,6 @@ This command invalidates the LDAP cache for all users: {occ-command-example-prefix-docker} ldap:invalidate-cache ---- -NOTE: Run this command inside the ownCloud Docker container. - == Manipulate LDAP Configurations This command manipulates LDAP configurations. @@ -329,8 +301,6 @@ This command manipulates LDAP configurations. {occ-command-example-prefix-docker} ldap:set-config ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -354,8 +324,6 @@ This example sets search attributes: {occ-command-example-prefix-docker} ldap:set-config s01 ldapAttributesForUserSearch "cn;givenname;sn;displayname;mail" ---- -NOTE: Run this command inside the ownCloud Docker container. - Available keys, along with default values for configValue, are listed in the table below. [width="70%",cols=",",options="header",] @@ -423,8 +391,6 @@ Tests whether your configuration is correct and can bind to the server. {occ-command-example-prefix-docker} ldap:test-config ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -441,8 +407,6 @@ Example: The configuration is valid and the connection could be established! ---- -NOTE: Run this command inside the ownCloud Docker container. - == Set and Unset LDAP App Configurations [source,docker,subs="attributes+"] @@ -450,8 +414,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} config:app:set user_ldap updateAttributesInterval --value=7200 ---- -NOTE: Run this command inside the ownCloud Docker container. - In the example above, the interval is being set to 7200 seconds. Assuming the above example was used, the command would output the following: @@ -467,8 +429,6 @@ If you want to reset (or unset) the setting, then you can use the following comm {occ-command-example-prefix-docker} config:app:delete user_ldap updateAttributesInterval ---- -NOTE: Run this command inside the ownCloud Docker container. - *Reuse Existing LDAP Accounts if Available* If you want to allow new LDAP logins to attempt to reuse existing `oc_accounts` entries that match the resolved username attribute, and have backend set to `User_Proxy`, then set the `reuse_accounts` config setting to `yes`. @@ -480,8 +440,6 @@ Below is an example of how to do so. {occ-command-example-prefix-docker} config:app:set user_ldap reuse_accounts --value="yes" ---- -NOTE: Run this command inside the ownCloud Docker container. - This functionality is valuable for several reasons; these are: * It handles the situation of when admins mistakenly delete one or more user mappings, and subsequent logins then create new accounts. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_market_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_market_commands.adoc index 93fb3a0e1..657cde362 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_market_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_market_commands.adoc @@ -36,8 +36,6 @@ So its app id is `twofactor_backup_codes`. {occ-command-example-prefix-docker} market:install [option] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="80%",cols="30%,70%",] @@ -68,8 +66,6 @@ Only `zip`, `gzip`, and `bzip2` archives are supported. {occ-command-example-prefix-docker} market:install -l /mnt/data/richdocuments-2.0.0.tar.gz ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: The target directory has to be *accessible to the webserver user* and you have to *enable* the app afterwards with the `occ app:enable` command. == Uninstall an Application @@ -81,8 +77,6 @@ To uninstall an application use the following commands: {occ-command-example-prefix-docker} market:uninstall ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="80%",cols="30%,70%",] @@ -100,8 +94,6 @@ It returns the ids of the apps. {occ-command-example-prefix-docker} market:list ---- -NOTE: Run this command inside the ownCloud Docker container. - == Upgrade an Application Install new app versions if available on the marketplace by using following commands: @@ -111,8 +103,6 @@ Install new app versions if available on the marketplace by using following comm {occ-command-example-prefix-docker} market:upgrade [options] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="80%",cols="30%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_metrics_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_metrics_commands.adoc index 47acee509..b2853a46b 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_metrics_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_metrics_commands.adoc @@ -28,8 +28,6 @@ Note: You can also set the config key/value manually into your config.php file. --value "your-metrics-secret" ---- -NOTE: Run this command inside the ownCloud Docker container. - The above command adds the following at the end of `config.php`: [source,php] @@ -46,8 +44,6 @@ This command reads the value of the `metrics_shared_secret` key from config.php: {occ-command-example-prefix-docker} config:system:get "metrics_shared_secret" ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,plaintext] ---- your-metrics-secret @@ -61,6 +57,3 @@ This command completely removes the key and the value from config.php: ---- {occ-command-example-prefix-docker} config:system:delete "metrics_shared_secret" ---- - -NOTE: Run this command inside the ownCloud Docker container. - diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_kitworks_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_kitworks_commands.adoc index 1cc54ac55..b1b703948 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_kitworks_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_migrate_to_kitworks_commands.adoc @@ -28,8 +28,6 @@ To start the migration, it must be initialized first: {occ-command-example-prefix-docker} migrate:to-kiteworks:init KW_HOST KW_APPLICATION_ID "KW_SECRET" ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -61,8 +59,6 @@ After initialisation, the migration must be verified to be ready: {occ-command-example-prefix-docker} migrate:to-kiteworks:verify $KW_ADMIN_USER ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -88,8 +84,6 @@ After verification, migrating users can be started: {occ-command-example-prefix-docker} migrate:to-kiteworks:users $KW_ADMIN_USER $KW_PROFILE_GUEST ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -118,8 +112,6 @@ After migrating users, migrating files can be started: {occ-command-example-prefix-docker} migrate:to-kiteworks:files $KW_ADMIN_USER ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -145,8 +137,6 @@ After migrating files, shares can be migrated. Note that when initiating this st {occ-command-example-prefix-docker} migrate:to-kiteworks:shares $KW_ADMIN_USER ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -172,8 +162,6 @@ After migrating shares, the final step can be processed. This is to disable migr {occ-command-example-prefix-docker} migrate:to-kiteworks:disable-users $KW_ADMIN_USER ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_password_policy_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_password_policy_commands.adoc index 1995e27e8..3539da785 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_password_policy_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_password_policy_commands.adoc @@ -11,8 +11,6 @@ Command to expire a user or group of users’ passwords. {occ-command-example-prefix-docker} user:expire-password [] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,82%",] @@ -71,8 +69,6 @@ The password for frank is set to expire on 2018-07-12 13:15:28 UTC. {occ-command-example-prefix-docker} user:expire-password --uid frank '15-Aug-05 15:52:01 UTC' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Caveats Please be aware of the following implications of enabling or changing the password policy's "*days until user password expires*" option. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ransomware_protection_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ransomware_protection_commands.adoc index d0002b5cb..9a3ee3796 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ransomware_protection_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_ransomware_protection_commands.adoc @@ -31,8 +31,6 @@ Scan the ownCloud database for changes in order to discover anomalies in a user {occ-command-example-prefix-docker} ransomguard:scan ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -51,8 +49,6 @@ Revert all operations in a user account after a given point in time. Note that ` {occ-command-example-prefix-docker} ransomguard:restore ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -71,8 +67,6 @@ When necessary, set a user account as `read-only` for ownCloud and other WebDAV {occ-command-example-prefix-docker} ransomguard:lock ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -90,8 +84,6 @@ When ransomware issues have been resolved, the user account can be unlocked. {occ-command-example-prefix-docker} ransomguard:unlock ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -113,8 +105,6 @@ This command will set the location of the blacklist file the app will use. The l {occ-command-example-prefix-docker} ransomguard:blacklist:set-file ---- -NOTE: Run this command inside the ownCloud Docker container. - ==== Arguments [width="100%",cols="20%,70%",] @@ -132,8 +122,6 @@ This command will update the contents of the blacklist file using another file a {occ-command-example-prefix-docker} ransomguard:blacklist:update:from-file ---- -NOTE: Run this command inside the ownCloud Docker container. - ==== Arguments [width="100%",cols="20%,70%",] @@ -151,8 +139,6 @@ This command will update the contents by getting the blacklist from a website. T {occ-command-example-prefix-docker} ransomguard:blacklist:update:from-site ---- -NOTE: Run this command inside the ownCloud Docker container. - ==== Arguments [width="100%",cols="20%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_richdocuments.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_richdocuments.adoc index 84b1f6dcc..17f3d05be 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_richdocuments.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_richdocuments.adoc @@ -40,8 +40,6 @@ Adding the port is only necessary when not using standard ports. {occ-command-example-prefix-docker} config:app:set richdocuments wopi_url --value='[IP/URL]:port' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Enable Secure View Enable Secure View (possible values: true/false, default: false). @@ -53,8 +51,6 @@ The following example command enables secure view globally on the system: {occ-command-example-prefix-docker} config:app:set richdocuments secure_view_option --value='true' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Define the Watermark Pattern Displayed A watermark pattern is displayed in the document when it is viewed. It can be an arbitrary string. The keyword \{viewer-email} will be replaced with the current user's email address in the document watermark. If an email address is not set, then the user's display name will be used. @@ -66,8 +62,6 @@ The following example command sets the watermark pattern displayed in the docume {occ-command-example-prefix-docker} config:app:set richdocuments watermark_text --value='Restricted to \{viewer-email}' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Open Documents in a New Tab By default, documents will open in a new tab if not otherwise defined. You can change this behaviour with a command (possible values: true/false, default: false). @@ -79,8 +73,6 @@ The following example command makes documents open in the same tab: {occ-command-example-prefix-docker} config:app:set richdocuments open_in_new_tab --value='false' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Define the Print and Exporting Option Enable documents in secure view mode to be printed and exported (possible values: true/false, default: false). @@ -92,8 +84,6 @@ The following example command enables the option to globally print and export do {occ-command-example-prefix-docker} config:app:set secure_view_can_print_default --value='true' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Enforce Displaying the Watermark Open documents in secure view with watermark by default (possible values: true/false, default: false). @@ -105,8 +95,6 @@ The following example command enables the option to globally enforce displaying {occ-command-example-prefix-docker} config:app:set richdocuments secure_view_open_action_default --value='true' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Delete a Key or Change a Key You can delete a key with the following example command: @@ -116,13 +104,9 @@ You can delete a key with the following example command: {occ-command-example-prefix-docker} config:app:delete richdocuments secure_view_open_action_default ---- -NOTE: Run this command inside the ownCloud Docker container. - You can change a key with the following example command: [source,docker,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set richdocuments secure_view_option --value='false' ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_s3objectstore_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_s3objectstore_commands.adoc index 7fda05f7b..8d7313167 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_s3objectstore_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_s3objectstore_commands.adoc @@ -11,8 +11,6 @@ Marketplace URL: {oc-marketplace-url}/apps/files_primary_s3[S3 Primary Object St {occ-command-example-prefix-docker} s3:list ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="80%",cols="30%,70%",] @@ -28,8 +26,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} s3:create-bucket ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="80%",cols="30%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_saml_sso_shibboleth_integration_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_saml_sso_shibboleth_integration_commands.adoc index 93fb03be6..956fd5607 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_saml_sso_shibboleth_integration_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_saml_sso_shibboleth_integration_commands.adoc @@ -8,5 +8,3 @@ Marketplace URL: {oc-marketplace-url}/apps/user_shibboleth[SAML/SSO Integration] ---- {occ-command-example-prefix-docker} shibboleth:mode [mode] ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_wnd_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_wnd_commands.adoc index d840da0af..28f5730f1 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_wnd_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/app_commands/_wnd_commands.adoc @@ -26,8 +26,6 @@ Listen to smb changes and store notifications for later processing in the databa {occ-command-example-prefix-docker} wnd:listen [options] [--] [] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="90%",cols="40%,80%",] @@ -84,8 +82,6 @@ Process the notifications stored by the `wnd:listen` command {occ-command-example-prefix-docker} wnd:process-queue [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="90%",cols="40%,80%",] @@ -115,8 +111,6 @@ Sets the service account for the target mount point. You'll be asked for the pas {occ-command-example-prefix-docker} wnd:set-service-account [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - Please see the occ documentation of xref:configuration/server/occ_command.adoc#files_externallist[files_external:list] to get the required mount-id. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_2fa_core_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_2fa_core_commands.adoc index f6f953051..5958f6784 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_2fa_core_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_2fa_core_commands.adoc @@ -22,8 +22,6 @@ Disable two-factor authentication for a user: {occ-command-example-prefix-docker} twofactorauth:disable [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -41,8 +39,6 @@ Enable two-factor authentication for a user: {occ-command-example-prefix-docker} twofactorauth:enable [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_app_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_app_commands.adoc index e8eefefd3..15fbd807e 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_app_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_app_commands.adoc @@ -22,8 +22,6 @@ The output shows whether they are enabled or disabled. {occ-command-example-prefix-docker} app:list [--] [] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -67,8 +65,6 @@ Enable an app, for example the Market app. market enabled ---- -NOTE: Run this command inside the ownCloud Docker container. - == Disable an App [source,docker,subs="attributes+"] @@ -77,8 +73,6 @@ NOTE: Run this command inside the ownCloud Docker container. market disabled ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: Be aware that the following apps cannot be disabled: _DAV_, _FederatedFileSharing_, _Files_ and _Files_External_. == Check App Code @@ -96,8 +90,6 @@ By default all checks are enabled. The Activity app is an example of a correctly App is compliant - awesome job! ---- -NOTE: Run this command inside the ownCloud Docker container. - If your app has issues, you'll see output like this. [source,docker,subs="attributes+"] @@ -111,8 +103,6 @@ Analysing /var/www/owncloud/apps/files/foo_app.php line 49: OC_Util - Static method of private class must not be called ---- -NOTE: Run this command inside the ownCloud Docker container. - == Get the App Installation Path You can get the full file path to an app. @@ -122,6 +112,3 @@ You can get the full file path to an app. {occ-command-example-prefix-docker} app:getpath notifications /var/www/owncloud/apps/notifications ---- - -NOTE: Run this command inside the ownCloud Docker container. - diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_background_jobs_selector.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_background_jobs_selector.adoc index 7ccb58def..ca541a8e4 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_background_jobs_selector.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_background_jobs_selector.adoc @@ -25,7 +25,4 @@ background {occ-command-example-prefix-docker} background:webcron ---- -NOTE: Run this command inside the ownCloud Docker container. - TIP: Check out the sections xref:configuration/server/occ_command.adoc#managing-background-jobs[Managing Background Jobs] and xref:configuration/server/background_jobs_configuration.adoc[Background Jobs configuration] to learn more. - diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_reports_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_reports_commands.adoc index ab76e9bdf..d55fed12f 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_reports_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_config_reports_commands.adoc @@ -9,8 +9,6 @@ From the command-line in the root directory of your ownCloud installation, run i {occ-command-example-prefix-docker} configreport:generate ---- -NOTE: Run this command inside the ownCloud Docker container. - This will generate the report and send it to `STDOUT`. You can optionally pipe the output to a file and then attach it to an email to ownCloud support, by running the following command: @@ -19,8 +17,6 @@ You can optionally pipe the output to a file and then attach it to an email to o {occ-command-example-prefix-docker} configreport:generate > generated-config-report.txt ---- -NOTE: Run this command inside the ownCloud Docker container. - Alternatively, you could generate the report and email it all in one command, by running: [source,docker,subs="attributes+"] @@ -31,6 +27,4 @@ Alternatively, you could generate the report and email it all in one command, by ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: These commands are not available in xref:maintenance-commands[single-user (maintenance) mode]. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc index 0d9399be7..cfab773a4 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_database_commands.adoc @@ -11,8 +11,6 @@ Convert charset of MySQL/MariaDB to use utf8mb4. If you are using an older ownCl {occ-command-example-prefix-docker} db:convert-mysql-charset ---- -NOTE: Run this command inside the ownCloud Docker container. - == Restore the Table Format This command sets the default row format of MySQL/MariaDB tables. This is only necessary once before you are going to e.g. install MariaDB 10.6 or higher because the COMPRESSED row format is now read-only by default. As a prerequisite, ownCloud 10.9 needs to be installed first. See the xref:maintenance/upgrading/database_upgrade.adoc[Database Upgrade] guide for details. @@ -21,5 +19,3 @@ This command sets the default row format of MySQL/MariaDB tables. This is only n ---- {occ-command-example-prefix-docker} db:restore-default-row-format ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_dav_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_dav_commands.adoc index e46663011..db2629aa4 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_dav_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_dav_commands.adoc @@ -23,8 +23,6 @@ NOTE: These commands are not available in xref:maintenance-commands[single-user {occ-command-example-prefix-docker} dav:cleanup-chunks [options] [--] [] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="25%,70%",] @@ -56,8 +54,6 @@ Cleaning chunks for admin 0 [>---------------------------] ---- -NOTE: Run this command inside the ownCloud Docker container. - == Create Addressbook Create a dav address book. @@ -67,8 +63,6 @@ Create a dav address book. {occ-command-example-prefix-docker} dav:create-addressbook ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="25%,70%",] @@ -89,8 +83,6 @@ This example creates the address book `mollybook` for the user molly: {occ-command-example-prefix-docker} dav:create-addressbook molly mollybook ---- -NOTE: Run this command inside the ownCloud Docker container. - Molly will immediately see her address book. == Create Calendar @@ -102,8 +94,6 @@ Create a dav calendar. {occ-command-example-prefix-docker} dav:create-calendar ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="25%,70%",] @@ -124,8 +114,6 @@ This example creates a new calendar `mollycal` for user molly: {occ-command-example-prefix-docker} dav:create-calendar molly mollycal ---- -NOTE: Run this command inside the ownCloud Docker container. - Molly will immediately see her calendar. // NOTE: dav:migrate-addressbooks has been removed with: https://github.com/owncloud/core/pull/23976 @@ -140,8 +128,6 @@ Synchronizes the birthday calendar. It adds all birthdays to your calendar from {occ-command-example-prefix-docker} dav:sync-birthday-calendar [] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="25%,70%",] @@ -159,8 +145,6 @@ This example syncs to your calendar from user `bernie`: {occ-command-example-prefix-docker} dav:sync-birthday-calendar bernie ---- -NOTE: Run this command inside the ownCloud Docker container. - == Sync System Addressbook Synchronizes all users to the system addressbook. @@ -169,5 +153,3 @@ Synchronizes all users to the system addressbook. ---- {occ-command-example-prefix-docker} dav:sync-system-addressbook ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_encryption_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_encryption_commands.adoc index 5b677f682..fe2d336ea 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_encryption_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_encryption_commands.adoc @@ -49,8 +49,6 @@ encryption - defaultModule: OC_DEFAULT_MODULE ---- -NOTE: Run this command inside the ownCloud Docker container. - == Encrypt the Users Home Storage Server-side encryption for local storage like the users home and remote storages like Google Drive can operate independently of each other. By doing so, you can encrypt a remote storage without also having to encrypt the users home storage on your ownCloud server. Possible values are `0` and `1` @@ -71,8 +69,6 @@ The folder must exist and the path is relative to your data directory. {occ-command-example-prefix-docker} encryption:change-key-storage-root ../data/security/oc-keys ---- -NOTE: Run this command inside the ownCloud Docker container. - You can see the current location of your keys folder: [source,docker,subs="attributes+"] @@ -81,8 +77,6 @@ You can see the current location of your keys folder: Current key storage root: default storage location (data/) ---- -NOTE: Run this command inside the ownCloud Docker container. - == List Modules `encryption:list-modules` displays your available encryption modules. @@ -113,8 +107,6 @@ This argument automatically answers, potential, questions with "yes", which is p {occ-command-example-prefix-docker} encryption:decrypt freda ---- -NOTE: Run this command inside the ownCloud Docker container. - Users must have enabled recovery keys on their Personal pages. You must first put your ownCloud server into single-user mode, using xref:maintenance-commands[the maintenance commands], to prevent any user activity until decryption is completed. === Arguments @@ -160,8 +152,6 @@ Use `encryption:disable` to disable your encryption module. You must first put y {occ-command-example-prefix-docker} encryption:fix-encrypted-version [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - `encryption:fix-encrypted-version` fixes the encrypted version of files if the encrypted file(s) are not downloadable for a given user. You only need this command if you get an "Invalid Signature" message in the browser or the clients. Background: the `oc_filecache` database table contains the integer columns "version" and "encryptedVersion" which start with 1 and are incremented on every file modification. When using encryption, those values are used together with the ciphertext to generate a cryptographic signature for the file. The version value is required to verify the signature. In some very rare cases like timeouts or bugs etc., the value might not get updated accordingly or get lost. The brute-force approach is to use the `fix:encrypted:version` command until the file can be decrypted. Starting with ownCloud 10.8, the behavior of the command got improved so that the encryptedVersion value is reset to its original value if no correct version was found. Before that fix, the last tried value was stored in the database thus modifying the state of the system and making further rescue attempts non-deterministic. @@ -198,8 +188,6 @@ Searches in increments from -n to +n. [default: "5"] {occ-command-example-prefix-docker} encryption:hsmdaemon [options] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Options [width="100%",cols="30%,70%",] @@ -226,8 +214,6 @@ Allows to test the `hsmdaemon` setup by providing an encrypted string to ownClou {occ-command-example-prefix-docker} encryption:hsmdaemon:decrypt [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="30%,70%",] @@ -256,8 +242,6 @@ Set the url on which the `hsmdaemon` REST-API is reachable. {occ-command-example-prefix-docker} config:app:set encryption hsm.url --value 'http://127.0.0.1:8513' ---- -NOTE: Run this command inside the ownCloud Docker container. - === Set the JSON Web Token Secret To access the `hsmdaemon` API, ownCloud must authenticate with a JWT (JSON Web Token). The given secret is shared between the `hsdmdaemon` (see the hsmdaemon.toml configuration file) and ownCloud to sign the JWT. See the xref:configuration/server/security/hsmdaemon/index.adoc[HSM documentation] for an example how to generate a secret. @@ -267,8 +251,6 @@ To access the `hsmdaemon` API, ownCloud must authenticate with a JWT (JSON Web T {occ-command-example-prefix-docker} config:app:set encryption hsm.jwt.secret --value '7a7d1826-b514-4d9f-afc7-a7485084e8de' ---- -NOTE: Run this command inside the ownCloud Docker container. - === Set the JWT Clockskew The JWT described above has an expiry timestamp. In case the time clocks on ownCloud and hsmdaemon system drift or skew apart, additional time is added to the expiry time to counteract this situation. Set or change the clockskew only if ownCloud advises to do so. Defaults to 120, value is in seconds. @@ -277,5 +259,3 @@ The JWT described above has an expiry timestamp. In case the time clocks on ownC ---- {occ-command-example-prefix-docker} config:app:set encryption hsm.jwt.clockskew --value '120' ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_sync_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_sync_commands.adoc index f0e2d2816..99c853513 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_sync_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_sync_commands.adoc @@ -9,6 +9,4 @@ Servers connected with federation shares can share user address books, and auto- {occ-command-example-prefix-docker} federation:sync-addressbooks ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: This command is only available when the "Federation" app (`federation`) is enabled. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_trusted_servers.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_trusted_servers.adoc index 58ba36311..ba21dfbd3 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_trusted_servers.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_federation_trusted_servers.adoc @@ -19,8 +19,6 @@ This command adds a trusted federated server. {occ-command-example-prefix-docker} federation:trusted-servers:add ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="25%,70%",] @@ -39,8 +37,6 @@ In the example below, the named trusted server is added. https://myserver:8888/server/owncloud ---- -NOTE: Run this command inside the ownCloud Docker container. - == List Trusted Servers This command lists all trusted federated servers that have been added. @@ -50,8 +46,6 @@ This command lists all trusted federated servers that have been added. {occ-command-example-prefix-docker} federation:trusted-servers:list ---- -NOTE: Run this command inside the ownCloud Docker container. - === Example In the example below, all trusted servers that have been added are listed. @@ -62,8 +56,6 @@ In the example below, all trusted servers that have been added are listed. ---- -NOTE: Run this command inside the ownCloud Docker container. - *Output:* [source,plaintext] @@ -85,8 +77,6 @@ This command removes a trusted federated server. {occ-command-example-prefix-docker} federation:trusted-servers:remove ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="25%,70%",] @@ -104,8 +94,6 @@ In the example below, the trusted server with ID=2 gets removed. {occ-command-example-prefix-docker} federation:trusted-servers:remove 2 ---- -NOTE: Run this command inside the ownCloud Docker container. - *Output:* [source,plaintext] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_file_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_file_commands.adoc index 4c51a4510..19837e44f 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_file_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_file_commands.adoc @@ -39,8 +39,6 @@ Removing files directly from the primary storage is not supported and should not files:check-cache [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -65,8 +63,6 @@ Examples of checking files for user maria: welcome.txt has been accessed properly ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,docker,subs="attributes+"] ---- {occ-command-example-prefix-docker} files:check-cache maria maria@smbhome/myfile.txt @@ -74,8 +70,6 @@ NOTE: Run this command inside the ownCloud Docker container. Ignoring maria@smbhome/myfile.txt because it is shared or not inside the primary storage ---- -NOTE: Run this command inside the ownCloud Docker container. - == The files:checksums:verify command ownCloud supports file integrity checking, by computing and matching checksums. Doing so ensures that transferred files arrive at their target in the exact state as they left their origin. @@ -101,8 +95,6 @@ Mismatch for thumbnails/9/2048-2048-max.png: Actual: SHA1:da39a3ee5e6b4b0d3255bfef95601890afd80709 MD5:d41d8cd98f00b204e9800998ecf8427e ADLER32:00000001 ---- -NOTE: Run this command inside the ownCloud Docker container. - === Options [width="100%",cols="20%,70%",] @@ -133,8 +125,6 @@ When a mount point gets removed, the storage ID and file cache related info stay files:remove-storage [options] [--] []... ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="23%,70%",] @@ -166,8 +156,6 @@ This command should be handled with absolute care because *any* storage ID and t {occ-command-example-prefix-docker} files:remove-storage --show-candidates ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,plaintext] ---- +------------+-------------------------------------------------+------------+ @@ -201,8 +189,6 @@ IMPORTANT: Scanning is only possible when using POSIX filesystems but not for ob files:scan [options] [--] []... ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -253,8 +239,6 @@ To get a list of scannable mounts for a given user, use the following command: {occ-command-example-prefix-docker} files_external:list user_id ---- -NOTE: Run this command inside the ownCloud Docker container. - TIP: Mounts are only scannable at the point of origin. Scanning of shares including federated shares is not necessary on the receiver side and therefore not possible. NOTE: Mounts based on session credentials can not be scanned as the users credentials are not available to the occ command set. @@ -286,8 +270,6 @@ This way is much faster than running the command for every user separately, but {occ-command-example-prefix-docker} maintenance:singleuser --off ---- -NOTE: Run this command inside the ownCloud Docker container. - The following command filters by the storage of the specified user. [source,docker,subs="attributes+"] @@ -295,8 +277,6 @@ The following command filters by the storage of the specified user. {occ-command-example-prefix-docker} files:scan USERID --repair ---- -NOTE: Run this command inside the ownCloud Docker container. - TIP: If many users are affected, it could be convenient to create a shell script, which iterates over a list of User ID's. == The files:transfer-ownership command @@ -316,8 +296,6 @@ This command is useful before removing users. files:transfer-ownership [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -349,8 +327,6 @@ For example, to move all files from `` to `` tran ---- -NOTE: Run this command inside the ownCloud Docker container. - You can also move a limited set of files from `` to `` transfer folder by making use of the `--path` switch, as in the example below. Ownership of `folder/to/move` and all files and folders which it contains will be transferred to `` transfer folder. @@ -362,8 +338,6 @@ Ownership of `folder/to/move` and all files and folders which it contains will b ---- -NOTE: Run this command inside the ownCloud Docker container. - If the entire user folder of `` needs to be migrated to `` user folder, use the `--destination-use-user-folder` switch, as in the example below. The destination user needs to be created but never log in, we recommend using owncloud maintenance mode for this operation. @@ -375,8 +349,6 @@ The destination user needs to be created but never log in, we recommend using ow ---- -NOTE: Run this command inside the ownCloud Docker container. - Please keep the following in mind when using this command: . The directory provided to the `--path` switch *must* exist inside `data//files`. @@ -399,8 +371,6 @@ NOTE: By default, the command performs a dry run and displays the problems found files:troubleshoot-transfer-ownership [options] [--] [] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="30%,90%",] @@ -425,8 +395,6 @@ Run the command with one of the type arguments: ---- -NOTE: Run this command inside the ownCloud Docker container. - The command can attempt to fix the issues with the `--fix` flag, + or execute for a single user using `--uid ` @@ -436,5 +404,3 @@ or execute for a single user using `--uid ` --fix \ --uid=UID ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_files_external_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_files_external_commands.adoc index d379267b3..295743064 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_files_external_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_files_external_commands.adoc @@ -69,8 +69,6 @@ List configured mounts. +----------+------------------+----------+ ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: The `--importable-format` option helps to make the technical mount settings visible. To see all settings you still need to use the other options such as `--show-password`, `--full` and `--all`. When you want to export the mount settings for later import, use the `files_external:export` command. `files_external:export` ensures that all the necessary settings are included in the output. == files_external:applicable diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_group_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_group_commands.adoc index cc5b3d626..6bf10f96a 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_group_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_group_commands.adoc @@ -31,8 +31,6 @@ This example adds a new group, called "Finance": Created group "Finance" ---- -NOTE: Run this command inside the ownCloud Docker container. - == Listing Groups You can list the names of existing groups with the `group:list` command. @@ -62,8 +60,6 @@ This example lists groups containing the string "finance". - Finance-Managers ---- -NOTE: Run this command inside the ownCloud Docker container. - This example lists groups containing the string "finance" formatted with `json_pretty`. [source,docker,subs="attributes+"] @@ -76,8 +72,6 @@ This example lists groups containing the string "finance" formatted with `json_p ] ---- -NOTE: Run this command inside the ownCloud Docker container. - == Listing Group Members You can list the user IDs of group members with the `group:list-members` command. @@ -104,8 +98,6 @@ This example lists members of the "Finance" group. - julie: Julie Jones ---- -NOTE: Run this command inside the ownCloud Docker container. - This example lists members of the Finance group formatted with `json_pretty`. [source,docker,subs="attributes+"] @@ -117,8 +109,6 @@ This example lists members of the Finance group formatted with `json_pretty`. } ---- -NOTE: Run this command inside the ownCloud Docker container. - == Adding Members to Groups You can add members to an existing group with the `group:add-member` command. Members must be existing users. The syntax is: @@ -137,8 +127,6 @@ This example adds members "aaron" and "julie" to group "Finance": User "julie" added to group "Finance" ---- -NOTE: Run this command inside the ownCloud Docker container. - You may attempt to add members that are already in the group, without error. This allows you to add members in a scripted way without needing to know if the user is already a member of the group. For example: [source,docker,subs="attributes+"] @@ -149,8 +137,6 @@ You may attempt to add members that are already in the group, without error. Thi User fred" added to group "Finance" ---- -NOTE: Run this command inside the ownCloud Docker container. - == Removing Members from Groups You can remove members from a group with the `group:remove-member` command. @@ -170,8 +156,6 @@ This example removes members "aaron" and "julie" from group "Finance". Member "julie" removed from group "Finance" ---- -NOTE: Run this command inside the ownCloud Docker container. - You may attempt to remove members that have already been removed from the group, without error. This allows you to remove members in a scripted way without needing to know if the user is still a member of the group. For example: [source,docker,subs="attributes+"] @@ -181,8 +165,6 @@ You may attempt to remove members that have already been removed from the group, Member "fred" removed from group "Finance" ---- -NOTE: Run this command inside the ownCloud Docker container. - == Deleting a Group To delete a group, you use the `group:delete` command, as in the example below: @@ -191,5 +173,3 @@ To delete a group, you use the `group:delete` command, as in the example below: ---- {occ-command-example-prefix-docker} group:delete Finance ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_incoming_shares_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_incoming_shares_commands.adoc index 9e3fb2f90..d46ed1193 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_incoming_shares_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_incoming_shares_commands.adoc @@ -11,8 +11,6 @@ NOTE: The command polls all received federated shares, so does not require a pat {occ-command-example-prefix-docker} incoming-shares:poll ---- -NOTE: Run this command inside the ownCloud Docker container. - [IMPORTANT] ==== When using federation, it is recommended to execute `occ incoming-shares:poll` regularly xref:configuration/server/background_jobs_configuration.adoc#cron-jobs[using Cron jobs]. The time interval between executions is a trade-off between the availability of changes in federated shares and resource consumption; which naturally depends a lot on the number of federated shares and the frequency of changes within those shares. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_integrity_check_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_integrity_check_commands.adoc index 67bf0e54b..1c26c4986 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_integrity_check_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_integrity_check_commands.adoc @@ -21,8 +21,6 @@ After creating your signing key, sign your app like this example: --path=/Users/karlmay/Programming/contacts ---- -NOTE: Run this command inside the ownCloud Docker container. - Verify your app: [source,docker,subs="attributes+"] @@ -30,11 +28,8 @@ Verify your app: {occ-command-example-prefix-docker} integrity:check-app --path=/pathto/app appname ---- -NOTE: Run this command inside the ownCloud Docker container. - When it returns nothing, your app is signed correctly. When it returns a message then there is an error. `integrity:sign-core` is for ownCloud core developers only. TIP: See xref:configuration/general_topics/code_signing.adoc[code signing] to learn more. - diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_localisation_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_localisation_commands.adoc index 32f37406e..f09b797a4 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_localisation_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_localisation_commands.adoc @@ -42,8 +42,6 @@ After that, run the following command to create the translation. {occ-command-example-prefix-docker} l10n:createjs comments de_AT ---- -NOTE: Run this command inside the ownCloud Docker container. - This will generate two translation files, `de_AT.js` and `de_AT.json`, in `/var/www/owncloud/apps/comments/l10n`. === Create Translations in Multiple Languages @@ -54,5 +52,3 @@ To create translations in multiple languages simultaneously, supply multiple lan ---- {occ-command-example-prefix-docker} l10n:createjs comments de_AT de_DE hu_HU es fr ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_logging_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_logging_commands.adoc index 9adb806ea..3c590abc2 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_logging_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_logging_commands.adoc @@ -21,8 +21,6 @@ Log file: /opt/owncloud/data/owncloud.log Rotate at: disabled ---- -NOTE: Run this command inside the ownCloud Docker container. - === Options [width="100%",cols="20%,50%",] @@ -53,7 +51,4 @@ Log level can be adjusted by entering the number or the name: {occ-command-example-prefix-docker} log:manage --level error ---- -NOTE: Run this command inside the ownCloud Docker container. - TIP: Setting the log level to debug ( 0 ) can be used for finding the cause of an error, but should not be the standard as it increases the log file size. - diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_maintenance_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_maintenance_commands.adoc index 2baf00942..78cb8b114 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_maintenance_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_maintenance_commands.adoc @@ -24,8 +24,6 @@ When a backup has been restored, the ETag information, which is necessary when a {occ-command-example-prefix-docker} maintenance:data-fingerprint ---- -NOTE: Run this command inside the ownCloud Docker container. - This command changes the ETag for all files in the communication with sync clients, informing them that one or more files were modified. After the command completes, users will be prompted to resolve any conflicts between newer and older file versions. == Install ownCloud @@ -42,8 +40,6 @@ NOTE: This command is only available if the following key in your `config.php` i {occ-command-example-prefix-docker} maintenance:install [options] ---- -NOTE: Run this command inside the ownCloud Docker container. - The `maintenance:install` command supports the following options: [cols="30%,75%",options="header"] @@ -91,8 +87,6 @@ Usage: {occ-command-example-prefix-docker} maintenance:mimetype:update-db [options] ---- -NOTE: Run this command inside the ownCloud Docker container. - The `maintenance:mimetype:update-db` command supports the following options: [cols="25%,75%",options="header"] @@ -115,8 +109,6 @@ Usage: {occ-command-example-prefix-docker} maintenance:update-js ---- -NOTE: Run this command inside the ownCloud Docker container. - == Enable or Disable Maintenance Mode `maintenance:mode` command locks the sessions of all logged-in users, including administrators, and displays a status screen warning that the server is in maintenance mode. Users who are not already logged in cannot log in until maintenance mode is turned off. Once you take the server out of maintenance mode, logged-in users must refresh their Web browsers to continue working. @@ -127,8 +119,6 @@ Usage: {occ-command-example-prefix-docker} maintenance:mode [options] ---- -NOTE: Run this command inside the ownCloud Docker container. - The `maintenance:mode` command supports the following options: [cols="25%,75%",options="header"] @@ -150,8 +140,6 @@ Turn on maintenance mode: {occ-command-example-prefix-docker} maintenance:mode --on ---- -NOTE: Run this command inside the ownCloud Docker container. - Turn it off when you’re finished with the maintenance tasks: [source,docker,subs="attributes+"] @@ -159,8 +147,6 @@ Turn it off when you’re finished with the maintenance tasks: {occ-command-example-prefix-docker} maintenance:mode --off ---- -NOTE: Run this command inside the ownCloud Docker container. - == Installation Repair Commands The `maintenance:repair` command helps administrators repair an installation. The command runs automatically during upgrades to clean up the database. So, while you can run it manually, there usually isn't a need to. @@ -174,8 +160,6 @@ Usage: {occ-command-example-prefix-docker} maintenance:repair [options] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Repair Command Options The `maintenance:repair` command supports the following options: @@ -204,8 +188,6 @@ Here is an example of running the command: {occ-command-example-prefix-docker} maintenance:repair ---- -NOTE: Run this command inside the ownCloud Docker container. - To list all off the possible repair steps, use the `--list` option. It should output the following list to the console: [source,plaintext] @@ -242,8 +224,6 @@ Usage: --single="OCA\DAV\Repair\RemoveInvalidShares" ---- -NOTE: Run this command inside the ownCloud Docker container. - TIP: The step's name must be quoted, otherwise you will see the following warning message appear, and the command will fail: "_Repair step not found. Use --list to show available steps._" @@ -259,8 +239,6 @@ Usage: {occ-command-example-prefix-docker} maintenance:singleuser --on ---- -NOTE: Run this command inside the ownCloud Docker container. - Turn it off when you're finished: [source,docker,subs="attributes+"] @@ -268,8 +246,6 @@ Turn it off when you're finished: {occ-command-example-prefix-docker} maintenance:singleuser --off ---- -NOTE: Run this command inside the ownCloud Docker container. - == Update the .htaccess File This command updates the `.htaccess` file. @@ -280,5 +256,3 @@ Usage: ---- {occ-command-example-prefix-docker} maintenance:update:htaccess ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_managing_background_jobs.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_managing_background_jobs.adoc index 0a061f04e..8b8865e49 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_managing_background_jobs.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_managing_background_jobs.adoc @@ -37,8 +37,6 @@ This example deletes queued background job #12. Job has been deleted. ---- -NOTE: Run this command inside the ownCloud Docker container. - == Executing a Background Job The command `background:queue:execute` executes a queued background job. It requires the job id of the job to be executed. @@ -80,8 +78,6 @@ Running job... Finished in 0 seconds ---- -NOTE: Run this command inside the ownCloud Docker container. - == List Queued Backgroundjobs The command `background:queue:status` will list queued background jobs, including details when it last ran. @@ -128,8 +124,6 @@ This example lists the queue status: +--------+----------------------------------------------------+---------------+----------+---------------------------+-------------+------------------------+ ---- -NOTE: Run this command inside the ownCloud Docker container. - There may be background jobs that are no longer valid. This can be because they are for an app that is now disabled or deleted, or jobs from an older version of an app that are no longer relevant. These jobs can be displayed with the `--display-invalid-jobs` option. Invalid jobs are listed with status "invalid". You can then delete invalid jobs with the `background:queue:delete` command using the job id. [source,docker,subs="attributes+"] @@ -157,5 +151,3 @@ There may be background jobs that are no longer valid. This can be because they | 228 | OCA\Files\BackgroundJob\PreviewCleanupJob | | 2023-07-21T08:25:49+00:00 | 2023-07-21T08:26:28+00:00 | N/A | 0 | | +--------+----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------+---------------------------+-------------+------------------------+---------+ ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_migration_steps_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_migration_steps_commands.adoc index 22e3991f2..72ac561be 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_migration_steps_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_migration_steps_commands.adoc @@ -7,8 +7,6 @@ You can run migration steps with the `migrations` command. {occ-command-example-prefix-docker} migrations:execute ---- -NOTE: Run this command inside the ownCloud Docker container. - == Arguments [width="100%",cols="20%,70%",] @@ -25,6 +23,3 @@ This example executes the migration step for the core app: ---- {occ-command-example-prefix-docker} migrations:execute core 20181220085457 ---- - -NOTE: Run this command inside the ownCloud Docker container. - diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_notifications_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_notifications_commands.adoc index 371e0f2d8..a40d7aff2 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_notifications_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_notifications_commands.adoc @@ -15,8 +15,6 @@ notifications {occ-command-example-prefix-docker} notifications:generate [-u|--user USER] [-g|--group GROUP] [-l|--link ] [--] [] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments: [width="100%",cols="20%,70%",] @@ -45,5 +43,3 @@ At least one user or group must be set. A link can be useful for notifications s {occ-command-example-prefix-docker} notifications:generate -g Office "Emergency Alert" "Rebooting in 5min" ---- -NOTE: Run this command inside the ownCloud Docker container. - diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_previews_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_previews_commands.adoc index 83906bd80..fc72dbdfb 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_previews_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_previews_commands.adoc @@ -17,8 +17,6 @@ Removing not referenced previews can be necessary, e.g., when the image has been {occ-command-example-prefix-docker} previews:cleanup [options] [--] [] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="25%,70%",] @@ -57,8 +55,6 @@ In the example below, you run one loop with max (default) 1000 files processed. {occ-command-example-prefix-docker} previews:cleanup ---- -NOTE: Run this command inside the ownCloud Docker container. - Other combinations could be: * `previews:cleanup -- 50`: run once and process 50 files diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_security_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_security_commands.adoc index d87595cd2..a00b5dfd4 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_security_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_security_commands.adoc @@ -24,8 +24,6 @@ Example 1: {occ-command-example-prefix-docker} security:routes ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,plaintext] ---- +-----------------------------------------------------------+-----------------+ @@ -46,8 +44,6 @@ Example 2: {occ-command-example-prefix-docker} security:routes --output=json-pretty ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,plaintext] ---- [ @@ -66,8 +62,6 @@ Example 3: {occ-command-example-prefix-docker} security:routes --with-details ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,plaintext] ---- +---------------------------------------------+---------+-------------------------------------------------------+--------------------------------+ @@ -96,8 +90,6 @@ This example lists your installed certificates: {occ-command-example-prefix-docker} security:certificates ---- -NOTE: Run this command inside the ownCloud Docker container. - Import a new certificate: [source,docker,subs="attributes+"] @@ -105,13 +97,9 @@ Import a new certificate: {occ-command-example-prefix-docker} security:certificates:import /path/to/certificate ---- -NOTE: Run this command inside the ownCloud Docker container. - Remove a certificate: [source,docker ,subs="attributes+"] ---- {occ-command-example-prefix-docker} security:certificates:remove [certificate name] ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_sharing_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_sharing_commands.adoc index 33a9e6fe1..094d32c7b 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_sharing_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_sharing_commands.adoc @@ -13,8 +13,6 @@ As a result, any user(s) who the share was re-shared with will now get an error {occ-command-example-prefix-docker} sharing:cleanup-remote-storages ---- -NOTE: Run this command inside the ownCloud Docker container. - You can also set it up to run as xref:background-jobs-selector[a background job]. NOTE: These commands are not available in xref:maintenance-commands[single-user (maintenance) mode]. @@ -28,13 +26,9 @@ Currently, if a federated share is invalid or the API endpoint returns a "not fo {occ-command-example-prefix-docker} config:app:set files_sharing enable_cleanup_invalid_external_shares --value no ---- -NOTE: Run this command inside the ownCloud Docker container. - To revert that setting to its default behavior, run: [source,docker,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:delete files_sharing enable_cleanup_invalid_external_shares ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_system_command.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_system_command.adoc index f31147b2e..b6796dccb 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_system_command.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_system_command.adoc @@ -13,8 +13,6 @@ system:cron [options] ---- -NOTE: Run this command inside the ownCloud Docker container. - == Options [width="100%",cols="20%,70%",] @@ -31,8 +29,6 @@ To execute xref:configuration/server/background_jobs_configuration.adoc[backgrou {occ-command-example-prefix-docker} system:cron ---- -NOTE: Run this command inside the ownCloud Docker container. - If the `--progress` or `-p` argument is specified, then progress output will be displayed in the console, as in the example below. [source,console] @@ -65,8 +61,6 @@ Use the following one instead {occ-command-example-prefix-docker} system:cron ---- -NOTE: Run this command inside the ownCloud Docker container. - ==== [NOTE] diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_trashbin_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_trashbin_commands.adoc index 321633128..890ab0e6c 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_trashbin_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_trashbin_commands.adoc @@ -24,8 +24,6 @@ Remove deleted files for users on backend Database edward ---- -NOTE: Run this command inside the ownCloud Docker container. - This example removes the deleted files of users `molly` and `freda`: [source,docker,subs="attributes+"] @@ -35,6 +33,4 @@ Remove deleted files of molly Remove deleted files of freda ---- -NOTE: Run this command inside the ownCloud Docker container. - `trashbin:expire` deletes only expired files according to the `trashbin_retention_obligation` setting in `config.php` (see xref:configuration/server/config_sample_php_parameters.adoc[the "Deleted Files" section documentation]). The default is to delete expired files for all users, or you may list users in a space-delimited list. diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_user_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_user_commands.adoc index 535a15467..72a62986e 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_user_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_user_commands.adoc @@ -40,8 +40,6 @@ You can create a new user with the `user:add` command. ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="30%,70%",] @@ -91,8 +89,6 @@ If either group does not exist, it is created. User "layla" added to group "db-admins" ---- -NOTE: Run this command inside the ownCloud Docker container. - .Create a user with a temporary password (the user will receive a link to set their password). [source,docker,subs="attributes+"] ---- @@ -109,8 +105,6 @@ User layla added to group users User layla added to group db-admins ---- -NOTE: Run this command inside the ownCloud Docker container. - == Deleting A User To delete a user, you use the `user:delete` command. @@ -120,8 +114,6 @@ To delete a user, you use the `user:delete` command. {occ-command-example-prefix-docker} user:delete [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -144,8 +136,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} user:delete fred ---- -NOTE: Run this command inside the ownCloud Docker container. - == Disable Users Admins can disable users via the occ command too: @@ -155,8 +145,6 @@ Admins can disable users via the occ command too: {occ-command-example-prefix-docker} user:disable ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -174,8 +162,6 @@ NOTE: Once users are disabled, their connected browsers will be disconnected. Us {occ-command-example-prefix-docker} user:enable ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -195,8 +181,6 @@ This command is complementary when using `user:move-home`. {occ-command-example-prefix-docker} user:home:list-dirs [options] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Options [width="100%",cols="20%,70%"] @@ -213,8 +197,6 @@ NOTE: Run this command inside the ownCloud Docker container. - /var/www/owncloud/data ---- -NOTE: Run this command inside the ownCloud Docker container. - == List all Users For a Given Home Directory List all users that have their home in a given path. For details see xref:configuration/user/user_management.adoc#moving-the-user-home[Moving the User Home] documentation. @@ -226,8 +208,6 @@ This command is complementary when using `user:move-home`. {occ-command-example-prefix-docker} user:home:list-users [options] [--] [] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%"] @@ -261,8 +241,6 @@ Note for the example below, some user accounts originated from LDAP. - dbcca7b4-7306-103b-813a-19652cf0a9d2 ---- -NOTE: Run this command inside the ownCloud Docker container. - Run the following command to list all users from all available home directories. The example shows, that user `lisa` has been moved to a different home directory with `user:move-home`. [source,docker,subs="attributes+"] @@ -275,8 +253,6 @@ Run the following command to list all users from all available home directories. - user01 ---- -NOTE: Run this command inside the ownCloud Docker container. - == Finding Inactive Users To view a list of users who've not logged in for a given number of days, use the `user:inactive` command. @@ -286,8 +262,6 @@ To view a list of users who've not logged in for a given number of days, use the {occ-command-example-prefix-docker} user:inactive [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -311,8 +285,6 @@ The example below searches for users inactive for five days or more: {occ-command-example-prefix-docker} user:inactive 5 ---- -NOTE: Run this command inside the ownCloud Docker container. - By default, this will generate output in the following format: [source,plaintext] @@ -352,8 +324,6 @@ To view a user's most recent login, use the `user:lastseen` command: {occ-command-example-prefix-docker} user:lastseen ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -370,8 +340,6 @@ Example layla's last login: 09.01.2015 18:46 ---- -NOTE: Run this command inside the ownCloud Docker container. - == Listing Users You can list existing users with the `user:list` command. @@ -381,8 +349,6 @@ You can list existing users with the `user:list` command. {occ-command-example-prefix-docker} user:list [options] [] ---- -NOTE: Run this command inside the ownCloud Docker container. - User IDs containing the `search-pattern` string are listed. Matching is not case-sensitive. If you do not provide a search-pattern then all users are listed. @@ -415,8 +381,6 @@ This example lists user IDs containing the string `ron` - aaron: Aaron Smith ---- -NOTE: Run this command inside the ownCloud Docker container. - The output can be formatted in JSON with the output option `json` or `json_pretty`. [source,docker,subs="attributes+"] @@ -429,8 +393,6 @@ The output can be formatted in JSON with the output option `json` or `json_prett } ---- -NOTE: Run this command inside the ownCloud Docker container. - This example lists all users including the attribute `enabled`. [source,docker,subs="attributes+"] @@ -440,8 +402,6 @@ This example lists all users including the attribute `enabled`. - foo: true ---- -NOTE: Run this command inside the ownCloud Docker container. - == Listing Group Membership of a User You can list the group membership of a user with the `user:list-groups` command. @@ -451,8 +411,6 @@ You can list the group membership of a user with the `user:list-groups` command. {occ-command-example-prefix-docker} user:list-groups [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -480,8 +438,6 @@ This example lists group membership of user `julie`: - Finance ---- -NOTE: Run this command inside the ownCloud Docker container. - The output can be formatted in JSON with the output option `json` or `json_pretty`: [source,docker,subs="attributes+"] @@ -493,8 +449,6 @@ The output can be formatted in JSON with the output option `json` or `json_prett ] ---- -NOTE: Run this command inside the ownCloud Docker container. - == Modify User Details This command modifies either the users username or email address. @@ -504,8 +458,6 @@ This command modifies either the users username or email address. {occ-command-example-prefix-docker} user:modify [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -527,8 +479,6 @@ All three arguments are mandatory and can not be empty. Example to set the email {occ-command-example-prefix-docker} user:modify carla email foobar@foo.com ---- -NOTE: Run this command inside the ownCloud Docker container. - The email address of `carla` is updated to `foobar@foo.com`. == Move a Users Home Folder @@ -540,8 +490,6 @@ This command moves a user's home folder to a new location. For details see xref: {occ-command-example-prefix-docker} user:move-home ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -568,8 +516,6 @@ Example: {occ-command-example-prefix-docker} user:move-home lisa /mnt/newhome_1 ---- -NOTE: Run this command inside the ownCloud Docker container. - This command moves the home directory of user `lisa` to the new location `/mnt/newhome_1` == Generating a User Count Report @@ -581,8 +527,6 @@ Generate a simple report that counts all users including users on external user {occ-command-example-prefix-docker} user:report ---- -NOTE: Run this command inside the ownCloud Docker container. - There are no arguments and no options beside the default once to parametrize the output. [source,docker,subs="attributes+"] @@ -602,8 +546,6 @@ There are no arguments and no options beside the default once to parametrize the +--------------------------+-----+ ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: A user directory is created, when a local user has logged on the first time after creation. Therefore the difference between `OC\User\Database` and `user directories` equals all users which have been created locally, but have not logged on at least once. == Setting a User's Password @@ -615,8 +557,6 @@ Resets the password of the named user. {occ-command-example-prefix-docker} user:resetpassword [options] [--] ---- -NOTE: Run this command inside the ownCloud Docker container. - include::partial$configuration/user/update-password-note.adoc[] === Arguments @@ -672,8 +612,6 @@ You can reset any user's password, including administrators (see xref:configurat Successfully reset password for layla ---- -NOTE: Run this command inside the ownCloud Docker container. - You may also use `password-from-env` to reset passwords: [source,plaintext] @@ -697,8 +635,6 @@ Additionally, when the command completes, it outputs the password reset link to The password reset link is: http://localhost:{std-port-http}/index.php/lostpassword/reset/form/rQAlCjNeQf3aphA6Hraq2/layla ---- -NOTE: Run this command inside the ownCloud Docker container. - If the specified user does not have a valid email address set, then the following error will be output to the console, and the email will not be sent: [source,plaintext] @@ -720,8 +656,6 @@ To manage application settings for a user, use the `user:setting` command. This {occ-command-example-prefix-docker} user:setting [options] [--] [[ []] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,40%",] @@ -788,8 +722,6 @@ To retrieve settings for a user, you need to call the `user:setting` command and {occ-command-example-prefix-docker} user:setting [] [] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Arguments [width="100%",cols="20%,70%",] @@ -819,8 +751,6 @@ NOTE: Run this command inside the ownCloud Docker container. - email: layla@example.tld ---- -NOTE: Run this command inside the ownCloud Docker container. - + Here we see that the user has settings for the application `core`, when they last logged in, and what their email address is. @@ -833,8 +763,6 @@ Here we see that the user has settings for the application `core`, when they las - lang: en ---- -NOTE: Run this command inside the ownCloud Docker container. - + In the output, you can see that one setting is in effect, `lang`, which is set to `en`. @@ -845,8 +773,6 @@ In the output, you can see that one setting is in effect, `lang`, which is set t {occ-command-example-prefix-docker} user:setting layla core lang ---- -NOTE: Run this command inside the ownCloud Docker container. - + This will display the value for that setting, such as `en`. @@ -857,8 +783,6 @@ This will display the value for that setting, such as `en`. {occ-command-example-prefix-docker} user:setting [options] [--] [] [] ---- -NOTE: Run this command inside the ownCloud Docker container. - IMPORTANT: In case you want to change the email address, use xref:modify-user-details[the `user:modify` command]. Here's an example of how you would set the language of the user `layla`. @@ -868,8 +792,6 @@ Here's an example of how you would set the language of the user `layla`. {occ-command-example-prefix-docker} user:setting layla core lang --value=en ---- -NOTE: Run this command inside the ownCloud Docker container. - Deleting a setting is quite similar to setting a setting. In this case, you supply the username, application (or setting category) and key as above. Then, in addition, you supply the `--delete` flag. [source,docker,subs="attributes+"] @@ -877,8 +799,6 @@ Deleting a setting is quite similar to setting a setting. In this case, you supp {occ-command-example-prefix-docker} user:setting layla core lang --delete ---- -NOTE: Run this command inside the ownCloud Docker container. - == Syncing User Accounts This command syncs users stored in external backend services, such as _LDAP_, _Shibboleth_, and _Samba_, with ownCloud's, internal user database. However, it's not essential to run it regularly, unless you have a large number of users whose account properties have changed in a backend outside of ownCloud. When run, it will pick up changes from alternative user backends, such as LDAP, where properties like `cn` or `display name` have changed, and sync them with ownCloud's user database. If accounts are found that no longer exist in the external backend, you are given the choice of either removing or disabling the @@ -961,8 +881,6 @@ and _Shibboleth_ backend. {occ-command-example-prefix-docker} user:sync "OCA\User_LDAP\User_Proxy" ---- -NOTE: Run this command inside the ownCloud Docker container. - === Samba [source,docker,subs="attributes+"] @@ -970,8 +888,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} user:sync "OCA\User\SMB" -vvv ---- -NOTE: Run this command inside the ownCloud Docker container. - Below are examples of how to use the command with the *LDAP* backend along with example console output. === Example 1 @@ -990,8 +906,6 @@ Below are examples of how to use the command with the *LDAP* backend along with 4 [============================] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Example 2 [source,docker,subs="attributes+"] @@ -1012,8 +926,6 @@ NOTE: Run this command inside the ownCloud Docker container. 1 [============================] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Example 3 [source,docker,subs="attributes+"] @@ -1035,8 +947,6 @@ NOTE: Run this command inside the ownCloud Docker container. 1 [============================] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Example 4 [source,docker,subs="attributes+"] @@ -1056,8 +966,6 @@ NOTE: Run this command inside the ownCloud Docker container. 4 [============================] ---- -NOTE: Run this command inside the ownCloud Docker container. - === Example 5 [source,docker,subs="attributes+"] @@ -1066,8 +974,6 @@ NOTE: Run this command inside the ownCloud Docker container. ---- -NOTE: Run this command inside the ownCloud Docker container. - === Example 6 [source,docker,subs="attributes+"] @@ -1079,8 +985,6 @@ If unknown users are found, what do you want to do with their accounts? (removin [2] ask later ---- -NOTE: Run this command inside the ownCloud Docker container. - === Syncing via cron job Here is an example for syncing with LDAP four times a day on Ubuntu: diff --git a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_versions_commands.adoc b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_versions_commands.adoc index 6e622660f..f6fa5b029 100644 --- a/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_versions_commands.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_commands/core_commands/_versions_commands.adoc @@ -11,8 +11,6 @@ NOTE: These commands are only available when the "Versions" app (`files_versions {occ-command-example-prefix-docker} versions:cleanup []... ---- -NOTE: Run this command inside the ownCloud Docker container. - Options [width="100%",cols="22%,70%",] @@ -34,8 +32,6 @@ Delete versions for users on backend Database edward ---- -NOTE: Run this command inside the ownCloud Docker container. - You can delete versions for specific users in a space-delimited list: [source,docker,subs="attributes+"] @@ -45,8 +41,6 @@ Delete versions of freda Delete versions of molly ---- -NOTE: Run this command inside the ownCloud Docker container. - == versions:expire `versions:expire` deletes only expired files according to the `versions_retention_obligation` setting in `config.php` (see the File versions section in config_sample_php_parameters). The default is to delete expired files for all users, or you may list users in a space-delimited list. @@ -56,8 +50,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} versions:expire []... ---- -NOTE: Run this command inside the ownCloud Docker container. - Options [width="100%",cols="22%,70%",] diff --git a/modules/admin_manual/pages/configuration/server/security/hsmdaemon/index.adoc b/modules/admin_manual/pages/configuration/server/security/hsmdaemon/index.adoc index 17e6f2edd..0dea25d40 100644 --- a/modules/admin_manual/pages/configuration/server/security/hsmdaemon/index.adoc +++ b/modules/admin_manual/pages/configuration/server/security/hsmdaemon/index.adoc @@ -405,8 +405,6 @@ ep6Y1aAVAYpAesZ1+sQzzUepjO82o34kjmm63Drmz+6KED4oIBARQkXeW/OoxgUg6kQhQK1thA/3Ww33 decrypted string (base64 encoded): 'SGVsbG8sIHdvcmxkIQo=' ---- -NOTE: Run this command inside the ownCloud Docker container. - [source,bash] ---- sudo tail -5 /var/log/hsm.log @@ -502,8 +500,6 @@ Set the generated secret for ownCloud: {occ-command-example-prefix-docker} config:app:set encryption hsm.jwt.secret --value '7a7d1826-b514-4d9f-afc7-a7485084e8de' ---- -NOTE: Run this command inside the ownCloud Docker container. - If the command succeeds, you should see the following console output: [source,plaintext] @@ -522,8 +518,6 @@ Enable the HSM mode and enable encryption by running the commands in the followi {occ-command-example-prefix-docker} encryption:enable ---- -NOTE: Run this command inside the ownCloud Docker container. - If the commands are successful, you should see the following console output: [source,plaintext] diff --git a/modules/admin_manual/pages/configuration/server/ui-configuration.adoc b/modules/admin_manual/pages/configuration/server/ui-configuration.adoc index e09442068..c8e2033cf 100644 --- a/modules/admin_manual/pages/configuration/server/ui-configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/ui-configuration.adoc @@ -22,8 +22,6 @@ This progress bar can be hidden with the following command: {occ-command-example-prefix-docker} config:app:set files hide_upload_estimation --value="yes" ---- -NOTE: Run this command inside the ownCloud Docker container. - To show the progress bar again, type one of the following commands: [source,bash,subs="attributes+"] @@ -31,8 +29,6 @@ To show the progress bar again, type one of the following commands: {occ-command-example-prefix-docker} config:app:set files hide_upload_estimation --value="no" ---- -NOTE: Run this command inside the ownCloud Docker container. - or [source,bash,subs="attributes+"] @@ -40,7 +36,5 @@ or {occ-command-example-prefix-docker} config:app:delete files hide_upload_estimation ---- -NOTE: Run this command inside the ownCloud Docker container. - The current value can be queried with the `config:app:get` or the `config:list` command. For details see the xref:configuration/server/occ_command.adoc#config-commands[occ Config Commands] diff --git a/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc b/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc index 52b506ce8..fb7240028 100644 --- a/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc +++ b/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc @@ -64,21 +64,19 @@ image::configuration/server/virus-scanner-support/antivirus-app.png[Anti-Virus A . To install the app via the occ command, execute: + +-- [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} market:install files_antivirus ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ + and enable it with the following occ command: -+ + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} app:enable files_antivirus ---- -+ -NOTE: Run this command inside the ownCloud Docker container. +-- == Ways of Configuration @@ -96,8 +94,6 @@ All of the configuration settings for the Anti-Virus app are configurable by pas av_socket --value="/var/run/clamav/clamd.ctl" ---- -NOTE: Run this command inside the ownCloud Docker container. - To get a current option, run for example: [source,bash,subs="attributes+"] @@ -106,8 +102,6 @@ To get a current option, run for example: av_socket ---- -NOTE: Run this command inside the ownCloud Docker container. - [caption=] .Available configuration settings, availability is _av_mode_ dependent [cols="23%,45%,15%",options="header"] @@ -309,8 +303,6 @@ In both daemon modes, background scans are enabled by default. If you want to di ---- {occ-command-example-prefix-docker} config:app:set files_antivirus av_scan_background --value 'false' ---- - -NOTE: Run this command inside the ownCloud Docker container. ==== [[daemon-socket-same-server]] @@ -428,8 +420,6 @@ Use the following occ commands to set configurations based on your environment: {occ-command-example-prefix-docker} config:app:set files_antivirus \ av_host --value="172.17.0.3" ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . Specify the port of the anti-virus server: + @@ -438,8 +428,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} config:app:set files_antivirus \ av_port --value="1344" ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . Enable background scans: + @@ -448,22 +436,20 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} config:app:set files_antivirus \ av_scan_background --value="true" ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . Specify what to do with the offending file: + +-- [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set files_antivirus \ av_infected_action --value="delete" ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ + Possible values are `delete` and `only_log`. -+ + Note that this setting is only used when `av_scan_background` is set to `true`. +-- ==== Mode Dependent Settings @@ -476,8 +462,6 @@ The following settings are just examples and must be adjusted for the scanner yo {occ-command-example-prefix-docker} config:app:set files_antivirus \ av_mode --value="icap" ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . Set the request service: + @@ -486,8 +470,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} config:app:set files_antivirus \ av_request_service --value="avscan" ---- -+ -NOTE: Run this command inside the ownCloud Docker container. . Set the response header: + @@ -496,8 +478,6 @@ NOTE: Run this command inside the ownCloud Docker container. {occ-command-example-prefix-docker} config:app:set files_antivirus \ av_response_header --value="X-Infection-Found" ---- -+ -NOTE: Run this command inside the ownCloud Docker container. === ClamAV & Kaspersky (ICAP) diff --git a/modules/admin_manual/pages/configuration/user/oidc/oidc.adoc b/modules/admin_manual/pages/configuration/user/oidc/oidc.adoc index 4c7c1eacc..6ac2d33d2 100644 --- a/modules/admin_manual/pages/configuration/user/oidc/oidc.adoc +++ b/modules/admin_manual/pages/configuration/user/oidc/oidc.adoc @@ -92,8 +92,6 @@ If a malformed JSON string is found, an error is logged. The _key->value_ pairs --value='{"provider-url":"https:\/\/idp.example.net","client-id":"fc9b5c78-ec73-47bf-befc-59d4fe780f6f","client-secret":"e3e5b04a-3c3c-4f4d-b16c-2a6e9fdd3cd1","loginButtonName":"Login via OpenId Connect"}' ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: Only set either the database or the config.php keys but not both for the OpenID Connect app. == Set Up Service Discovery diff --git a/modules/admin_manual/pages/configuration/user/reset_admin_password.adoc b/modules/admin_manual/pages/configuration/user/reset_admin_password.adoc index a9611cb14..f015707ca 100644 --- a/modules/admin_manual/pages/configuration/user/reset_admin_password.adoc +++ b/modules/admin_manual/pages/configuration/user/reset_admin_password.adoc @@ -22,8 +22,6 @@ Confirm the new password: Successfully reset password for admin ---- -NOTE: Run this command inside the ownCloud Docker container. - If your ownCloud username is not `admin`, then substitute your ownCloud username. diff --git a/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc b/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc index 7cbae429b..52ebbc2a2 100644 --- a/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc +++ b/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc @@ -316,8 +316,6 @@ Disallowing login with LDAP Email Address requires enabling strict login checkin ---- {occ-command-example-prefix-docker} config:system:set --type boolean --value true strict_login_enforced ---- - -NOTE: Run this command inside the ownCloud Docker container. ==== Other Attributes:: @@ -622,8 +620,6 @@ Since ownCloud 8.0.10 and up the home folder rule is enforced. This means that o {occ-command-example-prefix-docker} config:app:set user_ldap enforce_home_folder_naming_rule --value=1 ---- -NOTE: Run this command inside the ownCloud Docker container. - Starting with ownCloud 10.0, the home folder naming rule is only applied when first provisioning the user. This prevents data loss due to re-provisioning the users home folder in case of unintentional changes in LDAP. -- @@ -731,11 +727,9 @@ New LDAP logins can attempt to reuse _existing_ user and group accounts if: To enable this functionality, the `reuse_accounts` config setting must be set to `yes`. To enable it, run the following command. [source,bash,subs="attributes+"] -.... +---- {occ-command-example-prefix-docker} config:app:set user_ldap reuse_accounts --value=yes -.... - -NOTE: Run this command inside the ownCloud Docker container. +---- === ownCloud Avatar Integration diff --git a/modules/admin_manual/pages/configuration/user/user_management.adoc b/modules/admin_manual/pages/configuration/user/user_management.adoc index 1a0602cf1..c58ad3463 100644 --- a/modules/admin_manual/pages/configuration/user/user_management.adoc +++ b/modules/admin_manual/pages/configuration/user/user_management.adoc @@ -182,15 +182,15 @@ For details of the occ user commands used below, see the xref:configuration/serv . To report a users home, use the following command: + +-- [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} user:list lisa -a home - lisa: /var/www/owncloud/data/lisa ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ + Here you can see, that the home of user `lisa` is located in `/var/www/owncloud/data/lisa` +-- . Prepare new mounts *in advance* for one or more users: + @@ -198,58 +198,57 @@ Use the OS methods to create one or more new mount points for users home directo . Move the users home: + +-- [NOTE] ==== * To move a users home, the target folder *must not contain* a subfolder with the user's ID. * The target folder *can contain* other user folders. ==== -+ + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} user:move-home lisa /mnt/newhome_1 ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ + The user gets disconnected and the user's home is now moved which may take a while depending on the load of the server and the bandwidth available on the mount points. When the move operation has finished, -+ --- + * all data from the user is _copied_ to the new home, * the new path is set in the ownCloud database and * the user gets enabled again. --- -+ + After checking, the old user's home location can safely be deleted manually. -+ + NOTE: If you are using LDAP and the xref:enterprise/external_storage/ldap_home_connector_configuration.adoc[LDAP Home Connector] app, update the user's home mount in the attribute used accordingly. +-- . To check the user's new home, use the following command: + +-- [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} user:list lisa -a home - lisa: /mnt/newhome_1/lisa ---- -+ -NOTE: Run this command inside the ownCloud Docker container. -+ + Here you can see that the home of user `lisa` is now located in `/mnt/newhome_1/lisa`. +-- . To list the available user home root directories, use the following command: + +-- The following command lists all available user homes. Note a home only gets listed, if it contains at least one user. -+ + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} user:home:list-dirs - /var/www/owncloud/data - /mnt/newhome_1/lisa ---- -+ -NOTE: Run this command inside the ownCloud Docker container. +-- . To list all users from a users home root directory, use the following command: + +-- The following command lists all users from a given home. [source,bash,subs="attributes+"] @@ -258,5 +257,4 @@ The following command lists all users from a given home. - admin - user01 ---- - -NOTE: Run this command inside the ownCloud Docker container. +-- diff --git a/modules/admin_manual/pages/enterprise/file_management/files_lifecycle.adoc b/modules/admin_manual/pages/enterprise/file_management/files_lifecycle.adoc index b68ebe43a..31833d5e8 100644 --- a/modules/admin_manual/pages/enterprise/file_management/files_lifecycle.adoc +++ b/modules/admin_manual/pages/enterprise/file_management/files_lifecycle.adoc @@ -56,8 +56,6 @@ Example to set missing upload time values to November, 1st 2019: {occ-command-example-prefix-docker} lifecycle:set-upload-time 2019-11-01 ---- -NOTE: Run this command inside the ownCloud Docker container. - TIP: The extension only considers files. Folder structures are kept available. === Policy Configuration @@ -79,16 +77,12 @@ Example to set the time passed since upload (or restore) for archiving files to {occ-command-example-prefix-docker} config:app:set files_lifecycle archive_period --value='90' ---- -NOTE: Run this command inside the ownCloud Docker container. - To query existing values, use this example command: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:get files_lifecycle archive_period ---- -NOTE: Run this command inside the ownCloud Docker container. - ==== Restoration Policies for Users ===== Soft Policy @@ -101,8 +95,6 @@ The _soft policy_ is used by default. To switch from the hard policy to the soft {occ-command-example-prefix-docker} config:app:set files_lifecycle policy --value='soft' ---- -NOTE: Run this command inside the ownCloud Docker container. - ===== Hard Policy The _hard policy_ is designed to enforce strict controls on user data, forcing archiving after the defined time and requiring escalated permissions in order to restore. If the archived data is still needed, users need to get in contact with a privileged manager and request the restoration. @@ -116,8 +108,6 @@ To put the _hard policy_ in place, use this _occ_ command: {occ-command-example-prefix-docker} config:app:set files_lifecycle policy --value='hard' ---- -NOTE: Run this command inside the ownCloud Docker container. - === Archive and Expiration Background Jobs To put File Lifecycle Management into actual operation, there are two _occ_ commands for archiving files and for permanently deleting them from the archive. Scanning the database for files that are due for archiving or expiration, given the chosen policies, can take some time. For this reason, these jobs are delegated to specific _occ_ commands which should be executed using CRON on a daily schedule. @@ -130,8 +120,6 @@ To move files scheduled for archiving (days since upload/restore > `archive_time {occ-command-example-prefix-docker} lifecycle:archive ---- -NOTE: Run this command inside the ownCloud Docker container. - TIP: There is a dry-run mode (append `-d`) that simulates the execution of this command to allow checking the configuration before putting the actual process in place. ==== Archive Expiration Background Job @@ -142,8 +130,6 @@ To permanently delete files from the archive that have met the policy rules (day {occ-command-example-prefix-docker} lifecycle:expire ---- -NOTE: Run this command inside the ownCloud Docker container. - TIP: There is a dry-run mode (append `-d`) that simulates the execution of this command to allow checking the configuration before putting the actual process in place. === Restoring Files @@ -162,8 +148,6 @@ When a user `alice` requests to restore all files, e.g., in the folder `/work/pr {occ-command-example-prefix-docker} lifecycle:restore /alice/archive/files/work/projects/project1 ---- -NOTE: Run this command inside the ownCloud Docker container. - ==== Restoring All Files from All Archives File Lifecycle Management provides a way to restore all files from all archives back to their owners' file directories. To do this, system administrators can use the `restore-all` _occ_ command: @@ -172,8 +156,6 @@ File Lifecycle Management provides a way to restore all files from all archives {occ-command-example-prefix-docker} lifecycle:restore-all ---- -NOTE: Run this command inside the ownCloud Docker container. - The command will restore all files from all users and report on the progress. TIP: There is a dry-run mode (append `-d`) that simulates the execution of this command to allow checking the configuration before putting the actual process in place. @@ -187,8 +169,6 @@ In some scenarios it can be desired to disable the whole user interface for this {occ-command-example-prefix-docker} config:app:set files_lifecycle disable_ui --value='yes' ---- -NOTE: Run this command inside the ownCloud Docker container. - To enable the user interface components again, this config value needs to be removed: [source,bash,subs="attributes+"] @@ -196,8 +176,6 @@ To enable the user interface components again, this config value needs to be rem {occ-command-example-prefix-docker} config:app:delete files_lifecycle disable_ui ---- -NOTE: Run this command inside the ownCloud Docker container. - == Audit Events During archiving, restoring and expiration, Audit events are emitted. Logging those to the `audit.log` requires the minimum version 2.0.0 of the {oc-marketplace-url}/apps/admin_audit[Auditing] app. diff --git a/modules/admin_manual/pages/enterprise/logging/admin_audit.adoc b/modules/admin_manual/pages/enterprise/logging/admin_audit.adoc index 4ff1ecee2..20d00f48c 100644 --- a/modules/admin_manual/pages/enterprise/logging/admin_audit.adoc +++ b/modules/admin_manual/pages/enterprise/logging/admin_audit.adoc @@ -53,8 +53,6 @@ To ignore all CLI triggered events (default is to include them), set the followi {occ-command-example-prefix-docker} config:app:set admin_audit ignore_cli_events --value='yes' ---- -NOTE: Run this command inside the ownCloud Docker container. - == Grouped Logging With each log message, a number of users are calculated to be the 'audit context'. This is the list of users which are related to the log message. Additionally, each log message includes a list of groups that the users are a member of, to enable filtering / splitting of the log messages at a later date. In cases when users are members of many groups, to reduce the data output, the group list can be filtered by adding the following to your `config.php`. Change the groups needed accordingly: diff --git a/modules/admin_manual/pages/enterprise/reporting/metrics.adoc b/modules/admin_manual/pages/enterprise/reporting/metrics.adoc index eff58764d..262904e69 100644 --- a/modules/admin_manual/pages/enterprise/reporting/metrics.adoc +++ b/modules/admin_manual/pages/enterprise/reporting/metrics.adoc @@ -92,8 +92,6 @@ See the following occ command on how to set it. Make up a passphrase, referred t {occ-command-example-prefix-docker} config:system:set "metrics_shared_secret" --value "" ---- -NOTE: Run this command inside the ownCloud Docker container. - TIP: This token gets stored in config.php as `metrics_shared_secret`, which could also be done manually instead of using the occ command. @@ -106,8 +104,6 @@ The dashboard is enabled by default. You can disable it with the following comma {occ-command-example-prefix-docker} config:app:set metrics disable_dashboard --value=yes ---- -NOTE: Run this command inside the ownCloud Docker container. - === Endpoints and Parameters ==== Metrics Endpoint diff --git a/modules/admin_manual/pages/enterprise/user_management/saml_2.0_sso.adoc b/modules/admin_manual/pages/enterprise/user_management/saml_2.0_sso.adoc index 7586daca0..f4fd5fdcc 100644 --- a/modules/admin_manual/pages/enterprise/user_management/saml_2.0_sso.adoc +++ b/modules/admin_manual/pages/enterprise/user_management/saml_2.0_sso.adoc @@ -152,8 +152,6 @@ Use `upn` as `uid` and set the app mode to 'SSO Only' by running: {occ-command-example-prefix-docker} shibboleth:mapping -u upn ---- -NOTE: Run this command inside the ownCloud Docker container. - `displayName` and email are only relevant for `autoprovisioning` mode. Add Claims in ADFS and map them in the `attribute-map.xml` if needed. diff --git a/modules/admin_manual/pages/enterprise/user_management/user_auth_shibboleth.adoc b/modules/admin_manual/pages/enterprise/user_management/user_auth_shibboleth.adoc index 46bf134a2..a7cb57098 100644 --- a/modules/admin_manual/pages/enterprise/user_management/user_auth_shibboleth.adoc +++ b/modules/admin_manual/pages/enterprise/user_management/user_auth_shibboleth.adoc @@ -54,8 +54,6 @@ You can also change the app mode and environment mappings by using the `occ` com {occ-command-example-prefix-docker} shibboleth:mapping --uid login ---- -NOTE: Run this command inside the ownCloud Docker container. - In *Single sign-on only* mode the app checks if the environment variable for the Shibboleth session, by default *Shib-Session-Id*, is set. If that is the case it will take the value of the environment variable as the `uid`, by default `eppn`, and check if a user is known by that `uid`. In effect, this allows another user backend, e.g., the LDAP app, to provide the `displayname`, `email` and `avatar`. @@ -90,8 +88,6 @@ From 3.1.2 you can now specify a mapper that is used on inbound ownCloud user ID uid_mapper --value="OCA\User_Shibboleth\Mapper\ADFSMapper" ---- -NOTE: Run this command inside the ownCloud Docker container. - You may view the currently configured mapper using: [source,bash,subs="attributes+"] @@ -99,8 +95,6 @@ You may view the currently configured mapper using: {occ-command-example-prefix-docker} shibboleth:mapping ---- -NOTE: Run this command inside the ownCloud Docker container. - The following mappers are provided with the app: [cols="2",options="header"] diff --git a/modules/admin_manual/pages/maintenance/backup_and_restore/backup.adoc b/modules/admin_manual/pages/maintenance/backup_and_restore/backup.adoc index 56b2e69bb..44c1f7d2c 100644 --- a/modules/admin_manual/pages/maintenance/backup_and_restore/backup.adoc +++ b/modules/admin_manual/pages/maintenance/backup_and_restore/backup.adoc @@ -70,8 +70,6 @@ Before backing up the database, set your ownCloud instance into maintenance mode {occ-command-example-prefix-docker} maintenance:mode --on ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: This guide uses a backup file name like `owncloud-dbbackup_.bak`. === MySQL/MariaDB @@ -140,8 +138,6 @@ Perform the following tasks to reactivate your ownCloud instance: {occ-command-example-prefix-docker} maintenance:mode --off ---- -NOTE: Run this command inside the ownCloud Docker container. - .Enable browser access Start your web server, or alternatively enable the virtual host serving ownCloud: [source,bash] diff --git a/modules/admin_manual/pages/maintenance/enable_maintenance.adoc b/modules/admin_manual/pages/maintenance/enable_maintenance.adoc index 64e6dfbea..bf7b05aa3 100644 --- a/modules/admin_manual/pages/maintenance/enable_maintenance.adoc +++ b/modules/admin_manual/pages/maintenance/enable_maintenance.adoc @@ -15,8 +15,6 @@ To enable maintenance mode, run the following command: {occ-command-example-prefix-docker} maintenance:mode --on ---- -NOTE: Run this command inside the ownCloud Docker container. - You may also put your server into this mode by editing config/config.php. [source,php] @@ -33,8 +31,6 @@ To disable maintenance mode, run the following command: {occ-command-example-prefix-docker} maintenance:mode --off ---- -NOTE: Run this command inside the ownCloud Docker container. - You may also put your server into this mode by editing config/config.php. + [source,php] diff --git a/modules/admin_manual/pages/maintenance/encryption/migrating-from-user-key-to-master-key.adoc b/modules/admin_manual/pages/maintenance/encryption/migrating-from-user-key-to-master-key.adoc index f7d732114..8a5345d46 100644 --- a/modules/admin_manual/pages/maintenance/encryption/migrating-from-user-key-to-master-key.adoc +++ b/modules/admin_manual/pages/maintenance/encryption/migrating-from-user-key-to-master-key.adoc @@ -49,8 +49,6 @@ You can see an example of calling the commands listed below, configured to requi {occ-command-example-prefix-docker} app:disable --no-interaction encryption ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: The decryption of the files by the ownCloud administrator requires the current passwords of all users! This only works when users have enabled password recovery and if an admin recovery password is available. === Remove the Encryption Records from the ownCloud Database @@ -93,8 +91,6 @@ The following example shows how to do this on the command line. {occ-command-example-prefix-docker} encryption:encrypt-all --yes ---- -NOTE: Run this command inside the ownCloud Docker container. - == Verify the Encrypted Files With the files encrypted using Master Key-based encryption, you should now verify that everything worked properly. To do so, run a `SELECT` query in your database which returns all files from the `oc_appconfig` table where the `appid` column is set to `encryption`. You should see a number of records, as in the output of the example below. diff --git a/modules/admin_manual/pages/maintenance/export_import_instance_data.adoc b/modules/admin_manual/pages/maintenance/export_import_instance_data.adoc index 3c0cc6ccb..a63e2a2b1 100644 --- a/modules/admin_manual/pages/maintenance/export_import_instance_data.adoc +++ b/modules/admin_manual/pages/maintenance/export_import_instance_data.adoc @@ -46,8 +46,6 @@ This will create a folder `/tmp/export/user1` which contains all the files and m {occ-command-example-prefix-docker} instance:export:user user1 /tmp/export ---- -NOTE: Run this command inside the ownCloud Docker container. - === Copy the Export to the Target Instance Copy the created export to the target instance, for example, using `scp`: @@ -67,8 +65,6 @@ to federated shares pointing to the source instance: {occ-command-example-prefix-docker} instance:import:user /tmp/export/user1 ---- -NOTE: Run this command inside the ownCloud Docker container. - NOTE: A new user's last login timestamp on the target instance will be set to the current time. The import command sets up the user's file system and the system does not need to do any further "first login" processing when the user first logs in to the target instance. === Recreate all Shares to Point to the Target Instance @@ -81,8 +77,6 @@ they point to the target instance. To do so, run this command on the source inst {occ-command-example-prefix-docker} instance:export:migrate:share user1 https://newinstance.com ---- -NOTE: Run this command inside the ownCloud Docker container. - === Delete the User on the Source Instance Finally delete `user1` on the source instance: @@ -97,8 +91,6 @@ on the target instance. See xref:known-limitations[Known Limitations] for furthe {occ-command-example-prefix-docker} user:delete user1 ---- -NOTE: Run this command inside the ownCloud Docker container. - == What is Exported - Files (Local) diff --git a/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc b/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc index f1f814b20..d513b269f 100644 --- a/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc +++ b/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc @@ -53,8 +53,6 @@ To enable maintenance mode, run the following command. {occ-command-example-prefix-docker} maintenance:mode --on ---- -NOTE: Run this command inside the ownCloud Docker container. - == Sync your Data Directory [source,bash] @@ -160,8 +158,6 @@ To fix the config.php settings: {occ-command-example-prefix-docker} config:system:set --value /mnt/owncloud/data datadirectory ---- -NOTE: Run this command inside the ownCloud Docker container. - === Adjust config.php . Change the `datadirectory` key in your `config.php` to the new path. @@ -178,8 +174,6 @@ To disable maintenance mode of your instance run the following command: {occ-command-example-prefix-docker} maintenance:mode --off ---- -NOTE: Run this command inside the ownCloud Docker container. - == Start the Web Server [source,bash] @@ -193,5 +187,3 @@ sudo service apache2 start ---- {occ-command-example-prefix-docker} files:scan --all ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc b/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc index 578e0f944..92a235eef 100644 --- a/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc +++ b/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc @@ -20,16 +20,12 @@ Check if it is disabled: {occ-command-example-prefix-docker} app:list --disabled configreport ---- -NOTE: Run this command inside the ownCloud Docker container. - Enable it if it was formerly disabled: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} app:enable configreport ---- -NOTE: Run this command inside the ownCloud Docker container. - === Generate via webUI To generate a config report using the webUI, navigate to: + @@ -44,8 +40,6 @@ To generate a config report from the command line, run the following command fro {occ-command-example-prefix-docker} configreport:generate > config_report.txt ---- -NOTE: Run this command inside the ownCloud Docker container. - == ownCloud Server Log File === Generate via webUI @@ -77,5 +71,3 @@ If LDAP is used, viewing the LDAP configuration is important when checking for e ---- {occ-command-example-prefix-docker} ldap:show-config > ldap_config.txt ---- - -NOTE: Run this command inside the ownCloud Docker container. diff --git a/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc b/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc index 38cd62660..0b8518e05 100644 --- a/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc +++ b/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc @@ -38,8 +38,6 @@ Use the following command to list all active background jobs triggered by ownClo {occ-command-example-prefix-docker} background:queue:status --display-invalid-jobs ---- -NOTE: Run this command inside the ownCloud Docker container. - The output may look like the following: [source,plaintext] @@ -65,8 +63,6 @@ When you have identified the `ID` of the background job to be removed, run foll {occ-command-example-prefix-docker} background:queue:delete ID ---- -NOTE: Run this command inside the ownCloud Docker container. - WARNING: Deleting a job cannot be undone. Be sure that you want to delete the job before doing so. === Remove Jobs Manually Added via Crontab diff --git a/modules/admin_manual/partials/configuration/server/disable-single-user-mode.adoc b/modules/admin_manual/partials/configuration/server/disable-single-user-mode.adoc index 5e1377556..8257c6290 100644 --- a/modules/admin_manual/partials/configuration/server/disable-single-user-mode.adoc +++ b/modules/admin_manual/partials/configuration/server/disable-single-user-mode.adoc @@ -6,5 +6,3 @@ With encryption migrated from User Key-based encryption to Master Key-based, dis ---- {occ-command-example-prefix-docker} maintenance:singleuser --off ---- - -NOTE: Run this command inside the ownCloud Docker container. From 9eb0fa262a54f1cd3491f24e35099ba9d299d778 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Fri, 5 Jun 2026 10:17:07 +0200 Subject: [PATCH 25/38] remove db_conversion and other updates --- .../configuration/database/db_conversion.adoc | 108 ------------------ .../pages/configuration/database/index.adoc | 7 -- .../linux_database_configuration.adoc | 1 + .../server/index_php_less_urls.adoc | 2 +- .../configuration/server/occ_command.adoc | 23 ++-- modules/admin_manual/partials/nav.adoc | 3 +- 6 files changed, 16 insertions(+), 128 deletions(-) delete mode 100644 modules/admin_manual/pages/configuration/database/db_conversion.adoc delete mode 100644 modules/admin_manual/pages/configuration/database/index.adoc diff --git a/modules/admin_manual/pages/configuration/database/db_conversion.adoc b/modules/admin_manual/pages/configuration/database/db_conversion.adoc deleted file mode 100644 index a93ad85a9..000000000 --- a/modules/admin_manual/pages/configuration/database/db_conversion.adoc +++ /dev/null @@ -1,108 +0,0 @@ -= Converting Database Type -:toc: right -:page-aliases: go/admin-db-conversion.adoc - -== Introduction - -SQLite is good for testing ownCloud, as well as small, single-user, -ownCloud servers. But, *it does not scale* for large, multi-user sites. -If you have an existing ownCloud installation which uses SQLite, and you -want to convert to a better performing database, such as _MySQL_, -_MariaDB_ or _PostgreSQL_, you can use -the ownCloud command line tool: xref:configuration/server/occ_command.adoc#convert-the-database-type[occ]. - -NOTE: ownCloud Enterprise edition does not support SQLite. - -== Preparation - -Add the following to your ownCloud `config/config.php`: - -[source,php] ----- -'mysql.utf8mb4' => true, ----- - -Add, or adjust, the following in `/etc/mysql/mariadb.conf.d/50-server.cnf`: - -NOTE: You can do the same for MySQL by replacing `mariadb.conf.d/50-server.cnf` with `mysql.conf.d/mysqld.cnf`. - -[source,mysql] ----- -key_buffer_size = 32M -table_cache = 400 -query_cache_size = 128M - -#in InnoDB: -innodb_flush_method=O_DIRECT -innodb_log_file_size=256M -innodb_log_buffer_size = 128M -innodb_buffer_pool_size=2048M -innodb_buffer_pool_instances=3 -innodb_io_capacity = 500 -innodb_file_format=Barracuda -character-set-server = utf8mb4 -collation-server = utf8mb4_general_ci ----- - -== Restart the Database Server - -When you have changed the database parameters, restart your database by running following command: - -[source,bash] ----- -sudo service mysql restart ----- - -== Run the conversion - -After you have restarted the database, run the following occ command in your ownCloud root folder, to convert the database to the new format: - -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} db:convert-type [options] type username hostname database ----- - -[NOTE] -==== -The converter searches for apps in your configured app folders and uses the schema definitions in the apps to create the new table. -As a result, tables of removed apps will not be converted — even with option `--all-apps` -For example: - -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} db:convert-type --all-apps mysql oc_mysql_user 127.0.0.1 new_db_name ----- -==== - -To successfully proceed with the conversion, you must type `yes` when -prompted with the question `Continue with the conversion?` On success -the converter will automatically configure the new database in your -ownCloud config `config.php`. - -== Unconvertible Tables - -If you updated your ownCloud installation then the old tables, which are -not used anymore, might still exist. The converter will tell you which ones. - -[source,plaintext] ----- -The following tables will not be converted: - oc_permissions ----- - -You can ignore these tables. Here is a list of known old tables: - -* `oc_calendar_calendars` -* `oc_calendar_objects` -* `oc_calendar_share_calendar` -* `oc_calendar_share_event` -* `oc_fscache` -* `oc_log` -* `oc_media_albums` -* `oc_media_artists` -* `oc_media_sessions` -* `oc_media_songs` -* `oc_media_users` -* `oc_permissions` -* `oc_queuedtasks` -* `oc_sharing` diff --git a/modules/admin_manual/pages/configuration/database/index.adoc b/modules/admin_manual/pages/configuration/database/index.adoc deleted file mode 100644 index b0a283a0f..000000000 --- a/modules/admin_manual/pages/configuration/database/index.adoc +++ /dev/null @@ -1,7 +0,0 @@ -= Database - -In this section, you can find out about - -- xref:configuration/database/db_conversion.adoc[Converting your Database Type] -- xref:configuration/database/linux_database_configuration.adoc[Database Configuration on Linux] - diff --git a/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc b/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc index 06a752251..d7dcd7317 100644 --- a/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc +++ b/modules/admin_manual/pages/configuration/database/linux_database_configuration.adoc @@ -1,5 +1,6 @@ = Database Configuration on Linux :toc: right +:page-aliases: configuration/database/index.adoc, configuration/database/db_conversion.adoc :description: ownCloud requires a database in which administrative data is stored. :avoid-deadlocks-galery-haproxy-url: https://severalnines.com/blog/avoiding-deadlocks-galera-set-haproxy-single-node-writes-and-multi-node-reads diff --git a/modules/admin_manual/pages/configuration/server/index_php_less_urls.adoc b/modules/admin_manual/pages/configuration/server/index_php_less_urls.adoc index f106e7142..d02cb8043 100644 --- a/modules/admin_manual/pages/configuration/server/index_php_less_urls.adoc +++ b/modules/admin_manual/pages/configuration/server/index_php_less_urls.adoc @@ -7,7 +7,7 @@ Note that with the Docker Image provided by ownCloud, `index.php` less URLs are == Check -You can check this by listing the `config.php` file via the bind mount after the first setup which will contain the following keys. Note that the URL matches your setup: +You can check this by printing the `config/config.php` file via the bind mount after the first setup which will contain the following keys. Note that the URL matches your setup: [source,php] ---- diff --git a/modules/admin_manual/pages/configuration/server/occ_command.adoc b/modules/admin_manual/pages/configuration/server/occ_command.adoc index 47e1add06..abb926382 100644 --- a/modules/admin_manual/pages/configuration/server/occ_command.adoc +++ b/modules/admin_manual/pages/configuration/server/occ_command.adoc @@ -11,37 +11,40 @@ toc::[] -== Running occ +== Running occ Commands -All `occ` commands must be run inside the running ownCloud Docker container. There are two ways to do this. +In order to run any `occ` command, the ownCloud container must be up and running. Two different methods exist for initiating occ commands. -=== Running a Single occ Command +NOTE: For any of these methods, you must be in the directory where the compose file is located to access the running container. -To run a single `occ` command without entering the container, use `docker compose exec` from the directory containing your `docker-compose.yml`: +NOTE: Any occ examples use the host method to access occ. + +=== Using occ via the Host + +Use the command `docker compose exec owncloud` and replace `` with the command you want to execute. Please note that this is the preferred method, particularly when using scripting. [source,docker,subs="attributes+"] ---- {occ-command-example-prefix-docker} ---- -[[docker-exec]] -=== Opening a Shell Inside the Container +=== Using occ via the Containers Shell -To run multiple commands interactively, open a bash shell inside the container: +Issue the following command to open a bash shell inside the container: [source,bash] ---- -docker compose exec owncloud bash +docker compose exec owncloud /bin/bash ---- -Once inside, run `occ` commands directly: +Once on the containers shell, run `occ` commands directly and replace `` with the command you want to execute: [source,bash] ---- occ ---- -Type `exit` to leave the container shell. +Type `exit` or press kbd:[CTRL D] to leave the containers shell. === occ Command Structure diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index ababd3151..eadff4714 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -18,8 +18,7 @@ ***** xref:admin_manual:installation/apps/mediaviewer/index.adoc[Media Viewer] ** Configuration -*** xref:admin_manual:configuration/database/index.adoc[Database] -**** xref:admin_manual:configuration/database/linux_database_configuration.adoc[Database Configuration] +*** xref:admin_manual:configuration/database/linux_database_configuration.adoc[Database Configuration] *** xref:admin_manual:configuration/files/encryption/index.adoc[Encryption] **** xref:admin_manual:configuration/files/encryption/encryption_configuration.adoc[Encryption Configuration] From d6d8d78216cda77164e6a926bc7e53b60e79d480 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Fri, 5 Jun 2026 11:38:55 +0200 Subject: [PATCH 26/38] create own docker image --- .../files/external_storage/smb.adoc | 6 +++-- .../files/previews_configuration.adoc | 4 +++- .../enterprise/authentication/kerberos.adoc | 4 +++- .../windows-network-drive_configuration.adoc | 9 ++++--- .../pages/installation/create_own_image.adoc | 24 +++++++++++++++++++ modules/admin_manual/partials/nav.adoc | 1 + 6 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 modules/admin_manual/pages/installation/create_own_image.adoc diff --git a/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc b/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc index 00a1c8c6f..1f61d5a8d 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc @@ -11,11 +11,13 @@ == Dependencies -All dependencies are provided by the ownCloud image. +All dependencies to connect to an SMB server, except for testing the connection manually, are provided by the ownCloud image. == Access Testing -To ensure that you can connect to your file server with SMB, do a small test upfront like the following. Note that the `smbclient` command is not part of the ownCloud Docker image and must be provided and issued from the host. +IMPORTANT: The Docker image does not provide the `smbclient` CLI tool. To mitigate this issue, you need to manually create an image that installs and enables this requirement. + +To ensure that you can connect to your file server with SMB, do a small test upfront like the following. [source,bash] ---- diff --git a/modules/admin_manual/pages/configuration/files/previews_configuration.adoc b/modules/admin_manual/pages/configuration/files/previews_configuration.adoc index 36535376f..e8b180ded 100644 --- a/modules/admin_manual/pages/configuration/files/previews_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/previews_configuration.adoc @@ -58,7 +58,9 @@ If you want to add or change the default list, you MUST define all elements used == Prerequisites -When defining your own preview providers, some things need to be considered. For some file types, ownCloud uses ImageMagick to generate previews. The ownCloud Docker Image provides the `imagic` php extension, but not the ImageMagick binary. To mitigate this issue, you need to manually create an image that installs this requirement. Please note that other binaries may be required, which are listed in the relevant section. +When defining your own preview providers, some things need to be considered. For some file types, ownCloud uses ImageMagick to generate previews. + +IMPORTANT: The ownCloud Docker Image provides the `imagic` php extension, but not the ImageMagick binary. To mitigate this issue, you need to manually create an image that installs this requirement. Please note that other binaries may be required, which are listed in the relevant sections below. Starting with version 7 of ImageMagick, additional file formats like SVG or HEIC and many others can be processed. diff --git a/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc b/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc index 1841e6f00..b2719c463 100644 --- a/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc +++ b/modules/admin_manual/pages/enterprise/authentication/kerberos.adoc @@ -135,7 +135,9 @@ The administration server. This is typically the same as the LDAP/Active Directo ** If this is not the case, you need to https://wiki.samba.org/index.php/Setting_up_Samba_as_a_Domain_Member[Setting up Samba as a Domain Member]. //// -* The Docker image does not provide the required Kerberos `krb5` PHP extension and the `krb5-user` CLI tool. This tool is an actual requirement, the Kerberos implementation in the WND app requires the `kvno` command which is contained in the package installed. To mitigate this issue, you need to manually create an image that installs and enables these requirements. +* {empty} ++ +IMPORTANT: The Docker image does not provide the required Kerberos `krb5` PHP extension and the `krb5-user` CLI tool. This tool is an actual requirement, the Kerberos implementation in the WND app requires the `kvno` command which is contained in the package installed. To mitigate this issue, you need to manually create an image that installs and enables these requirements. * DNS records + Create a DNS record for the public FQDN of the ownCloud instance (``). diff --git a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc index 1c1a8d032..f7fc00ab3 100644 --- a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc +++ b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc @@ -95,9 +95,12 @@ Files are synchronized bidirectionally, and you can create, upload and delete fi Depending on the authentication method, passwords for each mount are encrypted and stored in the ownCloud database, using a long random secret key stored in `config.php`. This allows ownCloud to access the shares when the users who own the mounts are not logged in. This access will not work if the mount is session based, where passwords are not stored and are available only for the current active session. In case other users are granted access to this mount, they will see a red triangle with an exclamation mark on the bottom right of the mount icon identifying lack of access. -TIP: For more information on SMB/CIFS in ownCloud, refer to the xref:configuration/files/external_storage/smb.adoc[Samba file server configuration documentation]. - -TIP: If you encounter errors when using the WND app like `NT_STATUS_REVISION_MISMATCH`, please get in touch by {oc-support-url}[Opening a Service Request]. +[IMPORTANT] +==== +* For more information on SMB/CIFS in ownCloud, refer to the xref:configuration/files/external_storage/smb.adoc[Samba File Server Configuration] documentation. +* Please note that the referenced document provides additional information on testing an SMB connection with `smbclient`. This CLI tool is not included in the shipped image, but can be added. +* If you encounter errors when using the WND app like `NT_STATUS_REVISION_MISMATCH`, please get in touch by {oc-support-url}[Opening a Service Request]. +==== IMPORTANT: The remote Windows/Samba file server requires at least {smb2-url}[version 2.0 of the SMB protocol]. diff --git a/modules/admin_manual/pages/installation/create_own_image.adoc b/modules/admin_manual/pages/installation/create_own_image.adoc new file mode 100644 index 000000000..29d6fd947 --- /dev/null +++ b/modules/admin_manual/pages/installation/create_own_image.adoc @@ -0,0 +1,24 @@ += Create an own Docker Image +:toc: right +:description: The ownCloud image can be extended with additional functionalities. + +== Introduction + +The image provided by ownCloud can, and sometimes must be extended with binaries that are not part of the package. + +== When to Build an own Image + +You can build your own image at any time to add binaries or functionalities that are not included in the shipment. To do so, create your own Dockerfile with your requirements and use the provided ownCloud image as the basis for your work. + +In some situations, creating your own image is mandatory because certain apps or configurations require binaries that are not included in the image. These binaries have not been added on purpose in order to keep the image as slim as possible, and because situations requiring them depend on individual use cases. + +Apps or Configurations that Require Building an own Image:: ++ +-- +The following references link to the relevant pages that describe the reason when building individual images may be required. + +* xref:admin_manual:configuration/files/external_storage/smb.adoc[SMB] +* xref:admin_manual:enterprise/external_storage/windows-network-drive_configuration.adoc[Windows Network Drive Configuration] +* xref:admin_manual:enterprise/authentication/kerberos.adoc[Kerberos Authentication] +* xref:admin_manual:configuration/files/previews_configuration.adoc[Preview Configuration] +-- diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index eadff4714..40ce71e29 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -11,6 +11,7 @@ **** xref:admin_manual:installation/deployment_recommendations/nfs.adoc[NFS] *** xref:admin_manual:installation/system_requirements.adoc[System Requirements] *** xref:admin_manual:installation/installing_with_docker.adoc[Installing With Docker] +*** xref:admin_manual:installation/create_own_image.adoc[Create an own Docker Image] *** xref:admin_manual:installation/mount_folder_structure.adoc[Mount Folder Structure] *** xref:admin_manual:installation/configuration_notes.adoc[Configuration Notes] *** xref:admin_manual:installation/apps_management_installation.adoc[Apps Management] From 1dedb83069976fd1ffc02c23ba1f9e68e4748734 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Mon, 8 Jun 2026 12:35:43 +0200 Subject: [PATCH 27/38] apps management --- .../top_menu_showing_market_app.png | Bin 18382 -> 12118 bytes .../installation/apps/mediaviewer/index.adoc | 36 ------------------ .../apps_management_installation.adoc | 14 ++++--- .../pages/installation/apps_supported.adoc | 27 +++++++++---- modules/admin_manual/partials/nav.adoc | 1 - 5 files changed, 28 insertions(+), 50 deletions(-) delete mode 100644 modules/admin_manual/pages/installation/apps/mediaviewer/index.adoc diff --git a/modules/admin_manual/images/installation/top_menu_showing_market_app.png b/modules/admin_manual/images/installation/top_menu_showing_market_app.png index 5417267aacf7f8399f242de768ec03a34ee81d73..cbb8de265735ed49b7fdd04799fafd9a1a8e4203 100644 GIT binary patch literal 12118 zcmch7g;$ha^zKW^00Kh@NDhcn5=!?F(%m31fKo%3G>n9Rl#g^P*Fiv3ji>}(O(GY5qhTb z@p=IOaMLNuO6ho|?=Rq{lW#2G9z87X^Dl3=m2TU~GO@~zg79-6$>>8hpRrTelgM@& zfFh`6zrVqjA`HjT#KulE>nYaR$#$38*>`(++IZkYB0I*?% zpqCQ-e_iU5JCenf6R;pk20)7;kX6|wNsrtBeNQF;q2WR%+x?BCaWspog{K&Gd)m`z zb59vLyccM5D(bU2Cc5MFu4ptakp>Td%;%DVmABOM6?RA8vG#o4sin~J_BKN~-dQ$o z-FR0RX-%^4xUXDqK_CExNh3JCI>KqVV0`>F{?vtu@6cdY!#`#Kp#X&nbx$u<<(54X zmz`<4#sxInMSa4xH8wRcy!>Zqt8{pVx3Jtb!jpC(;fHW z$&3=WUIApQqJQ3+XmCx(x|1}2nSS1S zKJ$R29<=3>E;l;Ob9|LyI*o4U$&MWc;_pX<0)(P3Y?ZG=_eg`|j{ zb2>G$>`jJfT@HsxeO}6Gd(IZiNWSZ^M%kxx_yobbg96@E!CZgb*wK?o$%&P6V-Zsw zm3sL5@suKd0hWK~hc0Z<^pc4ber*ZB&n7S!Z?)C!Pd4R)OO|&+;L9JlG}ek$n}ck)qyV zGH&sH+wJBiOgCvnSHmlvg3Cw^SoRZ|l*7DoYm6+m&GR`sNvo|}fjCE-jlXqc6BdrR z`EV)WAfFh;cUn_j9S%TVK_H~iDh{qf<7ZUuw~hr%{(_D(iYQ{su~3J=t@?n&`(N&L z*`xLnt1)mOJa8NB1Pq&MAe)X2yMRJp2LA~5NEG%Tkvum4miL^Ai8unK;p)d@$G3Xx zu1#WhkLO9m&+l;DN0uedkbR7DZb)BuX3=B-5@1d*8`36pBz=0wsTv_-$Cl@1W>54=3~7$^Qy=dh&{mqT0f^Y$%bH$``N(C)#nqzU^O|MQ-!#-Da{Vcp3~cM8*&J97H4#ZJGW;km%P zYuK$B_HWWECB#H%LW3?w@K@0=#$_EEUA(yg}vE#?zK0U&5MwNgvi`&;=Wl!iER!-yaj zf%)G)m=VO1*T2)H#9g<~b=KC43!PWYY&`S`X4~C}F%Y$AlVkP`^cTGvQ7^D&piy#) z3jB6|z3OgM>r(as=J-kEFg?k=JbTnGK<0ryd93r-%-OG4nxRvH9cRvsV{<`mtNK#D zcL)0aX`!itw~E@>+xghhAsxsd@$E&d?`S$_o6j%3yjZ3Ydy0W_qtH~oQoBzw71Wba z(3H(5;EMYy9Fql)Y~ehgwN2P|GVD@Q?Ot#6iYyB;U@(5!5b0JA+-7mVlc zB-OtGH%fe8K!NWG>*c^;1%osL#RdOoGdr?QPc2jl|F#4c3d-8p#tlGQPq|dp6GPxL zY`C9v%>zq!`gM2IK!XTp!%E~dHPVAClCd(85F-Qx2q`Y#;obNqDEszpl!6HMvcJH| zQd4CiRfGEvJp&y61YRh!BeEB)`xuZvy2al(Bs~}}U!^y1icEffPe#rXl-=6JxIzYg zLWtX9R*jDx_$~kgSj}=$G&s;|u)+Mr#VY-T)X~Fwy!`_DON#6<*PVYWhuZskbb9pT zxOC7GnaOsCXV6k@Oi7XKeyKjp*VB&jb86wsnBv;^PyF)T%N{_4SO^zR=AvdSpOAkH z!N!?taF3fqmH3+yG?m{>n-o>Htj{8}j(iUopnnab`=!GHs2J;I6O)aSuxW#!X9`8Ga7$Fqx(oFT0;a{;@0Ds_`?&n2H5}TqRg|Q@)z@g7|>R zxE}w@{A?i-d@g^5zkGs*ZCY7!73JmSWc4HguWd>81_lQFxRjNZ#T$D(+U=Lx#W4Wr z`wD~aL2>c%Y;0`(t?o~EAeE;DKR98p+Y=}g4TD+rea8wAUnq$%Nglh}gnvO}oj$S+ zZpstC3>j#`n997Bt2cKTW|h877pD_B!D0RsGcsGlj?51a0KT#ez+BjZq`3w+YD|z+ zoGEhA&l+51f%_)DRvMhOx5i{1ZrXk>h~vX4!}*BD@}qJ zM8o4`f?>31PzDiMM}Rva12**(jK%(>&8f0+ez^7WZ|9{#f()vr=tsNJs6@P3kItlt zvl6wJP9cVoGey0QJ3jnXL$sI#4d}+qb?N64SDIhLe(%L0pPYD{H;CA((OsZX=~rug zuCk5VO8eI)jOD4xqqrCVm~OWY3k@>rJ331@AyX`d`^<;M%Cs%J=*MJZ zbQ=+^CXJ?-RIeLNf{HQB_&?+MgTYRzg0?EaSdHCfX7+{tphZ)Zo_Z}KHypRV`AlO6o;$DMeI?nyCT$p1`ltCg5flad!RFDR8+v0USoi%6q` zLybFD`0Y6fu9lUr+U0)Lnl#;5zA`%igo~9W(JeTXp?K@@23+YweCCz}{>SJB=c3z= za}L_mEgVMGd7A(Le#`!rYw&VyHbnFb-M&xHe`fjKS-R8-BmDJwf2Vyvv%Ay@6A1cM z(awpE$NzGf;8w;0tZW5F1qBK4TUAR7cQc*!7c65gdG>>9N`-BXg8M3pIm0C-XKz2J zS$x%n$v{-q8;Vec`0Z5Zp=j8Q*^Be=L_St4Ij^@^MhasR3Kr_hS$}U7_f-m}S0N44 ztxyUL2>8mW<-Xy}I`BRV0hSb6ImEktP7GYZjf|xmt*x~WZ^Z^!e@P`yAo<}R#7|C# zp9``@NEBx(I!%?^K9Voj2(&YLKF!tb^u_?M_>sB3GISr~XNUWm)B55wLp~vvFs-9Y zQp!>q-0?=st*)y=GCSP5fwNzEmWaQxw-wnlmo0DXQ`5Cvt zO5T`gkcp0kk1>cwf6>+<41M4h}YeTSs_F*RNDBm9rJsjM!) z>PKTT+JJSC2XE@*L#Mw#|J8;UY9x((pIO5Mv)pTFD3D$5PkazKe1#t;oRV@DI+l4C zPeQaE8t%|9_i=9X%BA+O*weKADSgdplmo+ULz<(*eBZy(7~Di65RwTv`|96 z3=8*HWWC+QEnK&R{LU+;^Fg0uVq$m$XYHXX(2;&2E%8l#L3XjVaaMyhx5;$=ci|JZ zacL9!u>AYa0U*F>KIM9M(O+VPXR!FyZIhvPYMLS8%Cgy;-wz9-{H5BSYY!(Jd5>7v zetvs@yQCkz+*jwE*lDwj4GLx@G zA6o2J=?pa^!bWi42m355BuzIzkxS#h6o%feu6nt*HP>;T>vRNPn}lm|GU;sa?luFA z$o^vCbX}eGrr~InKtX(>D2>m7Vr4fB9(z6&sCQByz44zEeO7|f3YMCLhK2?t$HkFi zI>*_$p0+v$8dXp`M8q@3E;D3(dYAIOuTr<2OpP=V0jl$l!op<4Q2T1`SH-P+L+_PO zz?{@r=KGKZvpiE2u9uS7O#22VT_)eh#~;>)gT$81>&G5|h>f&T-B!6$ex89UUb@+# z_3#uV6J-9NJL772*fn=EF)3+t63?=6n4ukJYg^J(EJ+au=ZikF9+|t!H$?|*(^wN@ zV|&MUt(?N2)C?#H_oJ*dXBu@&!M|^w(@VS=&|3QmrSJc}M93n*FH+cDVWS#Ez{kb+ z4v(_5XWZNS2Sn}j_+PI8I?Gf%@!O_jCQRrpNJOs6P*ncu_z!mRhIUV|a9ILEXiEqV ze#J(yWtYHCR@_bElkbwl9fmbM+FcU#27I))>Mv`C;6H!wm!?Gmj(}^YdOCC-$VPvE z%(55B!{s;m>;n-NwRLpf z6LDz-awKPEHSU<=R#9eb?Z#F`65Si@y;agS9dSYaAkDm?Q}A5A-a}JjND~ivJ&tB1 zc<$MlVTNmszfR>FXE%M;tTY1WCJ1Fc&T-n7g)H^qGu-DL^dt$nNzdWlTq85*Dq3xfm$j$5}7b>#K!yK%}3NWjv( zJkupCyq$FMx2j4+fD$o6K?*91aI{FLd*#AKAMPfC6Ksbsmam5$e03|^E4ZW<(M8-P zIyu}pFCEyrPCB44a@2Cj-Ek{D67BoR)zuXQV30^-J$jtYlI0hd%5Nu^!(%l>MJ@W_ zrEs({szk*>fseD~R6w>!08V;O*oLC_F}pfKTy|8;;FiKV=oh?E``8G%1+dTcMzRbA zk^R~B7#|$T>PmfHN1M3sMQI%uU68V+cHH9jC&$cWs(^#v{_ht63});KHHfC>XGIDz z)B7Dsxl&(mn`W@GXp7cO&b^K@#b2C;`71sdySeOO0r*}C1A=c|7*RvKBVV-pibz&M zt>w$&7iG8FZr_sTvMGvZe6q13<;i8^akCl`xN%S_R$ppQa6DdnGcS+4xIJx~^4OV8 zbaiv<$HT|Rw^^92$Ib~uID^J0R}#K}GbU&sGcjY{i4$Mns*2<~VPc;4-+FIaSP$P2 znqs&*JYa0Dl8b)$m!0NFC5uZ;3jxv5ei8{X8#D7@UmZdwC%vEScsR3{V-sms+04u6kw5o^$O%L*YAtz`UAVOswg(9tZB$`?86 zZMlm$t5zn$Gi5TLt~BAZ=mw<@G;G7EHDA?8AHR(850b2`EL1F z#IQ@VKY?DMB~eb}FWLqOptmlklJ z0{O4@xBTwz#$z+ZB=1gz z>aCb3LiF!dtJ+WSr7V8(=mVp(-~C%g=7W~*4rqhA|AUn_|GgTe`c((@m6~h6u_OMg zaT*0XwvJgZtTME-DA4|AwXu^S-km=!pKi*Rnk@-T{^nr4AyW?@?C)m;NurPE>W7rJ zuh~dUV5UW9@mJ!Be}=W7E`kgs7_5?@{4zrnru5zZAMY9~CucOIRU;T}V#WS`@;zfN zN-3|LM;L&Foa8+fov2TO#S_6-PberzLz2_NzPp@aaQnG(wXc(zAA4kyuyJh^{P^*= z_Q!&w+sYmQX1KrHZ*)I?L$|{n*pzZ(>PE=#IRA}^UIVzsvDC;luu{_F=n! zTV~*RSygVl(bunErO*j9AvG1wDiU0%cDv>X`mvPKG!( zUoAsaTj&kydgVW_y`nNF@0x#XzTp%rA$NRx>x_0#z%MALW`$%t<^9qeYbL7 zZ|?WC%mUT7jbq;eB@{bvwzSpLE~77lZq6pui`?Eez9|0o&B5Y?63AV4=}Hf`&hk&P z`jc+^2$4u9`r%tL?c;j8=|ZD=_*hlPy^@;sd8Vc>C^|zlFvqmbccOMAs^Iqa7I6@t zlAoZ}k&j za8?GFfj2{7`2|@lhoJY&IUUdOED}}b&$hdE`QE16uM^IfY>R@08#rV<>wsxnxIL^O@ypK|Z_*47h?ZN9b#^G)tEmdV~|ZCKoQ z#(P+e7mN1i8Yjl`p@m)K1&t1 zqbMjUGCY`WK0mZYF5Sy945uhdR+`Gt1T4x%wxcpL{cdbam$E-zNX%c0nJq(4eI78d zYz|tl>puLFtF3z1EkmpgDb=fhOKe?HnjT%Jsj8|L%zb*CW9YUyTFP%{J2~rd)+t|W zyL>*4^4ls@4NMC#XpTy4v@vhp3{0t#dMUW%N+4yHJC56l6XJLFl*m;`=qsy&$6gOf z&ELgJ6Vd;&H>Xiu_=Fj|yjncPwx39!c`kwK*tjelO4IVUY(cesW+`oxu zQ5Q(|M_r`ICk&?v77cQD%-e6?Z0E&_$uBmKXd)LeZAHpJP1(u)QYG~E&OrE)<{??E z@o$uv*Ac|ukxzBec}=y>y`OaM&gsXF+|6Gh=f1(gHR3ld#9`;%)24YFgGplv{Z%Pg zocPhfNfexFdA^4oS&I+LGP@IHEE`m~Or`9)rQ_(>TwFGGA$dHhZ#&meVU;zTxzN(j za8KWMvMY;@6uDoC#n*KOoE?^jOD2XMdZ&w2atLXr(x$opjeb0M*u%0qB1G-oWuoQ- zm)a8E+h<+&7x7sRyubN-B?^wA6O{vhEB4SjWoVmMA%QnbGnpQtNLAn5_6iOPQK$2m zV@5ya{asdVT5A<;`0Q#V@c!MW-r0J)VM+EyYcv+M`lgb~*Ix#hw)-_*dto|}@l(`) zNyK77-iF449^Di5S9P*sQA+P;G!{)D8w=CqFL9&paWWneQm1A#phI+x|4YY%y{Y<0 z;TyHz{o(`pUM|m#sPe&fD9`?S<`!JM))foxL z8^AFsP79R9psHH=*}c^hx>9ZaYlx_~D7sWqJ5594_DIIaiWZNEP6TM_&h^Iv*lvn7TFip)+P0~$&E!d zO(gNrk}HRl&6_rILQ92i*FY@F_xCRbaAaD0_o5|l8kYj*{QT};dW5c_qo`c6sZYt4 z1RBht1FhuPe&Z7TsC5BH_%F^csfYuQws3@%Y9Fq<)3?X^&%2ByG|jv(|qi9 z)0G)IRi@(m4OxNr!r6=kmK#OwMe{7q=UKj^4vmis?T5bx97_1_pbp#ff^mrqBo=d> z+6A`6oH_BNSzZv;%4k+c3ZM)ghfzim3AQM@&X?!eDSee+3&&KS533So2Qr!0yCX^;3-MJ(yTp3dqT0vFFaib-R_}sf3 zRMpu(#(cUp(s(y?C1Go8n>mu~@*q3c;9$Gn_jR+{$Z^SkE5p-fw$Ao!&Z$H5qgjFNPc%DsPkAw^iH70S8C`cbCNh){$Fc6S zwnds&=er35InF1dKLVE|_V0%N90KG|`K=raS7(;z?R%bGmODFa9QYm3#s)mKth;mF`Y@6y zzO$L;B!Kme&ILp348>_< zH^K#%IS2Qx1(_Z1wd+SFf*Nl*)*pUtW%96X6g1nHo)e{Kk!fR?zj2pF?bSsUA->EFZFHFq!6~w^vP^^JS&z$Y zr0mHu=1b4c+($gTyK=oU|DeeL+D=1bx+|&CTpe=f;saHx?mT5%yQEcy;v?|}EQcHt z$}O`xmUO!GjYj11YRA4A!l(Y!@7?uak~SI|GH<C~FkWfVaKh`BrbmuJSUSnnfun^S8U%j$bw*y(B}49*2M139e?J z-*5(_BFNfsZm86l@h#62nBl$rje|tALZf0uTId46&iOQ~h)^yuUG$sxYvaACiXEl3 zaHsyb=bQF+0^P*}r~W^(%qL5At$OJt87Lp4(QZ+iV{=5N&o0|3`TEN4=#$Q8BZd0E z6doJa-#qBaKacQ+H2eP&mw%C#m8M4LGPw-dGW)ER^YdBKr$ztR8OffaDG>6Z-Q>Mm zVcPBQw6lRh?x(}hz2T8~(PnQ_`stSp{_n}}{D&l2kypM)*<)Y-Y&kct{b|{*S0oeP zJ47cVFIA^eu{^AR<}rD+Z^kAhrz!6|eTuBJ<=yqtl+P2cppN#rVyx;-zZ-k$mXG`* zdXUZCaTPQWeW^8B{5%wOw&anJ>XalSKhk3lE$)O=>5H0G&_C1bdv_Y#6gz9r9M2G| zp4Z88y#~uzOPLgV`L(yijYR+#G~%&b$ZCG^Z^r7BBsRcj`6KQS8P53N3AC9rj^Y4I! z8xG$JdJGN+=5)%{ZonQ93lP96I~@ez6o(^TBahPx&2L|ENU;1>$orDT;}SRX^0(B_ ztM&M4>N|F<%9faWr{brNr~9rs_A{TS1fA_o)56$%NplS zOrQ5i1^lAIp2c4gmrWVMW=PArvBbg24^1Lmr5C%{&%H0W8;_5>rkjRqnbtSS$K+`H zsJyQEBT*tdLlxkb|JqfZKGv7?aG1e%lfQo6r!$ZAEG?R|O5Py5p-!31xh$&sq!q$l zT)zjCmSEH?7DvM6U}=dpPVN)KxN9>l({*0<$P=xEMpuT6rc4XOd3D zW}~2mp$c|LF~1H)YBD4>$tvG>IKbu|pWq~S#9@T@^4|Pf@9;g#M|tiFHFXx2&nfZe zJ*)39u!BXJ1oJaQwALjn?M_|sNR=Oq4^K7yoz7&0UBWpcmw1ygWINM`;HHgEL;VHp zcvmR$h|-UmZrf$))y|bC8P25G*ig`L|4_bP2}5-6uO+e|H_DH^V(wR<0%a`A3#$47 zZd$Q8LJSPBw6~m)inbN?QrFg?bePBd-q$R3@#r@KC3?ffs!5M=(1OBMOAIH(T*s)H^!89l!W^lGfT9?tmK<)*>pDCLa{JU34z*1E$l`5;J+=L~a(@ON?mY#tn|#iH}fr<0V7_x^Bq_W+Pbz>WBQ&plxsXa=40SA_1b7& zUY~gfBVFZdp=^Xk*8Hvr5Te#D6WB|Y+gq7lsbEN_L)gWIzVHFLktTT@Bs$81-xGlD z+tRPFR&j`Hs zcQYn;>eYixo>nAXuDW!$D>k##_&6_+L8u_~Pbk-zDZzA!*9V4)WA{WS74#ha2U6t+ z%!ecYwV=DxZr}BSAk^$93$^UASez3T7s@A|@@2T%!I&5r$IRT44E3OJq5D4@Y?5!O z!_5XZ%m(0t2(W|pZhW7EUgwJ^hw_kVOlbOWn(z3H~InFcjgnpwUp zv4&uE=f#a{&H63_mU?A!lchR23FPU`kELUSKc*$JYq@>d8F*i&0jit-5SdXS$2}v? zD2+*q@vx$I5lab4m)6wVn_{`1Q>+j-;8YZHdJI5yoUiw)qO6+DD;i=sD#I6@Tv%FU zS1I$_A?U&#)O~y4oi|-A$8^OFbL*$3Sv=;KXe*y!;^72dP9LWza*lViJFMf9C9j5} zt4izrmeocQk$byLjnw@pZ}G|ljExKSGCopnR$<|%swx1W$qXklrr&D@zR^BjZ8#X; zbE(MG(6`h0B}IhSuA-{?9Nm|vgm^C8Ud>)4IQc#`E$-ik>e9Gy7Jco=s@SKz zpJp2zl+nv1jQ_ZLmnC(sHke#jQSv43h#NKEwR+UWVaRGW~H;I)u6J)9w$ zOu=QWKqKgwpPS2sR(4>8$o9bP$H@T4a4J^V$GQCr>|g_=M>F~g%gpp^2Ph8-$W_6) zbEHuid%b#efnwUb4b31`grmAoKkuFF9k-e#6G%GY12NegRmeOa6WB+iFOkxj1OZKj z5ZsS{D;K8-1M6v=nNQQp)vfr|k{G@acpv}F1-2+V8M8&-LMX3R;|_}m=#LFth5D*w zC_x}RAl$OKkk*9d`y>S7(VpT{GDRfoRh)rrhJ4AItK8||KOBzecfDn10?V?0_K1S9 z+AjXkg@&7H$VgZ6_l*<;e*q8%@2CGbc`S++QvB0%`-8lHRR2^FNsTOIz81z>Y4F9` zr6I}riPH?i{;q25sw!+#7P7kFthJzh@@H;()wBU8Z- zp#^>_ViMw=w|ctnOPLngxz^x6t|v2cY_Gw`E1TYH@WF!bOZjWN3K=ZGS~X3wf~oP* zmus$@NI<}{EL_-1KX^1W)adUZhWQin=HAEoC5on7dV+m)NcgZ6(W5fM>D(!^Nwx|a zHI6{%-M;7i9;Lk`Z1=izQK&9%ljacSRV zmoPh6oAe-EQWX*rz2k(o=Ypn2 zP;`sN%R-kbQaSLK*~Z?-@`;7%gY&*dPHU~Q#z|bw>Hf=j6wNvqJgnB7{gpu_yJFD z^&{i)F$`)5ObAMDAtMf43Kc?(7lW+2S}&|rAT5KM+~t%=ughUYJ`)pyNc0B-1&{XWM;hV6Ru*M3w@45Gl{k$@KRd4n_rDj1jWcLzPx7=59@2k6WSq$7> z*Y)Z0x%%@{V{d2N!S!;n&3?zi1 zKJTW|iH18d9M?+Eeg~b-eF^CQi@??9_~Uw0A(|qO&*AA~Y!Wn|!`GvpriaUe#R}JC zdGWky+$$X&y;{SUBL&KU^FNmJx(w2au6^IWW4Ir!o>MLvxoZr!PES8~_wJiU2h~mb z)%mrl3I5=6JX`d8m3x16Wc+mVBJ?++mNKYy=g{Gu1epFO6K?y%X2Q02bxiMU516To z%PX9`s;bU}q_3VI@*F&!8pi`LRqhYA2a^yl#qToQriHdc!}ERwoNaSGT#BEr2M77= zwst!u!@D1b**iUGPm^K#kege zA5|JZ^$0rNsuE1;a#T^apULM<3ts+BOtQD0`7p13c2Q>VBH}gHyuyWu`8ZBo_TsZW zG|AcZh(JS+NnPyO^X>a}Ck0v1#m^e_jhRFZCeiJcbVhX_lZowkp<~Xn7rPCK=GE4K zVVgY8oU2C%Qw~#RrLcs;kK^`;;t&3r&nB@a8+JkDm8sa0=5_6dX-5h_(aleM6^BKh z-6kWdIDbiJCA@(;)3d3sR#R;%{f5!`=lIkZ)Ayk>ekdkDWe`U?3fDKzbFtQVqr9WH z*Lamx#A)%}@@?LWnttPP7DvwNIk`j_o(NbLaBqXUK!Y|JVHOdYz&mT1CtvGt0(RAo z|F)cz=ejdV3@#UA*=y%2{baWB&dE#s_WM$mE*o_*Qo+8h&BHZ$a@pfMYwJIh{hVJP zliYR^&)%wfiJea?Jns)x$-mqPk9v-mcS}H?_b#TMs;cv;ql1J`|70m(i2V5wu;J|h zotl_n@oDP-ifkz8(eLsxJdgb6#jkH?kNe>8WL_TR5aw)9p6)zQ`m^|mKi)>WFs(oA zSUPw6KzKwSCfdh8VpPAbJMN8~7QI_=OZtSR)v-_sjzU;Fyx9NAiLVudJH4ue0-sal ztAz0x>K?BR(&)YXfOPtZ$a@`+CH+2F*QWYD*?|X3;d{O}ejT+cW7vX_qi=>oq>6(< z%^NJ-KDv;0-qoym23%=-k=gc^=Fr^Z7#^7~`o6DSWrk+nK1vO0uISUv;NtJbJ*`E) zVhl^D*3c?kuHbzW>^YWrhsa!usy=7kVjs1F<3=lq@@oXTdesuLSwK2n4N5~T=H2wolA zYRIcM^m85oF}TCUV?_KgG|{U{>lGjOC`XCZtBItMlnB42Fvao~p+{>6dSyrRwo8WEl^X%JkJ}s+b zOzJQ?v&5JjsV~J$TQt5++N!_Ol`4JYrWK<`(~C)hRM(KKk3@$CG+&dskrs59B04l` z_j!Gd8ZxCVN;D-QP{wYKw@c7nL!$P8sd7J%YoMAlAHm+DW_|+~o4rgV6x;olO@PMe z*1^~)E0TEoN4qQSb3T>o09>#OT9^#OkFOrdKai-4hwlE4b1JL&i|0uotn+YV&rmfv z)&wsccNjXM6a{C@$krqk#zZ92Nh2}CQN1cuqtTNbPbnwHnt#>kP5KeC`nLckvR97< zcJU1|buku}!2*djK1WscZ*T5-S)VvxLF9Z}DGRKG!$~$!aj+y)WGSh&3w2WnQ6M&wwqh7@J(K`KFYPO;M$Ez$Xre zOPLo&D-%PqAXWv8oXEBf+uSw<1IiF;O(pW%Uis_aZ!=LA7!4~ju%uDoX6f0rN$AY8 z_5{t78nnqgA{U`%JYac2{ltSSRDM$mH(&_+cE~Z}f~-U~Hj3XczYTmRm41m5opQ6X zrB#$UZPP zIBAMtI#|^(^okv<%XLBw-@3Pb2f>%BY8@nP3tI6MqD*VP16yJ?8m?c0qrmz--5lT( z!U(M`izW7wSFZt{DOO8NgGfjIz_A4XNtE@d z)g|sL=(udgQg{ADdPmUKA%UZ#r-u;QOD^JR=3wtC*B$t@5D4x)Kanf;&7{-U+S(@`eGdX=8O1BAaQ2LusNUR(8-Jt4(Kvjfw*~<-j zzVkR*jJzA?>{iJU*6mx_41x3whk0cpnYzj&jbduZdndjj4sUT-s?^ZinQCg zj9llaa*(H_Hu*J)k%bEV_W$Q{4J zmy%?drSH5Xk&2PCE^wdqRAc5eA~-edwFv(Bb#^5+`d-B(jL9HXU{i5k>`jh`^Mriv zrpEQS)1;o24^oPp)=(fs5mf#&Ye-l8%ll$dP|$h3Jf>2=-mLdCze7qQ0zYRQhoxu& zoYUo9EWZn%RrRMPdi&~fR%<5;9!}NDqp06Tmdz&R)zy4UyLyG#Y>TXuR@>5Vt+{qS z#t}lJlkjO!OIIQiXYtHIxjD@hEB!vQbi!3YA{m%y7e2Tk9{*`yQ{7Ougc%Dj z-d;#Gnd*+$ha?qa;blq5_iBYj2!;aXHmr2@@PHq0mLblf1OdZl1glHZ&cH6ec;L~p`rOjF`dlUs ziK>$i>Xq_%%qRV)mZ?bfVxNmW1qz>H9;8teTMN%ICLJA};)?hd2l=r{+<9VHj@!5u zsx}w2G7VH_D*{+2BN%@6M?{(-br@pkU#jQXf$SE4e)Sr*IqM=&8$cTjxN}oboZq>8 z)ork=zxnAmo^IuPeVjQ(o6z!#ELDKyHL2>a(}JKOFPgzAOh_HEp+~A#ITDHLjMf3~ zs{r^g+M~4azv_@ zcNQ32@tiI*;%!k2l_I9PABkR*;%b~y4{(2g7Ze@09cbUDjZe!`YRN$5Xop&x%o2=N zQVibii)N&2;^9%Sk|8FZtI#eJ54dNdB?-nY?Gvc4zIr&Nl%Q}{rfV+Z**S+Fdo`*1 zj?c)B$yUiutUuGOhdHzcEsH&^t+<&@DN%%5p4`&rK29XMDz?XlOxzy=Gp|aQv=jUH z?|T&!HtGF|%qH)13;e7w3Nc@^J0Z)V7~LwpigM}QIFZv^kn3aDK8sJdwtSCvwo0hC znz|gs9b}JlSgf{NZ*SnKw3scFW6XBx8$x$*V~ZPlFGMsYd8~u~Ea?AQhKoJ~xLN30N<^SEDJvBbQkQlSWItxn%|l9W*%NnF(i zXAQ8U!Y@;?dnUn|a^41IPWVu!+ZOI7ek$}GEa zdsLInbQ;&`g@9kKI%=YX|%XL>~)RfzT1Z>#t71-|caQU3$ z8=qLl?#ZLrj~QvwY7S-lNY>S+-CaDQxiMXHl9l}p!xVl?#$F|Nsl{>RB3p`)ra}St zmnF*SuR4q>Qe2FSrXpz%=1Rs%FHDl@zbw7$kc6zjEBs37eQhCo(otyJhK|OMmXelA z%zPC?h);T0#zV9k$;UgY$ZOT?$wIq_zql~QRj{8yNoD_=GiuZ9-&mJ-R~_n7GhDZa zoHn}1p>2<*{Bk|e2%SgFIIT3~_uyclyEp1$&=R-P$)gF_eK*4iQxb*L#jY0GHUg{A zlEOCoKT&!vn~!mEwrq6glf~+w2QR z`lUGP&$%PQ8!vYK@7U~=I@{S*z~wV8kBJdO3w4^Di8K7(NMJtQNT`T|=;4wjff~RP z3YjfcC7s~2&T#zMao2G%rHwEOy+}GA2Z^F>zuU`NYkL>}Ax#?Z>Q^Y{7=2<$0Mt0B z;d>77=#gRL^!G>wa2k@V_BOa#b|oAfRmRjsq`MxtK8I^4c~H~L;IygN#4vk5o)6Q1 z@Nhr-*@^u@oI}4}k_L=XA9;b9DUOcOj6a|U8j*<>VX#41@=BPl%e5|?iAvq7=6B_18tPdBsxS#Zj``ZkHyefhss+s>@!6~{wKw$krt{*FtI?8> zv8t(MJ~9=N99Ul+%og3O*igcqcE3Ce{`7{0CaXinWgyCAOB7ziRTn+qist+r2@jY4 zy?CTv{K_dj*K)CER+~Cqztgt`u6el0`Nvnm4S(&vufk6%@ki)P{s%&DF~t-VNce1_ z5C_h)h{n^{AHbJ@Y5_7}!0(du6wS6-L6yqLYcldDS*Co^$tI_@*4|J=L(85_n_TAL zzTjM1W(F4o4;}fLT4Ryo(s?tpjgAeoL zfuYgo(58c+@Sb@%Sz5Ba6M)ig6JhBRpW2e<=O{d%$ z&@UXnZXR|=;}3BoWf@dI7o#O9SC3_E5n{UwJlR^21H#6LYDIg)fXikoTi6egYP#8W zRyv%`tK@3c;33kPe5EiHTmp5P+tE(13WBoqI>rXfoY!Vb2Vs=^zUA$`1J~~E?tN{v z=w`-o;`jfIs7INzv)GDLtn1-aq{T)Qz@oKA>u4TDj$n!MLGJTl1u9f02bEL_L;dl5 zND_%zy0NDwHLAYqMa5Z1!Nysv`O;R#ZK{1hko@ohn0zsU3!Z}bRSryzsdGX4^jE9u zeB1z~r|{FSdjc?B-ZXxx*t989*&n=1yelk15zuSfx1v}i zlJ5s`U6AX(oqh$FD2{~x)#=d4%?fr;Gl{S}6HUYAB4=4UNYJPnly_UmT5F1zWOoZ* zsggBR>ZAJYF4TDJPi0Q^b;3*`%bE$P+ zC{N^3xm{>um7M*B@Yc%}%cM+n0G2#VX=w zRII6PJRoldwN>7sz4`tD zSg2%AS5mTLONhOojMUeZmrF_p8FWe>EL6-_b1Dae2E z#Jut=#d@$#O6T~U_DS<~m;`N*Bn!C4+l`m!^l5=b?5NjdK9h+%Sza3f>0^p0lu@*! zf^}W@l_=O+J^$taHn5oK|Blk!F(TUyupOfcOQ50N-y-7HL;!sd@_z_Ysjsz0 z2IFs@peEXZ$ZABUJ|}xWLj7>o-OY2z)gnu#5J&dKZoc#c+5hh-<3CiEZW`#b5pbh4 z)ifo11aQp3YD-lH9r@u>T@a|V#y-2LV^e9-9A9nw!jKUuyz?8AKcJ0#oEYN}@Vz<= zzs_@?QyQxk04>L5Kc++sd!GWC>%c%H?!)y7tC9hi=kanT_uGk#^UHbljlhQ!dPCJAn{d_(=I@!}77e)zm# zrnk%@tR_KESG=kpG00I|(coZS8++iF#=l}<5W-W)YRkw=<;Q4>#goWS)_x4^M!}bG zX%>9E1-9TR*zsg%LE9OqBYZX^-^+sn3)HNWwYKeB0sDn={VB=2f;U@C(bg({v5#F< z`8)z*R2I81ptyi^deGL<5-XdJ)VOAzPbE8 z50ZT3$?f^}yRW|)!ZrnaiMctQCOa9d&MHD~wZT&t5IzJo=lyY1lOUk>B1 z>puHA)1nt>_aYvLI^L5ShN*8UFx)rZAPwE!AJq*X65Vk><1(m>Yz?m`PxbB3*o~3rinT={J*N0A)pZWH42N4c$F zf1)_y!}5pIZ|W%B0D;g&)0R@okk?ccHmfeJ$J2Uxa(`i-C$F@g-O zd@4C;JPI^~hVSP%k}=sh2`KKOl0-@o1B)b_`q~ZO_#iJmhDJ?q(bc%XVhO2u%j0mG zwSPn-4nYI3@c|%=$Q76}WL$jn>V?Y|_6d%b(9uTg@v*TnVUNRNN8Aw(jNU@I=#-Ol z$wca+3;_tcl#3?D1nAQ^a{?UT_+SHT(H4^Em9LjA;{k7=r1d#JOqt^g+&nZ+=(9Av z>%l*OYW3PKKlQbV5B>e~0IoWf1l&>9yDp)l>LwQ>ow&=MghH*S-`|^^e~|1KESdP7 z99GrI-(iYfVyPwUXS-n}xnOZ~Ix;Gkdv^L>?MUXM+m0@o2E_(^!XUo~r}+j1v1xZ; z5-uD}@blAyrJB+vq^2^gFaPVfJsMLQrh&2{zt=RLf1kfNWhHC^g?B{8G9&>K_OAO$ zAbZ&GU8e`=vR%T}M9*baB*^@-PqCUjj`Swf{do{DDPoY{;qqWB;KhaJ+)~TOn3=$! z=R@OgQp&nhCN9%BvJ+I;7OSPct!fsXt1%Q*5xtE;lBw)^x;A8M*d$kEdCM^Mh)TfL zL-q_36a91wvv$}0A?s*DjMq;eM8;yzlU3$5IM_IoA~NB(T-%5}k| z2rC(ahNqombs#-Bom3}*&Yjrr2RPJ3x*0^@ML-D!8yM=Xgg|;*UAPU&k?A&*CT_Uw zeRVKG8?W*b#fZU#fW_DZdX~y^B1j6;BgiK*EE52o;xaON$AMK-K%LcDGdS#l#T*dr zUNq6LM{4%GUi$I`DeM1|-?A>wCjiM`UZ+J1y^m%_)9`%+4`I(qo#!Unnl; zCIMHv7tpymW|0L++d0}Ye}@yA)C-5Y?N5a_A!vTU0tA8k$?A6&6(q?$ zS#){?s%*QP2Gpp=)9`wOO3mtG7$ulR7xCb=h@l8pxL<614vQ*vzY|b|`XeGUv9Z>l zuGgl8gSjPMSL+A=t~uT@!{|?J6OaDH{Pq3rnEUl4c|r!LuK$+!eeQ>9vng7Ja}-IQ z8Cw4s?p3{po?&m06E!5Q4QJ9rowi{1$@AviIk05*el=s(mH#ABx1K5G|ao;jBOz(?yKeW@v^<2jCv`b{!J+rv_ zr!ZbMy@x1@cpmqJDd_7UPh<&VCW3tu)Ps%}zdul7%n73v_P=#Ga@$T|$)U6=Fro<> zizu)x_IJSNhk47tC!mJ2N*k&k)*I|a#gG;Y(rVS5y1NzV(6IExTIwGMkjjK~XVA!u zZfh*Yx^%^7whq~zDr{Gr2%ZSj=5Qp3I7*=-o=qL_sB~3WtTpy8=ZcB9lbLQiY|H zGmbFr{kzVqvZFZM^z;_Y5!KwRG1Zu%D;SB~&?%bTK#gGBQ$ z;Z6HA@~-a!AOa#=W`RL1+xvWw&@vtL+rLS;_aOF*u)*6jG|}o9>sn}iP1EA6MbPrG zB=EB-6XEgWD5-JcG%{C%^x9N>8pM2<`JT;EtIS?z4OD%i!+J1(97gJ;{^xlCa4t{tN;k@UG=+AFmw3IyA*~qz~ zcdiAEbYj@!;HOkrYFK`yw1Af98ZZH3d!F|XdobDTE>qqBZ!B;PN~(YguWkA~k7zu# z{&!Rbu|0X@U1$0U2ayTn-=P~+!e(XhC&G$6bPwg;GYxv;k0XzR;gLZfbi%_LLVCQa z3ra1(y1zMlnc$r+Ckt0qTW?!fNMWUuE<#HN1sVf2tSC4PWaOEMvSSUC7wzWamU=Sv^`+XH4ElG@KRXOM3II(k2%7J!33ceGkdD5ygY_@G zYG{-}j}5OBVZV?<#SWbk<;7f2!rLNG;YOyzQ*CMBKJ^rlsUo97=FQOP(XM(UvHCem z--1@Z=a#8I#E3wBVgsaAyoaN@ZWa+kP;d$Pysr+wj|ueNO{`|9i{HU9#KFizHEjb> znBvWbT3@UF;_Cpt)dkTL`gBpj#w^MEeD?B;>0p>WX|^Tvfyi(TE3zhTAjur8AP%jP zT~dZYrMA3O$X(1z?yU=2^Lvmg*bQ65%Ak}&Ub43Q+AE%3;a!2Cv0z7V9Z*s8oJ7qh zFw}f62sK4Q&;)o|!>E9ZQ12Bmo%%lun4%W0B%l_fB+_lRZ^zBEPJ-;a#k<&Gsi2rO z02MZ?px`<{Rc-VIr^rS`f;{kc6U$&Et+5H-jhIrW$_8blUOAmZFW}{%DBk6GM*0%_ z=ST6>J}24nf8+;uH1^G4!$v;AaMUvOyuibXvZ>Gf$|kro_2&J6w2P$> z`|7Y%tFI>haNM+?<3%yGwoF*{n=#KH$40uEr=ByRa1M@MpY+2I^HnuE;m}M$=M=}c z6g?>qpq6g%}&IUa< zO5Dktlu{&Io7^jsph={s=tJ2k1`y@@>tOp3Y)QmT0S1l}?9kiJ>(#2)btW_7Bg2Ub z6pIP`oPSMZ@^02WJ)H%e z0pvP1aJ#K&ie z%w^djt)n)uPa#59BUqyvx9x0kk#5U2g)u~Td52iEOxTaIv$T9l3r-8=nzZsUJv#%R z&{*-R;ZHj*)Y!=C-y5~q>w<28It3!MeF54&KL5`zU^MEV`Is9ND!7XmI^2#B)@)LzGQdt8uEJ8kzP~+ec{Krz5Srqs` zklq5YmhUhl>wl~X@9qLvq*ga5;RsrN0|UEnf?|P>-pz32>C;1D$haaD`MnjI)Lxwxie)kb+sdg&64-i7pKGB>J?(Ta&^HnvH#^=}=F<9&xDr0+~f& zrI_IZS-)5q&z4F>A)DD^G}2DUN|VhJ2$|~Y>gHxVXvg67!vQ^ad7Y7{)s=y_Z$?x1 zBM=H)zgobV(P*jU#3ob+`=Ju*QfSljBazvtoD7W555_%gA+>yTw5%#*JD`iAtq}k5 z&1<94S~*tYr~YsSK#Xn9KQ6apTaX0@u~F^&!)xq2*?cY!vl7@K7ZbdoMcDDi4BJ6x z+6Lsx^}5?MNjGB}>N=i6dzd6KvyucOwSau)8HWfcE?r;~ZSn&229r8?K_@zz%n0^u z79`SB*1C>D3kPhDjRasvVx39D6BMgd;{E|%C9FdKe{vrEZ%@<0peg0L2#($FbG}&l z^Sa#Oc^VR3WCn-MpX3zN2z7)ni{7Fe=Zsd!6$pb5N1-jIWFm4jL*2H`HFsy2=UN#U z8@`?6lR?pcruX|LQYDcpP@*i&T@~rxOViD<;{3*rna6ED!f zNlMznA715c8!wzq?%zZV={@s0_O5GuufybSgpq=suaXk;R}=M6I<}m!rOHZLu_j+2 z!je-PH>kWk10U^K9kQ+>w-37zPNK<6~GqInU+lVpck~ zpiig7=Nps7N?SS9__EyLrq_I{%N>%L6$>2azIlHhC~qFx_8gg|6tOis#t#eeh6!d5 z{%F{0K-OjDinjzWaH#o?wB5e-9o3BNXqb0)nDU`Ki9v9BTNUV%-j*akJ#*93J1{2} zJIlCE;L=1Be(ZNS)v6!d_F3Ea>)-ERyviESp-C*FNwl1FI&}E#qD)yJoAg!nJj!y` z$Zdee*NUsXy>KgPXN>9j&4#2|USnf-T3Q?@^XQ*=W>BN$dhK&*bOerdiOn42RG43a0rHHNz?^lXM^&-`^$q#N0M z>CFHiI{jL&P=O^1ORER38Ip^O5}>2$`iid55!FyM*YEN9X?*M>Jd7#+MDnuj==V}u zpVvt(*T{)TMrN1FD?rdMksNGr<-2#c-lZ+j*s3u<7=v`b^fWde!3LxA@354aogutLdeZVlyCkRWK^#P8CbKsoD?kEEN|Bh48lNSs^s z2FHc5pdgJBMv|6mHRdg&G+GiY**=m!H!9gZBXX&^!d)I8hKIq=9QSPNuEk}mJ(Mu) zWHw+JopDJ$FmJcV=OoSS*G2j9I6*mMc>d$~V+{t;2q_xsaImetmNJdsaG1AidYs3(L3{nVA4Nz86SY0jvW4ElhcXWMMYlaX3EFt(sb=1wSI=gqNsJug=egkL)kLLqw0xFh+Rnglu_kx@|! zB?em9@im@ zc&RkD5)c=!{4oP62hdJztf_CIvfwgl6%vMl^TxoRi~m`RJ*x$~5%cw=*LO zG|?A;u+-6k;mMmE$B2@Z(?Diu)ya@786-0q$T#`TED6OxLytf5i%O|Bl*&=HCDSsY02VRoMQsjdLVa4m$o67=p^sSSxEJQ8bHJ3FB;k5|m6xn;oU3I8Yc`SFe zm?kvOCA^_B-Jh!F%aOjD50zpmh<$HjXn;#ZBaeqt5o0LijKId#?~kP7_3Rxn^RH%1 z_T3|*p@M&9C43+Q<>=Hz^>kr z0;QRj>cW7gN!~$8lv&>v&b&Fi7$z8*`OJlt2kL^j(R)1RfIVeSb z^D1|eBx`%OQ5&PuBZ_zsho728b}5!1*$AzKt4WqE$EAlun@!+G;r2;~y?8!A+Me~a z+9{xclry9}RHdeBTMV^b8uRndG)OATqAn2TuCJC%S!rb)-zTV{8lSpOdT|w>N73ffxi)E7PUUr< z(E@oJr6_Y~LRVTkRkw=}j8aD!?Z6EWiD%FDRA<++D@2t-t%0XGUPg6j9S{{rPT1<> zcXi*HQyjS04mlFbWn|aJNJhk|h_ScKi2^WisP%I)@8l0x5=qYLOzcGlE$miL-bs!l zNA2x8QH#s~gCy4YuXFY^x`u;5I?J6X)_za3pigRc#7`}!;5_K6@p$RobJX$_ksp15 z*o56AXeEBqVKIo3kulv$oJ(RgWb&EMOMzlmp@PIPtVZNsbxB=oR(h0EX*A)7HR}HP z^DS$95bwrDK@5==gFUouhwNKumeej*5ri?sIn@tPDh>h}%QQ+GNptCXNX+s;ZRqSX zUwd~Uk;0{Glr5T(oe`@)jtCQM8hA&49)K0+u|i{Ruag2ltoXs(xW&j%7nyrTKcG7 z%=GdJ{>%oZbcAty4sTB#ghLFb$xz7?ezJ6(`%%KU=;afxs zK73zG3;Qa=os^Zk#~)(H$2qeG11mMNPC=}}qK33Ky zF%mh&0?m%C4BTE}I-CZU?e}$pFJnkucYCDB$3P4O?D$!+Qu06V98j2oRvN8=4xsGH zOsju%#Stly@TL7&5efT!p}`_N|84un4pK-5&N86BaDvL}iF&o(gsb?1rxiwtg|LT1 zw;4}9@ox(B4WBO6<%PYjHOg$WaehDcc$?^$msRG2L`}uGL?%&Leqff_Hk_W;mFE@k zc#-!4ZcV5Rxte~l82}_6Fn4^cX}mx+8f>#T<_6p;~&nB*d8JmsXoiH z)zxdIK4U!s=8z`P!jHM6f^pkkJ{VGqoR^Dxjz(Ira!s%9dV*mAvB70+6{1Tl1)PtKti$Y%+bbF4_Wy>xwXE`_ zt8bc~pbl(k71G@GGkOIoE>&c0x2oX%jZ-Nk*MCHe=+E?({O7$aW6u@2a0@>B1;ucl z-kSI87RmQjBeT)tNYpLYZ=Qj4qQms@S-@PrT^ED8xV^k(>lUoV8xJP{fmVJfx>k_^ z7yah*kHaAN(3jSZ`AvzymzvW~PcCh+ZHr*vQdwUIUd}48u&}PPl-=Vk{K3(p?=bAd zT~luUT-nVJ+l&@xa)m!x^S)Bu^6Ir_VpBXhwFlYF;Osp<#*D@j{ppM>7px zX+8gHx4Kw(+5eBaPj6yEc4G3%Ro673mQ-l#EK{CmwYX~0?9_Sxt-#=a|Jm{#Wc0qj zdC@0?m#7KbTR-Gu>Q8+9q$8qt#;)px_!%!6En9^6pW$TMzz345kgwlAE{IX%Y&sZJ zg-VdLJiDXS$8u2*7{BN5{dsd&{Vw13;5=J;zkx)OxTY?9*&?o<2Z>sU>NPIg@l_Yu zOO^NjpGHgm`q-bS;*_R(@``Gs1vlLM=GK#E*l!iKZ7-X>yB~t?+^WNNGRUH~NdvpD zT9D`|reE+{FP1y~Zh)uf3}`T897G7={X}AuzVS8~OAFxQ^{Ix@bBrnL0u9eLYoKxh z?qPv<3L>+DOodFGpt@qv0F*j%--80xti|K;@sr!4+3{_47NYN5|NVH>whTS}Vp*@D zuV~Qtq7PcQ^vPQ|2{9(%$k8tgTPF^V0K)7O&?U5$>e)Z$H{o@vQGvKGgv z=mU}qSX3~?Z_TU?CFzpD`C_zQ!UB941TcuHn>a*ON79QI(Kcz*!%HdHNr>;oCr{ZM zOgMOde)l!ko7%p=8Y+?kW&r$o6dG1mRshMXk3XA%M7(YpFP5@N5eiD7!`Nv&rMk3Y z+{hOQ$KN|gFU)6r6#l7opMl2vs=6+Fz->LQ0nn4(<3 zWsu2hqn0Cl^^w&1gI7h8ST69(pql&yjAw4(y`5DC#MPoqEl1~bI3Pg9fH=;W>s^?k zK<=>sxUg6r8(<6oR8}?+i{~;li{$?as6d~&`6qtPfg`pTg=#<%8yDq8YI<{b>rG32 zM@`9lQtE9}mO0ET8aP!px}O*H6D0Jac=0zY3|yoFjvp#X->Luay<>2cSCAfB46*{Q)e|HMlq&Ia2hj82h0wFYfi)&`mWsBq7fZr$< z5?p@nKRp)EQZ(EGRN=rvunwqojxi+6^V{usQ=qSccN&0R2Gqg+AXyf?#d99pD?8js zvy>Eb7({>SAM(m#;>-in<`2&`r``~F+t7gz>Jm?Q(N6$y zo37M`oL7{EAP{w8yOSc1()!>GpZRyqo@3^dk;IxL-Q{G`E2l|rgTg^w3P-?U#8jFJ z%($R7h-sIp4Qde@xenrk01}Vhr&qJ4i6!AD0dWKrT7J+PU7Qa+blhO>xSqTdc4Dw%`K9tRUo#4AT{L1)(6Bh z!K{Tn2dL>lCGrE0Vc;^VbpQ?!cnc=}xi{BZRp}WK4_Ck@0&^Rg_pe|?a`%L&D{s#q z9!vj%575mtEhI;(6m7PYk?Ryes-EFXeu)3pR{43Lq3@`ZF7Tt}3WS-6ZQ8{ZJs?c& zipOrT8o-Eg9ceVSr~(Hd@^qfGuI)``wVC%L$O_ob^c)H>z&5sfp1e732Vz}Uz{8uf zm>00Az-bmTwfb)iIv9dIwq`2TsP-RR*T(7wu#!ywe%110B#~P{2E8x1Lno;F~up+B@6pqAA{;NmC0KMO4W=) z;AE26j^WL(VY&bt zCU!X^119Y2mdahqQzZfIj`$)?DzVTvEKZ%H2`0ZVv?f53|dSikIKx=FwXk^1x#=Wb6s-jbvUlW zDEwVTc*5g0Izs5JKWqdc7PSmr>kMJN$O!F*Z#DyNtRiR9*3D;EzAF)<~k z!tcwux$16;Pf__Xk}JqMnbhw_J{*zCeo~+Tbe8}gEqFlh*>JvHu`*Gr^?FJ#nsuj) zKr5?fnAR&9g92Ia)BikIVut$a)vI5nX3_EVWJqQzeyIQP0}r-L^L>;YXH{_=G?eYI zl9ZV>vg5v0R~k*ZC5HF-ATPF@Y=znZLnkk6wz7@77BTxj*y_}sO4>X z^oEa&vFcCc6l-0j$aZC_W4x;y%M01UI)4TR_xPPF{r$6@FtMQ$%wiSCyoQ`93;kvB(gjx=yGVqdo2QLl>&)8eBN|4Mdr4B1ID`0H#4Mz$m~Jq-3s)o}P8p0s zY<01fnz_MAAffUC*5UbZ!2-{onLvag(99iySf5#&5*5zfBWwo|5JKT>BSw{fc{{%! ziFGzFl*Z4*BNxm}5(nOq;1>u_lv|k~tVW7v1dj={7=~Nu8%A^0tG++Bn1ppqMCw`a z6Vi(c{DFf~5a0UAoeQH39%j+-Zu!R>k_4F4M1(~dGlwknfzW}+xKKM<5BA7G7>9;P z*l1(WLgG5GQ2X@2yH+#A-6P3|^>f07vL{XKSefC#z>(3 z)lL-`=LV}S&4FK%`#R)c8x=Wl-8FFp5g&h;!Jw%ODp^&zcmQhHb5+uz0rd?9U&CoG z+D_sG$#HJ=(gCWkyT3HceH^&iGD(FhGgnUU#Am$l*JUQhS+iKk2M`PzPdK3ye(F&d z1v0rvoZe9h)yOaoG$c3*b*3`; zSB2)6DKo5qhR$w+{G|iG!s&9uTun}t1inurAN^~g?$sjc?uK)$TacpsQ-b|3&o|R_ zs$|Cyjq3x}`%TVDf_o&kgX*zTyhYQ)`YB)QU5~AYt5DiywXE1#9EH=`3atjoJx;5` zUgAB;)zx^J$)c3#+r>EJ(C|8$+!r%_5l+?X?rp^ADN`H*4?O)^L)t$8YC_i-+{CdwncwhA1Pl;Xw9y%d{B?Ayb;R~ zA%iNXUn;_IM~@6XQE`n7H%axDvh$}l4D?z&D-!x7p{~ESrmHoRRRAF!1Lj*QQSC23 zIh$4+=B!3mCoi32f6Nbfb z)_x~aW3BhHcE4fDL?=aa*JKJfSy`Op#7;y1atH00L=}CDLW}&qLQ?{_Le7xn&H@u> z45gSvZkU>~P7oVNj#A)cYfb~AH7wA)wu*_dSkijH zZMCQn+0-TBw{@8RDnC+wWY*Xx3Y;_P3!JOeVOCP9uae;HRCTl$jmp>dB74XsV|bEa z3Ex{NDGfI^0{v$|SAgl<`(B==DMZS4{ztD_oqq+Ly_9h|_P;Oe4SY8U=R~o8^G{g0 zs^z0DzHcv4i`@AhEk#)`3)5)vN`aU^tK%n7gQiMKwEerRHoiIAiC^*x5=wX zE6HTx9|h%C6gLk`bGmeN!&?9&a!TV~JvcXn^X$oz$q{2K;wcn(o&B`$4k=(G5raNj zcOhDHCmSV$e(hR2eUq{g?*wn1m_Q_iKb&sjiyXqVJb?YV{AxC3Ag4S>)v+{HCt92t z>7agq5Kp6UB{1k^ZZ2SKjDwBYhkA4A+k2G%>Z(QPw#eWS`i=q*B^b#qW9kaXEB;3I zsImzGpHB7E6v=`&si`?QNb9FJoPT`D&zxW5rbH%bivM?i{|2H`^M@m)=r$VlM&tA8 z%}0*gf3R+GRTz4&zE_;AruBf2tncm>CyyB^ixD9&B3p!5>?JZdL=wNxn)fbp=^=IL zA#(cW%aZa)TnB|yqKFI4(c;gW5)jq^@NGXr2+1{~OAshgD#V!5Wgr=VHJlN4&k=|(s*G5z z5-|24gpk5OOOpfy#LE>z0j6v-B~I_82wf8-S;9aRTCx#BNFgA)q(sW{)DA#uq9$gf zl6G;_=+Y687J!Q`x=3;oLP*U5Ia0!8>LbJokrL2I&g@Vn>Vm8RR3k{;B_$>2o_lW3 zo;{8I2qC2AfDl2B^kd$pP#I|XN(>mgWrFe?t@~pubx36b8Uad6OUH~EbK!*-nmZ9f zNDTl9f)GKDM3ZVms0;Vb&QmC;hBLcuE%Ys>nfi;{0 zC5{MTtHUCB5@QOWLQJbNB9Ckl0}#+i3lK2sF|mdTA$5WD#ZfB;0vauIqI!l9#`IAF z5+g`XiIf5*Mi(wv!znPt5q}IZGnGpVoCFNPi}w(1TaDgJN;Ari1++;BscZcH`|ph! zHBv@$Y!W5`kv4#UMnurIl>m^;dM_yon58OgW-@k)qin5+CEzf-rPYwkj$nkw9`9J6O;KYHX%69?$;+h#vN+yQqKU P00000NkvXXu0mjffSwo? diff --git a/modules/admin_manual/pages/installation/apps/mediaviewer/index.adoc b/modules/admin_manual/pages/installation/apps/mediaviewer/index.adoc deleted file mode 100644 index e369da676..000000000 --- a/modules/admin_manual/pages/installation/apps/mediaviewer/index.adoc +++ /dev/null @@ -1,36 +0,0 @@ -= Media Viewer App -:install-imagemagick-url: https://www.tecmint.com/install-imagemagick-on-debian-ubuntu/ -:gallery-link-share-redirect-url: https://github.com/owncloud/gallery#redirect-gallery-link-shares - -== Introduction - -The {oc-marketplace-url}/apps/files_mediaviewer[Media Viewer App] is a simple viewer for pictures and videos integrated into the files app, which supersedes the former Gallery and Video Player apps. - -[NOTE] -==== -* Before installing the Media Viewer app, the Gallery and Video Player apps need to be removed, or at the very least disabled. - When removing or disabling, ensure that any {gallery-link-share-redirect-url}[gallery link shares are redirected]. -* Gallery and Video Player are no longer supported and will not receive any further security or bug fixes. -* Users are strongly encouraged to switch to Media Player. -==== - -== Add Support For More Media Types - -To add support for additional media types, in addition to the default set, ensure that {install-imagemagick-url}[ImageMagick] and its {php-net-url}/manual/en/imagick.installation.php[PECL extension] are installed and enabled. Next, add new entries to the `enabledPreviewProviders` in `config/config.php`.Below, is an example of how to configure it. - -[source,php] ----- -'enabledPreviewProviders' => [ - 'OC\\Preview\\PNG', - 'OC\\Preview\\JPEG', - 'OC\\Preview\\GIF', - 'OC\\Preview\\Illustrator', - 'OC\\Preview\\Postscript', - 'OC\\Preview\\Photoshop', - 'OC\\Preview\\TIFF' -], ----- - -NOTE: Support for playing Apple QuickTime (*.mov) does not work in Chrome - however it is supported in Safari and Mozilla. - -TIP: Look at the sample configuration (`config.sample.php`) in your config folder, for more information about this configuration key. diff --git a/modules/admin_manual/pages/installation/apps_management_installation.adoc b/modules/admin_manual/pages/installation/apps_management_installation.adoc index 7b991e6f6..133f2b288 100644 --- a/modules/admin_manual/pages/installation/apps_management_installation.adoc +++ b/modules/admin_manual/pages/installation/apps_management_installation.adoc @@ -6,19 +6,21 @@ {description} The Docker image comes with all apps provided by ownCloud, regardless of the licensing scheme. Apps that are not part of the image can be installed at any time. -IMPORTANT: Any apps that came with the image will reappear when the container is restarted - if you uninstall them. - -IMPORTANT: Any apps that are installed manually must be compatible with PHP 8; otherwise, they will most likely fail to work and make your instance unstable. +[IMPORTANT] +==== +* Any apps that came with the image will reappear when the container is restarted - if you uninstall them. +* Any apps that are installed manually *must be compatible with PHP 8*; otherwise, they will most likely fail to work and make your instance unstable. +==== == Installing and Managing Apps === Installing Apps Via the ownCloud Marketplace -image:installation/top_menu_showing_market_app.png[ownCloud top navigation menu showing the Market app] +image:installation/top_menu_showing_market_app.png[ownCloud top navigation menu showing the Market app, width=250] To add an app, use the _Market_ app, which is accessible from the top-level navigation bar, on the left-hand side of the page. Once in the Market app, click an app's name to view more details about it. Once you have done this, you can also install it by clicking btn:[Install]. Clicking _Install_, downloads it from the ownCloud Marketplace, installs, and enables it. -Sometimes the installation of a third-party app fails silently, possibly because `appcodechecker' => true,` is enabled in `config.php`. When `appcodechecker` is enabled, it checks if third-party apps are using the private API, rather than the public API. If they are, they are not installed. +Sometimes the installation of a third-party app fails silently, possibly because `appcodechecker => true,` is enabled in your config file. When `appcodechecker` is enabled, it checks if third-party apps are using the private API, rather than the public API. If they are, they are not installed. NOTE: If you would like to create or add (your own) ownCloud app, please refer to the xref:developer_manual:app/introduction.adoc[developer manual]. @@ -44,7 +46,7 @@ See xref:installation/apps_supported.adoc[supported apps] for a list of supporte ==== View App Status -image:oc_admin_apps.png[Apps page for enabling and disabling apps.] +image:oc_admin_apps.png[Apps page for enabling and disabling apps., width=350] To see the status of your installation's applications, go to your Apps page, via menu:Settings[Admin > Apps]. There, you will see which apps are currently: _enabled_, _not enabled_, and _recommended_. diff --git a/modules/admin_manual/pages/installation/apps_supported.adoc b/modules/admin_manual/pages/installation/apps_supported.adoc index 01655b7dd..f35eedb78 100644 --- a/modules/admin_manual/pages/installation/apps_supported.adoc +++ b/modules/admin_manual/pages/installation/apps_supported.adoc @@ -1,22 +1,34 @@ = Supported Apps in ownCloud :toc: right :toclevels: 1 +:page-aliases: installation/apps/mediaviewer/index.adoc == AGPL Apps +Please note that apps without a link are now fully integrated into the core system and self-explanatory. + * {oc-marketplace-url}/apps/activity[Activity] * {oc-marketplace-url}/apps/files_antivirus[Anti-Virus] -* Collaborative Tags +* {oc-marketplace-url}/apps/systemtags_management[Collaborative Tags] * Comments * xref:configuration/files/encryption/encryption_configuration.adoc[Encryption] * xref:configuration/server/external_sites.adoc[External Sites] * xref:configuration/files/external_storage/index.adoc[External Storage] -* xref:configuration/files/federated_cloud_sharing_configuration.adoc[Federated File Sharing] (allows file sharing across ownCloud instances) -* Federation (allows username auto-complete across ownCloud instances) -* Files (cannot be disabled) +* xref:configuration/files/federated_cloud_sharing_configuration.adoc[Federated File Sharing] + +Allows file sharing across ownCloud instances +* Federation + +Allows username auto-complete across ownCloud instances +* Files + +Cannot be disabled * xref:installation/apps/mediaviewer/index.adoc[Files Media Viewer] + -NOTE: Before Files Media Viewer 1.0.4, the _Gallery_ and _Files VideoPlayer_ apps need to be **uninstalled before installing** the Media Viewer app. Starting with Files Media Viewer 1.0.4, the _Gallery_ and _Files VideoPlayer_ apps need to be **disabled before using** the Files Media Viewer app. +[NOTE] +==== +* Before Files Media Viewer 1.0.4, the _Gallery_ and _Files VideoPlayer_ apps need to be **uninstalled before installing** the Media Viewer app. +* Starting with Files Media Viewer 1.0.4, the _Gallery_ and _Files VideoPlayer_ apps need to be **disabled before using** the Files Media Viewer app. +* Also see the: xref:configuration/files/previews_configuration.adoc[Previews Configuration] documentation for the Files Media Viewer App for more information. +==== + * {oc-marketplace-url}/apps/pdf[Files PDF Viewer] * xref:configuration/files/file_sharing_configuration.adoc[Files Sharing] * {oc-marketplace-url}/apps/files_texteditor[Files TextEditor] @@ -26,9 +38,10 @@ NOTE: Before Files Media Viewer 1.0.4, the _Gallery_ and _Files VideoPlayer_ app * {oc-marketplace-url}/apps/search_elastic[Full Text Search] * xref:configuration/user/guests_app.adoc[Guests] * {oc-marketplace-url}/apps/impersonate[Impersonate] -* Notifications +* {oc-marketplace-url}/apps/announcementcenter[Notifications] * {oc-marketplace-url}/apps/openidconnect[OpenID Connect] -* xref:configuration/files/external_storage/webdav.adoc[ownCloud WebDAV Endpoint] (handles old and new webdav endpoints) +* xref:configuration/files/external_storage/webdav.adoc[ownCloud WebDAV Endpoint] + +Handles old and new webdav endpoints * xref:configuration/user/user_provisioning_api.adoc[Provisioning API] * Update Notifications * xref:configuration/user/user_auth_ftp_smb_imap.adoc[User External] diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index 40ce71e29..af5e65a98 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -16,7 +16,6 @@ *** xref:admin_manual:installation/configuration_notes.adoc[Configuration Notes] *** xref:admin_manual:installation/apps_management_installation.adoc[Apps Management] **** xref:admin_manual:installation/apps_supported.adoc[Supported Apps] -***** xref:admin_manual:installation/apps/mediaviewer/index.adoc[Media Viewer] ** Configuration *** xref:admin_manual:configuration/database/linux_database_configuration.adoc[Database Configuration] From 9baccb5cc5f8a93ba3d8f2a139d5ccd74c8bef8d Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Mon, 8 Jun 2026 20:21:57 +0200 Subject: [PATCH 28/38] many fixes and cleanups --- .../manual_installation/bootstrap.sh | 113 ------- .../manual_installation/compile_samba.sh | 20 -- .../manual_installation/install_samba.sh | 64 ---- .../custom-app-directory-configuration.php | 16 - .../set_session_path.sh | 9 - .../installation/lets_encrypt/cli.ini | 5 - .../installation/lets_encrypt/delete.sh | 23 -- .../installation/lets_encrypt/list.sh | 7 - .../installation/lets_encrypt/renew-cron.sh | 6 - .../installation/lets_encrypt/renew.sh | 7 - .../lets_encrypt/your-domain-name.sh | 11 - .../manual_installation/instance.sh | 36 --- .../manual_installation/owncloud_prep.sh | 303 ------------------ .../webservers/apache/log-entry.json | 11 - .../images/installation/install-wizard-a.jpg | Bin 25867 -> 0 bytes .../images/installation/install-wizard-a1.jpg | Bin 41721 -> 0 bytes .../phpmyadmin_v4.9.5deb2.png | Bin 28208 -> 0 bytes .../manual_installation/phpmyadmin_v5.2.0.png | Bin 36493 -> 0 bytes .../images/installation/ssllabs.png | Bin 105747 -> 0 bytes .../apache/mod_unique_id/phpinfo.png | Bin 29296 -> 0 bytes modules/admin_manual/images/oracle-1.png | Bin 22202 -> 0 bytes modules/admin_manual/images/phpinfo.png | Bin 9005 -> 0 bytes .../encryption_configuration_quick_guide.adoc | 4 +- .../files/external_storage/amazons3.adoc | 8 +- .../external_storage/auth_mechanisms.adoc | 50 +-- .../files/external_storage/configuration.adoc | 97 ++---- .../files/external_storage/dropbox.adoc | 8 +- .../files/external_storage/ftp.adoc | 4 +- .../files/external_storage/google.adoc | 40 +-- .../files/external_storage/local.adoc | 2 +- ..._compatible_object_storage_as_primary.adoc | 2 +- .../files/external_storage/sftp.adoc | 2 +- .../files/external_storage/smb.adoc | 2 +- .../files/external_storage/webdav.adoc | 2 +- .../windows-network-drive_configuration.adoc | 1 + .../admin_manual/pages/found_a_mistake.adoc | 2 +- .../installation/installing_with_docker.adoc | 75 +++-- .../installation/selinux_configuration.adoc | 210 ------------ .../general_troubleshooting.adoc | 138 +++----- .../providing_logs_and_config_files.adoc | 11 +- .../remove_non_existent_bg_jobs.adoc | 2 +- 41 files changed, 174 insertions(+), 1117 deletions(-) delete mode 100644 modules/admin_manual/attachments/installation/manual_installation/bootstrap.sh delete mode 100644 modules/admin_manual/attachments/installation/manual_installation/compile_samba.sh delete mode 100644 modules/admin_manual/attachments/installation/manual_installation/install_samba.sh delete mode 100644 modules/admin_manual/examples/installation/custom-app-directory-configuration.php delete mode 100644 modules/admin_manual/examples/installation/deployment_recommendations/set_session_path.sh delete mode 100644 modules/admin_manual/examples/installation/lets_encrypt/cli.ini delete mode 100644 modules/admin_manual/examples/installation/lets_encrypt/delete.sh delete mode 100644 modules/admin_manual/examples/installation/lets_encrypt/list.sh delete mode 100644 modules/admin_manual/examples/installation/lets_encrypt/renew-cron.sh delete mode 100644 modules/admin_manual/examples/installation/lets_encrypt/renew.sh delete mode 100644 modules/admin_manual/examples/installation/lets_encrypt/your-domain-name.sh delete mode 100644 modules/admin_manual/examples/installation/manual_installation/instance.sh delete mode 100644 modules/admin_manual/examples/installation/manual_installation/owncloud_prep.sh delete mode 100755 modules/admin_manual/examples/installation/webservers/apache/log-entry.json delete mode 100644 modules/admin_manual/images/installation/install-wizard-a.jpg delete mode 100644 modules/admin_manual/images/installation/install-wizard-a1.jpg delete mode 100644 modules/admin_manual/images/installation/manual_installation/phpmyadmin_v4.9.5deb2.png delete mode 100644 modules/admin_manual/images/installation/manual_installation/phpmyadmin_v5.2.0.png delete mode 100644 modules/admin_manual/images/installation/ssllabs.png delete mode 100644 modules/admin_manual/images/installation/webservers/apache/mod_unique_id/phpinfo.png delete mode 100644 modules/admin_manual/images/oracle-1.png delete mode 100644 modules/admin_manual/images/phpinfo.png delete mode 100644 modules/admin_manual/pages/installation/selinux_configuration.adoc diff --git a/modules/admin_manual/attachments/installation/manual_installation/bootstrap.sh b/modules/admin_manual/attachments/installation/manual_installation/bootstrap.sh deleted file mode 100644 index 6d2187f84..000000000 --- a/modules/admin_manual/attachments/installation/manual_installation/bootstrap.sh +++ /dev/null @@ -1,113 +0,0 @@ -#!/bin/bash -# -# originates from: -# https://git.samba.org/?p=samba.git;a=blob_plain;f=bootstrap/generated-dists/ubuntu1804/bootstrap.sh;hb=master -# -# This file is generated by 'bootstrap/template.py --render' -# See also bootstrap/config.py -# - -set -xueo pipefail - -export DEBIAN_FRONTEND=noninteractive -apt-get -y update - -apt-get -y install \ - acl \ - apt-utils \ - attr \ - autoconf \ - bind9utils \ - binutils \ - bison \ - build-essential \ - ccache \ - chrpath \ - curl \ - debhelper \ - dnsutils \ - docbook-xml \ - docbook-xsl \ - flex \ - gcc \ - gdb \ - git \ - glusterfs-common \ - gzip \ - heimdal-multidev \ - hostname \ - htop \ - krb5-config \ - krb5-kdc \ - krb5-user \ - language-pack-en \ - lcov \ - libacl1-dev \ - libarchive-dev \ - libattr1-dev \ - libavahi-common-dev \ - libblkid-dev \ - libbsd-dev \ - libcap-dev \ - libcephfs-dev \ - libcups2-dev \ - libdbus-1-dev \ - libglib2.0-dev \ - libgnutls28-dev \ - libgpgme11-dev \ - libicu-dev \ - libjansson-dev \ - libjs-jquery \ - libjson-perl \ - libkrb5-dev \ - libldap2-dev \ - liblmdb-dev \ - libncurses5-dev \ - libpam0g-dev \ - libparse-yapp-perl \ - libpcap-dev \ - libpopt-dev \ - libreadline-dev \ - libsystemd-dev \ - libtasn1-bin \ - libtasn1-dev \ - libunwind-dev \ - lmdb-utils \ - locales \ - lsb-release \ - make \ - mawk \ - mingw-w64 \ - patch \ - perl \ - perl-modules \ - pkg-config \ - procps \ - psmisc \ - python3 \ - python3-cryptography \ - python3-dbg \ - python3-dev \ - python3-dnspython \ - python3-gpg \ - python3-iso8601 \ - python3-markdown \ - python3-matplotlib \ - python3-pexpect \ - python3-pyasn1 \ - python3-setproctitle \ - rng-tools \ - rsync \ - sed \ - sudo \ - tar \ - tree \ - uuid-dev \ - wget \ - xfslibs-dev \ - xsltproc \ - zlib1g-dev - -apt-get -y autoremove -apt-get -y autoclean -apt-get -y clean diff --git a/modules/admin_manual/attachments/installation/manual_installation/compile_samba.sh b/modules/admin_manual/attachments/installation/manual_installation/compile_samba.sh deleted file mode 100644 index d73d66f63..000000000 --- a/modules/admin_manual/attachments/installation/manual_installation/compile_samba.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -./configure \ - --prefix=/usr \ - --enable-fhs \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --with-privatedir=/var/lib/samba/private \ - --with-smbpasswd-file=/etc/samba/smbpasswd \ - --with-piddir=/var/run/samba \ - --with-pammodulesdir=/lib/x86_64-linux-gnu/security \ - --libdir=/usr/lib/x86_64-linux-gnu \ - --with-modulesdir=/usr/lib/x86_64-linux-gnu/samba \ - --datadir=/usr/share \ - --with-lockdir=/var/run/samba \ - --with-statedir=/var/lib/samba \ - --with-cachedir=/var/cache/samba \ - --with-socketpath=/var/run/ctdb/ctdbd.socket \ - --with-logdir=/var/log/ctdb \ - --systemd-install-services \ - --without-ad-dc diff --git a/modules/admin_manual/attachments/installation/manual_installation/install_samba.sh b/modules/admin_manual/attachments/installation/manual_installation/install_samba.sh deleted file mode 100644 index 3768dcb3a..000000000 --- a/modules/admin_manual/attachments/installation/manual_installation/install_samba.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash - -set -o pipefail - -GREEN='\033[0;32m' -NC='\033[0m' # No Color - -s="smbclient.ini" -content="extension=smbclient.so" -v=$(php -r "echo PHP_VERSION;" | grep --only-matching --perl-regexp "7.\d+") -file="/etc/php/${v}/mods-available/${s}" - -echo -echo -e "${GREEN}dismod and pecl/apt smbclient uninstall${NC}" -echo - -if [[ -f "$FILE" ]]; then - phpdismod smbclient - echo '' | pecl uninstall smbclient - apt purge smbclient - apt autoremove -fi - -echo -echo -e "${GREEN}bootstrap${NC}" -echo - -../bootstrap.sh - -echo -echo -e "${GREEN}compile${NC}" -echo - -../compile_samba.sh - -echo -echo -e "${GREEN}make${NC}" -echo - -"$(make -j 4)" - -echo -echo -e "${GREEN}install${NC}" -echo - -"$(make install -j 4)" - -echo -echo -e "${GREEN}install pecl smbclient${NC}" -echo - -"$(pecl channel-update pecl.php.net)" -echo '' | pecl install smbclient - -echo -echo -e "${GREEN}phpenmod${NC}" -echo - -if [[ ! -f "$FILE" ]]; then - echo "$content" > "$file" - echo "Created ${file}" -fi - -phpenmod smbclient diff --git a/modules/admin_manual/examples/installation/custom-app-directory-configuration.php b/modules/admin_manual/examples/installation/custom-app-directory-configuration.php deleted file mode 100644 index 3c93d5dd9..000000000 --- a/modules/admin_manual/examples/installation/custom-app-directory-configuration.php +++ /dev/null @@ -1,16 +0,0 @@ - [ - [ - 'path' => OC::$SERVERROOT.'/apps', - 'url' => '/apps', - 'writable' => false, - ], - [ - 'path' => OC::$SERVERROOT.'/apps-external', - 'url' => '/apps-external', - 'writable' => true, - ], - ], - // remainder of the configuration -]; diff --git a/modules/admin_manual/examples/installation/deployment_recommendations/set_session_path.sh b/modules/admin_manual/examples/installation/deployment_recommendations/set_session_path.sh deleted file mode 100644 index eadf03092..000000000 --- a/modules/admin_manual/examples/installation/deployment_recommendations/set_session_path.sh +++ /dev/null @@ -1,9 +0,0 @@ -# Retrieve the session save path setting (default or explicit value) for PHP {recommended-php-version} -# Please change the file path to match your server configuration -session_path=$(\ - awk 'match($0, /^;?session.save_path = "(.*)"/, a) { print a[1] }' \ - /etc/php/{recommended-php-version}/**/php.ini \ - | uniq ) - -# Set the session save path in /etc/fstab -echo "tmpfs $session_path tmpfs defaults,noatime,mode=1777 0 0" >> /etc/fstab diff --git a/modules/admin_manual/examples/installation/lets_encrypt/cli.ini b/modules/admin_manual/examples/installation/lets_encrypt/cli.ini deleted file mode 100644 index f04ec3335..000000000 --- a/modules/admin_manual/examples/installation/lets_encrypt/cli.ini +++ /dev/null @@ -1,5 +0,0 @@ -rsa-key-size = 4096 -email = -agree-tos = True -authenticator = webroot -# post-hook = service apache2 reload diff --git a/modules/admin_manual/examples/installation/lets_encrypt/delete.sh b/modules/admin_manual/examples/installation/lets_encrypt/delete.sh deleted file mode 100644 index 58ea2dc36..000000000 --- a/modules/admin_manual/examples/installation/lets_encrypt/delete.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -LE_PATH="/usr/bin" -LE_CB="certbot" - -## -## Retrieve and print a list of the installed Let's Encrypt SSL certificates. -## -function get_certificate_names() -{ - "$LE_PATH/$LE_CB" certificates | grep -iE "certificate name" | awk -F: '{gsub(/\s+/, "", $2); printf("- %s\n", $2)}' -} - -echo "Available Certificates:" - -get_certificate_names -echo - -read -p "Which certificate do you want to delete: " -r -e answer -if [ -n "$answer" ]; then - "$LE_PATH/$LE_CB" delete --cert-name "$answer" -fi - diff --git a/modules/admin_manual/examples/installation/lets_encrypt/list.sh b/modules/admin_manual/examples/installation/lets_encrypt/list.sh deleted file mode 100644 index 6876c93fa..000000000 --- a/modules/admin_manual/examples/installation/lets_encrypt/list.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -LE_PATH="/usr/bin" -LE_CB="certbot" - -"$LE_PATH/$LE_CB" certificates - diff --git a/modules/admin_manual/examples/installation/lets_encrypt/renew-cron.sh b/modules/admin_manual/examples/installation/lets_encrypt/renew-cron.sh deleted file mode 100644 index da5fd05f3..000000000 --- a/modules/admin_manual/examples/installation/lets_encrypt/renew-cron.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -LE_PATH="/usr/bin" -LE_CB="certbot" - -"$LE_PATH/$LE_CB" renew --no-self-upgrade --noninteractive diff --git a/modules/admin_manual/examples/installation/lets_encrypt/renew.sh b/modules/admin_manual/examples/installation/lets_encrypt/renew.sh deleted file mode 100644 index b01ec4d07..000000000 --- a/modules/admin_manual/examples/installation/lets_encrypt/renew.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -LE_PATH="/usr/bin" -LE_CB="certbot" - -"$LE_PATH/$LE_CB" renew - diff --git a/modules/admin_manual/examples/installation/lets_encrypt/your-domain-name.sh b/modules/admin_manual/examples/installation/lets_encrypt/your-domain-name.sh deleted file mode 100644 index 7d014026e..000000000 --- a/modules/admin_manual/examples/installation/lets_encrypt/your-domain-name.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# export makes the variable available for all subprocesses - -LE_PATH="/usr/bin" -LE_CB="certbot" - -# Assumes that example.com www.example.com and subdomain.example.com are the domains -# that you want a certificate for -export DOMAINS="-d example.com -d www.example.com -d subdomain.example.com" - -"$LE_PATH/$LE_CB" certonly --config /etc/letsencrypt/cli.ini "$DOMAINS" # --dry-run diff --git a/modules/admin_manual/examples/installation/manual_installation/instance.sh b/modules/admin_manual/examples/installation/manual_installation/instance.sh deleted file mode 100644 index 4a75f841b..000000000 --- a/modules/admin_manual/examples/installation/manual_installation/instance.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -# Script Version 2022.06.23 - -# This script prepares the parameters for owncloud_prep.sh -# Handy if you have more instances to maintain where the process stays the same with different parameters -# The processing script is expected in the same directory of this script. - -# To setup this script for your environment, adopt the following variables to your needs: -# -# ocname the name of your directory containing the owncloud files -# ocroot the path to ocname, usually /var/www (no trailing slash) -# linkroot the path to your source directory for linking data and apps-external (no trailing slash) -# htuser the webserver user -# htgroup the webserver group -# rootuser the root user - -ocname='owncloud' -ocroot='/var/www' - -linkroot='/mnt/owncloud_data' - -htuser='www-data' -htgroup='www-data' -rootuser='root' - -if [ "$(id -u)" != 0 ]; then - printf "\nThis script should be run as root user to allow filesystem modifications\nExiting\n\n" -fi - -printf "\nConsider backing up the database before you continue when upgrading!\n\n" - -# Resolve the absolute path this script is located and expects the called script to be there too -DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" - -$DIR/owncloud_prep.sh "$ocname" "$ocroot" "$linkroot" "$htuser" "$htgroup" "$rootuser" - diff --git a/modules/admin_manual/examples/installation/manual_installation/owncloud_prep.sh b/modules/admin_manual/examples/installation/manual_installation/owncloud_prep.sh deleted file mode 100644 index bf4abcf43..000000000 --- a/modules/admin_manual/examples/installation/manual_installation/owncloud_prep.sh +++ /dev/null @@ -1,303 +0,0 @@ -#!/bin/bash -# Script Version 2023.01.25 - -# To set up this script for your environment, hand over the following variables according your needs: -# -# ocname the name of your directory containing the owncloud files -# ocroot the path to ocname, usually /var/www (no trailing slash) -# linkroot the path to your source directory for linking data and apps-external (no trailing slash) -# htuser the webserver user -# htgroup the webserver group -# rootuser the root user - -# Short description for parameters used in find -# -# -L ... Follow symbolic links. Needed in case if links are used or present -# -path ... The path to process -# -prune ... If the file is a directory, do not descend into it (used to exclude directories) -# -o ... OR (to add more parameters) -# -type ... File is of type [d ... directory, f ... file] -# -print0 ... Print the full file name on the standard output, followed by a null character -# xargs -0 ... Reads items from the standard input, input items are terminated by a null character - - -ocname=$1 -ocroot=$2 -ocpath=$ocroot/$ocname -ocdata=$ocroot/$ocname/'data' -ocapps_external=$ocpath/'apps-external' -oldocpath=$ocroot/$ocname'_'$(date +%F-%H.%M.%S) - -linkroot=$3 -linkdata=$linkroot/'data' -linkapps_external=$linkroot/'apps-external' - -htuser=$4 -htgroup=$5 -rootuser=$6 - -arguments=6 - -filmod="0640" -dirmod="0750" -htamod="0640" - -# Because the data directory can be huge or on external storage, an automatic chmod/chown can take a while. -# Therefore this directory can be treated differently. -# If you have already created an external "data" and "apps-external" directory which you want to link, -# set the paths above accordingly. This script can link and set the proper rights and permissions -# depending what you enter when running the script. - -# When the instance is setup either post a fresh install or after an upgrade, run this script again but -# only for securing ".htaccess files". This sets the appropriate ownership and permission for them. - -# In case you upgrade an existing installation, your original directory will be renamed including a timestamp - - -if [ "$#" -ne "$arguments" ]; then - printf "\nThis script needs $arguments arguments, $# given.\n\n" -fi - -printf "\nFollowing parameters used\n\n" -printf "ocname: $ocname\nocroot: $ocroot\nlinkroot: $linkroot\nhtuser: $htuser\nhtgroup: $htgroup\nrootuser: $rootuser\n" - -function get_tar { - read -p "Please specify the tar file to extract with full path: " -r -e tarFile - if [ ! -f "$tarFile" ]; then - echo "tar file to extract not found. Exiting." - echo - exit - fi -} - -echo - -read -p "Do you want to secure your .htaccess files post installing/upgrade (y/N)? " -r -e answer -(echo "$answer" | grep -iq "^y") && do_secure="y" || do_secure="n" - -if [ "$do_secure" = "y" ]; then - printf "\nSecuring .htaccess files with chmod/chown\n" - if [ -f ${ocpath}/.htaccess ]; then - chmod $htamod ${ocpath}/.htaccess - chown ${rootuser}:${htgroup} ${ocpath}/.htaccess - fi - if [ -f ${ocdata}/.htaccess ];then - chmod $htamod ${ocdata}/.htaccess - chown ${rootuser}:${htgroup} ${ocdata}/.htaccess - fi - printf "\nDone\n\n" - exit -fi - - -read -p "Do you want to install a new instance (y/N)? " -r -e answer -(echo "$answer" | grep -iq "^y") && do_new="y" || do_new="n" - - -if [ "$do_new" = "n" ]; then - read -p "Do you want to upgrade an existing installation (y/N)? " -r -e answer - (echo "$answer" | grep -iq "^y") && do_upgrade="y" || do_upgrade="n" -fi - -read -p "Use links for data and apps-external directories (Y/n)? " -r -e answer -(echo "$answer" | grep -iq "^n") && uselinks="n" || uselinks="y" - -if [ "$uselinks" = "y" ]; then - read -p "Do you want to chmod/chown these links (y/N)? " -r -e answer - (echo "$answer" | grep -iq "^y") && chmdir="y" || chmdir="n" -fi - -# check if upgrading an existing installation -if [ "$do_upgrade" = "y" ]; then - read -p "Is the instance in maintenance mode? (y/N)? " -r -e answer - (echo "$answer" | grep -iq "^y") && mmode="y" || mmode="n" - if [ "$mmode" = "n" ]; then - echo "Please enable maintenance mode first: sudo -u$htuser ./occ maintenance:mode --on" - echo - exit - fi - get_tar - # rename the source for backup reasons - if [ -d ${ocpath} ]; then - mv $ocpath $oldocpath - fi -fi - -# get the tar file for new installs -if [ "$do_new" = "y" ]; then - get_tar -fi - -# in case of upgrade or new, extract the source -if [ "$do_upgrade" = "y" ] || [ "$do_new" = "y" ]; then - mkdir -p $ocpath - tar xvf "$tarFile" -C $ocpath --strip-components=1 - - if [ $? != 0 ]; then - echo - echo "tar extract failed, please check !" - echo - # rename back in case of tar errors - if [ "$do_upgrade" = "y" ] && [ -d ${oldocpath} ]; then - rm -r $ocpath - mv $oldocpath $ocpath - fi - exit - fi -fi - -# create / link missing directories -printf "\nCreating or linking possible missing directories \n" -mkdir -p $ocpath/updater -# check if directory creation is possible and create if ok -if [ "$uselinks" = "n" ]; then - if [ -L ${ocdata} ]; then - echo "Symlink for $ocdata found but mkdir requested. Exiting." - echo - exit - else - echo "mkdir $ocdata" - echo - mkdir -p $ocdata - fi - if [ -L ${ocapps_external} ]; then - echo "Symlink for $ocapps_external found but mkdir requested. Exiting." - echo - exit - else - printf "mkdir $ocapps_external \n" - mkdir -p $ocapps_external - fi -else - if [ -d ${ocdata} ] && [ ! -L $ocdata ]; then - echo "Directory for $ocdata found but link requested. Exiting." - echo - exit - else - printf "ln $ocdata --> $linkdata\n" - mkdir -p $linkdata - ln -sfn $linkdata $ocdata - fi - if [ -d ${ocapps_external} ] && [ ! -L $ocapps_external ]; then - echo "Directory for $ocapps_external found but link requested. Exiting." - echo - exit - else - printf "ln $ocapps_external --> $linkapps_external\n" - mkdir -p $linkapps_external - ln -sfn $linkapps_external $ocapps_external - fi -fi - -# copy existing *config.php and all .json files which are required for the new webUI -if [ "$do_upgrade" = "y" ]; then - # check if at minimum a config.php file is present - # note that you can have more than one config.php representing different settings - if [ -f ${oldocpath}/config/config.php ]; then - printf "\nCopy existing *config.php and *.json files \n" - # using find to omit messages if no files found - find ${oldocpath}/config/ -name \*config.php -exec cp {} ${ocpath}/config/ \; - find ${oldocpath}/config/ -name \*.json -exec cp {} ${ocpath}/config/ \; - else - printf "Skip to copy old config.php, file not found: ${oldocpath}/config/config.php \n" - fi -fi - -printf "\nchmod files and directories excluding data and apps-external directory\n" - -# check if there are files to chmod/chown available. If not, exiting. -# chmod -if [ ! "$(find $ocpath -maxdepth 1 -type f)" ]; then - echo "Something is wrong. There are no files to chmod. Exiting." - exit -fi - -find -L ${ocpath} -path ${ocdata} -prune -o -path ${ocapps_external} -prune -o -type f -print0 | xargs -0 chmod $filmod -find -L ${ocpath} -path ${ocdata} -prune -o -path ${ocapps_external} -prune -o -type d -print0 | xargs -0 chmod $dirmod - -# no error messages on empty directories -if [ "$chmdir" = "n" ] && [ "$uselinks" = "n" ]; then - - printf "chmod data and apps-external directory (mkdir) \n" - - if [ -n "$(ls -A $ocdata)" ]; then - find ${ocdata}/ -type f -print0 | xargs -0 chmod $filemod - fi - find ${ocdata}/ -type d -print0 | xargs -0 chmod $dirmod - if [ -n "$(ls -A $ocapps_external)" ]; then - find ${ocapps_external}/ -type f -print0 | xargs -0 chmod $filemod - fi - find ${ocapps_external}/ -type d -print0 | xargs -0 chmod $dirmod -fi - -if [ "$chmdir" = "y" ] && [ "$uselinks" = "y" ]; then - - printf "chmod data and apps-external directory (linked) \n" - - if [ -n "$(ls -A $ocdata)" ]; then - find -L ${ocdata}/ -type f -print0 | xargs -0 chmod $filmod - fi - find -L ${ocdata}/ -type d -print0 | xargs -0 chmod $dirmod - if [ -n "$(ls -A $ocapps_external)" ]; then - find -L ${ocapps_external}/ -type f -print0 | xargs -0 chmod $filmod - fi - find -L ${ocapps_external}/ -type d -print0 | xargs -0 chmod $dirmod -fi - -#chown -printf "chown files and directories excluding data and apps-external directory \n" - -find -L $ocpath -path ${ocdata} -prune -o -path ${ocapps_external} -prune -o -type d -print0 | xargs -0 chown ${rootuser}:${htgroup} -find -L $ocpath -path ${ocdata} -prune -o -path ${ocapps_external} -prune -o -type f -print0 | xargs -0 chown ${rootuser}:${htgroup} - -# do only if directories are present -if [ -d ${ocpath}/apps/ ]; then - printf "chown apps directory \n" - chown -R ${htuser}:${htgroup} ${ocpath}/apps/ -fi -if [ -d ${ocpath}/config/ ]; then - printf "chown config directory \n" - chown -R ${htuser}:${htgroup} ${ocpath}/config/ -fi -if [ -d ${ocpath}/updater/ ]; then - printf "chown updater directory \n" - chown -R ${htuser}:${htgroup} ${ocpath}/updater -fi - -if [ "$chmdir" = "n" ] && [ "$uselinks" = "n" ]; then - printf "chown data and apps-external directories (mkdir) \n" - chown -R ${htuser}:${htgroup} ${ocapps_external}/ - chown -R ${htuser}:${htgroup} ${ocdata}/ -fi -if [ "$chmdir" = "y" ] && [ "$uselinks" = "y" ]; then - printf "chown data and apps-external directories (linked) \n" - chown -R ${htuser}:${htgroup} ${ocapps_external}/ - chown -R ${htuser}:${htgroup} ${ocdata}/ -fi - -printf "\nchmod occ command to make it executable \n" -if [ -f ${ocpath}/occ ]; then - chmod +x ${ocpath}/occ -fi - - -# tell to remove the old instance, do upgrade and end maintenance mode etc. -printf "\nSUCCESS\n\n" -if [ "$do_upgrade" = "y" ]; then - if [ "$uselinks" = "n" ]; then - echo "Please migrate (move/copy) your data/ and apps-external/ directory manually back to the original location BEFORE running the upgrade command!" - echo - fi - echo "Please change to your upgraded ownCloud directory: cd $ocroot/$ocname" - echo "Please manually run: sudo -u $htuser ./occ maintenance:mode --off" - echo "Please manually run: sudo -u $htuser ./occ upgrade" - echo "Copy any changes manually added in .user.ini and .htaccess from the backup directory" - echo "Please manually remove the directory of the old instance: $oldocpath" - echo "When successfully done, re-run this script to secure your .htaccess files" - echo -fi - -if [ "$do_new" = "y" ]; then - echo "Open your browser, configure your instance and rerun this script to secure your .htaccess files" - echo -fi diff --git a/modules/admin_manual/examples/installation/webservers/apache/log-entry.json b/modules/admin_manual/examples/installation/webservers/apache/log-entry.json deleted file mode 100755 index db9051acf..000000000 --- a/modules/admin_manual/examples/installation/webservers/apache/log-entry.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "reqId": "XDyankIou@F-GwxW82dx7QAAAAo", - "level": 3, - "time": "2019-01-14T14:20:14+00:00", - "remoteAddr": "127.0.0.1", - "user": "--", - "app": "PHP", - "method": "GET", - "url": "\/index.php\/apps\/files\/?dir=\/Documents&fileid=26", - "message": "..." -} diff --git a/modules/admin_manual/images/installation/install-wizard-a.jpg b/modules/admin_manual/images/installation/install-wizard-a.jpg deleted file mode 100644 index b1d217ec3552ad961858ca33d82b62142106e446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25867 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 diff --git a/modules/admin_manual/images/installation/install-wizard-a1.jpg b/modules/admin_manual/images/installation/install-wizard-a1.jpg deleted file mode 100644 index 6f50ccb143f35cb4a5e034edae00ebe343bae2fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41721 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 diff --git a/modules/admin_manual/images/installation/manual_installation/phpmyadmin_v4.9.5deb2.png b/modules/admin_manual/images/installation/manual_installation/phpmyadmin_v4.9.5deb2.png deleted file mode 100644 index 6b6477a1dadc8a989b11ae02a1243a0c00fc457e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28208 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 diff --git a/modules/admin_manual/images/installation/manual_installation/phpmyadmin_v5.2.0.png b/modules/admin_manual/images/installation/manual_installation/phpmyadmin_v5.2.0.png deleted file mode 100644 index b5bb6272afdf1f30786551a0f55a631d9113a5b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36493 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 a;lcl@>90PTUHfOi00f?{elF{r5}E*%NW$U( diff --git a/modules/admin_manual/images/installation/ssllabs.png b/modules/admin_manual/images/installation/ssllabs.png deleted file mode 100644 index decdcb342af514eb544589834af9ea6cbd18f886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105747 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

?V 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 diff --git a/modules/admin_manual/images/oracle-1.png b/modules/admin_manual/images/oracle-1.png deleted file mode 100644 index 17ecb70221fc04368d2317eb079730b129702cd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22202 zcmcG#WmH_vwgpNO+=B*(V8KIhcemgU!5tcR2u{!d!7aE$fZ&$KCAdpN<1`xF;Wf$k z9l7V+@$UQaelQqYx_0f_RcqFoYtB#a6{XOS36Wu7V9;cw#Z_Qno_&RZd5(wp9C{{; zW#kt657t6NK?DY7{)Om_QV#SO2_UWQ3Z`k@!oX+{ z$cT%mc`O{Xc>*Z4{kCV_=8(NRk?Ayul4ktpY{I%$5j|&@f9cE&8t}9-K*;)dO^01H z-AAd1%eSWV1oE=trYgplCal>lE?w{k*3_kH5ucNz2a-R-r1A))g26+_YK6fq1Z(4*2^sb-NA#BnP^Rv3u3n{!{ zZ{W3G-uJ;&Xgk8+A%swBnx1_(J4n%$!s=M$A#M>RTdj3zcm{ik8mCwRIshlmj0?5Y z6a7+jKRsGLc!iulGO4R_W1wO`Is?3&-+UDsX*Cn&-j5sYxu~Kcm>naT_eqb{KT)vP zV$J>q;$f;u5pnx)h-{yfEo7$=Gh+?Ir75pOAT|V5_h^q1USf1O9aL#azt+$(yC_rJ z%4J*dGRRwTg_5{sex9#!#}UNRK^wFzQk$M1H~glc9@9T+YI$=0KFiqS7pE(r!N@A_ z0c)2nK4?$wMt5qlAyG$y1vlgUSJ|Rgki@70Gjnk%%F3zIxvTpMN!G%7N_OML+|~)$ zZq;(-;|#tcC(j%9P&I&58x|Nn-fg*go`-v@a6I+c&(PxXBUe&<2L-FcJqR9?7!3H; z)!^PD5llxymh5qYP(95$@U5<|MHb|Kdhuh7q%{1twndRipqNdE<3+1_^Ov*$ zzlCkDo1>T!2Wn2+bAkeF$<=1j<+g&wmo`VcM|oH~jkQVTDtSJV*{P(huI}KN4;YGo z#39Hoq*6~)Gxl>~tTfdY(YizU>L;663H?CbTZF^2G0n>v_snyI`vB@=u(v=w=P&ik zXpbw|cy`{?9#z(B8oNDsd$}XdENet`M33uL-6AI*TAq|)$ItkVIa00)4m4y!g6A<# zockJz5(%ll7Pt>o8PfMqYU@4SziRb+(R@)$?vcWfy0ULl^*Y<3*kkWEJ(JFDyziIP zrwB!?xKAnsczNk)?d8WutJ6tx<^@$%s`5NuZET#GIuz#xA;%buw2+kEPbRGIpxX87 zT%4U*mc`0-%7{x(+Jy^x9=Ln>DiAx>9qCF3&y=N1EmsOzPLBtvN)^%4()PR*WcD6i ziyT54$;MpJn4~gX`!y~z4eC`z13r5e8y5@a{laHFst`}1bD zqDvczYuQVI<*~F21BdBqgBJ-AllD!LQDfxm*14}EU6u?D5pnez4n?x4`g^7tg8d9Q z!rmm0_vm{2L>GS0?7PViY?u`M?m67oysx6VR z&U|6!Aq!1F)1$`1h92OHUY~56ZIbm;^0h^pN;_5zp|r~H3Y9VwEokK2?`isK%Q<6A1Wgt?76tib8wf>E*<48(rumV`L}a?(5hD&qvI9~jD$4vS;j5U zW!v^z7EVMVP`(QhCybiPKS&-3GvyS55g@kt4BZ{7?vgHK53^{`)6=zeJ9b->R$X+K*pocHn%qjNOB@5Tm)GTo8kcFaL_x||}#ClJhQKZ#hW2=G}oPP3e@%g(tN4$5nED6I*1+-pO~ zSu#4#*#`z2I(^IYcVp9~C*GLb-<@cb9TuUqvoUWyp)XcW zJM=RHiI5+8ULg!!Qc!wqu*RiVAk`t%j|)(Vdf>>A&X+vuqzj9Ai2x+gqiY zb~}66!wP7t?tks1kkVQ-q8K&V+7a^$Fe@M6OP|U~Jb)ochV}(^H43FqvHnF}8Uqee zh+cj4mtddiW}7U&&jQ}PLACf3Zjy(9Rhhw-&kI)PA$JL+{Qa9|=+FO;a8ySgCoP^g z4g!IM$-klfI1l2#-nicOLllhrIFv;OJUBWE6V0ipU`ih1U}H0R4sI6B@}EGFHY67a zJVSYPFo?pODi0qdQZ#8*JKw)O_*Ne2;~ui-gA7YbTH5QUdnWkE>lhfhPe>#Ldms?2 zlbp3xc;VnP#0eJZBVl6q5ICtdKv-8mF&fOgWy~4+gcP`rfsUInn$qpX*O%$(=`PFg z)-7Ivkv+!t4MZ5MFbd?p!Dl$d2N6ijnTiQ>-rn9sN^k!jO-h@C_n_F2Cc4y{0?>aRtVbEj$PeMQL(wM062~ME~(-Ye_BwR_TbNALs4Wxw9l;uFJTgY1d}&zs{_Kp&^-ZAzz#Tn za6t&XzJHLz)wAv5GpW^S%#N?uvSVW)T1`7~yRW2+9I#|hV@#4z`ue8CGJ0-y{miac z&bHSio0BM7b;!>P!10QuunUEgnU>BI*u(u9C0dn{((fc%Oz={ z3X{_cr>X$Yc^RxB$G@7Y)jtdXe@HBi5?V&<0hPIN5_MK$02 zAchwhqT=V<=p=|=OoZiY)fw?>yn#<1#x=5P{K~kIPWGQ})V^0ROoPHUa+7 zq)}o}X&pNWDPDzo=jO#)4`mKohkw_RZvAM~uA2G_3mGJrlFJ={lwr)MITwlxx)S~I z%%6|(fXqx7Ju)&tEb1`C7&S!Z|e&yk@M$)-)H>s?2gdguFo_eI{>Avh))gZS`EVH@_}q#A9cO*JONi zfln~gn`{T~#z6bh{(F#?rGVod!`6x|DCqGcN>O0?QQ_*J&D>*@Ta*{`I&W>*Gm!OO zju3{(8;|GWVsn>w+Vt!MYPofGSXS#);4Mn#lJC8#I4oIc)*{r#^^Siq{Yc_ zs8Lsi0xz&FHgM9q4xgqGi*?p=`iD{;o7z@WFh_8yHfO=A2>H*qaoUcv;R`>ziNz8J z9+0Y5IzCk3=+^ar^}zz7mG(7YL0o)PYueV4;QD$qnbMGH;sRNmj!zgu#Xb~c#1um7O;O(Htwh$P?0&PJxUD1(r?xf8pSwjA()IhJej zl%k=Z95+K(5m1r-yG4R|8Yk9oKXYBx%-Jf;0^)3a1rV8Iime-JWN0fiwr#i$V|0>( zbIeXDN|%V2s2WOj%Ta^(>W>s};tS47RhqFT$OCJ?!1b9~&Hq_DiD1}avrZtIPyX`?Su&U-50TPK-_4coV`sF0Wk@ohsXaO1HO@b9`5@K^r)wiFCaN1kFG zG&_M#<9|7L0Zm7sNeOhpBS2FU=oR5V$*;23w!s#!G z|2k$)hBj%b3U~^yDM2q_oS}_Ca~o)jB7on`|JwmHDf+h_{Fj5qB4LWIse~r5zwvcy zK}x&9EDE%#Sy=$1i3&Zu8Nq}+&x=uap-;Evojvr!ba(3)PXUVUJr7X=;awB%_LdW@@w=eQ`X ztcr)e>0eiK!=AiA>;{!9;zWtk~OZ#MtWI99|>&rYVq-2%2EbZ! z@H%r7>+)|%4AVJbLPwBU2Vm~L37DWmw(rE=KHEsQejBP^RC|6Z>3XkSV8lDb$(KIl zfS$Y(!{j{3$GbG1WFiYXT$ChAJIVu-n zgcu;XAx4#P=FLy*IvOk_E5ef`;_`8_0mLUTl*k)bCOygBT%?TwyJb$l)brENg-=}m zS{7xD8~S#r@NQ<%Dq4|&U^7kcc+27-FR%h94<&!MYfP`e_MY9d7h|2lEE}z&Tl+Sp zCa%!dPq1CidruXWV4H9o`c9EuU0tcEscA5F4i2$d3a4YU8y^(j#mAY3fh&{2;jL=W z_aACdVn--aEwSDPp8!(_7sZl7JJ;>6F5gl$~`*l86>{};%Z(}G?!gvu&F{OlOxnMUjaqE_@s`BxQ_gEx zcNs<|rfHkVtP`)cv!RsMuTs0}(lug$Svi1Cg+}SOEe953T=iE0?@+O0gE{XW&^jFE z1=&imnTmC&15dT`o2GcXg6)>qF`)ZKmDAdZUjVucycfI?0vQH$VFsq%^wl}6y~v7# zcHvzX!y0Lc$Rmx7a+8g;gC?fu;`RGAUqR5}CMAt6@}mYGY?+HXH7(7}y%G?G&f+DD z4Y%1M+7MyDt6YO0n00<+OZj;TD`aX&|f6#yC zn_*k6;k(|A@*K7l#`QFMVB)My5o74CK27%W`hK89>gN~t0pI&Bk zzNLMcp=ki{!5fUw#>^Pp_`&%SRhgpEhPH7P$vsakmjvg=%E-r^yi(06aPbKacr!=9 z5r86;)b3mfhUPA|m3_wTuM1|+5`{)15@jh_1}qz}GSwy1?idXU*at53We77HYpYb? zV8bNf5f5){v8|{YMb57@UT4NQq_HDg!D^g} zHCJHUDotxj2Z6msjcViHn`xcg5VLJXzz)ZhepJk5;%riJEFRqXb+g5krzO$D`4Sp0 z8J+^XK^RyvB<$t(`=H6*9?+JB4Q08LTL6e0SlE`;QmXj`#>yz z<7Y7BqBn3PYae{PsNtmgH=RO61AHPj(veNnVY=h!ATRR`KQD{iAhx=x!$~2OG7iO8 z?;al7zmEHAL_+Ea5NMP9EBOedynh}v$-u%**cYdi?4w0As3nzuX7WDLsIoBxZ>9<=^Nj(i_uXa{rT}#h-nZ0&7u4tw~ znVIfWwHd)G-k|~QBO?asLP^NpbuZip&0NqS+t?)n>-X)I%ie?)fusjbMIc2L@7@EG zT}2AVD!)Mmx%BB3{1{hIt*2=8!u!bwJ?5fm>w;wAh zWMDqiloR`WdE1O@3m4Ynm#LzXqCm5teT+l5Gp6@gpYBjist^y4%x%$4bMqGyY#&$s z+6Mp)3G3;|!EBo8;(LGG33BvRA}D+DvF{}7?VJ6>13C;s^+_AZy?SmAlrF3d(~d7s zIZqA?3t=KUsuQ_?OJ<;5FC7@=;FaIvg=hPdXbo<59kl)6+1wvtfJwZbN7sg0l(RN| z3|a3>J+Hp;{7!lx9>ht^j&sU1kN-BlX zxz7ii`jkeHZAmxwkwK~v;$xMZ*}Jjfwzs!I@ir!A!0~v85rpgb%q3Ltff1$ux4zMD zeSLicU;E7Kn46Oc>vEJa!+xO&1B5>~OpE4mVTk3viRl8-Sy#^gc(}4#_9bcH(81*( zOq6T>%mrdrs*Juy*?8Y6wmlkEUx1YPE&qc-Byyk}z$>CE2`-s0L)|TcdSwl}Y`a0~ z>RrnXj#pbKDLX$Rr?pt#-@|6}MfY;QkxTszqSQ&4BL~?eh}DD4ydHk&SYJ~q)-+HE z-_?4@(K}@*b!0me-Vv#;tSIt!<>U1;+Qt~a67WrQR#4FXabB=lv1SxLLSIHm-o&wy zmU|19B7NVitW-g--DiwHBZo*Vu=b)MVcm99>-Z(vU?yquM99RzdY{BvlriL(F8k!{ zrGm@VuV6_Z4DB=ysR&+XTxSVpzG!%*7&50?n^+~eC7dOZoU?EiaQKXqPiN8gkf7(; z=Sh_q>fzPcP1!!GTjiukJfiw%&|P#!vQN(Y{svq;Gv{kj!EC!0Q)XZN`MYXS=G$Pq zfAaqSO7s66Kc0C1|0oXpeL@)Uf2<*Zt>RG`%W#ns`@fCwZ%5P(_H8u!|OsoEu<%u@stq?y__$uBzZt&@}CM zYQ7yrV^tcCap^J^D5a5GLuX7{NpR%0Yc0P8ts(S9XT1@mg8>GxVH*0cJm>XBz!#{z-Mq}q%nUMbkSBz2 zvv0M{s-vUwwG3xj+B$1{>T*x{LMeUeh~ck+x`q=gx$$ikQ}kXEK#9AHORo^?Wup4{ zUyh?Dki-4fs@hjL;y*!^Zj`bxK zf+^H9)#09$CKM0`kYF&S@RkP$T=*xzFP*{WwSlR`OOr4{3i=Xn#JAS4nMl+m8=r}0a zqrvg+W0uF`T`&E@n}3t=49SJ>CiwfSX$zRzg_+xu$(-Dl(s_9WczEbyewoZ(G72gK z&|h#tW=b;reVm-UYPhDxMc}qKV%-^vatGu+>@w=-SKpnmG#7Fu#FAwvom}xlLvJqR9fg<3g@G9zB(0wh&Q5|RLU5D*L zMb`F6QD;}f72-%T;Pj>5ztiVQvDkW#b2@lrRM5wo0H=*FijWZyFg!p@gl`!aX?Jjl z$$&jBAQG2xVZO}-CCZ8*?agE+FAeMxQJ1)+m8w@77-KSx%!U!Ta19MS%ruy@uNx&o zUA#6Dv4 zID+lk_%DhZj^PfqWz>Ng!X*lTqMFl&TwiP%kAQ%u7M5GtOR`KsLFO$diTM4qFGBvE zTj;WVw4%FGQqdD?{fSq3ov(kajBPyWomdd}?+WDKf#<*1 zEr9}&R9K$?+^w~>wP-(FL;mcjV3Gxd0_A8DT3TA5%q%p)HaG8u{l`^dFIWiv+l54Y z;;y#=!XJH#In(WIY$98ko&oeJMui}7`7EDFMQ-5kXMKLC;}X{qUC+EGqbIe85toi7 zzkeRnvJgn=*f%;$;^#4YH z5W~`9q&tl$j#LCQ?@=`GpHz8yOGi4DsL{I*r~_OxAR7G^0Z=}zjJok>{b3KjVe7Fg zh+04_S^q)Z0i#;J&%)qgOfLIuzgDR!!n|RPvBKCHsbiKXs^}@%O2y7N-_E91y7nD4 zvqNqF-Fmp}Ve7?Un7z-c3LLGjM6Ir4k_L6AKz@eOvR)|kNfz>eR0PB3;|Tf!+Z<)hy}kOKr9XU9vOwxreRuS5)OM&y@f znbUw1NU11a&aUPAX^qd$77-8_YU6L)JLxho-?+`TxIAhk+q0^v`jt1oVK&o`&T)0> zCYrl2@EBy*^=_Mhy`eaa!0B4Yc+Pt4af_x{%i|Q$ahK6m3fbM=-P24l7l81x?Uys6 zG29Hf9&o+X%hQOXZ!|Br-7eF^p+H0Ft(`E{tsD?h!JWmjNK*j$-%qE}@7ha5GNK9I zFV&CQ5Z#f|?XIshb*wqs1z+k4Fg=kxF0g%t%Uj#p8Y%aS*}er^a#!KeK9AEx8(@7u z!~_Gf`))awnO}AG2%0}1UK~yp`RDHXWRl`bG9;eV=3{6kW}o{$z-uneh6SU$xilVA zKlHEM&qt#u@nG|QsqgD?*KrEa_kS2qW4O6;S8q*mI^go?J$jw|m_t-`zoDC5O25ZO zVhj-9_1Yd{nVmXc&`t8m1gF)@HcoS>n$%Ht@AnG%G}kkWCW1>HB!(EH1$`&7G)po3 z&MG#ylu(}7eQF?XL-a~f#VLffu4n6%V(!n;32hv zg`Zl1+zvzJ5u|B#bL0xquawy2Tgi72I-coFCCnHp4^MtP&qiZz(!=YCg)AD-W-bpx z9zti%cUf>us1~sHZhC&&M}yNEB9?d4w4#oe;&v#dUbEydpTlZ)jv7?q>z!9v#uW?{ z9hn(#P;^lb*(>;^ZP1?oyjAo>~OH$$a3gT-YiF^=M zKaDpc@KT1teCl|dizWp6?wAOj$z^@8y3P+CmGdfe-_iY!;`?ipYo@kb3uK5^p)Waj zb3q*Xll^Q*d#Q||F0Qecz-08j$Mwl$ZU>KKBpuQ3X&lgD`C09hK#kBC@0&ZNjHf3oWO-}SAT z=saNgxz_Br+NN3bflnMV*4!Rja69!~qq$)S8+)D#`aVnge^IAQyJ+;)*8R15>LD$PjX+l^68m zwU`3O6=2qgov-E6qbU1>q;s(zF=uHX?ZvM&N#^ES-zMM1%`We%Dvj_4Q5-1=-8LY&++DdQyyTwQ0Z%)Wc7Ke4<#1?q%8LVU46(RZaIIX$zs+KDsK2=&@|TT? zvbSKSGxPNh2An54grM6rgsN{*FWO2%yD>X44%U z;N*BXwCUv4k(2~P4;BFfT}u6`ANM-rc1eox(^U!uHYE~AANr+PB4EE=wqLV4u3n)I zTT*j38z|Qy$DuuZSxGt;z@n7vDod)s+Ile9uRcOf@Ezf+lIAk{B6qbk%EUoEMxVA6 zA*rq7bF&$FpFpO2a=`x-7~SUsZ+nMWWLg}De{A$LhwwWlbVrgsbf!DBYuEKaCWYqb zb>m{vW6-$>6Iqbed~Om(_`av4InKis+D?%+^UC1AS@Bsf%bhR4UshzZp3&W`w@38N zTK?hCab2gG@2oQI&o)-0K9l{(DsWO#)qbpLcn7#=W>X&2LyE_UjJ%ECt7*uU!J8=E z%6_odK;)>9yAt7qY?%6^G z2aaak=$bJNj_Wf|DcVEd?a5rQPEi;XSmkh+ZoJ6jyaTrxlVy9>kJZ|1h{!XFZ!@#I z)YfE%I&gIA!#avR)=KW!-#1n2Ez)i3CT=QmIh+b=3g3~thw3V4Z)O7tmnypG6R83J6{C(@4xX$eT_){OvI80cS5KRH2&)+QzoFHcR#h+E*WGK0lFa zu^OkdVa1vXRC@l>l}yl?)r#v~3^H;3g}}fAv?> z+mv+;{5c(qi=g@Wd62iRiB42z-nVJ$GTEH>5R1a|-Df@DOxQdj2No&N!RPM!<*-(( z*VcTlwX0{=J5v`CKyh#DojB+u!t@Nvx`lxPyL?HwY<9*E`IW1dPNT-2FCV<8=W8@} zt?V~56fu>MqHiv6JwC!}wpVdT=JFG)=xzh$kJ;=0qYV#ZAMDGL_?z!+tI_}!klYG= z5oi8DyklX-#Lpu~omXz8nOXVk$Cm6PNyzxPMI5NfoW0To_r2;1D!we^vZFI15s@`1 zwO>@xhx;LCK;EKz1FKj z7W4Y1c|qQ7AYU;&9cid=E*Yu_@nmeUcSDb93R!Op(kMH`LyBWZcQVyr(Yi996-cM0 zYI`25tz8Mt8!P}ENndrwAz^&fc6pS?G@HL9Umxt}NR&Xy%D{EFc8_=Na_Vd0 z!<2~|vl*ilBS$Q?F`O%jxO2#GIDy}AUg>1pIqu((-QLJ{xSTSX%x5?23;GhOWa1LW z7{u;4`{U#1E0BHAEAZ9TOFi2}l<*r#{)x_O%0mc6`=a|f1{#uGO5D#qyJ4am@8&C5 z0r#W5peUb3Y0Rls;#{Xm(1M#&pj-$p|Sv=*3+# z6n`3f>U);8Lmouy?B%pOey+?_jX`D?ZGEa z1}+r1`TU*Dc=pTUz`qfuAog~*_xdIBX{=S`+?h79->DjS6ko`?v(qKa85I?_6jfJN z3Vxe67kD^GvV+PeEd?8DWxeZqNxz`q@V4+BS#I^z8ib-8A%~zDs0-w#x87dAuy58k zbejz5^C;?7mF#=R)ZLK1O7CK03fEA_u9x6wzy0mAK)6S*{mgjREOm|Mrw4Sxx(YL% zsq-VZSaXb~NG9|9O$zH?E`bUCOvj%@WtD223gI>~QvT$9!=hUlt=~tc#hV4I#~aAL z$I4dfb@c8lzg!N$hBwD12vy3J=8pgTYMAp;JWl>w7l$)ev4|pU8oh&?2Oz@69 zVN%D_K+*w?MqOmXyKmjmziRqoFPOyI)>0R{R72J&S^MKusw#l$VTCx%x7LcK9b6x3iDNb0~p z{uSEs0imC^i9=2E)01M0e^}$5+DK+5)D&O!#KY~434To2S?Xmi^|$U{5}5$TlpBOc z+(dyymwOWe9*`LrCi><)H-M|pOCvEE zucWA0#)cens!Vem?m(L3a(A_H^+tDn$LCYoIqUHBH@k`6=^mPChp2qkmBZ}&=o zaom?4GHOq`>BPZ8Pw69=fU@uXAT3V+v0~v13eUb3tB0$+umZOQRC4aIC|fpU z`#Gg!(zTCe_vxE4lVYV4zgtB>spU)`K3tYgRE&w(DThwGQ3Vez(^yhLenCM$4=RF( z=YP{g|3kU%&Vf`l=XW!keXIGn?|(Dwf5GQ}(Kb>be8yi;@O<)dRW~zh$J2jXgR$sA zLZRkJPuz8zs=4&>VKMC$DGdxzK-E^E?ezJo=HstE{rd*Kjz`_cYk$#YG)DewjJUAv z72nllKW9NFgLS}W>#yf@QjG8GHzG?9mn!ZdD3A9mVo?6fJ5>5e=xW{YaTDKfk1xHX zhCJ8pu;1bF{xE@%vUTjV6Tz>~(UBri>#Oa+643BoZ2RGsk-PW&5aqFJ6k5as3dpT4 zZYaronKC4)vWvMV;o;ti5ZAkW*f}LZnXx~)I4J3_sl0u>o_>r%x%7i@b+``6@;RGI zJP!EZ51oNmmQ%}K>Us2>HLcv^9_}Of6}gw+6cMX>Hwa#K_^#QN{kmaz+`?$*ksq4! zee9K5u8EKL-!t@6-mMD_^j;0A^1GFLT=%~rOTd4;-1ehE*G!*Q)Hzg{II(&G<$oO7 za{%%9rDVPja9NL=K@LC5CDL)~>b~BMJ>ES#oICQ%*|W&@UNwYnF9W@kzO~(-pmZG5 z87f?1*I~!qf3Qt&4*FF`=C)91ABS%UAvVy~COEv~A5Z1@EDI+u&hQAb@aH_xNo~A; zp~#M0RGg#sAq~~T|8|JPZ8q>`o2-lr;xaqLa>wNW0Gb5LU3XT2$eD6PHVv(Pm*!4i zbaX|_FJcn&2)^Yx${<|B`5BhYWP?9c6nJ}mbf2)|ZR1wGhwJpKO(xmK=x*|HLvyEC zwZ3?&KCAUAIu5)) zH*B*%1QH*m#R5X(ug0CW@qJYVmBp6k4O>|8!w;c#=3I>By9)oi7NL~SGqoM1uQzw< zFCi{Ot1&j&j^~^wI@rKZC%FzXSMxO&r4t^&`<4caCcTcc^doB;_lt|%0E7#KXCmFM z64QDu*V`SBosW*#fiEzZ*kEVn{Le9LwufF%QZZASsPML_Yy24TUcv9R$9c^?65C<8 zSVkRqdxbJR)yrLy*>O|!c*PbJ18H~wKi*##pHw|Uvd>1DKz^Ia4rjd^h0AF_f$Hdz z2l>Yx;ElyxH*Mgt*wkz=Dzqz)BCLHY)Ty~Ny#9vGrI?QAAJCzdl2N>$$oOKun=z_h zV`q6p`P-xLrNNy|`?L0l&MJ4|@sZ%=n-}kTagr&|gl^{c+%wc)F8SY*9GA})5@{n& z5nXg#&1T=^`JX*gSvZ_?f5`JcE>XHec_#?sE+Tz zgx%^h_vmpjAxX5g=A~KW8v28#Att^>V>Qzjw4QNUo^$(f6lZ_uwf&6`6BV8m_3l^R z#zDtXDI@-vHvNcM$8iZHQTW5~LlDM2ugoci$)eueNheB`kADj44zZ5?(%^6=RP}ww zh|AML3OZE)QCB@))#nvn+^Y+K@*N)p3Ls z=wdn755bPbgGI=CrsC}q(`v4#!FD4DCr>q!D`RleiQmNW% z=Ex?AcNnuhmc7qu`_Gw#sgae(MMHe}*pkenhoi?$|NHBJ6z-k%p%Q;(j;t-}+c>3r ze^E-mgHR(0ts7fqZ)>GT46a~`?Z@kPO}VkI!&n0MJCu)Q9ug}}Y_s`qAV5urJ7=Ts zq;&~IJ<)E^aGXUlED;pkwiQ$^V4tQhZ77qrP)6*KwdYjzalO25Xp2`&xunS15gMQW z=_dL+Yx>u!;=cuHXf7%8Ixbu?56aR92!9~@Tk!Cd)dA*DDI4$a@87@qURSs2)MRdM zE)S!p*?+3^bTwbDwL517x zdHqG)0s;zxYWzzu;lH_k2ub)lG-s41J_K-M);%L98jkxT=z!`y@*KPEVc3nGofAeD zp_IK6pjzwaf!jI-{8yy>*w0zd>-1TH1(Q}--VP29>qvi{{Y}^>!X^)xJ`WInm)ebu zDvT{nMj;S#hCc_@fJ1BaFm~{cP$J}i)gAu1@(fx7+%^P+psFg>Urmu#7^hV^3aN^7 zy?EkKaso{V5>!~<^nI4)IzY{U(9ykJ<;Y$+I<=Er0O|jvX%q8ty~JHdjf{bRqVA31 zijwe&C3tv~?H2hQV?(x7qIedD6E5hjNb8_N!{5U2v_Q(8!r4V1SrxxB@-n2ORJfwx z-zsnYH1O2c$x#dr!RSw|9sn{(LkED7{;B!kR3oy-^qn>%-eQz5TYMqyjBmTdo+VG% z{Q7BmSUi&x)D|L7QO$0`K@d$fo$Jt0U!Z`z`pM42!dBz(`+#xXaJg-;jqKccOCe*v z2jxJ=4iXO0N&*MQsP%jK1k{Qae$s}a+JrY54ZJx%MGkC=m4m-k;|VePTJTR2=LoRJ zOyPO%8V$c=rQB_ysaWgyyentZJ2m$VbhY%2QY^juow>J6F)_M0D)b{n)5EfFf)&!5 zh1Kn1@U)t&fQdI&K-}6f`2+^PkzJ}wYw0}tZIZ4k9jLT)NfjqUO&|k&ve%V3QaVB8 zf}2N&n)Ah>v9ing#dKj)C*z_x0CxR($KW_L2wMKkoZ0zaI_NnfWoxd&AcU&9Qxtii zfYMAmwN}CH;Odm@6RIuuq*=u$Z`@VA2Fo|GS=VD&QLQmv+9vW1oJ69|q~+>t$Dg@{ z7)6N7+j?2ZXW*$hv8oM;t_hBFr;%rWfJ()`*bcHt`j>8!bCp6By5Wh;A;<^vD6(+w z%e$p;f3$&I;f8gAPDt5hRtdKZDRBn2BY~i-KE$8B0hHEj6G=BnkL_1R)&?_O| z_B1%RY~uR3x2ySKkt}ym&34xSO`uJpoIQVkZ?d(ly|Od~V+UUOyDRMSZf++w-*b~L z4Y8?H4O+(=9YTga==8nxV|gck6CdwLFw5rpTb8W?sBl*Aq&A5%vnjmZll+QSRydTV ziWgLBUM(iDS)&$}$M(vFKlI(!Jak8*`YLymhADk&;ylS&U9-t_-|ne$R7B0aIR`ag z!AJJ6V>`}CQe%TNyfl7VI~M9`G4K~#7E1yKYrxP!j+&*>46!3?iIjBw(vW4Ze?Aka zowv%q_P4T67d`bSdf6`>)@E`8_kU`=kBOJQ4t7atN!e;u6_+*sHwo@4LZdZn;wc`LMe$tP7Fl|c-tjz z-eX5>&4%q94p)kXZP4Kl)ERfLm4L7GSkHC#)T`MJLOg7pHgaHlD#lO-PAVb$Cwyz+ zU*=Z##I3Vt92n-R8<}=V?-%_xra1ki_{)o?xnpdHD!#MlH$Jz~CiPwhKeg~Am4=Qv zioLYSw?@vj`23zhVR=L)RM`P4l1%<|4r^*YT~LLyOm7gc<08YOTQ9yt$8HdKExhys zEC1A{>~xEeAzCMy@ILjx$W($)tg#_ljubHnR z!e!&{soh+=6-+>clj#&c{#43r+6bchqyPQ{)qj6x5SkcaL4=m{m>q*Xd8dB|plm4R z27S~2orHu&#Q!D?Z_xr)!@%&6H!{#Q+H$s_!B}GaWvlTKjHRH5u|rpu@ecr1#)F-j zpix&i9je8HbNe?jcMFwD368$$k6ILAKIqkuGeT&6;eR#T{JHW(5B_TmU#g{S6b&t* z)%CHC)nFZ-ZG>8G(gj{1l1Xi)`4VF;In#3|vC`oNIiZ%gOpg3W&5D1HZE$*hFSue( zHE)i`2_ac4YpHr=@oTiBW2M_yV|86KO_lNK(<20`4xuP|j7V+Q*a_|Yd-y&--&G!M z22Vlz;*JI@HKtJ2aQ!9!PW1AbA{X}Qi zho1NlWVraIIqr#(Zv=2UXE#`-tO=}wDk-n-RE zyZAfpLq#tSA8&&CC8xu-#m#v$q00ktaAyr8yBPiul zL?~5oQb(%vbFodqlj>taro-Ki-ZiJj>7-H6|60l^g;Kus{p-)VDU7+%+5Auo=j-9s zlf`N?MNg?PJ{<{H_FpPF3lh3*tQ7qgT}57 z13grPAT&27lj(^>#hLUoNQw?M^9OE4px2}X4bC%)Vfu+IPd=v>$-s3yv3gc#5;k~^(fzvj(#K@y#IBsyh2p+&Q5SlZc(xip8S3ne0s zG`^9y*RYTD5+!y=IFNkm4~^KAdbOs!SL5dM4&Pj0O5rE4&Sv}~P3QkaDsh05SoIAF zQw^WyoasD0{#ZWVKSk;4<944qxi$DjyG8|)mu4~sEi|!d%4P=lB-ZTWm_0Rr{x*GB z#2HN_e~Bt>^vnINK~D;_$tJ7!T$oSuw79jkDX|P5Az_eaIO?vOx z*tu^86i8zuvs8qv96T-C#8t{G`HQ-H;_aTsutjfwa-fQCR$BHjF5x8(1lYaCT!Okm zo*)kvqsKVy6Sr+%yeFBWfU*Dkogujd1YERfL`7{pJ?O+3pWG<@wr=FEoZ&iAUZktp zR`+4XlG~=~^%6vsrrL5mf@IogT6TM%4(Tzs$GT3(mgtkYGa%u?1@tvmwU;M-Bh|qz z$@%?3&Bwv)DmD7(R;oOZtcwPL)k&>K4QmNiw0%o!nqJ9sXrQSakX&(;YTO;yjCG)% zfLs-tu1i#a`@^lLOjA$y>qpe56Vz3Q3@-1w-=F6iK__U?`+r!WutT4$P{sk)UBRDGB0GF)}zEICxPjh&|AxM!5S%~g>;3v)(YN9+_toF%yN?e`#Y;YboIIbe zfhI@<5f65-hD!0Nb>onZ=SPxIp7z&5Kz)>af6~Z~M`*DHuVTAdhN`5{lsIn8}ivFjoix@V{?lsJZ zbi}{geabBV58w>_=6X-wEGEG^sj`$Uo25~l@!_Y==@)~wdh^v#2U+tc6!>0Pc*!Em zdkk-1-uk4+nWk&c<>Nm_@js!A9Cn6|0RU%nN3Y)Qs9OLpO^$WTl1pi!EZ=i#3kMeA zX-uq;W4@*vIGobSTvr5^)3jRPWne)$8R)B81*)clHmz8D+1NB#GejE_@s_&&|3=&% z7Z0F$j)D%L5`WPaW2pR;`igVCKveAw(Ae=8zUv?7EL(X@^N?*r+;5xc`+owd1?I{Z z+i))4mJz5`b~k1+z&b%sJ+O?7gs8A*+%ZyAw#PHCSsN+jn~W-cap~~*a|SM^H_l9* zxQQsX%ULwk#c1$mb_|1E*R||ePX^*9SXy-q+Qz#ZK*3_k89eB7{z{li`|8bzJbbBw zbBK2RCop0!oL^#|I>p*p3SY&zm3rbSjb=u-PJ+(0QKP7kzU@2fB6Xo3-HvKOPZ%G(%f`+ytzOn1Q$2(DweX;S^ zgF}#FblKnh4szFJ8}`1V;LUJR z3eVFVK3j?!Hc!v4MW2TKbP}jqfs_y{VRNnVEAO1maB6%trk(L%e)xH27n{r=zcVG2 zZ~O`TZ3Zq#VnsQ>isxF9Van%N=_Rl${^KEN_KhAqh(-pAk# zbXGQUC@}^rO4WNSZ(hh9I%}uJ^BFQVUJxQZP1#&L0vcbLfw!Oc3V4GC-c?%BHO@5A zbF%ho)!V0an8Pl7vu^%lsx7?yZK@^thpE=a!X`@%VA1%72RKbqf~%(+4Ha&}y3+vZ z`jR3{&(s+UQ^UJB=~FkirfQ8fBAu5zCpJVR#5e*~li+4~lTDkgoz&;dt6MB_`fT zAC^=yWnap!jD43S%9QLHl}45@5mF{x5ek*9!pKaR$Z`v19a)Bv?G92DiV#^wNE&3{ z2J?GoQoq~p)4jhxXXc#GdCz<1ywCeQ-|zF>XPZ(G=){wQ?q5KG?pkpor00w76sx(F zMz-jnS!Tx!yeTcxjGt4NKGDPAvYT`4 zqvm+p52Qh19wm@_iP=}_R@)06j7!WxEMT&0@VcqlfD$x2A(Y207C=UYbOt(?1K4Y+ ztufJ+RcWQONpPPlXA4;T6Qkt{Q%qRK5_$TPgcwsT94gelM*)u}N?t5do67rGqBCyZ z-c(|nai-X~vtI|-uuTVT)?0WXXl5}_k72r1KC0tK(DA}!$k~3T8*QkEt)v->qN1{y zefm)32lPH|^OaVJ|F`4cCw{1Q$4j>dCNjLcBCstX{n-zOWYZJ{zVSP6m#;-=RglCKuB)I17LoCh#;t2+@yg{qvB(D5kFM#K$>( zZQ@Vw&9FK?r!jRQ%DU=ash>pK>lXkz`Vu&W8F>Z=BN5LpULYSoVR~z4;mTS_x|cc@ zr4D&G&py-HZylpPQ8G(Jc12`Xn+;9ncC{;%GBXzLr;6U%N2wZD z1~%vwYCcU%Qo3O)u#YQ6cPBU!C?Ja3p`O>OTb@dema_#1)m?W}mPwZ&Idnysu#~eg z4(Z@c>77t&lTuAfDvBE7eO@pd5Y=MPzZjVJ!dWdzfj|0kW6fUE4jzi$;A6kil=_L8 zz^-FW{1v%d#h%33Bo`&e7-28HD?j_OT`FR_L9hK5q;s(tqTW!UH)er?%Q_;*LeOTk3#h$dR-k&s>yZ-@_YQ6 zGzlTjk2(v6@qx|a9gC(XY~wEv9;WZX)k5zt+E{q6EDSYw6acoAFp#AZ4uIgfXdU`n z@@KXZ6pu1z3}j8tI8VQU3+iu|(UB`R2FGjfJSRn%t@n-yd9KNATIl#G;yo+gs@~4t zxQbHme9ktiT;6q9O=9TjF5;$7p#ZYu)xG|%9JNN0EVNnnGDWGm#%c)a& z5yzge$&R92=-S#TmQ8l#d%9UUQiZOq9njs>)_kIO;d~@CLOpt(eeQ-9U>bbwS0b_v zcM*6aWnPz|7M)y75ouTJ;Ney#`Cs|?%=Jk9U~5FolhXFYSHDs@eu%qwnyR%{<4S## zZJ}Xvn9Qx4nVAjNZhrnbQUxhDOp%RC;BZ8*-)0;`{Q(fi(A@DOj)8I#jktv&_@SxOr|sbzEI_A|JXgeUuj5<(3R4 zOR1ut4;7U2WQ0G0w{F&hBo_vgSh&;Yo6u(z_xgEUWT?m6XHUAJwW<;DSlKpjN*TY= zC~RHrg!d91D54Y@D%}uwx7PRY1cpj?)q2nQQC5AmU`KW4%QhMgms5)OAT)TseU-&! zwHx|v4~u~;ov|iA`dhtkpQ88ip&Tia}2c28&!rXRDHu^AWS=Y7& zN}qBs!2lFl%7<7SEJH{hOLkUmF%T|0)#Reqecl=fc$aMV>=Qv;^Fov3U6o5)p-Cpm z_I!&<^aKc}ch{c#b)JQ|p(82&|Amn~^}mA=IE#OgfaQMeL6_)AjasG8M=Udt*{bEL zP?5)FsIrEe2{62kpw%7RU@?6>{sgVnSlzmIQN5oC({<}tgh^!ni7+}20AWr={zRBc zeSk3RMMnrub(AG#8~N2lqzf?xlEWn|(-cZU$hauGH;7{%%{z=N6&Rx2lesY&smEliHFid7b8w#7Q|2z|t zgXDJ~c*ft|S=wldEN(e*x!WlbR+uVR*q$=Uc=bz^i4thir`|i}Sbq88{X^8M;=}P* zpK?D;0eYZnc%`3`X?piXMEjKbaCA9x;i&f?23FU1w(ou18F&S)U{qkfoAzcAtCU&n zS%1&wqq|KBh1)~8Jqay%5q%mzy;qN5DLe8|6z>^6P%OUQbo2Wgdi~5VT!mv}ldDh_ z{?1htxqej&9mlHTA+o8}PP5%mTSI6C+gPO^i_}pet{!DQQ^piEL)Z@;Goh{W-Ke0q zOp^gq37b8>9xn<|<#&4G|4(+n=a5+|>;cdC6HdZxFjqQ2N$&vZdCSgdXFTD(?6dvP z774kDtBgty0I*(OI`|3wT@n069^Cx!4;tn#YGmH+7GMwVI~@?2$#e`{tiPp-VS;K5+M7Ls;e)3J5v42V-scsy_MM z60vj9qcIZy!gO5)=b)}uQ!IK(f!Mu9?Q!Uqv_{m{9iW(YkK+T)oo^-F#W>YG#vH`e zrW`Jxoa^0QYs|7V^Q{j#L)5IJe))?|ILwSunUprzs=C`5?SzMS2Y zO&_{^!u()xg4xh@hif>GQ!A}n;~!5{5snZZQ-zYrok*ERdnMchvVeM}fhlZ7d#vVO z$mH#e5)0gw#s1n2-avWYfg|2XS`Qif+V#}hgPKV{wNi(cv)IKxt~Tt%`7r&(T1%oi zs_xKx+G2S{E^^~j`ReNP7(Azr3V1S=WcFijg4B71sk>uahhd|V3+>XWs@QW;QhTnd zIx|yS+I;G$X%XQTl0o|o1Jy?Z?!njAUwR(k>O;=!UTS_c{S%6jr|URrT`(?kRC4UM0Xvc^_k3pvskQb}=3Pt!wIcCvIA zLqA0oT==7SDHXJc)GObm?DBof#wa@Gai^#hEi{+w-^OB`0&8O2BczryIA{hbEBhoT z`bN6Zg?a8D7QSjh&GENMT8B$q+qn8K z+BQCcjP+M0P`?JFso?uUd?C}FV%#}J)IOv*LXq7iOwwrhjJk2z7p6tf34d3e(FyN+ zr&&=q#Sl0$K26Z%1fB)2PWI=Y)OY)M9H*TbO1&=zp<08DDp(bCYAt)D^sVK_okt&f z1zGi-l)}4NM*k7C3>gfW^C&cN>yhK3{b*;Gm;&wWEobB&KSoIr&nV{Xx{VB)iADy` zal)};R6)POOKcN!$yEbS~q>G$)U)K`hd1K6p|^)KBa zU)e8==Oo{y)ryq553WRUHmFh)qKbtE16Hy)YStRBm7VeKGb&R9f8F_H+UyB0#H7~7 zyLESb@v+eXe?1Ud2=>nq{FWRUVAK=IE>kf{eH3=S8oO>m6EIGrl*3sJ{cL={F3&st0DP2H51Qk*J!@~^IT8krD3{ujblt* zNnYOvjf0-(>CJT*!AkDn|-Z77eg*Jg1C2JQ|Cnw`u~0L=RM@eU40PZ8nj>dME*XY_D9 zc6+8?j~yWN~_Y-+vkJ3+3!XJ-`6*{@%}TAXL{*@5-L>Z+>joSc@M*tt3NVdw4@_wIATUhrj3Uj$v;#t#W>fMP@ebLa&C9gU-8 zBjmLdjy3p9$o{&i;a(z(%qx!-veh$e@a4IP%25#l0o}S>&9Hhc zMRG0%8`6>UJKAWp?f*o$(jylBL7TV*O*q+w?@e0ntmg+ms|x{QPbp z&{&?R)~|T^luQWcWVCM2--~l%hs#KHL`uh^Dr?{oN?Y!y#)wGr<=^E*xrvBpVz~T( zgP*whwls=)H2TVZ5;|{m9#n!^+8FH51$oYw8!X!_xAS6r{G&@T^Fa@R|fu(-0V2YW6gG-0<12l4lc(J zZB12!e;d3AxHyyK3+_7Is%|5v52VPR!g@?xN7&;Q+EXSZlv_8&(%!VQz<3LRMUp3f zmU<@%0kYl6I?Bqo(ke=!>ARvim6n@>X}mC{nTzWn@`7{;94z=`HA7xro;Bc4NPD|v zp#Dk5jmy9Na-m^il?wv{pwT=TC0iYxyHI7$!!@KWib5HEbu%`vk&=?W`Z_h0HvPgy z#%a4e7&S3brkxL5m1aq-OUugx)@x~MGQ2Qm!&a4i+`)F|Lmix*oc#R!o@;PiaK~C7 zb5{gly8=ar#|7oJyf?l3P;Jgho2{)z!)CV02$6@s(L7lXI?~41bF$iqgwu z%hL(ka_6wpQe`|~k~{65MyX~VQW1o&W5g*jC;e3Tin{JHT1a2G<_cPo@)ag75+?*q;EaDy3Q^q zwPtN(f{zkmtODg0ELrny?#*006BoU-a&Ndkk0Mgvzp3VqZ>RINeY+=cw{(fb7XY9* z*Qm#1N{jQ9%DG2yO0s;5;OSa}JM>khfgq4tzoumx;l14f6bfZvU^t*z#9-X)?Uhqn zbtR?7@5WeKTC%XPh(<9zdc-ph6j)ilANV>QqJ>8}XTxsZxUpej`s>YV6--Z;FaOwB zZKe7q#SaX^e-5nI*jZnn=MJn!h%SNSE%zfW&psxRW6tPLv6RE-l8?LkUb0ZX0lo%C8<>-@FF-TIvyVn@{)IpT3U^Z~<3r+fWD>04%Q& zm~k*G6f$$*h5YlUA-&vrgHOwf-U*vh9w7Go`6pq|?2fDNf5lmCtMcOFf>p5SB&vay zlCpS4TwHw8WYg=PZ3R0!Z`YVKSBQ&5Gjy6-;5zgm5um>7qopCprRc z@^b@!fMTR2r4k(1Fe5XIdpq&+?r9L^U*tNE(Dml+MNmRrU0q=zJ1!&jvOcpnu592k z<~nW+4un7Uv1zKU)gq=ehlPcC4d*vn-$ctx9f^Y+z4OO2yO9bPKd4CL_rCO9=2Ts| zFE?ygJi>&`Zxr0`UKn1$EiZ-KQcYy}v9}#jpiW>a+n;&DMi%@KfV7J2@Wb<*$97ZQ zl21v7WS2%L6i!$Lre1zvEbTt^xeBD=RH4uIu^~*lC$S^QxIc_g_6?a5=1{gV8u>e* zC^j;f;(x)3e^5mTge>$b63Smi(toD^-TX^R+l^V;=g$}jDi@r0-u?BCsnb1FkQy}M zv7~TXn8Mu$hGSP34n03l3m&_lNN?&SJT6;PL`uu@ST?{oNU4KMVk^_9V$UX>RiLcS zk>?DZjYgx(dHl})?q@cJj_KaRTYT0%RO#^K?4RK-a^nC8cWho(_`O`ZEl}Dg6K}|L_Y_LhGD_v^9(*lK#H`ls(QL=Mh+tald7eS>8JcS2Bqk&DU-IL+U zwW|FT3L09EapzUAZuOd{Fu8?o@xjvF#8KDa5{ zn$twt?lE*!S0-}*j5$h6eHZwojTO9?aclg8x|1@d@AEa*yjaIs0vZ)M`DZl z<3Ex};ijvrtD+KVbARJ1rk>0OKHuEa9UZwZk1f) zk7Cl|t9-Uobu8j->hw#+zMrnkBg&KbS?BVKwk&`c3k5vd#kIY)y) zZx-}hx!(#!Eq|p148$B87M*L^a2B4Av-m5^y?FOXHt*$a9Lrgp7YnT9+Q>$i2S5t6}K#iQwpwZAXA>ZW-mh_^X87fMaI!q3Cb znYljjFY^yMcl8q3X%iHUO?c18K1hz{_r8zDXa{=ynQo^N=)cotQ+wr36B82Bqavv( z{-vjr?x;l0=gKNmgN+kG^Go!}^DG;(={rl0yjGp%F)JV?&hqi@#P_OLh4)t2kJ$~?@OWJe8_5v!w(u@0`B7L*&SX)kb0l;yVMtzB1mwf&c5rDxxI`2@$N zL>euZ0hXr8C;nErmyp=~NW)*?4NEIFZtom2pnD0M-v6x<*Z@MYVT% znk}?%Z}~@^nn8$Cw-4u*iTn|^|Kq@l@Bo1WTy&j;2m>bpr zhz7UNob6*YtTa*Q1;hQkysf*zTt$9F?WffKQYy~G{F%W$k-l;ojSr+)exLFWcrW0S%vruQnB;@IzDeBKgNHNEW?fgu9Vt5Z7 zEaPxmHL|jLeK~_z*8N-}$PgrK-c!i7r6pB+dSfS07)>HG7acurwrh9_ z98~jOo#|20@LzlU5hH1w6|-29(q`t*2aOXR^DK{PnjbOkIIpTo zdKS|NCl&4lynpRyQT=!KwbdxT?6CItb?PPN&MCjvMvGyWu*dVi8(&t{Ile)yii(9# zs5Jh|K}_i?ewZiR_9clriA+~#kPg(E&)|bvXe_;@e2BRerygfr9w(Bb_ zspf`FXm8HIYXG!jyCt~%ho~(TArF9Gi%e^&`h$V6$;6F3-8bAza}@Ik zKH+bG4si|)Q*6WX6`JFDstw(Vt`TF)H7aeW?cxc-PSa$Unpc$I&Kx-T% z^jFmsAIO~K;OBILG^EUg4DaN*yodoPJiTfvt1&u0#EyJdiR6IgaRjmz%)Q5k2KzTO+b!7>-$ zwpEI;W|~3WZm&j+wT9d3$MUhdd+@S-1DHFui`S@5bG1NJT-?ye=+OH!u<-^irL+{| zkM^Ge$6N{&b#--FLd768uZecx%Hur9(F3yo3(WZs3M!Gq{hMrIB?~Q!yaGc18y@

Dh%@ApXo4&()IsQj6nXu$Zg}sO_fMss4xi$?f^4pnZ03O zz@eBTd6>)5n*(k`&fasA}t%0 zi*)t}v9eZv9TBPk_^(mdw>s|urw1Q1KYq-l7jopq`l72Tc+b}>q;m9x`x+|7Am}%f z`wbH9-=#GD?G5A7Qpdke9_&xP$-4`#>k6zzq?mf|3>zrhON&J4VKX62qYXG`4w2rl z9?2*8S2dWa^V=}zYQ1(;28Fp+X)TzmI_CWcx0kB7{q0OozL?czSh3gK>-5~5Cc}C5 zDE8>~sN_EEhC9chc(tR3A}LT2Nq66iZD!#&xzie*B}l`k(w#0F=vyuxxBajb;(hWP zSLUpu)8C6(xwj{VOOr~5GS*X2jV44_&*mD#9I_HirI%U+_@_%1DY9)XR1zP!YZA%& z=uH|$Rz<$|F?{q zJ{)~#{P=T@4u|fH2+s#stz+|-svax3eC+{){-bUb6sC4EirGdFO-+%@lK$mSHRvet z2*8^ladwxqFr+47`H{&B*r6smHBhl&EruT6>fkp&CwS}tUd~N5pDm`umFpem`jcl*j~GdD&6DhIOr9uIxoJbhlcr&U-3?B|8~FR*{{nWAvrp_+ ze@B-ioU}1FOe%35W#okxEkJKc?Npc9=EQ;RBmKo^X2LTD^m~+<&J|_!FK!ea zcBG<{%cOry0fEY%xy@M}&vKhzRO`{25rj{blR!+><9WBf)k$i>dml3Xezx20Y62bmUR?QSs4j z1m(7XodlrZ8Nb4Da$kEh%(SK>n8x|{eUzxfv(eGf_n#N?AAV5Ovwq=j1KwNRbNzIf z77Uw)rktp%5gMxG<;b|Vt)QY(N{dTz^uVUB zHvE@Ur*xw5K3Uw|l4pD5kmOSKK3OJ8Wq?ucW}}E0(aTS>Vu#K7a+v0P21f{)uXEm} zK0~oLi;4HUTt2dB6Tw2;7u$ebS2Prt64${pNALR2$UqG_hW7o*vMvOPMZ}z{?zBJ# zUfj|S;A(2>YI?fANY4Qk_}*b#!lW^}PZcL;CggB)f3&tyBzf4R?nlH8o&E3QbwJM) zi2f(+M~JI;l~qoy`BNDe!%n*ZzIuF8NUI<~_zp!(EHjn8USNWYiJ2*m2MJ<~ScN3A zwEJ#T_}zz)@<8KeC9%9u39k)zR}le81bksZ#jK^DvdGML=Nn*|sokoE>Lj&W z3YtydBc7OTD#C4`TgNPiZ9~sGB(G=nOr*X6qg_|plT3`RPU&Rd=`)1Xajk@jR&`_# zH0yU&OIpfSI}`p)q3Yf#?{?fs3Rt!ab1`o+R#1fZ(BlB5DLkd2t%Kjj?Zqs=jBBKu zp(EEom#u+_4 zBipFnWe5Fe@yek4gde&~99DjhX<9tUYC0G7#4v2C6@E7I?D0&aV-G2)1|+&WE75bV zw<-Im>sdMU2gPXyHNQx~!rh;ySV{1t%%l+VdWMT{(IbledLxtCp^KSz(=^o4Ob50$ z2e#r>>WWkjZfFy3v*DpN$b5^|jrjF0sck}nX17VxSX%P~BRjWTaDn49_YsE!zZr1` z98<~qBLOBYxEtd=uZ%QEeBO%EE$4RO*XH5_EPOhy#g(t6LcV{(8GONwnKf(|_v~BeAM1Y)E4M=>>)!kn4$7PTwukkm3 zL5D>L3FBOY?N*CIlZMg#o;2ifABIU~Z(>s&{;nF{{_RLP_B?sIFI{~a$9sPo*DSG@ zT04ItsV*FYNFK6las2*ENoS6OX=~@-5aF)t^3&S zy44-s7u@PKBgw(g%4O@VW?G98dR#OlX`N(5UTUV+(%rr6R5W3N-@-=IW~z)V!lHw7 zhaZY*0lU{%bsqUPT~BLMY2ZVM%QPqXN^7=JUip!1NAX^MFW=dO%rAq;eSeO0Uf5o4 z$>Xj*LM>0_;vMzM#)Zwo-KO;l&Cc}NLF1fvZWAa=K9KhQgBDocT|u5FwLJI!BF6>M z$WJU`gcwr+5j<_(`)Tn5vA~-~`b*BWOH5zBXc(LxvEX6VQ(l;=nw$f$yiDWNB79lF zp+a(Q(D(cVfLk}5B$_#8iw*mjMVvC1fmwB;JgX@*EHu+(iDy}n*;FK+KL7eIxJj>IUSc0pq! z{Apah0#8+ImPXoy(qzNk#ZZy!tzPqeu8c#sOu_X|n5I|g#c^jrPX_vYPk##a;{>5--MKX{Ou%7Atu(<1nPd~Uk@lA)!ynkU!;SM-!#RAU@lcCki z%I{jt>6NCn1&NJ{Nw&XkjM^~EArQ9sMn|k{Bu14YAW;6NAne_gU$`9`S1`Z7;DSqJ zJly~7Zfg&J2oNXr{tEKOUG7u-zwqyW;PL;AlK;O;70FP97E~63t%6QguPS{Pv@w2FaSIA%+X$S2F$!2p+aBEyEjTtsS#}4VGhJ0_ zU!yKQvVojH=-~fWto`qK!oO+NvG9omRT?%>m9#||mm~XCD;azFn^sGr8F{kmeIX-jz+jpm=;=P2yGHpEu9@@v9zw@8oR2@Ag6`}KO6?v*0DZ+T-K%bXf zN^7CGf0zk4)82`vZ4?q06!bLB<9CBU8=-=<6i5tPC^nHsAT}rjK{KC!24nPg9Yj9_ z&gJ2E4`0Ml$JNUGrtu0WQy>B~$iZuttD%v5;YB*`*19NHX$ULiwyWx?F>nd57EpA1W&Z0D zO@GCz#2W?<;tPK&hPSn#!D<*>R~s@<{#B9L^PoUZZ2ooe*0OWjr6sLoot~Fp8lu?^ z&-_(~dqtC1`4(R4nWNb*Y?hmbMJRM1cyY4xj!7+4O;YHsix$}4jS6RWJhUuq?# zohG>c=$&VmiqS`TI0HKVjCLWJ1!ctua$@n&wAb!Bw)e#Cmkdntw;FnEATyw@>BEQh zImaY`z8i-dTh7>>HFZpOOIg$%`j%WPr)P40AqYoJ7vS*}3x1ohy~;~9IoQ?F=ok)B ztfzEMt)rAuT2jf0lbN5}r9h2?f~M%nZ(37=<9Wl4M2U9n&B=G`fq z-=6-Ct+rQ9FvL6%*)b7fCjLLd)VQXs&=@z{*j4v*qJ%uA4*r8!H>f_q_0nh;!1 ze10+5R84jdxEen^HG(>l)E{1$euKf8n$(K2iozaxNawFI;I^j8B6 zcpCL`Dfcf`{$o1x`f{G<|fh&r^0%Vj-YIW3p0oy+KN|iIr` placeholder with the correct value, as defined in your Docker Compose file. [source,bash] ---- -find /var/www/owncloud/data/ -mindepth 2 -maxdepth 2 -type d -name "files_encryption" -exec rm -R -i {} + +find /files/ -mindepth 2 -maxdepth 2 -type d -name "files_encryption" -exec rm -R -i {} + ---- diff --git a/modules/admin_manual/pages/configuration/files/external_storage/amazons3.adoc b/modules/admin_manual/pages/configuration/files/external_storage/amazons3.adoc index 25283c0c9..356ad09ec 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/amazons3.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/amazons3.adoc @@ -20,7 +20,7 @@ In the *Available for* field, enter the users or groups who have permission to a The `Enable SSL` checkbox enables HTTPS connections; using HTTPS is always highly recommended. -image::configuration/files/external_storage/amazons3.png[image,width=500] +image::configuration/files/external_storage/amazons3.png[image,width=350] Optionally, you can override the hostname, port and region of your S3 server, which is required for non-Amazon servers such as Ceph Object Gateway. @@ -29,7 +29,5 @@ Optionally, you can override the hostname, port and region of your S3 server, wh `\http://hostname.domain/bucket` instead. See -xref:configuration/files/external_storage/configuration.adoc[External Storage Configuration] -for additional mount options and information, and -xref:configuration/files/external_storage/auth_mechanisms.adoc[External Storage Authentication mechanisms] -for more information on authentication schemes. +xref:configuration/files/external_storage/configuration.adoc[External Storage Configuration] for additional mount options and information, and +xref:configuration/files/external_storage/auth_mechanisms.adoc[External Storage Authentication Mechanisms] for more information on authentication schemes. diff --git a/modules/admin_manual/pages/configuration/files/external_storage/auth_mechanisms.adoc b/modules/admin_manual/pages/configuration/files/external_storage/auth_mechanisms.adoc index 785e9f5b7..7567895a7 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/auth_mechanisms.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/auth_mechanisms.adoc @@ -3,42 +3,25 @@ == Introduction -ownCloud storage backends accept one or more authentication schemes such -as passwords, OAuth, or token-based, to name a few examples. Each -authentication scheme may be implemented by multiple authentication -mechanisms. Different mechanisms require different configuration -parameters, depending on their behaviour. +ownCloud storage backends accept one or more authentication schemes such as passwords, OAuth, or token-based, to name a few examples. Each authentication scheme may be implemented by multiple authentication mechanisms. Different mechanisms require different configuration parameters, depending on their behaviour. == Special Mechanisms -The *None* authentication mechanism requires no configuration -parameters, and is used when a backend requires no authentication. +The *None* authentication mechanism requires no configuration parameters, and is used when a backend requires no authentication. -The *Built-in* authentication mechanism itself requires no configuration -parameters, but is used as a placeholder for legacy storages that have -not been migrated to the new system and do not take advantage of generic -authentication mechanisms. The authentication parameters are provided -directly by the backend. +The *Built-in* authentication mechanism itself requires no configuration parameters, but is used as a placeholder for legacy storages that have not been migrated to the new system and do not take advantage of generic authentication mechanisms. The authentication parameters are provided directly by the backend. == Password-based Mechanisms -The *Username and password* mechanism requires a manually-defined -username and password. These get passed directly to the backend. +* The *Username and password* mechanism requires a manually-defined username and password. These get passed directly to the backend. -The *Log-in credentials, save in session* mechanism uses the ownCloud -login credentials of the user to connect to the storage. These are not -stored anywhere on the server, but rather in the user session, giving -increased security. The drawbacks are that sharing is disabled when this -mechanism is in use, as ownCloud has no access to the storage -credentials, and background file scanning does not work. +* The *Log-in credentials, save in session* mechanism uses the ownCloud login credentials of the user to connect to the storage. These are not stored anywhere on the server, but rather in the user session, giving increased security. The drawbacks are that sharing is disabled when this mechanism is in use, as ownCloud has no access to the storage credentials, and background file scanning does not work. -NOTE: here is a workaround that allows background file scanning when using *Log-in credentials, save in session*, and that is using xref:configuration/server/background_jobs_configuration.adoc[Ajax cron mode]. -Be aware that the Ajax cron mode is triggered by browsing the ownCloud Web GUI. +NOTE: Here is a workaround that allows background file scanning when using *Log-in credentials, save in session*, and that is using xref:configuration/server/background_jobs_configuration.adoc[Ajax cron mode]. Be aware that the Ajax cron mode is triggered by browsing the ownCloud Web GUI. === Known Limitations -Please be aware that any operations must be performed by the logged-in mount owner, as credentials are not stored anywhere. -As a result, there are three known limitations, for both admin and personal mounts where both have the "_log-in credentials, save in session_" option. +Please be aware that any operations must be performed by the logged-in mount owner, as credentials are not stored anywhere. As a result, there are three known limitations, for both admin and personal mounts where both have the "_log-in credentials, save in session_" option. These are: @@ -51,23 +34,14 @@ The enterprise version has a mode called "**Save in DB**" where the credentials == Public-key Mechanisms -Currently only the RSA mechanism is implemented, where a public/private -keypair is generated by ownCloud and the public half shown in the GUI. -The keys are generated in the SSH format, and are currently 1024 bits in -length. Keys can be regenerated with a button in the GUI. +Currently only the RSA mechanism is implemented, where a public/private keypair is generated by ownCloud and the public half shown in the GUI. The keys are generated in the SSH format, and are currently 1024 bits in length. Keys can be regenerated with a button in the GUI. -image:configuration/files/external_storage/auth_rsa.png[Form on admin page for generating RSA keys.] +image:configuration/files/external_storage/auth_rsa.png[Form on admin page for generating RSA keys., width=350] == OAuth -OAuth 1.0 and OAuth 2.0 are both implemented, but currently limited to -the Dropbox and Google Drive backends respectively. These mechanisms -require additional configuration at the service provider, where an app -ID and app secret are provided and then entered into ownCloud. Then -ownCloud can perform an authentication request, establishing the storage -connection. +OAuth 1.0 and OAuth 2.0 are both implemented, but currently limited to the Dropbox and Google Drive backends respectively. These mechanisms require additional configuration at the service provider, where an app ID and app secret are provided and then entered into ownCloud. Then ownCloud can perform an authentication request, establishing the storage connection. -image:configuration/files/external_storage/dropbox-oc.png[Dropbox storage mount configuration.] +image:configuration/files/external_storage/dropbox-oc.png[Dropbox storage mount configuration., width=350] -If ownCloud clients are unable to connect to your ownCloud server, -check that the bearer authorization header xref:configuration/general_topics/general_troubleshooting.adoc#owncloud-clients-cannot-connect-to-the-owncloud-server[is not being stripped out]. +If ownCloud clients are unable to connect to your ownCloud server, check that the bearer authorization header xref:configuration/general_topics/general_troubleshooting.adoc#owncloud-clients-cannot-connect-to-the-owncloud-server[is not being stripped out]. diff --git a/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc b/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc index c7c0e09d3..0a4ed29b1 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc @@ -6,21 +6,15 @@ configuration/files/external_storage_configuration_gui.adoc == Introduction -The External Storage Support application enables you to mount external -storage services and devices as secondary ownCloud storage devices. You -may also allow users to mount their own external storage services. +The External Storage Support application enables you to mount external storage services and devices as secondary ownCloud storage devices. You may also allow users to mount their own external storage services. -Starting with ownCloud 9.0, a new set of occ commands for -xref:configuration/server/occ_command#files-external[managing external storage] -is introduced. +Starting with ownCloud 9.0, a new set of occ commands for xref:configuration/server/occ_command#files-external[managing external storage] is introduced. -This also includes an option for the ownCloud admin to enable or disable sharing on individual -xref:mount-options[external mountpoints]. Sharing on such mountpoints is disabled by default. +This also includes an option for the ownCloud admin to enable or disable sharing on individual xref:mount-options[external mountpoints]. Sharing on such mountpoints is disabled by default. == Enabling External Storage Support -Prerequisite: menu:Settings[Apps > External storage support] is enabled. -Tick the checkbox under `Settings > Storage > "Enable External Storage"`. +Prerequisite: menu:Settings[Apps > External storage support] is enabled. Tick the checkbox under `Settings > Storage > "Enable External Storage"`. image:configuration/files/external_storage/enable-app.png[Enabling External Storage Support in ownCloud] @@ -28,51 +22,31 @@ image:configuration/files/external_storage/enable-app.png[Enabling External Stor IMPORTANT: Before adding a storage in a production environment make sure its configuration is correct. Removal of the external storage or change of its configuration does not remove metadata entries from the database belonging to the previous storage configuration. -To create a new external storage mount, select an available backend from -the dropdown *Add storage*. Each backend has different required options, -which are configured in the configuration fields. +To create a new external storage mount, select an available backend from the dropdown *Add storage*. Each backend has different required options, which are configured in the configuration fields. -image:configuration/files/external_storage/external_storage_types.png[ownCloud External Storage Types] +image:configuration/files/external_storage/external_storage_types.png[ownCloud External Storage Types, width=350] -Each backend may also accept multiple authentication methods. These are -selected with the dropdown under *Authentication*. Different backends -support different authentication mechanisms; some specific to the -backend, others are more generic. See external_storage/auth_mechanisms -for more detailed information. +Each backend may also accept multiple authentication methods. These are selected with the dropdown under *Authentication*. Different backends support different authentication mechanisms; some specific to the backend, others are more generic. See xref:configuration/files/external_storage/auth_mechanisms.adoc[External Storage Authentication Mechanisms] for more detailed information. -When you select an authentication mechanism, the configuration fields -change as appropriate for the mechanism. The SFTP backend, for one -example, supports *username and password*, *Log-in credentials, save in -session*, and *RSA public key*. +When you select an authentication mechanism, the configuration fields change as appropriate for the mechanism. The SFTP backend, for one example, supports *username and password*, *Log-in credentials, save in session*, and *RSA public key*. -image:configuration/files/external_storage/auth_mechanism.png[An SFTP configuration example.] +image:configuration/files/external_storage/auth_mechanism.png[An SFTP configuration example., width=350] -Required fields are marked with a red border. When all required fields -are filled, the storage is automatically saved. A green dot next to the -storage row indicates the storage is ready for use. A red or yellow icon -indicates that ownCloud could not connect to the external storage, so -you need to re-check your configuration and network availability. +Required fields are marked with a red border. When all required fields are filled, the storage is automatically saved. A green dot next to the storage row indicates the storage is ready for use. A red or yellow icon indicates that ownCloud could not connect to the external storage, so you need to re-check your configuration and network availability. -NOTE: If there is a connection issue with the target storage, it will be marked as unavailable for ten minutes. -To re-check it, click the btn:[colored icon] or reload your Admin page. +NOTE: If there is a connection issue with the target storage, it will be marked as unavailable for ten minutes. To re-check it, click the btn:[colored icon] or reload your Admin page. == User and Group Permissions -A storage configured in a user’s Personal settings is available only to -the user that created it. A storage configured in the Admin settings is -available to all users by default, and it can be restricted to specific -users and groups in the *Available for* field. +A storage configured in a user’s Personal settings is available only to the user that created it. A storage configured in the Admin settings is available to all users by default, and it can be restricted to specific users and groups in the *Available for* field. -image:configuration/files/external_storage/applicable.png[User and groups selector] +image:configuration/files/external_storage/applicable.png[User and Groups Selector] IMPORTANT: Adding a storage for users or groups you don't have access rights to, an error notification will be shown and a red square icon appears on the mount. == Mount Options -Hover your cursor to the right of any storage configuration to expose -the settings button and trashcan. When clicking the trashcan icon, you delete the -mountpoint. The settings button allows you to configure each storage -mount individually with the following options: +Hover your cursor to the right of any storage configuration to expose the settings button and trashcan. When clicking the trashcan icon, you delete the mountpoint. The settings button allows you to configure each storage mount individually with the following options: * Encryption * Read Only @@ -82,36 +56,29 @@ mount individually with the following options: NOTE: The *Encryption* checkbox is visible only, when the Encryption app is enabled. -*Enable Sharing* allows the ownCloud admin to enable or disable sharing -on individual mountpoints. When sharing is disabled, the shares are -retained internally, so that you can re-enable sharing and the previous -shares become available again. Sharing is disabled by default. +*Enable Sharing* allows the ownCloud admin to enable or disable sharing on individual mountpoints. When sharing is disabled, the shares are retained internally, so that you can re-enable sharing and the previous shares become available again. Sharing is disabled by default. -image:configuration/files/external_storage/mount_options.png[Additional mount options exposed on mouseover.] +image:configuration/files/external_storage/mount_options.png[Additional mount options exposed on mouseover., width=350] == Using Self-Signed Certificates -When using self-signed certificates for external storage mounts, the -certificate must be imported into ownCloud. +When using self-signed certificates for external storage mounts, the certificate must be imported into ownCloud. TIP: Please refer to xref:configuration/server/import_ssl_cert.adoc[Importing System-wide and Personal SSL Certificates] for more information. -== Available storage backends +== Available Storage Backends -The following backends are provided by the external storages app. Other -apps may provide their own backends, which are not listed here. +The following backends are provided by the external storages app. Other apps may provide their own backends, which are not listed here. NOTE: A non-blocking or correctly configured SELinux setup is needed for these backends to work. == Allow Users to Mount External Storage -Check "__Allow users to mount external storage__" to allow your users -to mount storages on external services. Then enable the backends you want to allow. +Check "__Allow users to mount external storage__" to allow your users to mount storages on external services. Then enable the backends you want to allow. image:configuration/files/external_storage/user_mounts.png[Checkboxes to allow users to mount external storage services.] -IMPORTANT: Be careful with the choices that you enable, as it allows a user to make potentially arbitrary -connections to other services on your network! +IMPORTANT: Be careful with the choices that you enable, as it allows a user to make potentially arbitrary connections to other services on your network! == Detecting Files Added to External Storages @@ -121,27 +88,23 @@ NOTE: The command xref:configuration/server/occ_command.adoc#the-filesscan-comma * We recommend xref:configuration/server/background_jobs_configuration.adoc[configuring the background job Webcron or Cron] to enable ownCloud to automatically detect files added to your external storages. + -TIP: You cannot scan/detect changed files on external storage mounts when you select the -*Log-in credentials, save in session* authentication mechanism. However, there is a workaround, -and that is to use Ajax cron mode. -See xref:configuration/files/external_storage/auth_mechanisms.adoc#password-based-mechanisms[Password-based Mechanisms] for more information. - -* ownCloud may not always be able to find out what has been changed remotely -(files changed without going through ownCloud), especially when it’s very deep -in the folder hierarchy of the external storage. -+ -You might need to setup a cron job that runs +TIP: You cannot scan/detect changed files on external storage mounts when you select the *Log-in credentials, save in session* authentication mechanism. However, there is a workaround, and that is to use Ajax cron mode. See xref:configuration/files/external_storage/auth_mechanisms.adoc#password-based-mechanisms[Password-based Mechanisms] for more information. + +* ownCloud may not always be able to find out what has been changed remotely (files changed without going through ownCloud), especially when it’s very deep in the folder hierarchy of the external storage. + +-- +You might need to setup a cron job that runs: + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} files:scan --all` ---- +-- -* Alternatively, replace `--all` with the user name to trigger a rescan of the user’s files periodically, -for example every 15 minutes, which includes the mounted external storage. +* Alternatively, replace `--all` with the user name to trigger a rescan of the user’s files periodically, for example every 15 minutes, which includes the mounted external storage. + TIP: See xref:configuration/server/occ_command.adoc#the-filesscan-command[occ’s file operations] for more information. -== Known limitations +== Known Limitations - Removal of the external storage or change of its configuration does not remove metadata entries belonging to the previous storage configuration. This may impact performance of the installation as previous configuration metadata entries get orphaned. Removal of orphaned storage entries can be done manually by using the xref:configuration/server/occ_command.adoc#the-filesremove-storage-command[occ files:remove-storage] command. diff --git a/modules/admin_manual/pages/configuration/files/external_storage/dropbox.adoc b/modules/admin_manual/pages/configuration/files/external_storage/dropbox.adoc index 4cb436aa3..cec28fce7 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/dropbox.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/dropbox.adoc @@ -55,7 +55,7 @@ Then, you need to provide a name for the folder in the "Folder name" field and a After you have entered these values, click btn:[Grant access]. ownCloud then interacts with the Dropbox API to set up the new shared folder. If the process is successful, a green circle icon appears at the far left-hand side of the row next to the folder name. -image::configuration/files/external_storage/dropbox/successful-connection-to-dropbox.png[A Dropbox share successfully created,width=500] +image::configuration/files/external_storage/dropbox/successful-connection-to-dropbox.png[A Dropbox share successfully created,width=350] === Other Options @@ -65,12 +65,12 @@ If you want to grant access to the share to a select list of users and groups, y After a Dropbox share is created, a new folder is available under "All Files" with the name you provided when you created the share. It is represented by an external share folder icon as in the image below. -image::configuration/files/external_storage/dropbox/successful-connection-to-dropbox.png[A Dropbox share successfully created,width=500] +image::configuration/files/external_storage/dropbox/successful-connection-to-dropbox.png[A Dropbox share successfully created,width=350] This links to a new folder in your Dropbox account under "Dropbox > Apps" with the name of the Dropbox app that you created. -image::configuration/files/external_storage/dropbox/dropbox-share-available.png[A new Dropbox share is available,width=500] +image::configuration/files/external_storage/dropbox/dropbox-share-available.png[A new Dropbox share is available,width=350] Now, if you add files and folders in either the new Dropbox folder or the new ownCloud folder, they will be visible in both after they've been synced. -image::configuration/files/external_storage/dropbox/dropbox-apps-folders.png[The Dropbox Apps folders,width=500] +image::configuration/files/external_storage/dropbox/dropbox-apps-folders.png[The Dropbox Apps folders,width=350] diff --git a/modules/admin_manual/pages/configuration/files/external_storage/ftp.adoc b/modules/admin_manual/pages/configuration/files/external_storage/ftp.adoc index 2a314320e..01346120c 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/ftp.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/ftp.adoc @@ -5,7 +5,7 @@ {description} Please install the {oc-marketplace-url}/apps/files_external_ftp[FTP Storage Support] app from the ownCloud Marketplace. -image::configuration/files/external_storage/ftp_storage_support.png[The ownCloud FTP Storage Support App,width=500] +image::configuration/files/external_storage/ftp_storage_support.png[The ownCloud FTP Storage Support App,width=350] To connect to an FTP server, you will need: @@ -20,7 +20,7 @@ Your new mountpoint is available to all users by default, and you may restrict a Optionally, ownCloud can use FTPS (FTP over SSL) by checking `Secure ftps://`. This requires additional configuration with your root certificate, if the FTP server uses https://en.wikipedia.org/wiki/Self-signed_certificate[a self-signed certificate]. See xref:configuration/server/import_ssl_cert.adoc[Importing System-wide and Personal SSL Certificates] for more information. -image::configuration/files/external_storage/ftp.png[ownCloud GUI FTP configuration,width=500] +image::configuration/files/external_storage/ftp.png[ownCloud GUI FTP configuration,width=350] The external storage `FTP/FTPS` needs the `allow_url_fopen` PHP setting to be set to `1`. When having connection problems make sure that it is not set to `0` in your `php.ini`. See xref:configuration/general_topics/general_troubleshooting.adoc#php-version-and-information[PHP Version and Information] to learn how to find the right `php.ini` file to edit. diff --git a/modules/admin_manual/pages/configuration/files/external_storage/google.adoc b/modules/admin_manual/pages/configuration/files/external_storage/google.adoc index 8a25a7534..b741afdf7 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/google.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/google.adoc @@ -40,43 +40,43 @@ IP/owncloud . You can use your existing Google account such as Groups, Drive, or Mail, or create a new one and log into the {google_cloud_console-url}[Google Cloud Console]. After logging in click the btn:[Create Project] button on the top right side. + -image::configuration/files/external_storage/google_drive/001.png[Google Cloud Console,width=500] +image::configuration/files/external_storage/google_drive/001.png[Google Cloud Console,width=350] . Add a new project by clicking the btn:[+] button on the top right side. + -image::configuration/files/external_storage/google_drive/002.png[Create Project,width=500] +image::configuration/files/external_storage/google_drive/002.png[Create Project,width=350] . Give your project a name, and either accept the default *Project ID* or create your own, then click the btn:[Create] button. For this example a random name was chosen, "owncloud-04-27". However, feel free to choose your own name. + -image::configuration/files/external_storage/google_drive/003.png[Choose a name,width=500] +image::configuration/files/external_storage/google_drive/003.png[Choose a name,width=350] . After your project is created, click on the btn:[notifications bell] and select your project. + -image::configuration/files/external_storage/google_drive/004.png[Notification bell,width=500] +image::configuration/files/external_storage/google_drive/004.png[Notification bell,width=350] . Go to Api overview to select google’s API. + -image::configuration/files/external_storage/google_drive/005.png[API,width=500] +image::configuration/files/external_storage/google_drive/005.png[API,width=350] . Select Google Drive API + -image::configuration/files/external_storage/google_drive/006.png[Google API,width=500] +image::configuration/files/external_storage/google_drive/006.png[Google API,width=350] . Enable the Google Drive API + -image::configuration/files/external_storage/google_drive/007.png[Enable,width=500] +image::configuration/files/external_storage/google_drive/007.png[Enable,width=350] . You now must create your credentials. + -image::configuration/files/external_storage/google_drive/008.png[Create Credentials,width=500] +image::configuration/files/external_storage/google_drive/008.png[Create Credentials,width=350] . First, select btn:[Web Browser] and btn:[User data]. + -image::configuration/files/external_storage/google_drive/009.png[Access type and Data,width=500] +image::configuration/files/external_storage/google_drive/009.png[Access type and Data,width=350] . The next screen that opens is *Create OAuth 2.0 Client ID*. Enter your app name. + -image::configuration/files/external_storage/google_drive/010.png[Access type and Data,width=500] +image::configuration/files/external_storage/google_drive/010.png[Access type and Data,width=350] === Configure Authorisations @@ -106,7 +106,7 @@ The following example procedure configures an admin-based storage mount. The dom . Login to your ownCloud account + -image::configuration/files/external_storage/google_drive/011.png[Login in ownCloud,width=500] +image::configuration/files/external_storage/google_drive/011.png[Login in ownCloud,width=350] . Go to Storage in the Settings + @@ -118,13 +118,13 @@ image::configuration/files/external_storage/google_drive/013.png[Enable external . Select Google Drive + -image::configuration/files/external_storage/google_drive/014.png[Select Google Drive from dropdown menu,width=500] +image::configuration/files/external_storage/google_drive/014.png[Select Google Drive from dropdown menu,width=350] . The Google Drive App is enabled + Give the mount point a meaningful name. We have used `Google Drive` in this example. + -image::configuration/files/external_storage/google_drive/015.png[Now you have your Google Drive App enabled] +image::configuration/files/external_storage/google_drive/015.png[Now you have your Google Drive App enabled, width=350] . Copy the Authorized Redirect URI from the browser + @@ -132,23 +132,23 @@ image::configuration/files/external_storage/google_drive/016.png[The URL from th . Enter it the Google Drive Console here + -image::configuration/files/external_storage/google_drive/017.png[Client ID,width=500] +image::configuration/files/external_storage/google_drive/017.png[Client ID,width=350] . Choose a project name for the consent screen. + A consent screen has to be created. This is the information in the screen Google shows you when you connect your ownCloud Google Drive app to Google the first time. + -image::configuration/files/external_storage/google_drive/018.png[Choose a Project Name,width=500] +image::configuration/files/external_storage/google_drive/018.png[Choose a Project Name,width=350] . Download the credentials as JSON file. + -image::configuration/files/external_storage/google_drive/019.png[Download your Credentials,width=500] +image::configuration/files/external_storage/google_drive/019.png[Download your Credentials,width=350] + You can either open this file with the editor of your choice (SublimeText for example), or you can put in your web browser to view it. You can always download this data from your Google Drive project at a later time for other Google Drive mounts. + Here is an example output: + -image::configuration/files/external_storage/google_drive/020.png[Credentials,width=500] +image::configuration/files/external_storage/google_drive/020.png[Credentials,width=350] . Client ID and Client Secret + @@ -156,7 +156,7 @@ Enter the Client ID and Client Secret in the ownCloud Google Drive mount screen + Click btn:[Allow] when the consent screen appears. + -image::configuration/files/external_storage/google_drive/021.png[Grant Access,width=500] +image::configuration/files/external_storage/google_drive/021.png[Grant Access,width=350] . Success + @@ -164,10 +164,10 @@ You are finished when you see the green light confirming a successful connection + See the xref:configuration/files/external_storage/configuration.adoc[External Storage Configuration] for additional mount options and information. + -image::configuration/files/external_storage/google_drive/022.png[All Green,width=500] +image::configuration/files/external_storage/google_drive/022.png[All Green,width=350] . Files View + Go to your files view. You will see the newly mounted Google Drive. + -image::configuration/files/external_storage/google_drive/023.png[Your Google Drive Folder,width=500] +image::configuration/files/external_storage/google_drive/023.png[Your Google Drive Folder,width=350] diff --git a/modules/admin_manual/pages/configuration/files/external_storage/local.adoc b/modules/admin_manual/pages/configuration/files/external_storage/local.adoc index 14732aa59..0dee0dd0a 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/local.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/local.adoc @@ -34,7 +34,7 @@ To enable Local storage, you must first enable it by editing your ownCloud insta To manage local storage, navigate to menu:Settings[Admin > Storage]. You can see an example in the screenshot below. -image::configuration/files/external_storage/local.png[Manage local storage in ownCloud,width=500] +image::configuration/files/external_storage/local.png[Manage local storage in ownCloud,width=350] . In the *Folder name* field enter the folder name that you want to appear on your ownCloud Files page. . In the *Configuration* field enter the full file path of the directory you want to mount. diff --git a/modules/admin_manual/pages/configuration/files/external_storage/s3_compatible_object_storage_as_primary.adoc b/modules/admin_manual/pages/configuration/files/external_storage/s3_compatible_object_storage_as_primary.adoc index 0879cdd7c..560938c09 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/s3_compatible_object_storage_as_primary.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/s3_compatible_object_storage_as_primary.adoc @@ -281,7 +281,7 @@ $CONFIG = [ 'key' => 'wasabi-access-key-here', 'secret' => 'wasabi-secret-key-here', ], - // path style can either be used (true) or not (false). + // path style can either be used (true) or not (false). 'use_path_style_endpoint' => false, // replace with the Wasabi endpoint URL for your bucket 'endpoint' => 'https://s3.us-east-2.wasabisys.com', diff --git a/modules/admin_manual/pages/configuration/files/external_storage/sftp.adoc b/modules/admin_manual/pages/configuration/files/external_storage/sftp.adoc index a3b91d93e..6214b7f21 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/sftp.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/sftp.adoc @@ -8,7 +8,7 @@ The *Host* field is required; a port can be specified as part of the *Host* fiel For public key authentication, you can generate a public/private key pair from your *SFTP with secret key login* configuration. -image::configuration/files/external_storage/auth_mechanism.png[Generating an RSA key pair in the SFTP configuration,width=500] +image::configuration/files/external_storage/auth_mechanism.png[Generating an RSA key pair in the SFTP configuration,width=350] After generating your keys, you need to copy your new public key to the destination server to `.ssh/authorized_keys`. ownCloud will then use its private key to authenticate to the SFTP server. diff --git a/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc b/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc index 1f61d5a8d..ff9270dea 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/smb.adoc @@ -48,7 +48,7 @@ TIP: To assign the ownCloud logon username automatically to the subfolder, use ` You can specify a `Domain` which is useful in cases where the SMB server requires a domain and a username, and an advanced authentication mechanism like Active Directory (AD), or when using session credentials where the username cannot be modified. This is concatenated with the username, so the backend gets `domain\username` ==== -image::configuration/files/external_storage/smb.png[Samba external storage configuration,width=500] +image::configuration/files/external_storage/smb.png[Samba external storage configuration,width=350] == Further Information diff --git a/modules/admin_manual/pages/configuration/files/external_storage/webdav.adoc b/modules/admin_manual/pages/configuration/files/external_storage/webdav.adoc index 2f6890a8b..31a0340ec 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/webdav.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/webdav.adoc @@ -4,7 +4,7 @@ {description} -image::configuration/files/external_storage/webdav.png[Webdav configuration form,width=500] +image::configuration/files/external_storage/webdav.png[Webdav configuration form,width=350] You need the following information: diff --git a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc index f7fc00ab3..5b2211f6e 100644 --- a/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc +++ b/modules/admin_manual/pages/enterprise/external_storage/windows-network-drive_configuration.adoc @@ -2,6 +2,7 @@ :toc: right :toclevels: 3 :description: The Windows Network Drives app seamlessly integrates Windows and Samba/CIFS shared network drives as external storages. WND has great advantages compared to standard SMB access. +:page-aliases: enterprise/external_storage/wnd_quick_guide.adoc :anacron-examples: http://www.thegeekstuff.com/2011/05/anacron-examples :flock-docs-url: https://linux.die.net/man/2/flock diff --git a/modules/admin_manual/pages/found_a_mistake.adoc b/modules/admin_manual/pages/found_a_mistake.adoc index 055ac1d06..4a45851f5 100644 --- a/modules/admin_manual/pages/found_a_mistake.adoc +++ b/modules/admin_manual/pages/found_a_mistake.adoc @@ -1,4 +1,4 @@ = Have You Found a Mistake In The Documentation? :new-issue-url: https://github.com/owncloud/docs-server/issues/new -If you have found a mistake in the documentation, no matter how large or small, please let us know by {new-issue-url}[creating a new issue in the docs repository]. +If you have found a mistake in the documentation, no matter how large or small, please let us know by creating a new issue in the {new-issue-url}[docs-server repository]. diff --git a/modules/admin_manual/pages/installation/installing_with_docker.adoc b/modules/admin_manual/pages/installation/installing_with_docker.adoc index 150a64e0c..03cf57b77 100644 --- a/modules/admin_manual/pages/installation/installing_with_docker.adoc +++ b/modules/admin_manual/pages/installation/installing_with_docker.adoc @@ -1,7 +1,18 @@ = Installing with Docker :toc: right :description: ownCloud can be installed using the official ownCloud Docker image. -:page-aliases: enterprise/installation/install.adoc +:page-aliases: enterprise/installation/install.adoc, \ +installation/manual_installation/manual_installation.adoc, \ +installation/quick_guides/ubuntu_20_04.adoc, \ +installation/quick_guides/ubuntu_22_04.adoc, \ +installation/installation_wizard.adoc, \ +installation/troubleshooting.adoc, \ +installation/changing_the_web_route.adoc, \ +installation/letsencrypt/index.adoc, \ +installation/letsencrypt/using_letsencrypt.adoc, \ +installation/letsencrypt/apache.adoc, \ +installation/selinux_configuration.adoc + :dockerhub-url: https://hub.docker.com/r/owncloud/server :docker-compose-url: https://docs.docker.com/compose/ @@ -126,7 +137,6 @@ include::example$installation/docker/docker-compose.yml[] . Create an `.env` configuration file in the same directory, which contains the required configuration settings. + --- [#env-file] [source,bash,subs="attributes+"] ---- @@ -138,10 +148,10 @@ HTTP_PORT=8080 MARIADB_IMAGE=10.11 REDIS_IMAGE=7 ---- - ++ Only a few settings are required, these are: - -[width="100%",cols="45%,80%,50%",options="header"] ++ +[width="100%",cols="40%,80%,30%",options="header"] |=== | Setting Name | Description @@ -149,19 +159,29 @@ Only a few settings are required, these are: | `OWNCLOUD_IMAGE` | The ownCloud version -| `{latest-server-download-version}` or `latest` +a| `{latest-server-download-version}` or `latest` + +| `OWNCLOUD_DOMAIN` *^1^* +a| A single ownCloud domain +-- +IMPORTANT: Either use: + +pass:[ ] `OWNCLOUD_DOMAIN` + +pass:[  ] _OR_ + +pass:[ ] `OWNCLOUD_TRUSTED_DOMAINS`. + +Only use a single domain. + +The same trusted domains rules apply to everything else. +-- + +| `my_domain` or `my_ip` ... -| `OWNCLOUD_DOMAIN` -a| The ownCloud domain + -(needs to be the first entry of trusted domains) -| `localhost` +| `OWNCLOUD_TRUSTED_DOMAINS` *^1,2^* +a| Multiple ownCloud Domains. + +See the config (xref:configuration/server/config_sample_php_parameters.adoc#define-list-of-trusted-domains-that-users-can-log-into[description]) for more details. -| `OWNCLOUD_TRUSTED_DOMAINS` -| The ownCloud trusted domains (xref:configuration/server/config_sample_php_parameters.adoc#define-list-of-trusted-domains-that-users-can-log-into[description]) -| `localhost` +| `my_host,my_ip,my_domain` -a| `OWNCLOUD_OVERWRITE_CLI_URL` -| The ownCloud Override CLI URL (xref:configuration/server/config_sample_php_parameters.adoc#override-cli-url[description]) +| `OWNCLOUD_OVERWRITE_CLI_URL` +| See the config (xref:configuration/server/config_sample_php_parameters.adoc#override-cli-url[description]) for more details. | `\http://localhost` | `ADMIN_USERNAME` @@ -177,19 +197,22 @@ a| `OWNCLOUD_OVERWRITE_CLI_URL` | `{std-port-http}` | `MARIADB_IMAGE` -| The mariadb version + -(the minimum required ownCloud version is 10.9) +| The mariadb version | `10.11` | `REDIS_IMAGE` | The redis version | `7` |=== - -NOTE: `ADMIN_USERNAME` and `ADMIN_PASSWORD` + ++ +[NOTE] +==== +* `ADMIN_USERNAME` and `ADMIN_PASSWORD` + will not change between deploys even if you change the values in the `.env` file. + -To change them, you'll need to issue `docker volume prune`, which *will delete all your data*. --- +To change them, you will need to issue `docker volume prune`, which *will delete all your data*. +* (1) ... `localhost` is always included and cannot be removed by omitting it. It must be used if only one entry is to be defined. +* (2) ... To access ownCloud from your internal network without using an externally resolvable URL, you must add the IP address of the host or an internal resolvable URL running the container. +==== . Start the container using your preferred Docker _command-line tool_ such as: + @@ -334,14 +357,10 @@ With docker, the admin user cannot control certain settings in the WebUI, instea === Logging -The loglevel is set to the fixed value 2: _"Warnings, errors, and fatal issues"_. +See the `General Troubleshooting` guide for: -.To get the highest log level "Everything" (including debug output), use: - -[source,plaintext] ----- -OWNCLOUD_LOGLEVEL=0 ----- +* The xref:troubleshooting/general_troubleshooting.adoc#location-of-logfiles[Location of Logfiles]. +* The xref:troubleshooting/general_troubleshooting.adoc#owncloud-log-levels[ownCloud Log-Levels]. === Container CLI diff --git a/modules/admin_manual/pages/installation/selinux_configuration.adoc b/modules/admin_manual/pages/installation/selinux_configuration.adoc deleted file mode 100644 index ad9b5505e..000000000 --- a/modules/admin_manual/pages/installation/selinux_configuration.adoc +++ /dev/null @@ -1,210 +0,0 @@ -= SELinux Configuration -:toc: right -:toclevels: 1 -:selinux-url: https://selinuxproject.org/page/Main_Page - -== Introduction - -{selinux-url}[Security-Enhanced Linux (SELinux)] is a Linux kernel security module that provides a mechanism -for supporting access control security policies, including mandatory access controls (MAC). - -== Preparation - -When you have SELinux enabled on your Linux distribution, you may run -into permissions problems after a new ownCloud installation, and see -`permission denied` errors in your ownCloud logs. - -The following settings should work for most SELinux systems that use the -default distro profiles. Run these commands as root, and remember to -adjust the filepaths in these examples for your installation - -[source,console] ----- -semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/data(/.*)?' -semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/config(/.*)?' -semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/apps(/.*)?' -semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/apps-external(/.*)?' -semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/.htaccess' -semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/.user.ini' - -restorecon -Rv '/var/www/html/owncloud/' ----- - -If you uninstall ownCloud you need to remove the ownCloud directory -labels. To do this execute the following commands as root after -uninstalling ownCloud - -[source,console] ----- -semanage fcontext -d '/var/www/html/owncloud/data(/.*)?' -semanage fcontext -d '/var/www/html/owncloud/config(/.*)?' -semanage fcontext -d '/var/www/html/owncloud/apps(/.*)?' -semanage fcontext -d '/var/www/html/owncloud/apps-external(/.*)?' -semanage fcontext -d '/var/www/html/owncloud/.htaccess' -semanage fcontext -d '/var/www/html/owncloud/.user.ini' - -restorecon -Rv '/var/www/html/owncloud/' ----- - -If you have customized SELinux policies and these examples do not work, -you must give the HTTP server write access to these directories: - -[source,plaintext] ----- -/var/www/html/owncloud/data -/var/www/html/owncloud/config -/var/www/html/owncloud/apps -/var/www/html/owncloud/apps-external ----- - -== Enable updates via the web interface - -To enable updates via the ownCloud web interface, you may need this to -enable writing to the ownCloud directories: - -[source,console] ----- -setsebool httpd_unified on ----- - -When the update is completed, disable write access: - -[source,console] ----- -setsebool -P httpd_unified off ----- - -== Disallow write access to the whole web directory - -For security reasons it’s suggested to disable write access to all -folders in /var/www/ (default): - -[source,console] ----- -setsebool -P httpd_unified off ----- - -== Allow access to a remote database - -An additional setting is needed if your installation is connecting to a -remote database: - -[source,console] ----- -setsebool -P httpd_can_network_connect_db on ----- - -== Allow access to LDAP server - -Use this setting to allow LDAP connections: - -[source,console] ----- -setsebool -P httpd_can_connect_ldap on ----- - -== Allow access to remote network - -ownCloud requires access to remote networks for functions such as -Server-to-Server sharing, external storages or the ownCloud Marketplace. -To allow this access use the following setting: - -[source,console] ----- -setsebool -P httpd_can_network_connect on ----- - -== Allow access to network memcache - -This setting is not required if `httpd_can_network_connect` is already -on: - -[source,console] ----- -setsebool -P httpd_can_network_memcache on ----- - -== Allow access to SMTP/sendmail - -If you want to allow ownCloud to send out e-mail notifications via -sendmail you need to use the following setting: - -[source,console] ----- -setsebool -P httpd_can_sendmail on ----- - -== Allow access to CIFS/SMB - -If you have placed your datadir on a CIFS/SMB share use the following -setting: - -[source,console] ----- -setsebool -P httpd_use_cifs on ----- - -== Allow access to FuseFS - -If your owncloud data folder resides on a Fuse Filesystem (e.g. EncFS -etc.), this setting is required as well: - -[source,console] ----- -setsebool -P httpd_use_fusefs on ----- - -== Allow access to GPG for Rainloop - -If you use the rainloop webmail client app which supports GPG/PGP, you -might need this: - -[source,console] ----- -setsebool -P httpd_use_gpg on ----- - -== Troubleshooting - -=== General Troubleshooting - -For general Troubleshooting of SELinux and its profiles try to install -the package `setroubleshoot` and run: - -[source,console] ----- -sealert -a /var/log/audit/audit.log > /path/to/mylogfile.txt ----- - -to get a report which helps you to configure your SELinux profiles. - -Another tool for troubleshooting is to enable a single ruleset for your -ownCloud directory: - -[source,console] ----- -semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud(/.*)?' -restorecon -RF /var/www/html/owncloud ----- - -It is much stronger security to have a more fine-grained ruleset as in -the examples at the beginning, so use this only for testing and -troubleshooting. It has a similar effect to disabling SELinux, so don’t -use it on production systems. - -See this https://github.com/owncloud/documentation/pull/2693[discussion on GitHub] -to learn more about configuring SELinux correctly for ownCloud. - -=== Redis on RHEL 7 & Derivatives - -On RHEL 7 and its derivatives, if you are using Redis for both local -server cache and file locking and Redis is configured to listen on a -Unix socket instead of a TCP/IP port (_which is recommended if Redis is -running on the same system as ownCloud_) you must instruct SELinux to -allow daemons to enable cluster mode. You can do this using the -following command: - -[source,console] ----- -setsebool -P daemons_enable_cluster_mode 1 ----- diff --git a/modules/admin_manual/pages/troubleshooting/general_troubleshooting.adoc b/modules/admin_manual/pages/troubleshooting/general_troubleshooting.adoc index 2aac3527d..e9dcaaf69 100644 --- a/modules/admin_manual/pages/troubleshooting/general_troubleshooting.adoc +++ b/modules/admin_manual/pages/troubleshooting/general_troubleshooting.adoc @@ -38,75 +38,6 @@ Check the ownCloud xref:installation/system_requirements.adoc[System Requirement Third-party apps may cause problems during upgrades. To avoid this happening, we strongly encourage administrators to always disable third-party apps before upgrades, and for troubleshooting purposes. -=== ownCloud Logfiles - -In a standard ownCloud installation the log level is set to `Normal`. To find any issues you need to raise the log level to `All` in your `config.php` file, or to *Everything* on your ownCloud Admin page. Please see xref:configuration/server/logging/logging_configuration.adoc[Logging Configuration] for more information on these log levels. - -Some logging - for example JavaScript console logging - needs debugging enabled. Edit config/config.php and change `'debug' => false,` to `'debug' => true,` Be sure to change it back when you are finished. - -For JavaScript issues you will also need to view the javascript console. All major browsers have developer tools for viewing the console. Usually you can access them by pressing F12. - -For more information on developer tools for Mozilla Firefox, refer to: https://developer.mozilla.org/en-US/docs/Tools - -To learn more about Chrome or Chromium developer tools, go to: https://developer.chrome.com/docs/devtools/ - -NOTE: The logfile of ownCloud is located in the data directory `owncloud/data/owncloud.log`. - -=== PHP Version and Information - -You will need to know your PHP version and configuration details. There are two ways to retrieve this information: using PHP's phpinfo function and using a set of options to PHP on the command-line. - -==== Using PHP's phpinfo Function - -Create a plain-text file named "_phpinfo.php_" and place it in your webserver's root directory, for example `/var/www/html/phpinfo.php`. - -TIP: Your webserver's root directory may be in a different location; your Linux distribution's documentation will tell you where it is located. - -This file contains the following line: - -[source,php] ----- - ----- - -Open this file in a web browser, by pointing your browser to `localhost/phpinfo.php`: - -image:phpinfo.png[image] - -Your PHP version is at the top, and the rest of the page contains abundant system information such as active modules, active `.ini` files, and much more. When you are finished reviewing your information you must delete `phpinfo.php`, or move it outside of your Web directory, because it is a security risk to expose such sensitive data. - -==== Using the Command-Line - -To retrieve your PHP version, run the following command: - -[source,bash] ----- -php -v ----- - -To retrieve a list of PHP's active modules, run the following command. - -[source,bash] ----- -php -m ----- - -You will see output similar to the following displayed in the terminal. ----- -[PHP Modules] -ast -calendar -Core -ctype -curl -date -dom -exif -fileinfo ----- - -To obtain information about PHP's configuration, you can either retrieve it all at once, by running `php -i` or retrieve information about individual modules, by running `php --ri` followed by the module's name, such as `php --ri curl`. - === Debugging Sync Issues IMPORTANT: The data directory on the server is exclusive to ownCloud and must not be modified manually. @@ -120,7 +51,7 @@ If you need to directly upload files from the same server please use a WebDAV co `\https://example.com/owncloud/remote.php/dav` -=== Common problems / error messages +=== Common Problems / Error Messages Some common problems / error messages found in your logfiles as described above: @@ -135,45 +66,37 @@ headers to PHP and so the login to ownCloud via WebDAV, CalDAV and CardDAV clien More information on how to correctly configure your environment can be found {oc-central-url}/t/no-basic-authentication-headers-were-found-message/819[at the forums]. -== OAuth2 - -=== ownCloud clients cannot connect to the ownCloud server +== Troubleshooting Logs -If ownCloud clients cannot connect to your ownCloud server, check to see if PROPFIND requests receive `HTTP/1.1 401 Unauthorized` responses. If this is happening, more than likely your webserver configuration is stripping out https://tools.ietf.org/html/rfc6750[the bearer authorization header]. +In order to start troubleshooting, you will need the relevant log information and the correct log level. -If you’re using the Apache web server, add the following `SetEnvIf` directive to your Apache configuration, whether in the general Apache config, in a configuration include file, or in ownCloud’s .htaccess -file. +=== Location of Logfiles -[source,apache] ----- -SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 ----- +The first step when encountering issues is to check the log files provided by PHP, the embedded Apache server and ownCloud itself. In a Dockerised ownCloud environment, the logs can be found at the following location: -== Missing Data Directory +* The logfile of ownCloud is located at: +`/owncloud.log`. -During the normal course of operations, the ownCloud data directory may be temporarily unavailable for a variety of reasons. These can include network timeouts on mounted network disks, unintentional unmounting of the partition on which the directory sits, or a corruption of the RAID setup. If you have experienced this, here’s how ownCloud works and what you can expect. +* The Apache2 log is routed to Docker stdout. + +The logging capabilities of Docker should be used to obtain log details. -During normal operation, ownCloud’s data directory contains a hidden file, named `.ocdata`. The purpose of this file is for setups where the data folder is mounted (such as via NFS) and for some reason the mount disappeared. If the directory isn’t available, the data folder would, in effect, be completely empty and the `.ocdata` would be missing. When this happens, ownCloud will return a https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#5xx_Server_Error[503 Service not available] error, to prevent clients believing that the files are gone. +* The PHP log is routed to Docker stdout. + +The logging capabilities of Docker should be used to obtain log details. -== Troubleshooting Web server and PHP problems +=== ownCloud Log-Levels -=== Logfiles +In a standard ownCloud installation the log level is set to `Normal`. -When having issues the first step is to check the logfiles provided by PHP, the Web server and ownCloud itself. +* To find any issues you need to raise the log level to `All` in your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file], or to *Everything* on your ownCloud Admin page. Please see xref:configuration/server/logging/logging_configuration.adoc[Logging Configuration] for more information on these log levels. -NOTE: In the following the paths to the logfiles of a default Debian installation running Apache2 with mod_php is assumed. On other Web servers, Linux distros or operating systems they can differ. +* Some logging - for example JavaScript console logging - needs debugging enabled. + +Edit the config and change `'debug' => false,` to `'debug' => true,` Be sure to change it back when you are finished. -* The logfile of Apache2 is located in `/var/log/apache2/error.log`. -* The logfile of PHP can be configured in your -`/etc/php/7.4/apache2/php.ini`. You need to set the directive `log_errors` -to `On` and choose the path to store the logfile in the `error_log` -directive. After those changes you need to restart your Web server. -* The logfile of ownCloud is located in the data directory -`/var/www/owncloud/data/owncloud.log`. +* For JavaScript issues you will also need to view the javascript console. All major browsers have developer tools for viewing the console. Usually you can access them by pressing F12. == Troubleshooting WebDAV -=== General troubleshooting +=== General Troubleshooting ownCloud uses SabreDAV, and the SabreDAV documentation is comprehensive and helpful. @@ -276,10 +199,31 @@ Misconfigured Web server:: Your Web server is misconfigured and blocks the needed DAV methods. Please refer to xref:troubleshooting-webdav[Troubleshooting WebDAV] above for troubleshooting steps. -== Client Sync Stalls +== OAuth2 + +=== ownCloud Apps Cannot Connect to the ownCloud Server + +If ownCloud clients cannot connect to your ownCloud server, check to see if PROPFIND requests receive `HTTP/1.1 401 Unauthorized` responses. If this is happening, more than likely your web-proxy server configuration is stripping out the https://tools.ietf.org/html/rfc6750[bearer authorization header]. + +Wen using an Apache web-proxy server, add the following `SetEnvIf` directive to that Apache configuration. Please note that the embedded Apache webserver of the ownCloud image already has this included in the `.htaccess` file located in the containers `/var/www/owncloud` directory. + +[source,apache] +---- +SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 +---- + +== Missing Data Directory + +In situations where the `` of your compose definition uses NFS or an external RAID systrem, the moint point may be temporarily unavailable because the resource is not available on the host. If you have experienced this, here’s how ownCloud works and what you can expect. + +During normal operation, ownCloud’s data directory contains a hidden file, named `.ocdata`. The purpose of this file is for setups where the data folder is mounted (such as via NFS) and for some reason the mount disappeared. If the directory isn’t available, the data folder would, in effect, be completely empty and the `.ocdata` would be missing. When this happens, ownCloud will return a https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#5xx_Server_Error[503 Service not available] error, to prevent clients believing that the files are gone. + +If the operating environment is restored, the Compose environment needs to be shut down and restarted, after which ownCloud will resume normal operation. + +== App Synchronization Stalls One known reason is stray locks. These should expire automatically after an hour. If stray locks don’t expire (identified by e.g. repeated `file.txt is locked` and/or `Exception\\\\FileLocked` messages in your data/owncloud.log), make sure that you are running system cron and not Ajax cron (See xref:configuration/server/background_jobs_configuration.adoc[Background Jobs]). See https://github.com/owncloud/core/issues/22116 and {oc-central-url}/t/file-is-locked-how-to-unlock/985 for some discussion and additional info of this issue. -== Other issues +== Other Issues Some services like _Cloudflare_ can cause issues by minimizing JavaScript and loading it only when needed. When having issues like a not working login button or creating new users make sure to disable such services first. diff --git a/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc b/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc index 92a235eef..907f4d4c3 100644 --- a/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc +++ b/modules/admin_manual/pages/troubleshooting/providing_logs_and_config_files.adoc @@ -49,20 +49,19 @@ menu:Settings[Admin > General > Log > "Download logfile"]. === Generate via Command Line -If the log file is too big, you will need to transfer it from the command line. The location of the log file can be found in your config.php. By default it is in your data directory. Note that you may need to compress the logfile before uploading: +If the log file is too big, you will need to transfer it from the command line. By default it is named `owncloud.log` and located at the Docker Volume `/files`. -[source,php] ----- -'datadirectory' => '/var/www/owncloud/data', ----- +Note that you may need to compress the logfile before uploading. -When not using the default location for the logfile, it can be specified via: +When not using the default location for the logfile, it can be specified via your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file]: [source,php] ---- 'logfile' => '/owncloud.log', ---- +NOTE: You must create a Docker Volume to make the configured path available. + == LDAP Config If LDAP is used, viewing the LDAP configuration is important when checking for errors between your ownCloud instance and your LDAP server. To get the output file, execute this command: diff --git a/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc b/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc index 0b8518e05..6b4dc51a0 100644 --- a/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc +++ b/modules/admin_manual/pages/troubleshooting/remove_non_existent_bg_jobs.adoc @@ -67,7 +67,7 @@ WARNING: Deleting a job cannot be undone. Be sure that you want to delete the jo === Remove Jobs Manually Added via Crontab -If an erroring job as been added manually in `crontab`, remove the job from the crontab queue list. First, list the entries of crontab for the web server user: +If an erroring job as been added manually in `crontab`, remove the job from the crontab queue list on your host. First, list the entries of crontab for the web server user: [source,bash] ---- From bde8739390bb146387124f7b66c23341394304d6 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Tue, 9 Jun 2026 18:23:28 +0200 Subject: [PATCH 29/38] safe the work --- .../files/big_file_upload_configuration.adoc | 152 +++--------------- .../files/external_storage/configuration.adoc | 2 - .../configuration/server/harden_server.adoc | 6 - .../configuration/user/user_auth_ldap.adoc | 1 - .../pages/installation/create_own_image.adoc | 6 +- .../installation/installing_with_docker.adoc | 26 ++- .../general_troubleshooting.adoc | 56 ++++++- 7 files changed, 86 insertions(+), 163 deletions(-) diff --git a/modules/admin_manual/pages/configuration/files/big_file_upload_configuration.adoc b/modules/admin_manual/pages/configuration/files/big_file_upload_configuration.adoc index bc84ff536..f77388cc3 100644 --- a/modules/admin_manual/pages/configuration/files/big_file_upload_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/big_file_upload_configuration.adoc @@ -16,50 +16,33 @@ If you're expecting big file uploads, some considerations have to be taken into == General Considerations -* Make sure that a version of PHP xref:installation/system_requirements.adoc[supported by ownCloud] is installed. * Consider that user quotas may prevent big file uploads due to a user reaching the space limitation. + * Though ownCloud already disables the PHP setting *Output Buffering* in the shipped `.htaccess` and `.user.ini` to prevent PHP memory-related errors, it can be the case that you must manually set it in your `php.ini` or `VirtualHosts` when the other two configuration files can't be used in your environment. + * The directory used for `upload_tmp_dir` must be fully accessible by PHP / the webserver user, usually `www-data`. + * Your temp directory or partition has to be big enough to hold multiple parallel uploads from multiple users. The formula for this is `temp_space = concurrent_uploads * chunk size` + For example, if the chunk size is *10MB* (which is the default but might vary between different clients) and the average number of users uploading at the same time is *25*, then you’ll need 250MB of temp space, as the formula below shows. + ---- 10MB x 25 users = 250MB required temp space ---- + * The user's upload directory, usually in `//uploads` (see xref:configuration/server/config_sample_php_parameters.adoc#define-the-directory-where-user-files-are-stored[Sample Config PHP Parameters] for details) also has to be big enough. The formula is a bit different, as this directory collects all chunks of a file for that upload for that user until the upload is completed. The space needed for this directory is temporarily the same size as for the final file size. As an example, if a user wants to upload a 4GB file, temporarily 4GB of space needs to be available in the upload directory to hold the chunks. When the upload has finished, all chunks are written to the final destination and the chunks are deleted afterwards freeing that temporary space. The formula for the upload directory's temp space for all users is: `temp_space = concurrent_uploads * average_upload_size_per_user`. The location of the upload directory can be defined via the config setting xref:configuration/server/config_sample_php_parameters.adoc#define-the-dav-chunk-base-directory[dav.chunk_base_dir]. ++ [NOTE] ==== The space temporarily consumed in the upload directory will not count against the user quota. If a user has no quota left in his peronal storage and the quota excludes external mounts, uploads to a windows network drive share as example will succeed. The file temporarily created in the upload directory will not count against his personal storage. ==== -* In Centos and RHEL, Apache has a few more default configurations within systemd. -+ -[NOTE] -==== -You will have to set the `temp` directory in two places: - -. In php.ini, e.g., `sys_temp_dir = "/scratch/tmp"` -. In Apache systemd file e.g. `sudo systemctl edit httpd` and change/add: -+ ----- -PrivateTmp=false ----- -When done, you need to reload the daemon and restart the service: +== Configuration via .htaccess -[source,bash] ----- -sudo systemctl daemon-reload -sudo systemctl restart httpd ----- +NOTE: ownCloud provides its own `.htaccess` file located in the containers `/var/www/owncloud` directory. You must provide a Docker volume to access this file. -Please **do not** change `/usr/lib/systemd/system/httpd.service` directly, only use `sudo systemctl edit httpd`. If not doing so, a httpd package upgrade may revert your changes. -==== - -== Configuration via .htaccess/user.ini +Set the following parameters inside the corresponding file using your own desired values, as in the following examples: -NOTE: ownCloud comes with its own `owncloud/.htaccess` file. When using `php-fpm`, PHP settings in `.htaccess` are not accessed. These settings must then be set in the `{userini}` file. `php-fpm` will read settings from any {userini} file in the same directory as the .php file that is being served via a web server. - -Set the following parameters inside the corresponding file using your own desired values, as in the following examples, both files are located in the ownCloud root folder: +If you did not used a Dockerised installation before, you may have used a {userini} file in the same location of {htaccess}. The file example shown with {userini} must be converted to {htaccess} when using the Dockerised ownCloud installation and is provided as example only. {userini}:: [source,php] @@ -75,7 +58,7 @@ upload_tmp_dir=/mnt/php_big_temp/ ---- php_value post_max_size=16G php_value output_buffering=0 -php_value upload_max_filesize=16G +php_value post_max_size=16G php_value upload_tmp_dir=/mnt/php_big_temp/ ---- @@ -83,130 +66,37 @@ If you see PHP timeouts in your log files, increase the timeout values, which ar [source,php] ---- -max_input_time=3600 -max_execution_time=3600 ----- - -NOTE: Consider that any settings made in `{htaccess}` or `{userini}` may need to be repopulated after an upgrade of ownCloud. - -== Configuring via PHP Global Settings - -If you don't want to use the ownCloud `.htaccess` or `.user.ini` file, you may configure PHP globally instead. -Make sure to comment out or remove any lines in `.htaccess` if you added any like in the section above. - -NOTE: If you are running ownCloud on a 32-bit system, any `open_basedir` directive in your `php.ini` file needs to be commented out. - -See the *Loaded Configuration File* section of xref:configuration/general_topics/general_troubleshooting.adoc#php-version-and-information[PHP Version and Information] to find your relevant php.ini files. - -Set the following parameters inside the corresponding php.ini file using your own desired file size values, as in the following example: - -[source,php] ----- -post_max_size=16G -output_buffering=0 -upload_max_filesize=16G -upload_tmp_dir=/mnt/php_big_temp/ ----- - -If you see PHP timeouts in your log files, increase the timeout values, which are in seconds, as in the example below: - -[source,php] ----- -max_input_time=3600 -max_execution_time=3600 ----- - -== Configuring via a Virtual Host - -You can configure php parameters also per virtual host - if you have access to the Apache configuration file. This eliminates the need to maintain custom settings in a `{userini}` or `{htaccess}` file especially on upgrades. Note the mandatory prefix `php_admin_value` before the php parameter. - -[source,apache] ----- - - - DocumentRoot /var/www/owncloud - ServerName myowncloud.com - - php_admin_value post_max_size 16G - php_admin_value output_buffering 0 - php_admin_value upload_max_filesize 16G - php_admin_value upload_tmp_dir /mnt/php_big_temp/ - - ... +php_value max_input_time=3600 +php_value max_execution_time=3600 ---- -If you see PHP timeouts in your log files, increase the timeout values, which are in seconds, as in the example below: - -[source,php] ----- -php_admin_value max_input_time 3600 -php_admin_value max_execution_time 3600 ----- +NOTE: Consider that any settings made in `{htaccess}` need to be repopulated after an upgrade of ownCloud. == Configuring via ownCloud -As an alternative to the `upload_tmp_dir` of PHP (e.g., if you don't have access to your `php.ini`) you can also configure some parameters in `config.php`. +As an alternative, you can also configure some parameters in your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file]. * Set a temporary location for uploaded files by using the `tempdirectory` setting. -* If you have configured the `session_lifetime` setting in your `config.php`, -see xref:configuration/server/config_sample_php_parameters.adoc[Sample Config PHP Parameters], make sure it is not too low. This setting needs to be configured to at least the time (in seconds) that the longest upload will take. If unsure, remove this entirely from your configuration to reset it to the default shown in the `config.sample.php`. +* If you have configured the `session_lifetime` setting in your configuration, see xref:configuration/server/config_sample_php_parameters.adoc[Sample Config PHP Parameters], make sure it is not too low. This setting needs to be configured to at least the time (in seconds) that the longest upload will take. If unsure, remove this entirely from your configuration to reset it to the default shown in the `config.sample.php`. + +== Important Changes in Apache 2.4.54 + +In Apache HTTP Server 2.4.53 and earlier, the default value of the LimitRequestBody directive was 0 (unlimited). This has changed starting with Apache HTTP Server 2.4.54 where the default value is set to 1073741824 bytes (1 GB). This means, that uploads to public folders when chunking is not in effect will be limited to this file size. Change this value according to your needs in order to allow large file uploads. Please refer to the official Apache documentation {limitrequestbody-url}[LimitRequestBody] for more information. == General Upload Issues Various environmental factors could cause a restriction of the upload size. Examples are: -* The `LVE Manager` of `CloudLinux` which sets an `I/O limit`. * Some services like `Cloudflare` are also known to cause uploading issues. * Upload limits enforced by proxies used by your clients. -* Other web server modules like described in xref:configuration/general_topics/general_troubleshooting.adoc[General Troubleshooting]. - -=== Apache Directives - -* {limitrequestbody-url}[LimitRequestBody] -* {sslrenegbuffersize-url}[SSLRenegBufferSize] - -=== Apache with mod_reqtimeout - -The {mod_reqtimeout-url}[mod_reqtimeout] Apache module could also stop large uploads from completing. If you're using this module and uploads of large files fail, either disable it in your Apache config or increase the configured `RequestReadTimeout` values. - -Disable mod_reqtimeout on Ubuntu:: -+ -On Ubuntu, you can disable the module by running the following command: -+ -[source,bash] ----- -sudo a2dismod reqtimeout ----- - -Disable mod_reqtimeout on CentOS:: -+ -On CentOS, comment out the following line in `/etc/httpd/conf/httpd.conf`: -+ -[source,apache] ----- -LoadModule reqtimeout_module modules/mod_reqtimeout.so ----- -+ -When you have run `asdismod` or updated `/etc/httpd/conf/httpd.conf`, restart Apache. -+ -TIP: There are also several other configuration options in your web server config which could prevent the upload of larger files. Refer to your web server's manual for how to configure those values correctly: - -=== Apache with mod_fcgid - -* {fcgidmaxrequestinmem-url}[FcgidMaxRequestInMem] -* {fcgidmaxrequestlen-url}[FcgidMaxRequestLen] - -WARNING: If you are using Apache 2.4 with mod_fcgid, as of February/March 2016, `FcgidMaxRequestInMem` still needs to be significantly increased from its default value to avoid the occurrence of segmentation faults when uploading big files. This is not a regular setting but serves as a workaround for {mod_fcgid_bug_51747-url}[Apache with mod_fcgid bug #51747]. - -Setting `FcgidMaxRequestInMem` significantly higher than usual may no longer be necessary, once bug #51747 is fixed. == Important Changes in Apache 2.4.54 -In Apache HTTP Server 2.4.53 and earlier, the default value of the `LimitRequestBody` directive was 0 (unlimited). This has changed starting with Apache HTTP Server 2.4.54 where the default value is set to 1073741824 bytes (1 GB). This means, that uploads to public folders when chunking is not in effect will be limited to this file size. Change this value according to your needs in order to allow large file uploads. Please refer to the official Apache documentation {limitrequestbody-url}[LimitRequestBody] for more information. +In Apache HTTP Server 2.4.53 and earlier, the default value of the `LimitRequestBody` directive was 0 (unlimited). This has changed starting with Apache HTTP Server 2.4.54 where the default value is set to 1073741824 bytes (1 GB). This means, that uploads to public folders when chunking is not in effect will be limited to this file size. Change this value according to your needs in order to allow large file uploads. Please refer to the official Apache documentation {limitrequestbody-url}[LimitRequestBody, windows=_blank] for more information. == Long-Running Uploads -For very long-running uploads *those lasting longer than 1h* to public folders, _when chunking is not in effect_, `filelocking.ttl` should be set to a significantly large value in `config.php`. If not, large file uploads will fail with a file locking error, because the Redis garbage collection will delete the initially acquired file lock after 1 hour by default. +For very long-running uploads *those lasting longer than 1h* to public folders, _when chunking is not in effect_, `filelocking.ttl` should be set to a significantly large value in your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file]. If not, large file uploads will fail with a file locking error, because the Redis garbage collection will delete the initially acquired file lock after 1 hour by default. To estimate a good value, use the following formula: diff --git a/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc b/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc index 0a4ed29b1..7541fbf4e 100644 --- a/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/external_storage/configuration.adoc @@ -70,8 +70,6 @@ TIP: Please refer to xref:configuration/server/import_ssl_cert.adoc[Importing Sy The following backends are provided by the external storages app. Other apps may provide their own backends, which are not listed here. -NOTE: A non-blocking or correctly configured SELinux setup is needed for these backends to work. - == Allow Users to Mount External Storage Check "__Allow users to mount external storage__" to allow your users to mount storages on external services. Then enable the backends you want to allow. diff --git a/modules/admin_manual/pages/configuration/server/harden_server.adoc b/modules/admin_manual/pages/configuration/server/harden_server.adoc index e7c45599c..c45f1f834 100644 --- a/modules/admin_manual/pages/configuration/server/harden_server.adoc +++ b/modules/admin_manual/pages/configuration/server/harden_server.adoc @@ -56,12 +56,6 @@ With this information, you can begin customizing a rate-limiting solution specif * https://gist.github.com/procrastinatio/6b6579230d99be5bfa26d04acd788e7a[Rate limiting with HAProxy] * https://www.fir3net.com/Loadbalancers/F5-BIG-IP/f5-ltm-ratelimiting.html[Rate limiting with F5] -== Operating System - -=== Enable Hardening Modules Such as SELinux - -We also recommend to enable hardening modules such as SELinux where possible. - == Database When using MySQL or MariaDB, enable the https://mariadb.com/docs/skysql-dbaas/ref/xpand/sql-modes/STRICT_TRANS_TABLES/#Setting_the_SQL_MODE[STRICT_TRANS_TABLES, window=_blank] if it is not already activated. diff --git a/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc b/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc index 52ebbc2a2..f3afe7ae9 100644 --- a/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc +++ b/modules/admin_manual/pages/configuration/user/user_auth_ldap.adoc @@ -14,7 +14,6 @@ :openldap-index-tuning-guide-url: https://www.openldap.org/doc/admin24/tuning.html#Indexes :oracle-ismemberof-url: https://docs.oracle.com/cd/E29127_01/doc.111170/e28967/ismemberof-5dsat.htm :reverse-group-membership-maintenance-url: https://www.openldap.org/doc/admin24/overlays.html#Reverse%20Group%20Membership%20Maintenance -:selinux-url: https://selinuxproject.org/page/Main_Page :service-ldap-with-tls-url: https://ubuntu.com/server/docs/service-ldap-with-tls :ldap-over-ssl-ldaps-certificate-url: https://social.technet.microsoft.com/wiki/contents/articles/2980.ldap-over-ssl-ldaps-certificate.aspx diff --git a/modules/admin_manual/pages/installation/create_own_image.adoc b/modules/admin_manual/pages/installation/create_own_image.adoc index 29d6fd947..da9bbf568 100644 --- a/modules/admin_manual/pages/installation/create_own_image.adoc +++ b/modules/admin_manual/pages/installation/create_own_image.adoc @@ -12,7 +12,7 @@ You can build your own image at any time to add binaries or functionalities that In some situations, creating your own image is mandatory because certain apps or configurations require binaries that are not included in the image. These binaries have not been added on purpose in order to keep the image as slim as possible, and because situations requiring them depend on individual use cases. -Apps or Configurations that Require Building an own Image:: +Apps or Configurations that Require Building an own Docker image:: + -- The following references link to the relevant pages that describe the reason when building individual images may be required. @@ -22,3 +22,7 @@ The following references link to the relevant pages that describe the reason whe * xref:admin_manual:enterprise/authentication/kerberos.adoc[Kerberos Authentication] * xref:admin_manual:configuration/files/previews_configuration.adoc[Preview Configuration] -- + +== Impact on own Built Images + +ownCloud cannot be held responsible for any changes made when creating a Docker image based on the one provided by ownCloud. The only exception is, when an image is created under the supervision of ownCloud Support. diff --git a/modules/admin_manual/pages/installation/installing_with_docker.adoc b/modules/admin_manual/pages/installation/installing_with_docker.adoc index 03cf57b77..55704da5d 100644 --- a/modules/admin_manual/pages/installation/installing_with_docker.adoc +++ b/modules/admin_manual/pages/installation/installing_with_docker.adoc @@ -108,7 +108,7 @@ When running `docker ps` again, the entry for `oc-eval` should be gone. == Docker Compose -The configuration: +The example configuration: * Exposes ports {std-port-http}, allowing for HTTP connections. * Uses separate _MariaDB_ and _Redis_ containers. @@ -140,13 +140,7 @@ include::example$installation/docker/docker-compose.yml[] [#env-file] [source,bash,subs="attributes+"] ---- -OWNCLOUD_IMAGE={latest-server-download-version} -OWNCLOUD_DOMAIN=localhost -OWNCLOUD_TRUSTED_DOMAINS=localhost -OWNCLOUD_OVERWRITE_CLI_URL=http://localhost -HTTP_PORT=8080 -MARIADB_IMAGE=10.11 -REDIS_IMAGE=7 +include::example$installation/docker/dot.env[] ---- + Only a few settings are required, these are: @@ -249,8 +243,7 @@ Check that all the containers have successfully started, by running `docker comp | 0.0.0.0:{std-port-http}->{std-port-http}/tcp |=== -In it, you can see that the database, ownCloud and Redis containers are running, and that ownCloud -is accessible via port {std-port-http} on the host machine. +Here you can see, that the database, ownCloud and Redis containers are running, and that ownCloud is accessible via port {std-port-http} on the host machine. [TIP] ==== @@ -289,7 +282,7 @@ docker compose stop To stop and remove containers along with the related networks, images and volumes: [source,docker] ---- -docker compose down --rmi all --volumes +docker compose down --rmi all --volumes --remove-orphans ---- === Running occ commands @@ -353,12 +346,13 @@ The latter is the user number you will need licenses for. Guest users are curren === Admin Settings -With docker, the admin user cannot control certain settings in the WebUI, instead they are/can be now controlled by environment variables. Changing these variables requires stopping and restarting the container. When using environment variables, these changes need to be reflected in the compose file. +With Docker, the admin user cannot control certain settings in the WebUI, instead they are/can be now controlled by environment variables. Changing these variables requires stopping and restarting the container. When using environment variables, these changes need to be reflected in the compose file. -=== Logging +=== Logging and Apache2 Config See the `General Troubleshooting` guide for: +* The xref:troubleshooting/general_troubleshooting.adoc#view-the-apache-config[View the Apache Config] * The xref:troubleshooting/general_troubleshooting.adoc#location-of-logfiles[Location of Logfiles]. * The xref:troubleshooting/general_troubleshooting.adoc#owncloud-log-levels[ownCloud Log-Levels]. @@ -373,7 +367,11 @@ docker exec -it owncloud_server /bin/bash === List Shipped Apps -The Docker image comes with all apps provided by ownCloud, regardless of the licensing scheme. To see a list of the apps that have been shipped, you can either look in the GUI or list the contents of `/var/www/owncloud/apps` when accessing the xref:#container-cli[container CLI]. +The Docker image comes with all apps provided by ownCloud, regardless of the licensing scheme. To see a list of the apps that have been shipped, you can either look: + +* In the GUI via menu:Settings[Admin > Apps] +* See the xref:installation/apps_supported.adoc[Supported Apps in ownCloud] page which provides you additional documentation links +* List the contents of `/var/www/owncloud/apps` when accessing the xref:#container-cli[container CLI]. === Terminating Containers diff --git a/modules/admin_manual/pages/troubleshooting/general_troubleshooting.adoc b/modules/admin_manual/pages/troubleshooting/general_troubleshooting.adoc index e9dcaaf69..cbcb174ff 100644 --- a/modules/admin_manual/pages/troubleshooting/general_troubleshooting.adoc +++ b/modules/admin_manual/pages/troubleshooting/general_troubleshooting.adoc @@ -66,6 +66,33 @@ headers to PHP and so the login to ownCloud via WebDAV, CalDAV and CardDAV clien More information on how to correctly configure your environment can be found {oc-central-url}/t/no-basic-authentication-headers-were-found-message/819[at the forums]. +[#view-the-apache-config] +== Troubleshooting the Apache Config + +IMPORTANT: The following content is intended for informational purposes only. No changes should be made. + +The configuration of the embedded Apache2 server is located under the directory `/etc/apache2/` of the ownCloud container, but not in the standard Debian subdirectories due to the way the image is built. During the build process, the default `conf-\*` and `sites-*` directories are stripped and replaced with an overlay of their own: + +[width="100%",cols="60%,80%",options="header"] +|=== +| Path (inside the container) +| Comment + +| `/etc/apache2/apache2.conf` +| Global config + +| `/etc/apache2/sites-enabled/default.conf` +| Generated at container startup from the gomplate template `/etc/templates/apache.conf.tmpl` + +| `/etc/apache2/conf-enabled/` +| Additional snippets (charset, security, remoteip, servername) + +| `/etc/apache2/ports.conf` +| Port binding +|=== + +This means, that the ownCloud Apache2 configuration is stored in the `/etc/apache2` directory; it just looks different from a standard Debian installation. + == Troubleshooting Logs In order to start troubleshooting, you will need the relevant log information and the correct log level. @@ -75,14 +102,28 @@ In order to start troubleshooting, you will need the relevant log information an The first step when encountering issues is to check the log files provided by PHP, the embedded Apache server and ownCloud itself. In a Dockerised ownCloud environment, the logs can be found at the following location: * The logfile of ownCloud is located at: -`/owncloud.log`. ++ +`/owncloud.log` + +* The Apache2 logs are by default routed to Docker stdout/stderr. ++ +-- +`Error log` → `/dev/stderr` (to override use envvar: `OWNCLOUD_ERRORLOG_LOCATION`) + +`Access log` → `/dev/stdout` (to override use envvar: `OWNCLOUD_ACCESSLOG_LOCATION`) -* The Apache2 log is routed to Docker stdout. + The logging capabilities of Docker should be used to obtain log details. +-- -* The PHP log is routed to Docker stdout. + +* The PHP logs are by default routed to Docker stdout/stderr. + The logging capabilities of Docker should be used to obtain log details. ++ +.Quick tip reading Docker logs for ownCloud +[source,bash] +---- +docker compose logs owncloud -f +---- + === ownCloud Log-Levels In a standard ownCloud installation the log level is set to `Normal`. @@ -146,13 +187,12 @@ RewriteRule .* - [R=401,L] Some clients - especially on iOS/Mac OS X - have problems finding the proper sync URL, even when explicitly configured to use it. -If you want to use CalDAV or CardDAV clients together with ownCloud it is important to have a correct working setup of the following URLs: +If you want to use CalDAV or CardDAV clients together with ownCloud, it is important to have a correct working setup of the following URLs: [verse] -- `\https://example.com/.well-known/carddav` `\https://example.com/.well-known/caldav` - -- Those need to be redirecting your clients to the correct DAV endpoints. If running ownCloud at the document root of your Web server the correct @@ -164,9 +204,9 @@ and if running in a subfolder like `owncloud`: `\https://example.com/owncloud/remote.php/dav` -For the first case the .htaccess file shipped with ownCloud should do this work for your when running Apache. You only need to make sure that your Web server is using this file. +For the first case the `.htaccess` file shipped with ownCloud should do this work. -If your ownCloud instance is installed in a subfolder called `owncloud` and you’re running Apache create or edit the .htaccess file within the document root of your Web server and add the following lines: +If your ownCloud instance is installed in a subfolder called `owncloud`, edit the `.htaccess` file and add the following lines: [source,apache] ---- @@ -205,7 +245,7 @@ Misconfigured Web server:: If ownCloud clients cannot connect to your ownCloud server, check to see if PROPFIND requests receive `HTTP/1.1 401 Unauthorized` responses. If this is happening, more than likely your web-proxy server configuration is stripping out the https://tools.ietf.org/html/rfc6750[bearer authorization header]. -Wen using an Apache web-proxy server, add the following `SetEnvIf` directive to that Apache configuration. Please note that the embedded Apache webserver of the ownCloud image already has this included in the `.htaccess` file located in the containers `/var/www/owncloud` directory. +When using an Apache web-proxy server, you may need to add the following `SetEnvIf` directive to that Apache configuration. Please note that the embedded Apache webserver of the ownCloud image already has this included in the `.htaccess` file located in the containers `/var/www/owncloud` directory. [source,apache] ---- From a9df59c9d5ff1320adebc6f62055dddeb86fd069 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Wed, 10 Jun 2026 09:58:05 +0200 Subject: [PATCH 30/38] add file --- modules/admin_manual/examples/installation/docker/dot.env | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 modules/admin_manual/examples/installation/docker/dot.env diff --git a/modules/admin_manual/examples/installation/docker/dot.env b/modules/admin_manual/examples/installation/docker/dot.env new file mode 100644 index 000000000..3e0ed5b46 --- /dev/null +++ b/modules/admin_manual/examples/installation/docker/dot.env @@ -0,0 +1,7 @@ +OWNCLOUD_IMAGE={latest-server-download-version} +OWNCLOUD_DOMAIN=localhost +OWNCLOUD_TRUSTED_DOMAINS=localhost +OWNCLOUD_OVERWRITE_CLI_URL=http://localhost +HTTP_PORT={std-port-http} +MARIADB_IMAGE=10.11 +REDIS_IMAGE=7 From 0a90b5b1b8332a460644b959a6d35ed6fd4a76a1 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Wed, 10 Jun 2026 14:57:46 +0200 Subject: [PATCH 31/38] many changes and fixes --- antora.yml | 9 +- .../files/big_file_upload_configuration.adoc | 115 +++++++++++------- .../files/default_files_configuration.adoc | 20 +-- ...federated_cloud_sharing_configuration.adoc | 36 +++--- .../files/file_sharing_configuration.adoc | 94 +++++++------- .../configuration/files/file_versioning.adoc | 35 +++--- .../files/files_locking_transactional.adoc | 34 ++---- .../files/manual_file_locking.adoc | 16 +-- .../files/previews_configuration.adoc | 57 +++++---- .../server/caching_configuration.adoc | 40 ------ .../installation/installing_with_docker.adoc | 10 +- 11 files changed, 210 insertions(+), 256 deletions(-) diff --git a/antora.yml b/antora.yml index 88574b6f0..08ec5b826 100644 --- a/antora.yml +++ b/antora.yml @@ -11,10 +11,7 @@ asciidoc: latest-server-version: {page-component-version} # do not change, this is the value of the version key previous-server-version: {page-component-version} # do not change, this is the value of the version key current-server-version: {page-component-version} # do not change, this is the value of the version key - minimum-php-version: '7.4' - minimum-php-printed: '7.4.0' - minimum-php-version-short-code: '74' - recommended-php-version: '7.4' - recommended-php-version-short-code: '74' - supported-php-versions: '7.4' + minimum-php-printed: '8.1.0' + recommended-php-version: '8.1' # note: admin docs format: 'html' # this attribute is a necessary legacy + config-sample: configuration/server/config_sample_php_parameters.adoc diff --git a/modules/admin_manual/pages/configuration/files/big_file_upload_configuration.adoc b/modules/admin_manual/pages/configuration/files/big_file_upload_configuration.adoc index f77388cc3..fb32cbd1f 100644 --- a/modules/admin_manual/pages/configuration/files/big_file_upload_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/big_file_upload_configuration.adoc @@ -1,87 +1,113 @@ = Big File Upload Configuration :toc: right :stem: -:mod_reqtimeout-url: https://httpd.apache.org/docs/current/mod/mod_reqtimeout.html :limitrequestbody-url: https://httpd.apache.org/docs/current/en/mod/core.html#limitrequestbody -:sslrenegbuffersize-url: https://httpd.apache.org/docs/current/mod/mod_ssl.html#sslrenegbuffersize -:fcgidmaxrequestinmem-url: https://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidmaxrequestinmem -:fcgidmaxrequestlen-url: https://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidmaxrequestlen -:mod_fcgid_bug_51747-url: https://bz.apache.org/bugzilla/show_bug.cgi?id=51747 :userini: .user.ini :htaccess: .htaccess == Introduction -If you're expecting big file uploads, some considerations have to be taken into account. Setups based on your needs can be configured. +If you're expecting to upload large files, there are some things you need to consider. Setups can be configured based on your needs. == General Considerations -* Consider that user quotas may prevent big file uploads due to a user reaching the space limitation. +* Bear in mind that user quotas may prevent large file uploads if a user exceeds their storage limit. -* Though ownCloud already disables the PHP setting *Output Buffering* in the shipped `.htaccess` and `.user.ini` to prevent PHP memory-related errors, it can be the case that you must manually set it in your `php.ini` or `VirtualHosts` when the other two configuration files can't be used in your environment. +* Although the PHP setting `output_buffering` is already disabled in the shipped `.htaccess` file by ownCloud to prevent PHP memory-related errors, you may still need to manually set additional configuration options, as described below. -* The directory used for `upload_tmp_dir` must be fully accessible by PHP / the webserver user, usually `www-data`. +* If the temporary directory used for uploading files is changed, it must be: + +** Fully accessible by the PHP/webserver user, which is usually `www-data`. +** It is mounted as a Docker volume to provide the necessary space. -* Your temp directory or partition has to be big enough to hold multiple parallel uploads from multiple users. The formula for this is `temp_space = concurrent_uploads * chunk size` + -For example, if the chunk size is *10MB* (which is the default but might vary between different clients) and the average number of users uploading at the same time is *25*, then you’ll need 250MB of temp space, as the formula below shows. +* The size of your temporary directory or partition must be sufficient to accommodate multiple parallel uploads from different users. The formula for this is: + +-- ---- -10MB x 25 users = 250MB required temp space +temp_space = concurrent_uploads * chunk size ---- -* The user's upload directory, usually in `//uploads` (see xref:configuration/server/config_sample_php_parameters.adoc#define-the-directory-where-user-files-are-stored[Sample Config PHP Parameters] for details) also has to be big enough. The formula is a bit different, as this directory collects all chunks of a file for that upload for that user until the upload is completed. The space needed for this directory is temporarily the same size as for the final file size. As an example, if a user wants to upload a 4GB file, temporarily 4GB of space needs to be available in the upload directory to hold the chunks. When the upload has finished, all chunks are written to the final destination and the chunks are deleted afterwards freeing that temporary space. The formula for the upload directory's temp space for all users is: `temp_space = concurrent_uploads * average_upload_size_per_user`. The location of the upload directory can be defined via the config setting xref:configuration/server/config_sample_php_parameters.adoc#define-the-dav-chunk-base-directory[dav.chunk_base_dir]. +For example, if the chunk size is *10MB* (which is the default but might vary between different clients) and the average number of users uploading at the same time is *25*, then you’ll need 250MB of temp space, as the formula below shows. + +---- +10MB x 25 users = 250MB of required temp space +---- +-- + +* The user's upload directory, usually in `/files//uploads` also has to be big enough. The formula is a bit different, as this directory collects all chunks of a file for that upload for that user until the upload is completed. The space needed for this directory is temporarily the same size as for the final file size. As an example, if a user wants to upload a 4GB file, temporarily 4GB of space needs to be available in the upload directory to hold the chunks. When the upload has finished, all chunks are written to the final destination and the chunks are deleted afterwards freeing that temporary space. + +-- +The formula for the upload directory's temp space for all users is: + +---- +temp_space = concurrent_uploads * average_upload_size_per_user +---- + +The location of the upload directory can be defined via the environment variable xref:{config-sample}#define-the-dav-chunk-base-directory[OWNCLOUD_DAV_CHUNK_BASE_DIR]. You must provide a Docker volume for it if it is redefined. + [NOTE] ==== The space temporarily consumed in the upload directory will not count against the user quota. If a user has no quota left in his peronal storage and the quota excludes external mounts, uploads to a windows network drive share as example will succeed. The file temporarily created in the upload directory will not count against his personal storage. ==== +-- -== Configuration via .htaccess +* If you have configured the xref:{config-sample}#define-the-lifetime-of-a-session-after-inactivity[session_lifetime] setting in your configuration, or via the environment variable (see below), make sure it is not too low. This setting needs to be configured to at least the time (in seconds) that the longest upload will take. If unsure, remove this entirely from your configuration. -NOTE: ownCloud provides its own `.htaccess` file located in the containers `/var/www/owncloud` directory. You must provide a Docker volume to access this file. +== Configuration -Set the following parameters inside the corresponding file using your own desired values, as in the following examples: +[IMPORTANT] +==== +If you have used PHP or .htaccess/.userini configuration before using the Dockerised ownCloud deployment, you now must switch to the environment variables that have been provided. -If you did not used a Dockerised installation before, you may have used a {userini} file in the same location of {htaccess}. The file example shown with {userini} must be converted to {htaccess} when using the Dockerised ownCloud installation and is provided as example only. +The following PHP keys are affected and need to be reconfigured. The values are only exemplary: -{userini}:: [source,php] ---- post_max_size=16G -output_buffering=0 upload_max_filesize=16G upload_tmp_dir=/mnt/php_big_temp/ +max_input_time=3600 +max_execution_time=3600 +memory_limit=512 ---- -{htaccess}:: -[source,php] ----- -php_value post_max_size=16G -php_value output_buffering=0 -php_value post_max_size=16G -php_value upload_tmp_dir=/mnt/php_big_temp/ ----- +Please note that `output_buffering=0` is already set in the shipped `.htaccess` file. +==== -If you see PHP timeouts in your log files, increase the timeout values, which are in seconds, as in the example below. Use the `php_value` prefix like above when configuring the `{htaccess}` file: -[source,php] ----- -php_value max_input_time=3600 -php_value max_execution_time=3600 ----- +The following ownCloud environment variables can be adapted when configuring big file uploads: + +[width="100%",cols="50%,50%",options="header"] +|=== +| Environment Variable +| PHP or Config Key -NOTE: Consider that any settings made in `{htaccess}` need to be repopulated after an upgrade of ownCloud. +| OWNCLOUD_MAX_UPLOAD +a| `post_max_size` and + +`upload_max_filesize` -== Configuring via ownCloud +| OWNCLOUD_TEMP_DIRECTORY +| `upload_tmp_dir` -As an alternative, you can also configure some parameters in your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file]. +| OWNCLOUD_MAX_INPUT_TIME +| `max_input_time` -* Set a temporary location for uploaded files by using the `tempdirectory` setting. -* If you have configured the `session_lifetime` setting in your configuration, see xref:configuration/server/config_sample_php_parameters.adoc[Sample Config PHP Parameters], make sure it is not too low. This setting needs to be configured to at least the time (in seconds) that the longest upload will take. If unsure, remove this entirely from your configuration to reset it to the default shown in the `config.sample.php`. +| OWNCLOUD_MAX_EXECUTION_TIME +| `max_execution_time` -== Important Changes in Apache 2.4.54 +| OWNCLOUD_MEMORY_LIMIT +| `memory_limit` -In Apache HTTP Server 2.4.53 and earlier, the default value of the LimitRequestBody directive was 0 (unlimited). This has changed starting with Apache HTTP Server 2.4.54 where the default value is set to 1073741824 bytes (1 GB). This means, that uploads to public folders when chunking is not in effect will be limited to this file size. Change this value according to your needs in order to allow large file uploads. Please refer to the official Apache documentation {limitrequestbody-url}[LimitRequestBody] for more information. +| OWNCLOUD_SESSION_KEEPALIVE +a| xref:{config-sample}#enable-session-keep-alive-when-a-user-is-logged-in-to-the-web-ui[session_keepalive] + +| OWNCLOUD_SESSION_LIFETIME +a| xref:{config-sample}#define-the-lifetime-of-a-session-after-inactivity[session_lifetime] +|=== + + +== Apache Config LimitRequestBody + +The default value of the {limitrequestbody-url}[LimitRequestBody] setting in Apache is 1073741824 bytes (1 GB). ownCloud has set this value to 0 (zero) for its embedded Apache configuration, which is equivalent to `unlimited`. This means that uploads to public folders will not be limited to any file size by Apache when chunking is not in effect. == General Upload Issues @@ -90,19 +116,14 @@ Various environmental factors could cause a restriction of the upload size. Exam * Some services like `Cloudflare` are also known to cause uploading issues. * Upload limits enforced by proxies used by your clients. -== Important Changes in Apache 2.4.54 - -In Apache HTTP Server 2.4.53 and earlier, the default value of the `LimitRequestBody` directive was 0 (unlimited). This has changed starting with Apache HTTP Server 2.4.54 where the default value is set to 1073741824 bytes (1 GB). This means, that uploads to public folders when chunking is not in effect will be limited to this file size. Change this value according to your needs in order to allow large file uploads. Please refer to the official Apache documentation {limitrequestbody-url}[LimitRequestBody, windows=_blank] for more information. - == Long-Running Uploads -For very long-running uploads *those lasting longer than 1h* to public folders, _when chunking is not in effect_, `filelocking.ttl` should be set to a significantly large value in your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file]. If not, large file uploads will fail with a file locking error, because the Redis garbage collection will delete the initially acquired file lock after 1 hour by default. +For very long-running uploads *those lasting longer than 1h* to public folders, _when chunking is not in effect_, xref:{config-sample}#define-the-ttl-for-file-locking[OWNCLOUD_FILELOCKING_TTL] should be set to a significantly large value. If not, large file uploads will fail with a file locking error, because the Redis garbage collection will delete the initially acquired file lock after 1 hour by default. To estimate a good value, use the following formula: -[source,plaintext] ---- -time_in_seconds = (maximum_upload_file_size / slowest_assumed_upload_connection). +time_in_seconds = (maximum_upload_file_size / slowest_assumed_upload_connection) ---- For the value of "_slowest assumed upload connection_", take the *upload* speed of the user with the slowest connection and divide it by two. For example, let's assume that the user with the slowest connection has an 8MBit/s DSL connection; which usually indicates the download speed. This type of connection would, usually, have 1MBit/s upload speed (but confirm with the ISP). Divide this value in half, to have a buffer when there is network congestion, to arrive at 512KBit/s as the final value. diff --git a/modules/admin_manual/pages/configuration/files/default_files_configuration.adoc b/modules/admin_manual/pages/configuration/files/default_files_configuration.adoc index 4e3b15dd7..e51ec87fe 100644 --- a/modules/admin_manual/pages/configuration/files/default_files_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/default_files_configuration.adoc @@ -1,29 +1,19 @@ = Providing Default Files -You may distribute a set of default files and folders to all users by -placing them in the `owncloud/core/skeleton` directory on your ownCloud -server. These files appear only to new users after their initial login, -and existing users will not see files that are added to this directory -after their first login. The files in the skeleton directory are copied -into the users’ data directories, so they may change and delete the -files without affecting the originals. +You may distribute a set of default files and folders to all users by placing them into the default `/var/www/owncloud/core/skeleton` directory which needs to be mounted by the host using a Docker volume first. These files appear only to new users after their initial login. Existing users will not see files that are added to this directory after their first login. The files in the skeleton directory are copied into the users’ data directories, so they may change and delete the files without affecting the originals. This screenshot shows a set of photos in the skeleton directory. -image:skeleton-files.png[image] +image:skeleton-files.png[image, width=350] They appear on the user’s ownCloud Files page just like any other files. -image:skeleton-files1.png[image] +image:skeleton-files1.png[image, width=350] == Additional Configuration -The configuration option `skeletondirectory` available in your `config.php` allows you to configure the directory where the skeleton files are located. - -These files will be copied to the data directory of new users. +You can redefine the location of the skeleton directory using the environment variable xref:{config-sample}#define-the-directory-where-the-skeleton-files-are-located[OWNCLOUD_SKELETON_DIRECTORY] which then needs to be made available using a Docker volume. Leave this directory empty if you do not want to copy any skeleton files. -The value of the `skeletondirectory` key **must not be empty** if you decide to use it in your `config.php`. - -TIP: See xref:configuration/server/config_sample_php_parameters.adoc[Sample Config PHP Parameters] for more the complete list of `config.php` options. +The value of this config *must not be empty*, if you decide to use it. diff --git a/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc b/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc index 467e11e5b..4841d9484 100644 --- a/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/federated_cloud_sharing_configuration.adoc @@ -1,16 +1,17 @@ = Configuring Federation Sharing :toc: right -:toclevels: 1 -:page-aliases: go/admin-sharing-federated.adoc :description: With Federated Cloud Sharing, you can easily and securely link file shares between ownCloud servers, in effect creating a "cloud" of ownCloud installations. == Introduction {description} -IMPORTANT: For security reasons federated sharing **strictly requires HTTPS (SSL/TLS)**. +[IMPORTANT] +==== +* For security reasonsfederated sharing *strictly requires HTTPS (SSL/TLS)*. -IMPORTANT: If you want to use HTTP for development and testing purposes, you have to set `'sharing.federation.allowHttpFallback' => true,` in **config/config.php**. +* If you want to use HTTP for development and testing purposes, you have to set xref:{config-sample}#allow-schema-fallback-for-federated-sharing-servers[OWNCLOUD_SHRAING_FEDERATION_ALLOW_HTTP_FALLBACK] to 'true'. +==== == Configuration @@ -20,9 +21,9 @@ Follow these steps to establish a trusted connection between two servers. If you open the server URL in your browser and see a lock icon on the left-hand side of the address bar, the certificate is valid: + .Lock icon in the address bars in Firefox, Google Chrome, and Safari -image::configuration/files/browser-address-bars.png[Lock icon in Firefox, Google Chrome, and Safari] +image:configuration/files/browser-address-bars.png[Lock icon in Firefox, Google Chrome, and Safari, width=300] -. Verify that the `'overwrite.cli.url' => 'https://'` setting is configured to the correct URL instead of `localhost` in *config.php*: +. Verify that xref:{config-sample}#override-cli-url[OWNCLOUD_OVERWRITE_CLI_URL] is set to `'https://'` instead of `localhost`: . Navigate to menu:Admin settings[Sharing > Federation] @@ -69,9 +70,9 @@ NOTE: Automatic acceptance of new federated shares will not work if the option ` == Working With Proxies -There are ownCloud instances that are not connected to the internet. They have no possibility to reach the public network. Therefore Federation will not work without a proxy. +Some ownCloud instances are not connected to the internet. They cannot access the public network. Therefore, federation will not work without a proxy. -Set the `proxy` and `proxyuserpwd` configuration variables, in `config/config.php`. `proxy` sets the proxy’s hostname, and `proxyuserpwd` sets the username and password credentials, in `username:password` format. +Set the xref:{config-sample}#define-list-of-trusted-proxy-servers[OWNCLOUD_PROXY] and xref:{config-sample}#define-proxy-authentication[OWNCLOUD_PROXY_USERPWD] configuration variables. == Creating a New Federation Share @@ -82,33 +83,31 @@ Follow these steps to create a new Federation share between two ownCloud servers . Create a federated share by entering username@serveraddress in the sharing dialog (for example `freda@https://example.com/owncloud`). When ownCloud verifies the link, it displays it with the *(federated)* label. Click on this label to establish the link. + -image::configuration/files/federation-2.png[image, width=550] +image:configuration/files/federation-2.png[image, width=350] . When the link is successfully completed, you have a single share option, and that is *can edit*. + -image::configuration/files/federation-3.png[image, width=350] +image:configuration/files/federation-3.png[image, width=350] + You may disconnect the share at any time by clicking the btn:[trash can] icon. == Federated Sharing Scanner CronJob Configuration -IMPORTANT: As part of the migration step to 10.5, before enabling the cronjob described below, make sure to remove the system cron job from your crontab that executes legacy *occ incoming-shares:poll* - The Federated Sharing Scanner is a background job used to scan the federated shares to ensure the integrity of the file cache. On each run the scanner will select federated shares that satisfy these requirements: -. ensure that within a single cron run, at max [cronjob_scan_external_batch] scans will be performed out of all accepted external shares (default 100) +. Ensure that within a single cron run, at max xref:cronjob_scan_external_batch[cronjob_scan_external_batch] scans will be performed out of all accepted external shares (default 100) -. a scan of that external share has not been performed within the last [cronjob_scan_external_min_scan] seconds (default 3 hours) +. A scan of that external share has not been performed within the last xref:cronjob_scan_external_min_scan[cronjob_scan_external_min_scan] seconds (default 3 hours) -. the user still exists, and has been active recently, meaning logged in within the last [cronjob_scan_external_min_login] seconds (default 24 hours) +. The user still exists, and has been active recently, meaning logged in within the last xref:cronjob_scan_external_min_login[cronjob_scan_external_min_login] seconds (default 24 hours) -. there has been a change in the federated remote share root etag or mtime, signaling a mandatory rescan +. There has been a change in the federated remote share root etag or mtime, signaling a mandatory rescan To enable the cronjob, go to menu:Settings[Admin Settings > Federated Cloud Sharing] and enable the checkbox: -image::configuration/files/sharing/federated-cloud-sharing/scan-cronjob.png[Checkbox, width=500] +image:configuration/files/sharing/federated-cloud-sharing/scan-cronjob.png[Checkbox, width=500] Alternatively you can use the command line: @@ -119,6 +118,7 @@ Alternatively you can use the command line: You can also configure these settings of the cronjob: +[#cronjob_scan_external_min_login] . the minimum amount of time since last login of a user so that a scan is triggered (ensures only active users get fed shares synced) + [source,bash,subs="attributes+"] @@ -126,6 +126,7 @@ You can also configure these settings of the cronjob: {occ-command-example-prefix-docker} config:app:set files_sharing cronjob_scan_external_min_login --value ---- +[#cronjob_scan_external_min_scan] . the minimum amount of time since last scanned so that the next scan is triggered (avoid frequent scan when active collaboration) + [source,bash,subs="attributes+"] @@ -133,6 +134,7 @@ You can also configure these settings of the cronjob: {occ-command-example-prefix-docker} config:app:set files_sharing cronjob_scan_external_min_scan --value ---- +[#cronjob_scan_external_batch] . the maximum number of federated share scans per 10 minutes (scan performed only if fed share files got updated) + [source,bash,subs="attributes+"] diff --git a/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc b/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc index f1e036a11..47e438825 100644 --- a/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/file_sharing_configuration.adoc @@ -1,8 +1,8 @@ = File Sharing :toc: right :page-aliases: go/admin-sharing.adoc -:two-letter-url: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 :description: This section describes how to set general configuration rules for sharing files. +:two-letter-url: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 == Introduction @@ -21,7 +21,7 @@ If you don't see the sharing section: If so, disable the plugin and recheck. ==== -image:configuration/files/sharing-files-settings.png[ownCloud Sharing settings] +image:configuration/files/sharing-files-settings.png[ownCloud Sharing settings, width=350] From this section, ownCloud users can: @@ -65,32 +65,32 @@ NOTE: ownCloud includes a xref:configuration/server/security/password_policy.ado == Settings Explained -=== Allow apps to use the Share API +=== Allow Apps to use the Share API Check this option to enable users to share files. If this is not checked, no users can create file shares. -=== Allow users to share via link +=== Allow Users to Share via Link Check this option to enable creating public link shares for people who are not ownCloud users via hyperlink. -==== Allow public uploads +==== Allow Public Uploads Check this option to allow anyone to upload files to public link shares. -==== Enforce password protection of public link shares +==== Enforce Password Protection of Public Link Shares Check these options to force users to set a password on public link shares. Passwords can be enforced on any or all of read-only, read-write, read-write-delete and upload-only (File Drop) public link shares. This does not apply to local user and group shares. -==== Set default expiration date of public link shares +==== Set Default Expiration Date of Public Link Shares Check this option to set a default expiration date on public link shares. Check _Enforce as maximum expiration date_ to limit the maximum expiration date to be the default. Users can choose an earlier expiration date if they wish. -==== Allow users to send mail notification for shared files +==== Allow Users to Send Mail Notification for Shared Files Check this option to enable sending notifications from ownCloud. When clicked, the administrator can choose the language for public mail notifications for shared files. image:configuration/files/sharing/choose-public-mail-notification-language.png[Choose the language for public -mail notifications for shared files in ownCloud.] +mail notifications for shared files in ownCloud., width=350] What this means is, that email notifications will be sent in the language of the user that shared an item. By default the language is the share owner’s language. @@ -106,102 +106,100 @@ xref:configuration/server/occ_command.adoc#config-commands[occ config:app:set co --value '' ---- -NOTE: In the example above, the `` is an -{two-letter-url}[ISO 3166-1 alpha-2 two-letter country code], such as *de*, *gb*, *us*, *es* or others. +[NOTE] +==== +* In the example above, the `` is an {two-letter-url}[ISO 3166-1 alpha-2 two-letter country code], such as *de*, *gb*, *us*, *es* or others. -NOTE: To use this functionality, your ownCloud server must be configured to send mail. +* To use this functionality, your ownCloud server must be configured to send mail. +==== -==== Allow users to share file via social media +==== Allow Users to Share File via Social Media Check this option to enable displaying of a set of links that allow for quickly sharing files and share links via *Twitter*, *Facebook*, *Google+*, *Diaspora*, and email. -image:configuration/files/sharing/sharing-files-via-social-media.png[ownCloud social media sharing links] +image:configuration/files/sharing/sharing-files-via-social-media.png[ownCloud social media sharing links, width=350] -=== Set default expiration date for user shares +=== Set Default Expiration Date for User Shares Check this option to set a default expiration date when sharing with another user. The user can change or remove the default expiration date of a share. -==== Set the number of days to expire after +==== Set the Number of Days to Expire After Set the default number of days that user shares will expire. The default value is 7 days. -==== Enforce as maximum expiration date +==== Enforce as Maximum Expiration Date Check this option to limit the maximum expiration date to be the default. Users can choose an earlier expiration date if they wish. -=== Set default expiration date for group shares +=== Set Default Expiration Date for Group Sshares Check this option to set a default expiration date when sharing with a group. The user can change or remove the default expiration date of a share. -==== Set the number of days to expire after +==== Set the Number of Days to Expire After Set the default number of days that group shares will expire. The default value is 7 days. -==== Enforce as maximum expiration date +==== Enforce as Maximum Expiration Date Check this option to limit the maximum expiration date to be the default. Users can choose an earlier expiration date if they wish. -=== Set default expiration date for remote shares +=== Set Default Expiration Ddate for Rremote Shares Check this option to set a default expiration date when sharing with a remote user. The user can change or remove the default expiration date of a share. -==== Set the number of days to expire after +==== Set the Number of Days to Expire After Set the default number of days that remote shares will expire. The default value is 7 days. -==== Enforce as maximum expiration date +==== Enforce as Maximum Expiration Date Check this option to limit the maximum expiration date to be the default. Users can choose an earlier expiration date if they wish. -=== Automatically accept new incoming local user shares +=== Automatically Accept new Incoming Local User Shares Disabling this option activates the "Pending Shares" feature. Users will be notified and have to accept new incoming user shares before they appear in the file list and are available for access giving them more control over their account. More information about https://doc.owncloud.com/docs_main/next/server_release_notes.html#pending-shares[pending shares] can be found in the release notes. -=== Allow resharing +=== Allow Resharing Check this option to enable users to re-share files shared with them. -=== Allow sharing with groups +=== Allow Sharing With Groups Check this option to enable users to share with groups. -=== Default user and group share permissions +=== Default User and Group Share Permissions Administrators can define the permissions for user/group shares that are set by default when users create new shares. As shares are created instantly after choosing the recipient, administrators can set the default to e.g. read-only to avoid creating shares with too many permissions unintentionally. -=== Restrict users to only share with users in their groups +=== Restrict Users to Only Share With Users in Their Groups Check this option to confine sharing within group memberships. -NOTE: This setting does not apply to the Federated Cloud sharing feature. If -xref:configuration/files/federated_cloud_sharing_configuration.adoc[Federated Cloud Sharing] -is enabled, users can still share items with any users on any instances (_including the one they are on_) via a remote share. +NOTE: This setting does not apply to the Federated Cloud sharing feature. If xref:configuration/files/federated_cloud_sharing_configuration.adoc[Federated Cloud Sharing] is enabled, users can still share items with any users on any instances (_including the one they are on_) via a remote share. -=== Restrict users to only share with groups they are a member of +=== Restrict Users to Only Share With Groups They are a Member of -When this option is enabled, users can only share with groups they are a member of. They can still share with all users of the instance but not with groups they are not a member of. To restrict sharing to users in groups the sharer is a member of, the option _Restrict users to only share with users in their groups_ can be used. More information about -https://doc.owncloud.com/docs_main/next/server_release_notes.html#more-granular-sharing-restrictions[granular sharing restrictions] -can be found in the release notes. +When this option is enabled, users can only share with groups they are a member of. They can still share with all users of the instance but not with groups they are not a member of. To restrict sharing to users in groups the sharer is a member of, the option _Restrict users to only share with users in their groups_ can be used. More information about https://doc.owncloud.com/docs_main/next/server_release_notes.html#more-granular-sharing-restrictions[granular sharing restrictions] can be found in the release notes. -=== Allow users to send mail notification for shared files to other users +=== Allow Users to Send Mail Notification for Shared Files to Other Users Check this option to enable users to send an email notification to every ownCloud user that the file is shared with. -=== Exclude groups from sharing +=== Exclude Groups From Sharing Check this option to prevent members of specific groups from creating any file shares. When you check this, you will get a dropdown list of all your groups to choose from. Members of excluded groups can still receive shares, but not create any. -=== Allow username autocompletion in share dialog +=== Allow Username Autocompletion in Share Dialog Check this option to enable auto-completion of ownCloud usernames. -==== Restrict enumeration to group members +==== Restrict Enumeration to Group Members Check this option to restrict auto-completion of ownCloud usernames to only those users who are members of the same group(s) that the user is in. -=== Extra field to display in autocomplete results +=== Extra Field to Display in Autocomplete Results The autocomplete dropdowns in ownCloud usually show the display name of other users when it is set. If it's not set, they show the user ID / login name, as display names are not unique you can run into situations where you cannot distinguish the proposed users. This option enables to add mail addresses or user ID's to make them distinguishable. @@ -211,7 +209,7 @@ Sometimes it is necessary or desirable to block groups from receiving shares. Fo To blacklist one or more groups via the Web UI, under menu:Settings[Admin > Sharing], add one or more groups to the _Files Sharing_ list. As you type the group’s name, if it exists, it will appear in the drop-down list where you can select it. -image:configuration/files/sharing/blacklisting-groups.png[Blacklisting groups] +image:configuration/files/sharing/blacklisting-groups.png[Blacklisting groups, width=350] == Transferring Files to Another User @@ -241,18 +239,22 @@ Here is an example of how to transfer _a limited group_ a single folder from one When using this command keep two things in mind: 1. The directory provided to the `--path` switch *must* exist inside `data//files`. -2. The directory (and its contents) won’t be moved as is between the users. It will be moved inside the destination user’s `files` directory, and placed in a directory which follows the format: -`transferred from on `. Using the example above, it will be stored under: +2. The directory (and its contents) won’t be moved as is between the users. It will be moved inside the destination user’s `files` directory, and placed in a directory which follows the format: + +`transferred from on `. + +Using the example above, it will be stored under: + `data//files/transferred from on 20170426_124510/` -TIP: See the xref:configuration/server/occ_command.adoc[occ command reference], -for a complete list of `occ` commands. +TIP: See the xref:configuration/server/occ_command.adoc[occ command reference], for a complete list of `occ` commands. + +[IMPORTANT] +==== +If an exception occurred during the transfer ownership command or the command terminated prematurely, it is advised to run following command for the source *and* target user: -IMPORTANT: If an exception occurred during the transfer ownership command or the command terminated prematurely, it is advised to run following command for the source *and* target user: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} files:troubleshoot-transfer-ownership --uid ` ---- +==== == Creating Persistent File Shares diff --git a/modules/admin_manual/pages/configuration/files/file_versioning.adoc b/modules/admin_manual/pages/configuration/files/file_versioning.adoc index 656b3707d..b5d73f4b6 100644 --- a/modules/admin_manual/pages/configuration/files/file_versioning.adoc +++ b/modules/admin_manual/pages/configuration/files/file_versioning.adoc @@ -24,7 +24,7 @@ NOTE: File versioning only gets triggered if the change is made via the ownCloud Versions are displayed in the WebUI in the details view in the right sidebar if you click on the file row in the file listing. You can restore the current file to one of the earlier backup copies in the list, by clicking on the btn:[restore] icon of the specific version. -image::configuration/files/files_versions/files-versions.png[File Versions in the WebUI] +image::configuration/files/files_versions/files-versions.png[File Versions in the WebUI, width=350] == How Versions are Deleted @@ -72,15 +72,15 @@ The versions are adjusted along this pattern every time a new version is created WARNING: The versions app never uses more than 50% of the user’s storage quota. If the stored versions exceed this limit, ownCloud deletes the oldest file versions until it meets the disk space limit again. -TIP: Adjust the `'versions_retention_obligation'` setting in `config.php` to avoid filling up the user's quota. For details see the section below. +TIP: Adjust the `OWNCLOUD_VERSIONS_RETENTION_OBLIGATION` setting to avoid filling up the user's quota. For details see the section below. == Change the Expiration Settings -You may alter the xref:configuration/server/config_sample_php_parameters.adoc#define-the-files-versions-retention-obligation[default pattern] in `config.php`. The default setting is `auto`, which sets the default pattern: +You may alter the default pattern xref:{config-sample}#define-the-files-versions-retention-obligation[OWNCLOUD_VERSIONS_RETENTION_OBLIGATION]. The default setting is `auto`, which sets the default pattern: -[source,php] +[source,.env] ---- -'versions_retention_obligation' => 'auto', +OWNCLOUD_VERSIONS_RETENTION_OBLIGATION='auto' ---- === Possible Config Values @@ -107,27 +107,27 @@ You may alter the xref:configuration/server/config_sample_php_parameters.adoc#de Keep all versions for at least 10 days, apply expiration rules to all versions that are older than 10 days. This will keep a lot more versions during the last 10 days compared to the default pattern. -[source,php] +[source,.env] ---- -'versions_retention_obligation' => '10, auto', +OWNCLOUD_VERSIONS_RETENTION_OBLIGATION='10, auto' ---- ==== Example 2: Apply expiration rules to all versions that are created during the last 30 days and do not keep any versions older than 30 days. -[source,php] +[source,.env] ---- -'versions_retention_obligation' => 'auto, 30', +OWNCLOUD_VERSIONS_RETENTION_OBLIGATION='auto, 30' ---- ==== Example 3: Do not apply any expiration rules. Delete all versions after 30 days. -[source,php] +[source,.env] ---- -'versions_retention_obligation' => '30, 30', +OWNCLOUD_VERSIONS_RETENTION_OBLIGATION='30, 30' ---- == Restoring a Version @@ -142,9 +142,9 @@ Save additional metadata (author, version tag, etc.) of each version of uploaded image::configuration/files/files_versions/version-metadata.png[Extended Version Metadata,width=300] -You can enable the feature xref:configuration/server/config_sample_php_parameters.adoc#save-additional-metadata-for-versions[via an entry in config.php]. +You can enable the feature using xref:{config-sample}#save-additional-metadata-for-versions[OWNCLOUD_SAVE_VERSION_METADATA]. -WARNING: The metadata is only collected after enabling the feature using the xref:configuration/server/config_sample_php_parameters.adoc#save-additional-metadata-for-versions[config.php] configuration file. This means the author or version number will show only for new versions of the file and be empty for older versions. +WARNING: The metadata is only collected after enabling the feature has been enabled. This means the author or version number will show only for new versions of the file and be empty for older versions. === Show the Author of a Version @@ -154,11 +154,14 @@ Each update to the file that generates a new file version will additionally show ownCloud can automatically generate and increment version numbers for new file versions. Based on this feature, one can define the actual version to be a major version which gets a major version number and all new upcoming versions start counting from this major number. Major versions are persistent versions that are not subject to any retention policies set by ownCloud. -TIP: Publishing the version persists it until the original file is deleted by somebody with such permission or by the system administrator via occ versions:cleanup command. For more information check the xref:configuration/files/file_versioning.adoc#how-versions-are-deleted[versions retention] section. +[TIP] +==== +* Publishing the version persists it until the original file is deleted by somebody with such permission or by the system administrator via occ versions:cleanup command. For more information check the xref:configuration/files/file_versioning.adoc#how-versions-are-deleted[versions retention] section. -TIP: To create a new persistent major version, the user has to click on the check mark next to the version info tab. Check the image above. +* To create a new persistent major version, the user has to click on the check mark next to the version info tab. Check the image above. -TIP: The versions follow the X.Y format, where X is a major part and Y is a minor part of the version. Version tags cannot be modified by the user, they are auto-generated by ownCloud. +* The versions follow the X.Y format, where X is a major part and Y is a minor part of the version. Version tags cannot be modified by the user, they are auto-generated by ownCloud. +==== == Enterprise File Retention diff --git a/modules/admin_manual/pages/configuration/files/files_locking_transactional.adoc b/modules/admin_manual/pages/configuration/files/files_locking_transactional.adoc index 3d57ece8e..125982f13 100644 --- a/modules/admin_manual/pages/configuration/files/files_locking_transactional.adoc +++ b/modules/admin_manual/pages/configuration/files/files_locking_transactional.adoc @@ -1,35 +1,15 @@ = Transactional File Locking :page-aliases: go/admin-transactional-locking.adoc -ownCloud’s Transactional File Locking mechanism locks files to avoid -file corruption during normal operation. It performs these functions: +ownCloud’s Transactional File Locking mechanism locks files to avoid file corruption during normal operation. It performs these functions: -* Operates at a higher level than the filesystem, so you don’t need to -use a filesystem that supports locking -* Locks parent directories so they cannot be renamed during any activity -on files inside the directories -* Releases locks after file transactions are interrupted, for example -when a sync client loses the connection during an upload -* Manages locking and releasing locks correctly on shared files during -changes from multiple users +* Operates at a higher level than the filesystem, so you don’t need to use a filesystem that supports locking +* Locks parent directories so they cannot be renamed during any activity on files inside the directories +* Releases locks after file transactions are interrupted, for example when a sync client loses the connection during an upload +* Manages locking and releasing locks correctly on shared files during changes from multiple users * Manages locks correctly on external storage mounts * Manages encrypted files correctly -Transactional File locking will not prevent multiple users from editing -the same document, nor give notice that other users are working on the -same document. Multiple users can open and edit a file at the same time -and Transactional File locking does not prevent this. Rather, it -prevents simultaneous file saving. +Transactional File locking will not prevent multiple users from editing the same document, nor give notice that other users are working on the same document. Multiple users can open and edit a file at the same time and Transactional File locking does not prevent this. Rather, it prevents simultaneous file saving. -[NOTE] -==== -Transactional file locking is in ownCloud core, and replaces the old File Locking app. -The File Locking app was removed from ownCloud in version 8.2.1. If your ownCloud server still has the File Locking app, -you *must* visit your Apps page to verify that it is disabled; the File Locking app and Transactional File Locking cannot both operate at the same time. -==== - -File locking is enabled by default, using the database locking backend. -This places a significant load on your database. Using -`memcache.locking` relieves the database load and improves performance. -Admins of ownCloud servers with heavy workloads should install -xref:configuration/server/caching_configuration.adoc[a memory cache] . +File locking is enabled by default, using the database locking backend. This places a significant load on your database. Using `memcache.locking` relieves the database load and improves performance. Admins of ownCloud servers with heavy workloads should install xref:configuration/server/caching_configuration.adoc[a memory cache] . diff --git a/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc b/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc index d4117803b..4c9eb2ddb 100644 --- a/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc +++ b/modules/admin_manual/pages/configuration/files/manual_file_locking.adoc @@ -5,7 +5,7 @@ Manual file locking allows users, if enabled, to lock files in shared areas while working on them in order to prevent concurrent changes from other users (check-in/check-out). -The feature builds on the WebDAV Locks backend which has been introduced with Server 10.1 and is now available in the ownCloud Web Interface. All storages are supported as locking takes place on the WebDAV level. The locks will only be available via ownCloud, not when a user works directly on the storage. Using the context menu of files, every user who has access can lock them. Users can recognize locked files by the means of a new lock indicator. While a file is locked, other users can still access it but they can not make any changes. Locked files can manually be unlocked by the lock owner (the user who locked the file; exclusive locking) using the "Locks" tab in the file details view (right sidebar). +The feature builds on the WebDAV Locks backend and is now available in the ownCloud Web Interface. All storages are supported as locking takes place on the WebDAV level. The locks will only be available via ownCloud, not when a user works directly on the storage. Using the context menu of files, every user who has access can lock them. Users can recognize locked files by the means of a new lock indicator. While a file is locked, other users can still access it but they can not make any changes. Locked files can manually be unlocked by the lock owner (the user who locked the file; exclusive locking) using the "Locks" tab in the file details view (right sidebar). == Example Use Case @@ -24,19 +24,19 @@ The main user-facing component in the web interface looks like in the following ^| Manual Locking Disabled ^| Manual Locking Enabled -a| image::configuration/files/manual_file_locking/lock-file-not-visible.png[File locking not visible] -a| image::configuration/files/manual_file_locking/lock-file-visible.png[File locking visible] +a| image::configuration/files/manual_file_locking/lock-file-not-visible.png[File locking not visible, width=350] +a| image::configuration/files/manual_file_locking/lock-file-visible.png[File locking visible, width=350] |=== If manual locking is enabled, the following additional user-facing components are present: [width="100%",cols="50%,50%"] |=== -a| image::configuration/files/manual_file_locking/file-locked-symbol.png[File locked symbol] -a| image::configuration/files/manual_file_locking/file-locked-hint.png[File locking hint] +a| image::configuration/files/manual_file_locking/file-locked-symbol.png[File locked symbol, width=350] +a| image::configuration/files/manual_file_locking/file-locked-hint.png[File locking hint, width=350] -a| image::configuration/files/manual_file_locking/file-locked-details.png[File locking details] -a| image::configuration/files/manual_file_locking/file-locked-unlock-symbol.png[File unlocking] +a| image::configuration/files/manual_file_locking/file-locked-details.png[File locking details, width=350] +a| image::configuration/files/manual_file_locking/file-locked-unlock-symbol.png[File unlocking, width=350] |=== @@ -45,7 +45,7 @@ Administrators can enable _Manual File Locking_ for users either via the web int Web interface:: Go to menu:Settings[Admin > General] + -image::configuration/files/manual_file_locking/manual-file-locking-with-lock-breaker.png[Enable file locking] +image:configuration/files/manual_file_locking/manual-file-locking-with-lock-breaker.png[Enable file locking, width=350] Using the occ command:: [source,bash,subs="attributes+"] diff --git a/modules/admin_manual/pages/configuration/files/previews_configuration.adoc b/modules/admin_manual/pages/configuration/files/previews_configuration.adoc index e8b180ded..8611cc3e4 100644 --- a/modules/admin_manual/pages/configuration/files/previews_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/previews_configuration.adoc @@ -37,7 +37,7 @@ IMPORTANT: Be careful enabling preview thumbnail generation for documents which == Default Preview Providers -Please note that the ownCloud preview system comes already with sensible defaults, and therefore it is usually not necessary to adjust those configuration values. If you want to configure previews, add or change the following parameters by editing your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file]. +Please note that the ownCloud preview system comes already with sensible defaults, and therefore it is usually not necessary to adjust those configuration values. If you want to configure previews, use the xref:{config-sample}#define-preview-providers[OWNCLOUD_ENABLED_PREVIEW_PROVIDERS] environment variable. The default list of enabled preview providers which do not need to be explicitly enabled in the config are: @@ -54,7 +54,7 @@ OC\Preview\TXT OC\Preview\XBitmap ---- -If you want to add or change the default list, you MUST define all elements used by editing your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file]. If you just declare an additional item in the configuration, this item will be taken and none of the default list. +If you want to add or change the default list, you MUST define all elements. If you just declare an additional item in the configuration, this item will be taken and none of the default list. == Prerequisites @@ -171,29 +171,28 @@ Under certain circumstances, for example if the server has limited resources, yo Set the configuration option `enable_previews` to `false`: -[source,php] +[source,.env] ---- - 'enable_previews' => false, +OWNCLOUD_ENABLE_PREVIEW='false' ---- === Adding a Preview Provider The example below adds the preview provider for `SGI` and `HEIC` images: -[source,php] +[source,.env] ---- -'enabledPreviewProviders' => [ - 'OC\Preview\SGI', - 'OC\Preview\Heic', - 'OC\Preview\BMP', - 'OC\Preview\GIF', - 'OC\Preview\JPEG', - 'OC\Preview\MarkDown', - 'OC\Preview\MP3', - 'OC\Preview\PNG', - 'OC\Preview\TXT', - 'OC\Preview\XBitmap', - ], +OWNCLOUD_ENABLED_PREVIEW_PROVIDERS=\ +'OC\Preview\SGI',\ +'OC\Preview\Heic',\ +'OC\Preview\BMP',\ +'OC\Preview\GIF',\ +'OC\Preview\JPEG',\ +'OC\Preview\MarkDown',\ +'OC\Preview\MP3',\ +'OC\Preview\PNG',\ +'OC\Preview\TXT',\ +'OC\Preview\XBitmap' ---- NOTE: You have to add all default providers if you do not want to disable them. @@ -205,9 +204,9 @@ The default value is defined in `config/config.sample.php` as `6016x4000` which The following example would change the limit so that 24MP portrait images also feature preview generation: -[source,php] +[source,.env] ---- - 'preview_max_dimensions' => '6016x6016', +OWNCLOUD_PREVIEW_MAX_DIMENSIONS='6016x6016' ---- NOTE: The dimensions here limit the size of the original image (input to the preview generator). A setting below limits the size of the generated preview images (output). For more details see the xref:configuration/server/config_sample_php_parameters.adoc#define-the-maximum-dimensions-of-the-original-image-for-preview-generation[Define the maximum dimensions of the original image for preview generation]. @@ -218,35 +217,35 @@ There are two configuration options for setting the maximum size (in pixels) of The following example would limit previews to a maximum size of 100 px × 100 px: -[source,php] +[source,.env] ---- - 'preview_max_x' => 100, - 'preview_max_y' => 100, +OWNCLOUD_PREVIEW_MAX_X=100 +OWNCLOUD_PREVIEW_MAX_Y=100 ---- NOTE: If you want no limit applied for one or both of these values then set them to `null`. -=== Maximum scale factor +=== Maximum Scale Factor If a lot of small pictures are stored on the ownCloud instance and the preview system generates blurry previews, you might want to consider setting a maximum scale factor. By default, pictures are upscaled to 10 times the original size: -[source,php] +[source,.env] ---- - 'preview_max_scale_factor' => 10, +OWNCLOUD_PREVIEW_MAX_SCALE_FACTOR=10 ---- If you want to disable scaling at all, you can set the config value to `1': -[source,php] +[source,.env] ---- - 'preview_max_scale_factor' => 1, +OWNCLOUD_PREVIEW_MAX_SCALE_FACTOR=-1 ---- If you want to disable the maximum scaling factor, you can set the config value to `null`: -[source,php] +[source,.env] ---- - 'preview_max_scale_factor' => null, +OWNCLOUD_PREVIEW_MAX_SCALE_FACTOR='null' ---- === Define the JPEG Preview Quality diff --git a/modules/admin_manual/pages/configuration/server/caching_configuration.adoc b/modules/admin_manual/pages/configuration/server/caching_configuration.adoc index 5abcccf03..3408ccd63 100644 --- a/modules/admin_manual/pages/configuration/server/caching_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/caching_configuration.adoc @@ -141,46 +141,6 @@ This is because it does not store locks, and data can disappear from the cache a NOTE: Be sure to install the *memcached* PHP module, and not _memcache_, as in the following examples. ownCloud supports only the *memcached* PHP module. -==== Installing Memcached - -===== On Ubuntu/Debian/Mint - -On Ubuntu/Debian/Mint run the following command: - -[source,bash] ----- -sudo apt-get install memcached php-memcached ----- - -NOTE: The installer will automatically start `memcached` and configure it to launch at startup. - -==== Configuration File Paths - -[cols=",",options="header",] -|=== -| PHP Version | Filename -| {recommended-php-version} | `/etc/php/{recommended-php-version}/mods-available/memcached.ini` -|=== - -Note that the PHP version depends on your envoronment. - -After that, assuming that you don’t encounter any errors: - -. Restart your Web server -. Add the appropriate entries to `config.php` (which you can find an example of below) -. Refresh your ownCloud admin page - -==== Clearing the Memcached Cache - -The Memcached cache can be flushed from the command line, using a range of common Linux/Unix tools including `netcat` and `telnet`. The following example uses telnet to log in, run the {flushall_url}[flush_all command], and log out: - -[source,bash,subs="attributes+"] ----- -telnet localhost {std-port-memcache} -flush_all -quit ----- - == Configuring Memory Caching Memory caches must be explicitly configured in ownCloud by: diff --git a/modules/admin_manual/pages/installation/installing_with_docker.adoc b/modules/admin_manual/pages/installation/installing_with_docker.adoc index 55704da5d..cd76522f1 100644 --- a/modules/admin_manual/pages/installation/installing_with_docker.adoc +++ b/modules/admin_manual/pages/installation/installing_with_docker.adoc @@ -145,7 +145,7 @@ include::example$installation/docker/dot.env[] + Only a few settings are required, these are: + -[width="100%",cols="40%,80%,30%",options="header"] +[width="100%",cols="45%,80%,30%",options="header"] |=== | Setting Name | Description @@ -168,14 +168,14 @@ The same trusted domains rules apply to everything else. | `my_domain` or `my_ip` ... -| `OWNCLOUD_TRUSTED_DOMAINS` *^1,2^* +a| xref:{config-sample}#define-list-of-trusted-domains-that-users-can-log-into[OWNCLOUD_TRUSTED_DOMAINS] *^1,2^* a| Multiple ownCloud Domains. + -See the config (xref:configuration/server/config_sample_php_parameters.adoc#define-list-of-trusted-domains-that-users-can-log-into[description]) for more details. +See the config description for more details. | `my_host,my_ip,my_domain` -| `OWNCLOUD_OVERWRITE_CLI_URL` -| See the config (xref:configuration/server/config_sample_php_parameters.adoc#override-cli-url[description]) for more details. +a| xref:{config-sample}#override-cli-url[OWNCLOUD_OVERWRITE_CLI_URL] +| See the config description for more details. | `\http://localhost` | `ADMIN_USERNAME` From dfb040bedce44d0676c4c203a2c5286b9cf9463e Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Wed, 10 Jun 2026 19:25:05 +0200 Subject: [PATCH 32/38] more updates --- .../pages/configuration/files/mimetypes.adoc | 57 +++++---- .../configuration/files/trashbin_options.adoc | 29 ++--- .../general_topics/code_signing.adoc | 112 ++++++------------ .../general_topics/impersonate_users.adoc | 37 +++--- .../configuration/general_topics/search.adoc | 49 +++++--- .../configuration/integration/ms-teams.adoc | 49 ++++---- .../configuration/integration/splunk.adoc | 25 ++-- 7 files changed, 172 insertions(+), 186 deletions(-) diff --git a/modules/admin_manual/pages/configuration/files/mimetypes.adoc b/modules/admin_manual/pages/configuration/files/mimetypes.adoc index fb26b5d3c..a0e627c9f 100644 --- a/modules/admin_manual/pages/configuration/files/mimetypes.adoc +++ b/modules/admin_manual/pages/configuration/files/mimetypes.adoc @@ -10,13 +10,25 @@ This is handy in a variety of situations, e.g. if you want a custom audio icon for audio mimetypes instead of the default file icon. +By default, the folder containing the relevant configuration is not part of the Docker volume. To access it, you must first create additional Docker volumes pointing the the correct container paths. When using the example mount points, it is necessary to adapt them accordingly: + +[source,docker] +---- +/var/www/owncloud/resources --> +/var/www/owncloud/core/img/filetypes --> +---- + + + +The folder for the ownCloud config is already a mounted Docker volume and accessible under `/config`. + == Mimetype Aliases ownCloud’s default mimetype configuration is defined in [source,plaintext] ---- -owncloud/resources/config/mimetypealiases.dist.json +/config/mimetypealiases.dist.json ---- Below you can see a snippet of the file where the mimetype’s on the left and the icon used to represent that mimetype is on the right. @@ -47,14 +59,14 @@ First, create a copy of [source,plaintext] ---- -resources/config/mimetypealiases.dist.json +/config/mimetypealiases.dist.json ---- and save it as [source,plaintext] ---- -config/mimetypealiases.json +/config/mimetypealiases.json ---- This is required for two reasons: @@ -69,7 +81,7 @@ NOTE: Please refer to the xref:developer_manual:core/theming.adoc[ownCloud themi Some common mimetypes that may be useful in creating aliases are: [cols=",",options="header",] -|============================================ +|=== | Mimetype | Description @@ -96,16 +108,16 @@ Some common mimetypes that may be useful in creating aliases are: | `text/code` | Source code -|============================================ +|=== Once you have made changes to [source,plaintext] ---- -config/mimetypealiases.json +/config/mimetypealiases.json ---- -use the xref:configuration/server/occ_command.adoc[occ command] to propagate the changes throughout your ownCloud installation. Here is an example for Ubuntu Linux: +use the xref:configuration/server/occ_command.adoc[occ command] to propagate the changes throughout your ownCloud installation: [source,bash,subs="attributes+"] ---- @@ -114,23 +126,23 @@ use the xref:configuration/server/occ_command.adoc[occ command] to propagate the === Example - Changing the JSON File Icon -image:configuration/mimetypes/json-alias-before.png[The default icon for JSON files] +The following example will show you how to change the icon that ownCloud uses to represent JSON files. -Let’s go through an example of to change the icon that ownCloud uses to represent JSON files, which you can see above. +image:configuration/mimetypes/json-alias-before.png[The default icon for JSON files, width=350] -. From the root directory of your ownCloud installation, copy +. Copy the following file + -- [source,plaintext] ---- -resources/config/mimetypealiases.dist.json +/config/mimetypealiases.dist.json ---- to [source,plaintext] ---- -config/mimetypealiases.json +/config/mimetypealiases.json ---- -- @@ -141,29 +153,28 @@ config/mimetypealiases.json "application/json": "text/json", ---- -. Copy a new SVG icon to represent JSON files to `core/img/filetypes`, calling it `text-json.svg`. +. Copy a new SVG icon to represent JSON files to ``, calling it `text-json.svg`. + [NOTE] ==== The name and location of the file are important. -* The location is because the `core/img/filetypes` directory stores the mimetype file icons. -* The name is important as it’s a rough mapping between the alias name and the icon’s file name, i.e., `text/json` becomes `text-json`. + +* The location is, because the `` directory stores the mimetype file icons. +* The name is important, as it’s a rough mapping between the alias name and the icon’s file name, i.e., `text/json` becomes `text-json`. // to be tested if we need to add a config setting to exclude those files from integrity checks ==== . Run the following command to update the mimetype alias database. + --- [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} maintenance:mimetype:update-js ---- After doing so, whenever you view a folder that contains JSON files or upload one, your new icon file will be used to represent the file, as in the image below. --- -image:configuration/mimetypes/json-alias-after.png[A replaced icon for JSON files] +image:configuration/mimetypes/json-alias-after.png[A replaced icon for JSON files, width=350] == Mimetype Mapping @@ -173,14 +184,14 @@ The default file extension to mimetype mapping configuration is stored in [source,plaintext] ---- -resources/config/mimetypemapping.dist.json +/config/mimetypemapping.dist.json ---- This is similar to [source,plaintext] ---- -resources/config/mimetypealiases.dist.json +/config/mimetypealiases.dist.json ---- and also returns a basic JSON array. @@ -208,20 +219,20 @@ If you want to update or extend the existing mapping, as with updating the mimet [source,plaintext] ---- -resources/config/mimetypemapping.dist.json +/config/mimetypemapping.dist.json ---- and save it as [source,plaintext] ---- -config/mimetypemapping.json +config/mimetypemapping.json ---- Then, in this new file, make any changes required. NOTE: Please refer to the xref:developer_manual:core/theming.adoc[ownCloud theming documentation] for where to put the new image files. -== Icon retrieval +== Icon Retrieval When an icon is retrieved for a mimetype, if the full mimetype cannot be found, the search will fallback to looking for the part before the slash. Given a file with the mimetype `image/my-custom-image`, if no icon exists for the full mimetype, the icon for `image` will be used instead. This allows specialized mimetypes to fallback to generic icons when the relevant icons are unavailable. diff --git a/modules/admin_manual/pages/configuration/files/trashbin_options.adoc b/modules/admin_manual/pages/configuration/files/trashbin_options.adoc index 2b4569dbe..8506631d6 100644 --- a/modules/admin_manual/pages/configuration/files/trashbin_options.adoc +++ b/modules/admin_manual/pages/configuration/files/trashbin_options.adoc @@ -1,16 +1,10 @@ = Managing the Trash Bin -The ownCloud Trashbin (`files_trashbin`) permanently deletes files -according to users’ storage quotas and file ages. When a user deletes a -file it is not immediately removed from your ownCloud server, but goes -into the Trashbin. Then the user has the options to un-delete the file, -or to delete it permanently. +The ownCloud Trashbin (`files_trashbin`) permanently deletes files according to users’ storage quotas and file ages. When a user deletes a file it is not immediately removed from your ownCloud server, but goes into the Trashbin. Then the user has the options to un-delete the file, or to delete it permanently. -image:configuration/files/trashbin-1.png[image] +image:configuration/files/trashbin-1.png[image, width=350] -As the ownCloud server administrator, you have two `occ` commands for -permanently deleting files from the Trashbin manually, without waiting -for the normal aging-out process: +As the ownCloud server administrator, you have two `occ` commands for permanently deleting files from the Trashbin manually, without waiting for the normal aging-out process: [source,plaintext] ---- @@ -19,13 +13,12 @@ trashbin trashbin:expire Expires the users trashbin ---- -The `trashbin:cleanup` command removes the deleted files of all users, -or you may specify certain users in a space-delimited list. This example -removes all the deleted files of all users: +The `trashbin:cleanup` command removes the deleted files of all users, or you may specify certain users in a space-delimited list. This example removes all the deleted files of all users: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} trashbin:cleanup + Remove all deleted files Remove deleted files for users on backend Database user1 @@ -39,18 +32,14 @@ This example removes the deleted files of user2 and user4: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} trashbin:cleanup user2 user4 + Remove deleted files of user2 Remove deleted files of user4 ---- -`trashbin:expire` deletes only expired files according to the -`trashbin_retention_obligation` setting in `config.php`. The default -setting is `auto`, which keeps files in the Trashbin for 30 days, then -deletes the oldest files as space is needed to keep users within their -storage quotas. Files may not be deleted if the space is not needed. +`trashbin:expire` deletes only expired files according to the `trashbin_retention_obligation` setting in `config.php`. The default setting is `auto`, which keeps files in the Trashbin for 30 days, then deletes the oldest files as space is needed to keep users within their storage quotas. Files may not be deleted if the space is not needed. -The default is to delete expired files for all users, or you may list -users in a space-delimited list: +The default is to delete expired files for all users, or you may list users in a space-delimited list: [source,bash,subs="attributes+"] ---- @@ -59,4 +48,4 @@ users in a space-delimited list: Remove deleted files of user2 ---- -See the *Deleted Files* section in xref:configuration/server/config_sample_php_parameters.adoc[Sample PHP Configuration Parameters], and xref:configuration/server/occ_command.adoc[the Trash Bin section] of the occ commands. +See the *Deleted Files* section in xref:configuration/server/config_sample_php_parameters.adoc[Sample PHP Configuration Parameters], and the xref:configuration/server/occ_command.adoc[Trash Bin section] of the occ commands. diff --git a/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc b/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc index 894b2a8a4..b134a119d 100644 --- a/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc +++ b/modules/admin_manual/pages/configuration/general_topics/code_signing.adoc @@ -4,15 +4,9 @@ == Introduction -ownCloud supports code signing for the core releases, and for ownCloud -applications. Code signing gives our users an additional layer of -security by ensuring that nobody other than authorized persons can push -updates. +ownCloud supports code signing for the core releases, and for ownCloud applications. Code signing gives our users an additional layer of security by ensuring that nobody other than authorized persons can push updates. -It also ensures that all upgrades have been executed properly, so that -no files are left behind, and all old files are properly replaced. In -the past, invalid updates were a significant source of errors when -updating ownCloud. +It also ensures that all upgrades have been executed properly, so that no files are left behind, and all old files are properly replaced. In the past, invalid updates were a significant source of errors when updating ownCloud. All the possible errors and their explanations can be found xref:errors[here] @@ -20,27 +14,17 @@ All the possible errors and their explanations can be found xref:errors[here] === Why Did ownCloud Add Code Signing? -By supporting Code Signing we add another layer of security by ensuring -that nobody other than authorized persons can push updates for -applications, and ensuring proper upgrades. +By supporting Code Signing we add another layer of security by ensuring that nobody other than authorized persons can push updates for applications, and ensuring proper upgrades. === Do We Lock Down ownCloud? -The ownCloud project is open source and always will be. We do not want -to make it more difficult for our users to run ownCloud. Any code -signing errors on upgrades will not prevent ownCloud from running, but -will display a warning on the Admin page. For applications that are not -tagged "Official" the code signing process is optional. +The ownCloud project is open source and always will be. We do not want to make it more difficult for our users to run ownCloud. Any code signing errors on upgrades will not prevent ownCloud from running, but will display a warning on the Admin page. For applications that are not tagged "Official" the code signing process is optional. === Not Open Source Anymore? -The ownCloud project is open source and always will be. The code signing -process is optional, though highly recommended. The code check for the -core parts of ownCloud is enabled when the ownCloud release version -branch has been set to stable. +The ownCloud project is open source and always will be. The code signing process is optional, though highly recommended. The code check for the core parts of ownCloud is enabled when the ownCloud release version branch has been set to stable. -For custom distributions of ownCloud it is recommended to change the -release version branch in version.php to something else than "stable". +For custom distributions of ownCloud it is recommended to change the release version branch in version.php to something else than "stable". === Is Code Signing Mandatory For Apps? @@ -48,10 +32,9 @@ Code signing is optional for all third-party applications. == Fixing Invalid Code Integrity Messages -A code integrity error message (`There were problems with the code integrity check. More information…`) -appears in a yellow banner at the top of your ownCloud Web interface: +A code integrity error message (`There were problems with the code integrity check. More information…`) appears in a yellow banner at the top of your ownCloud Web interface: -image:issues/code-integrity-notification.png[Code integrity warning banner.] +image:issues/code-integrity-notification.png[Code integrity warning banner., width=350] NOTE: The yellow banner is only shown for admin users. @@ -62,11 +45,9 @@ provides the following options: 2. Show a list of invalid files. 3. Trigger a rescan. -image:issues/code-integrity-admin.png[Links for resolving code integrity warnings.] +image:issues/code-integrity-admin.png[Links for resolving code integrity warnings., width=350] -To debug issues caused by the code integrity check click on btn:[List of invalid files], -and you will be shown a text document listing the different issues. -The content of the file will look similar to the following example: +To debug issues caused by the code integrity check click on btn:[List of invalid files], and you will be shown a text document listing the different issues. The content of the file will look similar to the following example: ---- Technical information @@ -177,37 +158,27 @@ Array In above error output it can be seen that: -1. In the ownCloud core (that is, the ownCloud server itself) the files -`index.php` and `version.php` do have the wrong version. -2. In the ownCloud core the unrequired extra file `/test.php` has -been found. -3. It was not possible to verify the signature of the calendar -application. -4. The certificate of the task application was revoked. -5. The file `.htaccess` is missing. +. In the ownCloud core (that is, the ownCloud server itself) the files `index.php` and `version.php` do have the wrong version. +. In the ownCloud core the unrequired extra file `/test.php` has been found. +. It was not possible to verify the signature of the calendar application. +. The certificate of the task application was revoked. +. The file `.htaccess` is missing. You have to do the following steps to solve this: -1. Upload the correct `index.php` and `version.php` files from e.g. the archive of your ownCloud version. -2. Delete the `test.php` file. -3. Contact the developer of the application. A new version of the app -containing a valid signature file needs to be released. -4. Contact the developer of the application. A new version of the app -signed with a valid signature needs to be released. -5. Download the official server tar ball and copy the `.htaccess` into your instance. +. Upload the correct `index.php` and `version.php` files from e.g. the archive of your ownCloud version. +. Delete the `test.php` file. +. Contact the developer of the application. A new version of the app containing a valid signature file needs to be released. +. Contact the developer of the application. A new version of the app signed with a valid signature needs to be released. +. Download the official server tar ball and copy the `.htaccess` into your instance. -For other means on how to receive support please take a look at -the {oc-help-url}[Docs & Guides page]. After fixing these problems -verify by clicking btn:[Rescan]. +For other means on how to receive support please take a look at he {oc-help-url}[Docs & Guides page]. After fixing these problems verify by clicking btn:[Rescan]. NOTE: When using a FTP client to upload those files make sure it is using the `Binary` transfer mode instead of the `ASCII` transfer mode. == Rescans -Rescans are triggered at installation, and by updates. You may run scans -manually with the `occ` command. The first command scans the ownCloud -core files, and the second command scans the named app. There is not yet -a command to manually scan all apps: +Rescans are triggered at installation, and by updates. You may run scans manually with the `occ` command. The first command scans the ownCloud core files, and the second command scans the named app. There is not yet a command to manually scan all apps: [source,bash,subs="attributes+"] @@ -222,37 +193,30 @@ TIP: See xref:configuration/server/occ_command.adoc[the occ command] to learn mo Please don’t modify the mentioned `signature.json` itself. -The following errors can be encountered when trying to verify a code -signature. +The following errors can be encountered when trying to verify a code signature. * `INVALID_HASH` -** The file has a different hash than specified within `signature.json`. -This usually happens when the file has been modified after writing the -signature data. +** The file has a different hash than specified within `signature.json`. This usually happens when the file has been modified after writing the signature data. + * `FILE_MISSING` -** The file cannot be found but has been specified within -`signature.json`. Either a required file has been left out, or -`signature.json` needs to be edited. +** The file cannot be found but has been specified within `signature.json`. Either a required file has been left out, or `signature.json` needs to be edited. + * `EXTRA_FILE` -** The file does not exist in `signature.json`. This usually happens -when a file has been removed and `signature.json` has not been updated. -It also happens if you have placed additional files in your ownCloud -installation folder. +** The file does not exist in `signature.json`. This usually happens when a file has been removed and `signature.json` has not been updated. It also happens if you have placed additional files in your ownCloud installation folder. + * `EXCEPTION` -** Another exception has prevented the code verification. There are -currently these following exceptions: +** Another exception has prevented the code verification. There are currently these following exceptions: *** `Signature data not found.` -**** The app has mandatory code signing enforced but no `signature.json` -file has been found in its `appinfo` folder. +**** The app has mandatory code signing enforced but no `signature.json` file has been found in its `appinfo` folder. + *** `Certificate is not valid.` -**** The certificate has not been issued by the official ownCloud Code -Signing Root Authority. +**** The certificate has not been issued by the official ownCloud Code Signing Root Authority. + *** `Certificate is not valid for required scope. (Requested: %s, current: %s)` -**** The certificate is not valid for the defined application. -Certificates are only valid for the defined app identifier and cannot be -used for others. +**** The certificate is not valid for the defined application. Certificates are only valid for the defined app identifier and cannot be used for others. + *** `Signature could not get verified.` -**** There was a problem with verifying the signature of -`signature.json`. +**** There was a problem with verifying the signature of `signature.json`. + *** `Certificate has been revoked.` **** The certificate which was used to sign the application was revoked. diff --git a/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc b/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc index 0fcdd29af..9685a1dbb 100644 --- a/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc +++ b/modules/admin_manual/pages/configuration/general_topics/impersonate_users.adoc @@ -6,7 +6,7 @@ == Introduction -{description} The ability to do so is a feature delivered via an ownCloud app called {oc-marketplace-url}/apps/impersonate[Impersonate]. +{description} The ability to do so is a feature delivered via an ownCloud app called *Impersonate*. == Limitations @@ -17,7 +17,7 @@ When installed, you can then impersonate users; in effect, you will be logged in as a specific user. To do so, go to the Users list, where you will now see a new column available called btn:[Impersonate], as in the screenshot below. -image::apps/impersonate/picking-a-user-to-impersonate.png[Picking a User to Impersonate, width=450] +image::apps/impersonate/picking-a-user-to-impersonate.png[Picking a User to Impersonate, width=350] Click the gray head icon next to the user that you want to impersonate. Doing so will log you in as that user, temporarily pausing your current session. You will see a notification at the top of the page that confirms you're now logged in as (or impersonating) that user. @@ -43,9 +43,9 @@ NOTE: If an impersonator is granted the right to impersonate but cannot imperson == Define Who can Use Impersonate -* If you have installed and enabled the Impersonate App, you can define if any groups are granted the right to _use_ impersonation. To do so, go to menu:Your Username[Settings > Admin > Apps]. Members of the groups specified can use the Impersonate app, see xref:define-who-is-allowed-to-impersonate[Define Who is Allowed to Impersonate] +* If you have installed and enabled the Impersonate App, you can define if any groups are granted the right to _use_ impersonation. To do so, go to menu:Your Username[Settings > Admin > Apps]. Members of the groups specified can use the Impersonate app, see xref:define-who-is-allowed-to-impersonate[Define Who is Allowed to Impersonate]. + -image::apps/impersonate/impersonate_enable.png[Define who can use Impersonate,width=300] +image:apps/impersonate/impersonate_enable.png[Define who can use Impersonate,width=250] ** You can also use an occ command to enable the Impersonate app for all users: + @@ -77,73 +77,78 @@ To configure impersonation, go to the administrator settings panel, which you ca * Use the following to allow impersonation for ownCloud admins only: + -image::apps/impersonate/impersonate_oc_admins_only.png[Impersonate for ownCloud admins only,width=500] +image:apps/impersonate/impersonate_oc_admins_only.png[Impersonate for ownCloud admins only,width=350] ** You can also use occ commands to do so: + +-- [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_all_groupadmins --value false ---- -++ + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups --value false ---- -++ + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups_list --value '[]' ---- -+ +-- + * If you want to allow all group admins to impersonate users within groups which they administer: + -image::apps/impersonate/impersonate_group_admins_only.png[Impersonate for all group admins,width=500] +image:apps/impersonate/impersonate_group_admins_only.png[Impersonate for all group admins,width=500] ** You can also use occ commands to do so: + +-- [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_all_groupadmins --value true ---- -++ + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups --value false ---- -++ + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups_list --value '[]' ---- -+ +-- + * If you want to limit impersonation to admins of specific groups, first click btn:[Allow group admins of specific groups...]. With the option checked, click into the textbox underneath it. You will see a list of all groups on your ownCloud installation, which will change, based on what you type in the textbox to search for specific groups. Choose one or more groups from the list, and they will be added to the textbox, restricting this functionality to admins of those groups only. + -image::apps/impersonate/impersonate_groups_only.png[Impersonate for specific group admins,width=500] +image:apps/impersonate/impersonate_groups_only.png[Impersonate for specific group admins,width=350] ** You can also use occ commands to do so: + +-- [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_all_groupadmins --value false ---- -++ + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups --value true ---- -++ + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:app:set \ impersonate impersonate_include_groups_list --value '["group1", "group2"]' ---- -+ \ No newline at end of file +-- diff --git a/modules/admin_manual/pages/configuration/general_topics/search.adoc b/modules/admin_manual/pages/configuration/general_topics/search.adoc index bcb8f747d..3d479bcba 100644 --- a/modules/admin_manual/pages/configuration/general_topics/search.adoc +++ b/modules/admin_manual/pages/configuration/general_topics/search.adoc @@ -1,6 +1,5 @@ = Full Text Search :toc: right -:toclevels: 4 :page_aliases: configuration/search/index.adoc :description: ownCloud offers the ability to use full text search via the Full Text Search app connecting to an Elasticsearch Server. This allows users to search not only for file names but also for content within files stored in ownCloud. @@ -19,15 +18,17 @@ The {search_elastic-app-url}[Full Text Search] app integrates full text search i == Prerequisites -. A fully functioning {elastic-search-url}[Elasticsearch Server 7]. Follow the {elastic-search-install-url}[Installation and Upgrade Guide] for your environment. +. A fully functioning {elastic-search-url}[Elasticsearch Server]. Follow the {elastic-search-install-url}[Installation and Upgrade Guide] for your environment. + [NOTE] ==== -* Version 1.0.0 of the Full Text Search app only works with Elasticsearch version 5.6. -* With version >=2.0.0 of the app, Elasticsearch version > 7 is required and has been tested and is supported up to version 8.6.2 though newer versions may work without any issues. +With version >=2.0.0 of the app: + +* Elasticsearch version > 7 is required and has been tested +* and is supported up to version 8.6.2 though newer versions may work without any issues. ==== -. The {ingest-url}[Ingest Attachment Processor Plugin] lets Elasticsearch extract metadata and text from over a thousand different file types such as PPT, XLS, PDF and more. To install the processor, run the following command from your Elasticsearch installation directory: +. The {ingest-url}[Ingest Attachment Processor Plugin] lets Elasticsearch extract metadata and text from over a thousand different file types such as PPT, XLS, PDF and more. To install the processor, run the following command _from your Elasticsearch installation directory_: + [source,bash] ---- @@ -43,17 +44,16 @@ sudo service elasticsearch restart == Installation -To install the app, use the Marketplace app on your ownCloud server or proceed manually: +To enable the *Search App*: -. Download and extract the tarball of the {search_elastic-app-url}[Full Text Search app] to the apps directory (or xref:installation/apps_management_installation.adoc#using-custom-app-directories[custom apps directory, prefered]) of your ownCloud instance. -. Use the xref:configuration/server/occ_command.adoc#apps-commands[App Commands] to enable the `search_elastic` application with: +* Use the xref:configuration/server/occ_command.adoc#apps-commands[App Commands] to enable the `search_elastic` application with: + [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} app:enable search_elastic ---- -or enable it via the GUI menu:Settings[Admin > Apps > Full Text Search > Enable]. +* Or enable it via the GUI menu:Settings[Admin > Apps > Full Text Search > Enable]. == Configuration @@ -67,7 +67,7 @@ For the URL, both `HTTP` and `HTTPS` incuding the address and port can be used. The app provides several authentication methods. Select the one of your choice and check out the details for the respective authentication method below: -image::apps/search_elastic/search_elastic_auth_items.png[Auth Items,width=450] +image::apps/search_elastic/search_elastic_auth_items.png[Auth Items,width=350] ==== No Authentication @@ -135,20 +135,25 @@ Additional searches you can do with the "RelevanceV2" connector: * Search by extension + `ext:pdf`, `ext:docx`, `ext:gif`, `ext:mp4`, `ext:tar.gz`, `ext:gz`, etc., any extension is possible + * Search by size, only in bytes or megabytes ** Search by byte size: + `size.b:<8092` , `size.b:>102400`, `size.b:[8092 TO 16184]` ** Search by megabyte size: + `size.mb:<3`, `size.mb:>9`, `size.mb:[3 TO 9]` + * Search by type: only "file" or "folder" + `type:file`, `type:folder` + * Search by date: ** Search by timestamp: + `mtime:<1678960862`, `mtime:>1678960862`, `mtime:[1608111372 TO 1678960862]` + ** Search by date: + `mtime:<2021-08-25`, `mtime:>2023-01-18`, `mtime:[2022-01-01 TO 2022-12-31]` + * Search by mimetype: + -`mime:image`, `mime:gif`, `mime:text` + +`mime:image`, `mime:gif`, `mime:text` ++ NOTE: To search for the whole mimetype such as "image/gif" use `mime.key:image\/gif`. Each search term will narrow the search. For example `brown ext:pdf` will be interpreted as "name or content containing brown AND extension = pdf", so "brown.pdf" and "a brown paper.pdf" will appear, but not "brown.txt" or "blue.pdf" @@ -157,8 +162,10 @@ Some examples of complex searches: * Files containing "confidential" updated since 2023 whose size is less than 10MB: + `confidential mtime:>2023-01-01 size.mb:<10` + * Folders containing more than 1GB: + `type:folder size.mb:>1024` + * Images between March and June 2020: + `mime:image mtime:[2020-03-01 TO 2020-06-30]` @@ -196,16 +203,16 @@ You can use the: * xref:configuration/server/occ_command.adoc#config-commands[occ Config Commands command set] to configure the app. + --- Examples: - ++ +-- List app settings:: - ++ [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} config:list search_elastic ---- - ++ [source,plaintext] ---- { @@ -223,7 +230,7 @@ List app settings:: } ---- -- - ++ Set app options:: + -- @@ -250,20 +257,26 @@ The Full Text Search app provides two modes, which are *active* and *passive*. After enabling the app, it will be by default in _active mode_:: + +-- * File changes will be indexed in background jobs. + System cron is recommended, otherwise a lot of jobs might queue up. + * Search results will be based on Elasticsearch. + * Search functionality based on ownCloud core database queries will no longer be used. + NOTE: Active mode can cause a downtime for search when indexing starts on an already heavily used instance, because it takes a while until all files have been indexed. +-- === Passive Mode To do an initial full indexing without the app interfering, it can be put in _passive_ mode:: + +-- * The administrator can run occ commands changing the search configuration without notice to the users. * The app will not index any changes by itself. * Search results will still be based on ownCloud core database queries. +-- === Changing the App Mode @@ -337,9 +350,9 @@ When everything has been set up and configured, you can initiate creating the in When the Elasticsearch server is down or the index has not been set up, you may get the following message. Check if the ES server is reachable or if the index was set up properly as one solution to fix the issue. -image::apps/search_elastic/warning_could_not_setup_indexes_connection_failure.png[Warning no Index,width=350] +image::apps/search_elastic/warning_could_not_setup_indexes_connection_failure.png[Warning no Index,width=300] -image::apps/search_elastic/warning_could_not_setup_indexes_unknown_key.png[Warning unknown Key,width=350] +image::apps/search_elastic/warning_could_not_setup_indexes_unknown_key.png[Warning unknown Key,width=300] == User Manual diff --git a/modules/admin_manual/pages/configuration/integration/ms-teams.adoc b/modules/admin_manual/pages/configuration/integration/ms-teams.adoc index eefd55589..7cdfaf903 100644 --- a/modules/admin_manual/pages/configuration/integration/ms-teams.adoc +++ b/modules/admin_manual/pages/configuration/integration/ms-teams.adoc @@ -14,16 +14,18 @@ If you're using Microsoft Teams in your organization or for private purposes, yo NOTE: As a prerequisite, the OpenID Connect app is required. If you already have a OpenID Connect configuration made with another service, you have to reconfigure with Microsoft Azure AD, as only one identity provider configuration is allowed. +CAUTION: To configure this app in an ownCloud Dockerised environment, you need to access and update the `.htaccess` file from the container which is not accessible by default. You also need to edit your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file] with keys that are not available as environment variables. + == Prerequisites -To get this working, you need to install and/or configure the following components: +To get this working, you need to enable and configure the following components: === Option 1 "Enterprise": With Single Sign-On (SSO) and ownCloud Enterprise Edition . Microsoft Azure Active Directory . ownCloud apps: -.. {oc-marketplace-url}/apps/openidconnect[OpenID Connect] -.. {oc-marketplace-url}/apps/msteamsbridge[MS-Teams Bridge App] +.. OpenID Connect +.. MS-Teams Bridge App . The custom app(s) you have generated with {msteams-generator-url}[ownCloud Generator for Admins] @@ -32,7 +34,7 @@ To get this working, you need to install and/or configure the following componen === Option 2 "Standard": With Basic Authentication and ownCloud Standard Edition . ownCloud apps: -.. {oc-marketplace-url}/apps/openidconnect[OpenID Connect] +.. OpenID Connect . The custom Microsoft Teams app(s) you have generated with the {msteams-generator-url}[ownCloud Generator for Admins] . Microsoft Teams @@ -42,17 +44,20 @@ Note: If you are using the Standard Edition, you can skip the following steps th === Installation -Assuming you have an ownCloud server version 10.7 or higher already running in your company or for personal use, perform the following steps: - -. Install and enable the MS-Teams Bridge app, minimum required version: v1.0.0. +Perform the following steps: -. Install and enable the {oc-marketplace-url}/apps/openidconnect[OpenID Connect] app from the ownCloud marketplace, minimum required version: v2.0.0. +. Enable the MS-Teams Bridge app. +. Enable the OpenID Connect app. === Configure the MS-Teams Bridge App You need to configure the MS-Teams Bridge app in two steps: -. Add a _header_ directive to the Apache `.htaccess` configuration located in your ownCloud web root in section `` +. Create a Docker volume for the `.htaccess` file only in the containers location `/var/www/owncloud/.htaccess` and mount it to a location of choice. ++ +IMPORTANT: Please note that this file may be updated by ownCloud and will need to be reviewed before any changes are reapplied. + +. Add a _header_ directive to the Apache `.htaccess` configuration located in section `` + [source,apache,options="nowrap"] ---- @@ -61,10 +66,8 @@ Header edit* Content-Security-Policy , ; ---- + Using `merge`, the response header is appended to any existing header of the same name, unless the value to be appended already appears in the header's comma-delimited list of values. When a new value is merged onto an existing header it is separated from the existing header with a comma. Merging avoids that headers of the same type and content being sent multiple times. This can happen if headers are also set on other locations. -+ -IMPORTANT: For the time being, if you add the header to the ownCloud's `.htaccess` file in the ownCloud web root, you have to manually add that header again after an ownCloud upgrade. -. Add a config key to your `config.php` file +. Add a config key to your _additional_ xref:installation/configuration_notes.adoc#using-a-configuration-file[configuration file]. + This key is necessary for security reasons. Users will be asked to click a login button each time when accessing the ownCloud app after a fresh start of their Microsoft Teams app or after idle time. This behavior is by design. The button name can be freely set based on your requirements. + @@ -75,7 +78,7 @@ This key is necessary for security reasons. Users will be asked to click a login ], ---- -. Enable xref:configuration/server/index_php_less_urls.adoc[index.php less URL´s] on your web server. +. If not already configured, enable xref:configuration/server/index_php_less_urls.adoc[index.php less URL´s] on your web server. == Microsoft @@ -92,31 +95,31 @@ The following procedure creates an ownCloud app ready to be used by your users w . Enter the Microsoft App/Client ID for your app. The ID´s to be entered *must* be the xref:configuration/user/oidc/ms-azure-setup.adoc#client-id[CLIENT-ID] from Microsoft Azure. + -image:configuration/integration/ms-teams/enter-app-id-msteamsgen.png[,width=80%] +image:configuration/integration/ms-teams/enter-app-id-msteamsgen.png[,width=350] . Enter the version of the app you create. + -image:configuration/integration/ms-teams/define-app-version-msteamsgen.png[,width=80%] +image:configuration/integration/ms-teams/define-app-version-msteamsgen.png[,width=350] . Enter the name of the app you create. Take care about how to name your app. It *cannot* be changed later on. We recommend naming it *ownCloud for Teams* for easy identification. + -image:configuration/integration/ms-teams/app-name-msteamsgen.png[,width=80%] +image:configuration/integration/ms-teams/app-name-msteamsgen.png[,width=350] . Enter the description of the app you create. + -image:configuration/integration/ms-teams/app-description-msteamsgen.png[,width=80%] +image:configuration/integration/ms-teams/app-description-msteamsgen.png[,width=350] . Set the AccentColor of the app you create. + -image:configuration/integration/ms-teams/set-accent-color-msteamsgen.png[,width=80%] +image:configuration/integration/ms-teams/set-accent-color-msteamsgen.png[,width=350] . Enter the URL how you access your owncloud instance like `+https://cloud.example.com+`. + -image:configuration/integration/ms-teams/owncloud-url-msteamsgen.png[,width=80%] +image:configuration/integration/ms-teams/owncloud-url-msteamsgen.png[,width=350] . After performing all the steps, click the menu:download[] button and store the generated zip file locally. + -image:configuration/integration/ms-teams/download-zip-msteamsgen.png[,width=80%] +image:configuration/integration/ms-teams/download-zip-msteamsgen.png[,width=350] . Go to the app section of Microsoft Teams and upload the generated zip file to your organization's app catalogue. Follow the {publish-custom-app-url}[Publish a custom app by uploading an app package] guide for more information. @@ -134,15 +137,15 @@ As an alternative to creating an app for Microsoft Teams, it's also possible to . Press the btn:[+] plus button at the top of the Teams window. + -image:configuration/integration/ms-teams/add-a-tab-ms-teams.png[,width=80%] +image:configuration/integration/ms-teams/add-a-tab-ms-teams.png[,width=350] . Search for *website* and add by clicking on it. + -image:configuration/integration/ms-teams/add-website-ms-teams.png[,width=80%] +image:configuration/integration/ms-teams/add-website-ms-teams.png[,width=350] . Add a meaningful name and the following URL replacing "cloud.example.com" with how you access your ownCloud instance. + -image:configuration/integration/ms-teams/name-and-url-ms-teams.png[,width=80%] +image:configuration/integration/ms-teams/name-and-url-ms-teams.png[,width=350] + [source,url] ---- diff --git a/modules/admin_manual/pages/configuration/integration/splunk.adoc b/modules/admin_manual/pages/configuration/integration/splunk.adoc index 9a55a79cb..e6925f327 100644 --- a/modules/admin_manual/pages/configuration/integration/splunk.adoc +++ b/modules/admin_manual/pages/configuration/integration/splunk.adoc @@ -1,6 +1,5 @@ = ownCloud App for Splunk :toc: right -:toclevel: 3 :splunk-url: https://splunkbase.splunk.com/app/5503/ :splunk-addon-url: https://splunkbase.splunk.com/app/5502/ :splunk-docs-mult-index: https://docs.splunk.com/Documentation/Splunk/latest/Indexer/Setupmultipleindexes @@ -17,39 +16,41 @@ The app makes all relevant ownCloud data available in Splunk. The dashboards and == Prerequisites To set up the _ownCloud App for Splunk_, a number of prerequisites have to be fulfilled. -* ownCloud Server has a minimum version of 10.5. * Splunk has a minimum version of 7.2. -* The {oc-marketplace-url}/apps/metrics[_Metrics App_] is installed, configured and enabled on ownCloud Server. -* The {oc-marketplace-url}/apps/admin_audit[_Auditing App_] is installed, configured and enabled on ownCloud Server. +* The *Metrics App* is enabled and configured. +* The *Auditing App* is enabled and configured. * Both components of the _ownCloud App for Splunk_ , the app and the add-on, are installed and configured. See below for further information on these components. == Setup & Configuration + === ownCloud -. Install and set up the {oc-marketplace-url}/apps/admin_audit[_Auditing App_] as xref:enterprise/logging/admin_audit.adoc[documented]. Take note of the log file paths (owncloud.log and admin_audit.log) as those will be required in the Splunk configuration below. +. Enable the *Auditing App* as xref:enterprise/logging/admin_audit.adoc[documented]. + +Take note of the log file paths (owncloud.log and admin_audit.log) as those will be required in the Splunk configuration below. -. Install and set up the {oc-marketplace-url}/apps/metrics[_Metrics App_] as xref:enterprise/reporting/metrics.adoc[documented]. Take special care to set the Metrics API key as it will be required in the Splunk configuration below. +. Enable the *Metrics App* as xref:enterprise/reporting/metrics.adoc[documented]. + +Take special care to set the Metrics API key as it will be required in the Splunk configuration below. === Splunk The _ownCloud App for Splunk_ consists of two components that have to be installed and configured in Splunk. -* The {splunk-addon-url}[_ownCloud Add-on for Splunk_] gathers and stores the ownCloud data in Splunk. -* The {splunk-url}[_ownCloud App for Splunk_] adds dashboards and other functionalities to the Splunk web interface. +* The {splunk-addon-url}[_ownCloud Add-on for Splunk_, window=_blank] gathers and stores the ownCloud data in Splunk. +* The {splunk-url}[_ownCloud App for Splunk_, window=_blank] adds dashboards and other functionalities to the Splunk web interface. Both can be installed from the Splunkbase app store. You will find the necessary initial configuration below. ==== ownCloud Add-on for Splunk (TA_owncloud) -The {splunk-addon-url}[_ownCloud Add-on for Splunk_] (`TA_owncloud`) takes care of gathering the data from ownCloud as well as storing and indexing it in Splunk. It requires a Splunk Universal Forwarder to be installed on the ownCloud host. +The {splunk-addon-url}[_ownCloud Add-on for Splunk_, window=_blank] (`TA_owncloud`) takes care of gathering the data from ownCloud as well as storing and indexing it in Splunk. It requires a Splunk Universal Forwarder to be installed on the ownCloud host. To get started, please follow the steps below. . Create an index for your ownCloud data (e.g., `index=owncloud`). + -The _ownCloud Add-on for Splunk_ does not ship with an index. You have to create an index on your Splunk instance or Splunk index cluster. For further help, refer to the respective {splunk-docs-mult-index}[Splunk documentation]. +The _ownCloud Add-on for Splunk_ does not ship with an index. You have to create an index on your Splunk instance or Splunk index cluster. For further help, refer to the respective {splunk-docs-mult-index}[Splunk documentation, window=_blank]. -. Install a Splunk Universal Forwarder on your ownCloud host. For further information, consult the {splunk-docs-uni-forwarder}[Splunk documentation]. +. Install a Splunk Universal Forwarder on your ownCloud host. For further information, consult the {splunk-docs-uni-forwarder}[Splunk documentation, window=_blank]. . Install the _ownCloud Add-on for Splunk_ @@ -77,7 +78,7 @@ On your Universal Forwarder or Heavy Forwarder instance, you must enable input u ==== ownCloud App for Splunk (owncloud_app) -The {splunk-url}[_ownCloud App for Splunk_] (`owncloud_app`) adds the dashboards, visualizations and other functionalities to the Splunk web interface based on the indexed data. +The {splunk-url}[_ownCloud App for Splunk_, window=_blank] (`owncloud_app`) adds the dashboards, visualizations and other functionalities to the Splunk web interface based on the indexed data. * Install the _ownCloud App for Splunk_ from Splunkbase. You only have to install it on Search Heads. * If you created a custom index for ownCloud data, you have to modify a macro to include this index. You can do this in the Splunk web interface by navigating to menu:Settings[Advanced search > Search macros] and changing `owncloud-indexes` to your dedicated index (default: `index=owncloud`). From 33e2f0ce6501357579f984e4b840fdb23a500593 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Thu, 11 Jun 2026 11:56:44 +0200 Subject: [PATCH 33/38] safe work --- .../server/activity_configuration.adoc | 2 +- .../server/background_jobs_configuration.adoc | 37 +- .../server/caching_configuration.adoc | 323 ++---------------- 3 files changed, 44 insertions(+), 318 deletions(-) diff --git a/modules/admin_manual/pages/configuration/server/activity_configuration.adoc b/modules/admin_manual/pages/configuration/server/activity_configuration.adoc index 0aeb38d34..fbfa639a5 100644 --- a/modules/admin_manual/pages/configuration/server/activity_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/activity_configuration.adoc @@ -1,7 +1,7 @@ = Configuring the Activity App -:page-aliases: configuration_server/activity_configuration.adoc :toc: right :description: You can configure your ownCloud server to automatically send out email notifications to your users for various events. +:page-aliases: configuration_server/activity_configuration.adoc == Introduction diff --git a/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc b/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc index 9ca09186c..955b4e680 100644 --- a/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/background_jobs_configuration.adoc @@ -4,7 +4,6 @@ :cron_url: https://en.wikipedia.org/wiki/Cron :crontab_url: https://linux.die.net/man/1/crontab :systemd_url: https://wiki.archlinux.org/index.php/Systemd/Timers -:oc-docker-url: https://github.com/owncloud-docker/base#environment-variables == Introduction @@ -25,40 +24,39 @@ Is the same as using the *Cron* section on your ownCloud Admin page. === Docker Note -If you are using the official docker images you don't need to take care about the configuration for background jobs, the docker image is already configured to use cron internally. If required, this can also be adjusted by the {oc-docker-url}[environment variables] `OWNCLOUD_CROND_ENABLED` and `OWNCLOUD_CROND_SCHEDULE`. +NOTE: With the Docker image provided, you don't need to take care about the configuration for background jobs. The Docker image is already configured to use cron internally. If required, this can also be adjusted by the environment variables `OWNCLOUD_CROND_ENABLED` and `OWNCLOUD_CROND_SCHEDULE`. == Cron Jobs -You can schedule Cron jobs in three ways: xref:cron[Cron], xref:webcron[Webcron], or xref:ajax[AJAX]. These can all be configured in the admin settings menu. However, the recommended method is to use Cron. The following sections describe the differences between each method. +You can schedule Cron jobs in the following ways: xref:cron[Cron] or xref:ajax[AJAX]. These can all be configured in the admin settings menu. However, the recommended method is to use Cron. The following sections describe the differences between each method. There are a number of things to keep in mind when choosing an automation option: -. While the default method is AJAX, though the preferred way is to use Cron. + -The reason for this distinction is that AJAX is easier to get up and running. As a result, it makes sense (often times) to accept it in the interests of expediency. However, doing so is known to cause issues, such as backlogs and potentially not running every job on a heavily-loaded system. What's more, an increasing amount of ownCloud automation has been migrated from AJAX to Cron in recent versions. For this reason, we encourage you to not use it for too long — especially if your site is rapidly growing. - -. While Webcron is better than AJAX, it has limitations too. + -For example, running Webcron will only remove a single item from the job queue, not all of them. Cron, however, will clear the entire queue. +* Although the default method is AJAX, the preferred way is to use Cron. ++ +The reason for this distinction is that AJAX is easier to set up. As a result, it often makes sense to accept it in the interests of expediency. However, this can cause issues such as backlogs and jobs not running on a heavily loaded system. NOTE: It's for this reason that we encourage you to use Cron — if at all possible. === Cron -Using the operating system Cron feature is the preferred method for executing regular tasks. This method enables the execution of scheduled jobs without the inherent limitations which the web server might have. +Using the hosts Cron feature is the preferred method for executing regular tasks. This method enables the execution of scheduled jobs without the inherent limitations which the embedded Apache web server might have. For example, to run a Cron job on a *nix system every 15 minutes (recommended), under the default web server user (often, `www-data` or `wwwrun`) you must set up the following Cron job to call the occ `system:cron` command: -[source,bash] +[source,bash,subs="attributes+"] ---- sudo crontab -u www-data -e -*/15 * * * * /usr/bin/php -f /path/to/your/owncloud/occ system:cron +*/15 * * * * cd && {occ-command-example-prefix-docker} system:cron ---- You can verify if the cron job has been added and scheduled by executing: -[source,bash] +[source,bash,subs="attributes+"] ---- sudo crontab -u www-data -l -*/15 * * * * /usr/bin/php -f /path/to/your/owncloud/occ system:cron + +*/15 * * * * cd && {occ-command-example-prefix-docker} system:cron ---- NOTE: You have to make sure that PHP is found by Cron; hence why we've deliberately added the full path. @@ -67,25 +65,16 @@ Please refer to {crontab_url}[the crontab man page] for the exact command syntax NOTE: There are other methods to invoke programs by the system regularly, e.g., {systemd_url}[systemd timers] -=== Webcron - -By registering your ownCloud `cron.php` script address as an external webcron service (for example, http://www.easycron.com/[easyCron]), you ensure that background jobs are executed regularly. To use this type of service, your external webcron service must be able to access your ownCloud server using the Internet. For example: - -[source,plaintext] ----- -URL to call: http[s]:///owncloud/cron.php ----- - === AJAX The AJAX scheduling method is the default option. + -However, it is also the _least_ reliable. Each time a user visits the ownCloud page, a single background job is executed. The advantage of this mechanism, however, is that it does not require access to the system nor registration with a third party service. The disadvantage of this mechanism, when compared to the xref:webcron[Webcron] service, is that it requires regular visits to the page for it to be triggered. +However, it is also the _least_ reliable. Each time a user visits the ownCloud page, a single background job is executed. The advantage of this mechanism, however, is that it does not require access to the system nor registration with a third party service. The disadvantage of this mechanism is, that it requires regular visits to the page for it to be triggered. NOTE: Especially when using the Activity App or external storages, where new files are added, updated, or deleted one of the other methods should be used. === Parallel Task Execution -Regardless of the approach which you take, since ownCloud 9.1, Cron jobs can be run in parallel. This is done by running `background:cron` multiple times. Depending on the process which you are automating, this may not be necessary. However, for longer-running tasks, such as those which are LDAP related, it may be very beneficial. +Regardless of the approach which you take, Cron jobs can be run in parallel. This is done by running `background:cron` multiple times. Depending on the process which you are automating, this may not be necessary. However, for longer-running tasks, such as those which are LDAP related, it may be very beneficial. There is no way to do so via the ownCloud UI. But, the most direct way to do so, is by opening three console tabs and in each one run diff --git a/modules/admin_manual/pages/configuration/server/caching_configuration.adoc b/modules/admin_manual/pages/configuration/server/caching_configuration.adoc index 3408ccd63..6bbcdee20 100644 --- a/modules/admin_manual/pages/configuration/server/caching_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/caching_configuration.adoc @@ -7,7 +7,6 @@ :rediscli_url: https://redis.io/topics/rediscli :redis_select_url: https://redis.io/commands/select :redis_flushdb_url: https://redis.io/commands/flushdb -:redis-memcached-url: https://scalegrid.io/blog/redis-vs-memcached-2021-comparison/ == Introduction @@ -26,17 +25,11 @@ In addition, we suggest to use *External Transactional File Locking* which reduc The caching backends supported by ownCloud are: * xref:opcache[Opcache] + - This is an opcode cache only and does *not* cache any data. - Opcache is bundled with PHP from version 5.5.0 and later. + This is an opcode cache only and does *not* cache any data. Opcache is bundled with PHP and part of the Docker image. * xref:apcu[APCu] + - This is a data cache only and does *not* cache any opcode. - APCu 4.0.6 and up is required. + This is a data cache only and does *not* cache any opcode. APCu is part of the Docker image. * xref:redis[Redis] + - This is an in-memory data structure store (cache) for single and multi-server ownCloud installations, which provides file locking and can be set up in local or distributed environments. Consider Redis younger, richer in features and more configurable than memcached. At least version 2.2.6 or higher of the PHP Redis extension is required. -* xref:memcached[Memcached] + - This is a distributed cache for multi-server ownCloud installations and has *no* file locking capabilities. - -See the following page to learn more about the {redis-memcached-url}[Redis vs. Memcached – 2021 Comparison]. + This is an in-memory data structure store (cache) for single and multi-server ownCloud installations, which provides file locking and can be set up in local or distributed environments. The `php-redis` extension is already part of the Docker image. The Redis installation is part of the Docker Compose deployment example, see the xref:installation/installing_with_docker.adoc#docker-compose[Installalling With Docker] documentation for more details. [NOTE] ==== @@ -51,95 +44,52 @@ The cache directory defaults to `data/$user/cache` where `$user` is the current === Opcache -Opcache should be enabled by default in your php installation. To check it, run the following command: +Opcache is enabled by default in the Docker image. To check this, you need to access the container's shell and run the following PHP command: -[source,bash] +[source,docker,subs="attributes+"] ---- +docker exec -it owncloud_server /bin/bash + php -r 'phpinfo();' | grep opcache.enable ---- === APCu -The easiest cache to use is APCu, because it is a pure data cache, very fast as it is memory-based only and _nothing needs to be configured_. APCu can not be used when running on an external server like in a distributed environment. - -==== Installing APCu - -On Ubuntu/Debian/Mint systems, if not already done: -[source,bash] ----- -sudo apt install php-apcu ----- - -With that done, assuming that you don’t encounter any errors, restart Apache and the extension is ready to use. +The easiest cache to use is APCu, because it is a pure data cache, very fast as it is memory-based only and _nothing needs to be configured_. === Redis {redis_url}[Redis] is an excellent modern memory cache to use for both distributed caching and as a local cache for xref:configuration/files/files_locking_transactional.adoc[transactional file locking], because it guarantees that cached objects are available for as long as they are needed. -The performance of Redis when used with a socket connection can get close to the performance of APCu. - -NOTE: The Redis PHP module must be at least version 2.2.6 or higher. - -[NOTE] -==== -* For Ubuntu 20.04, the default shipped Redis Server version and the php-redis extension is 5.x. -* For Ubuntu 22.04, the default shipped Redis Server version is 6.0.16. -* For Ubuntu 22.04, the php7.4-redis extension has version 5.3.x. -* With Redis version 6, a new authentication mechanism has been introduced named ACL (Access Control Lists). ownCloud does currently not support Redis ACLs, but does support the password protection available with current Redis versions. -==== - -==== Installing Redis - -On Ubuntu/Debian/Mint systems, if not already done: - -[source,bash] ----- -sudo apt install redis-server php-redis ----- - -The installer will automatically launch Redis and configure it to launch at startup. - -After that, assuming that you don’t encounter any errors, restart Apache and the extension is ready to use. +Please note that with Redis version 6 upwards, a new authentication mechanism has been introduced named ACL (Access Control Lists). ownCloud does currently not support Redis ACLs, but does support the password protection available with current Redis versions which can be configurted with environment variables. ==== Redis Performance Consideration * Because Redis writes data to disk, it is recommended to use a high performance backend like SSD. -* If you do not have a distributed environment where the Redis server is installed at a different machine, you can configure Redis to be xref:redis-configuration-using-unix-sockets[socket-based] instead of TCP-based to xref:redis-performance-comparison-tcp-vs-socket[increase performance]. -==== Additional notes for Redis vs. APCu on Memory Caching +==== Additional Notes for Redis vs. APCu on Memory Caching -* APCu is faster at local caching than Redis when using TCP since APCu is memory-based only. +* APCu is faster at local caching than Redis since APCu is memory-based only. * If you have enough memory, use APCu for in memory caching and Redis for file locking. * If you are limited in memory or only want to have one caching backend, use Redis for both. -* Consider using sockets instead of TCP when you decide on Redis but do not have a distributed caching environment. ==== Clearing the Redis Cache -The Redis cache can be flushed from the command-line using the {rediscli_url}[redis-cli tool], as in the following example: +The Redis cache can be flushed from the command-line using the {rediscli_url}[redis-cli tool], To do so, you first must enter the Redis containers shell and usethe following example: [source,bash] ---- -sudo redis-cli +redis-cli SELECT FLUSHDB ---- -`` is the number of the Redis database where the cache is stored. It is zero by default at ownCloud. To check what yours is currently set to for ownCloud, check the `dbindex` value in `config/config.php`. To change it, see the -xref:configuration/server/config_sample_php_parameters.adoc#memory-caching-backend-configuration[Memory caching backend configuration] +`` is the number of the Redis database where the cache is stored. It is zero by default at ownCloud. To check what yours is currently set to for ownCloud, check the `dbindex` value in `config/config.php`. To change it, see the xref:configuration/server/config_sample_php_parameters.adoc#memory-caching-backend-configuration[Memory caching backend configuration] NOTE: Out of the box, every Redis instance supports 16 databases so `` has to be set between 0 and 15. -Please read more about the instructions for the -{redis_select_url}[select] and {redis_flushdb_url}[flushdb] command. - -=== Memcached - -Memcached is a reliable old-timer for shared caching on distributed servers. It performs well with ownCloud with one exception: it is not suitable to use with -xref:configuration/files/files_locking_transactional.adoc[Transactional File Locking]. -This is because it does not store locks, and data can disappear from the cache at any time. Given that, Redis is the best memory cache to use. - -NOTE: Be sure to install the *memcached* PHP module, and not _memcache_, as in the following examples. ownCloud supports only the *memcached* PHP module. +Please read more about the instructions for the {redis_select_url}[select] and {redis_flushdb_url}[flushdb] command. == Configuring Memory Caching @@ -155,29 +105,22 @@ xref:configuration/general_topics/general_troubleshooting.adoc#php-version-and-i === Opcache Configuration -Opcache should already be configured with PHP 7, see the {php-net-url}/manual/en/opcache.installation.php[opcache documentation] for details. +Opcache is already configured with the Docker image provided. === APCu Configuration -To use APCu, add this line to `config.php`: - -[source,php] ----- -'memcache.local' => '\OC\Memcache\APCu', ----- - -With that done, refresh your ownCloud admin page, and the cache warning should disappear. +APCu is, if nothing else is configured, already configured via the default of the environment variable `OWNCLOUD_MEMCACHE_LOCAL`. === Redis Configuration Redis is very configurable; consult the {redis_doc_url}[Redis documentation] to learn more. -Regardless of whether you have set up Redis to use TCP or a Unix socket, we recommend adding the following for best performance. This enables xref:configure-transactional-file-locking[External Transactional File Locking] based on Redis: +We recommend adding the following for best performance. This enables xref:configure-transactional-file-locking[External Transactional File Locking] based on Redis: -[source,php] +[source,.env] ---- -'filelocking.enabled' => true, -'memcache.locking' => '\OC\Memcache\Redis', +OWNCLOUD_FILELOCKING_ENABLED=true +OWNCLOUD_MEMCACHE_LOCAL='\OC\Memcache\Redis' ---- ==== Redis Configuration Using TCP @@ -198,208 +141,6 @@ The following example `config.php` configuration connects to a Redis cache via T ], ---- -==== Redis Configuration Using Unix Sockets - -If Redis is running on the same server as ownCloud, it is recommended to configure it to use Unix sockets for increased performance. Follow these steps to do so: - -. Add the `www-data` user to the `redis` group: -+ -[source,bash] ----- -sudo usermod -G redis -a www-data ----- - -. Create your Redis folder that the Unix socket will be in: -+ -[source,bash] ----- -sudo mkdir -p /var/run/redis/ ----- - -. Set the permissions so the redis user and www-data group own it: -+ -[source,bash] ----- -sudo chown -R redis:www-data /var/run/redis ----- - -. Open an editor of your choice and change/add the following parameters to the Redis configuration file. Note that in the example `vi` is used as editor: -+ -[source,bash] ----- -sudo vi /etc/redis/redis.conf ----- -+ -[source,plaintext] ----- -# create a unix domain socket to listen on -unixsocket /var/run/redis/redis.sock - -# set permissions for the socket -unixsocketperm 770 ----- - -. Restart Redis to make the changes effective: -+ -[source,plaintext] ----- -sudo service redis-server restart ----- - -. Check if the Redis Unix socket was created: -+ -[source,plaintext] ----- -ls -lh /var/run/redis ----- -+ -The output should be like the following: -+ -[source,plaintext] ----- -srwxrwx--- 1 redis redis 0 May 12 12:26 redis.sock ----- - -Then, configure ownCloud to communicate with the Redis socket as in the following example. - -[source,php] ----- -# Change the host value, based on the socket's location in your distribution -'memcache.local' => '\OC\Memcache\Redis', -'redis' => [ - 'host' => '/var/run/redis/redis.sock', - 'port' => 0, // Set to 0 when using a Unix socket - 'password' => '', // Optional, if not defined no password will be used. - 'dbindex' => 0, // Optional, if undefined SELECT will not run and will - // use Redis Server's default DB Index. -], ----- - -==== Redis Performance Comparison TCP vs Socket - -To see a benchmark comparison, run: - -[source,bash] ----- -sudo redis-benchmark -q -n 100000 -sudo redis-benchmark -s /var/run/redis/redis-server.sock -q -n 100000 ----- - -In the following table, you will see an example gain of about +20% when using sockets compared -to TCP on localhost. The values can differ in your environment. Please do a local check. - -[width="80%",cols="20%,30%,30%,20%",options="header",] -|=== -| Test -| TCP (requests/s) -| Socket (requests/s) -| Gain (%) - -| PING_INLINE -| 15527.95 -| 23518.35 -| +34 - -| PING_BULK -| 16946.28 -| 23239.60 -| +27 - -| SET -| 18351.99 -| 22789.43 -| +19 - -| GET -| 18850.14 -| 22747.95 -| +17 - -| INCR -| 18663.68 -| 22914.76 -| +18 - -| LPUSH -| 19109.50 -| 24183.79 -| +21 - -| RPUSH -| 19076.69 -| 23196.47 -| +18 - -| LPOP -| 18460.40 -| 23485.21 -| +21 - -| RPOP -| 19058.51 -| 24752.47 -| +23 - -| SADD -| 18932.22 -| 22391.40 -| +15 - -| HSET -| 18491.12 -| 20785.70 -| +11 - -| SPOP -| 19069.41 -| 23282.89 -| +18 - -| LPUSH -| 19087.61 -| 23764.26 -| +20 - -| LRANGE_100 -| 15288.18 -| 17882.69 -| +15 - -| LRANGE_300 -| 9067.00 -| 10004.00 -| +10 - -| LRANGE_500 -| 6878.53 -| 7496.25 -| +8 - -| LRANGE_600 -| 5379.24 -| 6102.77 -| +12 - -| MSET (10 keys) -| 19297.57 -| 18178.51 -| -6 -|=== - -=== Memcached Configuration -This example uses APCu for the local cache, Memcached as the distributed memory cache, and lists all the servers in the shared cache pool with their port numbers: - -[source,php,subs="attributes+"] ----- -'memcache.local' => '\OC\Memcache\APCu', -'memcache.distributed' => '\OC\Memcache\Memcached', -'memcached_servers' => [ - ['localhost', {std-port-memcache}], - ['server1.example.com', {std-port-memcache}], - ['server2.example.com', {std-port-memcache}], - ], ----- - == Configure Transactional File Locking xref:configuration/files/files_locking_transactional.adoc[Transactional File Locking] @@ -419,7 +160,6 @@ prevents simultaneous file saving. It is enabled by default and uses the databas CAUTION: For enhanced security, it is recommended to configure Redis to require a password. See {redis_security_url} for more information. - == Configuration Recommendations Based on Type of Deployment The examples give you an overview, adapt them to your environment and your needs. @@ -484,21 +224,18 @@ See xref:configuration/server/config_sample_php_parameters.adoc#define-redis-clu == Caching Exceptions -If ownCloud is configured to use either Memcached or Redis as a memory cache, you may encounter issues with functionality. When these occur, it is usually a result of PHP being incorrectly configured or the relevant PHP extension not being available. +If ownCloud is configured to use Redis as a memory cache, you may encounter issues with functionality. When these occur, it is usually a result of PHP being incorrectly configured or the relevant PHP extension not being available. In the table below, you can see all of the known reasons for reduced or broken functionality related to caching. [width="100%",cols="41%,59%",options="header",] |=== -| Setup/Configuration | Result -| If file locking is enabled, but the locking cache class is missing, -then an exception will appear in the web UI | The application will not be usable -| If file locking is enabled and the locking cache is configured, but the -PHP module missing. | There will be a white page/exception in web UI. It -will be a full page issue, and the application will not be usable -| All enabled, but the Redis server is not running | The application will -be usable. But any file operation will return a "500 Redis went away" exception -| If Memcache is configured for `local` and `distributed`, but the -class is missing | There will be a white page and an exception written to -the logs, This is because autoloading needs the missing class. So there is no way to show a page +| Setup/Configuration +| Result + +| If file locking is enabled, but the locking cache class is missing, then an exception will appear in the web UI +| The application will not be usable + +| All enabled, but the Redis server is not running +| The application will be usable. But any file operation will return a "500 Redis went away" exception |=== From c46a2eba27ecfd658f93a652c2939d582cb90003 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Thu, 11 Jun 2026 17:54:01 +0200 Subject: [PATCH 34/38] safe work --- .../files/previews_configuration.adoc | 12 ++--- .../server/caching_configuration.adoc | 46 +++++++++++++------ 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/modules/admin_manual/pages/configuration/files/previews_configuration.adoc b/modules/admin_manual/pages/configuration/files/previews_configuration.adoc index 8611cc3e4..58507ab6d 100644 --- a/modules/admin_manual/pages/configuration/files/previews_configuration.adoc +++ b/modules/admin_manual/pages/configuration/files/previews_configuration.adoc @@ -167,13 +167,11 @@ OC\Preview\TIFF === Disabling Previews -Under certain circumstances, for example if the server has limited resources, you might want to consider disabling the generation of previews. Note that if you do this all previews in all apps are disabled and will display generic icons instead of thumbnails. - -Set the configuration option `enable_previews` to `false`: +Under certain circumstances, for example if the server has limited resources, you might want to consider disabling the generation of previews. Note that if you do this, all previews in all apps are disabled and will display generic icons instead of thumbnails. To do so use the following environment variable: [source,.env] ---- -OWNCLOUD_ENABLE_PREVIEW='false' +OWNCLOUD_ENABLE_PREVIEW=false ---- === Adding a Preview Provider @@ -245,16 +243,16 @@ If you want to disable the maximum scaling factor, you can set the config value [source,.env] ---- -OWNCLOUD_PREVIEW_MAX_SCALE_FACTOR='null' +OWNCLOUD_PREVIEW_MAX_SCALE_FACTOR=null ---- === Define the JPEG Preview Quality The JP(E)G image quality can be defined in [%] for displaying thumbnails and image previews for apps like Files or Files Mediaviewer. Note that this setting is for displaying only and has no impact on the stored thumbnail / preview quality or size. -[source,php] +[source,.env] ---- - 'previewJPEGImageDisplayQuality' => -1, +OWNCLOUD_PREVIEW_JPEG_IMAGE_DISPLAY_QUALITY=-1 ---- The scale ranges from 1 to 100, where 1 is the lowest and 100 the highest. It defaults to -1 which is equivalent to approximately 75% of the original image quality. Consider that any value over 80 may result in an unnecessary increase of the displayed image and has larger response sizes when requesting images, without much increase of the image quality. Usually it is not necessary to have a quality setting over 75, but it can be increased if there is the need to display previews in high quality with the cost that every image requested generates a higher response load. Note that this setting does not affect downloading images. Setting a value takes immediate effect and nothing needs to be regenerated as it is for display requests only. diff --git a/modules/admin_manual/pages/configuration/server/caching_configuration.adoc b/modules/admin_manual/pages/configuration/server/caching_configuration.adoc index 6bbcdee20..03d80ab7c 100644 --- a/modules/admin_manual/pages/configuration/server/caching_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/caching_configuration.adoc @@ -29,7 +29,7 @@ The caching backends supported by ownCloud are: * xref:apcu[APCu] + This is a data cache only and does *not* cache any opcode. APCu is part of the Docker image. * xref:redis[Redis] + - This is an in-memory data structure store (cache) for single and multi-server ownCloud installations, which provides file locking and can be set up in local or distributed environments. The `php-redis` extension is already part of the Docker image. The Redis installation is part of the Docker Compose deployment example, see the xref:installation/installing_with_docker.adoc#docker-compose[Installalling With Docker] documentation for more details. + This is an in-memory data structure store (cache) for single and multi-server ownCloud installations, which provides file locking and can be set up in local or distributed environments. The required `php-redis` extension is already part of the Docker image. Redis is used of the Docker Compose deployment example. For details see the xref:installation/installing_with_docker.adoc#docker-compose[Installalling With Docker] documentation. [NOTE] ==== @@ -38,7 +38,7 @@ You may use _both_ a local and a distributed cache. The recommended ownCloud cac === Cache Directory Location -The cache directory defaults to `data/$user/cache` where `$user` is the current user. You may use the `'cache_path'` directive in your configuration for different locations. For details see the xref:configuration/server/config_sample_php_parameters.adoc#define-the-location-of-the-cache-folder[Define the location of the cache folder] description. +The cache directory defaults to `/files/$user/cache` and `$user` is the current ownCloud user. You may use the xref:configuration/server/config_sample_php_parameters.adoc#define-the-location-of-the-cache-folder[OWNCLOUD_CACHE_PATH] environment variable for different locations. == Cache Types @@ -55,14 +55,20 @@ php -r 'phpinfo();' | grep opcache.enable === APCu -The easiest cache to use is APCu, because it is a pure data cache, very fast as it is memory-based only and _nothing needs to be configured_. +The easiest cache to use is APCu, because it is a pure data cache, very fast as it is memory-based only. If defined, _nothing needs to be configured_. === Redis {redis_url}[Redis] is an excellent modern memory cache to use for both distributed caching and as a local cache for xref:configuration/files/files_locking_transactional.adoc[transactional file locking], because it guarantees that cached objects are available for as long as they are needed. -Please note that with Redis version 6 upwards, a new authentication mechanism has been introduced named ACL (Access Control Lists). ownCloud does currently not support Redis ACLs, but does support the password protection available with current Redis versions which can be configurted with environment variables. +[NOTE] +==== +Authentication with Redis: + +* ownCloud does support the password protection available with current Redis versions which can be configurted with environment variables. +* With Redis version 6 upwards, a new authentication mechanism has been introduced named ACL (Access Control Lists). ownCloud does currently not support Redis ACLs. +==== ==== Redis Performance Consideration @@ -76,7 +82,7 @@ Please note that with Redis version 6 upwards, a new authentication mechanism ha ==== Clearing the Redis Cache -The Redis cache can be flushed from the command-line using the {rediscli_url}[redis-cli tool], To do so, you first must enter the Redis containers shell and usethe following example: +The Redis cache can be flushed from the command-line using the {rediscli_url}[redis-cli tool]. To do so, you first must enter the Redis containers shell and use the following command example: [source,bash] ---- @@ -85,7 +91,7 @@ SELECT FLUSHDB ---- -`` is the number of the Redis database where the cache is stored. It is zero by default at ownCloud. To check what yours is currently set to for ownCloud, check the `dbindex` value in `config/config.php`. To change it, see the xref:configuration/server/config_sample_php_parameters.adoc#memory-caching-backend-configuration[Memory caching backend configuration] +Please note that `` is the index number of the Redis database where the cache is stored. It is zero by default at ownCloud. To check what yours is currently set to for ownCloud, check if the `OWNCLOUD_REDIS_DB` environment variable has been configured. For more details see the xref:configuration/server/config_sample_php_parameters.adoc#memory-caching-backend-configuration[Memory caching backend configuration] documentation. NOTE: Out of the box, every Redis instance supports 16 databases so `` has to be set between 0 and 15. @@ -93,23 +99,27 @@ Please read more about the instructions for the {redis_select_url}[select] and { == Configuring Memory Caching -Memory caches must be explicitly configured in ownCloud by: +Memory caches must be provided and explicitly configured in ownCloud by: -. Installing and enabling your desired cache (whether that be the PHP extension and/or the caching server). -. Adding the appropriate entry to ownCloud’s `config.php`. +. When using Redis, it must be provided by either as described in the xref:installation/installing_with_docker.adoc#docker-compose[Docker Compose] example of the installation documentation or by other means. +. Configuring the caches used. See the xref:configuration/server/config_sample_php_parameters.adoc#memory-caching-backend-configuration[Memory caching backend configuration] -for an overview of all possible config parameters, as the examples below only show basic configuration settings. After installing and enabling your chosen memory cache, verify that it is active by viewing the -xref:configuration/general_topics/general_troubleshooting.adoc#php-version-and-information[PHP configuration details]. +for an overview of all possible config parameters, as the examples below only show basic configuration settings. === Opcache Configuration -Opcache is already configured with the Docker image provided. +Opcache is already enabled and configured with the Docker image provided. === APCu Configuration -APCu is, if nothing else is configured, already configured via the default of the environment variable `OWNCLOUD_MEMCACHE_LOCAL`. +The environment variable that defines the memory cache has a default value, which is used if nothing else is configured. This value is described below: + +[source,.env] +---- +OWNCLOUD_MEMCACHE_LOCAL='\OC\Memcache\APCu' +---- === Redis Configuration @@ -158,6 +168,16 @@ prevents simultaneous file saving. It is enabled by default and uses the databas ], ---- +//// +'filelocking.enabled' => true, +'memcache.locking' => '\OC\Memcache\Redis', +'redis' => [ + 'host' => 'localhost', + 'port' => {std-port-redis}, + 'timeout' => 0, + 'password' => '', // Optional, if not defined no password will be used. +//// + CAUTION: For enhanced security, it is recommended to configure Redis to require a password. See {redis_security_url} for more information. == Configuration Recommendations Based on Type of Deployment From 62fa10d700ec16360278c70c1c7b11a8c8573f70 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Fri, 12 Jun 2026 11:14:56 +0200 Subject: [PATCH 35/38] update config.sample and caching --- .../server/caching_configuration.adoc | 117 +++----- .../config_apps_sample_php_parameters.adoc | 105 ++++--- .../server/config_sample_php_parameters.adoc | 262 +++++++----------- 3 files changed, 208 insertions(+), 276 deletions(-) diff --git a/modules/admin_manual/pages/configuration/server/caching_configuration.adoc b/modules/admin_manual/pages/configuration/server/caching_configuration.adoc index 03d80ab7c..c29762827 100644 --- a/modules/admin_manual/pages/configuration/server/caching_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/caching_configuration.adoc @@ -60,7 +60,7 @@ The easiest cache to use is APCu, because it is a pure data cache, very fast as === Redis {redis_url}[Redis] is an excellent modern memory cache to use for both distributed caching and as a local cache for -xref:configuration/files/files_locking_transactional.adoc[transactional file locking], because it guarantees that cached objects are available for as long as they are needed. +xref:configuration/files/files_locking_transactional.adoc[transactional file locking], because it guarantees that cached objects are available for as long as they are needed. Redis is very configurable; consult the {redis_doc_url}[Redis documentation] to learn more. [NOTE] ==== @@ -123,121 +123,84 @@ OWNCLOUD_MEMCACHE_LOCAL='\OC\Memcache\APCu' === Redis Configuration -Redis is very configurable; consult the {redis_doc_url}[Redis documentation] to learn more. - -We recommend adding the following for best performance. This enables xref:configure-transactional-file-locking[External Transactional File Locking] based on Redis: +If you select Redis, you must enable it via environment variables. The example value for the host setting assumes that you have used the ownCloud Docker Compose deployment example. Adapt this value for your setup. [source,.env] ---- -OWNCLOUD_FILELOCKING_ENABLED=true -OWNCLOUD_MEMCACHE_LOCAL='\OC\Memcache\Redis' +OWNCLOUD_REDIS_ENABLED=true +OWNCLOUD_REDIS_HOST=redis ---- -==== Redis Configuration Using TCP - -The following example `config.php` configuration connects to a Redis cache via TCP: - -// do not shrink the blanks on port because of proper alignment in rendering -[source,php,subs="attributes+"] +* If Redis is not enabled, none of the other Redis configurations will be taken into account. +* If Redis is enabled, two additional configurations are set automatically. Note that these configs are not configurable via environment variables: ++ +-- +[source,.php] ---- -'memcache.local' => '\OC\Memcache\Redis', -'redis' => [ - 'host' => 'localhost', // For a Unix domain socket, use '/var/run/redis/redis.sock' - 'port' => {std-port-redis}, // Set to 0 when using a Unix socket - 'timeout' => 0, // Optional, keep connection open forever - 'password' => '', // Optional, if not defined no password will be used. - 'dbindex' => 0, // Optional, if undefined SELECT will not run and will - // use Redis Server's default DB Index. -], +'memcache.locking' => '\OC\Memcache\Redis' +'memcache.distributed' => '\OC\Memcache\Redis' ---- +-- -== Configure Transactional File Locking - -xref:configuration/files/files_locking_transactional.adoc[Transactional File Locking] -prevents simultaneous file saving. It is enabled by default and uses the database to store the locking data. This places a significant load on your database. It is recommended to use a cache backend instead. You have to configure it in `config.php` as in the following example, which uses Redis TCP as the cache backend: +xref:configuration/files/files_locking_transactional.adoc[Transactional File Locking] prevents simultaneous file saving. It is enabled by default and uses the database to store the locking data. This places a significant load on your database. It is recommended to use a cache backend instead. +We recommend adding the following for best performance. This enables xref:configure-transactional-file-locking[External Transactional File Locking] based on Redis: -[source,php,subs="attributes+"] +[source,.env] ---- -'filelocking.enabled' => true, -'memcache.locking' => '\OC\Memcache\Redis', -'redis' => [ - 'host' => 'localhost', - 'port' => {std-port-redis}, - 'timeout' => 0, - 'password' => '', // Optional, if not defined no password will be used. - ], +OWNCLOUD_FILELOCKING_ENABLED=true +OWNCLOUD_MEMCACHE_LOCAL='\OC\Memcache\Redis' ---- -//// -'filelocking.enabled' => true, -'memcache.locking' => '\OC\Memcache\Redis', -'redis' => [ - 'host' => 'localhost', - 'port' => {std-port-redis}, - 'timeout' => 0, - 'password' => '', // Optional, if not defined no password will be used. -//// -CAUTION: For enhanced security, it is recommended to configure Redis to require a password. See {redis_security_url} for more information. +CAUTION: ownCloud provides many configuration options for Redis, including enhanced security features such as password protection. See the Redis security URL and the ownCloud environment variables for more details. -== Configuration Recommendations Based on Type of Deployment +== Deployment Type Configuration Examples -The examples give you an overview, adapt them to your environment and your needs. +These examples provide an overview. Adapt them to suit your environment and needs. === Private Home Server With Low Access Rates -Use APCu for local caching, file locking is not mandatory. +Use APCu for local caching, file locking is not mandatory, Redis is not required and can be removed from the deployment example. -[source,php] +[source,.env] ---- -'memcache.local' => '\OC\Memcache\APCu', +OWNCLOUD_MEMCACHE_LOCAL='\OC\Memcache\APCu' ---- === Small Server Use APCu for local caching and Redis for file locking. -[source,php,subs="attributes+"] +[source,.env] ---- -'filelocking.enabled' => true, -'memcache.local' => '\OC\Memcache\APCu', -'memcache.locking' => '\OC\Memcache\Redis', -'redis' => [ - 'host' => 'localhost', - 'port' => {std-port-redis}, -], +OWNCLOUD_REDIS_ENABLED=true +OWNCLOUD_REDIS_HOST=redis +OWNCLOUD_FILELOCKING_ENABLED=true +OWNCLOUD_MEMCACHE_LOCAL='\OC\Memcache\APCu' ---- === Small Organization, Single-server Setup -Use Redis Socket for local caching and for file locking. +Use Redis for local caching and for file locking. -[source,php,subs="attributes+"] +[source,.env] ---- -'filelocking.enabled' => true, -'memcache.local' => '\OC\Memcache\Redis', -'memcache.locking' => '\OC\Memcache\Redis', -'redis' => [ - 'host' => '/var/run/redis/redis.sock', - 'port' => 0, -], +OWNCLOUD_REDIS_ENABLED=true +OWNCLOUD_REDIS_HOST=redis +OWNCLOUD_FILELOCKING_ENABLED=true +OWNCLOUD_MEMCACHE_LOCAL='\OC\Memcache\Redis' ---- === Large Organization, Clustered Setup -Use Redis for everything except a local memory cache. Use the server’s IP address or hostname so that it is accessible to other hosts: +Use Redis for everything except a local memory cache. -[source,php,subs="attributes+"] +[source,.env] ---- -'filelocking.enabled' => true, -'memcache.distributed' => '\OC\Memcache\Redis', -'memcache.locking' => '\OC\Memcache\Redis', -'memcache.local' => '\OC\Memcache\APCu', -'redis' => [ - 'host' => 'server1', // hostname example - 'host' => '12.34.56.78', // IP address example - 'port' => {std-port-redis}, -], +OWNCLOUD_REDIS_ENABLED=true +OWNCLOUD_REDIS_SEEDS='host_1:port,host_2:port' +OWNCLOUD_FILELOCKING_ENABLED=true +OWNCLOUD_MEMCACHE_LOCAL='\OC\Memcache\APCu' ---- See xref:configuration/server/config_sample_php_parameters.adoc#define-redis-cluster-connection-details[Define Redis Cluster connection details] when using a Redis clustered setup. diff --git a/modules/admin_manual/pages/configuration/server/config_apps_sample_php_parameters.adoc b/modules/admin_manual/pages/configuration/server/config_apps_sample_php_parameters.adoc index dc12276dd..b84cfeb07 100644 --- a/modules/admin_manual/pages/configuration/server/config_apps_sample_php_parameters.adoc +++ b/modules/admin_manual/pages/configuration/server/config_apps_sample_php_parameters.adoc @@ -52,7 +52,7 @@ Possible key: `admin_audit.groups` ARRAY 'log.conditions' => [ [ 'apps' => ['admin_audit'], - // Adjust the path below, to match your setup + // Adjust the path below to match your setup 'logfile' => '/var/www/owncloud/data/admin_audit.log' ], ], @@ -73,7 +73,7 @@ Possible key: `files_antivirus.av_path` STRING Possible key: `files_antivirus.av_cmd_options` STRING -=== Default path to the _clamscan_ command line anti-virus scanner. +=== The default path to the _clamscan_ command line anti-virus scanner. This setting only applies when the operating mode of the `files_antivirus` app is set to executable mode. See the documentation for more details. @@ -101,10 +101,10 @@ See the documentation for more details. Possible key: `files_pdfviewer.enableScripting` STRING -PDF files may contain JavaScript which for example can be necessary to process editable fields. +PDF files may contain JavaScript, which, for example, can be necessary to process editable fields. Under normal circumstances and for security reasons, scripts are not allowed to be processed. To allow processing these scripts, the following config key can be set. Note that enabling scripting can be -a major security issue and should be considered as possible thread vector. +a major security issue and should be considered as a possible threat vector. === Enable Scripting in PDF files. @@ -122,18 +122,34 @@ as disable scripting. Possible key: `versions_retention_obligation` STRING -Use following values to configure the retention behaviour. Replace `D` with the number of days. - -auto:: -Default value if nothing is set -D, auto:: -Keep versions at least for D days, apply expiration rules to all versions that are older than D days -auto, D:: -Delete all versions that are older than D days automatically, delete other versions according to expiration rules -D1, D2:: -Keep versions for at least D1 days and delete when they exceed D2 days -disabled:: -Disable Versions; no files will be deleted. +Define the files versions retention obligation +If the versions app is enabled (default), this setting defines the policy +for when versions will be permanently deleted. +The app allows for two settings, a minimum time for version retention, +and a maximum time for version retention. +Minimum time is the number of days a version will be kept, after which it +may be deleted. Maximum time is the number of days at which it is guaranteed +to be deleted. +Both minimum and maximum times can be set together to explicitly define +version deletion. For migration purposes, this setting is installed +initially set to "auto", which is equivalent to the default setting in +ownCloud 8.1 and before. + +Available values: +`auto` +default setting. Automatically expire versions according to expire +rules. Please refer to https://doc.owncloud.com/server/latest/admin_manual/configuration/files/file_versioning.html +for more information. +`D, auto` +keep versions at least for D days, apply expiry rules to all versions +that are older than D days +`auto, D` +delete all versions that are older than D days automatically, delete +other versions according to expire rules +`D1, D2` +keep versions for at least D1 days and delete when exceeds D2 days +`disabled` +versions auto clean disabled, versions will be kept forever === Pattern to define the expiration date for each backup version created. @@ -191,7 +207,7 @@ Path to the 'keytab' file to use, defaults to '/etc/krb5.keytab'. .... === Kerberos SPNEGO Timeout -Timeout before re-enabling SPNEGO based authentication after logout, defaults to 60 seconds. +Timeout before re-enabling SPNEGO-based authentication after logout, defaults to 60 seconds. ==== Code Sample @@ -201,7 +217,7 @@ Timeout before re-enabling SPNEGO based authentication after logout, defaults to .... === Kerberos Domain -The domain name - remove from principals to match the pure user name. +The domain name is removed from principals to match the pure username. Example: 'alice@corp.dir' will look for the user 'alice' in LDAP if 'kerberos.domain' is set to 'corp.dir'. @@ -370,7 +386,7 @@ To use this option, you need at least ownCloud’s Microsoft Office Online app v Possible key: `msteamsbridge` ARRAY -Sub key: `loginButtonName` STRING +Subkey: `loginButtonName` STRING === Login Button Label This key is necessary for security reasons. Users will be asked to click a login @@ -392,34 +408,34 @@ name can be freely set based on your requirements. Possible key: `openid-connect` ARRAY -**Configure OpenID Connect - all possible sub-keys** +**Configure OpenID Connect - all possible subkeys** -_You have to use the main key `openid-connect` together with sub keys listed below, see code samples._ +_You have to use the main key `openid-connect` together with subkeys listed below, see code samples._ allowed-user-backends:: -Limit the users which are allowed to login to a specific user backend - e.g. LDAP +Limit the users which are allowed to log in to a specific user backend - e.g. LDAP (`'allowed-user-backends' ⇒ ['LDAP']`) auth-params:: -Additional parameters which are sent to the IdP during the auth requests +Additional parameters, which are sent to the IdP during the auth requests autoRedirectOnLoginPage:: If `true`, the ownCloud login page will redirect directly to the Identity Provider login without requiring the user to click a button. The default is `false`. auto-provision:: -If `auto-provision` is setup, an ownCloud user will be created if not exists, after successful +If `auto-provision` is set up, an ownCloud user will be created if not exists, after successful login using openid connect. The config parameters `mode` and `search-attribute` will be used to create a unique user so that the lookup mechanism can find the user again. This is where an LDAP setup is usually required. The profile picture will only be transferred upon account creation, but will not be updated afterwards if it changes in the connected IdP. -If `auto-provision` is not setup or required, it is expected that the user exists and you +If `auto-provision` is not set up or required, it is expected that the user exists, and you MUST declare this with `['enabled' => false]` like shown in the Easy Setup example. -`auto-provision` holds several sub keys, see the example setup with the explanations below. +`auto-provision` holds several subkeys, see the example setup with the explanations below. auto-update:: When using the provisioning mode `auto-update`, user account info will update with the current -information provided by the OpenID Connect provider upon each user log in. +information provided by the OpenID Connect provider upon each user login. insecure:: Boolean value (`true`/`false`), no SSL verification will take place when talking to the @@ -447,7 +463,7 @@ provider-params:: Additional config array depending on the IdP to be entered here - usually only necessary if the IdP does not support service discovery. -provider-url, client-id and client-secret:: +provider-url, client-id, and client-secret:: Variables are to be taken from the OpenID Connect Provider's setup. For the `provider-url`, the URL where the IdP is living. In some cases (KeyCloak, Azure AD) this holds more than just a domain but also a path. @@ -473,8 +489,8 @@ token-introspection-endpoint-client-secret:: Client secret to be used with the token introspection endpoint. use-access-token-payload-for-user-info:: -If set to `true` any user information will be read from the access token. -If set to `false` the userinfo endpoint is used (starting app version 1.1.0). +If set to `true`, any user information will be read from the access token. +If set to `false`, the userinfo endpoint is used (starting app version 1.1.0). === Easy setup @@ -522,7 +538,7 @@ If set to `false` the userinfo endpoint is used (starting app version 1.1.0). // no provisioning will be made, "User not found" will be returned 'provisioning-attribute' => 'owncloud', // auto-update user account info with current information provided by the - // OpenID Connect provider account attributes, that will be updated, + // OpenID Connect provider account attributes that will be updated // can be specified in `attributes` config option 'update' => ['enabled' => true], // enable the user info auto-update mode @@ -654,7 +670,7 @@ Possible key: `wnd2.cachewrapper.ttl` INTEGER *Note* With WND 2.1.0, key `wnd.storage.testForHiddenMount` is obsolete and has been removed completely. === Enable to Push WND Events to the Activity App -Register WND as extension into the Activity app in order to send information about what +Register WND as extension into the Activity app to send information about what the `wnd:process-queue` command is doing. The activity sent will be based on what the `wnd:process-queue` detects, and the activity will be sent to each affected user. There won't be any activity being sent outside of the `wnd:process-queue` command. @@ -699,7 +715,7 @@ encryption is selected and smbclient is overwhelming the server with requests. === Reset the Password When Receiving Any of the Following Error Codes. By default, we will reset the password with error code 13, which means -access denied. Depending on circumstances, you might want to add the +access is denied. Depending on circumstances, you might want to add the error code 1, which means an operation not permitted (although there could be cases where this "operation not permitted" might not be caused by a wrong password). @@ -714,7 +730,7 @@ The password reset feature can be disabled by providing an empty list - `'wnd.errorCodes.passwordReset' => [],` Note that disabling the password reset feature can lead to an account lockout -if such feature is enabled in the target windows / samba machine. +if this feature is enabled in the target windows / samba machine. ==== Code Sample @@ -772,7 +788,7 @@ recommended to enable this option only if there are a high number of ACLs target === Enable or Disable the WND In-Memory Notifier for Password Changes Having this feature enabled implies that whenever a WND process detects a wrong password in the storage - maybe the password has changed in the -backend - all WND storages that are in-memory will be notified in order to reset +backend - all WND storages that are in-memory will be notified to reset their passwords if applicable and not to requery again. The intention is to prevent a potential password lockout for the user in the backend. @@ -793,7 +809,7 @@ Alternatively, you can disable this feature completely. A map of servers with the required data to get the Kerberos credentials in order to access them. -Each key of the map must be unique and identifies a server. This ID will +Each key of the map must be unique and identify a server. This ID will be used in the web UI to configure the mount points to use the Kerberos authentication. You can use any ID (choose one meaningful and easy to remember). @@ -807,7 +823,7 @@ for this service account doesn't expire, otherwise you will have to replace the file manually before the expiration. See the Kerberos documentation for details. - `ocservice` (required): The name of the service of the account. This matches -the SPN of the Windows / Samba account. It usually is in the form "HTTP/", +the SPN of the Windows / Samba account. It is usually in the form "HTTP/", but it might be different. See the Kerberos documentation for details. - `usermapping` (optional): The ownCloud-to-windows user mapping to be used. See below @@ -828,11 +844,11 @@ matches the Windows / Samba user ID. - `RemoveDomain`: Remove the domain (if any) from the ownCloud user ID. This means that "user001@my.dom.com" will map to "user001". Note that -it's assumed that all users belong to the same domain, otherwise -"user001@my.dom.com" will be mapped to the same windows user as +it's assumed that all users belong to the same domain. Otherwise +"user001@my.dom.com" will be mapped to the same Windows user as "user001@not.mine.eu". -- `EALdapAttr`: Use ownCloud's user extended attributes to map the ownCloud +- `EALdapAttr`: Use ownCloud's user-extended attributes to map the ownCloud user to the target LDAP attribute. The mapping has 2 parameters: * `attr`: in order to select the LDAP attribute you want to use. Note that it's required that the user_ldap app exposes the chosen attribute which @@ -924,7 +940,7 @@ cache, limiting the maximum memory that will be used. .... === Manage UTF-8 Glyph Normalization on macOS -A glyph is a character like `ñ` as used in the spanish word `señorita` which can be composed by two different byte sequences. +A glyph is a character like `ñ` as used in the Spanish word `señorita` which can be composed by two different byte sequences. With https://www.utf8-chartable.de/unicode-utf8-table.pl?number=1024&unicodeinhtml=hex[UTF-8], glyphs can have two valid representations of these sequences in filesystems. https://unicode.org/reports/tr15/#Norm_Forms[Normalization] makes it possible to determine whether any two Unicode strings are equivalent. @@ -948,8 +964,9 @@ Time to Live (TTL) in seconds to be used to cache information for the WND2 (coll cache wrapper implementation. The value will be used by all WND2 storages. Although the cache isn't exactly per user but per storage id, consider the cache to be per user, because it will be like that for common use cases. Data will remain in the cache and won't -be removed by ownCloud. Aim for a low TTL value in order to not fill the memcache -completely. In order to properly disable caching, use -1 or any negative value. 0 (zero) +be removed by ownCloud. Aim for a low TTL value to not fill the memcache. + +To properly disable caching, use -1 or any negative value. 0 (zero) isn't considered a valid TTL value and will also disable caching. ==== Code Sample @@ -966,7 +983,7 @@ Note: This app is for Enterprise customers only. Possible key: `workflow.retention_engine` STRING === Provide Advanced Management of File Tagging -Enables admins to specify rules and conditions (file size, file mimetype, group membership and more) +Enables admins to specify rules and conditions (file size, file mimetype, group membership, and more) to automatically assign tags to uploaded files. Values: `tagbased` (default) or `userbased`. ==== Code Sample diff --git a/modules/admin_manual/pages/configuration/server/config_sample_php_parameters.adoc b/modules/admin_manual/pages/configuration/server/config_sample_php_parameters.adoc index 8ed38ffaa..b5e2659d5 100644 --- a/modules/admin_manual/pages/configuration/server/config_sample_php_parameters.adoc +++ b/modules/admin_manual/pages/configuration/server/config_sample_php_parameters.adoc @@ -57,19 +57,19 @@ passwords. This example is for documentation only, and you should never use it. 'passwordsalt' => '', .... -=== Define list of trusted domains that users can log into +=== Define the list of trusted domains that users can log into Specifying trusted domains prevents host header poisoning. -This parameter reperesents a white list of approved IP addresses and +This parameter represents a whitelist of approved IP addresses and hostnames that this server is known by / is used to access it. -Wildcards, slash notation and ports are not supported. +Wildcards, slash notation, and ports are not supported. Do not remove this, as it performs necessary security checks. Please consider that for backend processes like background jobs or occ commands, -the URL parameter in key `overwrite.cli.url` is used. For more details, please see that key. +the URL parameter in the key `overwrite.cli.url` is used. For more details, please see that key. NOTE: When defined via the `OWNCLOUD_TRUSTED_DOMAINS` property in docker, the values should be -a comma delimited list without white space. like `OWNCLOUD_TRUSTED_DOMAINS=localhost,10.10.1.1`. -Wildcards, slash notation and ports are not supported. +a comma-delimited list without white space (e.g., `OWNCLOUD_TRUSTED_DOMAINS=localhost,10.10.1.1`). +Wildcards, slash notation, and ports are not supported. ==== Code Sample @@ -81,7 +81,7 @@ Wildcards, slash notation and ports are not supported. ], .... -=== Define global list of CORS domains +=== Define the global list of CORS domains All users can use tools running CORS (Cross-Origin Resource Sharing) requests from the listed domains. @@ -97,7 +97,7 @@ from the listed domains. === Define the directory where user files are stored This defaults to `data/` in the ownCloud directory. -The SQLite database is also stored here, when you use SQLite. +The SQLite database is also stored here when you use SQLite. (SQLite is not available in ownCloud Enterprise Edition) ==== Code Sample @@ -114,7 +114,7 @@ The directory MUST EXIST and be WRITABLE by the web server. Note that crashes are extremely rare (although they can come in burst due to multiple requests), so the default location is usually fine. Also note that the log can contain sensitive information, but it should be useful -to pinpoint where is the problem. +to pinpoint where the problem is. ==== Code Sample @@ -166,7 +166,7 @@ Optional config option, defaults to use the gethostname() return value. .... === Identify the database used with this installation -See also config option `supportedDatabases` +See also the config option `supportedDatabases` Available: - sqlite (SQLite3 - Not in Enterprise Edition) @@ -268,9 +268,9 @@ this setting after they have logged in. === Define the default app to open on user login Use the app names as they appear in the URL after clicking them in the Apps menu, -such as files, documents or calendar etc. You can use a comma-separated list of app names, +such as files, documents or calendar, etc. You can use a comma-separated list of app names, so if the first app is not enabled for a user then ownCloud will try the second one, and so -on. If no enabled apps are found it defaults to the Files app. +on. If no enabled apps are found, it defaults to the Files app. ==== Code Sample @@ -283,7 +283,7 @@ on. If no enabled apps are found it defaults to the Files app. `true` enables avatars, or user profile photos, `false` disables them. These appear on the User page, on user's Personal pages and are used by some apps -(contacts, mail, etc). +(contacts, mail, etc.). ==== Code Sample @@ -327,7 +327,7 @@ on the login screen. The default is 15 days, expressed in seconds. === Define the lifetime of a session after inactivity The web UI might send a "heartbeat" based on the activity happening -in order to extend the session lifetime and keeping it from timing out +to extend the session lifetime and keeping it from timing out prematurely. If there is no activity happening and the lifetime is reached, you'll have to log in again. @@ -373,11 +373,11 @@ force the rest to re-authenticate. 'session_forced_logout_timeout' => 0, .... -=== Enforce token only authentication for apps and clients connecting to ownCloud +=== Enforce token-only authentication for apps and clients connecting to ownCloud If enabled, all access requests using the user's password are blocked for enhanced security. Users have to generate special app-passwords (tokens) for their apps or clients in their personal -settings which are further used for app or client authentication. Browser logon is not affected. +settings, which are further used for app or client authentication. Browser logon is not affected. ==== Code Sample @@ -386,8 +386,8 @@ settings which are further used for app or client authentication. Browser logon 'token_auth_enforced' => false, .... -=== Enforce strict login check with user backend -If enabled, strict login check for password in user backend will be enforced, +=== Enforce a strict login check with the user backend +If enabled, a strict login check for password in the user backend will be enforced, meaning only the login name typed by the user would be validated. With this configuration enabled, e.g. an additional check for email will not be performed. @@ -437,16 +437,16 @@ WARNING: leave this as is if you're not sure what it does. 'csrf.disabled' => false, .... -=== Define how to relax same site cookie settings +=== Define how to relax the same site cookie settings Possible values: `Strict`, `Lax` or `None`. -Setting the same site cookie to `None` is necessary in case of OpenID Connect. -For more information about the impact of the values see: +Setting the same site cookie to `None` is necessary in the case of OpenID Connect. +For more information about the impact of the values, see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite#values and https://web.dev/schemeful-samesite/ * Use 'strict' whenever possible -* If necessary relax to 'lax' +* If necessary, relax to 'lax' * Use 'none' if it needs to be relaxed even further ==== Code Sample @@ -460,7 +460,7 @@ https://web.dev/schemeful-samesite/ These files will be copied to the data directory of new users. Set this to the empty string if you do not want to copy any skeleton files. -A valid path must be given for this key otherwise errors will be generated in owncloud.log. +A valid path must be given for this key, otherwise errors will be generated in owncloud.log. ==== Code Sample @@ -488,7 +488,7 @@ IMAP (OC_User_IMAP), SMB (OC_User_SMB), and FTP (OC_User_FTP). .... === Define a custom link to reset passwords -If your user backend does not allow password resets (e.g. when it's a read-only +If your user backend does not allow password resets (e.g., when it's a read-only user backend like LDAP), you can specify a custom link, where the user is redirected to, when clicking the "reset password" link after a failed login-attempt. @@ -518,7 +518,7 @@ Disable this if you encounter slow username search in the sharing dialog. Allows finding 'test' in groups when searching for 'es'. This is only used in the DB group backend (local groups). -This won't be used against LDAP, Shibboleth or any other group backend. +This won't be used against LDAP, Shibboleth, or any other group backend. ==== Code Sample @@ -530,7 +530,7 @@ This won't be used against LDAP, Shibboleth or any other group backend. === Define minimum characters entered before a search returns results Defines the minimum characters entered before a search returns results for users or groups in the share autocomplete form. Lower values increase search -time especially for large backends. +time, especially for large backends. Any exact matches to a user or group will be returned, even though less than the minimum characters have been entered. The search is case-insensitive. @@ -584,7 +584,7 @@ Modes to use for sending mail: `sendmail`, `smtp`, `qmail` or `php`. If you are using local or remote SMTP, set this to `smtp`. -If you are using PHP mail you must have an installed and working email system +If you are using PHP mail, you must have an installed and working email system on the server. The program used to send email is defined in the `php.ini` file. For the `sendmail` option you need an installed and working email system on @@ -694,7 +694,7 @@ attempts. Set remove_sender_display_name to true to not include this information === Override automatic proxy detection The automatic hostname detection of ownCloud can fail in certain reverse proxy and CLI/cron situations. This option allows you to manually override -the automatic detection; for example `www.example.com`, or specify the port +the automatic detection; for example, `www.example.com`, or specify the port `www.example.com:8080`. ==== Code Sample @@ -724,7 +724,7 @@ ownCloud attempts to detect the webroot for generating URLs automatically. For example, if `www.example.com/owncloud` is the URL pointing to the ownCloud instance, the webroot is `/owncloud`. When proxies are in use, it -may be difficult for ownCloud to detect this parameter, resulting in invalid URLs. +may be challenging for ownCloud to detect this parameter, resulting in invalid URLs. ==== Code Sample @@ -738,7 +738,7 @@ This option allows you to define a manual override condition as a regular expression for the remote IP address. The keys `overwritewebroot`, `overwriteprotocol`, and `overwritehost` are subject to this condition. -For example, defining a range of IP addresses starting with `10.0.0.` +For example, defining a range of IP addresses starting with `10.0.0.` and ending with 1 to 3: * `^10\.0\.0\.[1-3]$` ==== Code Sample @@ -749,7 +749,7 @@ and ending with 1 to 3: * `^10\.0\.0\.[1-3]$` .... === Override cli URL -Use this configuration parameter to specify the base URL for any URLs which +Use this configuration parameter to specify the base URL for any URLs that are generated within ownCloud using any kind of command line tools (cron or occ). The value should contain the full base URL: `https://www.example.com/owncloud` @@ -779,7 +779,7 @@ public and private links. === Define rewrite private and public links Rewrite private and public links to the new ownCloud Web UI (if available). -If web.rewriteLinks is set to 'true', public and private links will be redirected to this url. +If 'web.rewriteLinks' is set to 'true', public and private links will be redirected to this url. The Web UI will handle these links accordingly. As an example, in case 'web.baseUrl' is set to 'http://web.example.com', @@ -796,7 +796,7 @@ by ownCloud to 'http://web.example.com/index.html#/s/THoQjwYYMJvXMdW'. === Define clean URLs without `/index.php` This parameter will be written as `RewriteBase` on update and installation of ownCloud to your `.htaccess` file. While this value is often simply the URL -path of the ownCloud installation it cannot be set automatically properly in +path of the ownCloud installation, it cannot be set automatically properly in every scenario and needs thus some manual configuration. In a standard Apache setup this usually equals the folder that ownCloud is @@ -805,10 +805,10 @@ the correct value would most likely be `/owncloud`. If ownCloud is running under `https://mycloud.org/` then it would be `/`. Note that the above rule is not valid in every case, as there are some rare setup -cases where this may not apply. However, to avoid any update problems this +cases where this may not apply. However, to avoid any update problems, this configuration value is explicitly opt-in. -After setting this value run `{occ-command-example-prefix} maintenance:update:htaccess`. Now, when the +After setting this value, run `{occ-command-example-prefix} maintenance:update:htaccess`. Now, when the following conditions are met ownCloud URLs won't contain `index.php`: - `mod_rewrite` is installed @@ -884,14 +884,14 @@ Available values: 30 days, automatically deleting them (at any time) if space is needed. Note: files may not be removed if space is not required. * `D, auto` - keeps files and folders in the trash bin for D+ days, delete anytime if - space needed (Note: files may not be deleted if space is not needed) + keeps files and folders in the trash bin for D+ days, delete files anytime if + space is needed (Note: files may not be deleted if space is not needed) * `auto, D` delete all files in the trash bin that are older than D days - automatically, delete other files anytime if space needed + automatically, delete other files anytime if space is needed * `D1, D2` keep files and folders in the trash bin for at least D1 days and - delete when exceeds D2 days + delete when it exceeds D2 days * `disabled` trash bin auto clean disabled, files and folders will be kept forever @@ -917,9 +917,9 @@ that triggers auto purging of deleted files for this user Define a list of directories that will skip the trashbin and therefore be deleted immediately. Only defined directories and only in the root of a mount will skip the trashbin. -Consider not to use reserved directory names when using snapshot capable storage systems. -The setting expects folder names with or without trailing slash. -All the content of such directories including their subdirectories will also skip the trashbin. +Consider not using reserved directory names when using snapshot-capable storage systems. +The setting expects folder names with or without a trailing slash. +All the content of such directories, including their subdirectories will also skip the trashbin. ==== Code Sample @@ -954,7 +954,7 @@ Once the size of a resource is greater than or equal the given value, the trashb File sizes are valid for all mount points, take care when defining the threshold. -All positive numbers and zero is allowed. Append one of the following options directly and without space: +All positive numbers and zero are allowed. Append one of the following options directly and without space: B, K, KB, MB, M, GB, G, TB, T, PB, P ==== Code Sample @@ -968,44 +968,6 @@ B, K, KB, MB, M, GB, G, TB, T, PB, P These parameters control the Versions app. -=== Define the files versions retention obligation -If the versions app is enabled (default), this setting defines the policy -for when versions will be permanently deleted. - -The app allows for two settings, a minimum time for version retention, -and a maximum time for version retention. -Minimum time is the number of days a version will be kept, after which it -may be deleted. Maximum time is the number of days at which it is guaranteed -to be deleted. -Both minimum and maximum times can be set together to explicitly define -version deletion. For migration purposes, this setting is installed -initially set to "auto", which is equivalent to the default setting in -ownCloud 8.1 and before. - -Available values: - -* `auto` - default setting. Automatically expire versions according to expire - rules. Please refer to https://doc.owncloud.com/server/latest/admin_manual/configuration/files/file_versioning.html - for more information. -* `D, auto` - keep versions at least for D days, apply expiry rules to all versions - that are older than D days -* `auto, D` - delete all versions that are older than D days automatically, delete - other versions according to expire rules -* `D1, D2` - keep versions for at least D1 days and delete when exceeds D2 days -* `disabled` - versions auto clean disabled, versions will be kept forever - -==== Code Sample - -[source,php] -.... -'versions_retention_obligation' => 'auto', -.... - === Save additional metadata for versions Save additional metadata (author, version tag, etc.) of each version of uploaded and edited files. @@ -1026,7 +988,7 @@ ownCloud performs several verification checks. There are two options, `true` and `false`. === Enable or disable updatechecker -Check if ownCloud is up-to-date and shows a notification if a new version is available. +Check if ownCloud is up to date and shows a notification if a new version is available. This option is only applicable to ownCloud core. It is not applicable to app updates. @@ -1079,7 +1041,7 @@ This is done by attempting to make a request from JS to 'check_for_working_wellknown_setup' => true, .... -=== Define if config.php is read only +=== Define if config.php is read-only In certain environments it is desired to have a read-only configuration file. When this switch is set to `true` ownCloud will not verify whether the @@ -1097,13 +1059,13 @@ process. === Define ownCloud operation modes This defines the mode of operations. The default value is `single-instance` -which means, that ownCloud is running on a single node, which might be the -most common operations mode. The only other possible value for now is -`clustered-instance` which means, that ownCloud is running on at least 2 +which means that ownCloud is running on a single node, which might be the +most common operating mode. The only other possible value for now is +`clustered-instance` which means that ownCloud is running on at least 2 nodes. The mode of operations has various impacts on the behavior of ownCloud. -The primary impact is, that clustered instances won't download apps from the -marketplace and install in one server. Instead the admin has to ensure that +The primary impact is that clustered instances won't download apps from the +marketplace and install in one server. Instead, the admin has to ensure that this happens manually on all servers. The same applies to config.php configuration settings done via `occ`. @@ -1120,8 +1082,8 @@ These parameters configure the logging options. For additional information or advanced configuration, please see the logging section in the documentation. -=== Define the log type -By default the ownCloud logs are sent to the `owncloud.log` file in the +=== Define the log type, +By default, the ownCloud logs are sent to the `owncloud.log` file in the default ownCloud data directory. If syslogging is desired, set this parameter to `syslog`. @@ -1175,7 +1137,7 @@ The default value is `ownCloud`. === Define the syslog format The syslog format can be changed to remove or add information. -In addition to the %replacements% below %level% can be used, but it is used +In addition to the %replacements% below, %level% can be used, but it is used as a dedicated parameter to the syslog logging facility anyway. ==== Code Sample @@ -1187,17 +1149,17 @@ as a dedicated parameter to the syslog logging facility anyway. === Define log conditions Log condition for log level increase based on conditions. Once one of these -conditions is met, the required log level is set to debug. This allows to -debug specific requests, users or apps +conditions is met, the required log level is set to debug. This allows +debugging specific requests, users, or apps Supported conditions: - `shared_secret`: If a request parameter with the name `log_secret` is set to - this value the condition is met + this value, the condition is met - `users`: If the current request is done by one of the specified users, this condition is met - `apps`: If the log message is invoked by one of the specified apps, this condition is met -- `logfile`: The log message invoked by the specified apps get redirected to +- `logfile`: The log message invoked by the specified apps gets redirected to this logfile, this condition is met Note: Not applicable when using syslog @@ -1262,8 +1224,8 @@ Log successful cron runs. === Define the maximum log rotation file size Enables log rotation and limits the total size of the logfiles. -The default is 0 or false which disables log rotation. -Specify a size in bytes, for example 104857600 +The default is 0 or false, which disables log rotation. +Specify a size in bytes, for example, 104857600 (100 megabytes = 100 * 1024 * 1024 bytes). A new logfile is created with a new name when the old logfile reaches the defined limit. If a rotated log file is already present, it will be overwritten. @@ -1294,7 +1256,7 @@ The configuration example shows how to add a second directory, called `/apps-ext Here, new apps and updates are only written to the `/apps-external` directory. This eases upgrade procedures of owncloud where shipped apps are delivered to apps/ by default. `OC::$SERVERROOT` points to the web root of your instance. -Please see the Apps Management description on how to move custom apps properly. +Please see the Apps' Management description on how to move custom apps properly. ==== Code Sample @@ -1343,7 +1305,7 @@ Location of the thumbnails folder, defaults to `data/$user/thumbnails` where `$previews_path/$user` where `$previews_path` is the configured previews base directory and `$user` will be substituted with the user id automatically. -For example if `previews_path` is `/var/cache/owncloud/thumbnails` then for a logged-in +For example, if `previews_path` is `/var/cache/owncloud/thumbnails`, then for a logged-in user `user1` the thumbnail path will be `/var/cache/owncloud/thumbnails/user1`. ==== Code Sample @@ -1389,7 +1351,7 @@ original size. A value of `1` or `null` disables scaling. .... === Define the maximum preview filesize limit -Max file size for generating image previews with imagegd (default behaviour) +Max file size for generating image previews with imagegd (default behavior) If the image is bigger, it will try other preview generators, but will most likely show the default mimetype icon @@ -1455,7 +1417,7 @@ The following providers are enabled by default if no other providers are selecte - OC\Preview\MP3 - OC\Preview\TXT -See the Previews Configuration documentation for more details. +See the Preview Configuration documentation for more details. ==== Code Sample @@ -1487,7 +1449,7 @@ It defaults to -1 which is equivalent to approximately 75% of the original image quality. Note that any value over 80 may result in an unnecessary increase of the -displayed image and has larger responses sizes when requesting images, +displayed image and has larger response sizes when requesting images, without much increase of the image quality. For more information see: @@ -1590,13 +1552,13 @@ Available cache backends: Advice on choosing between the various backends: * APCu should be easiest to install. Almost all distributions have packages. - Use this for single user environment for all caches. + Use this for a single-user environment for all caches. * Use Redis or Memcached for distributed environments. For the local cache (you can configure two) take APCu. -=== Memory caching backend for locally stored data +=== Memory-caching backend for locally stored data -* Used for host-specific data, e.g. file paths +* Used for host-specific data, e.g., file paths ==== Code Sample @@ -1607,14 +1569,14 @@ Advice on choosing between the various backends: === Memory caching backend for distributed data -* Used for installation-specific data, e.g. database caching +* Used for installation-specific data, e.g., database caching * If unset, defaults to the value of memcache.local ==== Code Sample [source,php] .... -'memcache.distributed' => '\OC\Memcache\Memcached', +'memcache.distributed' => '\OC\Memcache\Redis', .... === Define Redis connection details @@ -1652,7 +1614,7 @@ See http://redis.io/topics/security for more information. === Define Redis Cluster connection details Only for use with Redis Clustering, for Sentinel-based setups use the single -server configuration above, and perform HA on the hostname. +server configuration above and perform HA on the hostname. Redis Cluster support requires the php module phpredis in version 3.0.0 or higher. @@ -1790,7 +1752,7 @@ filesystem instead of the database to keep the share information. .... === Allow schema fallback for federated sharing servers -When talking with federated sharing server, allow falling back to HTTP +When talking with a federated sharing server, allow falling back to HTTP instead of hard forcing HTTPS ==== Code Sample @@ -1802,7 +1764,7 @@ instead of hard forcing HTTPS === Show a quick action for the public link creation Set this to true to display a quick action for creating public links -in the filelist. A public link created this way will be read-only per default. +in the file list. A public link created this way will be read-only per default. Note: if enforced password protection for read-only links is enabled, the quick action will not be displayed! @@ -1817,7 +1779,7 @@ quick action will not be displayed! == All other configuration options === Define additional database driver options -Additional driver options for the database connection, e.g. to enable SSL +Additional driver options for the database connection, e.g., to enable SSL encryption in MySQL or specify a custom wait timeout on a cheap hoster. ==== Code Sample @@ -1845,7 +1807,7 @@ can be 'WAL' or 'DELETE' see for more details https://www.sqlite.org/wal.html During setup, if requirements are met (see below), this setting is set to true and MySQL can handle 4 byte characters instead of 3 byte characters. -If you want to convert an existing 3-byte setup into a 4-byte setup please +If you want to convert an existing 3-byte setup into a 4-byte setup, please set the parameters in MySQL as mentioned below and run the migration command: `{occ-command-example-prefix} db:convert-mysql-charset` The config setting will be set automatically after a successful run. @@ -1884,7 +1846,7 @@ https://titanwolf.org/Network/Articles/Article?AID=58c487d4-7e0f-4fbe-9262-42855 === Force a specific database platform class False means that autodetection will take place. -E.g. to fix MariaDB 1.2.7+ taken for MySQL +E.g., to fix MariaDB 1.2.7+ taken for MySQL 'db.platform' => '\Doctrine\DBAL\Platforms\MariaDb1027Platform', See: @@ -1976,13 +1938,13 @@ WARNING: USE THIS ONLY IF YOU KNOW WHAT YOU ARE DOING. .... === Define excluded directories -Exclude specific directory names and disallow scanning, creating and renaming +Exclude specific directory names and disallow scanning, creating, and renaming using these names. The matching is case-insensitive. Excluded directory names are queried at any path part like at the beginning, -in the middle or at the end and will not be further processed if found. +in the middle, or at the end and will not be further processed if found. Please see the documentation for details and examples. -Use when the storage backend supports, e.g. snapshot directories to be excluded. +Use when the storage backend supports, e.g., snapshot directories to be excluded. WARNING: USE THIS ONLY IF YOU KNOW WHAT YOU ARE DOING. @@ -1998,13 +1960,13 @@ WARNING: USE THIS ONLY IF YOU KNOW WHAT YOU ARE DOING. === Define excluded directories regular expression(s) Exclude directory names that match any of the given regular expressions and -disallow scanning, creating and renaming using these names. The matching is +disallow scanning, creating, and renaming using these names. The matching is case-insensitive. Excluded directory names are queried at any path part like at the beginning, -in the middle or at the end and will not be further processed if found. +in the middle, or at the end and will not be further processed if found. Please see the documentation for details and examples. -Use when the storage backend supports, e.g. snapshot directories to be excluded. +Use when the storage backend supports, e.g., snapshot directories to be excluded. WARNING: USE THIS ONLY IF YOU KNOW WHAT YOU ARE DOING. @@ -2039,8 +2001,8 @@ Exclude files from the integrity checker command The list of apps that are allowed and must not have a signature.json file present. Besides ownCloud apps, this is particularly useful when creating ownCloud themes, -because themes are treated as apps. The app is identified with it´s app-id. -The app-id can be identified by the folder name of the app in your apps directory. +because themes are treated as apps. The app is identified with its app-id. +The app-id can be identified by the folder name of the app in your apps' directory. The following example allows app-1 and theme-2 to have no signature.json file. ==== Code Sample @@ -2096,7 +2058,7 @@ As shipped, the value here is the oldest desktop client that is technically compatible with the server. The version number seen here does not imply official support or test coverage on behalf of ownCloud. -NOTE: Lowering this value may lead to unexpected behaviour, and can include data loss. +NOTE: Lowering this value may lead to unexpected behavior and can include data loss. ==== Code Sample @@ -2154,10 +2116,10 @@ This config value avoids infinite loops for seldom cases where a file renaming conflict between different share backends could occur. The value defines how many unsuccessful mountpoint rename attempts are allowed. -e.g. target mountpoint name could be claimed as unused by the filesystem but +e.g. target mountpoint name could be claimed as unused by the filesystem, but renaming to this target name will fail due to some other reasons like database constraints. -Change this value only under supervision of ownCloud support. +Change this value only under the supervision of ownCloud support. ==== Code Sample @@ -2166,10 +2128,10 @@ Change this value only under supervision of ownCloud support. 'filesystem.max_mountpoint_move_attempts' => 10, .... -=== Define where part files are located -By default ownCloud will store the part files created during upload in the +=== Define where part files are located, +By default, ownCloud will store the part files created during upload in the same storage as the upload target. Setting this to false will store the part -files in the root of the user's folder which might be required to work with certain +files in the root of the user's folder, which might be required to work with certain external storage setups that have limited rename capabilities. Note that setting this to false causes issues with the following apps: Encryption, @@ -2194,9 +2156,9 @@ filesystem for all storage. .... === Define ownClouds internal secret -Secret used by ownCloud for various purposes, e.g. to encrypt data. +Secret used by ownCloud for various purposes, e.g., to encrypt data. -If you lose this string there will be data corruption. +If you lose this string, there will be data corruption. ==== Code Sample @@ -2207,7 +2169,7 @@ If you lose this string there will be data corruption. === Define list of trusted proxy servers -If you configure these also consider setting `forwarded_for_headers` which +If you configure these, also consider setting `forwarded_for_headers` which otherwise defaults to `HTTP_X_FORWARDED_FOR` (the `X-Forwarded-For` header). ==== Code Sample @@ -2240,10 +2202,10 @@ If not set, defaults to 'HTTP_X_FORWARDED_FOR'. ], .... -=== Define the maximum filesize for animated GIF´s -Max file size for animating gifs on public-sharing-site. +=== Define the maximum filesize for animated GIFs +Max file size for animating GIFs on public-sharing-site. -If the gif is bigger, it'll show a static preview. +If the GIF is bigger, it'll show a static preview. Value represents the maximum filesize in megabytes. Default is `10`. Set to `-1` for no limit. @@ -2283,7 +2245,7 @@ If not set this defaults to either 1 hour or the php max_execution_time, whichev 'filelocking.ttl' => 3600, .... -=== Define the memory caching backend for file locking +=== Define the memory-caching backend for file locking Because most memcache backends can clean values without warning, using redis is highly recommended to *avoid data loss*. @@ -2295,8 +2257,8 @@ using redis is highly recommended to *avoid data loss*. 'memcache.locking' => '\\OC\\Memcache\\Redis', .... -=== Disable the web based updater -The web based updater is enabled by default. +=== Disable the web-based updater +The web-based updater is enabled by default. ==== Code Sample @@ -2305,16 +2267,6 @@ The web based updater is enabled by default. 'upgrade.disable-web' => false, .... -=== Explicitly enable the web updater - used by /updater/ -By default, it is disabled. - -==== Code Sample - -[source,php] -.... -'web-updater.enabled' => false, -.... - === Define whether to enable automatic update of market apps Set to `false` to disable. @@ -2332,7 +2284,7 @@ This will disable the minifier and outputs some additional debug information WARNING: Be warned that, if you set this to `true`, exceptions display stack traces on the web interface, *including passwords*, — **in plain text!**. -Furthermore the content-disposition header will be lost and thus files will be +Furthermore, the content-disposition header will be lost, and thus files will be displayed in the browser rather than downloaded. We strongly encourage you never to use it in production. @@ -2345,7 +2297,7 @@ We strongly encourage you never to use it in production. === Define the data-fingerprint of the current data served This is a property used by the clients to find out if a backup has been -restored on the server. Once a backup is restored run +restored on the server. Once a backup is restored, run {occ-command-example-prefix} maintenance:data-fingerprint To set this to a new value. @@ -2364,7 +2316,7 @@ This entry is just here to show a warning in case somebody copied the sample con WARNING: DO NOT ADD THIS SWITCH TO YOUR CONFIGURATION! -If you, brave person, have read until here be aware that you should not +If you, brave person, have read until here, be aware that you should not modify *ANY* settings in this file without reading the documentation. ==== Code Sample @@ -2420,8 +2372,8 @@ For details see: https://datatracker.ietf.org/doc/html/rfc4918#section-10.2 .... === Show the grace period popup -Decide whether show or not the grace period popup. There is no change in the -behaviour of the grace period. +Decide whether to show the grace period popup or not. There is no change in the +behavior of the grace period. ==== Code Sample @@ -2430,7 +2382,7 @@ behaviour of the grace period. 'grace_period.demo_key.show_popup' => true, .... -=== Link to get a demo key during active grace period +=== Link to get a demo key during the active grace period The admin will be directed to that web page when they click on the "get a demo key" link in the grace period popup. It's expected that the web page contains instructions on how to get a valid demo key to be used in the ownCloud server. @@ -2447,7 +2399,7 @@ If this key isn't present, ownCloud's default will be used. === Order of login policies The order of the login policies that will be checked, if any. -Policies must be registered in order to use / activate them. This is usually +Policies must be registered to use / activate them. This is usually done automatically by core or the app containing the policy. The names of the policies must be documented if they come from an app. @@ -2455,7 +2407,7 @@ ownCloud core provides the following list of policies: - 'OC\Authentication\LoginPolicies\GroupLoginPolicy' -In order to use / activate the policy, include the name in the policy +To use / activate the policy, include the name in the policy order below, such as: 'loginPolicy.order' => ['OC\Authentication\LoginPolicies\GroupLoginPolicy'], @@ -2510,7 +2462,7 @@ Each login type can have a list of groups that will be the ones only allowed to log in using that login type, and also a list of groups that will be rejected from using that login type. Note that this applies to users belonging to those groups. If a user -is member of an "allowOnly" group and also of a "reject" group, +is a member of an "allowOnly" group and also of a "reject" group, the "reject" will take priority, so the user won't be able to log in using that login type. From 345cceeba38126e63654a14b86fcaaff3c523420 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Fri, 12 Jun 2026 12:48:09 +0200 Subject: [PATCH 36/38] more fixes (last one: external sites) --- .../server/custom_client_repos.adoc | 32 +--- .../server/email_configuration.adoc | 146 +++++++++--------- .../server/excluded_blacklisted_files.adoc | 80 +++------- .../configuration/server/external_sites.adoc | 48 ++---- .../installation/mount_folder_structure.adoc | 9 +- 5 files changed, 121 insertions(+), 194 deletions(-) diff --git a/modules/admin_manual/pages/configuration/server/custom_client_repos.adoc b/modules/admin_manual/pages/configuration/server/custom_client_repos.adoc index b0b37c8dc..c93e9bfa3 100644 --- a/modules/admin_manual/pages/configuration/server/custom_client_repos.adoc +++ b/modules/admin_manual/pages/configuration/server/custom_client_repos.adoc @@ -1,32 +1,12 @@ = Custom Client Download Repositories -You may configure the URLs to your own download repositories for your -ownCloud desktop clients and mobile apps in config/config.php. This -example shows the default download locations: +You may configure the URLs to your own download repositories for your ownCloud desktop clients and mobile apps in config/config.php. This example shows the default download locations: -[source,php] +[source,.env] ---- - "https://owncloud.com/desktop-app/", - "customclient_android" => "https://play.google.com/store/apps/details?id=com.owncloud.android", - "customclient_ios" => "https://itunes.apple.com/us/app/owncloud/id543672169?mt=8", +OWNCLOUD_CUSTOMCLIENT_DESKTOP='https://owncloud.com/desktop-app/' +OWNCLOUD_CUSTOMCLIENT_ANDROID='https://play.google.com/store/apps/details?id=com.owncloud.android' +OWNCLOUD_CUSTOMCLIENT_IOS='https://itunes.apple.com/us/app/owncloud/id543672169?mt=8' ---- -Simply replace the URLs with the links to your own preferred download -repos. - -You may test alternate URLs without editing config/config.php by setting -a test URL as an environment variable: - -[source,bash] ----- -export OCC_UPDATE_URL=https://test.example.com ----- - -When you’re finished testing you can disable the environment variable: - -[source,bash] ----- -unset OCC_UPDATE_URL ----- +Simply replace the URLs with the links to your own preferred download repos. diff --git a/modules/admin_manual/pages/configuration/server/email_configuration.adoc b/modules/admin_manual/pages/configuration/server/email_configuration.adoc index bea107c21..55965da67 100644 --- a/modules/admin_manual/pages/configuration/server/email_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/email_configuration.adoc @@ -28,6 +28,8 @@ To configure ownCloud to interact with an SMTP server, you can either update `co You need the following information from your email server administrator to connect ownCloud to a remote SMTP server: +image:configuration/server/email-configuration/smtp-config-smtp.png[image, width=350] + * Encryption type: `None`, `SSL/TLS` or `STARTTLS`. * The From address you want your outgoing ownCloud mails to use. * Whether authentication is required. @@ -35,8 +37,6 @@ You need the following information from your email server administrator to conne * The server’s IP address or fully-qualified domain name (FQDN). * Login credentials, if required. -image:configuration/server/email-configuration/smtp-config-smtp.png[image] - Your changes are saved immediately. You must enter a valid email address to which a test email will be sent. This field is mandatory and will be prefilled with the logged-in admin's email if set, but can be changed to any other valid email address. Note that this test recipient address can't be set via a config value in `config.php`. Click the btn:[Send Email] button to test your configuration. This sends a test message to the email address you configured. The test message says: @@ -49,24 +49,24 @@ ownCloud web services under your control ---- -=== Configuring PHP for sending Emails +=== Configuring PHP for Sending Emails To configure PHP select it and enter your desired return address. -image:configuration/server/email-configuration/smtp-config-php.png[image] +image:configuration/server/email-configuration/smtp-config-php.png[image, width=350] Same as with the SMTP configuration above, you must enter an email address to which a test email will be sent when testing the configuration. For details see the section above. NOTE: PHP mode uses your local `sendmail` binary and any drop-in Sendmail replacement such as Postfix, Exim, or Courier. All of these include a `sendmail` binary, and are freely interchangeable. Use this if you want to use `php.ini` to control some of your mail server functions, such as setting _paths_, _headers_, or passing extra command options to the `sendmail` binary. These vary depending on which server you are using, so consult your server’s documentation to see what your options are. -== Setting Mail Server Parameters via config.php +== Setting Mail Server Parameters via Environment Variables -If you prefer, you may set your email server parameters directly in `config/config.php`. +If you prefer, you may set your email server parameters via environment variables. -=== Supported SMTP sending modes +=== Supported SMTP Sending Modes -* xref:configuration/server/email_configuration.adoc#smtp[SMTP] -* xref:configuration/server/email_configuration.adoc#php-mail[PHP Mail] +* xref:smtp[SMTP] +* xref:php-mail[PHP Mail] IMPORTANT: Compatibility of _sending modes_ might depend on the installation environment. In case of problems with a _sending mode_, it is recommended to try other mode configurations. @@ -74,105 +74,108 @@ IMPORTANT: Compatibility of _sending modes_ might depend on the installation env If you want to send email using a local or remote SMTP server it is necessary to enter the name or IP address of the server, optionally followed by a colon and port number, e.g. *:425*. If this value is not given the default port `25/tcp` will be used unless you change that by modifying the *mail_smtpport* parameter. Multiple servers can be entered, separated by semicolons: -[source,php] +[source,.env] ---- -'mail_smtpmode' => 'smtp', -'mail_smtphost' => 'smtp-1.server.dom;smtp-2.server.dom:425', -'mail_smtpport' => 25, +OWNCLOUD_MAIL_SMTP_MODE=smtp +OWNCLOUD_MAIL_SMTP_HOST='smtp-1.server.dom;smtp-2.server.dom:425' +OWNCLOUD_MAIL_SMTP_PORT=25 ---- Or: -[source,php] +[source,.env] ---- -'mail_smtpmode' => 'smtp', -'mail_smtphost' => 'smtp.server.dom', -'mail_smtpport' => 425, +OWNCLOUD_MAIL_SMTP_MODE=smtp +OWNCLOUD_MAIL_SMTP_HOST='smtp.server.dom' +OWNCLOUD_MAIL_SMTP_PORT=425 ---- If a malware or SPAM scanner is running on the SMTP server it might be necessary that you increase the SMTP timeout to e.g., 30s: -[source,php] +[source,.env] ---- -'mail_smtptimeout' => 30, +OWNCLOUD_MAIL_SMTP_TIMEOUT=30 ---- If the SMTP server accepts insecure connections, the default setting can be used: -[source,php] +[source,.env] ---- -'mail_smtpsecure' => '', +OWNCLOUD_MAIL_SMTP_SECURE= ---- If the SMTP server only accepts secure connections you can choose between the following two variants: -SSL/TLS -+++++++ - +SSL/TLS:: ++ +-- A secure connection will be initiated using SSL/TLS via SMTPS on the default port `465/tcp`: -[source,php] +[source,.env] ---- -'mail_smtphost' => 'smtp.server.dom:465', -'mail_smtpsecure' => 'ssl', +OWNCLOUD_MAIL_SMTP_HOST='smtp.server.dom:465' +OWNCLOUD_MAIL_SMTP_SECURE=ssl ---- +-- -STARTTLS -++++++++ - +STARTTLS:: ++ +-- A secure connection will be initiated using STARTTLS via SMTP on the default port `25/tcp`: -[source,php] +[source,.env] ---- -'mail_smtphost' => 'smtp.server.dom', -'mail_smtpsecure' => 'tls', +OWNCLOUD_MAIL_SMTP_HOST=smtp.server.dom +OWNCLOUD_MAIL_SMTP_SECURE=tls ---- An alternative is the port `587/tcp` (recommended): -[source,php] +[source,.env] ---- -'mail_smtphost' => 'smtp.server.dom:587', -'mail_smtpsecure' => 'tls', +OWNCLOUD_MAIL_SMTP_HOST='smtp.server.dom:587' +OWNCLOUD_MAIL_SMTP_SECURE=tls ---- +-- -Authentication -++++++++++++++ - +Authentication:: ++ +-- And finally it is necessary to configure if the SMTP server requires authentication, if not, the default values can be taken as is. -[source,php] +[source,.env] ---- -'mail_smtpauth' => false, -'mail_smtpname' => '', -'mail_smtppassword' => '', +OWNCLOUD_MAIL_SMTP_AUTH=false +OWNCLOUD_MAIL_SMTP_NAME= +OWNCLOUD_MAIL_SMTP_PASSWORD= ---- If SMTP authentication is required you have to set the required username and password and can optionally choose between the authentication types *LOGIN* (default) or *PLAIN*. -[source,php] +[source,.env] ---- -'mail_smtpauth' => true, -'mail_smtpauthtype' => 'LOGIN', -'mail_smtpname' => 'username', -'mail_smtppassword' => 'password', +OWNCLOUD_MAIL_SMTP_AUTH=true +OWNCLOUD_MAIL_SMTP_AUTH_TYPE=LOGIN +OWNCLOUD_MAIL_SMTP_NAME='username' +OWNCLOUD_MAIL_SMTP_PASSWORD='password' ---- +-- ==== PHP Mail If you want to use PHP mail it is necessary to have an installed and working email system on your server. Which program in detail is used to send email is defined by the configuration settings in the *php.ini* file. On *nix systems this will most likely be Sendmail. ownCloud should be able to send email out of the box. -[source,php] +[source,.env] ---- -'mail_smtpmode' => 'php', -'mail_smtphost' => '127.0.0.1', -'mail_smtpport' => 25, -'mail_smtptimeout' => 10, -'mail_smtpsecure' => '', -'mail_smtpauth' => false, -'mail_smtpauthtype' => 'LOGIN', -'mail_smtpname' => '', -'mail_smtppassword' => '', +OWNCLOUD_MAIL_SMTP_MODE=php +OWNCLOUD_MAIL_SMTP_HOST='127.0.0.1' +OWNCLOUD_MAIL_SMTP_PORT=25 +OWNCLOUD_MAIL_SMTP_TIMEOUT=10 +OWNCLOUD_MAIL_SMTP_SECURE= +OWNCLOUD_MAIL_SMTP_AUTH=false +OWNCLOUD_MAIL_SMTP_AUTH_TYPE=LOGIN +OWNCLOUD_MAIL_SMTP_NAME= +OWNCLOUD_MAIL_SMTP_PASSWORD= ---- == Send a Test Email @@ -187,20 +190,20 @@ When using self-signed certificates on the remote SMTP server, the certificate m If you are unable to send email, try turning on debugging. Do this by enabling the `mail_smtpdebug parameter` in `config/config.php`. -[source,php] +[source,.env] ---- -'mail_smtpdebug' => true, +OWNCLOUD_MAIL_SMTP_DEBUG=true ---- NOTE: Immediately after pressing the *Send email* button, as described before, several *SMTP -> get_lines(): …* messages appear on the screen. This is expected behavior and can be ignored. -=== Why is my web domain different from my mail domain? +=== Why is my Web Domain Different From my Mail Domain? The default domain name used for the sender address is the hostname where your ownCloud installation is served. If you have a different mail domain name you can override this behavior by setting the following configuration parameter: [source,php] ---- -'mail_domain' => 'example.com', +OWNCLOUD_MAIL_DOMAIN='example.com' ---- This setting results in every email sent by ownCloud (for example, the password reset email) having the domain part of the sender address appear as follows @@ -209,7 +212,7 @@ This setting results in every email sent by ownCloud (for example, the password no-reply@example.com ---- -=== How can I find out if an SMTP server is reachable? +=== How can I Find out if an SMTP Server is Reachable? Use the ping command to check the server availability @@ -223,7 +226,7 @@ PING smtp.server.dom (ip-address) 56(84) bytes of data. 64 bytes from your-server.local.lan (192.168.1.10): icmp_req=1 ttl=64 time=3.64ms ---- -=== How can I find out if the SMTP server is listening on a specific TCP port? +=== How can I Find out if the SMTP Server is Listening on a Specific TCP Port? The best way to get mail server information is to ask your mail server admin. If you are the mail server admin, or need information in a hurry, you can use the `netstat` command. This example shows all active servers on your system, and the ports they are listening on. The SMTP server is listening on localhost port 25. @@ -248,12 +251,11 @@ tcp 0 0 127.0.0.1:{std-port-mysql} 0.0.0.0:* LISTEN 1524/my * 993/tcp/udp is encrypted imaps * 995/tcp/udp is encrypted pop3s -=== How can I determine if the SMTP server supports SMTPS? +=== How can I Determine if the SMTP Server Supports SMTPS? -A good indication that the SMTP server supports SMTPS is that it is -listening on port *465*. +A good indication that the SMTP server supports SMTPS is that it is listening on port *465*. -=== How can I determine what authorization and encryption protocols the mail server supports? +=== How can I Determine What Authorization and Encryption Protocols the Mail Server Supports? SMTP servers usually announce the availability of STARTTLS immediately after a connection has been established. You can easily check this using the `telnet` command. @@ -286,9 +288,9 @@ Connection closed by foreign host. If you are unable to send email, it might be useful to activate further debug messages by enabling the `mail_smtpdebug` parameter: -[source,php] +[source,.env] ---- -'mail_smtpdebug' => true, +OWNCLOUD_MAIL_SMTP_DEBUG=true ---- NOTE: Immediately after pressing the btn:[Send email] button, as described before, several *SMTP -> get_lines(): …* messages appear on the screen. This is expected behavior and can be ignored. @@ -300,7 +302,7 @@ NOTE: You have to install and enable a custom theme in order to use and customiz Most emails sent from ownCloud are based on editable email templates, which are a mixture of PHP and HTML. The currently available templates are: [cols="40%,15%,40%,50%",options="header",] -|======================================================================= +|=== | Email | Format | Description @@ -345,7 +347,7 @@ Most emails sent from ownCloud are based on editable email templates, which are | plain text | | `core/templates/internalaltmail.php` -|======================================================================= +|=== The templates are written in PHP and HTML, and are already loaded with the relevant variables such as _username_, _share links_, and _filenames_. You can, if you are careful, edit these — even without knowing PHP or HTML. Don’t touch any of the code, but it’s OK to edit the text portions of the messages. diff --git a/modules/admin_manual/pages/configuration/server/excluded_blacklisted_files.adoc b/modules/admin_manual/pages/configuration/server/excluded_blacklisted_files.adoc index a26b1537a..b2ae781a0 100644 --- a/modules/admin_manual/pages/configuration/server/excluded_blacklisted_files.adoc +++ b/modules/admin_manual/pages/configuration/server/excluded_blacklisted_files.adoc @@ -8,71 +8,47 @@ This document describes how to manage blacklisted files and excluded directories == Definitions of terms Blacklisted:: -Files that may harm the ownCloud environment like a foreign `.htaccess` file. -Blacklisting prevents anyone from uploading blacklisted files to the ownCloud server. +Files that may harm the ownCloud environment like a foreign `.htaccess` file. Blacklisting prevents anyone from uploading blacklisted files to the ownCloud server. Excluded:: -Existing directories on your ownCloud server, including directories on external storage mounts, -that are excluded from being processed by ownCloud. In effect they are invisible to ownCloud. +Existing directories on your ownCloud server, including directories on external storage mounts, that are excluded from being processed by ownCloud. In effect they are invisible to ownCloud. -Both types are defined in `config.php`. Blacklisted files and excluded directories are not scanned -by ownCloud, not viewed, not synced, and cannot be created, renamed, deleted, or accessed via direct -path input from a file manager. Even when a filepath is entered manually via a file explorer, -the path cannot be accessed. +Both types are defined in `config.php`. Blacklisted files and excluded directories are not scanned by ownCloud, not viewed, not synced, and cannot be created, renamed, deleted, or accessed via direct path input from a file manager. Even when a filepath is entered manually via a file explorer, the path cannot be accessed. -For example configurations please see the -xref:configuration/server/config_sample_php_parameters.adoc[config.sample.php] file. +For example configurations please see the xref:configuration/server/config_sample_php_parameters.adoc[config.sample.php] file. + +Use the environment variables: `OWNCLOUD_BLACKLISTED_FILES` and `OWNCLOUD_EXCLUDED_DIRECTORIES` to configure them. [NOTE] ==== -Many filesystems do not allow the coexistence of a file and folder with exactly the same name on the same -directory level. Therefore no differentiation is made in processing files and folders for blacklisting or -excluding, as it would just return a deny at a later stage. With the implementation made, you get an immediate -error message. - -Example: The storage backend has a reserved directory name ".snapshot" which is excluded by configuration. -If you try to add a file or folder via the browser or sync a file or folder from the client named ".snapshot", -you will get an immediate ownCloud triggered deny. +Many filesystems do not allow the coexistence of a file and folder with exactly the same name on the same directory level. Therefore no differentiation is made in processing files and folders for blacklisting or excluding, as it would just return a deny at a later stage. With the implementation made, you get an immediate error message. + +Example: The storage backend has a reserved directory name ".snapshot" which is excluded by configuration. If you try to add a file or folder via the browser or sync a file or folder from the client named ".snapshot", you will get an immediate ownCloud triggered deny. ==== == Impact on System Performance -If you have a filesystem mounted with 200,000 files and directories and 15 snapshots in rotation, you would -now scan and process 200,000 elements plus 200,000 x 15 = 3,000,000 elements additionally. These additional -3,000,000 elements, 15 times more than the original quantity, would also be available for viewing and -synchronisation. Because this is a big and unnecessary overhead, most times confusing to clients, further -processing can be eliminated by using excluded directories. +If you have a filesystem mounted with 200,000 files and directories and 15 snapshots in rotation, you would now scan and process 200,000 elements plus 200,000 x 15 = 3,000,000 elements additionally. These additional 3,000,000 elements, 15 times more than the original quantity, would also be available for viewing and synchronisation. Because this is a big and unnecessary overhead, most times confusing to clients, further processing can be eliminated by using excluded directories. == Blacklisted Files -By default, ownCloud blacklists the file `.htaccess` to secure the running instance, which is important -when using Apache as webserver. A foreign `.htaccess` file could overwrite rules defined by ownCloud. -There is no explicit need to enter the file name `.htaccess` as parameter to the `blacklisted_files` array -in `config.php`, but you can add more blacklisted file names if necessary. You can also prevent uploading, -e.g., Outlook .pst files, with this mechanism to avoid massive backend space allocation. +By default, ownCloud blacklists the file `.htaccess` to secure the running instance, which is important when using Apache as webserver. A foreign `.htaccess` file could overwrite rules defined by ownCloud. There is no explicit need to enter the file name `.htaccess` as parameter to the `blacklisted_files` array in `config.php`, but you can add more blacklisted file names if necessary. You can also prevent uploading, e.g., Outlook .pst files, with this mechanism to avoid massive backend space allocation. == Excluded Directories === Reasons for Excluding Directories -. Enterprise storage systems, or special filesystems like ZFS and BtrFS are capable of snapshots. - These snapshots are directories and keep point-in-time views of the data +. Enterprise storage systems, or special filesystems like ZFS and BtrFS are capable of snapshots. These snapshots are directories and keep point-in-time views of the data .. Snapshot directories are read-only -.. There is no common naming convention for these directories, and there most likely will never be. - For example, NetApp uses `.snapshot` and `~snapshot`, EMC e.g., `.ckpt`, HDS e.g., `.latest` and `~latest`, - and the ZFS filesystem uses `.zfs` -.. It does not make sense for these directories to be visible to users as they are used to ease backup, - restoration, and cloning +.. There is no common naming convention for these directories, and there most likely will never be. For example, NetApp uses `.snapshot` and `~snapshot`, EMC e.g., `.ckpt`, HDS e.g., `.latest` and `~latest`, and the ZFS filesystem uses `.zfs` +.. It does not make sense for these directories to be visible to users as they are used to ease backup, restoration, and cloning + . Directories which are part of the mounted filesystem, but must not be user accessible/visible . Manual managed but user invisible backup directories *Example:* -If you have a snapshot-capable storage or filesystem where snapshots are enabled and presented to clients, -each directory will contain a "special" visible directory named e.g. `.snapshot`. Depending on the -system, you may find underneath a list of snapshots taken and in the next lower level the complete set of -files and directories which were present when the snapshot was created. In most systems, this mechanism -is true in all directory levels: +If you have a snapshot-capable storage or filesystem where snapshots are enabled and presented to clients, each directory will contain a "special" visible directory named e.g. `.snapshot`. Depending on the system, you may find underneath a list of snapshots taken and in the next lower level the complete set of files and directories which were present when the snapshot was created. In most systems, this mechanism is true in all directory levels: ---- /.snapshot @@ -103,20 +79,14 @@ file_2 ... ---- -Example `excluded_directories` entries in `config.php` can look like this: +Example `excluded_directories` entries in `OWNCLOUD_EXCLUDED_DIRECTORIES` can look like this: -[source,php] +[source,.env] ---- -'excluded_directories' => [ - '.snapshot', - '~snapshot', - 'dir1', - 'dir2', -], +OWNCLOUD_EXCLUDED_DIRECTORIES='.snapshot','~snapshot','dir1','dir2' ---- -Note that these are not pathnames, but directory names without any -slashes. Excluding `dir1` excludes: +Note that these are not pathnames, but directory names without any slashes. Excluding `dir1` excludes: ---- /home/dir1 @@ -132,15 +102,11 @@ But not: === Reasons for Blacklisting Files -The reason for blacklisting files can be explained based on the example of a `.htaccess` file. -Such a file can lead to a unwanted behaviour of your webserver when visible to ownCloud in a directory. +The reason for blacklisting files can be explained based on the example of a `.htaccess` file. Such a file can lead to a unwanted behaviour of your webserver when visible to ownCloud in a directory. Example `blacklisted_files` entries in `config.php` can look like this: -[source,php] +[source,.env] ---- -'blacklisted_files' => [ - 'hosts', - 'evil_script.sh', -], +OWNCLOUD_BLACKLISTED_FILES='hosts','evil_script.sh' ---- diff --git a/modules/admin_manual/pages/configuration/server/external_sites.adoc b/modules/admin_manual/pages/configuration/server/external_sites.adoc index 44b977907..117cf5291 100644 --- a/modules/admin_manual/pages/configuration/server/external_sites.adoc +++ b/modules/admin_manual/pages/configuration/server/external_sites.adoc @@ -1,51 +1,27 @@ = Linking External Sites -You can embed external Web sites inside your ownCloud pages with the -External Sites app, as this screenshot shows. +You can embed external Web sites inside your ownCloud pages with the External Sites app, as this screenshot shows. -image:external-sites-1.png[Click to enlarge] +image:external-sites-1.png[External Sites, width=350] -This is useful for quick access to important Web pages such as the -ownCloud manuals and informational pages for your company, and for -presenting external pages inside your custom ownCloud branding, if you -use your own custom themes. +This is useful for quick access to important Web pages such as the ownCloud manuals and informational pages for your company, and for presenting external pages inside your custom ownCloud branding, if you use your own custom themes. -The External sites app is included in all versions of ownCloud. Go to -*Apps > Not Enabled* to enable it. Then go to your ownCloud Admin page -to create your links, which are saved automatically. There is a dropdown -menu to select an icon, but there is only one default icon so you don’t -have to select one. Hover your cursor to the right of your links to make -the trashcan icon appear when you want to remove them. +The External sites app is included in all versions of ownCloud. Go to *Apps > Not Enabled* to enable it. Then go to your ownCloud Admin page to create your links, which are saved automatically. There is a dropdown menu to select an icon, but there is only one default icon so you don’t have to select one. Hover your cursor to the right of your links to make the trashcan icon appear when you want to remove them. -image:external-sites-2.png[Click to enlarge] +image:external-sites-2.png[CExternal Sites, width=350] -The links appear in the ownCloud dropdown menu on the top left after -refreshing your page, and have globe icons. +The links appear in the ownCloud dropdown menu on the top left after refreshing your page, and have globe icons. -image:external-sites-3.png[image] +image:external-sites-3.png[image, width=350] -Your links may or may not work correctly due to the various ways that -Web browsers and Web sites handle HTTP and HTTPS URLs, and because the -External Sites app embeds external links in IFrames. Modern Web browsers -try very hard to protect Web surfers from dangerous links, and safety -apps like https://www.eff.org/privacybadger[Privacy Badger] and -ad-blockers may block embedded pages. It is strongly recommended to -enforce HTTPS on your ownCloud server; do not weaken this, or any of -your security tools, just to make embedded Web pages work. After all, -you can freely access them outside of ownCloud. +Your links may or may not work correctly due to the various ways that Web browsers and Web sites handle HTTP and HTTPS URLs, and because the External Sites app embeds external links in IFrames. Modern Web browsers try very hard to protect Web surfers from dangerous links, and safety apps like https://www.eff.org/privacybadger[Privacy Badger] and ad-blockers may block embedded pages. It is strongly recommended to enforce HTTPS on your ownCloud server; do not weaken this, or any of your security tools, just to make embedded Web pages work. After all, you can freely access them outside of ownCloud. -Most Web sites that offer login functionalities use the -`X-Frame-Options` or `Content-Security-Policy` HTTP header which -instructs browsers to not allow their pages to be embedded for security -reasons (e.g. "Clickjacking"). You can usually verify the reason why -embedding the website is not possible by using your browser’s console -tool. For example, this page has an invalid SSL certificate. +Most Web sites that offer login functionalities use the `X-Frame-Options` or `Content-Security-Policy` HTTP header which instructs browsers to not allow their pages to be embedded for security reasons (e.g. "Clickjacking"). You can usually verify the reason why embedding the website is not possible by using your browser’s console tool. For example, this page has an invalid SSL certificate. -image:external-sites-4.png[image] +image:external-sites-4.png[image, width=350] On this page, X-Frame-Options prevents the embedding. -image:external-sites-5.png[image] +image:external-sites-5.png[image, width=350] -There isn’t much you can do about these issues, but if you’re curious -you can see what is happening. +There isn’t much you can do about these issues, but if you’re curious you can see what is happening. diff --git a/modules/admin_manual/pages/installation/mount_folder_structure.adoc b/modules/admin_manual/pages/installation/mount_folder_structure.adoc index d1aedb347..061eaae60 100644 --- a/modules/admin_manual/pages/installation/mount_folder_structure.adoc +++ b/modules/admin_manual/pages/installation/mount_folder_structure.adoc @@ -14,10 +14,11 @@ This folder structure is important not only for knowign your data is located, bu ---- mount_point/ - apps/ <1> - - certs/ <4> + - certs/ <5> - config/ <2> - files/ <3> - - sessions/ <4> + - skeleton/ <4> + - sessions/ <5> ---- <1> The apps folder will contain ANY apps that will be added manually and are not automatically shipped by ownCloud. It matches xref: configuration/server/config_sample_php_parameters.adoc#define-alternative-app-directories[Define alternative app directories] aka the `apps-external` configuration of the config. @@ -32,4 +33,6 @@ IMPORTANT: Consider the alphabetic order the system is reading config files. Wit <3> The files folder matches the `data` directory with former ownCloud releases. -<4> Unused, present for legacy reasons. +<4> The directory holding custom skeleton files. + +<5> Unused, present for legacy reasons. From 70c24e4e556e8caca6595ebaf7d53eecdd0cf441 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Fri, 12 Jun 2026 17:01:21 +0200 Subject: [PATCH 37/38] more changes --- .../virus-scanner-support/antivirus-app.png | Bin 305055 -> 0 bytes .../clamav_daemon_socket.png | Bin 39627 -> 0 bytes .../clamav_executable.png | Bin 51851 -> 0 bytes .../configuration/server/harden_server.adoc | 91 ++++-------- .../configuration/server/import_ssl_cert.adoc | 50 +++---- .../server/index_php_less_urls.adoc | 10 +- .../server/language_configuration.adoc | 19 +-- .../server/legal_settings_configuration.adoc | 14 +- .../server/logging/logging_configuration.adoc | 74 ++++------ .../server/logging/request_tracing.adoc | 9 +- .../server/oc_server_tuning.adoc | 137 +++--------------- .../server/thirdparty_php_configuration.adoc | 25 ---- .../server/ui-configuration.adoc | 5 +- .../server/virus-scanner-support.adoc | 122 +++------------- .../installation/mount_folder_structure.adoc | 4 - .../manually-moving-data-folders.adoc | 37 ++--- modules/admin_manual/partials/nav.adoc | 1 - 17 files changed, 158 insertions(+), 440 deletions(-) delete mode 100644 modules/admin_manual/images/configuration/server/virus-scanner-support/antivirus-app.png delete mode 100644 modules/admin_manual/images/configuration/server/virus-scanner-support/clamav_daemon_socket.png delete mode 100644 modules/admin_manual/images/configuration/server/virus-scanner-support/clamav_executable.png delete mode 100644 modules/admin_manual/pages/configuration/server/thirdparty_php_configuration.adoc diff --git a/modules/admin_manual/images/configuration/server/virus-scanner-support/antivirus-app.png b/modules/admin_manual/images/configuration/server/virus-scanner-support/antivirus-app.png deleted file mode 100644 index 3490b2913cf2829cdf248b6c37e2fadf39df6af5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305055 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

B{yjf_LY8yA#OD-U~l>eCOYD5Jj8P^ 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 z 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 z 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 XVh7VOob$0~00000NkvXXu0mjfw*)$r diff --git a/modules/admin_manual/images/configuration/server/virus-scanner-support/clamav_daemon_socket.png b/modules/admin_manual/images/configuration/server/virus-scanner-support/clamav_daemon_socket.png deleted file mode 100644 index fec3645c68beb862525a3717fef7ef1147b29fa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39627 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

8ESI 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 B^JD-3 diff --git a/modules/admin_manual/pages/configuration/server/harden_server.adoc b/modules/admin_manual/pages/configuration/server/harden_server.adoc index c45f1f834..90606a835 100644 --- a/modules/admin_manual/pages/configuration/server/harden_server.adoc +++ b/modules/admin_manual/pages/configuration/server/harden_server.adoc @@ -136,26 +136,19 @@ Since Apache is included in the Docker image, HTTPS needs to be configured on th Note that the free https://www.ssllabs.com/ssltest/[Qualys SSL Labs Tests] gives good guidance on whether your SSL server is correctly configured. -== Use a dedicated domain for ownCloud +== Use a Dedicated Domain for ownCloud -Administrators are encouraged to install ownCloud on a dedicated domain -such as `cloud.domain.tld` instead of `domain.tld` to benefit -from the same-origin policy. +Administrators are encouraged to install ownCloud on a dedicated domain such as `cloud.domain.tld` instead of `domain.tld` to benefit from the same-origin policy. == Ensure that your ownCloud instance is installed in a DMZ -As ownCloud supports features such as Federated File Sharing, we do not -consider Server Side Request Forgery (SSRF) a threat. Given all our external storage adapters, this can be considered a feature and not a vulnerability. +As ownCloud supports features such as Federated File Sharing, we do not consider Server Side Request Forgery (SSRF) a threat. Given all our external storage adapters, this can be considered a feature and not a vulnerability. -This means that a user on your ownCloud instance could probe whether -other hosts are accessible from the ownCloud network. If you do not want -this, you need to ensure that your ownCloud is installed in a -segregated network and proper firewall rules are in place. +This means that a user on your ownCloud instance could probe whether other hosts are accessible from the ownCloud network. If you do not want this, you need to ensure that your ownCloud is installed in a segregated network and proper firewall rules are in place. == Use of Security-Related Headers on the Web server -Basic security headers are provided by ownCloud already in a default -environment. These include: +Basic security headers are provided by ownCloud already in a default environment. These include: `X-Content-Type-Options: nosniff`:: Instructs some browsers to not sniff the MIME type of files. This is used for example to prevent browsers from interpreting text files as JavaScript. @@ -183,22 +176,11 @@ Verify this security change by accessing a static resource and check the above m == Use Fail2ban -Another approach to hardening ownCloud server -is to use an intrusion detection system. An excellent -one is https://www.fail2ban.org/wiki/index.php/Main_Page[Fail2ban]. -Fail2ban is designed to protect servers from brute force attacks. It -works by scanning log files (such as those for _ssh_, _web_, _mail_, -and _log_ servers) for certain patterns, specific to each server, and -taking actions should those patterns be found. +Another approach to hardening ownCloud server is to use an intrusion detection system. An excellent one is https://www.fail2ban.org/wiki/index.php/Main_Page[Fail2ban]. Fail2ban is designed to protect servers from brute force attacks. It works by scanning log files (such as those for _ssh_, _web_, _mail_, and _log_ servers) for certain patterns, specific to each server, and taking actions should those patterns be found. -Actions include banning the IP from which the detected actions originate. This makes the process more difficult and prevents DDOS-style attacks. However, after a predefined time -period, the banned IP is usually unbanned again. +Actions include banning the IP from which the detected actions originate. This makes the process more difficult and prevents DDOS-style attacks. However, after a predefined time period, the banned IP is usually unbanned again. -This helps if the login attempts were genuine, so that users don’t lock -themselves out permanently. An example of such an action is users -attempting to brute force log in to a server via ssh. In this case, -Fail2ban would look for something similar to the following in -`/var/log/auth.log`: +This helps if the login attempts were genuine, so that users don’t lock themselves out permanently. An example of such an action is users attempting to brute force log in to a server via ssh. In this case, Fail2ban would look for something similar to the following in `/var/log/auth.log`: ---- Mar 15 11:17:37 yourhost sshd[10912]: input_userauth_request: invalid user audra [preauth] @@ -212,7 +194,7 @@ Mar 15 11:15:04 yourhost sshd[10837]: Received disconnect from 221.194.44.231: 1 NOTE: If you’re not familiar with what’s going on, this snippet highlights a number of failed login attempts. -=== Using Fail2ban to secure an ownCloud login +=== Using Fail2ban to Secure an ownCloud Login On Ubuntu, you can install Fail2ban using the following commands: @@ -222,30 +204,21 @@ apt update && apt upgrade apt install fail2ban ---- -Fail2ban installs several default filters for _Apache_ and -various other services, but none for ownCloud. Given that, we have to -define our own filter. To do so, you first need to make sure that -ownCloud uses your local timezone for writing log entries; otherwise, -fail2ban cannot react appropriately to attacks. To do this, edit your -`config.php` file and add the following line: +Fail2ban installs several default filters for _Apache_ and various other services, but none for ownCloud. Given that, we have to define our own filter. To do so, you first need to make sure that ownCloud uses your local timezone for writing log entries; otherwise, fail2ban cannot react appropriately to attacks. To do this, use the following environment variable: -[source,php] +[source,.env] ---- -'logtimezone' => 'Europe/Berlin', +OWNCLOUD_LOG_TIMEZONE='Europe/Berlin' ---- -NOTE: Adjust the timezone to the one that your server is located in, based on -{php-net-url}/manual/en/timezones.php[PHP’s list of supported timezones]. +NOTE: Adjust the timezone to the one that your server is located in, based on {php-net-url}/manual/en/timezones.php[PHP’s list of supported timezones]. -This change takes effect as soon as you save `config.php`. You can test -the change by: +This change takes effect as soon as you save `config.php`. You can test the change by: -1. entering false credentials at your ownCloud login screen, then -2. checking the timestamp of the resulting entry in ownCloud’s log -file. +. entering false credentials at your ownCloud login screen, then +. checking the timestamp of the resulting entry in ownCloud’s log file. -Next, define a new Fail2ban filter rule for ownCloud. To do so, create a -new file called `/etc/fail2ban/filter.d/owncloud.conf`, and insert the +Next, define a new Fail2ban filter rule for ownCloud. To do so, create a new file called `/etc/fail2ban/filter.d/owncloud.conf`, and insert the following configuration: [source,conf] @@ -255,9 +228,7 @@ failregex={.*Login failed: \'.*\' \(Remote IP: \'\'\)"} ignoreregex = ---- -This filter needs to be loaded when Fail2ban starts, so a further -configuration entry is required to be added in -`/etc/fail2ban/jail.d/defaults-debian.conf`, which you can see below: +This filter needs to be loaded when Fail2ban starts, so a further configuration entry is required to be added in `/etc/fail2ban/jail.d/defaults-debian.conf`, which you can see below: [source,conf] ---- @@ -273,12 +244,11 @@ logpath = /var/owncloud_data/owncloud.log This configuration: -1. Enables the filter rules for TCP requests on ports 80 and 443. -2. Bans IPs for 10800 seconds (3 hours). -3. Sets the path to the log file to analyze for malicious logins +. Enables the filter rules for TCP requests on ports 80 and 443. +. Bans IPs for 10800 seconds (3 hours). +. Sets the path to the log file to analyze for malicious logins -NOTE: The most important part of the configuration is the `logpath` parameter. -If this does not point to the correct log file, Fail2ban will either not work properly or refuse to start. +NOTE: The most important part of the configuration is the `logpath` parameter. If this does not point to the correct log file, Fail2ban will either not work properly or refuse to start. After saving the file, restart Fail2ban by running the following command: @@ -287,25 +257,21 @@ After saving the file, restart Fail2ban by running the following command: service fail2ban restart ---- -To test that the new ownCloud configuration has been loaded, use the -following command: +To test that the new ownCloud configuration has been loaded, use the following command: [source,bash] ---- fail2ban-client status ---- -If "owncloud" is listed in the console output, the filter is both -loaded and active. If you want to test the filter, run the following -command, adjusting the path to your `owncloud.log` if necessary: +If "owncloud" is listed in the console output, the filter is both loaded and active. If you want to test the filter, run the following command, adjusting the path to your `owncloud.log` if necessary: [source,bash] ---- fail2ban-regex /var/owncloud_data/owncloud.log /etc/fail2ban/filter.d/owncloud.conf ---- -The output will look similar to the following if you had one failed -login attempt: +The output will look similar to the following if you had one failed login attempt: [source,bash] ---- @@ -335,17 +301,14 @@ Date template hits: Lines: 40252 lines, 0 ignored, 1 matched, 40251 missed ---- -The `Failregex` counter increases in increments of 1 for every failed login attempt. -To unban an IP locked either during testing or -unintentionally, use the following command: +The `Failregex` counter increases in increments of 1 for every failed login attempt. To unban an IP locked either during testing or unintentionally, use the following command: [source,bash] ---- fail2ban-client set owncloud unbanip ---- -You can check the status of your ownCloud filter with the following -command: +You can check the status of your ownCloud filter with the following command: [source,bash] ---- diff --git a/modules/admin_manual/pages/configuration/server/import_ssl_cert.adoc b/modules/admin_manual/pages/configuration/server/import_ssl_cert.adoc index 0a5b33f02..db6c1b575 100644 --- a/modules/admin_manual/pages/configuration/server/import_ssl_cert.adoc +++ b/modules/admin_manual/pages/configuration/server/import_ssl_cert.adoc @@ -3,49 +3,35 @@ == Introduction -Modern Web browsers try to keep us safe, and so they blast us with scary -warnings when sites have the smallest errors in their SSL certificates, -or when they use self-signed SSL certificates. ownCloud admins encounter -this when creating Federation shares, or setting up external storage -mounts. There is no reason against using self-signed certificates on -your own networks; they’re fast, free, and easy. +Modern Web browsers try to keep us safe, and so they blast us with scary warnings when sites have the smallest errors in their SSL certificates, or when they use self-signed SSL certificates. ownCloud admins encounter this when creating Federation shares, or setting up external storage mounts. There is no reason against using self-signed certificates on your own networks; they’re fast, free, and easy. == Importing Personal SSL Certificates -ownCloud has several methods for importing self-signed certificates so -that you don’t have to hassle with Web browser warnings. When you allow -your users to create their own external storage mounts or Federation -shares, they can import SSL certificates for those shares on their -Personal pages. +ownCloud has several methods for importing self-signed certificates so that you don’t have to hassle with Web browser warnings. When you allow your users to create their own external storage mounts or Federation shares, they can import SSL certificates for those shares on their Personal pages. -image:configuration/server/import-ssl-cert-1.png[image] +image:configuration/server/import-ssl-cert-1.png[image, width=350] -Click the *Import root certificate* button to open a file picker. You -can distribute copies of your SSL certificates to your users (via an -ownCloud share!), or users can download them from their Web browsers. -Click on the little padlock icon and click through until you see a btn:[View -Certificate] button, then keep going until you can download it. In -Firefox and Chromium there is an btn:[Export] button for downloading your +Click the *Import root certificate* button to open a file picker. You can distribute copies of your SSL certificates to your users (via an ownCloud share!), or users can download them from their Web browsers. Click on the little padlock icon and click through until you see a btn:[View +Certificate] button, then keep going until you can download it. In Firefox and Chromium there is an btn:[Export] button for downloading your own copy of a site’s SSL certificate. -image:configuration/server/import-ssl-cert-2.png[Click 'More information' in Firefox to import SSL certificate] +image:configuration/server/import-ssl-cert-2.png[Click 'More information' in Firefox to import SSL certificate, width=350] -== Site-wide SSL Import +== Site-Wide SSL Import -The personal imports only work for individual users. -You can enable site-wide SSL certificates for all of your users on your ownCloud admin page. -To enable this, you must add this line to your `config.php` file: +The personal imports only work for individual users. You can enable site-wide SSL certificates for all of your users on your ownCloud admin page. To enable this, you must add this line to your `config.php` file: -[source,php] +[source,.env] ---- -'enable_certificate_management' => true, + +_CERTIFICATE_MANAGEMENT=true ---- -Then you’ll have an btn:[Import root certificate] button on your admin page, -just like the one on your personal page. -Navigate to it by clicking menu:Settings[General > SSL Root Certificates] which is located almost at the bottom. +Then you’ll have an btn:[Import root certificate] button on your admin page, just like the one on your personal page. Navigate to it by clicking menu:Settings[General > SSL Root Certificates] which is located almost at the bottom. + +// webui cert import is broken, see: https://github.com/owncloud/core/issues/31991 -image:configuration/server/import-ssl-cert/import-ssl-root-certificates-admin.png[Import Root SSL Certificate in ownCloud] +image:configuration/server/import-ssl-cert/import-ssl-root-certificates-admin.png[Import Root SSL Certificate in ownCloud, width=350] == Using OCC to Import and Manage SSL Certificates @@ -57,4 +43,10 @@ security:certificates:import import trusted certificate security:certificates:remove remove trusted certificate ---- +[NOTE] +==== +* When importing using occ, you must provide a path that is resolvable by the container. A path from the host that is not resolvable by the container will not work. +* Imported certificates will be located at `/files/files_external/uploads/` +==== + See xref:configuration/server/occ_command.adoc[Using the occ Command] to learn about how to use `occ`. diff --git a/modules/admin_manual/pages/configuration/server/index_php_less_urls.adoc b/modules/admin_manual/pages/configuration/server/index_php_less_urls.adoc index d02cb8043..e8b85ae6b 100644 --- a/modules/admin_manual/pages/configuration/server/index_php_less_urls.adoc +++ b/modules/admin_manual/pages/configuration/server/index_php_less_urls.adoc @@ -5,12 +5,10 @@ Note that with the Docker Image provided by ownCloud, `index.php` less URLs are enabled by default. -== Check +The relevant environment variables are: -You can check this by printing the `config/config.php` file via the bind mount after the first setup which will contain the following keys. Note that the URL matches your setup: - -[source,php] +[source,.env] ---- -'overwrite.cli.url' => 'https://example.com', -'htaccess.RewriteBase' => '/', +OWNCLOUD_OVERWRITE_CLI_URL='https://example.com' +OWNCLOUD_HTACCESS_REWRITE_BASE='/' ---- diff --git a/modules/admin_manual/pages/configuration/server/language_configuration.adoc b/modules/admin_manual/pages/configuration/server/language_configuration.adoc index 5b4be5b02..1a36a20a5 100644 --- a/modules/admin_manual/pages/configuration/server/language_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/language_configuration.adoc @@ -1,25 +1,18 @@ = Language Configuration :wiki-url: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes -In normal cases, ownCloud will automatically detect the language of the -Web UI. If this does not work as expected, or you want to make sure that -ownCloud always starts with a given language, you can use the -*default_language* configuration parameter. +In normal cases, ownCloud will automatically detect the language of the Web UI. If this does not work as expected, or you want to make sure that ownCloud always starts with a given language, you can use the *default_language* configuration parameter. -This parameter can be set in _config/config.php_ +This parameter can be set via the following environment variable: -== Parameters - -[source,php] +[source,.env] ---- -'default_language' => 'en', +OWNCLOUD_DEFAULT_LANGUAGE=en ---- -Keep in mind that this will not affect the language preferences of users, -which can be configured under menu:Settings[Personal > General > Language] once they have logged in. +Keep in mind that this will not affect the language preferences of users, which can be configured under menu:Settings[Personal > General > Language] once they have logged in. -More supported languages can be found in directory _/settings/l10n_. List all files with _ls *.js_. -The language code to be used is the filename without extension. +More supported languages can be found in directory _/settings/l10n_. List all files with _ls *.js_. The language code to be used is the filename without extension. Example: ---- diff --git a/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc b/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc index cf0b6143c..816186eb9 100644 --- a/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/legal_settings_configuration.adoc @@ -7,14 +7,12 @@ == Introduction -Because of one or more legal frameworks around the world, some ownCloud instances may need to display links to both an Imprint as well as a Privacy Policy on all pages (both in the Web UI and within email templates). -An Imprint document is a legally mandated statement of the ownership and authorship of the ownCloud installation. -You can think of an Imprint as a rather fancy "*About Us*" page or an enhanced "*Terms and Conditions*" page; in Germany, this is known as an "*Impressum*". +Because of one or more legal frameworks around the world, some ownCloud instances may need to display links to both an Imprint as well as a Privacy Policy on all pages (both in the Web UI and within email templates). An Imprint document is a legally mandated statement of the ownership and authorship of the ownCloud installation. You can think of an Imprint as a rather fancy "*About Us*" page or an enhanced "*Terms and Conditions*" page; in Germany, this is known as an "*Impressum*". [NOTE] ==== -Imprint and Privacy Policy links are shown on all *public* pages and in e-mail footers. -Authenticated pages, such as files app or settings, do not show them. +* Imprint and Privacy Policy links are shown on all *public* pages and in e-mail footers. +* Authenticated pages, such as files app or settings, do not show them. ==== Some of the more global legal frameworks prominent are: @@ -36,7 +34,7 @@ In the Web UI, under menu:Settings[Admin > General], under the heading "*Legal*" [#img-owncloud-webui-legal-urls-configuration] .Configuring Imprint and Privacy Policy URLs in the ownCloud Web UI. -image:configuration/server/owncloud-webui-legal-urls-configuration.png[Configuring Imprint and Privacy Policy URLs in the ownCloud Web UI.] +image:configuration/server/owncloud-webui-legal-urls-configuration.png[Configuring Imprint and Privacy Policy URLs in the ownCloud Web UI., width=350] NOTE: The values entered will auto-save. @@ -58,7 +56,7 @@ Set the Imprint and Privacy Policy URLs: {occ-command-example-prefix-docker} config:app:set core legal.privacy_policy_url --value=new_value ---- -For more information about these commands, refer to xref:configuration/server/occ_command.adoc#config-commands[the config command reference in the occ commands documentation]. +For more information about these commands, refer to the xref:configuration/server/occ_command.adoc#config-commands[config command reference in the occ commands documentation]. == Viewing the URLs @@ -69,4 +67,4 @@ Customized email templates and themes that were built prior to ownCloud version Once the settings have been updated, you will see two links appear at the bottom the ownCloud login page, one for each option, as in the screenshot below. -image:configuration/server/legal-settings/login-form-with-legal-settings-links.png[The Imprint and Privacy Policy URLs on the ownCloud login page] +image:configuration/server/legal-settings/login-form-with-legal-settings-links.png[The Imprint and Privacy Policy URLs on the ownCloud login page, width=350] diff --git a/modules/admin_manual/pages/configuration/server/logging/logging_configuration.adoc b/modules/admin_manual/pages/configuration/server/logging/logging_configuration.adoc index 74e19a608..826dd59a8 100644 --- a/modules/admin_manual/pages/configuration/server/logging/logging_configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/logging/logging_configuration.adoc @@ -1,7 +1,6 @@ = Logging Configuration :toc: right :page-aliases: configuration/server/logging_configuration.adoc - :description: Use your ownCloud log to review system status, or to help debug problems. You may adjust logging levels and choose between using the ownCloud log or using the default syslog daemon. == Introduction @@ -26,77 +25,63 @@ Logging level parameters are set in the config/config.php file, or on the Admin All log information will be written to a separate log file which can be viewed using the log viewer on your Admin page. By default, a log file named *owncloud.log* will be created in the directory which has been configured by the *datadirectory* parameter in config/config.php. As an example see: -[source,php] ----- -'datadirectory' => '/var/www/owncloud/data', ----- +The path assigned to the `datadirectory` configuration key is the value of the `OWNCLOUD_VOLUME_FILES` environment variable. When not using the default location for the logfile, it can be xref:configuration/server/config_sample_php_parameters.adoc#define-the-log-path[specified] via: -[source,php] +[source,.env] ---- -'logfile' => '/owncloud.log', +OWNCLOUD_LOG_FILE='/owncloud.log' ---- -Note that the web server user must have write rights to that directory. +[NOTE] +==== +* The web server user must have write rights to that directory. +* The path must be mounted by a Docker volume to be make the file accessible. +==== The desired date format can optionally be defined using the xref:configuration/server/config_sample_php_parameters.adoc#define-the-log-date-format[logdateformat] parameter in config/config.php. By default the {php-net-url}/manual/en/function.date.php[PHP date function] parameter `__c__` is used, and therefore the date/time is written in the format `__2013-01-10T15:20:25+02:00__`. By using the date format in the example below, the date/time format will be written in the format `__January 10, 2013 15:20:25__`. -[source,php] ----- -"log_type" => "owncloud", -"logfile" => "owncloud.log", -"loglevel" => "3", -"logdateformat" => "F d, Y H:i:s", +[source,.env] ---- +OWNCLOUD_LOG_FILE='owncloud.log' +OWNCLOUD_LOG_LEVEL=3 +OWNCLOUD_LOG_DATE_FORMAT='F d, Y H:i:s' -=== syslog - -The log type can be set to xref:configuration/server/config_sample_php_parameters.adoc#define-the-log-type[syslog] and all log information will be sent to your default syslog daemon. - -[source,php] ----- -"log_type" => "syslog", -"logfile" => "", -"loglevel" => "3", ----- - -The syslog format can be changed to remove or add information. In addition to the `%replacements%` below, `%level%` can be used, but it is used as a dedicated parameter to the syslog logging facility anyway. - -[source,php] ----- -'log.syslog.format' => '[%reqId%][%remoteAddr%][%user%][%app%][%method%][%url%] %message%', ----- - -For the old syslog message format use: -[source,php] ----- -'log.syslog.format' => '{%app%} %message%', ---- === Conditional Logging Level Increase xref:configuration/server/config_sample_php_parameters.adoc#define-log-conditions[Log conditions] for log level increase based on conditions can be set. This will increase the logging level automatically to `debug` when the first condition inside a condition block is met. All conditions are optional ! -* `shared_secret`: A unique token. If a http(s) request parameter named `log_secret` is added to the request and set to this token, the condition is met. -* `users`: If the current request is done by one of the specified users, this condition is met. -* `apps`: If the log message is invoked by one of the specified apps, this condition is met. -* `logfile`: The log message invoked gets redirected to this logfile when a condition above is met. +* `shared_secret` + +A unique token. If a http(s) request parameter named `log_secret` is added to the request and set to this token, the condition is met. +* `users` + +If the current request is done by one of the specified users, this condition is met. +* `apps` + +If the log message is invoked by one of the specified apps, this condition is met. +* `logfile` + +The log message invoked gets redirected to this logfile when a condition above is met. Notes regarding the logfile key: 1. If no logfile is defined, the standard logfile is used. 2. Not applicable when using syslog. -[verse] +{empty} + +Example:: ++ -- The following example demonstrates how all three conditions can look like. The first one that matches triggers the condition block writing the log entry to the defined logfile. --- + +// we need a envvar solution here [source,php] ---- -'log.conditions' => [ +'log.conditionslog.conditions +' => [ [ 'shared_secret' => '57b58edb6637fe3059b3595cf9c41b9', 'users' => ['user1', 'user2'], @@ -109,7 +94,7 @@ The first one that matches triggers the condition block writing the log entry to Based on the conditional log settings above, the following logs are written to the same logfile: * Requests matching `log_secret` are debug logged. - ++ [source,bash] ---- curl -X PROPFIND -u sample-user:password \ @@ -118,3 +103,4 @@ curl -X PROPFIND -u sample-user:password \ * `user1` and `user2` gets debug logged. * Access to app `comments` gets debug logged. +-- diff --git a/modules/admin_manual/pages/configuration/server/logging/request_tracing.adoc b/modules/admin_manual/pages/configuration/server/logging/request_tracing.adoc index ae676bd95..52ded4321 100644 --- a/modules/admin_manual/pages/configuration/server/logging/request_tracing.adoc +++ b/modules/admin_manual/pages/configuration/server/logging/request_tracing.adoc @@ -15,18 +15,15 @@ Storing this information makes searching more efficient, as system administrator == The Header’s Value -The header's value is a {uuid-rfc4122-url}[UUID (version 4)]. -These are generated from truly random (or pseudo-random) numbers by the client and do not contain _any_ sensitive information. -As a result it will not violate the user's privacy nor allow users to be tracked. +The header's value is a {uuid-rfc4122-url}[UUID (version 4)]. These are generated from truly random (or pseudo-random) numbers by the client and do not contain _any_ sensitive information. As a result it will not violate the user's privacy nor allow users to be tracked. == Required Server Configuration Before the value can be stored in your web server's log files, your system administrator(s) need to configure two areas: . *The web server:* The web server's logging configuration needs to be adjusted, e.g., Apache’s access and error log format, so that the value is stored in request log entries. An example of configuring Apache’s CustomLog format xref:web-server-configuration-example[is provided below]. -. *Load balancers:* All load balancers sitting in-between clients and your ownCloud instance(s), e.g., {traefik-loadbalancing-url}[Traefik], {big-ip-loadbalancing-url}[Big-IP], need to be configured to pass the header through. - This way it is possible to track ("trace") requests through larger environments. - Please refer to your load balancer’s configuration for details on how to adjust their configuration. + +. *Load balancers:* All load balancers sitting in-between clients and your ownCloud instance(s), e.g., {traefik-loadbalancing-url}[Traefik], {big-ip-loadbalancing-url}[Big-IP], need to be configured to pass the header through. This way it is possible to track ("trace") requests through larger environments. Please refer to your load balancer’s configuration for details on how to adjust their configuration. == Web Server Configuration Example diff --git a/modules/admin_manual/pages/configuration/server/oc_server_tuning.adoc b/modules/admin_manual/pages/configuration/server/oc_server_tuning.adoc index b349773b3..7a93c4ab3 100644 --- a/modules/admin_manual/pages/configuration/server/oc_server_tuning.adoc +++ b/modules/admin_manual/pages/configuration/server/oc_server_tuning.adoc @@ -8,54 +8,34 @@ == Using Cron to Perform Background Jobs -See xref:configuration/server/background_jobs_configuration.adoc[Background Jobs] for a -description and the benefits. +See xref:configuration/server/background_jobs_configuration.adoc[Background Jobs] for a description and the benefits. == Enable Memory Caching -Caching improves performance by storing data, code, and other objects in -memory. Memory cache configuration for ownCloud is no longer -automatically available from ownCloud 8.1 but must be installed and -configured separately. ownCloud supports https://redis.io[Redis], -{php-net-url}/manual/en/intro.apcu.php[APCu], and -{memcached-url}[Memcached] as memory caching backends. See -xref:configuration/server/caching_configuration.adoc[Memory Caching], for further details. +Caching improves performance by storing data, code, and other objects in memory. Memory cache configuration for ownCloud is no longer automatically available from ownCloud 8.1 but must be installed and configured separately. ownCloud supports https://redis.io[Redis] and {php-net-url}/manual/en/intro.apcu.php[APCu] as memory caching backends. See xref:configuration/server/caching_configuration.adoc[Memory Caching], for further details. == Use Redis-based Transactional File Locking -File locking is enabled by default, using the database locking backend. -However, this places a significant load on your database. See the -section xref:configuration/files/files_locking_transactional.adoc[Transactional File Locking] -for how to configure ownCloud to use Redis-based Transactional File Locking. +File locking is enabled by default, using the database locking backend. However, this places a significant load on your database. See the section xref:configuration/files/files_locking_transactional.adoc[Transactional File Locking] for how to configure ownCloud to use Redis-based Transactional File Locking. == Redis Tuning -Redis tuning improves both file locking (if used) and memory caching -(when using Redis). Here is a brief guide for tuning Redis to improve -the performance of your ownCloud installation, when working with -sizeable instances. +Redis tuning improves both file locking (if used) and memory caching (when using Redis). Here is a brief guide for tuning Redis to improve the performance of your ownCloud installation, when working with sizeable instances. === TCP-Backlog -If you raised the TCP-backlog setting, the following warning appears in -the Redis logs: +If you raised the TCP-backlog setting, the following warning appears in the Redis logs: [source,plaintext] ---- WARNING: The TCP backlog setting of 20480 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of.. ---- -If so, please consider that newer versions of Redis have their own -TCP-backlog value set to `511`, and that you have to increase if you -have many connections. In high requests-per-second environments, you -need a significant backlog to avoid slow clients connection issues. +If so, please consider that newer versions of Redis have their own TCP-backlog value set to `511`, and that you have to increase if you have many connections. In high requests-per-second environments, you need a significant backlog to avoid slow clients connection issues. -NOTE: The Linux kernel will silently truncate the TCP-backlog setting to the value of -`/proc/sys/net/core/somaxconn`. So make sure to raise both the value of `somaxconn` and -`tcp_max_syn_backlog`, to get the desired effect. +NOTE: The Linux kernel will silently truncate the TCP-backlog setting to the value of `/proc/sys/net/core/somaxconn`. So make sure to raise both the value of `somaxconn` and `tcp_max_syn_backlog`, to get the desired effect. -To fix this warning, set the value of `net.core.somaxconn` to `65535` in -`/etc/rc.local`, so that it persists upon reboot, by running the following command. +To fix this warning, set the value of `net.core.somaxconn` to `65535` in `/etc/rc.local`, so that it persists upon reboot, by running the following command. [source,bash] ---- @@ -66,8 +46,7 @@ After the next reboot, 65535 connections will be allowed, instead of the default === Transparent Huge Pages (THP) -If you are experiencing latency problems with Redis, the following -warning may appear in your Redis logs: +If you are experiencing latency problems with Redis, the following warning may appear in your Redis logs: [source,plaintext] ---- @@ -75,15 +54,11 @@ WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This creates both latency and memory usage issues with Redis. ---- -If so, unfortunately, when a Linux kernel has {thp-url}[Transparent Huge Pages] -enabled, Redis incurs a significant latency penalty after -the fork call is used, to persist information to disk. Transparent Huge -Pages are the cause of the following issue: +If so, unfortunately, when a Linux kernel has {thp-url}[Transparent Huge Pages] enabled, Redis incurs a significant latency penalty after the fork call is used, to persist information to disk. Transparent Huge Pages are the cause of the following issue: -1. A fork call is made, resulting in two processes with shared huge pages being created. -2. In a busy instance, a few event loops cause commands to target a few -thousand pages, causing the copy-on-write of almost the entire process memory. -3. Big latency and memory usage result. +. A fork call is made, resulting in two processes with shared huge pages being created. +. In a busy instance, a few event loops cause commands to target a few thousand pages, causing the copy-on-write of almost the entire process memory. +. Big latency and memory usage result. As a result, make sure to disable Transparent Huge Pages using the following command: @@ -102,14 +77,11 @@ If you are having issues with Redis latency, please refer to the {redis-guide}[o MySQL or MariaDB are preferred because of the {sql-lite-limits-url}[performance limitations of SQLite with highly concurrent applications], like ownCloud. -See the section xref:configuration/database/linux_database_configuration.adoc[Linux Database Configuration] for how to configure ownCloud for MySQL or MariaDB. -If your installation is already running on SQLite then it is possible to convert to MySQL or MariaDB using the steps provided in xref:configuration/database/db_conversion.adoc[database conversion]. +See the section xref:configuration/database/linux_database_configuration.adoc[Linux Database Configuration] for how to configure ownCloud for MySQL or MariaDB. If your installation is already running on SQLite then it is possible to convert to MySQL or MariaDB using the steps provided in xref:configuration/database/db_conversion.adoc[database conversion]. === Tune MariaDB/MySQL -A comprehensive guide to tuning MySQL and MariaDB is outside the scope -of the ownCloud documentation. However, here are three links that can -help you find further information: +A comprehensive guide to tuning MySQL and MariaDB is outside the scope of the ownCloud documentation. However, here are three links that can help you find further information: * https://github.com/major/MySQLTuner-perl/[MySQLTuner] * https://tools.percona.com/wizard[Percona Tools for MySQL] @@ -117,85 +89,22 @@ help you find further information: === Tune PostgreSQL -A comprehensive guide to tuning PostgreSQL is outside the scope of the -ownCloud documentation. However, here are three links that can help you -find further information: +A comprehensive guide to tuning PostgreSQL is outside the scope of the ownCloud documentation. However, here are three links that can help you find further information: * http://de.slideshare.net/PGExperts/five-steps-perform2013[Five Steps to PostgreSQL Performance] * https://grokbase.com/t/postgresql/pgsql-admin/103qcpdrpf/tuning-auto-vacuum-for-highly-active-tables#20100323hfs3jtjuaywwufukoqtexkpjti[Tuning the autovacuum process for tables with huge update workloads (oc_filecache)] == SSL / Encryption App -SSL (HTTPS) and file encryption/decryption can be offloaded to a -processor’s AES-NI extension. This can both speed up these operations -while lowering processing overhead. This requires a processor with the -http://wikipedia.org/wiki/AES_instruction_set[AES-NI instruction set]. +SSL (HTTPS) and file encryption/decryption can be offloaded to a processor’s AES-NI extension. This can both speed up these operations while lowering processing overhead. This requires a processor with the http://wikipedia.org/wiki/AES_instruction_set[AES-NI instruction set]. -Here are some examples how to check if your CPU / environment supports -the AES-NI extension: +Here are some examples how to check if your CPU / environment supports the AES-NI extension: -* For each CPU core present: `grep flags /proc/cpuinfo` or as a summary -for all cores: `grep -m 1 ^flags /proc/cpuinfo` If the result contains -any `aes`, the extension is present. -* Search e.g. on the Intel web if the processor used supports the -extension http://ark.intel.com/MySearch.aspx?AESTech=true[Intel Processor Feature Filter]. -You may set a filter by `"AES New Instructions"` to get a reduced result set. -* For versions of openssl >= 1.0.1, AES-NI does not work via an engine -and will not show up in the `openssl engine` command. It is active by -default on the supported hardware. You can check the openssl version via -`openssl version -a` -* If your processor supports AES-NI but it does not show up e.g. via grep -or coreinfo, it is maybe disabled in the BIOS. -* If your environment runs virtualized, check the virtualization vendor -for support. +* For each CPU core present: `grep flags /proc/cpuinfo` or as a summary for all cores: `grep -m 1 ^flags /proc/cpuinfo` If the result contains any `aes`, the extension is present. -== Webserver Tuning +* Search e.g. on the Intel web if the processor used supports the extension http://ark.intel.com/MySearch.aspx?AESTech=true[Intel Processor Feature Filter]. You may set a filter by `"AES New Instructions"` to get a reduced result set. -=== Tune Apache +* For versions of openssl >= 1.0.1, AES-NI does not work via an engine and will not show up in the `openssl engine` command. It is active by default on the supported hardware. You can check the openssl version via `openssl version -a` -==== Enable HTTP/2 Support - -If you want to improve the speed of an ownCloud installation, while at -the same time increasing its security, you can -https://httpd.apache.org/docs/2.4/howto/http2.html[enable HTTP/2 support for Apache]. -Please be aware that https://caniuse.com/http2[most browsers require HTTP/2 to be used with SSL enabled]. - -==== Apache Processes - -An Apache process uses around 12MB of RAM. Apache should be configured -so that the maximum number of HTTPD processes times 12MB is lower than the -amount of RAM. Otherwise the system begins to swap and the performance goes down. - -==== Use KeepAlive - -The https://en.wikipedia.org/wiki/HTTP_persistent_connection[KeepAlive] -directive enables persistent HTTP connections, allowing multiple -requests to be sent over the same TCP connection. Enabling it reduces -latency by as much as 50%. We recommend to keep the KeepAliveTimeout between 3 and 5. -Higher numbers can block the Server with inactive connections. -In combination with the periodic checks of the sync client the following settings are recommended: - -[source,apache] ----- -KeepAlive On -KeepAliveTimeout 3 -MaxKeepAliveRequests 200 ----- - -==== Hostname Lookups - -[source,bash] ----- -cat /etc/httpd/conf/httpd.conf ----- - -[source,plaintext] ----- - ... -HostnameLookups off ----- - -==== Log files - -Log files should be switched off for maximum performance. -To do that, comment out the https://httpd.apache.org/docs/current/mod/mod_log_config.html#customlog[CustomLog] directive. However, keep https://httpd.apache.org/docs/2.4/logs.html#errorlog[ErrorLog] set, so errors can be tracked down. +* If your processor supports AES-NI but it does not show up e.g. via grep or coreinfo, it is maybe disabled in the BIOS. +* If your environment runs virtualized, check the virtualization vendor for support. diff --git a/modules/admin_manual/pages/configuration/server/thirdparty_php_configuration.adoc b/modules/admin_manual/pages/configuration/server/thirdparty_php_configuration.adoc deleted file mode 100644 index 0dbd109b8..000000000 --- a/modules/admin_manual/pages/configuration/server/thirdparty_php_configuration.adoc +++ /dev/null @@ -1,25 +0,0 @@ -= Using Third Party PHP Components - -ownCloud uses some third party PHP components to provide some of its -functionality. These components are part of the software package and are -contained in the */3rdparty* folder. - -== Managing Third Party Parameters - -When using third party components, keep the following parameters in mind: - -* *3rdpartyroot* – Specifies the location of the 3rd-party folder. To -change the default location of this folder, you can use this parameter -to define the absolute file system path to the folder location. -* *3rdpartyurl* – Specifies the http web path to the 3rdpartyroot -folder, starting at the ownCloud web root. - -An example of what these parameters might look like is as follows: - -[source,php] ----- - OC::$SERVERROOT."/3rdparty", -"3rdpartyurl" => "/3rdparty", ----- diff --git a/modules/admin_manual/pages/configuration/server/ui-configuration.adoc b/modules/admin_manual/pages/configuration/server/ui-configuration.adoc index c8e2033cf..1b338e88a 100644 --- a/modules/admin_manual/pages/configuration/server/ui-configuration.adoc +++ b/modules/admin_manual/pages/configuration/server/ui-configuration.adoc @@ -13,7 +13,7 @@ Note that this setting is available for ownCloud Server only. When uploading a document, an upload estimation (progress bar) is shown like in the example below: -image:configuration/server/ui-configuration/upload-progress-bar.png[Upload Progress Bar] +image:configuration/server/ui-configuration/upload-progress-bar.png[Upload Progress Bar, width=350] This progress bar can be hidden with the following command: @@ -36,5 +36,4 @@ or {occ-command-example-prefix-docker} config:app:delete files hide_upload_estimation ---- -The current value can be queried with the `config:app:get` or the `config:list` command. For details see the -xref:configuration/server/occ_command.adoc#config-commands[occ Config Commands] +The current value can be queried with the `config:app:get` or the `config:list` command. For details see the xref:configuration/server/occ_command.adoc#config-commands[occ Config Commands] diff --git a/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc b/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc index fb7240028..f4a75a130 100644 --- a/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc +++ b/modules/admin_manual/pages/configuration/server/virus-scanner-support.adoc @@ -34,7 +34,7 @@ Starting with Anti-Virus version 1.1.0, additional scanners like the FortiSandbo Antivirus scanner modes:: The following image shows the currently supported scanners including how they are connected. + -image::configuration/server/virus-scanner-support/av_modes.png[Antivirus Configuration Modes,width=500] +image::configuration/server/virus-scanner-support/av_modes.png[Antivirus Configuration Modes,width=350] Common notes:: A file is parsed and an exit code returned, or an exit code is evaluated if no result is available to determine the response from the scan. In case of an infected file, the appropriate action is _always_ to delete the file. Though the setting can be made, the choice `delete` or `log` for the infected condition only applies to the special case of background scans. @@ -56,27 +56,14 @@ During a _background_ scan, the app can take one of two actions: Set btn:[When infected files were found during a background scan] to the value that suits your needs. -== Install the ownCloud Anti-Virus App +== Enable the ownCloud Anti-Virus App -. The Anti-Virus app needs to be installed from the ownCloud Market (it's available in the _"Security"_ category) and then as admin enabled in ownCloud under menu:Settings[Admin > Apps]. -+ -image::configuration/server/virus-scanner-support/antivirus-app.png[Anti-Virus App,width=500] - -. To install the app via the occ command, execute: -+ --- -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} market:install files_antivirus ----- - -and enable it with the following occ command: +The Anti-Virus app needs to be enabled with the following occ command: [source,bash,subs="attributes+"] ---- {occ-command-example-prefix-docker} app:enable files_antivirus ---- --- == Ways of Configuration @@ -216,8 +203,10 @@ ownCloud integrates with ClamAV natively in several ways, see xref:configuration === Installing ClamAV -Install ClamAV on Ubuntu with the following command: +Installing ClamAV can be achieved in multiple ways. Most easiest is to use a Dokerised environment. The image and a documentation link can be found on https://hub.docker.com/hardened-images/catalog/dhi/clamav[DockerHub]. +Alternatively you can install ClamAV natively on Ubuntu with the following command:: ++ [source,bash] ---- sudo apt install clamav clamav-daemon @@ -227,8 +216,9 @@ This automatically creates the default configuration files and launches the `cla ==== Enabling and Running ClamAV -Enable and start the `clamd` service with following commands. - +Enable and start the `clamd` service with following commands:: ++ +-- [source,bash] ---- sudo systemctl daemon-reload @@ -244,6 +234,7 @@ Synchronizing state of clamav-daemon.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable clamav-daemon ---- +-- ==== ClamAV Virus Database Updates @@ -288,89 +279,18 @@ Once ClamAV is installed, select menu:Settings[General (Admin)] and, in the "*Lo image::configuration/server/virus-scanner-support/antivirus-logging.png[Setting loglevels] -==== Configuration Modes - -ClamAV runs in one of three modes: - -* xref:daemon-socket-same-server[ClamAV Daemon (Unix Socket)] -* xref:daemon-different-server[ClamAV Daemon (TCP Socket)] -* xref:executable[ClamAV Executable] - -[TIP] -==== -In both daemon modes, background scans are enabled by default. If you want to disable them, run the command: -[source,bash,subs="attributes+"] ----- -{occ-command-example-prefix-docker} config:app:set files_antivirus av_scan_background --value 'false' ----- -==== - -[[daemon-socket-same-server]] -===== ClamAV Daemon (Unix Socket) - -In _ClamAV Daemon (Unix Socket)_ mode, ClamAV runs in the background on the *same* server as the ownCloud installation, or the socket can be made available via a share mount. When there is no activity, `clamd` places a minimal load on your system. Consider that high CPU usage can occur when users upload large volumes of files. - -IMPORTANT: You must run `freshclam` at least once for ClamAV to generate the socket. - -image::configuration/server/virus-scanner-support/clamav_daemon_socket.png[ClamAV Deamon TCP,width=500] +==== Configuration Mode -. Set btn:[Mode] to "*ClamAV Daemon (Unix Socket)*". ownCloud should detect your `clamd` socket and fill in the "*Socket*" field. This is the `LocalSocket` option in `clamd.conf`. -+ -You can run `ss` (a utility to investigate sockets) to verify it, as in the example below: -+ -[source,bash] ----- -sudo ss -a | grep -iq clamav && echo "ClamAV is running" ----- -+ -[TIP] -==== -If you don't have `ss` installed, you may have `netstat` installed. If so, you can run the following to check if ClamAV is running: -[source,bash] ----- -netstat -a | grep -q clam && echo "ClamAV is running" ----- -==== - -. When infected files were found during a background scan, you have the choice of either: -+ -* Logging any alerts without deleting the files -* Immediately deleting infected files +ClamAV can run in an ownCloud Dockerised deployment only in *ClamAV Daemon (TCP Socket)* mode. -[[daemon-different-server]] -===== ClamAV Daemon (TCP Socket) +In _ClamAV Daemon (TCP Socket)_ mode, ClamAV runs on a different server. -In _ClamAV Daemon (TCP Socket)_ mode, ClamAV can run on a different server. This is a good option to reduce load on the ownCloud servers when high network bandwidth is available and many concurrent uploads happen. - -image::configuration/server/virus-scanner-support/clamav_daemon_tcp.png[ClamAV Deamon TCP,width=500] +image::configuration/server/virus-scanner-support/clamav_daemon_tcp.png[ClamAV Deamon TCP,width=350] . Set btn:[Mode] to "*ClamAV Daemon (TCP Socket)*". . Set btn:[Host] to the host name or IP address of the remote server running ClamAV, and set btn:[Port] to the server's port number. + -TIP: The port number is the value of `TCPSocket` in `/etc/clamav/clamd.conf`. - -[[executable]] -===== ClamAV Executable - -In _ClamAV Executable_ mode, ClamAV runs on the *same* server as the ownCloud installation, with the `clamscan` command running only when a file is uploaded. - -TIP: `clamscan` can respond slower and may not always be reliable for on-demand usage; it is better to use one of the daemon modes. - -image::configuration/server/virus-scanner-support/clamav_executable.png[ClamAV Executable,width=500] - -The image shows a command line option `--allmatch=yes` (continue scanning within the file after finding a match) which is not necessary to be set and just used here for demonstration purposes of the field. - -NOTE: Starting with ownCloud Anti-Virus version 1.0.0, the path to `clamscan` and the command line options are set via a config.php entry and are read-only in the user interface. Refer to the xref:configuration/server/config_apps_sample_php_parameters.adoc[config.php parameters for apps] for more details. - -NOTE: If you had configured the path and command line options before via the user interface, the values are being migrated from the database to config.php automatically. Check the settings in config.php for their presence after upgrading. - -. Set btn:[Mode] to "*ClamAV Executable*". -. Set btn:[Path to clamscan] to the path of `clamscan`, which is the interactive ClamAV scanning command, on your server. To find the exact path, run -+ -[source,bash] ----- -which clamscan ----- +TIP: The port number is the value of `TCPSocket` of ClamAV which usually can be found on the host running ClamAV at `/etc/clamav/clamd.conf`. ==== Set Back Log Level @@ -380,11 +300,11 @@ When you are satisfied with how ClamAV is operating, you might want to go back a The Anti-Virus App shows one of three warnings if it is misconfigured or ClamAV is not available. You can see an example of all three below. -image::configuration/server/virus-scanner-support/anti-virus-message-host-connection-problem.png[Configuration error message: 'Antivirus app is misconfigured or antivirus inaccessible. Could not connect to host 'localhost' on port 999'.] +image::configuration/server/virus-scanner-support/anti-virus-message-host-connection-problem.png[Configuration error message: 'Antivirus app is misconfigured or antivirus inaccessible. Could not connect to host 'localhost' on port 999'., width=350] -image::configuration/server/virus-scanner-support/anti-virus-message-misconfiguration-problem.png[Configuration error message: 'Antivirus app is misconfigured or antivirus inaccessible. The antivirus executable could not be found at path '/usr/bin/clamsfcan''.] +image::configuration/server/virus-scanner-support/anti-virus-message-misconfiguration-problem.png[Configuration error message: 'Antivirus app is misconfigured or antivirus inaccessible. The antivirus executable could not be found at path '/usr/bin/clamsfcan' '., width=350] -image::configuration/server/virus-scanner-support/anti-virus-message-socket-connection-problem.png[Configuration error message: 'Antivirus app is misconfigured or antivirus inaccessible. Could not connect to socket ´/var/run/clamav/cslamd-socket´: No such file or directory (code 2)'.] +image::configuration/server/virus-scanner-support/anti-virus-message-socket-connection-problem.png[Configuration error message: 'Antivirus app is misconfigured or antivirus inaccessible. Could not connect to socket ´/var/run/clamav/cslamd-socket´: No such file or directory (code 2)'., width=350] == ICAP @@ -487,7 +407,7 @@ If you decide to use ClamAV, you must first install and configure {c-icap-url}[c . Select btn:[ClamAV & Kaspersky (ICAP)] from the drop-down menu in the Anti-Virus app: + -image::configuration/server/virus-scanner-support/icap_clamav.png[ClamAV & Kasperski (ICAP)],width=500] +image::configuration/server/virus-scanner-support/icap_clamav.png[ClamAV & Kasperski (ICAP)], width=350] NOTE: The older versions of Kaspersky’s KAV did not send back the virus/infection name in an ICAP header. Starting with KAV v2.0.0, the header to transport the virus can be configured. Default: No header is sent. For more configuration details see {kaspersky-icap-url}[Using Kaspersky Scan Engine in ICAP mode]. @@ -501,7 +421,7 @@ Follow the procedure below to configure ownCloud for the McAfee Web Gateway 10.x . Select btn:[McAfee Web Gateway / Skyhigh Secure Web Gateway (ICAP)] from the drop-down menu in the Anti-Virus app. + -image::configuration/server/virus-scanner-support/icap_mcafee.png[McAfee Web Gateway / Skyhigh Secure Web Gateway (ICAP)],width=500] +image::configuration/server/virus-scanner-support/icap_mcafee.png[McAfee Web Gateway / Skyhigh Secure Web Gateway (ICAP)],width=350] NOTE: McAfee provides demo versions with limited runtime for evaluation purposes. Have a look at the {mcaffee-demo-url}[McAfee Web page] for the Web Gateway. @@ -511,7 +431,7 @@ NOTE: McAfee provides demo versions with limited runtime for evaluation purposes . Select btn:[Fortinet] from the drop-down menu in the Anti-Virus app. + -image::configuration/server/virus-scanner-support/icap_mcafee.png[McAfee Web Gateway / Skyhigh Secure Web Gateway (ICAP)],width=500] +image::configuration/server/virus-scanner-support/icap_mcafee.png[McAfee Web Gateway / Skyhigh Secure Web Gateway (ICAP)],width=350] NOTE: Fortinet provides some demo versions of the FortiSandbox. Have a look at their {fortinetsandbox-url}[product page] for more information. diff --git a/modules/admin_manual/pages/installation/mount_folder_structure.adoc b/modules/admin_manual/pages/installation/mount_folder_structure.adoc index 061eaae60..bb3b2993b 100644 --- a/modules/admin_manual/pages/installation/mount_folder_structure.adoc +++ b/modules/admin_manual/pages/installation/mount_folder_structure.adoc @@ -14,11 +14,9 @@ This folder structure is important not only for knowign your data is located, bu ---- mount_point/ - apps/ <1> - - certs/ <5> - config/ <2> - files/ <3> - skeleton/ <4> - - sessions/ <5> ---- <1> The apps folder will contain ANY apps that will be added manually and are not automatically shipped by ownCloud. It matches xref: configuration/server/config_sample_php_parameters.adoc#define-alternative-app-directories[Define alternative app directories] aka the `apps-external` configuration of the config. @@ -34,5 +32,3 @@ IMPORTANT: Consider the alphabetic order the system is reading config files. Wit <3> The files folder matches the `data` directory with former ownCloud releases. <4> The directory holding custom skeleton files. - -<5> Unused, present for legacy reasons. diff --git a/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc b/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc index d513b269f..9ae9316ab 100644 --- a/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc +++ b/modules/admin_manual/pages/maintenance/manually-moving-data-folders.adoc @@ -4,19 +4,21 @@ :mysql-string-replace-function-url: http://www.mysqltutorial.org/mysql-string-replace-function.aspx +// this needs review for oc10 -> oc11 + == Introduction {description} -Though using symbolic links to relocate the data directory can be beneficial, it can be necessary to hard relocate it. -If a hard relocation is required, not only the physical location but also the database has to be updated. +As ownCloud is deployed via Docker, it is easy to move any data for a Dockerised deployment, as this simply involves relocating the contents of the mount point. Additional steps need to be taken into account when upgrading from a standard installation to Docker because the database needs to be updated. This guide assumes that: -* The current folder is: `/var/www/owncloud/data` -* The new folder is: `/mnt/owncloud/data` -* You’re using Apache as your webserver +* The current Docker volume folder is: `/oc` +* The new Docker volume folder is: `/oc-new` * ownCloud's database name is `owncloud` +* For a standard installation, the data directory is `var/www/owncloud/data` +* The internal "data folder of a Dockerized installation is `/mnt/data/files` Please change the paths above to reflect your environment. @@ -24,29 +26,23 @@ Please change the paths above to reflect your environment. The following steps are necessary to move the data directory. -. Stop the web server +. Stop the web proxy server . Enable maintenance mode . Sync your Data directory . Adjust ownCloud's configuration . Check permissions . Disable maintenance mode -. Start the web server +. Start the web proxy server Look at each section below for a detailed description. -== Stop the Web Server - -Stopping the web server makes sure there are no active connections to your server. +== Stop the Web Proxy Server -[source,bash] ----- -sudo service apache2 stop ----- +To ensure there are no active user connections to your ownCloud instance, stop access to it from the web proxy server. Follow the web proxy server description to find out how to do this. == Enable Maintenance Mode -It is necessary to enable maintenance mode to avoid running cron jobs. -To enable maintenance mode, run the following command. +It is necessary to enable maintenance mode to avoid running cron jobs. To enable maintenance mode, run the following command. [source,bash,subs="attributes+"] ---- @@ -57,7 +53,7 @@ To enable maintenance mode, run the following command. [source,bash] ---- -sudo rsync -avz /var/www/owncloud/data /mnt/owncloud +sudo rsync -avz /files /mnt/ ---- Make sure that `.ocdata` and `.htaccess` were synced to the new directory. @@ -174,12 +170,9 @@ To disable maintenance mode of your instance run the following command: {occ-command-example-prefix-docker} maintenance:mode --off ---- -== Start the Web Server +== Start the Web Proxy Server -[source,bash] ----- -sudo service apache2 start ----- +Follow the web proxies server description for how to enable access to teh ownCloud instance. == Scan the Files diff --git a/modules/admin_manual/partials/nav.adoc b/modules/admin_manual/partials/nav.adoc index af5e65a98..12bce7237 100644 --- a/modules/admin_manual/partials/nav.adoc +++ b/modules/admin_manual/partials/nav.adoc @@ -87,7 +87,6 @@ ***** xref:admin_manual:configuration/server/security/hsmdaemon/index.adoc[The HSM (Hardware Security Module) Daemon] ***** xref:admin_manual:configuration/server/security/dependency_notes.adoc[Dependency Notes] **** xref:admin_manual:configuration/server/oc_server_tuning.adoc[Server Tuning] -**** xref:admin_manual:configuration/server/thirdparty_php_configuration.adoc[Third Party PHP Configuration] **** xref:admin_manual:configuration/server/virus-scanner-support.adoc[Virus Scanner Support] **** xref:admin_manual:configuration/server/ui-configuration.adoc[UI Configuration] From 74782ebcaec6100630d11f5cec1c7a57a7958be3 Mon Sep 17 00:00:00 2001 From: Martin Mattel Date: Fri, 12 Jun 2026 17:18:46 +0200 Subject: [PATCH 38/38] add session folder --- .../pages/installation/mount_folder_structure.adoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/admin_manual/pages/installation/mount_folder_structure.adoc b/modules/admin_manual/pages/installation/mount_folder_structure.adoc index bb3b2993b..fe6e5efb9 100644 --- a/modules/admin_manual/pages/installation/mount_folder_structure.adoc +++ b/modules/admin_manual/pages/installation/mount_folder_structure.adoc @@ -17,6 +17,7 @@ mount_point/ - config/ <2> - files/ <3> - skeleton/ <4> + - sessions/ <5> ---- <1> The apps folder will contain ANY apps that will be added manually and are not automatically shipped by ownCloud. It matches xref: configuration/server/config_sample_php_parameters.adoc#define-alternative-app-directories[Define alternative app directories] aka the `apps-external` configuration of the config. @@ -32,3 +33,5 @@ IMPORTANT: Consider the alphabetic order the system is reading config files. Wit <3> The files folder matches the `data` directory with former ownCloud releases. <4> The directory holding custom skeleton files. + +<5> The default PHP file-based `session.save_path` Do not alter.